File

src/app/faq-help/faq-help.page.ts

Implements

OnInit

Metadata

Index

Properties
Methods

Constructor

constructor(preferences: SharedPreferences, systemSettingsService: SystemSettingsService, faqService: FaqService, domSanitizer: DomSanitizer, telemetryGeneratorService: TelemetryGeneratorService, commonUtilService: CommonUtilService, appGlobalService: AppGlobalService, headerService: AppHeaderService, formAndFrameworkUtilService: FormAndFrameworkUtilService, location: Location, appVersion: AppVersion, platform: Platform, translate: TranslateService, http: HttpClient, router: Router, zone: NgZone, modalCtrl: ModalController)
Parameters :
Name Type Optional
preferences SharedPreferences No
systemSettingsService SystemSettingsService No
faqService FaqService No
domSanitizer DomSanitizer No
telemetryGeneratorService TelemetryGeneratorService No
commonUtilService CommonUtilService No
appGlobalService AppGlobalService No
headerService AppHeaderService No
formAndFrameworkUtilService FormAndFrameworkUtilService No
location Location No
appVersion AppVersion No
platform Platform No
translate TranslateService No
http HttpClient No
router Router No
zone NgZone No
modalCtrl ModalController No

Methods

enableFaqReport
enableFaqReport(event)
Parameters :
Name Optional
event No
Returns : void
Private fetchFaqData
fetchFaqData(faqRequest, retry)
Parameters :
Name Optional Default value
faqRequest No
retry No true
Returns : void
generateInteractTelemetry
generateInteractTelemetry(interactSubtype, values)
Parameters :
Name Optional
interactSubtype No
values No
Returns : void
Private Async getDataFromUrl
getDataFromUrl()
Returns : any
Private getNavParam
getNavParam()
Returns : void
Private Async getSelectedLanguage
getSelectedLanguage()
Returns : any
handleBackButton
handleBackButton()
Returns : void
Private handleHeaderEvents
handleHeaderEvents($event)
Parameters :
Name Optional
$event No
Returns : void
Async ionViewDidLeave
ionViewDidLeave()
Returns : any
Async ionViewWillEnter
ionViewWillEnter()
Returns : any
ionViewWillLeave
ionViewWillLeave()
Returns : void
logInteractEvent
logInteractEvent(event)
Parameters :
Name Optional
event No
Returns : void
Async navigateToReportIssue
navigateToReportIssue()
Returns : any
ngOnInit
ngOnInit()
Returns : void
onCategorySelect
onCategorySelect(event)
Parameters :
Name Optional
event No
Returns : void
Async onVideoSelect
onVideoSelect(event)
Parameters :
Name Optional
event No
Returns : any
receiveMessage
receiveMessage(event)
Parameters :
Name Optional
event No
Returns : void
registerDeviceBackButton
registerDeviceBackButton()
Returns : void
replaceFaqText
replaceFaqText(faqData)
Parameters :
Name Optional
faqData No
Returns : void
toggleGroup
toggleGroup(event)
Parameters :
Name Optional
event No
Returns : void

Properties

appName
Type : string
backButtonFunc
Type : Subscription
chosenLanguageString
Type : any
constants
Type : any
consumptionFaqUrl
Type : SafeResourceUrl
corRelation
Type : Array<CorrelationData>
Default value : []
deviceId
Type : string
faq
Type : any
Default value : { url: './assets/faq/consumption-faqs.html?selectedlang=en&randomid=' + Math.random() }
faqData
Type : literal type
fileUrl
Type : string
headerObservable
Type : any
iframe
Type : ElementRef
Decorators :
@ViewChild('f', {static: false})
jsonURL
Type : any
Optional loading
Type : any
Private messageListener
Type : function
selectedFaqCategory
Type : literal type | undefined
selectedLanguage
Type : string
subjectDetails
Type : string
value
Type : any
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
import { Component, Inject, ViewChild, ElementRef, OnInit, NgZone } from '@angular/core';
import { ModalController, Platform } from '@ionic/angular';
import { TelemetryGeneratorService } from '@app/services/telemetry-generator.service';
import { CommonUtilService } from '@app/services/common-util.service';
import { AppGlobalService, } from '@app/services/app-global-service.service';
import { AppHeaderService, } from '@app/services/app-header.service';
import { FormAndFrameworkUtilService, } from '@app/services/formandframeworkutil.service';
import { Environment, InteractType, PageId, InteractSubtype, ImpressionType, CorReleationDataType } from '@app/services/telemetry-constants';
import {
  SharedPreferences,
  TelemetryObject,
  GetSystemSettingsRequest,
  SystemSettingsService,
  SystemSettings,
  FaqService,
  GetFaqRequest,
  CorrelationData,
} from 'sunbird-sdk';
import { PreferenceKey, appLanguages, RouterLinks } from '../app.constant';
import { Location } from '@angular/common';
import { AppVersion } from '@ionic-native/app-version/ngx';
import { TranslateService } from '@ngx-translate/core';
import { Subscription } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { VideoConfig } from './faq-help-data';
import { ContentViewerComponent } from './../components/content-viewer/content-viewer.component';

