@igo2/sdg-core 1.0.0-next.78 → 1.0.0-next.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/analytics/google-analytics/google-analytics.service.d.ts +1 -1
  2. package/fesm2022/igo2-sdg-core.mjs +8 -4
  3. package/fesm2022/igo2-sdg-core.mjs.map +1 -1
  4. package/package.json +2 -2
  5. package/src/_index.scss +2 -1
  6. package/src/layout/_breakpoints.scss +36 -42
  7. package/src/style/_elevation.scss +54 -0
  8. package/src/style/_index.scss +3 -0
  9. package/src/style/_sass-utils.scss +24 -0
  10. package/src/style/_typography-utils.scss +23 -0
  11. package/src/style/_typography.scss +139 -0
  12. package/src/style/overrides/_index.scss +2 -2
  13. package/src/style/overrides/igo2-lib/_index.scss +5 -2
  14. package/src/style/overrides/igo2-lib/_list.scss +22 -0
  15. package/src/style/overrides/igo2-lib/_panel.scss +7 -0
  16. package/src/style/overrides/igo2-lib/_search-bar.scss +70 -0
  17. package/src/style/overrides/material/_button.scss +118 -0
  18. package/src/style/overrides/material/_dialog.scss +37 -0
  19. package/src/style/overrides/material/_divider.scss +11 -0
  20. package/src/style/overrides/material/_form-field.scss +20 -0
  21. package/src/style/overrides/material/_icon.scss +34 -0
  22. package/src/style/overrides/material/_index.scss +12 -1
  23. package/src/style/overrides/material/_input.scss +5 -0
  24. package/src/style/overrides/material/_sidenav.scss +9 -0
  25. package/src/theme/_index.scss +1 -3
  26. package/src/theme/material/_index.scss +1 -0
  27. package/src/theme/material/_theme.scss +241 -0
  28. package/src/tokens/_index.scss +7 -0
  29. package/src/tokens/_sys-colors.scss +99 -0
  30. package/src/tokens/_sys-elevation.scss +17 -0
  31. package/src/tokens/_sys-layout.scss +28 -0
  32. package/src/tokens/_sys-palettes.scss +72 -0
  33. package/src/tokens/_sys-typography.scss +109 -0
  34. package/src/tokens/_system.scss +56 -0
  35. package/src/tokens/_token-utils.scss +79 -0
  36. package/src/style/overrides/igo2-lib/_index-theme.scss +0 -13
  37. package/src/style/overrides/igo2-lib/_search-bar-theme.scss +0 -33
  38. package/src/style/overrides/igo2-lib/list.scss +0 -24
  39. package/src/style/overrides/igo2-lib/panel.scss +0 -8
  40. package/src/style/overrides/igo2-lib/scrollbar.scss +0 -15
  41. package/src/style/overrides/igo2-lib/search-bar.scss +0 -43
  42. package/src/style/overrides/material/_button-theme.scss +0 -81
  43. package/src/style/overrides/material/_index-theme.scss +0 -13
  44. package/src/style/overrides/material/button.scss +0 -5
  45. package/src/style/overrides/material/dialog.scss +0 -36
  46. package/src/style/overrides/material/form-field.scss +0 -5
  47. package/src/style/overrides/material/input.scss +0 -5
  48. package/src/theme/_colors.scss +0 -128
  49. package/src/theme/_palettes.scss +0 -112
  50. package/src/theme/_theme.scss +0 -46
  51. package/src/typography/_index.scss +0 -2
  52. package/src/typography/typography.scss +0 -173
  53. package/src/typography/typography.utils.scss +0 -18
  54. /package/src/layout/{layout.scss → bootstrap-layout.scss} +0 -0
@@ -6,7 +6,7 @@ export declare class GoogleAnalyticsService {
6
6
  constructor(router: Router);
7
7
  initialize(): void;
8
8
  trackEvent(eventName: string, eventParams: Record<string, unknown>): void;
9
- trackPageView(): void;
9
+ trackFirstPageView(): void;
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<GoogleAnalyticsService, never>;
11
11
  static ɵprov: i0.ɵɵInjectableDeclaration<GoogleAnalyticsService>;
12
12
  }
