@igo2/sdg-core 1.0.0-next.60
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.
- package/README.md +1 -0
- package/fesm2022/igo2-sdg-core.mjs +186 -0
- package/fesm2022/igo2-sdg-core.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/layout/breakpoint/breakpoint.service.d.ts +12 -0
- package/layout/breakpoint/index.d.ts +1 -0
- package/layout/index.d.ts +1 -0
- package/package.json +38 -0
- package/public-api.d.ts +4 -0
- package/router/index.d.ts +4 -0
- package/router/route.interface.d.ts +8 -0
- package/router/route.utils.d.ts +1 -0
- package/router/router.d.ts +5 -0
- package/router/title-resolver/index.d.ts +2 -0
- package/router/title-resolver/title-resolver.d.ts +8 -0
- package/router/title-resolver/title-resolver.pipe.d.ts +11 -0
- package/src/_index.scss +3 -0
- package/src/layout/_breakpoints.scss +120 -0
- package/src/layout/_index.scss +1 -0
- package/src/layout/layout.scss +5349 -0
- package/src/style/_index.scss +1 -0
- package/src/style/overrides/_index.scss +2 -0
- package/src/style/overrides/igo2-lib/_index-theme.scss +13 -0
- package/src/style/overrides/igo2-lib/_index.scss +6 -0
- package/src/style/overrides/igo2-lib/_search-bar-theme.scss +33 -0
- package/src/style/overrides/igo2-lib/list.scss +24 -0
- package/src/style/overrides/igo2-lib/panel.scss +8 -0
- package/src/style/overrides/igo2-lib/scrollbar.scss +15 -0
- package/src/style/overrides/igo2-lib/search-bar.scss +43 -0
- package/src/style/overrides/material/_button-theme.scss +74 -0
- package/src/style/overrides/material/_index-theme.scss +13 -0
- package/src/style/overrides/material/_index.scss +6 -0
- package/src/style/overrides/material/button.scss +5 -0
- package/src/style/overrides/material/dialog.scss +36 -0
- package/src/style/overrides/material/form-field.scss +5 -0
- package/src/style/overrides/material/input.scss +5 -0
- package/src/theme/_colors.scss +128 -0
- package/src/theme/_index.scss +3 -0
- package/src/theme/_palettes.scss +112 -0
- package/src/theme/_theme.scss +46 -0
- package/src/typography/_index.scss +2 -0
- package/src/typography/typography.scss +156 -0
- package/src/typography/typography.utils.scss +18 -0
- package/translation/index.d.ts +5 -0
- package/translation/translation-mock.provider.d.ts +12 -0
- package/translation/translation.interface.d.ts +1 -0
- package/translation/translation.provider.d.ts +21 -0
- package/translation/translation.service.d.ts +13 -0
- package/translation/translation.utils.d.ts +2 -0
- package/utils/coercion.d.ts +2 -0
- package/utils/index.d.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Core
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { signal, Injectable, Optional, Pipe, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/cdk/layout';
|
|
4
|
+
import { provideTranslation as provideTranslation$1, withStaticConfig, provideMockTranslation } from '@igo2/core/language';
|
|
5
|
+
import { of } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
class BreakpointService {
|
|
8
|
+
breakpointObserver;
|
|
9
|
+
_isHandset = signal(false);
|
|
10
|
+
get isHandset() {
|
|
11
|
+
return this._isHandset.asReadonly();
|
|
12
|
+
}
|
|
13
|
+
constructor(breakpointObserver) {
|
|
14
|
+
this.breakpointObserver = breakpointObserver;
|
|
15
|
+
this.handleBreakpoint();
|
|
16
|
+
}
|
|
17
|
+
handleBreakpoint() {
|
|
18
|
+
this.breakpointObserver
|
|
19
|
+
.observe('(max-width: 575px)')
|
|
20
|
+
.subscribe((result) => {
|
|
21
|
+
this._isHandset.set(result.matches);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
25
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, providedIn: 'root' });
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: BreakpointService, decorators: [{
|
|
28
|
+
type: Injectable,
|
|
29
|
+
args: [{
|
|
30
|
+
providedIn: 'root'
|
|
31
|
+
}]
|
|
32
|
+
}], ctorParameters: () => [{ type: i1.BreakpointObserver }] });
|
|
33
|
+
|
|
34
|
+
const RouteTitleKey = 'RouteTitle';
|
|
35
|
+
const RouteTranslateKey = 'TranslateKey';
|
|
36
|
+
function hasStaticTitle(config) {
|
|
37
|
+
return typeof config.title === 'string' || config.title === null;
|
|
38
|
+
}
|
|
39
|
+
function resolveTitle(config, titleResolver) {
|
|
40
|
+
if (hasStaticTitle(config)) {
|
|
41
|
+
return config.title;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (config.data?.[RouteTitleKey]) {
|
|
45
|
+
return config.data[RouteTitleKey];
|
|
46
|
+
}
|
|
47
|
+
return (titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
class TitleResolver {
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
54
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolver });
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolver, decorators: [{
|
|
57
|
+
type: Injectable
|
|
58
|
+
}] });
|
|
59
|
+
|
|
60
|
+
class TitleResolverPipe {
|
|
61
|
+
titleResolver;
|
|
62
|
+
constructor(titleResolver) {
|
|
63
|
+
this.titleResolver = titleResolver;
|
|
64
|
+
}
|
|
65
|
+
transform(value) {
|
|
66
|
+
return resolveTitle(value, this.titleResolver);
|
|
67
|
+
}
|
|
68
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, deps: [{ token: TitleResolver, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
69
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, isStandalone: true, name: "titleResolver" });
|
|
70
|
+
}
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: TitleResolverPipe, decorators: [{
|
|
72
|
+
type: Pipe,
|
|
73
|
+
args: [{
|
|
74
|
+
name: 'titleResolver',
|
|
75
|
+
standalone: true
|
|
76
|
+
}]
|
|
77
|
+
}], ctorParameters: () => [{ type: TitleResolver, decorators: [{
|
|
78
|
+
type: Optional
|
|
79
|
+
}] }] });
|
|
80
|
+
|
|
81
|
+
function pathIsExternal(path) {
|
|
82
|
+
const regex = /^https?:\/\//;
|
|
83
|
+
return regex.test(path);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
class TranslationService {
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function readQueryParamLanguage() {
|
|
90
|
+
if (!window) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const queryParams = window.location.search.slice(1);
|
|
94
|
+
const params = queryParams.split('&');
|
|
95
|
+
const langParams = params.find((param) => param.includes('lang'));
|
|
96
|
+
if (langParams) {
|
|
97
|
+
return langParams.split('=').pop();
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
function parseUrlWithLanguage(routerUrl, lang) {
|
|
102
|
+
const [url, params] = routerUrl.split('?');
|
|
103
|
+
let urlSegements = `lang=${lang}`;
|
|
104
|
+
if (params) {
|
|
105
|
+
const segments = params.split('&');
|
|
106
|
+
const segmentsFiltered = segments.filter((segement) => !segement.includes('lang='));
|
|
107
|
+
if (segmentsFiltered.length) {
|
|
108
|
+
urlSegements += segmentsFiltered.join('&');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return [url, urlSegements];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var TranslationFeatureKind;
|
|
115
|
+
(function (TranslationFeatureKind) {
|
|
116
|
+
TranslationFeatureKind[TranslationFeatureKind["Translation"] = 0] = "Translation";
|
|
117
|
+
TranslationFeatureKind[TranslationFeatureKind["RouterTitleResolver"] = 1] = "RouterTitleResolver";
|
|
118
|
+
})(TranslationFeatureKind || (TranslationFeatureKind = {}));
|
|
119
|
+
function provideTranslation(...features) {
|
|
120
|
+
const providers = [];
|
|
121
|
+
for (const feature of features) {
|
|
122
|
+
providers.push(...feature.providers);
|
|
123
|
+
}
|
|
124
|
+
return makeEnvironmentProviders(providers);
|
|
125
|
+
}
|
|
126
|
+
/** Base on the @ngx-translate library with the IgoLanguageModule */
|
|
127
|
+
function withIgo2Translation(options, service) {
|
|
128
|
+
const paramLanguage = readQueryParamLanguage();
|
|
129
|
+
return {
|
|
130
|
+
kind: TranslationFeatureKind.Translation,
|
|
131
|
+
providers: [
|
|
132
|
+
provideTranslation$1(withStaticConfig(options, paramLanguage)),
|
|
133
|
+
{ provide: TranslationService, useClass: service }
|
|
134
|
+
]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Provide a translater for the Route title.
|
|
139
|
+
* Some components is base on the title of the route and
|
|
140
|
+
* this Resolver will allow to automatically resolve the translation
|
|
141
|
+
**/
|
|
142
|
+
function withRouterTitleResolver(resolver) {
|
|
143
|
+
return {
|
|
144
|
+
kind: TranslationFeatureKind.RouterTitleResolver,
|
|
145
|
+
providers: [
|
|
146
|
+
{
|
|
147
|
+
provide: (TitleResolver),
|
|
148
|
+
useClass: resolver,
|
|
149
|
+
deps: [TranslationService]
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function withIgo2TranslationMock() {
|
|
156
|
+
return {
|
|
157
|
+
kind: TranslationFeatureKind.Translation,
|
|
158
|
+
providers: [
|
|
159
|
+
provideMockTranslation(),
|
|
160
|
+
{ provide: TranslationService, useClass: TranslationServiceMock }
|
|
161
|
+
]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
class TranslationServiceMock {
|
|
165
|
+
lang = signal('fr');
|
|
166
|
+
get(key) {
|
|
167
|
+
return Array.isArray(key) ? key[0] : key;
|
|
168
|
+
}
|
|
169
|
+
getAsync(key) {
|
|
170
|
+
return of(Array.isArray(key) ? key[0] : key);
|
|
171
|
+
}
|
|
172
|
+
setLanguage() {
|
|
173
|
+
window.location.reload();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function labelAttribute(value, defaultValue = {}) {
|
|
178
|
+
return value ? { ...defaultValue, ...value } : defaultValue;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Generated bundle index. Do not edit.
|
|
183
|
+
*/
|
|
184
|
+
|
|
185
|
+
export { BreakpointService, RouteTitleKey, RouteTranslateKey, TitleResolver, TitleResolverPipe, TranslationFeatureKind, TranslationService, TranslationServiceMock, labelAttribute, parseUrlWithLanguage, pathIsExternal, provideTranslation, readQueryParamLanguage, resolveTitle, withIgo2Translation, withIgo2TranslationMock, withRouterTitleResolver };
|
|
186
|
+
//# sourceMappingURL=igo2-sdg-core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"igo2-sdg-core.mjs","sources":["../../../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.utils.ts","../../../packages/core/src/translation/translation.provider.ts","../../../packages/core/src/translation/translation-mock.provider.ts","../../../packages/core/src/utils/coercion.ts","../../../packages/core/src/igo2-sdg-core.ts"],"sourcesContent":["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 if (config.data?.[RouteTitleKey]) {\n return config.data[RouteTitleKey];\n }\n\n return (\n titleResolver?.resolveStatic(config) ?? config.data?.[RouteTranslateKey] // try to fallback on the translation key\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n MaybeAsync,\n Resolve,\n Route,\n RouterStateSnapshot\n} from '@angular/router';\n\n@Injectable()\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","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","export function readQueryParamLanguage(): string | undefined {\n if (!window) {\n return undefined;\n }\n const queryParams = window.location.search.slice(1);\n const params = queryParams.split('&');\n const langParams = params.find((param) => param.includes('lang'));\n if (langParams) {\n return langParams.split('=').pop();\n }\n\n return undefined;\n}\n\nexport function parseUrlWithLanguage(\n routerUrl: string,\n lang: string\n): [url: string, params: string | undefined] {\n const [url, params] = routerUrl.split('?');\n\n let urlSegements = `lang=${lang}`;\n if (params) {\n const segments = params.split('&');\n const segmentsFiltered = segments.filter(\n (segement) => !segement.includes('lang=')\n );\n if (segmentsFiltered.length) {\n urlSegements += segmentsFiltered.join('&');\n }\n }\n\n return [url, urlSegements];\n}\n","import {\n EnvironmentProviders,\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';\nimport { readQueryParamLanguage } from './translation.utils';\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 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): TranslationFeature<TranslationFeatureKind.Translation> {\n const paramLanguage = readQueryParamLanguage();\n return {\n kind: TranslationFeatureKind.Translation,\n providers: [\n provideIgo2Translation(withStaticConfig(options, paramLanguage)),\n { provide: TranslationService, useClass: service }\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 deps: [TranslationService]\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","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.TitleResolver","provideIgo2Translation"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BreakpointObserver } from '@angular/cdk/layout';
|
|
2
|
+
import { Signal } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class BreakpointService {
|
|
5
|
+
private breakpointObserver;
|
|
6
|
+
private _isHandset;
|
|
7
|
+
get isHandset(): Signal<boolean>;
|
|
8
|
+
constructor(breakpointObserver: BreakpointObserver);
|
|
9
|
+
private handleBreakpoint;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BreakpointService, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<BreakpointService>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './breakpoint.service';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './breakpoint';
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@igo2/sdg-core",
|
|
3
|
+
"version": "1.0.0-next.60",
|
|
4
|
+
"license": "LiLiQ-R",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/infra-geo-ouverte/sdg.git",
|
|
8
|
+
"directory": "packages/core"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"sass": "./src/_index.scss",
|
|
13
|
+
"types": "./index.d.ts",
|
|
14
|
+
"default": "./fesm2022/igo2-sdg-core.mjs"
|
|
15
|
+
},
|
|
16
|
+
"./layout": {
|
|
17
|
+
"sass": "./src/layout/layout.scss"
|
|
18
|
+
},
|
|
19
|
+
"./package.json": {
|
|
20
|
+
"default": "./package.json"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@angular/cdk": "^19.2.0",
|
|
25
|
+
"@angular/common": "^19.2.0",
|
|
26
|
+
"@angular/core": "^19.2.0",
|
|
27
|
+
"@angular/material": "^19.2.0",
|
|
28
|
+
"@angular/router": "^19.2.0",
|
|
29
|
+
"@igo2/core": "^19.0.0-next",
|
|
30
|
+
"bootstrap": "^5.3.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"tslib": "^2.6.0"
|
|
34
|
+
},
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"module": "fesm2022/igo2-sdg-core.mjs",
|
|
37
|
+
"typings": "index.d.ts"
|
|
38
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function pathIsExternal(path: string): boolean;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Route } from '@angular/router';
|
|
2
|
+
import { TitleResolver } from './title-resolver/title-resolver';
|
|
3
|
+
export declare const RouteTitleKey = "RouteTitle";
|
|
4
|
+
export declare const RouteTranslateKey = "TranslateKey";
|
|
5
|
+
export declare function resolveTitle(config: Route, titleResolver?: TitleResolver): string | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ActivatedRouteSnapshot, MaybeAsync, Resolve, Route, RouterStateSnapshot } from '@angular/router';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare abstract class TitleResolver<T = string> implements Resolve<T> {
|
|
4
|
+
abstract resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): MaybeAsync<T>;
|
|
5
|
+
abstract resolveStatic(route: Route): string | undefined;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TitleResolver<any>, never>;
|
|
7
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TitleResolver<any>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { SdgRoute } from '../route.interface';
|
|
3
|
+
import { TitleResolver } from './title-resolver';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class TitleResolverPipe implements PipeTransform {
|
|
6
|
+
private titleResolver;
|
|
7
|
+
constructor(titleResolver: TitleResolver);
|
|
8
|
+
transform(value: SdgRoute): string | undefined;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TitleResolverPipe, [{ optional: true; }]>;
|
|
10
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<TitleResolverPipe, "titleResolver", true>;
|
|
11
|
+
}
|
package/src/_index.scss
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
@use 'sass:map';
|
|
2
|
+
|
|
3
|
+
// https://design.quebec.ca/design/bases/grille-8px#c84016
|
|
4
|
+
$breakpoints: (
|
|
5
|
+
small: (
|
|
6
|
+
min-width: 0,
|
|
7
|
+
max-width: 575px,
|
|
8
|
+
container-max-width: container-max-width('mobile'),
|
|
9
|
+
columns: 4,
|
|
10
|
+
spacing: 16px,
|
|
11
|
+
margins: 8px
|
|
12
|
+
),
|
|
13
|
+
medium: (
|
|
14
|
+
min-width: 576px,
|
|
15
|
+
max-width: 767px,
|
|
16
|
+
container-max-width: container-max-width('mobile-landscape'),
|
|
17
|
+
columns: 4,
|
|
18
|
+
spacing: 16px,
|
|
19
|
+
margins: 8px
|
|
20
|
+
),
|
|
21
|
+
large: (
|
|
22
|
+
min-width: 768px,
|
|
23
|
+
max-width: 991px,
|
|
24
|
+
container-max-width: container-max-width('tablet'),
|
|
25
|
+
columns: 12,
|
|
26
|
+
spacing: 24px,
|
|
27
|
+
margins: 12px
|
|
28
|
+
),
|
|
29
|
+
extra-large: (
|
|
30
|
+
min-width: 992px,
|
|
31
|
+
max-width: 1199px,
|
|
32
|
+
container-max-width: container-max-width('laptop'),
|
|
33
|
+
columns: 12,
|
|
34
|
+
spacing: 24px,
|
|
35
|
+
margins: 12px
|
|
36
|
+
),
|
|
37
|
+
maximum: (
|
|
38
|
+
min-width: 1200px,
|
|
39
|
+
max-width: 9999px,
|
|
40
|
+
container-max-width: container-max-width('desktop'),
|
|
41
|
+
columns: 12,
|
|
42
|
+
spacing: 32px,
|
|
43
|
+
margins: 16px
|
|
44
|
+
)
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
$devices: (
|
|
48
|
+
mobile: 'small',
|
|
49
|
+
mobile-landscape: 'medium',
|
|
50
|
+
tablet: 'large',
|
|
51
|
+
laptop: 'extra-large',
|
|
52
|
+
desktop: 'maximum'
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
@function breakpoint($device) {
|
|
56
|
+
@return map.get($devices, $device);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@function min-width($device) {
|
|
60
|
+
$breakpoint: breakpoint($device);
|
|
61
|
+
@if $breakpoint {
|
|
62
|
+
@return map.get($breakpoints, $breakpoint, min-width);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@function max-width($device) {
|
|
67
|
+
$breakpoint: breakpoint($device);
|
|
68
|
+
@if $breakpoint {
|
|
69
|
+
@return map.get($breakpoints, $breakpoint, max-width);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@function container-max-width($device) {
|
|
74
|
+
$breakpoint: breakpoint($device);
|
|
75
|
+
$margins: map.get($breakpoints, $breakpoint, margins);
|
|
76
|
+
|
|
77
|
+
@if $breakpoint == 'small' {
|
|
78
|
+
@return calc(map.get($breakpoints, $breakpoint, max-width) - 2 * $margins);
|
|
79
|
+
} @else {
|
|
80
|
+
@return calc(map.get($breakpoints, $breakpoint, min-width) - 2 * $margins);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@function columns($device) {
|
|
85
|
+
$breakpoint: breakpoint($device);
|
|
86
|
+
@if $breakpoint {
|
|
87
|
+
@return map.get($breakpoints, $breakpoint, columns);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@function spacing($device) {
|
|
92
|
+
$breakpoint: breakpoint($device);
|
|
93
|
+
@if $breakpoint {
|
|
94
|
+
@return map.get($breakpoints, $breakpoint, spacing);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@function margins($device) {
|
|
99
|
+
$breakpoint: breakpoint($device);
|
|
100
|
+
@if $breakpoint {
|
|
101
|
+
@return map.get($breakpoints, $breapoint, margins);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
|
|
106
|
+
// Makes the @content apply to the given breakpoint and narrower.
|
|
107
|
+
// https://github.com/twbs/bootstrap/blob/main/scss/mixins/_breakpoints.scss
|
|
108
|
+
@mixin media($device) {
|
|
109
|
+
$breakpoint: breakpoint($device);
|
|
110
|
+
@if $breakpoint {
|
|
111
|
+
$max-width: map.get($breakpoints, $breakpoint, max-width);
|
|
112
|
+
@if $max-width {
|
|
113
|
+
@media (max-width: $max-width) {
|
|
114
|
+
@content;
|
|
115
|
+
}
|
|
116
|
+
} @else {
|
|
117
|
+
@content;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@forward './breakpoints';
|