@Component({
  selector: 'app-faq-help',
  templateUrl: './faq-help.page.html',
  styleUrls: ['./faq-help.page.scss'],
})
export class FaqHelpPage implements OnInit {

  consumptionFaqUrl: SafeResourceUrl;

  faq: any = {
    url: './assets/faq/consumption-faqs.html?selectedlang=en&randomid=' + Math.random()
  };
  selectedLanguage: string;
  chosenLanguageString: any;
  deviceId: string;
  fileUrl: string;
  subjectDetails: string;
  appName: string;
  loading?: any;
  private messageListener: (evt: Event) => void;
  @ViewChild('f', { static: false }) iframe: ElementRef;
  backButtonFunc: Subscription;
  headerObservable: any;
  faqData: {
    categories: {
      name: string,
      videos?: any[],
      faqs?: {
        topic: string,
        description: string
      }[],
    }[],
    constants: any
  }
  constants: any;
  jsonURL: any;
  value: any;
  corRelation: Array<CorrelationData> = [];
  selectedFaqCategory: {
    name: string,
    videos?: any[],
    faqs?: {
      topic: string,
      description: string
    }[],
    constants?: any
  } | undefined;
  constructor(
    @Inject('SHARED_PREFERENCES') private preferences: SharedPreferences,
    @Inject('SYSTEM_SETTINGS_SERVICE') private systemSettingsService: SystemSettingsService,
    @Inject('FAQ_SERVICE') private faqService: FaqService,
    private domSanitizer: DomSanitizer,
    private telemetryGeneratorService: TelemetryGeneratorService,
    private commonUtilService: CommonUtilService,
    private appGlobalService: AppGlobalService,
    private headerService: AppHeaderService,
    private formAndFrameworkUtilService: FormAndFrameworkUtilService,
    private location: Location,
    private appVersion: AppVersion,
    private platform: Platform,
    private translate: TranslateService,
    private http: HttpClient,
    private router: Router,
    private zone: NgZone,
    private modalCtrl: ModalController,
  ) {
    this.getNavParam();
  }

  private getNavParam() {
    const navExtras = this.router.getCurrentNavigation().extras && this.router.getCurrentNavigation().extras.state;
    if (navExtras) {
      this.corRelation = navExtras.corRelation || [];
      this.corRelation.push({ id: PageId.FAQ, type: CorReleationDataType.FROM_PAGE });
    }
  }

  ngOnInit() {
    this.appVersion.getAppName()
      .then((appName) => {
        this.appName = appName;
      });
    this.messageListener = (event) => {
      this.receiveMessage(event);
    };
    window.addEventListener('message', this.messageListener, false);
    this.getSelectedLanguage();
    this.getDataFromUrl();
    this.telemetryGeneratorService.generateImpressionTelemetry(
      ImpressionType.VIEW,
      '',
      PageId.FAQ,
      Environment.USER,
      undefined,
      undefined,
      undefined,
      undefined,
      this.corRelation);
  }

  receiveMessage(event) {
    const values = new Map();
    values['values'] = event.data;
    // send telemetry for all events except Initiate-Email
    if (event.data && event.data.action && event.data.action !== 'initiate-email-clicked') {
      this.generateInteractTelemetry(event.data.action, values);
    }
  }