@@ -3,7 +3,7 @@ import { makeEnvironmentProviders, Injectable, provideAppInitializer, inject, PL
3
3
  import { isPlatformServer, DOCUMENT } from '@angular/common';
4
4
  import * as i1 from '@angular/router';
5
5
  import { NavigationEnd } from '@angular/router';
6
- import { filter, of } from 'rxjs';
6
+ import { filter, first, of } from 'rxjs';
7
7
  import * as i1$1 from '@angular/cdk/layout';
8
8
  import { provideTranslation as provideTranslation$1, withStaticConfig, provideMockTranslation } from '@igo2/core/language';
9
9
 
@@ -34,12 +34,12 @@ class GoogleAnalyticsService {
34
34
  trackEvent(eventName, eventParams) {
35
35
  gtag('event', eventName, eventParams);
36
36
  }
37
- trackPageView() {
37
+ trackFirstPageView() {
38
38
  if (this.routerEvents$$) {
39
39
  throw new Error('Page tracking is already instantiated for Google Analytics');
40
40
  }
41
41
  this.routerEvents$$ = this.router.events
42
- .pipe(filter((event) => event instanceof NavigationEnd))
42
+ .pipe(filter((event) => event instanceof NavigationEnd), first())
43
43
  .subscribe((event) => {
44
44
  gtag('event', 'page_view', {
45
45
  page_path: event.urlAfterRedirects
@@ -97,7 +97,11 @@ async function googleAnalyticsFactory(document, gaService, options) {
97
97
  send_page_view: false
98
98
  });
99
99
  gaService.initialize();
100
- gaService.trackPageView();
100
+ /**
101
+ * Track the first page view but after we fallback on the default TagManager event. You can manage this event in the TagManger admin console.
102
+ * https://support.google.com/tagmanager/answer/7679319?hl=en&ref_topic=7679108&sjid=1071553345249084852-NA
103
+ */
104
+ gaService.trackFirstPageView();
101
105
  resolve(true);
102
106
  };
103
107
  });
@@ -1 +1 @@
1
- {"version":3,"file":"igo2-sdg-core.mjs","sources":["../../../packages/core/src/analytics/analytics.interface.ts","../../../packages/core/src/analytics/analytics.provider.ts","../../../packages/core/src/analytics/google-analytics/google-analytics.service.ts","../../../packages/core/src/analytics/google-analytics/google-analytics.provider.ts","../../../packages/core/src/layout/breakpoint/breakpoint.service.ts","../../../packages/core/src/router/router.ts","../../../packages/core/src/router/title-resolver/title-resolver.ts","../../../packages/core/src/router/title-resolver/title-resolver.pipe.ts","../../../packages/core/src/router/route.utils.ts","../../../packages/core/src/translation/translation.service.ts","../../../packages/core/src/translation/translation.provider.ts","../../../packages/core/src/translation/translation-mock.provider.ts","../../../packages/core/src/translation/translation.utils.ts","../../../packages/core/src/utils/coercion.ts","../../../packages/core/src/igo2-sdg-core.ts"],"sourcesContent":["import { EnvironmentProviders, Provider } from '@angular/core';\n\nexport interface AnalyticsFeature<KindT extends AnalyticsFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum AnalyticsFeatureKind {\n GoogleAnalytic = 0\n}\n","import {\n EnvironmentProviders,\n Provider,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { AnalyticsFeature, AnalyticsFeatureKind } from './analytics.interface';\n\nexport function provideAnalytics(\n ...features: AnalyticsFeature<AnalyticsFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { Injectable } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { Subscription, filter } from 'rxjs';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ndeclare let gtag: Function;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GoogleAnalyticsService {\n private routerEvents$$?: Subscription;\n\n constructor(private router: Router) {}\n\n initialize(): void {\n if (!gtag) {\n throw new Error('The gtag was not created for Google Analytics');\n }\n }\n\n trackEvent(eventName: string, eventParams: Record<string, unknown>): void {\n gtag('event', eventName, eventParams);\n }\n\n trackPageView(): void {\n if (this.routerEvents$$) {\n throw new Error(\n 'Page tracking is already instantiated for Google Analytics'\n );\n }\n\n this.routerEvents$$ = this.router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe((event: NavigationEnd) => {\n gtag!('event', 'page_view', {\n page_path: event.urlAfterRedirects\n });\n });\n }\n}\n","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { PLATFORM_ID, inject, provideAppInitializer } from '@angular/core';\n\nimport { AnalyticsFeature, AnalyticsFeatureKind } from '../analytics.interface';\nimport { IGoogleAnalyticsOptions } from './google-analytics.interface';\nimport { GoogleAnalyticsService } from './google-analytics.service';\n\nexport function withGoogleAnalytics(\n options: IGoogleAnalyticsOptions\n): AnalyticsFeature<AnalyticsFeatureKind.GoogleAnalytic> {\n if (!options.targetId) {\n throw new Error('Vous devez configurer le targetId pour Google Analytics');\n }\n\n return {\n kind: AnalyticsFeatureKind.GoogleAnalytic,\n providers: [\n GoogleAnalyticsService,\n provideAppInitializer(() => {\n const platformId = inject(PLATFORM_ID);\n if (isPlatformServer(platformId)) {\n return;\n }\n\n const document = inject(DOCUMENT);\n const gaService = inject(GoogleAnalyticsService);\n return googleAnalyticsFactory(document, gaService, options);\n })\n ]\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ndeclare let gtag: Function;\n\nasync function googleAnalyticsFactory(\n document: Document,\n gaService: GoogleAnalyticsService,\n options: IGoogleAnalyticsOptions\n): Promise<unknown> {\n return new Promise((resolve) => {\n // Dynamically load the Google Analytics script\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${options.targetId}`;\n document.head.appendChild(script);\n\n script.onload = () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _window = window as any;\n _window['dataLayer'] = _window['dataLayer'] || [];\n _window['gtag'] = function () {\n // eslint-disable-next-line prefer-rest-params\n _window['dataLayer'].push(arguments);\n };\n\n gtag('js', new Date());\n\n // Disable automatic page view tracking\n gtag('config', options.targetId, {\n send_page_view: false\n });\n\n gaService.initialize();\n gaService.trackPageView();\n\n resolve(true);\n };\n });\n}\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Injectable, Signal, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreakpointService {\n private _isHandset = signal(false);\n\n get isHandset(): Signal<boolean> {\n return this._isHandset.asReadonly();\n }\n\n constructor(private breakpointObserver: BreakpointObserver) {\n this.handleBreakpoint();\n }\n\n private handleBreakpoint(): void {\n this.breakpointObserver\n .observe('(max-width: 575px)')\n .subscribe((result) => {\n this._isHandset.set(result.matches);\n });\n }\n}\n","import { Route } from '@angular/router';\n\nimport { TitleResolver } from './title-resolver/title-resolver';\n\nexport const RouteTitleKey = 'RouteTitle';\nexport const RouteTranslateKey = 'TranslateKey';\n\nfunction hasStaticTitle(config: Route): boolean {\n return typeof config.title === 'string' || config.title === null;\n}\n\nexport function resolveTitle(\n config: Route,\n titleResolver?: TitleResolver\n): string | undefined {\n if (hasStaticTitle(config)) {\n return config.title as string;\n } else {\n return (\n titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key\n );\n }\n}\n","import {\n ActivatedRouteSnapshot,\n MaybeAsync,\n Resolve,\n Route,\n RouterStateSnapshot\n} from '@angular/router';\n\nexport abstract class TitleResolver<T = string> implements Resolve<T> {\n abstract resolve(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): MaybeAsync<T>;\n abstract resolveStatic(route: Route): string | undefined;\n}\n","import { Optional, Pipe, PipeTransform } from '@angular/core';\n\nimport { SdgRoute } from '../route.interface';\nimport { resolveTitle } from '../router';\nimport { TitleResolver } from './title-resolver';\n\n@Pipe({\n name: 'titleResolver',\n standalone: true\n})\nexport class TitleResolverPipe implements PipeTransform {\n constructor(@Optional() private titleResolver: TitleResolver) {}\n\n transform(value: SdgRoute): string | undefined {\n return resolveTitle(value, this.titleResolver);\n }\n}\n","export function pathIsExternal(path: string): boolean {\n const regex = /^https?:\\/\\//;\n return regex.test(path);\n}\n\nexport function isSafeUrl(url: string): boolean {\n const safePattern = /^(https?:\\/\\/|\\/(?!\\/)|\\.\\/|\\.\\.\\/)/;\n const unsafePattern = /^(javascript:|data:|vbscript:)/i;\n return safePattern.test(url) && !unsafePattern.test(url.trim());\n}\n","import { WritableSignal } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { Language } from './translation.interface';\n\nexport type Translation =\n | string\n | Translation[]\n | TranslationObject\n\n // required to prevent error \"Type instantiation is excessively deep and possibly infinite.\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | any;\n\n// using Record<> does not work because TS does not support recursive definitions\nexport interface TranslationObject {\n [key: string]: Translation;\n}\n\nexport abstract class TranslationService {\n abstract lang: WritableSignal<Language>;\n\n abstract get(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Translation | TranslationObject;\n\n abstract getAsync(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Observable<Translation | TranslationObject>;\n\n abstract setLanguage(lang: Language): void;\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n Provider,\n Type,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { LanguageOptions, withStaticConfig } from '@igo2/core/language';\nimport { provideTranslation as provideIgo2Translation } from '@igo2/core/language';\n\nimport { TitleResolver } from '../router';\nimport { TranslationService } from './translation.service';\n\nexport interface TranslationFeature<KindT extends TranslationFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum TranslationFeatureKind {\n Translation = 0,\n RouterTitleResolver = 1\n}\n\nexport function provideTranslatedLabels(\n token: InjectionToken<unknown>,\n key: string\n) {\n return {\n provide: token,\n useFactory: (translationService: TranslationService) =>\n labelsFactory(translationService, key),\n deps: [TranslationService]\n };\n}\n\nfunction labelsFactory(translationService: TranslationService, key: string) {\n return translationService.get(key);\n}\n\nexport function provideTranslation(\n ...features: TranslationFeature<TranslationFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/** Base on the @ngx-translate library with the IgoLanguageModule */\nexport function withIgo2Translation(\n options: LanguageOptions,\n service: Type<TranslationService>,\n defaultLanguage?: string\n): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n { provide: TranslationService, useClass: service },\n provideIgo2Translation(withStaticConfig(options, defaultLanguage))\n ]\n };\n}\n\n/**\n * Provide a translater for the Route title.\n * Some components is base on the title of the route and\n * this Resolver will allow to automatically resolve the translation\n **/\nexport function withRouterTitleResolver<T>(\n resolver: Type<TitleResolver<T>>\n): TranslationFeature<TranslationFeatureKind.RouterTitleResolver> {\n return {\n kind: TranslationFeatureKind.RouterTitleResolver,\n providers: [\n {\n provide: TitleResolver<T>,\n useClass: resolver\n }\n ]\n };\n}\n","import { WritableSignal, signal } from '@angular/core';\n\nimport { provideMockTranslation } from '@igo2/core/language';\n\nimport { Observable, of } from 'rxjs';\n\nimport { Language } from './translation.interface';\nimport {\n TranslationFeature,\n TranslationFeatureKind\n} from './translation.provider';\nimport { TranslationService } from './translation.service';\n\nexport function withIgo2TranslationMock(): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideMockTranslation(),\n { provide: TranslationService, useClass: TranslationServiceMock }\n ]\n };\n}\n\nexport class TranslationServiceMock implements TranslationService {\n lang: WritableSignal<Language> = signal('fr');\n\n get(key: string | string[]): string {\n return Array.isArray(key) ? key[0] : key;\n }\n\n getAsync(key: string | string[]): Observable<string> {\n return of(Array.isArray(key) ? key[0] : key);\n }\n\n setLanguage() {\n window.location.reload();\n }\n}\n","/**\n *\n * @param routerUrl\n * @param lang\n * @param strategy default to 'segment' set the first segment of the path (e.g., '/en/alerts' => 'en')\n */\nexport function parseUrlWithLanguage(\n routerUrl: string,\n lang: string\n): [url: string, params: string | undefined] {\n // eslint-disable-next-line prefer-const\n let [url, params] = routerUrl.split('?');\n\n const urlParts = url.split('/');\n if (urlParts.length > 1) {\n urlParts[1] = lang;\n }\n\n url = urlParts.join('/');\n\n return [url, params];\n}\n","import { Translation, TranslationObject } from '../translation';\n\nexport function labelAttribute(\n value: Translation | TranslationObject,\n defaultValue: Translation | TranslationObject = {}\n): Translation | TranslationObject {\n return value ? { ...defaultValue, ...value } : defaultValue;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.TitleResolver","provideIgo2Translation"],"mappings":"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"}
1
+ {"version":3,"file":"igo2-sdg-core.mjs","sources":["../../../packages/core/src/analytics/analytics.interface.ts","../../../packages/core/src/analytics/analytics.provider.ts","../../../packages/core/src/analytics/google-analytics/google-analytics.service.ts","../../../packages/core/src/analytics/google-analytics/google-analytics.provider.ts","../../../packages/core/src/layout/breakpoint/breakpoint.service.ts","../../../packages/core/src/router/router.ts","../../../packages/core/src/router/title-resolver/title-resolver.ts","../../../packages/core/src/router/title-resolver/title-resolver.pipe.ts","../../../packages/core/src/router/route.utils.ts","../../../packages/core/src/translation/translation.service.ts","../../../packages/core/src/translation/translation.provider.ts","../../../packages/core/src/translation/translation-mock.provider.ts","../../../packages/core/src/translation/translation.utils.ts","../../../packages/core/src/utils/coercion.ts","../../../packages/core/src/igo2-sdg-core.ts"],"sourcesContent":["import { EnvironmentProviders, Provider } from '@angular/core';\n\nexport interface AnalyticsFeature<KindT extends AnalyticsFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum AnalyticsFeatureKind {\n GoogleAnalytic = 0\n}\n","import {\n EnvironmentProviders,\n Provider,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { AnalyticsFeature, AnalyticsFeatureKind } from './analytics.interface';\n\nexport function provideAnalytics(\n ...features: AnalyticsFeature<AnalyticsFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { Injectable } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\n\nimport { Subscription, filter, first } from 'rxjs';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ndeclare let gtag: Function;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class GoogleAnalyticsService {\n private routerEvents$$?: Subscription;\n\n constructor(private router: Router) {}\n\n initialize(): void {\n if (!gtag) {\n throw new Error('The gtag was not created for Google Analytics');\n }\n }\n\n trackEvent(eventName: string, eventParams: Record<string, unknown>): void {\n gtag('event', eventName, eventParams);\n }\n\n trackFirstPageView(): void {\n if (this.routerEvents$$) {\n throw new Error(\n 'Page tracking is already instantiated for Google Analytics'\n );\n }\n\n this.routerEvents$$ = this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n first()\n )\n .subscribe((event: NavigationEnd) => {\n gtag!('event', 'page_view', {\n page_path: event.urlAfterRedirects\n });\n });\n }\n}\n","import { DOCUMENT, isPlatformServer } from '@angular/common';\nimport { PLATFORM_ID, inject, provideAppInitializer } from '@angular/core';\n\nimport { AnalyticsFeature, AnalyticsFeatureKind } from '../analytics.interface';\nimport { IGoogleAnalyticsOptions } from './google-analytics.interface';\nimport { GoogleAnalyticsService } from './google-analytics.service';\n\nexport function withGoogleAnalytics(\n options: IGoogleAnalyticsOptions\n): AnalyticsFeature<AnalyticsFeatureKind.GoogleAnalytic> {\n if (!options.targetId) {\n throw new Error('Vous devez configurer le targetId pour Google Analytics');\n }\n\n return {\n kind: AnalyticsFeatureKind.GoogleAnalytic,\n providers: [\n GoogleAnalyticsService,\n provideAppInitializer(() => {\n const platformId = inject(PLATFORM_ID);\n if (isPlatformServer(platformId)) {\n return;\n }\n\n const document = inject(DOCUMENT);\n const gaService = inject(GoogleAnalyticsService);\n return googleAnalyticsFactory(document, gaService, options);\n })\n ]\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ndeclare let gtag: Function;\n\nasync function googleAnalyticsFactory(\n document: Document,\n gaService: GoogleAnalyticsService,\n options: IGoogleAnalyticsOptions\n): Promise<unknown> {\n return new Promise((resolve) => {\n // Dynamically load the Google Analytics script\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${options.targetId}`;\n document.head.appendChild(script);\n\n script.onload = () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _window = window as any;\n _window['dataLayer'] = _window['dataLayer'] || [];\n _window['gtag'] = function () {\n // eslint-disable-next-line prefer-rest-params\n _window['dataLayer'].push(arguments);\n };\n\n gtag('js', new Date());\n\n // Disable automatic page view tracking\n gtag('config', options.targetId, {\n send_page_view: false\n });\n\n gaService.initialize();\n\n /**\n * Track the first page view but after we fallback on the default TagManager event. You can manage this event in the TagManger admin console.\n * https://support.google.com/tagmanager/answer/7679319?hl=en&ref_topic=7679108&sjid=1071553345249084852-NA\n */\n gaService.trackFirstPageView();\n\n resolve(true);\n };\n });\n}\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport { Injectable, Signal, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreakpointService {\n private _isHandset = signal(false);\n\n get isHandset(): Signal<boolean> {\n return this._isHandset.asReadonly();\n }\n\n constructor(private breakpointObserver: BreakpointObserver) {\n this.handleBreakpoint();\n }\n\n private handleBreakpoint(): void {\n this.breakpointObserver\n .observe('(max-width: 575px)')\n .subscribe((result) => {\n this._isHandset.set(result.matches);\n });\n }\n}\n","import { Route } from '@angular/router';\n\nimport { TitleResolver } from './title-resolver/title-resolver';\n\nexport const RouteTitleKey = 'RouteTitle';\nexport const RouteTranslateKey = 'TranslateKey';\n\nfunction hasStaticTitle(config: Route): boolean {\n return typeof config.title === 'string' || config.title === null;\n}\n\nexport function resolveTitle(\n config: Route,\n titleResolver?: TitleResolver\n): string | undefined {\n if (hasStaticTitle(config)) {\n return config.title as string;\n } else {\n return (\n titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key\n );\n }\n}\n","import {\n ActivatedRouteSnapshot,\n MaybeAsync,\n Resolve,\n Route,\n RouterStateSnapshot\n} from '@angular/router';\n\nexport abstract class TitleResolver<T = string> implements Resolve<T> {\n abstract resolve(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ): MaybeAsync<T>;\n abstract resolveStatic(route: Route): string | undefined;\n}\n","import { Optional, Pipe, PipeTransform } from '@angular/core';\n\nimport { SdgRoute } from '../route.interface';\nimport { resolveTitle } from '../router';\nimport { TitleResolver } from './title-resolver';\n\n@Pipe({\n name: 'titleResolver',\n standalone: true\n})\nexport class TitleResolverPipe implements PipeTransform {\n constructor(@Optional() private titleResolver: TitleResolver) {}\n\n transform(value: SdgRoute): string | undefined {\n return resolveTitle(value, this.titleResolver);\n }\n}\n","export function pathIsExternal(path: string): boolean {\n const regex = /^https?:\\/\\//;\n return regex.test(path);\n}\n\nexport function isSafeUrl(url: string): boolean {\n const safePattern = /^(https?:\\/\\/|\\/(?!\\/)|\\.\\/|\\.\\.\\/)/;\n const unsafePattern = /^(javascript:|data:|vbscript:)/i;\n return safePattern.test(url) && !unsafePattern.test(url.trim());\n}\n","import { WritableSignal } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { Language } from './translation.interface';\n\nexport type Translation =\n | string\n | Translation[]\n | TranslationObject\n\n // required to prevent error \"Type instantiation is excessively deep and possibly infinite.\"\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | any;\n\n// using Record<> does not work because TS does not support recursive definitions\nexport interface TranslationObject {\n [key: string]: Translation;\n}\n\nexport abstract class TranslationService {\n abstract lang: WritableSignal<Language>;\n\n abstract get(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Translation | TranslationObject;\n\n abstract getAsync(\n key: string | string[],\n interpolateParams?: Record<string, unknown>\n ): Observable<Translation | TranslationObject>;\n\n abstract setLanguage(lang: Language): void;\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n Provider,\n Type,\n makeEnvironmentProviders\n} from '@angular/core';\n\nimport { LanguageOptions, withStaticConfig } from '@igo2/core/language';\nimport { provideTranslation as provideIgo2Translation } from '@igo2/core/language';\n\nimport { TitleResolver } from '../router';\nimport { TranslationService } from './translation.service';\n\nexport interface TranslationFeature<KindT extends TranslationFeatureKind> {\n kind: KindT;\n providers: (Provider | EnvironmentProviders)[];\n}\n\nexport enum TranslationFeatureKind {\n Translation = 0,\n RouterTitleResolver = 1\n}\n\nexport function provideTranslatedLabels(\n token: InjectionToken<unknown>,\n key: string\n) {\n return {\n provide: token,\n useFactory: (translationService: TranslationService) =>\n labelsFactory(translationService, key),\n deps: [TranslationService]\n };\n}\n\nfunction labelsFactory(translationService: TranslationService, key: string) {\n return translationService.get(key);\n}\n\nexport function provideTranslation(\n ...features: TranslationFeature<TranslationFeatureKind>[]\n) {\n const providers: (Provider | EnvironmentProviders)[] = [];\n\n for (const feature of features) {\n providers.push(...feature.providers);\n }\n\n return makeEnvironmentProviders(providers);\n}\n\n/** Base on the @ngx-translate library with the IgoLanguageModule */\nexport function withIgo2Translation(\n options: LanguageOptions,\n service: Type<TranslationService>,\n defaultLanguage?: string\n): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n { provide: TranslationService, useClass: service },\n provideIgo2Translation(withStaticConfig(options, defaultLanguage))\n ]\n };\n}\n\n/**\n * Provide a translater for the Route title.\n * Some components is base on the title of the route and\n * this Resolver will allow to automatically resolve the translation\n **/\nexport function withRouterTitleResolver<T>(\n resolver: Type<TitleResolver<T>>\n): TranslationFeature<TranslationFeatureKind.RouterTitleResolver> {\n return {\n kind: TranslationFeatureKind.RouterTitleResolver,\n providers: [\n {\n provide: TitleResolver<T>,\n useClass: resolver\n }\n ]\n };\n}\n","import { WritableSignal, signal } from '@angular/core';\n\nimport { provideMockTranslation } from '@igo2/core/language';\n\nimport { Observable, of } from 'rxjs';\n\nimport { Language } from './translation.interface';\nimport {\n TranslationFeature,\n TranslationFeatureKind\n} from './translation.provider';\nimport { TranslationService } from './translation.service';\n\nexport function withIgo2TranslationMock(): TranslationFeature<TranslationFeatureKind.Translation> {\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideMockTranslation(),\n { provide: TranslationService, useClass: TranslationServiceMock }\n ]\n };\n}\n\nexport class TranslationServiceMock implements TranslationService {\n lang: WritableSignal<Language> = signal('fr');\n\n get(key: string | string[]): string {\n return Array.isArray(key) ? key[0] : key;\n }\n\n getAsync(key: string | string[]): Observable<string> {\n return of(Array.isArray(key) ? key[0] : key);\n }\n\n setLanguage() {\n window.location.reload();\n }\n}\n","/**\n *\n * @param routerUrl\n * @param lang\n * @param strategy default to 'segment' set the first segment of the path (e.g., '/en/alerts' => 'en')\n */\nexport function parseUrlWithLanguage(\n routerUrl: string,\n lang: string\n): [url: string, params: string | undefined] {\n // eslint-disable-next-line prefer-const\n let [url, params] = routerUrl.split('?');\n\n const urlParts = url.split('/');\n if (urlParts.length > 1) {\n urlParts[1] = lang;\n }\n\n url = urlParts.join('/');\n\n return [url, params];\n}\n","import { Translation, TranslationObject } from '../translation';\n\nexport function labelAttribute(\n value: Translation | TranslationObject,\n defaultValue: Translation | TranslationObject = {}\n): Translation | TranslationObject {\n return value ? { ...defaultValue, ...value } : defaultValue;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.TitleResolver","provideIgo2Translation"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igo2/sdg-core",
3
- "version": "1.0.0-next.78",
3
+ "version": "1.0.0-next.80",
4
4
  "license": "LiLiQ-R",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,7 +14,7 @@
14
14
  "default": "./fesm2022/igo2-sdg-core.mjs"
15
15
  },
16
16
  "./layout": {
17
- "sass": "./src/layout/layout.scss"
17
+ "sass": "./src/layout/bootstrap-layout.scss"
18
18
  },
19
19
  "./package.json": {
20
20
  "default": "./package.json"
package/src/_index.scss CHANGED
@@ -1,3 +1,4 @@
1
1
  @forward './layout';
2
2
  @forward './theme';
3
- @forward './typography';
3
+ @forward './style';
4
+ @forward './tokens';
@@ -1,8 +1,8 @@
1
1
  @use 'sass:map';
2
2
 
3
3
  // https://design.quebec.ca/design/bases/grille-8px#c84016
4
- $breakpoints: (
5
- small: (
4
+ $grids: (
5
+ sm: (
6
6
  min-width: 0,
7
7
  max-width: 575px,
8
8
  container-max-width: container-max-width('mobile'),
@@ -10,7 +10,7 @@ $breakpoints: (
10
10
  spacing: 16px,
11
11
  margins: 8px
12
12
  ),
13
- medium: (
13
+ md: (
14
14
  min-width: 576px,
15
15
  max-width: 767px,
16
16
  container-max-width: container-max-width('mobile-landscape'),
@@ -18,7 +18,7 @@ $breakpoints: (
18
18
  spacing: 16px,
19
19
  margins: 8px
20
20
  ),
21
- large: (
21
+ lg: (
22
22
  min-width: 768px,
23
23
  max-width: 991px,
24
24
  container-max-width: container-max-width('tablet'),
@@ -26,7 +26,7 @@ $breakpoints: (
26
26
  spacing: 24px,
27
27
  margins: 12px
28
28
  ),
29
- extra-large: (
29
+ xl: (
30
30
  min-width: 992px,
31
31
  max-width: 1199px,
32
32
  container-max-width: container-max-width('laptop'),
@@ -34,7 +34,7 @@ $breakpoints: (
34
34
  spacing: 24px,
35
35
  margins: 12px
36
36
  ),
37
- maximum: (
37
+ max: (
38
38
  min-width: 1200px,
39
39
  max-width: 9999px,
40
40
  container-max-width: container-max-width('desktop'),
@@ -42,18 +42,33 @@ $breakpoints: (
42
42
  spacing: 32px,
43
43
  margins: 16px
44
44
  )
45
- );
46
-
47
- $max-content-width: 825px;
45
+ ) !default;
48
46
 
49
47
  $devices: (
50
- mobile: 'small',
51
- mobile-landscape: 'medium',
52
- tablet: 'large',
53
- laptop: 'extra-large',
54
- desktop: 'maximum'
48
+ mobile: 'sm',
49
+ mobile-landscape: 'md',
50
+ tablet: 'lg',
51
+ laptop: 'xl',
52
+ desktop: 'max'
55
53
  );
56
54
 
55
+ // Flattens a nested map, concatenating keys with '-' and returning a flat map.
56
+ @function get-grid-tokens() {
57
+ $result: ();
58
+ @each $breakpoint, $valueMap in $grids {
59
+ @each $key, $value in $valueMap {
60
+ $full-key: $key + '-' + $breakpoint;
61
+ $result: map.merge(
62
+ $result,
63
+ (
64
+ $full-key: $value
65
+ )
66
+ );
67
+ }
68
+ }
69
+ @return $result;
70
+ }
71
+
57
72
  @function breakpoint($device) {
58
73
  @return map.get($devices, $device);
59
74
  }
@@ -61,46 +76,25 @@ $devices: (
61
76
  @function min-width($device) {
62
77
  $breakpoint: breakpoint($device);
63
78
  @if $breakpoint {
64
- @return map.get($breakpoints, $breakpoint, min-width);
79
+ @return map.get($grids, $breakpoint, min-width);
65
80
  }
66
81
  }
67
82
 
68
83
  @function max-width($device) {
69
84
  $breakpoint: breakpoint($device);
70
85
  @if $breakpoint {
71
- @return map.get($breakpoints, $breakpoint, max-width);
86
+ @return map.get($grids, $breakpoint, max-width);
72
87
  }
73
88
  }
74
89
 
75
90
  @function container-max-width($device) {
76
91
  $breakpoint: breakpoint($device);
77
- $margins: map.get($breakpoints, $breakpoint, margins);
92
+ $margins: map.get($grids, $breakpoint, margins);
78
93
 
79
- @if $breakpoint == 'small' {
80
- @return calc(map.get($breakpoints, $breakpoint, max-width) - 2 * $margins);
94
+ @if $breakpoint == 'sm' {
95
+ @return calc(map.get($grids, $breakpoint, max-width) - 2 * $margins);
81
96
  } @else {
82
- @return calc(map.get($breakpoints, $breakpoint, min-width) - 2 * $margins);
83
- }
84
- }
85
-
86
- @function columns($device) {
87
- $breakpoint: breakpoint($device);
88
- @if $breakpoint {
89
- @return map.get($breakpoints, $breakpoint, columns);
90
- }
91
- }
92
-
93
- @function spacing($device) {
94
- $breakpoint: breakpoint($device);
95
- @if $breakpoint {
96
- @return map.get($breakpoints, $breakpoint, spacing);
97
- }
98
- }
99
-
100
- @function margins($device) {
101
- $breakpoint: breakpoint($device);
102
- @if $breakpoint {
103
- @return map.get($breakpoints, $breapoint, margins);
97
+ @return calc(map.get($grids, $breakpoint, min-width) - 2 * $margins);
104
98
  }
105
99
  }
106
100
 
@@ -110,7 +104,7 @@ $devices: (
110
104
  @mixin media($device) {
111
105
  $breakpoint: breakpoint($device);
112
106
  @if $breakpoint {
113
- $max-width: map.get($breakpoints, $breakpoint, max-width);
107
+ $max-width: map.get($grids, $breakpoint, max-width);
114
108
  @if $max-width {
115
109
  @media (max-width: $max-width) {
116
110
  @content;
@@ -0,0 +1,54 @@
1
+ @use 'sass:map';
2
+ @use 'sass:math';
3
+ @use 'sass:meta';
4
+ @use 'sass:string';
5
+ @use './sass-utils';
6
+ @use '../tokens/sys-palettes';
7
+
8
+ $shadow-elevations: (
9
+ 0: '0px 0px 0px 0px',
10
+ 1: '0px 1px 4px 0px ',
11
+ 2: '0px 2px 8px 0px',
12
+ 3: '0px 4px 16px 0px',
13
+ 4: '0px 6px 24px 0px'
14
+ );
15
+
16
+ // The default color "dark-blue" or "#223654" for elevation shadows.
17
+ $color: map.get(sys-palettes.$palettes, 'blue', 700) !default;
18
+
19
+ // Applies the correct css rules to an element to give it the elevation specified by $zValue.
20
+ // The $zValue must be between 0 and 4.
21
+ @mixin elevation($zValue, $color: $color, $opacity: null) {
22
+ box-shadow: get-box-shadow($zValue, $color, $opacity);
23
+ }
24
+
25
+ @function get-box-shadow($zValue, $shadow-color: $color, $opacity: null) {
26
+ @if $zValue == null {
27
+ @return null;
28
+ }
29
+
30
+ @if (sass-utils.is-css-var-name($zValue)) {
31
+ @return $zValue;
32
+ }
33
+
34
+ @if meta.type-of($zValue) != number or not math.is-unitless($zValue) {
35
+ @error '$zValue must be a unitless number, but received `#{$zValue}`';
36
+ }
37
+
38
+ @if $zValue < 0 or $zValue > 4 {
39
+ @error '$zValue must be between 0 and 4, but received `#{$zValue}`';
40
+ }
41
+
42
+ $z-value: map.get($shadow-elevations, $zValue);
43
+ $color: _compute-color-opacity($shadow-color, 0.24);
44
+
45
+ @return string.unquote('#{$z-value} #{$color}');
46
+ }
47
+
48
+ @function _compute-color-opacity($color, $opacity) {
49
+ @if meta.type-of($color) == color and $opacity != null {
50
+ @return rgba($color, $opacity);
51
+ } @else {
52
+ @return $color;
53
+ }
54
+ }
@@ -1 +1,4 @@
1
1
  @forward './overrides';
2
+ @forward './elevation';
3
+ @forward './typography';
4
+ @forward './typography-utils';
@@ -0,0 +1,24 @@
1
+ @use 'sass:meta';
2
+
3
+ /// Include content under the current selector (&) or the document root if there is no current
4
+ /// selector.
5
+ /// @param {String} $root [html] The default root selector to use when there is no current selector.
6
+ /// @output The given content under the current selector, or root selector if there is no current
7
+ /// selector.
8
+ /// @content Content to output under the current selector, or root selector if there is no current
9
+ /// selector.
10
+ @mixin current-selector-or-root($root: html) {
11
+ @if & {
12
+ @content;
13
+ } @else {
14
+ #{$root} {
15
+ @content;
16
+ }
17
+ }
18
+ }
19
+
20
+ // Returns whether the $value is a CSS variable name based on whether it's a string prefixed
21
+ // by "--".
22
+ @function is-css-var-name($value) {
23
+ @return meta.type-of($value) == string and string.index($value, '--') == 1;
24
+ }
@@ -0,0 +1,23 @@
1
+ @use 'sass:math';
2
+
3
+ $percent-root-font-size: 100 !default;
4
+ $rem-ratio: math.div(1, 0.16 * $percent-root-font-size);
5
+
6
+ @function rem($px-size) {
7
+ @return $px-size * $rem-ratio * 1rem;
8
+ }
9
+
10
+ @function rem-ratio($px-size) {
11
+ @return math.div($px-size, 16 * $percent-root-font-size * 0.01) * 1rem;
12
+ }
13
+
14
+ @mixin title-border {
15
+ &:after {
16
+ content: '';
17
+ display: block;
18
+ margin: 0;
19
+ width: 48px;
20
+ padding-top: 4px;
21
+ border-bottom: 4px solid var(--sdg-color-pink-normal);
22
+ }
23
+ }
@@ -0,0 +1,139 @@
1
+ @use '../layout/breakpoints';
2
+ @use './typography-utils' as *;
3
+ @use '../tokens/token-utils';
4
+
5
+ @mixin typo-set-base-styles {
6
+ :root {
7
+ font-size: var(--sdg-font-size-root-percent);
8
+ }
9
+
10
+ body {
11
+ color: var(--sdg-color-text);
12
+ font-family: var(--sdg-font-family-text);
13
+ font-size: var(--sdg-font-size-md);
14
+ }
15
+
16
+ a {
17
+ word-break: break-word;
18
+ overflow-wrap: break-word;
19
+ cursor: pointer;
20
+ color: var(--sdg-color-blue-piv);
21
+ text-decoration: underline;
22
+ background-color: transparent;
23
+ width: fit-content;
24
+ max-inline-size: var(--sdg-max-content-width);
25
+ }
26
+
27
+ a:hover {
28
+ text-decoration: none;
29
+ }
30
+
31
+ button {
32
+ font-family: var(--sdg-font-family-text);
33
+ }
34
+
35
+ p,
36
+ ul,
37
+ ol,
38
+ u,
39
+ .text {
40
+ color: var(--sdg-color-text);
41
+ font-size: var(--sdg-font-size-md);
42
+ line-height: 24px;
43
+ max-inline-size: var(--sdg-max-content-width);
44
+ }
45
+
46
+ ul,
47
+ ol {
48
+ margin-top: 0;
49
+ margin-bottom: 24px;
50
+ padding-left: 16px;
51
+ }
52
+
53
+ p {
54
+ margin-bottom: 24px !important;
55
+ }
56
+
57
+ li {
58
+ margin-top: 16px;
59
+ margin-bottom: 16px;
60
+ }
61
+
62
+ strong {
63
+ font-weight: 600;
64
+ }
65
+
66
+ h1,
67
+ h2,
68
+ h3,
69
+ h4,
70
+ h5,
71
+ h6,
72
+ .h1,
73
+ .h2,
74
+ .h3,
75
+ .h4,
76
+ .h5,
77
+ .h6 {
78
+ font-family: var(--sdg-font-family-title) !important;
79
+ font-weight: bold !important;
80
+ color: var(--sdg-color-text);
81
+ max-inline-size: var(--sdg-max-content-width);
82
+ }
83
+
84
+ h1 {
85
+ @include header-font('h1');
86
+ @include title-border;
87
+
88
+ @include breakpoints.media(mobile) {
89
+ font-size: var(--sdg-mobile-font-size-h1);
90
+ line-height: var(--sdg-mobile-line-height-h1);
91
+ margin-top: var(--sdg-spacer-lg) !important;
92
+ margin-bottom: var(--sdg-spacer-sm) !important;
93
+ }
94
+ }
95
+
96
+ h2 {
97
+ @include header-font('h2');
98
+
99
+ @include breakpoints.media(mobile) {
100
+ font-size: var(--sdg-mobile-font-size-h2);
101
+ line-height: var(--sdg-mobile-line-height-h2);
102
+ }
103
+ }
104
+
105
+ h3 {
106
+ @include header-font('h3');
107
+
108
+ @include breakpoints.media(mobile) {
109
+ font-size: var(--sdg-mobile-font-size-h3);
110
+ }
111
+ }
112
+
113
+ h4 {
114
+ @include header-font('h4');
115
+ }
116
+
117
+ h5 {
118
+ @include header-font('h5');
119
+ }
120
+
121
+ h6 {
122
+ @include header-font('h6');
123
+ }
124
+
125
+ .accroche {
126
+ font-size: var(--sdg-font-size-lg);
127
+ line-height: var(--sdg-line-height-lg);
128
+ font-weight: 600;
129
+ max-width: var(--sdg-max-content-width);
130
+ padding-bottom: 24px;
131
+ }
132
+ }
133
+
134
+ @mixin header-font($header) {
135
+ font-size: var(--sdg-font-size-#{$header});
136
+ line-height: var(--sdg-line-height-#{$header});
137
+ margin-top: var(--sdg-title-margin-#{$header}-mt) !important;
138
+ margin-bottom: var(--sdg-title-margin-#{$header}-mb) !important;
139
+ }
@@ -1,2 +1,2 @@
1
- @forward './igo2-lib';
2
- @forward './material';
1
+ @forward './igo2-lib' as igo2-lib-*;
2
+ @forward './material' as material-*;
@@ -1,6 +1,9 @@
1
1
  @use './list';
2
2
  @use './panel';
3
3
  @use './search-bar';
4
- @use './scrollbar';
5
4
 
6
- @forward './index-theme' as override-igo2-lib-*;
5
+ @mixin overrides() {
6
+ @include list.overrides();
7
+ @include panel.overrides();
8
+ @include search-bar.overrides();
9
+ }
@@ -0,0 +1,22 @@
1
+ @mixin overrides() {
2
+ igo-search-results-item {
3
+ .mdc-list-item__primary-text {
4
+ white-space: normal;
5
+ overflow: hidden;
6
+ text-overflow: ellipsis;
7
+ max-height: unset !important;
8
+ line-height: 18px !important;
9
+ }
10
+ }
11
+
12
+ igo-list
13
+ [igolistitem][color='accent'].igo-list-item-selected
14
+ > mat-list-item {
15
+ background-color: var(--sdg-color-blue-pale);
16
+
17
+ h4,
18
+ small {
19
+ color: var(--sdg-color-blue-piv) !important;
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,7 @@
1
+ @mixin overrides() {
2
+ .igo-panel-header,
3
+ .igo-panel-header button,
4
+ .igo-panel-title {
5
+ color: var(--sdg-color-blue-piv) !important;
6
+ }
7
+ }