@cute-widgets/base 20.0.3 → 20.0.5
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/CHANGELOG.md +31 -4
- package/abstract/index.d.ts +13 -4
- package/button/index.d.ts +47 -24
- package/button-toggle/index.d.ts +8 -4
- package/card/index.d.ts +9 -6
- package/collapse/index.d.ts +49 -48
- package/core/directives/index.d.ts +1 -31
- package/core/index.d.ts +41 -28
- package/core/interfaces/index.d.ts +1 -1
- package/core/layout/index.d.ts +40 -27
- package/core/nav/index.d.ts +1 -2
- package/dialog/index.d.ts +81 -57
- package/expansion/index.d.ts +5 -18
- package/fesm2022/cute-widgets-base-abstract.mjs +13 -8
- package/fesm2022/cute-widgets-base-abstract.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-button-toggle.mjs +36 -29
- package/fesm2022/cute-widgets-base-button-toggle.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-button.mjs +169 -104
- package/fesm2022/cute-widgets-base-button.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-card.mjs +46 -29
- package/fesm2022/cute-widgets-base-card.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-chips.mjs +6 -18
- package/fesm2022/cute-widgets-base-chips.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-collapse.mjs +114 -126
- package/fesm2022/cute-widgets-base-collapse.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core-directives.mjs +4 -72
- package/fesm2022/cute-widgets-base-core-directives.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core-interfaces.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core-layout.mjs +76 -40
- package/fesm2022/cute-widgets-base-core-layout.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core-nav.mjs +1 -2
- package/fesm2022/cute-widgets-base-core-nav.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core-theming.mjs +1 -1
- package/fesm2022/cute-widgets-base-core-theming.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-core.mjs +77 -41
- package/fesm2022/cute-widgets-base-core.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-dialog.mjs +152 -117
- package/fesm2022/cute-widgets-base-dialog.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-expansion.mjs +19 -13
- package/fesm2022/cute-widgets-base-expansion.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-list.mjs +2 -2
- package/fesm2022/cute-widgets-base-list.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-menu.mjs +5 -27
- package/fesm2022/cute-widgets-base-menu.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-navbar.mjs +88 -42
- package/fesm2022/cute-widgets-base-navbar.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-paginator.mjs +13 -11
- package/fesm2022/cute-widgets-base-paginator.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-radio.mjs +1 -2
- package/fesm2022/cute-widgets-base-radio.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-select.mjs +2 -2
- package/fesm2022/cute-widgets-base-select.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-sidenav.mjs +31 -30
- package/fesm2022/cute-widgets-base-sidenav.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-snack-bar.mjs +2 -2
- package/fesm2022/cute-widgets-base-snack-bar.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-sort.mjs +60 -257
- package/fesm2022/cute-widgets-base-sort.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-table.mjs +6 -3
- package/fesm2022/cute-widgets-base-table.mjs.map +1 -1
- package/fesm2022/cute-widgets-base-tabs.mjs +86 -61
- package/fesm2022/cute-widgets-base-tabs.mjs.map +1 -1
- package/fesm2022/cute-widgets-base.mjs +3 -1
- package/fesm2022/cute-widgets-base.mjs.map +1 -1
- package/navbar/index.d.ts +30 -9
- package/package.json +6 -5
- package/paginator/index.d.ts +6 -17
- package/radio/index.d.ts +0 -1
- package/sidenav/index.d.ts +1 -2
- package/sort/index.d.ts +22 -135
- package/table/index.d.ts +8 -8
- package/tabs/index.d.ts +35 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cute-widgets-base-core-interfaces.mjs","sources":["../../../../projects/cute-widgets/base/core/interfaces/src/MenuItem.ts","../../../../projects/cute-widgets/base/core/interfaces/src/TreeNode.ts","../../../../projects/cute-widgets/base/core/interfaces/cute-widgets-base-core-interfaces.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\nimport {TreeNode} from \"./TreeNode\";\r\nimport {ToolbarItem} from \"./ToolbarItem\";\r\n\r\n/**\r\n * Menu Item interface is used for items in a drop-down or cascading menu\r\n */\r\nexport interface MenuItem<D=unknown> extends TreeNode<D> {\r\n /** An array of the submenu items. */\r\n children?: MenuItem<D>[];\r\n /** Whether an item is the default item. */\r\n default?: (()=>boolean)|boolean;\r\n /** Is item checked? Default is _false_. */\r\n checked?: (()=>boolean)|boolean;\r\n /** Item is clicked (selected or unselected). */\r\n clicked?: () => void;\r\n /** Toolbar's item definition. */\r\n toolBarItem?: ToolbarItem;\r\n}\r\n\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\nimport {RichThemeColor} from \"@cute-widgets/base/core/theming\";\r\n\r\n/**\r\n * A structure that populates the properties for individual items in a TreeView control.\r\n */\r\nexport interface TreeNode<D=unknown> {\r\n /** Unique identifier */\r\n id?: string;\r\n /** Identifies the string label associated with the item. */\r\n label: string;\r\n /** Specifies whether the item has children. */\r\n hasChildren?: boolean;\r\n /** Children items. */\r\n children?: TreeNode<D>[];\r\n /** Item short description */\r\n microHelp?: string;\r\n /** Indicates the level of the item in the TreeView control. */\r\n level?: number;\r\n /** Any user-defined data. */\r\n data?: D;\r\n /** Router link. */\r\n routerLink?: string | string[];\r\n /** Identifies the
|
|
1
|
+
{"version":3,"file":"cute-widgets-base-core-interfaces.mjs","sources":["../../../../projects/cute-widgets/base/core/interfaces/src/MenuItem.ts","../../../../projects/cute-widgets/base/core/interfaces/src/TreeNode.ts","../../../../projects/cute-widgets/base/core/interfaces/cute-widgets-base-core-interfaces.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\nimport {TreeNode} from \"./TreeNode\";\r\nimport {ToolbarItem} from \"./ToolbarItem\";\r\n\r\n/**\r\n * Menu Item interface is used for items in a drop-down or cascading menu\r\n */\r\nexport interface MenuItem<D=unknown> extends TreeNode<D> {\r\n /** An array of the submenu items. */\r\n children?: MenuItem<D>[];\r\n /** Whether an item is the default item. */\r\n default?: (()=>boolean)|boolean;\r\n /** Is item checked? Default is _false_. */\r\n checked?: (()=>boolean)|boolean;\r\n /** Item is clicked (selected or unselected). */\r\n clicked?: () => void;\r\n /** Toolbar's item definition. */\r\n toolBarItem?: ToolbarItem;\r\n}\r\n\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\nimport {RichThemeColor} from \"@cute-widgets/base/core/theming\";\r\n\r\n/**\r\n * A structure that populates the properties for individual items in a TreeView control.\r\n */\r\nexport interface TreeNode<D=unknown> {\r\n /** Unique identifier */\r\n id?: string;\r\n /** Identifies the string label associated with the item. */\r\n label: string;\r\n /** Specifies whether the item has children. */\r\n hasChildren?: boolean;\r\n /** Children items. */\r\n children?: TreeNode<D>[];\r\n /** Item short description */\r\n microHelp?: string;\r\n /** Indicates the level of the item in the TreeView control. */\r\n level?: number;\r\n /** Any user-defined data. */\r\n data?: D;\r\n /** Router link. */\r\n routerLink?: string | string[];\r\n /** Identifies the image displayed next to the item label. */\r\n icon?: string;\r\n /** Icon color. */\r\n iconColor?: string;\r\n /** Icon CSS class(es). */\r\n iconClass?: string | string[] | Record<string, boolean>;\r\n /** Identifies the state picture associated with the item. */\r\n stateIcon?: string;\r\n /** The badge text associated with the item. */\r\n badge?: string;\r\n /** Badge theme color. */\r\n badgeColor?: RichThemeColor;\r\n /** Is node enabled? Default is _true_. */\r\n enabled?: (()=>boolean)|boolean;\r\n /** Is node visible? Default is _true_. */\r\n visible?: (()=>boolean)|boolean;\r\n\r\n status?: {\r\n /** Specifies whether the node is expanded. */\r\n expanded?: boolean;\r\n /** Specifies whether the node has been populated with children. */\r\n populated?: boolean;\r\n /** Specifies whether the item has focus. */\r\n hasFocus?: boolean;\r\n /** Specifies whether the item is selected. */\r\n selection?: 'checked' | 'indeterminate' | 'unchecked';\r\n };\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;;;;;;AAOG;;ACPH;;;;;;;AAOG;;ACPH;;AAEG"}
|
|
@@ -7,40 +7,92 @@
|
|
|
7
7
|
* that can be found at http://www.apache.org/licenses/LICENSE-2.0
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
10
|
-
* Bootstrap media
|
|
11
|
-
* PascalCase is being used as Breakpoints is used like an enum.
|
|
10
|
+
* Bootstrap media queries, or `breakpoints`.
|
|
12
11
|
*/
|
|
13
12
|
const bsBreakpoints = {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
13
|
+
query: {
|
|
14
|
+
SmallAndDown: '(max-width: 576px)',
|
|
15
|
+
MediumAndDown: '(max-width: 768px)',
|
|
16
|
+
LargeAndDown: '(max-width: 992px)',
|
|
17
|
+
XLargeAndDown: '(max-width: 1200px)',
|
|
18
|
+
XXLargeAndDown: '(max-width: 1400px)',
|
|
19
|
+
XSmall: '(max-width: 575.98px)',
|
|
20
|
+
Small: '(min-width: 576px) and (max-width: 767.98px)',
|
|
21
|
+
Medium: '(min-width: 768px) and (max-width: 991.98px)',
|
|
22
|
+
Large: '(min-width: 992px) and (max-width: 1199.98px)',
|
|
23
|
+
XLarge: '(min-width: 1200px) and (max-width: 1399.98px)',
|
|
24
|
+
XXLarge: '(min-width: 1400px)',
|
|
25
|
+
get xs() { return this.XSmall; },
|
|
26
|
+
get sm() { return this.Small; },
|
|
27
|
+
get md() { return this.Medium; },
|
|
28
|
+
get lg() { return this.Large; },
|
|
29
|
+
get xl() { return this.XLarge; },
|
|
30
|
+
get xxl() { return this.XXLarge; },
|
|
31
|
+
},
|
|
25
32
|
get grid() {
|
|
26
33
|
return { xs: 0, sm: 576, md: 768, lg: 992, xl: 1200, xxl: 1400 };
|
|
27
34
|
},
|
|
28
|
-
get xs() { return this.XSmall; },
|
|
29
|
-
get sm() { return this.Small; },
|
|
30
|
-
get md() { return this.Medium; },
|
|
31
|
-
get lg() { return this.Large; },
|
|
32
|
-
get xl() { return this.XLarge; },
|
|
33
|
-
get xxl() { return this.XXLarge; },
|
|
34
35
|
/**
|
|
35
|
-
* Gets the
|
|
36
|
-
* @param
|
|
37
|
-
* @returns
|
|
36
|
+
* Gets the breakpoint label by Bootstrap's breakpoint abbreviation
|
|
37
|
+
* @param code Bootstrap's breakpoint abbreviation.
|
|
38
|
+
* @returns More descriptive text of the abbreviation.
|
|
39
|
+
*/
|
|
40
|
+
getLabel(code) {
|
|
41
|
+
switch (code.trim().toLowerCase()) {
|
|
42
|
+
case "xs":
|
|
43
|
+
case "xsmall":
|
|
44
|
+
return "XSmall";
|
|
45
|
+
case "sm":
|
|
46
|
+
case "small":
|
|
47
|
+
return "Small";
|
|
48
|
+
case "md":
|
|
49
|
+
case "medium":
|
|
50
|
+
return "Medium";
|
|
51
|
+
case "lg":
|
|
52
|
+
case "large":
|
|
53
|
+
return "Large";
|
|
54
|
+
case "xl":
|
|
55
|
+
case "xlarge":
|
|
56
|
+
return "XLarge";
|
|
57
|
+
case "xxl":
|
|
58
|
+
case "xxlarge":
|
|
59
|
+
return "XXLarge";
|
|
60
|
+
}
|
|
61
|
+
return "";
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Returns the media query string for the specified breakpoint symbol.
|
|
65
|
+
* @param code Bootstrap's breakpoint abbreviation.
|
|
66
|
+
* @returns Media query string or _undefined_ if the code has an unknown value.
|
|
67
|
+
*/
|
|
68
|
+
getMediaQuery(code) {
|
|
69
|
+
if (code in this.query) {
|
|
70
|
+
return this.query[code];
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* Returns the media query string array for the specified breakpoint one or more symbols.
|
|
76
|
+
* @param codes Bootstrap's breakpoint abbreviation list.
|
|
77
|
+
* @returns Media query string array for each specified code of breakpoint.
|
|
78
|
+
*/
|
|
79
|
+
getMediaQueries(codes) {
|
|
80
|
+
const bpArray = Array.isArray(codes) ? [...codes] : [codes];
|
|
81
|
+
return bpArray.map(value => {
|
|
82
|
+
const label = this.getLabel(value);
|
|
83
|
+
return this.getMediaQuery(label + "AndDown") ?? "";
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
/**
|
|
87
|
+
* Gets the name of the media-query by its value.
|
|
88
|
+
* @param query The media-query text.
|
|
89
|
+
* @returns The name of the media-query or _undefined_ if it was not found.
|
|
38
90
|
*/
|
|
39
91
|
getQueryName(query) {
|
|
40
92
|
let res;
|
|
41
93
|
if (query) {
|
|
42
|
-
for (const key
|
|
43
|
-
if (
|
|
94
|
+
for (const [key, value] of Object.entries(this.query)) {
|
|
95
|
+
if (value === query) {
|
|
44
96
|
res = key;
|
|
45
97
|
break;
|
|
46
98
|
}
|
|
@@ -48,22 +100,6 @@ const bsBreakpoints = {
|
|
|
48
100
|
}
|
|
49
101
|
return res;
|
|
50
102
|
},
|
|
51
|
-
/**
|
|
52
|
-
* Gets the breakpoint label by Bootstrap's breakpoint abbreviation
|
|
53
|
-
* @param code Bootstrap's breakpoint abbreviation
|
|
54
|
-
* @returns More descriptive text of the abbreviation
|
|
55
|
-
*/
|
|
56
|
-
getLabel(code) {
|
|
57
|
-
switch (code) {
|
|
58
|
-
case "xs": return "XSmall";
|
|
59
|
-
case "sm": return "Small";
|
|
60
|
-
case "md": return "Medium";
|
|
61
|
-
case "lg": return "Large";
|
|
62
|
-
case "xl": return "XLarge";
|
|
63
|
-
case "xxl": return "XXLarge";
|
|
64
|
-
}
|
|
65
|
-
return "";
|
|
66
|
-
}
|
|
67
103
|
};
|
|
68
104
|
|
|
69
105
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cute-widgets-base-core-layout.mjs","sources":["../../../../projects/cute-widgets/base/core/layout/src/bs-breakpoints.ts","../../../../projects/cute-widgets/base/core/layout/cute-widgets-base-core-layout.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\n/**\r\n * Bootstrap media
|
|
1
|
+
{"version":3,"file":"cute-widgets-base-core-layout.mjs","sources":["../../../../projects/cute-widgets/base/core/layout/src/bs-breakpoints.ts","../../../../projects/cute-widgets/base/core/layout/cute-widgets-base-core-layout.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\n/**\r\n * Bootstrap media queries, or `breakpoints`.\r\n */\r\nexport const bsBreakpoints = {\r\n\r\n query: {\r\n SmallAndDown: '(max-width: 576px)',\r\n MediumAndDown: '(max-width: 768px)',\r\n LargeAndDown: '(max-width: 992px)',\r\n XLargeAndDown: '(max-width: 1200px)',\r\n XXLargeAndDown: '(max-width: 1400px)',\r\n\r\n XSmall: '(max-width: 575.98px)',\r\n Small: '(min-width: 576px) and (max-width: 767.98px)',\r\n Medium: '(min-width: 768px) and (max-width: 991.98px)',\r\n Large: '(min-width: 992px) and (max-width: 1199.98px)',\r\n XLarge: '(min-width: 1200px) and (max-width: 1399.98px)',\r\n XXLarge: '(min-width: 1400px)',\r\n\r\n get xs(): string {return this.XSmall},\r\n get sm(): string {return this.Small},\r\n get md(): string {return this.Medium},\r\n get lg(): string {return this.Large},\r\n get xl(): string {return this.XLarge},\r\n get xxl(): string {return this.XXLarge},\r\n },\r\n\r\n get grid(): {xs:number,sm:number,md:number,lg:number,xl:number,xxl:number} {\r\n return {xs:0, sm:576, md:768, lg: 992, xl: 1200, xxl: 1400};\r\n },\r\n\r\n /**\r\n * Gets the breakpoint label by Bootstrap's breakpoint abbreviation\r\n * @param code Bootstrap's breakpoint abbreviation.\r\n * @returns More descriptive text of the abbreviation.\r\n */\r\n getLabel(code: string): string {\r\n switch (code.trim().toLowerCase()) {\r\n case \"xs\":\r\n case \"xsmall\":\r\n return \"XSmall\";\r\n case \"sm\":\r\n case \"small\":\r\n return \"Small\";\r\n case \"md\":\r\n case \"medium\":\r\n return \"Medium\";\r\n case \"lg\":\r\n case \"large\":\r\n return \"Large\";\r\n case \"xl\":\r\n case \"xlarge\":\r\n return \"XLarge\";\r\n case \"xxl\":\r\n case \"xxlarge\":\r\n return \"XXLarge\";\r\n }\r\n return \"\";\r\n },\r\n\r\n /**\r\n * Returns the media query string for the specified breakpoint symbol.\r\n * @param code Bootstrap's breakpoint abbreviation.\r\n * @returns Media query string or _undefined_ if the code has an unknown value.\r\n */\r\n getMediaQuery(code: string): string | undefined {\r\n if (code in this.query) {\r\n return (this.query as any)[code];\r\n }\r\n return undefined;\r\n },\r\n\r\n /**\r\n * Returns the media query string array for the specified breakpoint one or more symbols.\r\n * @param codes Bootstrap's breakpoint abbreviation list.\r\n * @returns Media query string array for each specified code of breakpoint.\r\n */\r\n getMediaQueries(codes: string|string[]): string[] {\r\n const bpArray = Array.isArray(codes) ? [...codes] : [codes];\r\n return bpArray.map(value => {\r\n const label = this.getLabel(value);\r\n return this.getMediaQuery(label + \"AndDown\") ?? \"\";\r\n })\r\n },\r\n\r\n /**\r\n * Gets the name of the media-query by its value.\r\n * @param query The media-query text.\r\n * @returns The name of the media-query or _undefined_ if it was not found.\r\n */\r\n getQueryName(query: string): string | undefined {\r\n let res: string | undefined;\r\n if (query) {\r\n for (const [key, value] of Object.entries(this.query)) {\r\n if (value === query) {\r\n res = key;\r\n break;\r\n }\r\n }\r\n }\r\n return res;\r\n },\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, DOCUMENT, NgZone, booleanAttribute, Input, Directive, TemplateRef, InjectionToken, ViewContainerRef, ViewChild, ContentChild, ChangeDetectionStrategy, ViewEncapsulation, Component,
|
|
2
|
+
import { inject, DOCUMENT, NgZone, booleanAttribute, Input, Directive, TemplateRef, InjectionToken, ViewContainerRef, ViewChild, ContentChild, ChangeDetectionStrategy, ViewEncapsulation, Component, EventEmitter, numberAttribute, HostBinding, Output, ContentChildren, forwardRef, NgModule } from '@angular/core';
|
|
3
3
|
import { FocusKeyManager } from '@angular/cdk/a11y';
|
|
4
4
|
import { Directionality } from '@angular/cdk/bidi';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -388,7 +388,6 @@ class CuteNav extends CuteLayoutControl {
|
|
|
388
388
|
}
|
|
389
389
|
constructor() {
|
|
390
390
|
super();
|
|
391
|
-
this._destroyRef = inject(DestroyRef);
|
|
392
391
|
this._dir = inject(Directionality);
|
|
393
392
|
this._oldFocusLink = null;
|
|
394
393
|
/** To synchronize selectedIndex and keyManager.activeIndex */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cute-widgets-base-core-nav.mjs","sources":["../../../../projects/cute-widgets/base/core/nav/src/nav-link.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-content.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-item.component.ts","../../../../projects/cute-widgets/base/core/nav/src/nav.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-pane.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-outlet.component.ts","../../../../projects/cute-widgets/base/core/nav/src/nav.module.ts","../../../../projects/cute-widgets/base/core/nav/cute-widgets-base-core-nav.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {booleanAttribute, Directive, inject, Input, NgZone, DOCUMENT} from \"@angular/core\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {CuteFocusableControl} from \"@cute-widgets/base/abstract\";\r\nimport {toThemeColor} from '@cute-widgets/base/core';\r\nimport {CUTE_NAV} from \"./nav.directive\";\r\nimport {fromEvent} from \"rxjs\";\r\n\r\nlet nextId: number = -1;\r\n\r\n/**\r\n * This class can be used to create a navigation menu, where it is applied to `<a>` elements.\r\n */\r\n@Directive({\r\n selector: `a[cute-nav-link], a[cuteNavLink],\r\n button[cute-nav-link], button[cuteNavLink]\r\n `,\r\n exportAs: 'cuteNavLink',\r\n host: {\r\n 'class': 'cute-nav-link nav-link',\r\n //'[class]': 'color ? \"link-\"+toThemeColor(color) : undefined',\r\n '[class.active]': 'active',\r\n '[class.disabled]': 'disabled',\r\n '[disabled]': 'disabled',\r\n '[attr.aria-disabled]': 'disabled',\r\n '[attr.aria-current]': 'active ? \"page\" : null',\r\n '[attr.aria-selected]': 'active || null',\r\n '[aria-controls]': 'ariaControls || getAriaControls()',\r\n '[attr.id]': 'id || null',\r\n '[attr.role]': 'role || null',\r\n '[attr.tabindex]': 'active && !disabled ? 0 : -1',\r\n '[style.--bs-btn-border-radius]': '0', // bootstrap's tab-link already stylized with radius of top angles\r\n '[style.--bs-navbar-active-color]': '!nav.isTab() ? \"var(\"+(color ? \"--bs-\"+toThemeColor(color)+\"-text-emphasis\" : \"--bs-emphasis-color\")+\")\" : undefined',\r\n '(click)': 'onClick($event)',\r\n //'(touchstart)': 'onTouchStart($event)',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteNavLink extends CuteFocusableControl {\r\n protected _document = inject(DOCUMENT);\r\n protected _ngZone = inject(NgZone);\r\n protected readonly nav = inject(CUTE_NAV, {optional: true});\r\n\r\n protected toThemeColor = toThemeColor;\r\n\r\n /** Whether the link is active. */\r\n @Input({transform: booleanAttribute})\r\n active: boolean = false;\r\n\r\n /** Explicit element identifier(s) whose content or presence are controlled by the link */\r\n @Input(\"aria-controls\")\r\n ariaControls: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n\r\n this._focusMonitor.monitor(this._elementRef)\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(origin => {\r\n this._ngZone.run(() => {\r\n if (this.nav) {\r\n this.nav._focusChanged(this, origin);\r\n }\r\n });\r\n });\r\n\r\n // MouseDown event\r\n fromEvent<MouseEvent>(this._nativeElement, \"mousedown\", {capture: true})\r\n .pipe(takeUntilDestroyed())\r\n .subscribe((event) => this.onMouseDown(event));\r\n }\r\n\r\n protected generateId(): string {\r\n return `cute-nav-link-${++nextId}`;\r\n }\r\n\r\n /** Gets fallback element identifier(s) whose content or presence are controlled by the link. */\r\n protected getAriaControls(): string {\r\n if ( !(this.nav && this.nav.isTab()) ) return \"\";\r\n const index = this.nav.getNavLinkIndex(this);\r\n let ids: string = \"\";\r\n if (index >= 0) {\r\n ids = `${this.nav.id}-pane-${index}`;\r\n }\r\n return ids;\r\n }\r\n\r\n /**\r\n * MouseDown event handler in `capture` state of the event propagation.\r\n * @param event MouseEvent\r\n * @protected\r\n */\r\n protected onMouseDown(event: MouseEvent): void {\r\n if (this.nav) {\r\n if (!this.nav.activateNavLink(this, 'mouse')) {\r\n // we need to prevent default action so CSS-styles may be applied incorrectly\r\n event.stopImmediatePropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n protected onClick(event: MouseEvent): void {\r\n const elem = event.target as HTMLElement;\r\n event.preventDefault();\r\n if (elem instanceof HTMLAnchorElement && elem.hash && elem.hash.startsWith(\"#\")) {\r\n event.stopPropagation();\r\n const target = this._document.getElementById(elem.hash.substring(1));\r\n if (target) {\r\n target.scrollIntoView({behavior: \"smooth\", block: \"nearest\"});\r\n }\r\n }\r\n }\r\n\r\n protected onTouchStart(event: TouchEvent): void {\r\n if (this.nav) {\r\n this.nav.activateNavLink(this, 'touch');\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n if (this.nav?.role == \"tablist\") {\r\n this.role = \"tab\";\r\n }\r\n }\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {Directive, inject, TemplateRef} from \"@angular/core\";\r\n\r\n/**\r\n * Lazy loading content of the `cute-nav-item` element.\r\n */\r\n@Directive({\r\n selector: 'ng-template[cuteNavContent], ng-template[cute-nav-content]',\r\n exportAs: 'cuteNavContent',\r\n standalone: true,\r\n})\r\nexport class CuteNavContent /* extends ... */ {\r\n public readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n booleanAttribute, ChangeDetectionStrategy, Component,\r\n ContentChild,\r\n inject,\r\n InjectionToken,\r\n Input, TemplateRef, ViewChild,\r\n ViewContainerRef, ViewEncapsulation\r\n} from \"@angular/core\";\r\nimport {CuteNavContent} from \"./nav-content.directive\";\r\nimport {CUTE_NAV, CuteNav} from \"./nav.directive\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {CdkPortal, TemplatePortal} from \"@angular/cdk/portal\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {RichThemeColor} from \"@cute-widgets/base/core\";\r\n\r\nlet nextId: number = 0;\r\n\r\n/**\r\n* Token used to provide a `CuteNavItem` to `CuteNavLink`.\r\n* Used to avoid circular imports between `CuteNavItem` and `CuteNavLink`.\r\n*/\r\nexport const CUTE_NAV_ITEM = new InjectionToken<CuteNavItem>('CUTE_NAV_ITEM');\r\n\r\n/**\r\n * The purpose of this class is to ensure that the list items in the navigation have the correct spacing in **Bootstrap** framework.\r\n */\r\n@Component({\r\n selector: 'cute-nav-item, [cute-nav-item], [cuteNavItem]',\r\n template: `\r\n <ng-content select=\"[cute-nav-link], [cuteNavLink]\"></ng-content>\r\n <ng-content select=\"[cute-nav-content], [cuteNavContent]\"></ng-content>\r\n <ng-template #staticContent>\r\n <ng-content></ng-content>\r\n </ng-template>\r\n `,\r\n exportAs: 'cuteNavItem',\r\n host: {\r\n 'class': 'cute-nav-item nav-item',\r\n '[attr.role]': 'role || null',\r\n },\r\n standalone: true,\r\n providers: [{provide: CUTE_NAV_ITEM, useExisting: CuteNavItem}],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteNavItem extends CuteLayoutControl {\r\n // DI\r\n protected _viewContainerRef = inject(ViewContainerRef);\r\n readonly nav: CuteNav = inject(CUTE_NAV);\r\n\r\n /** Nested `nav-link` element */\r\n @ContentChild(CuteNavLink, {descendants: true})\r\n readonly navLink: CuteNavLink | undefined;\r\n\r\n /** Nested <ng-template cuteNavContent> projected content */\r\n @ContentChild(CuteNavContent, {static: true})\r\n private _navContent: CuteNavContent | null = null;\r\n\r\n /** Unscoped projected content */\r\n @ViewChild('staticContent', {read: TemplateRef, static: true})\r\n private _staticContentTemplate: TemplateRef<any> | undefined;\r\n\r\n /**\r\n * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in\r\n * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.\r\n */\r\n @Input({transform: booleanAttribute})\r\n get preserveTabContent(): boolean { return this._preserveTabContent || this.nav.preserveTabContent; }\r\n set preserveTabContent(value: boolean | undefined) {\r\n this._preserveTabContent = value;\r\n }\r\n private _preserveTabContent: boolean | undefined;\r\n\r\n /** Portal that will be the hosted content of the nav */\r\n get content(): CdkPortal | null { return this._contentPortal; }\r\n private _contentPortal: CdkPortal | null = null;\r\n\r\n /**\r\n * Whether the tab/nav is currently active.\r\n */\r\n get isActive(): boolean {\r\n return this.navLink?.active || false;\r\n }\r\n\r\n /** Override the `color` setting for Tab control */\r\n override get color(): RichThemeColor|undefined { return undefined; /* super.color;*/}\r\n override set color(value: RichThemeColor|undefined) {\r\n if (this.nav.isTab()) {\r\n this.defaultColor = value;\r\n } else {\r\n super.color = value;\r\n }\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.role = this.nav.isTab() ? \"presentation\" : \"listitem\";\r\n }\r\n\r\n protected generateId(): string {\r\n // Used as a track id in the @for() loop\r\n return `cute-nav-item-${nextId++}`;\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n const contentTemplate = (this._navContent && this._navContent.template) || this._staticContentTemplate;\r\n if (contentTemplate) {\r\n this._contentPortal = new TemplatePortal(contentTemplate, this._viewContainerRef);\r\n }\r\n }\r\n\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n booleanAttribute,\r\n ContentChildren, DestroyRef,\r\n Directive, EventEmitter,\r\n HostBinding, inject,\r\n InjectionToken,\r\n Input, numberAttribute, Output,\r\n QueryList,\r\n} from \"@angular/core\";\r\nimport {FocusKeyManager, FocusOrigin, ListKeyManager} from \"@angular/cdk/a11y\";\r\nimport {Directionality} from \"@angular/cdk/bidi\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {ContentAlignment, LayoutOrientation} from \"@cute-widgets/base/core\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\n\r\n/** Navigation's presentation style */\r\nexport type CuteNavStyle = \"base\" | \"tabs\" | \"pills\" | \"underline\";\r\n/** Stretching level */\r\nexport type CuteNavStretch = \"none\"|\"fill\"|\"justified\";\r\n\r\n/**\r\n * Token used to provide a `CuteNav` to `CuteNavItem` or `CuteNavLink`.\r\n * Used to avoid circular imports between `CuteNav` and `CuteNavItem`.\r\n */\r\nexport const CUTE_NAV = new InjectionToken<CuteNav>('CUTE_NAV');\r\n\r\n/** Event emitted when the `nav-link` selection has changed. */\r\nexport class CuteNavChangeEvent extends Event {\r\n constructor(\r\n /** Index of the currently-selected link item. */\r\n readonly index: number,\r\n /** Reference to the currently-selected link item. */\r\n readonly link: CuteNavLink,\r\n /** Index of the previously-selected link item. */\r\n readonly fromIndex: number|null,\r\n /** Reference to the currently-selected link item. */\r\n readonly fromLink: CuteNavLink | null,\r\n /** How the link was focused. */\r\n readonly origin: FocusOrigin,\r\n ) {\r\n super(\"navChange\");\r\n }\r\n}\r\n\r\n/** Cancelable event emitted when the current `nav-link` selection is about to change. */\r\nexport class CuteNavChangingEvent extends Event {\r\n constructor(\r\n /** Index of the currently-selected link item. */\r\n readonly index: number,\r\n /** Reference to the currently-selected link item. */\r\n readonly link: CuteNavLink,\r\n /** Index of the previously-selected link item. */\r\n readonly fromIndex: number|null,\r\n /** Reference to the currently-selected link item. */\r\n readonly fromLink: CuteNavLink | null,\r\n /** How the link was focused. */\r\n readonly origin: FocusOrigin,\r\n ) {\r\n super(\"navChanging\", {cancelable: true});\r\n }\r\n}\r\n\r\nlet nextId: number = -1;\r\n\r\n/**\r\n * The navigation component that is built with `flexbox` and provide a strong foundation for building other types of navigation components.\r\n * It includes some style overrides (for working with lists), some _link_ padding for larger hit areas, and basic _disabled_ styling.\r\n * @example\r\n * ```html\r\n * <nav cute-nav alignment=\"center\">\r\n * <a cute-nav-link active href=\"#\">Active</a>\r\n * <a cute-nav-link href=\"#\">Link</a>\r\n * <a cute-nav-link href=\"#\">Link</a>\r\n * <a cute-nav-link disabled>Disabled</a>\r\n * </nav>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[cute-nav], [cuteNav]',\r\n exportAs: 'cuteNav',\r\n host: {\r\n 'class': 'cute-nav nav',\r\n '[class.nav-tabs]': 'isTab()',\r\n '[class.nav-pills]': 'navStyle==\"pills\"',\r\n '[class.nav-underline]': 'navStyle==\"underline\"',\r\n '[class.nav-fill]': 'stretchItems==\"fill\"',\r\n '[class.nav-justified]': 'stretchItems==\"justified\"',\r\n '[attr.aria-orientation]': 'orientation',\r\n '[attr.role]': 'role || null',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n providers: [{provide: CUTE_NAV, useExisting: CuteNav}],\r\n standalone: true,\r\n})\r\nexport class CuteNav extends CuteLayoutControl {\r\n\r\n protected _destroyRef = inject(DestroyRef);\r\n protected _dir = inject(Directionality);\r\n protected _keyManager: ListKeyManager<CuteNavLink> | undefined;\r\n\r\n private _oldFocusLink: CuteNavLink | null = null;\r\n /** To synchronize selectedIndex and keyManager.activeIndex */\r\n private _selectedIndexToChange: number | null = null;\r\n\r\n @ContentChildren(CuteNavItem, {descendants: true})\r\n readonly navItems: QueryList<CuteNavItem> | undefined;\r\n\r\n @ContentChildren(CuteNavLink, {descendants: true})\r\n protected navLinks: QueryList<CuteNavLink> | undefined;\r\n\r\n /** The type of the navigation component */\r\n @Input(\"cuteNav\") navStyle: CuteNavStyle = \"base\";\r\n\r\n /** Orientation of the navigation items */\r\n @Input()\r\n get orientation(): LayoutOrientation {return this._orientation;}\r\n set orientation(value: LayoutOrientation) {\r\n if (value !== this._orientation) {\r\n this._orientation = value;\r\n if (this._keyManager) {\r\n if (value == \"horizontal\") {\r\n this._keyManager.withHorizontalOrientation(this._dir.value);\r\n } else {\r\n this._keyManager.withVerticalOrientation(true).withPageUpDown();\r\n }\r\n this.markForCheck();\r\n }\r\n }\r\n }\r\n private _orientation: LayoutOrientation = \"horizontal\";\r\n\r\n /** The alignment of navigation items on the main flexbox' axis */\r\n @Input() alignment: ContentAlignment = \"start\";\r\n\r\n /**\r\n * Determines how the `cute-nav`'s content is stretched, such as taking up the entire available width (**none**), proportionally (**fill**) or equally (**justified**).\r\n * The width is determined by the longest `cute-nav-link`'s label. By default, stretching of items is not used (**none**).\r\n */\r\n @Input() stretchItems: CuteNavStretch = \"none\";\r\n\r\n /**\r\n * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in\r\n * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.\r\n */\r\n @Input({transform: booleanAttribute})\r\n preserveTabContent: boolean = false;\r\n\r\n /** @deprecated */\r\n @Input({transform: booleanAttribute})\r\n animation: boolean = true;\r\n\r\n /** Should the first not disabled link item be automatically selected if none were activated during initialization. */\r\n @Input({transform: booleanAttribute})\r\n autoSelect: boolean = false;\r\n\r\n /** The index of the active link item. */\r\n @Input({transform: numberAttribute})\r\n get selectedIndex(): number|null {return this._selectedIndex;}\r\n set selectedIndex(value: number) {\r\n if (value !== this._selectedIndex) {\r\n this._selectedIndexToChange = value;\r\n Promise.resolve().then(() => this.activateNavLink(value));\r\n }\r\n }\r\n private _selectedIndex: number | null = null;\r\n\r\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\r\n @Output() selectedIndexChange = new EventEmitter<number>();\r\n\r\n /** Event emitted when the `nav` selection has changed. */\r\n @Output() selectedLinkChange = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n /** Event emitted when the `nav` selection gets changing. */\r\n @Output() selectedLinkChanging = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n /** Event emitted when focus has changed within a `nav`-element. */\r\n @Output() focusChange = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n @HostBinding(\"class\")\r\n get classBinding(): string {\r\n let classList = \"justify-content-\"+this.alignment;\r\n switch (this.orientation) {\r\n case \"vertical\":\r\n if (this.breakpoint) {\r\n classList += \" flex-\"+this.breakpoint+\"-column\";\r\n } else {\r\n classList += \" flex-column\";\r\n }\r\n break;\r\n case \"horizontal\":\r\n if (this.breakpoint) {\r\n // Nav will be stacked on the lowest breakpoint, then adapt to a horizontal layout that fills the available width starting\r\n // from the small breakpoint.\r\n classList += \" flex-column flex-\"+this.breakpoint+\"-row\";\r\n }\r\n break;\r\n }\r\n return classList;\r\n }\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected generateId(): string {\r\n return `cute-nav-${++nextId}`;\r\n }\r\n\r\n /** Whether the navigation component has a `tab` presentation style. */\r\n isTab(): boolean {\r\n return this.navStyle == \"tabs\";\r\n }\r\n\r\n /**\r\n * Gets an index of the navigation link in the links array.\r\n * @param link Navigation link reference\r\n * @returns An index of the navigation link or **-1** if it was not found\r\n */\r\n getNavLinkIndex(link: CuteNavLink): number {\r\n return this.navLinks?.toArray().indexOf(link) ?? -1;\r\n }\r\n\r\n /**\r\n * Request to activate cute-nav-link element\r\n * @param linkToActivate `cute-nav-link` or its index in the links array to activate. Set _null_ for use the currently selected or first `cute-nav-link` in the list.\r\n * @param origin (optional) Tells how the element was focused (via the mouse, keyboard, touch, or programmatically). The latter is the default value.\r\n * @returns _true_ when succeeded, otherwise _false_.\r\n */\r\n activateNavLink(linkToActivate: CuteNavLink|number|null, origin: FocusOrigin = \"program\"): boolean {\r\n if (linkToActivate == null) {\r\n if (this.selectedIndex != null) {\r\n linkToActivate = this.selectedIndex;\r\n } else if (this.navLinks) {\r\n const firstEnabled = this.navLinks.find(link => !link.disabled);\r\n if (firstEnabled) {\r\n linkToActivate = firstEnabled;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (!this.navLinks || this.navLinks.length == 0) { return false; }\r\n\r\n if (typeof linkToActivate === \"number\") {\r\n const linkIndex = linkToActivate;\r\n linkToActivate = this.navLinks.get(linkIndex) ?? null;\r\n }\r\n\r\n if (!linkToActivate) { return false; }\r\n\r\n const navLink = <CuteNavLink> linkToActivate;\r\n const newIndex = this.getNavLinkIndex(navLink);\r\n\r\n if (this.selectedIndex == newIndex) {\r\n // The link has already been activated\r\n this._keyManager?.updateActiveItem(newIndex);\r\n return true;\r\n }\r\n\r\n if (newIndex >= 0 && !navLink.disabled) {\r\n const oldIndex = this._selectedIndex;\r\n const oldLink = oldIndex != null ? this.navLinks.get(oldIndex)??null : null\r\n\r\n if (oldLink) {\r\n // Check before index changing condition\r\n const event = new CuteNavChangingEvent(newIndex, navLink, oldIndex, oldLink, origin);\r\n this.selectedLinkChanging.emit( event );\r\n if (event.defaultPrevented) {\r\n return false;\r\n }\r\n }\r\n\r\n this._keyManager?.updateActiveItem(newIndex);\r\n\r\n this.navLinks.forEach(link => {\r\n link.active = false;\r\n });\r\n\r\n navLink.active = true;\r\n this._selectedIndexToChange = null;\r\n this._selectedIndex = newIndex;\r\n\r\n this._focusChanged(newIndex, \"program\");\r\n this.selectedIndexChange.emit(newIndex);\r\n this.selectedLinkChange.emit( new CuteNavChangeEvent(newIndex, navLink, oldIndex, oldLink, origin) );\r\n\r\n this.markForCheck();\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Link focus changed handler\r\n * @param link Source link\r\n * @param origin Focus origin\r\n */\r\n _focusChanged(link: CuteNavLink|number, origin: FocusOrigin): void {\r\n let linkIndex: number;\r\n if (typeof link === \"number\") {\r\n if (this.isValidLinkIndex(link)) {\r\n linkIndex = link;\r\n link = this.navLinks!.get(linkIndex)!;\r\n } else {\r\n // Error\r\n return;\r\n }\r\n } else {\r\n linkIndex = this.getNavLinkIndex(link);\r\n }\r\n if (origin && this._oldFocusLink !== link) {\r\n const oldIndex = this._oldFocusLink ? this.getNavLinkIndex(this._oldFocusLink) : null;\r\n this.focusChange.emit( new CuteNavChangeEvent(linkIndex, link, oldIndex, this._oldFocusLink, origin) );\r\n this._oldFocusLink = link;\r\n }\r\n }\r\n\r\n /** Whether the specified link index is a valid nav index. */\r\n protected isValidLinkIndex(index: number): boolean {\r\n return this.navLinks != null && (index >= 0 && index < this.navLinks.length);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent) {\r\n if (event.code == \"Space\" || event.code == \"Enter\") {\r\n if (this._keyManager\r\n && this._keyManager.activeItemIndex != null\r\n && this.selectedIndex != this._keyManager.activeItemIndex)\r\n {\r\n this.activateNavLink(this._keyManager.activeItemIndex, \"keyboard\");\r\n }\r\n event.preventDefault();\r\n } else {\r\n this._keyManager?.onKeydown(event);\r\n }\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n const tagName = this._elementRef.nativeElement.tagName;\r\n\r\n if (this.isTab() && !this.role && !(tagName.toLowerCase()===\"nav\")) {\r\n this.role = \"tablist\";\r\n }\r\n }\r\n\r\n override ngAfterContentInit() {\r\n super.ngAfterContentInit();\r\n\r\n if (this.navLinks) {\r\n this._keyManager = new FocusKeyManager(this.navLinks)\r\n .withWrap(true)\r\n .withHomeAndEnd(true)\r\n // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls\r\n .skipPredicate(() => false);\r\n\r\n if (this.orientation == \"horizontal\") {\r\n this._keyManager.withHorizontalOrientation(this._dir.value);\r\n } else {\r\n this._keyManager.withVerticalOrientation(true).withPageUpDown(true);\r\n }\r\n // Immediate activation on focus changing\r\n this._keyManager.change\r\n .pipe(takeUntilDestroyed(this._destroyRef))\r\n .subscribe(newIndex => {\r\n this._focusChanged(newIndex, \"keyboard\");\r\n });\r\n\r\n this._keyManager.tabOut\r\n .pipe(takeUntilDestroyed(this._destroyRef))\r\n .subscribe(() => {\r\n if (this.selectedIndex != null) {\r\n this._keyManager?.updateActiveItem(this.selectedIndex)\r\n }\r\n });\r\n\r\n if (this._selectedIndexToChange == null && this.autoSelect) {\r\n Promise.resolve().then(()=> this.activateNavLink(null));\r\n }\r\n }\r\n }\r\n\r\n override ngAfterViewInit() {\r\n super.ngAfterViewInit();\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n\r\n this._keyManager?.destroy();\r\n }\r\n\r\n}\r\n\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n Directive, EventEmitter, forwardRef, inject,\r\n Input, numberAttribute, OnDestroy, Output,\r\n} from \"@angular/core\";\r\nimport {CdkPortalOutlet} from \"@angular/cdk/portal\";\r\nimport {CdkScrollable} from \"@angular/cdk/overlay\";\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {Subscription} from \"rxjs\";\r\nimport {getOverallTransitionDuration} from \"@cute-widgets/base/core\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Directive({\r\n selector: '[cuteNavPaneOutlet]',\r\n exportAs: 'cuteNavPaneOutlet',\r\n inputs: ['portal: cuteNavPaneOutlet'],\r\n hostDirectives: [CdkScrollable],\r\n standalone: true,\r\n})\r\nexport class CuteNavPaneOutlet extends CdkPortalOutlet implements OnDestroy {\r\n private _pane: CuteNavPane = inject(forwardRef(() => CuteNavPane));\r\n\r\n constructor() {\r\n super();\r\n\r\n this._pane.show\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(()=> {\r\n const panePortal = this._pane.item?.content;\r\n if (panePortal && !panePortal.isAttached) {\r\n panePortal.attach(this);\r\n }\r\n });\r\n this._pane.hide\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(()=> {\r\n const item = this._pane.item;\r\n const panePortal = item?.content;\r\n if (panePortal && panePortal.isAttached) {\r\n if (!item?.preserveTabContent) {\r\n panePortal.detach();\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[cute-nav-pane], [cuteNavPane]',\r\n exportAs: 'cuteNavPane',\r\n host: {\r\n 'class': 'cute-nav-pane tab-pane',\r\n '[class.fade]': 'item.nav.animation',\r\n '[class.active]': '_active',\r\n '[class.show]': '_show',\r\n '[attr.tabindex]': '0', //'_active ? 0 : -1',\r\n '[attr.aria-labelledby]': 'ariaLabelledby || null',\r\n 'role': 'tabpanel',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteNavPane extends CuteLayoutControl {\r\n private _subs: Subscription | undefined;\r\n protected _active: boolean = false;\r\n protected _show: boolean = false;\r\n\r\n /** Pane index */\r\n @Input({transform: numberAttribute})\r\n index: number = NaN;\r\n\r\n /** Navigation item reference */\r\n @Input()\r\n item: CuteNavItem | undefined;\r\n\r\n @Output() hide = new EventEmitter<void>();\r\n @Output() show = new EventEmitter<void>();\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected generateId(): string {\r\n return \"\";\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n this.id = `${this.item?.nav.id}-pane-${this.index}`;\r\n\r\n if (this.item) {\r\n this._subs = this.item.nav.selectedLinkChange.subscribe(ev => {\r\n this._active = (ev.index === this.index);\r\n if (this._active) {\r\n this.show.emit();\r\n setTimeout(()=> {\r\n this._show = true;\r\n this.markForCheck();\r\n }, getOverallTransitionDuration(this._nativeElement));\r\n } else {\r\n this.hide.emit();\r\n this._show = false;\r\n }\r\n this.markForCheck();\r\n });\r\n }\r\n\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n\r\n if (this._subs) {\r\n this._subs.unsubscribe();\r\n }\r\n }\r\n\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n AfterViewChecked,\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport {NgFor} from \"@angular/common\";\r\nimport {PortalModule} from \"@angular/cdk/portal\";\r\nimport {CuteNav} from \"./nav.directive\";\r\nimport {CuteNavPane, CuteNavPaneOutlet} from \"./nav-pane.directive\";\r\n\r\n@Component({\r\n selector: 'cute-nav-outlet',\r\n exportAs: 'cuteNavOutlet',\r\n template: `\r\n @for (item of nav?.navItems; track item.id; let i=$index) {\r\n <div cute-nav-pane\r\n [index]=\"i\"\r\n [item]=\"item\"\r\n [color]=\"item.defaultColor\"\r\n [aria-labelledby]=\"item.navLink?.id || null\">\r\n <ng-container [cuteNavPaneOutlet]=\"null\"></ng-container>\r\n </div>\r\n }\r\n `,\r\n styles: [],\r\n host: {\r\n 'class': 'cute-nav-outlet tab-content'\r\n },\r\n imports: [PortalModule, CuteNavPane, CuteNavPaneOutlet],\r\n //providers: [CuteAnimationService]\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CuteNavOutlet /*implements AfterViewChecked*/ {\r\n\r\n @Input({alias: \"for\", required: true})\r\n get nav(): CuteNav|undefined {return this._nav;}\r\n set nav(value: CuteNav|undefined) { this._nav = value; }\r\n private _nav: CuteNav | undefined;\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {CuteNav} from \"./nav.directive\";\r\nimport {CuteNavOutlet} from \"./nav-outlet.component\";\r\nimport {CuteNavContent} from \"./nav-content.directive\";\r\nimport {CuteNavPane} from \"./nav-pane.directive\";\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteNav,\r\n CuteNavItem,\r\n CuteNavLink,\r\n CuteNavOutlet,\r\n CuteNavContent,\r\n CuteNavPane,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [CommonModule, ...TYPES],\r\n exports: [TYPES],\r\n providers: [],\r\n})\r\nexport class CuteNavModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["nextId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cute-widgets-base-core-nav.mjs","sources":["../../../../projects/cute-widgets/base/core/nav/src/nav-link.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-content.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-item.component.ts","../../../../projects/cute-widgets/base/core/nav/src/nav.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-pane.directive.ts","../../../../projects/cute-widgets/base/core/nav/src/nav-outlet.component.ts","../../../../projects/cute-widgets/base/core/nav/src/nav.module.ts","../../../../projects/cute-widgets/base/core/nav/cute-widgets-base-core-nav.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {booleanAttribute, Directive, inject, Input, NgZone, DOCUMENT} from \"@angular/core\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {CuteFocusableControl} from \"@cute-widgets/base/abstract\";\r\nimport {toThemeColor} from '@cute-widgets/base/core';\r\nimport {CUTE_NAV} from \"./nav.directive\";\r\nimport {fromEvent} from \"rxjs\";\r\n\r\nlet nextId: number = -1;\r\n\r\n/**\r\n * This class can be used to create a navigation menu, where it is applied to `<a>` elements.\r\n */\r\n@Directive({\r\n selector: `a[cute-nav-link], a[cuteNavLink],\r\n button[cute-nav-link], button[cuteNavLink]\r\n `,\r\n exportAs: 'cuteNavLink',\r\n host: {\r\n 'class': 'cute-nav-link nav-link',\r\n //'[class]': 'color ? \"link-\"+toThemeColor(color) : undefined',\r\n '[class.active]': 'active',\r\n '[class.disabled]': 'disabled',\r\n '[disabled]': 'disabled',\r\n '[attr.aria-disabled]': 'disabled',\r\n '[attr.aria-current]': 'active ? \"page\" : null',\r\n '[attr.aria-selected]': 'active || null',\r\n '[aria-controls]': 'ariaControls || getAriaControls()',\r\n '[attr.id]': 'id || null',\r\n '[attr.role]': 'role || null',\r\n '[attr.tabindex]': 'active && !disabled ? 0 : -1',\r\n '[style.--bs-btn-border-radius]': '0', // bootstrap's tab-link already stylized with radius of top angles\r\n '[style.--bs-navbar-active-color]': '!nav.isTab() ? \"var(\"+(color ? \"--bs-\"+toThemeColor(color)+\"-text-emphasis\" : \"--bs-emphasis-color\")+\")\" : undefined',\r\n '(click)': 'onClick($event)',\r\n //'(touchstart)': 'onTouchStart($event)',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteNavLink extends CuteFocusableControl {\r\n protected _document = inject(DOCUMENT);\r\n protected _ngZone = inject(NgZone);\r\n protected readonly nav = inject(CUTE_NAV, {optional: true});\r\n\r\n protected toThemeColor = toThemeColor;\r\n\r\n /** Whether the link is active. */\r\n @Input({transform: booleanAttribute})\r\n active: boolean = false;\r\n\r\n /** Explicit element identifier(s) whose content or presence are controlled by the link */\r\n @Input(\"aria-controls\")\r\n ariaControls: string | undefined;\r\n\r\n constructor() {\r\n super();\r\n\r\n this._focusMonitor.monitor(this._elementRef)\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(origin => {\r\n this._ngZone.run(() => {\r\n if (this.nav) {\r\n this.nav._focusChanged(this, origin);\r\n }\r\n });\r\n });\r\n\r\n // MouseDown event\r\n fromEvent<MouseEvent>(this._nativeElement, \"mousedown\", {capture: true})\r\n .pipe(takeUntilDestroyed())\r\n .subscribe((event) => this.onMouseDown(event));\r\n }\r\n\r\n protected generateId(): string {\r\n return `cute-nav-link-${++nextId}`;\r\n }\r\n\r\n /** Gets fallback element identifier(s) whose content or presence are controlled by the link. */\r\n protected getAriaControls(): string {\r\n if ( !(this.nav && this.nav.isTab()) ) return \"\";\r\n const index = this.nav.getNavLinkIndex(this);\r\n let ids: string = \"\";\r\n if (index >= 0) {\r\n ids = `${this.nav.id}-pane-${index}`;\r\n }\r\n return ids;\r\n }\r\n\r\n /**\r\n * MouseDown event handler in `capture` state of the event propagation.\r\n * @param event MouseEvent\r\n * @protected\r\n */\r\n protected onMouseDown(event: MouseEvent): void {\r\n if (this.nav) {\r\n if (!this.nav.activateNavLink(this, 'mouse')) {\r\n // we need to prevent default action so CSS-styles may be applied incorrectly\r\n event.stopImmediatePropagation();\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n protected onClick(event: MouseEvent): void {\r\n const elem = event.target as HTMLElement;\r\n event.preventDefault();\r\n if (elem instanceof HTMLAnchorElement && elem.hash && elem.hash.startsWith(\"#\")) {\r\n event.stopPropagation();\r\n const target = this._document.getElementById(elem.hash.substring(1));\r\n if (target) {\r\n target.scrollIntoView({behavior: \"smooth\", block: \"nearest\"});\r\n }\r\n }\r\n }\r\n\r\n protected onTouchStart(event: TouchEvent): void {\r\n if (this.nav) {\r\n this.nav.activateNavLink(this, 'touch');\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n if (this.nav?.role == \"tablist\") {\r\n this.role = \"tab\";\r\n }\r\n }\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {Directive, inject, TemplateRef} from \"@angular/core\";\r\n\r\n/**\r\n * Lazy loading content of the `cute-nav-item` element.\r\n */\r\n@Directive({\r\n selector: 'ng-template[cuteNavContent], ng-template[cute-nav-content]',\r\n exportAs: 'cuteNavContent',\r\n standalone: true,\r\n})\r\nexport class CuteNavContent /* extends ... */ {\r\n public readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n booleanAttribute, ChangeDetectionStrategy, Component,\r\n ContentChild,\r\n inject,\r\n InjectionToken,\r\n Input, TemplateRef, ViewChild,\r\n ViewContainerRef, ViewEncapsulation\r\n} from \"@angular/core\";\r\nimport {CuteNavContent} from \"./nav-content.directive\";\r\nimport {CUTE_NAV, CuteNav} from \"./nav.directive\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {CdkPortal, TemplatePortal} from \"@angular/cdk/portal\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {RichThemeColor} from \"@cute-widgets/base/core\";\r\n\r\nlet nextId: number = 0;\r\n\r\n/**\r\n* Token used to provide a `CuteNavItem` to `CuteNavLink`.\r\n* Used to avoid circular imports between `CuteNavItem` and `CuteNavLink`.\r\n*/\r\nexport const CUTE_NAV_ITEM = new InjectionToken<CuteNavItem>('CUTE_NAV_ITEM');\r\n\r\n/**\r\n * The purpose of this class is to ensure that the list items in the navigation have the correct spacing in **Bootstrap** framework.\r\n */\r\n@Component({\r\n selector: 'cute-nav-item, [cute-nav-item], [cuteNavItem]',\r\n template: `\r\n <ng-content select=\"[cute-nav-link], [cuteNavLink]\"></ng-content>\r\n <ng-content select=\"[cute-nav-content], [cuteNavContent]\"></ng-content>\r\n <ng-template #staticContent>\r\n <ng-content></ng-content>\r\n </ng-template>\r\n `,\r\n exportAs: 'cuteNavItem',\r\n host: {\r\n 'class': 'cute-nav-item nav-item',\r\n '[attr.role]': 'role || null',\r\n },\r\n standalone: true,\r\n providers: [{provide: CUTE_NAV_ITEM, useExisting: CuteNavItem}],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteNavItem extends CuteLayoutControl {\r\n // DI\r\n protected _viewContainerRef = inject(ViewContainerRef);\r\n readonly nav: CuteNav = inject(CUTE_NAV);\r\n\r\n /** Nested `nav-link` element */\r\n @ContentChild(CuteNavLink, {descendants: true})\r\n readonly navLink: CuteNavLink | undefined;\r\n\r\n /** Nested <ng-template cuteNavContent> projected content */\r\n @ContentChild(CuteNavContent, {static: true})\r\n private _navContent: CuteNavContent | null = null;\r\n\r\n /** Unscoped projected content */\r\n @ViewChild('staticContent', {read: TemplateRef, static: true})\r\n private _staticContentTemplate: TemplateRef<any> | undefined;\r\n\r\n /**\r\n * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in\r\n * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.\r\n */\r\n @Input({transform: booleanAttribute})\r\n get preserveTabContent(): boolean { return this._preserveTabContent || this.nav.preserveTabContent; }\r\n set preserveTabContent(value: boolean | undefined) {\r\n this._preserveTabContent = value;\r\n }\r\n private _preserveTabContent: boolean | undefined;\r\n\r\n /** Portal that will be the hosted content of the nav */\r\n get content(): CdkPortal | null { return this._contentPortal; }\r\n private _contentPortal: CdkPortal | null = null;\r\n\r\n /**\r\n * Whether the tab/nav is currently active.\r\n */\r\n get isActive(): boolean {\r\n return this.navLink?.active || false;\r\n }\r\n\r\n /** Override the `color` setting for Tab control */\r\n override get color(): RichThemeColor|undefined { return undefined; /* super.color;*/}\r\n override set color(value: RichThemeColor|undefined) {\r\n if (this.nav.isTab()) {\r\n this.defaultColor = value;\r\n } else {\r\n super.color = value;\r\n }\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.role = this.nav.isTab() ? \"presentation\" : \"listitem\";\r\n }\r\n\r\n protected generateId(): string {\r\n // Used as a track id in the @for() loop\r\n return `cute-nav-item-${nextId++}`;\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n const contentTemplate = (this._navContent && this._navContent.template) || this._staticContentTemplate;\r\n if (contentTemplate) {\r\n this._contentPortal = new TemplatePortal(contentTemplate, this._viewContainerRef);\r\n }\r\n }\r\n\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n booleanAttribute,\r\n ContentChildren, DestroyRef,\r\n Directive, EventEmitter,\r\n HostBinding, inject,\r\n InjectionToken,\r\n Input, numberAttribute, Output,\r\n QueryList,\r\n} from \"@angular/core\";\r\nimport {FocusKeyManager, FocusOrigin, ListKeyManager} from \"@angular/cdk/a11y\";\r\nimport {Directionality} from \"@angular/cdk/bidi\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {ContentAlignment, LayoutOrientation} from \"@cute-widgets/base/core\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\n\r\n/** Navigation's presentation style */\r\nexport type CuteNavStyle = \"base\" | \"tabs\" | \"pills\" | \"underline\";\r\n/** Stretching level */\r\nexport type CuteNavStretch = \"none\"|\"fill\"|\"justified\";\r\n\r\n/**\r\n * Token used to provide a `CuteNav` to `CuteNavItem` or `CuteNavLink`.\r\n * Used to avoid circular imports between `CuteNav` and `CuteNavItem`.\r\n */\r\nexport const CUTE_NAV = new InjectionToken<CuteNav>('CUTE_NAV');\r\n\r\n/** Event emitted when the `nav-link` selection has changed. */\r\nexport class CuteNavChangeEvent extends Event {\r\n constructor(\r\n /** Index of the currently-selected link item. */\r\n readonly index: number,\r\n /** Reference to the currently-selected link item. */\r\n readonly link: CuteNavLink,\r\n /** Index of the previously-selected link item. */\r\n readonly fromIndex: number|null,\r\n /** Reference to the currently-selected link item. */\r\n readonly fromLink: CuteNavLink | null,\r\n /** How the link was focused. */\r\n readonly origin: FocusOrigin,\r\n ) {\r\n super(\"navChange\");\r\n }\r\n}\r\n\r\n/** Cancelable event emitted when the current `nav-link` selection is about to change. */\r\nexport class CuteNavChangingEvent extends Event {\r\n constructor(\r\n /** Index of the currently-selected link item. */\r\n readonly index: number,\r\n /** Reference to the currently-selected link item. */\r\n readonly link: CuteNavLink,\r\n /** Index of the previously-selected link item. */\r\n readonly fromIndex: number|null,\r\n /** Reference to the currently-selected link item. */\r\n readonly fromLink: CuteNavLink | null,\r\n /** How the link was focused. */\r\n readonly origin: FocusOrigin,\r\n ) {\r\n super(\"navChanging\", {cancelable: true});\r\n }\r\n}\r\n\r\nlet nextId: number = -1;\r\n\r\n/**\r\n * The navigation component that is built with `flexbox` and provide a strong foundation for building other types of navigation components.\r\n * It includes some style overrides (for working with lists), some _link_ padding for larger hit areas, and basic _disabled_ styling.\r\n * @example\r\n * ```html\r\n * <nav cute-nav alignment=\"center\">\r\n * <a cute-nav-link active href=\"#\">Active</a>\r\n * <a cute-nav-link href=\"#\">Link</a>\r\n * <a cute-nav-link href=\"#\">Link</a>\r\n * <a cute-nav-link disabled>Disabled</a>\r\n * </nav>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[cute-nav], [cuteNav]',\r\n exportAs: 'cuteNav',\r\n host: {\r\n 'class': 'cute-nav nav',\r\n '[class.nav-tabs]': 'isTab()',\r\n '[class.nav-pills]': 'navStyle==\"pills\"',\r\n '[class.nav-underline]': 'navStyle==\"underline\"',\r\n '[class.nav-fill]': 'stretchItems==\"fill\"',\r\n '[class.nav-justified]': 'stretchItems==\"justified\"',\r\n '[attr.aria-orientation]': 'orientation',\r\n '[attr.role]': 'role || null',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n providers: [{provide: CUTE_NAV, useExisting: CuteNav}],\r\n standalone: true,\r\n})\r\nexport class CuteNav extends CuteLayoutControl {\r\n\r\n protected _dir = inject(Directionality);\r\n protected _keyManager: ListKeyManager<CuteNavLink> | undefined;\r\n\r\n private _oldFocusLink: CuteNavLink | null = null;\r\n /** To synchronize selectedIndex and keyManager.activeIndex */\r\n private _selectedIndexToChange: number | null = null;\r\n\r\n @ContentChildren(CuteNavItem, {descendants: true})\r\n readonly navItems: QueryList<CuteNavItem> | undefined;\r\n\r\n @ContentChildren(CuteNavLink, {descendants: true})\r\n protected navLinks: QueryList<CuteNavLink> | undefined;\r\n\r\n /** The type of the navigation component */\r\n @Input(\"cuteNav\") navStyle: CuteNavStyle = \"base\";\r\n\r\n /** Orientation of the navigation items */\r\n @Input()\r\n get orientation(): LayoutOrientation {return this._orientation;}\r\n set orientation(value: LayoutOrientation) {\r\n if (value !== this._orientation) {\r\n this._orientation = value;\r\n if (this._keyManager) {\r\n if (value == \"horizontal\") {\r\n this._keyManager.withHorizontalOrientation(this._dir.value);\r\n } else {\r\n this._keyManager.withVerticalOrientation(true).withPageUpDown();\r\n }\r\n this.markForCheck();\r\n }\r\n }\r\n }\r\n private _orientation: LayoutOrientation = \"horizontal\";\r\n\r\n /** The alignment of navigation items on the main flexbox' axis */\r\n @Input() alignment: ContentAlignment = \"start\";\r\n\r\n /**\r\n * Determines how the `cute-nav`'s content is stretched, such as taking up the entire available width (**none**), proportionally (**fill**) or equally (**justified**).\r\n * The width is determined by the longest `cute-nav-link`'s label. By default, stretching of items is not used (**none**).\r\n */\r\n @Input() stretchItems: CuteNavStretch = \"none\";\r\n\r\n /**\r\n * By default, tabs remove their content from the DOM while it's off-screen. Setting this to _true_ will keep it in\r\n * the DOM which will prevent elements like `iframes` and `videos` from reloading next time it comes back into the view.\r\n */\r\n @Input({transform: booleanAttribute})\r\n preserveTabContent: boolean = false;\r\n\r\n /** @deprecated */\r\n @Input({transform: booleanAttribute})\r\n animation: boolean = true;\r\n\r\n /** Should the first not disabled link item be automatically selected if none were activated during initialization. */\r\n @Input({transform: booleanAttribute})\r\n autoSelect: boolean = false;\r\n\r\n /** The index of the active link item. */\r\n @Input({transform: numberAttribute})\r\n get selectedIndex(): number|null {return this._selectedIndex;}\r\n set selectedIndex(value: number) {\r\n if (value !== this._selectedIndex) {\r\n this._selectedIndexToChange = value;\r\n Promise.resolve().then(() => this.activateNavLink(value));\r\n }\r\n }\r\n private _selectedIndex: number | null = null;\r\n\r\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\r\n @Output() selectedIndexChange = new EventEmitter<number>();\r\n\r\n /** Event emitted when the `nav` selection has changed. */\r\n @Output() selectedLinkChange = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n /** Event emitted when the `nav` selection gets changing. */\r\n @Output() selectedLinkChanging = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n /** Event emitted when focus has changed within a `nav`-element. */\r\n @Output() focusChange = new EventEmitter<CuteNavChangeEvent>();\r\n\r\n @HostBinding(\"class\")\r\n get classBinding(): string {\r\n let classList = \"justify-content-\"+this.alignment;\r\n switch (this.orientation) {\r\n case \"vertical\":\r\n if (this.breakpoint) {\r\n classList += \" flex-\"+this.breakpoint+\"-column\";\r\n } else {\r\n classList += \" flex-column\";\r\n }\r\n break;\r\n case \"horizontal\":\r\n if (this.breakpoint) {\r\n // Nav will be stacked on the lowest breakpoint, then adapt to a horizontal layout that fills the available width starting\r\n // from the small breakpoint.\r\n classList += \" flex-column flex-\"+this.breakpoint+\"-row\";\r\n }\r\n break;\r\n }\r\n return classList;\r\n }\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected generateId(): string {\r\n return `cute-nav-${++nextId}`;\r\n }\r\n\r\n /** Whether the navigation component has a `tab` presentation style. */\r\n isTab(): boolean {\r\n return this.navStyle == \"tabs\";\r\n }\r\n\r\n /**\r\n * Gets an index of the navigation link in the links array.\r\n * @param link Navigation link reference\r\n * @returns An index of the navigation link or **-1** if it was not found\r\n */\r\n getNavLinkIndex(link: CuteNavLink): number {\r\n return this.navLinks?.toArray().indexOf(link) ?? -1;\r\n }\r\n\r\n /**\r\n * Request to activate cute-nav-link element\r\n * @param linkToActivate `cute-nav-link` or its index in the links array to activate. Set _null_ for use the currently selected or first `cute-nav-link` in the list.\r\n * @param origin (optional) Tells how the element was focused (via the mouse, keyboard, touch, or programmatically). The latter is the default value.\r\n * @returns _true_ when succeeded, otherwise _false_.\r\n */\r\n activateNavLink(linkToActivate: CuteNavLink|number|null, origin: FocusOrigin = \"program\"): boolean {\r\n if (linkToActivate == null) {\r\n if (this.selectedIndex != null) {\r\n linkToActivate = this.selectedIndex;\r\n } else if (this.navLinks) {\r\n const firstEnabled = this.navLinks.find(link => !link.disabled);\r\n if (firstEnabled) {\r\n linkToActivate = firstEnabled;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (!this.navLinks || this.navLinks.length == 0) { return false; }\r\n\r\n if (typeof linkToActivate === \"number\") {\r\n const linkIndex = linkToActivate;\r\n linkToActivate = this.navLinks.get(linkIndex) ?? null;\r\n }\r\n\r\n if (!linkToActivate) { return false; }\r\n\r\n const navLink = <CuteNavLink> linkToActivate;\r\n const newIndex = this.getNavLinkIndex(navLink);\r\n\r\n if (this.selectedIndex == newIndex) {\r\n // The link has already been activated\r\n this._keyManager?.updateActiveItem(newIndex);\r\n return true;\r\n }\r\n\r\n if (newIndex >= 0 && !navLink.disabled) {\r\n const oldIndex = this._selectedIndex;\r\n const oldLink = oldIndex != null ? this.navLinks.get(oldIndex)??null : null\r\n\r\n if (oldLink) {\r\n // Check before index changing condition\r\n const event = new CuteNavChangingEvent(newIndex, navLink, oldIndex, oldLink, origin);\r\n this.selectedLinkChanging.emit( event );\r\n if (event.defaultPrevented) {\r\n return false;\r\n }\r\n }\r\n\r\n this._keyManager?.updateActiveItem(newIndex);\r\n\r\n this.navLinks.forEach(link => {\r\n link.active = false;\r\n });\r\n\r\n navLink.active = true;\r\n this._selectedIndexToChange = null;\r\n this._selectedIndex = newIndex;\r\n\r\n this._focusChanged(newIndex, \"program\");\r\n this.selectedIndexChange.emit(newIndex);\r\n this.selectedLinkChange.emit( new CuteNavChangeEvent(newIndex, navLink, oldIndex, oldLink, origin) );\r\n\r\n this.markForCheck();\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Link focus changed handler\r\n * @param link Source link\r\n * @param origin Focus origin\r\n */\r\n _focusChanged(link: CuteNavLink|number, origin: FocusOrigin): void {\r\n let linkIndex: number;\r\n if (typeof link === \"number\") {\r\n if (this.isValidLinkIndex(link)) {\r\n linkIndex = link;\r\n link = this.navLinks!.get(linkIndex)!;\r\n } else {\r\n // Error\r\n return;\r\n }\r\n } else {\r\n linkIndex = this.getNavLinkIndex(link);\r\n }\r\n if (origin && this._oldFocusLink !== link) {\r\n const oldIndex = this._oldFocusLink ? this.getNavLinkIndex(this._oldFocusLink) : null;\r\n this.focusChange.emit( new CuteNavChangeEvent(linkIndex, link, oldIndex, this._oldFocusLink, origin) );\r\n this._oldFocusLink = link;\r\n }\r\n }\r\n\r\n /** Whether the specified link index is a valid nav index. */\r\n protected isValidLinkIndex(index: number): boolean {\r\n return this.navLinks != null && (index >= 0 && index < this.navLinks.length);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent) {\r\n if (event.code == \"Space\" || event.code == \"Enter\") {\r\n if (this._keyManager\r\n && this._keyManager.activeItemIndex != null\r\n && this.selectedIndex != this._keyManager.activeItemIndex)\r\n {\r\n this.activateNavLink(this._keyManager.activeItemIndex, \"keyboard\");\r\n }\r\n event.preventDefault();\r\n } else {\r\n this._keyManager?.onKeydown(event);\r\n }\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n const tagName = this._elementRef.nativeElement.tagName;\r\n\r\n if (this.isTab() && !this.role && !(tagName.toLowerCase()===\"nav\")) {\r\n this.role = \"tablist\";\r\n }\r\n }\r\n\r\n override ngAfterContentInit() {\r\n super.ngAfterContentInit();\r\n\r\n if (this.navLinks) {\r\n this._keyManager = new FocusKeyManager(this.navLinks)\r\n .withWrap(true)\r\n .withHomeAndEnd(true)\r\n // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls\r\n .skipPredicate(() => false);\r\n\r\n if (this.orientation == \"horizontal\") {\r\n this._keyManager.withHorizontalOrientation(this._dir.value);\r\n } else {\r\n this._keyManager.withVerticalOrientation(true).withPageUpDown(true);\r\n }\r\n // Immediate activation on focus changing\r\n this._keyManager.change\r\n .pipe(takeUntilDestroyed(this._destroyRef))\r\n .subscribe(newIndex => {\r\n this._focusChanged(newIndex, \"keyboard\");\r\n });\r\n\r\n this._keyManager.tabOut\r\n .pipe(takeUntilDestroyed(this._destroyRef))\r\n .subscribe(() => {\r\n if (this.selectedIndex != null) {\r\n this._keyManager?.updateActiveItem(this.selectedIndex)\r\n }\r\n });\r\n\r\n if (this._selectedIndexToChange == null && this.autoSelect) {\r\n Promise.resolve().then(()=> this.activateNavLink(null));\r\n }\r\n }\r\n }\r\n\r\n override ngAfterViewInit() {\r\n super.ngAfterViewInit();\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n\r\n this._keyManager?.destroy();\r\n }\r\n\r\n}\r\n\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n Directive, EventEmitter, forwardRef, inject,\r\n Input, numberAttribute, OnDestroy, Output,\r\n} from \"@angular/core\";\r\nimport {CdkPortalOutlet} from \"@angular/cdk/portal\";\r\nimport {CdkScrollable} from \"@angular/cdk/overlay\";\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\nimport {CuteLayoutControl} from \"@cute-widgets/base/abstract\";\r\nimport {Subscription} from \"rxjs\";\r\nimport {getOverallTransitionDuration} from \"@cute-widgets/base/core\";\r\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\r\n\r\n@Directive({\r\n selector: '[cuteNavPaneOutlet]',\r\n exportAs: 'cuteNavPaneOutlet',\r\n inputs: ['portal: cuteNavPaneOutlet'],\r\n hostDirectives: [CdkScrollable],\r\n standalone: true,\r\n})\r\nexport class CuteNavPaneOutlet extends CdkPortalOutlet implements OnDestroy {\r\n private _pane: CuteNavPane = inject(forwardRef(() => CuteNavPane));\r\n\r\n constructor() {\r\n super();\r\n\r\n this._pane.show\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(()=> {\r\n const panePortal = this._pane.item?.content;\r\n if (panePortal && !panePortal.isAttached) {\r\n panePortal.attach(this);\r\n }\r\n });\r\n this._pane.hide\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(()=> {\r\n const item = this._pane.item;\r\n const panePortal = item?.content;\r\n if (panePortal && panePortal.isAttached) {\r\n if (!item?.preserveTabContent) {\r\n panePortal.detach();\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[cute-nav-pane], [cuteNavPane]',\r\n exportAs: 'cuteNavPane',\r\n host: {\r\n 'class': 'cute-nav-pane tab-pane',\r\n '[class.fade]': 'item.nav.animation',\r\n '[class.active]': '_active',\r\n '[class.show]': '_show',\r\n '[attr.tabindex]': '0', //'_active ? 0 : -1',\r\n '[attr.aria-labelledby]': 'ariaLabelledby || null',\r\n 'role': 'tabpanel',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteNavPane extends CuteLayoutControl {\r\n private _subs: Subscription | undefined;\r\n protected _active: boolean = false;\r\n protected _show: boolean = false;\r\n\r\n /** Pane index */\r\n @Input({transform: numberAttribute})\r\n index: number = NaN;\r\n\r\n /** Navigation item reference */\r\n @Input()\r\n item: CuteNavItem | undefined;\r\n\r\n @Output() hide = new EventEmitter<void>();\r\n @Output() show = new EventEmitter<void>();\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected generateId(): string {\r\n return \"\";\r\n }\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n\r\n this.id = `${this.item?.nav.id}-pane-${this.index}`;\r\n\r\n if (this.item) {\r\n this._subs = this.item.nav.selectedLinkChange.subscribe(ev => {\r\n this._active = (ev.index === this.index);\r\n if (this._active) {\r\n this.show.emit();\r\n setTimeout(()=> {\r\n this._show = true;\r\n this.markForCheck();\r\n }, getOverallTransitionDuration(this._nativeElement));\r\n } else {\r\n this.hide.emit();\r\n this._show = false;\r\n }\r\n this.markForCheck();\r\n });\r\n }\r\n\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n\r\n if (this._subs) {\r\n this._subs.unsubscribe();\r\n }\r\n }\r\n\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {\r\n AfterViewChecked,\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n ViewEncapsulation,\r\n} from \"@angular/core\";\r\nimport {NgFor} from \"@angular/common\";\r\nimport {PortalModule} from \"@angular/cdk/portal\";\r\nimport {CuteNav} from \"./nav.directive\";\r\nimport {CuteNavPane, CuteNavPaneOutlet} from \"./nav-pane.directive\";\r\n\r\n@Component({\r\n selector: 'cute-nav-outlet',\r\n exportAs: 'cuteNavOutlet',\r\n template: `\r\n @for (item of nav?.navItems; track item.id; let i=$index) {\r\n <div cute-nav-pane\r\n [index]=\"i\"\r\n [item]=\"item\"\r\n [color]=\"item.defaultColor\"\r\n [aria-labelledby]=\"item.navLink?.id || null\">\r\n <ng-container [cuteNavPaneOutlet]=\"null\"></ng-container>\r\n </div>\r\n }\r\n `,\r\n styles: [],\r\n host: {\r\n 'class': 'cute-nav-outlet tab-content'\r\n },\r\n imports: [PortalModule, CuteNavPane, CuteNavPaneOutlet],\r\n //providers: [CuteAnimationService]\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CuteNavOutlet /*implements AfterViewChecked*/ {\r\n\r\n @Input({alias: \"for\", required: true})\r\n get nav(): CuteNav|undefined {return this._nav;}\r\n set nav(value: CuteNav|undefined) { this._nav = value; }\r\n private _nav: CuteNav | undefined;\r\n}\r\n","/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\nimport {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteNavItem} from \"./nav-item.component\";\r\nimport {CuteNavLink} from \"./nav-link.directive\";\r\nimport {CuteNav} from \"./nav.directive\";\r\nimport {CuteNavOutlet} from \"./nav-outlet.component\";\r\nimport {CuteNavContent} from \"./nav-content.directive\";\r\nimport {CuteNavPane} from \"./nav-pane.directive\";\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteNav,\r\n CuteNavItem,\r\n CuteNavLink,\r\n CuteNavOutlet,\r\n CuteNavContent,\r\n CuteNavPane,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [CommonModule, ...TYPES],\r\n exports: [TYPES],\r\n providers: [],\r\n})\r\nexport class CuteNavModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["nextId"],"mappings":"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"}
|
|
@@ -117,7 +117,7 @@ function toBgCssClass(color) {
|
|
|
117
117
|
if (isExtendedColor(richThemeColor)) {
|
|
118
118
|
themeColor = getBaseColor(richThemeColor);
|
|
119
119
|
if (richThemeColor.endsWith("-emphasis")) {
|
|
120
|
-
return `bg-${themeColor}-subtle`;
|
|
120
|
+
return `bg-${themeColor}-subtle text-${themeColor}-emphasis`;
|
|
121
121
|
}
|
|
122
122
|
// contrast
|
|
123
123
|
return `text-bg-${themeColor}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cute-widgets-base-core-theming.mjs","sources":["../../../../projects/cute-widgets/base/core/theming/src/ThemeColor.ts","../../../../projects/cute-widgets/base/core/theming/src/theme.service.ts","../../../../projects/cute-widgets/base/core/theming/cute-widgets-base-core-theming.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\n/**\r\n * `CuteWidgets` supports standard Bootstrap 5 theme colors - `ThemeColor` type. But to account\r\n * miscellaneous use cases of usage this colors in components CuteWidgets add extended definition of\r\n * latter - `RichThemeColor`. Rich color is the standard color name plus \"-emphasis\" or \"-contrast\" suffix at the end.\r\n * Depending on the context of applying color, the result CSS-class can be `.text-*`, `.text-bg-*` or ended with\r\n * `-emphasis` or `-subtle` suffixes.\r\n */\r\nimport {Directive, InjectionToken, Input, input} from \"@angular/core\";\r\n\r\n/** Bootstrap theme colors */\r\nconst Palette = [\"primary\",\"secondary\",\"success\",\"danger\",\"warning\",\"info\",\"light\",\"dark\",\"link\",\"tertiary\"] as const;\r\n\r\n/** Bootstrap’s base color palette. */\r\nexport type ThemeColor = typeof Palette[number];\r\n/** Rich color palette is based on the standard Bootstrap palette but has additional shades. */\r\nexport type RichThemeColor = ThemeColor | `${ThemeColor}-emphasis` | `${ThemeColor}-contrast`;\r\n\r\n/** Alias for `ThemeColor` type. */\r\nexport type ThemePalette = ThemeColor;\r\n/** Alias for `ThemeColor` type. */\r\nexport type RichThemePalette = RichThemeColor;\r\n\r\n/**\r\n * Whether a string is a valid theme color name\r\n * @param str Text case-sensitive value\r\n * @returns _true_ if `str` is a valid color name, otherwise _false_\r\n */\r\nexport function isThemeColor(str: string|undefined|null): str is ThemeColor {\r\n if (str) {\r\n return Palette.indexOf(str as any) !== -1;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Whether a string is a valid rich or base theme color name.\r\n * @param str Case-sensitive text value of the color name.\r\n * @returns _true_ if `str` is a valid rich color name, otherwise _false_.\r\n */\r\nexport function isRichThemeColor(str: string|undefined|null): str is RichThemeColor {\r\n if (str) {\r\n if (isExtendedColor(str)) {\r\n str = getBaseColor(str as RichThemeColor);\r\n }\r\n return isThemeColor(str);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Transforms a string to `ThemeColor` type.\r\n * @param color Color value to transform\r\n * @returns _ThemeColor_'s value or _undefined_, if the `color` has an invalid value.\r\n */\r\nexport function toThemeColor(color: string|undefined|null): ThemeColor|undefined {\r\n if (typeof color===\"string\") {\r\n color = color.trim().toLowerCase();\r\n if (isExtendedColor(color)) {\r\n color = getBaseColor(color as RichThemeColor);\r\n }\r\n if (isThemeColor(color)) {\r\n return color;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * To `_RichThemeColor_` transformer function.\r\n * @param color Color value to transform into rich color type.\r\n * @returns _RichThemeColor_ value or _undefined_ if `color` is invalid.\r\n */\r\nexport function toRichThemeColor(color: string|undefined|null): RichThemeColor|undefined {\r\n if (typeof color===\"string\") {\r\n color = color.trim().toLowerCase();\r\n if (isRichThemeColor(color)) {\r\n return color;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.text-*` CSS class.\r\n * @param color Color palette to transform into CSS-class.\r\n */\r\nexport function toTextCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n // Bootstrap 5 has no \".text-tertiary-*\" classes, so we return following\r\n return \"text-body-tertiary\";\r\n }\r\n\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n if (richThemeColor.endsWith(\"-emphasis\")) {\r\n return `text-${themeColor}-emphasis`;\r\n }\r\n // contrast\r\n return `text-bg-${themeColor}`;\r\n }\r\n themeColor = richThemeColor as ThemeColor;\r\n return `text-${themeColor}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.bg-*` or `.text-bg-*` CSS class name.\r\n * @param color Value to transform into CSS-class.\r\n */\r\nexport function toBgCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n // Bootstrap 5 has no 'tertiary-subtle'/'bg-tertiary' classes, so we return following\r\n return \"bg-body-tertiary\";\r\n }\r\n\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n if (richThemeColor.endsWith(\"-emphasis\")) {\r\n return `bg-${themeColor}-subtle`;\r\n }\r\n // contrast\r\n return `text-bg-${themeColor}`;\r\n }\r\n\r\n themeColor = richThemeColor as ThemeColor;\r\n // Simple background\r\n return `bg-${themeColor}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Set a background color with contrasting foreground color.\r\n * @param color Color palette to transform into CSS-class.\r\n * @returns A valid Bootstrap's `.text-bg-*` CSS-class\r\n */\r\nexport function toTextBgCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n return \"text-body-tertiary\";\r\n }\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n } else {\r\n themeColor = richThemeColor as ThemeColor;\r\n }\r\n return \"text-bg-\"+themeColor;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.text-*` or `.text-bg-*` CSS class.\r\n * @param color Color value to transform into CSS-class.\r\n */\r\nexport function toColorCssClass(color: string|undefined|null): string {\r\n if (color) {\r\n if (color.endsWith(\"-contrast\")) {\r\n return toTextBgCssClass(color);\r\n }\r\n return toTextCssClass(color);\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Extracts `ThemeColor` from the `RichThemeColor`.\r\n * @param color Rich color\r\n * @returns Base theme color.\r\n * @internal\r\n */\r\nfunction getBaseColor(color: RichThemeColor): ThemeColor {\r\n let dashPos = color.indexOf(\"-\");\r\n if (dashPos >= 0) {\r\n return color.slice(0, dashPos) as ThemeColor;\r\n }\r\n return color as ThemeColor;\r\n}\r\n\r\n/** Whether the specified color is extended counterpart of the standard palette color. */\r\nfunction isExtendedColor(color: string): boolean {\r\n return color.endsWith(\"-emphasis\") || color.endsWith(\"-contrast\");\r\n}\r\n\r\n\r\nexport const CUTE_THEME_COLOR = new InjectionToken<CuteThemeColor>(\"CUTE_THEME_COLOR\");\r\n\r\n@Directive({\r\n selector: '[cuteThemeColor]',\r\n exportAs: 'cuteThemeColor',\r\n host: {},\r\n providers: [{provide: CUTE_THEME_COLOR, useExisting: CuteThemeColor}],\r\n})\r\nexport class CuteThemeColor /* extends ... */ {\r\n\r\n @Input(\"cuteThemeColor\")\r\n color: RichThemeColor | undefined;\r\n\r\n colorClass(): string {\r\n return toColorCssClass(this.color);\r\n }\r\n\r\n bgClass(): string {\r\n return toBgCssClass(this.color);\r\n }\r\n\r\n textBgClass(): string {\r\n return toTextBgCssClass(this.color);\r\n }\r\n\r\n}\r\n","import {DOCUMENT, inject, Injectable, OnDestroy} from '@angular/core';\r\nimport {fromEvent, Subject} from 'rxjs';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {MediaMatcher} from '@angular/cdk/layout';\r\n\r\nconst PREFERS_COLOR_SCHEME = '(prefers-color-scheme: dark)';\r\nconst THEME_ATTR_NAME = \"data-bs-theme\";\r\n\r\nexport type CuteTheme = \"light\" | \"dark\" | \"auto\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class CuteThemeService implements OnDestroy {\r\n private _document = inject(DOCUMENT);\r\n private _mediaQueryList: MediaQueryList;\r\n private _mediaChange = new Subject<MediaQueryListEvent>();\r\n\r\n /** Observable that can be used to receive `MediaMatcher`'s _change_ event. */\r\n readonly change = this._mediaChange.asObservable();\r\n\r\n constructor() {\r\n const mediaMatcher = inject(MediaMatcher);\r\n this._mediaQueryList = mediaMatcher.matchMedia(PREFERS_COLOR_SCHEME);\r\n\r\n fromEvent<MediaQueryListEvent>(this._mediaQueryList, \"change\")\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(event => {\r\n const storedTheme = this.getStoredTheme();\r\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\r\n this.setTheme( this.getPreferredTheme(), false );\r\n }\r\n this._mediaChange.next(event);\r\n });\r\n\r\n fromEvent(window, \"DOMContentLoaded\")\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => {\r\n this.setTheme( this.getPreferredTheme() );\r\n });\r\n }\r\n\r\n private getStoredTheme(): CuteTheme|null {\r\n const theme = localStorage.getItem('theme');\r\n if (theme && [\"light\",\"dark\",\"auto\"].includes(theme)) {\r\n return theme as CuteTheme;\r\n }\r\n return null;\r\n }\r\n\r\n private setStoredTheme(theme: CuteTheme): void{\r\n return localStorage.setItem('theme', theme);\r\n }\r\n\r\n /** Returns the user's preferred color mode. */\r\n getPreferredTheme(): CuteTheme {\r\n const storedTheme = this.getStoredTheme();\r\n if (storedTheme) {\r\n return storedTheme;\r\n }\r\n\r\n return this.getCurrentTheme();\r\n }\r\n\r\n /** Returns the browser's color theme. */\r\n getCurrentTheme(): CuteTheme {\r\n return this._mediaQueryList.matches ? 'dark' : 'light';\r\n }\r\n\r\n /** Whether is the dark theme currently selected. */\r\n isDarkTheme(): boolean {\r\n return this.getTheme() == \"dark\";\r\n }\r\n\r\n /** Whether is the light theme currently selected. */\r\n isLightTheme(): boolean {\r\n return !this.isDarkTheme();\r\n }\r\n\r\n /** Returns the Bootstrap's color theme. */\r\n getTheme(): Omit<CuteTheme, \"auto\"> {\r\n const docElem = this._document.documentElement;\r\n let attrValue = docElem.getAttribute(THEME_ATTR_NAME);\r\n if (attrValue == null) {\r\n attrValue = this.getCurrentTheme();\r\n }\r\n return attrValue;\r\n }\r\n\r\n /**\r\n * Changes the default color mode (theme) of all pages in the website with the opportunity of auto-detection.\r\n * @param theme Desired color theme.\r\n * @param emitEvent Emulate event emitting. Default is _true_.\r\n */\r\n setTheme(theme: CuteTheme, emitEvent: boolean = true): void {\r\n const docElem = this._document.documentElement;\r\n let matches: boolean;\r\n if (theme === 'auto') {\r\n matches = this._mediaQueryList.matches;\r\n docElem.setAttribute(THEME_ATTR_NAME, (matches ? 'dark' : 'light'));\r\n } else {\r\n matches = (theme === \"dark\");\r\n docElem.setAttribute(THEME_ATTR_NAME, theme);\r\n }\r\n this.setStoredTheme(theme);\r\n if (emitEvent) {\r\n // dispatch artificial (not trusted) change event\r\n this._mediaQueryList.dispatchEvent( new MediaQueryListEvent(\"change\", {matches, media: this._mediaQueryList.media}) );\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._mediaChange.complete();\r\n }\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cute-widgets-base-core-theming.mjs","sources":["../../../../projects/cute-widgets/base/core/theming/src/ThemeColor.ts","../../../../projects/cute-widgets/base/core/theming/src/theme.service.ts","../../../../projects/cute-widgets/base/core/theming/cute-widgets-base-core-theming.ts"],"sourcesContent":["/**\r\n * @license Apache-2.0\r\n *\r\n * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.\r\n *\r\n * You may not use this file except in compliance with the License\r\n * that can be found at http://www.apache.org/licenses/LICENSE-2.0\r\n */\r\n\r\n/**\r\n * `CuteWidgets` supports standard Bootstrap 5 theme colors - `ThemeColor` type. But to account\r\n * miscellaneous use cases of usage this colors in components CuteWidgets add extended definition of\r\n * latter - `RichThemeColor`. Rich color is the standard color name plus \"-emphasis\" or \"-contrast\" suffix at the end.\r\n * Depending on the context of applying color, the result CSS-class can be `.text-*`, `.text-bg-*` or ended with\r\n * `-emphasis` or `-subtle` suffixes.\r\n */\r\nimport {Directive, InjectionToken, Input, input} from \"@angular/core\";\r\n\r\n/** Bootstrap theme colors */\r\nconst Palette = [\"primary\",\"secondary\",\"success\",\"danger\",\"warning\",\"info\",\"light\",\"dark\",\"link\",\"tertiary\"] as const;\r\n\r\n/** Bootstrap’s base color palette. */\r\nexport type ThemeColor = typeof Palette[number];\r\n/** Rich color palette is based on the standard Bootstrap palette but has additional shades. */\r\nexport type RichThemeColor = ThemeColor | `${ThemeColor}-emphasis` | `${ThemeColor}-contrast`;\r\n\r\n/** Alias for `ThemeColor` type. */\r\nexport type ThemePalette = ThemeColor;\r\n/** Alias for `ThemeColor` type. */\r\nexport type RichThemePalette = RichThemeColor;\r\n\r\n/**\r\n * Whether a string is a valid theme color name\r\n * @param str Text case-sensitive value\r\n * @returns _true_ if `str` is a valid color name, otherwise _false_\r\n */\r\nexport function isThemeColor(str: string|undefined|null): str is ThemeColor {\r\n if (str) {\r\n return Palette.indexOf(str as any) !== -1;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Whether a string is a valid rich or base theme color name.\r\n * @param str Case-sensitive text value of the color name.\r\n * @returns _true_ if `str` is a valid rich color name, otherwise _false_.\r\n */\r\nexport function isRichThemeColor(str: string|undefined|null): str is RichThemeColor {\r\n if (str) {\r\n if (isExtendedColor(str)) {\r\n str = getBaseColor(str as RichThemeColor);\r\n }\r\n return isThemeColor(str);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Transforms a string to `ThemeColor` type.\r\n * @param color Color value to transform\r\n * @returns _ThemeColor_'s value or _undefined_, if the `color` has an invalid value.\r\n */\r\nexport function toThemeColor(color: string|undefined|null): ThemeColor|undefined {\r\n if (typeof color===\"string\") {\r\n color = color.trim().toLowerCase();\r\n if (isExtendedColor(color)) {\r\n color = getBaseColor(color as RichThemeColor);\r\n }\r\n if (isThemeColor(color)) {\r\n return color;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * To `_RichThemeColor_` transformer function.\r\n * @param color Color value to transform into rich color type.\r\n * @returns _RichThemeColor_ value or _undefined_ if `color` is invalid.\r\n */\r\nexport function toRichThemeColor(color: string|undefined|null): RichThemeColor|undefined {\r\n if (typeof color===\"string\") {\r\n color = color.trim().toLowerCase();\r\n if (isRichThemeColor(color)) {\r\n return color;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.text-*` CSS class.\r\n * @param color Color palette to transform into CSS-class.\r\n */\r\nexport function toTextCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n // Bootstrap 5 has no \".text-tertiary-*\" classes, so we return following\r\n return \"text-body-tertiary\";\r\n }\r\n\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n if (richThemeColor.endsWith(\"-emphasis\")) {\r\n return `text-${themeColor}-emphasis`;\r\n }\r\n // contrast\r\n return `text-bg-${themeColor}`;\r\n }\r\n themeColor = richThemeColor as ThemeColor;\r\n return `text-${themeColor}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.bg-*` or `.text-bg-*` CSS class name.\r\n * @param color Value to transform into CSS-class.\r\n */\r\nexport function toBgCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n // Bootstrap 5 has no 'tertiary-subtle'/'bg-tertiary' classes, so we return following\r\n return \"bg-body-tertiary\";\r\n }\r\n\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n if (richThemeColor.endsWith(\"-emphasis\")) {\r\n return `bg-${themeColor}-subtle text-${themeColor}-emphasis`;\r\n }\r\n // contrast\r\n return `text-bg-${themeColor}`;\r\n }\r\n\r\n themeColor = richThemeColor as ThemeColor;\r\n // Simple background\r\n return `bg-${themeColor}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Set a background color with contrasting foreground color.\r\n * @param color Color palette to transform into CSS-class.\r\n * @returns A valid Bootstrap's `.text-bg-*` CSS-class\r\n */\r\nexport function toTextBgCssClass(color: string|undefined|null): string {\r\n const richThemeColor: RichThemeColor|undefined = toRichThemeColor(color);\r\n if (richThemeColor) {\r\n if (richThemeColor.startsWith(\"tertiary\")) {\r\n return \"text-body-tertiary\";\r\n }\r\n let themeColor: ThemeColor;\r\n if (isExtendedColor(richThemeColor)) {\r\n themeColor = getBaseColor(richThemeColor);\r\n } else {\r\n themeColor = richThemeColor as ThemeColor;\r\n }\r\n return \"text-bg-\"+themeColor;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Returns a valid Bootstrap's `.text-*` or `.text-bg-*` CSS class.\r\n * @param color Color value to transform into CSS-class.\r\n */\r\nexport function toColorCssClass(color: string|undefined|null): string {\r\n if (color) {\r\n if (color.endsWith(\"-contrast\")) {\r\n return toTextBgCssClass(color);\r\n }\r\n return toTextCssClass(color);\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Extracts `ThemeColor` from the `RichThemeColor`.\r\n * @param color Rich color\r\n * @returns Base theme color.\r\n * @internal\r\n */\r\nfunction getBaseColor(color: RichThemeColor): ThemeColor {\r\n let dashPos = color.indexOf(\"-\");\r\n if (dashPos >= 0) {\r\n return color.slice(0, dashPos) as ThemeColor;\r\n }\r\n return color as ThemeColor;\r\n}\r\n\r\n/** Whether the specified color is extended counterpart of the standard palette color. */\r\nfunction isExtendedColor(color: string): boolean {\r\n return color.endsWith(\"-emphasis\") || color.endsWith(\"-contrast\");\r\n}\r\n\r\n\r\nexport const CUTE_THEME_COLOR = new InjectionToken<CuteThemeColor>(\"CUTE_THEME_COLOR\");\r\n\r\n@Directive({\r\n selector: '[cuteThemeColor]',\r\n exportAs: 'cuteThemeColor',\r\n host: {},\r\n providers: [{provide: CUTE_THEME_COLOR, useExisting: CuteThemeColor}],\r\n})\r\nexport class CuteThemeColor /* extends ... */ {\r\n\r\n @Input(\"cuteThemeColor\")\r\n color: RichThemeColor | undefined;\r\n\r\n colorClass(): string {\r\n return toColorCssClass(this.color);\r\n }\r\n\r\n bgClass(): string {\r\n return toBgCssClass(this.color);\r\n }\r\n\r\n textBgClass(): string {\r\n return toTextBgCssClass(this.color);\r\n }\r\n\r\n}\r\n","import {DOCUMENT, inject, Injectable, OnDestroy} from '@angular/core';\r\nimport {fromEvent, Subject} from 'rxjs';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\nimport {MediaMatcher} from '@angular/cdk/layout';\r\n\r\nconst PREFERS_COLOR_SCHEME = '(prefers-color-scheme: dark)';\r\nconst THEME_ATTR_NAME = \"data-bs-theme\";\r\n\r\nexport type CuteTheme = \"light\" | \"dark\" | \"auto\";\r\n\r\n@Injectable({\r\n providedIn: \"root\"\r\n})\r\nexport class CuteThemeService implements OnDestroy {\r\n private _document = inject(DOCUMENT);\r\n private _mediaQueryList: MediaQueryList;\r\n private _mediaChange = new Subject<MediaQueryListEvent>();\r\n\r\n /** Observable that can be used to receive `MediaMatcher`'s _change_ event. */\r\n readonly change = this._mediaChange.asObservable();\r\n\r\n constructor() {\r\n const mediaMatcher = inject(MediaMatcher);\r\n this._mediaQueryList = mediaMatcher.matchMedia(PREFERS_COLOR_SCHEME);\r\n\r\n fromEvent<MediaQueryListEvent>(this._mediaQueryList, \"change\")\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(event => {\r\n const storedTheme = this.getStoredTheme();\r\n if (storedTheme !== 'light' && storedTheme !== 'dark') {\r\n this.setTheme( this.getPreferredTheme(), false );\r\n }\r\n this._mediaChange.next(event);\r\n });\r\n\r\n fromEvent(window, \"DOMContentLoaded\")\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(() => {\r\n this.setTheme( this.getPreferredTheme() );\r\n });\r\n }\r\n\r\n private getStoredTheme(): CuteTheme|null {\r\n const theme = localStorage.getItem('theme');\r\n if (theme && [\"light\",\"dark\",\"auto\"].includes(theme)) {\r\n return theme as CuteTheme;\r\n }\r\n return null;\r\n }\r\n\r\n private setStoredTheme(theme: CuteTheme): void{\r\n return localStorage.setItem('theme', theme);\r\n }\r\n\r\n /** Returns the user's preferred color mode. */\r\n getPreferredTheme(): CuteTheme {\r\n const storedTheme = this.getStoredTheme();\r\n if (storedTheme) {\r\n return storedTheme;\r\n }\r\n\r\n return this.getCurrentTheme();\r\n }\r\n\r\n /** Returns the browser's color theme. */\r\n getCurrentTheme(): CuteTheme {\r\n return this._mediaQueryList.matches ? 'dark' : 'light';\r\n }\r\n\r\n /** Whether is the dark theme currently selected. */\r\n isDarkTheme(): boolean {\r\n return this.getTheme() == \"dark\";\r\n }\r\n\r\n /** Whether is the light theme currently selected. */\r\n isLightTheme(): boolean {\r\n return !this.isDarkTheme();\r\n }\r\n\r\n /** Returns the Bootstrap's color theme. */\r\n getTheme(): Omit<CuteTheme, \"auto\"> {\r\n const docElem = this._document.documentElement;\r\n let attrValue = docElem.getAttribute(THEME_ATTR_NAME);\r\n if (attrValue == null) {\r\n attrValue = this.getCurrentTheme();\r\n }\r\n return attrValue;\r\n }\r\n\r\n /**\r\n * Changes the default color mode (theme) of all pages in the website with the opportunity of auto-detection.\r\n * @param theme Desired color theme.\r\n * @param emitEvent Emulate event emitting. Default is _true_.\r\n */\r\n setTheme(theme: CuteTheme, emitEvent: boolean = true): void {\r\n const docElem = this._document.documentElement;\r\n let matches: boolean;\r\n if (theme === 'auto') {\r\n matches = this._mediaQueryList.matches;\r\n docElem.setAttribute(THEME_ATTR_NAME, (matches ? 'dark' : 'light'));\r\n } else {\r\n matches = (theme === \"dark\");\r\n docElem.setAttribute(THEME_ATTR_NAME, theme);\r\n }\r\n this.setStoredTheme(theme);\r\n if (emitEvent) {\r\n // dispatch artificial (not trusted) change event\r\n this._mediaQueryList.dispatchEvent( new MediaQueryListEvent(\"change\", {matches, media: this._mediaQueryList.media}) );\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._mediaChange.complete();\r\n }\r\n\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|