  private async getSelectedLanguage() {
    const selectedLanguage = await this.preferences.getString(PreferenceKey.SELECTED_LANGUAGE_CODE).toPromise();
    if (selectedLanguage) {
      await this.translate.use(selectedLanguage).toPromise();
    }
  }

  private async getDataFromUrl() {
    const faqRequest: GetFaqRequest = { language: '', faqUrl: '' };
    const getSystemSettingsRequest: GetSystemSettingsRequest = {
      id: 'appFaqURL'
    };
    await this.systemSettingsService.getSystemSettings(getSystemSettingsRequest).toPromise()
      .then((res: SystemSettings) => {
        faqRequest.faqUrl = res.value;
      })
    this.loading = await this.commonUtilService.getLoader();
    await this.loading.present();
    if (this.selectedLanguage && this.commonUtilService.networkInfo.isNetworkAvailable) {
      faqRequest.language = this.selectedLanguage;
    } else {
      faqRequest.language = 'en';
    }
    this.fetchFaqData(faqRequest);
  }

  private fetchFaqData(faqRequest, retry=true) {
    this.faqService.getFaqDetails(faqRequest).subscribe(data => {
      this.zone.run(() => {
        this.faqData = data as any;
        this.constants = this.faqData.constants;
        this.loading.dismiss();
      });
    }, error => {
      console.error(error);
      faqRequest.language = 'en';
      if (retry) {
        this.fetchFaqData(faqRequest, false);
        return;
      }
      this.loading.dismiss();
    });
  }

  async ionViewDidLeave() {
    (<any>window).sbutility.removeFile(
      result => ({}),
      error => {
        console.error('error' + error);
      });

    window.removeEventListener('message', this.messageListener);
    if (this.loading) {
      await this.loading.dismiss();
      this.loading = undefined;
    }
  }

  async ionViewWillEnter() {
    this.headerService.showHeaderWithBackButton();
    this.headerObservable = this.headerService.headerEventEmitted$.subscribe(eventName => {
      this.handleHeaderEvents(eventName);
    });
    this.registerDeviceBackButton();
    await this.preferences.getString(PreferenceKey.SELECTED_LANGUAGE).toPromise()
      .then(value => {
        // get chosen language code from  lang mapping constant array
        this.selectedLanguage = appLanguages.filter((el) => {
          return value.trim() === el.label;
        })[0].code;
      });

    await this.formAndFrameworkUtilService.getConsumptionFaqsUrl().then((url: string) => {
      if (this.selectedLanguage && this.commonUtilService.networkInfo.isNetworkAvailable) {
        url += '?selectedlang=' + this.selectedLanguage + '&randomid=' + Math.random();
        this.faq.url = url;
        this.consumptionFaqUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(this.faq.url);
      } else {
        this.consumptionFaqUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(this.faq.url);

      }
    }).catch((error) => {
      console.log('In error', error);
      this.consumptionFaqUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(this.faq.url);
    });
  }

  private handleHeaderEvents($event) {
    if($event.name === 'back'){
      setTimeout(() => {
        this.handleBackButton();
      }, 100);
    }
  }
  registerDeviceBackButton() {
    this.backButtonFunc = this.platform.backButton.subscribeWithPriority(10, () => {
      this.handleBackButton();
    });
  }

  handleBackButton() {
    if (this.selectedFaqCategory) {
      this.selectedFaqCategory = undefined;
      return;
    }
    this.location.back();
  }

  generateInteractTelemetry(interactSubtype, values) {
    values.values.value.description = values.values.value.description.replace(/(<([^>]+)>)/ig, '');
    this.telemetryGeneratorService.generateInteractTelemetry(
      InteractType.TOUCH, interactSubtype,
      Environment.USER,
      PageId.FAQ, undefined,
      values
    );
  }

  ionViewWillLeave() {
    if (this.backButtonFunc) {
      this.backButtonFunc.unsubscribe();
    }
    this.headerObservable.unsubscribe();
  }

  // toggle the card
  toggleGroup(event) {
    if (!event || !event.data) {
      return;
    }
    const telemetryObject = new TelemetryObject((event.data.position+1).toString(), 'faq', '');
    this.telemetryGeneratorService.generateInteractTelemetry(InteractType.TOUCH,
      event.data.action,
      Environment.USER,
      PageId.FAQ,
      telemetryObject);
  }

  logInteractEvent(event) {
    if (!event || !event.data) {
      return;
    }
    this.value = event.data;
    window.parent.postMessage(this.value, window.parent.origin);
  }

  async navigateToReportIssue() {
    this.telemetryGeneratorService.generateInteractTelemetry(InteractType.TOUCH,
      InteractSubtype.REPORT_ISSUE_CLICKED,
      Environment.USER,
      PageId.FAQ);

    const formConfig = await this.formAndFrameworkUtilService.getFormConfig();
    this.appGlobalService.formConfig = formConfig;
    this.router.navigate([RouterLinks.FAQ_REPORT_ISSUE], {
      state: {
        data: this.faqData,
        corRelation: this.corRelation
      }
    });
  }

  onCategorySelect(event) {
    this.selectedFaqCategory = undefined;
    if (!event || !event.data) {
      return;
    }
    setTimeout(() => {
      this.replaceFaqText(event.data);
    }, 0);
  }

  replaceFaqText(faqData) {
    for (let i = 0; i < faqData.faqs.length; i++) {
      if (faqData.faqs[i].topic.includes('{{APP_NAME}}')) {
        faqData.faqs[i].topic = faqData.faqs[i].topic.replace('{{APP_NAME}}', this.appName);
      }
      if (faqData.faqs[i].description.includes('{{APP_NAME}}')) {
        faqData.faqs[i].description = faqData.faqs[i].description.replace('{{APP_NAME}}', this.appName);
      }
    }

    this.selectedFaqCategory = faqData;
    this.selectedFaqCategory.constants = this.constants;
  }

  enableFaqReport(event) {
    this.navigateToReportIssue();
  }

  async onVideoSelect(event) {
    if (!event || !event.data) {
      return;
    }

    const video = VideoConfig;
    video.metadata.appIcon = event.data.thumbnail;
    video.metadata.name = event.data.name;
    video.metadata.artifactUrl = event.data.url;

      const playerModal = await this.modalCtrl.create({
        component: ContentViewerComponent,
        componentProps: {
          playerConfig: video
        }
      });
      await playerModal.present();
  }

}
<ion-content scroll-y="true" class="contentPadding">
  <div class="container-focus pl-16 pr-16 pb-16">
    <h4 class="m-0">{{faqData?.constants?.help }}</h4>
    <p>{{faqData?.constants?.faqMsg}}</p>
  </div>
  <div class="info-msg" *ngIf="!selectedFaqCategory">
    <p> {{faqData?.constants?.resolveMsg}}</p>
  </div>

  <div class="selected-category-name" *ngIf="selectedFaqCategory">
    <strong role="heading" aria-level="2"> {{ selectedFaqCategory?.name }}</strong>
  </div>

  <section>
    <div *ngIf="!selectedFaqCategory">
      <sb-list 
        [title]="faqData?.constants?.selectCategoryTitle" 
        [listData]="faqData?.categories"
        [btnText]="faqData?.constants?.reportIssueMsg" 
        [btnImg]="'../../assets/faq/resources/images/Report_blue.png'"
        [showRightArrow]="true"
        (itemClick)="onCategorySelect($event)" 
        (btnClick)="enableFaqReport($event)">
      </sb-list>
    </div>

    <div *ngIf="selectedFaqCategory">

      <div *ngIf="selectedFaqCategory?.videos?.length">
        <sb-carousel 
          [title]="faqData?.constants?.videoTitle" 
          [listData]="selectedFaqCategory?.videos"
          (itemClick)="onVideoSelect($event)">
        </sb-carousel>
      </div>

      <div *ngIf="selectedFaqCategory?.faqs?.length">
        <p class="faq-sub-title">{{faqData?.constants?.faqTitle}}</p>
        <sb-faq 
          [data]="selectedFaqCategory" 
          (toggleGroupEvent)="toggleGroup($event)"
          (yesClickedEvent)="logInteractEvent($event)" 
          (noClickedEvent)="logInteractEvent($event)"
          (submitClickedEvent)="logInteractEvent($event)">
        </sb-faq>
      </div>
    </div>
  </section>

  <div *ngIf="selectedFaqCategory" class="send-email" (click)="navigateToReportIssue()">
    <button class="report-button">
      <img src="../../assets/faq/resources/images/Report_blue.png" alt="navigate to report issue.">
      <span class="report-text">{{ faqData?.constants?.reportIssueMsg }}</span>
    </button>
  </div>

</ion-content>

./faq-help.page.scss

@import "src/assets/styles/base/_variables.scss";
@import "src/assets/styles/_custom-mixins.scss";
@import "src/assets/styles/_variables.scss";
:host{
    --padding-bottom: 0px;
}
.need-header-space ion-content:first-child{
    --padding-bottom: 0px;
}
ion-content{
    --padding-bottom: 0px;
}
.contentPadding{
    --padding-bottom: 0px;
}
.scroll-content{
    padding: 0% !important;
}
iframe {
    transform: scale(1, 1);
    height: 100%;
    width: 100%;
  }
  body{
    background-color: map-get($colors, $light-blue);
      font-family: 'Noto Sans', sans-serif;
}
.panelText{
    font-size: $font-size-base;
}
.rotate{
    -webkit-transform: rotate(180deg);  /* Chrome, Safari, Opera */
    -moz-transform: rotate(180deg);  /* Firefox */
    -ms-transform: rotate(180deg);  /* IE 9 */
    transform: rotate(180deg);  /* Standard syntax */    
}
.btn-arrow{
    padding: 4px;
    margin-top: 4px;
    margin-left: 5px;
}
.yesBtn{
    color: $green;
}
p{
    font-size: $font-size-base;
}
.help-header, .help-header-send-email{
    background: $blue;
    color: map-get($colors, white);
    padding: 16px;
}
.help-header>h4,.help-header-send-email>h4{
    padding:0;
    font-weight: 700;
    max-width: 64rem;
    margin: 0 auto;
}
.help-header>p,.help-header-send-email>p{
    font-weight: 100;
    max-width: 64rem;
    margin: 0 auto;
}
.panel-title {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.panel-title-blue{
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    color: $blue;
}
.info-msg{
        background-color: map-get($colors, white_fa)
    }
.report-text{
      padding-left: 6px;
    }
@media only screen and (max-width : 1024px) {

    .info-msg-send-email>p,.info-msg>p{
        padding: 8px 16px;
        max-width: 64rem;
        margin: 0 auto;
    }
   
}
@media only screen and (min-width : 1025px) {

    .info-msg-send-email>p,.info-msg>p{
        padding: 16px 0;
        max-width: 64rem;
        margin: 0 auto;
    }
}
.icon{
    color: $blue;
    float:right;
} 
.panel{
    border-radius: 0 !important;
    border-top: 0;
    border-left: 0;
    border-right: 0;
    box-shadow:none !important;
    border-bottom: solid 1px lightgray;
    font-size: 1rem;
}

.panel-heading {
    padding: 16px 16px;
}
.panel-group{
    margin: 0 auto;
    max-width: 64rem;
}
.panel-group .panel+.panel{
    border-radius: 0px;
    margin-top: 0px;
}
.panel-default>.panel-heading{
    background-color: map-get($colors, white);
    border-radius: 0px !important;
}
.panel-body{
    background-color: map-get($colors, white_fa);
}
.panel-interact{
    text-align: center; 
    padding: 20px;
    height: 6.25rem;
}
.panel-interact>button{
    margin: 10px 5px 0px 5px;
    background-color: map-get($colors, white_fa);
    border-color: map-get($colors, white_fa);
    width: 5rem;
    color: $blue;
    font-size: 0.813rem;
    font-weight: 700;
    outline: none;
    height: 1.75rem;
}
.panel-interact .yesBtn{
    color: $green;
}
.panel-interact>p{
    margin: 0px;
}
.no-clicked, .yes-clicked{
    padding:10px !important;
    margin: auto !important;
    margin-top:10px !important;
    background: map-get($colors, white_fa);
    width: 12.5rem;
    border-radius: 4px;
    color:$green;
    text-align: center;
}

.panel-info{
    text-align: center;
    max-width: 64rem;
    margin: 0 auto;
}
.panel-info>h6{
    font-weight: 700;
    margin-top: 20px;
    margin-bottom: 0px;
}

.input-text{
    width: 100%;
    height: 4.38rem;
    border-radius: 5px;
    box-shadow: none;
    border-width: 0.063rem;
    border-style:solid;
    border-color: map-get($colors, light_gray-c3);
    @include padding(8px 0px 0px 8px);
    resize: none;
}
.submit-button{
    width: 100%;
    color: map-get($colors, white);
    background: $blue;
    height: 2.5rem;
    border-radius: 4px;
    border-style:solid;
    border-color:  $blue;
    margin: 10px 0px 16px 0px;
    outline: none;
}

@media only screen and (max-width : 1024px) {
   
    .report-button{
        min-width: 90vw;
        color: map-get($colors, white);
        background: $blue;
        height: 2.5rem;
        border-radius: 4px;
        border-style:solid;
        border-color:  $blue;
        outline: none;
    }
    p{
        margin: 0px;
        font-weight: normal;
    }
    .panel-body{
        padding: 8px 16px;
    }
    #textareainfo{
        opacity: .5;
        position: absolute;
        bottom: -0.813rem;
        right: 0px;
        font-weight: normal;
        font-size: 0.75rem;
    }
    .initiate-email-info-button{
        left: 0;
    right: 0;
    position: fixed;
    top: 80vh;
    padding: 0 16px;
    }
}
@media only screen and (min-width : 1025px) {
    .report-button{
        min-width: 64rem;
        color: map-get($colors, white);
        background: $blue;
        height: 2.5rem;
        border-radius: 4px;
        border-style:solid;
        border-color:  $blue;
        outline: none;
    }
}
img>.report-button{
    padding-bottom: 4px;
    padding-right: 1px;
}
.send-email{
    text-align: center;
    padding: 15px;
    background: aliceblue;
    --padding-bottom: 0px;
}
.send-email-form{
    text-align: center;
    margin: 0 16px;
}
#send-email-form{
    height: 40vh;
    position: relative;
}

.send-email-info{
    padding: 10px 0px;
    font-weight: normal;
    font-size: 0.75rem;
    text-align: justify;

}
 #know-more-form{
        margin: 0px 16px;
    }
@media only screen and (min-width : 1025px) {
    .send-email-form{
        max-width: 64.063rem;
        margin: auto;
    }
    .send-email-info{
        max-width: 35.625rem;
        padding: 10px 0 !important;
        margin: initial;
        float: left;
    }
    .submit-button{
        width: 9.375rem;
        float: right;
        color: map-get($colors, white);
        background: $blue;
        border-radius: 0px;
        border-style:solid;
        border-color:  $blue;
        margin: 10px 0px 16px 0px;
        height: 2rem;
        outline: none;
    }
    .panel-info{
        overflow: hidden;
        text-align: left;
    }
    .panel-info > h6 {
        @include margin(0px 0px 0px 15px);
    }
    .panel-info > p {
        @include margin(0px 0px 0px 15px);
    }
    #initiate-email{
    margin-top: 10px;
}

}
.input-text-form{
    width: 100%;
    height: 8rem;
    border-radius: 5px;
    box-shadow: none;
    border-width: 0.063rem;
    border-style:solid;
    border-color: map-get($colors, light_gray-c3);
    @include padding(15px);
    resize: none;
}
::placeholder {
  color: $gray-300;
  font-size: $font-size-base;
  font-weight: normal;
}
.initiate-email-info{
        margin-top: 10px;
    }
@media only screen and (min-width : 1025px) {
    .input-text-form{
        width: 100%;
        height: 8rem;
        border-radius: 0px;
        box-shadow: none;
        border-width: 0.063rem;
        border-style:solid;
        border-color: map-get($colors, light_gray-c3);
        @include padding(8px 0px 0px 8px);
        margin: 0px;
        resize: none;
    }
    #textareainfo{
    opacity: .5;
    position: absolute;
    bottom: -1.5rem;
    right: 0px;
    font-weight: normal;
    font-size: 0.75rem;
    }
    
}
a{
    color: map-get($colors, primary_black);
}

a:active, a:hover{
    text-decoration: none;
    color: none;
}

#textareadiv{
    position: relative
}

.selected-category-name{
    padding: 1rem 1rem 0 1rem;
    font-size: 1.2rem;
}

.faq-sub-title{
    font-size: 1rem;
    font-weight: bold;
    padding: 1rem 1rem 0.5rem;
}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""