@cute-widgets/base 20.0.4 → 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.
Files changed (39) hide show
  1. package/CHANGELOG.md +11 -6
  2. package/abstract/index.d.ts +8 -2
  3. package/button/index.d.ts +44 -22
  4. package/button-toggle/index.d.ts +8 -4
  5. package/collapse/index.d.ts +49 -48
  6. package/core/index.d.ts +7 -1
  7. package/core/layout/index.d.ts +7 -1
  8. package/dialog/index.d.ts +81 -57
  9. package/fesm2022/cute-widgets-base-abstract.mjs +4 -14
  10. package/fesm2022/cute-widgets-base-abstract.mjs.map +1 -1
  11. package/fesm2022/cute-widgets-base-button-toggle.mjs +36 -29
  12. package/fesm2022/cute-widgets-base-button-toggle.mjs.map +1 -1
  13. package/fesm2022/cute-widgets-base-button.mjs +163 -99
  14. package/fesm2022/cute-widgets-base-button.mjs.map +1 -1
  15. package/fesm2022/cute-widgets-base-chips.mjs +0 -12
  16. package/fesm2022/cute-widgets-base-chips.mjs.map +1 -1
  17. package/fesm2022/cute-widgets-base-collapse.mjs +114 -126
  18. package/fesm2022/cute-widgets-base-collapse.mjs.map +1 -1
  19. package/fesm2022/cute-widgets-base-core-layout.mjs +13 -1
  20. package/fesm2022/cute-widgets-base-core-layout.mjs.map +1 -1
  21. package/fesm2022/cute-widgets-base-core-theming.mjs +1 -1
  22. package/fesm2022/cute-widgets-base-core-theming.mjs.map +1 -1
  23. package/fesm2022/cute-widgets-base-core.mjs +14 -2
  24. package/fesm2022/cute-widgets-base-core.mjs.map +1 -1
  25. package/fesm2022/cute-widgets-base-dialog.mjs +152 -117
  26. package/fesm2022/cute-widgets-base-dialog.mjs.map +1 -1
  27. package/fesm2022/cute-widgets-base-menu.mjs +5 -27
  28. package/fesm2022/cute-widgets-base-menu.mjs.map +1 -1
  29. package/fesm2022/cute-widgets-base-navbar.mjs +82 -42
  30. package/fesm2022/cute-widgets-base-navbar.mjs.map +1 -1
  31. package/fesm2022/cute-widgets-base-paginator.mjs +4 -4
  32. package/fesm2022/cute-widgets-base-paginator.mjs.map +1 -1
  33. package/fesm2022/cute-widgets-base-tabs.mjs +86 -61
  34. package/fesm2022/cute-widgets-base-tabs.mjs.map +1 -1
  35. package/fesm2022/cute-widgets-base.mjs +1 -1
  36. package/navbar/index.d.ts +24 -9
  37. package/package.json +13 -13
  38. package/paginator/index.d.ts +2 -2
  39. package/tabs/index.d.ts +35 -14
@@ -1,51 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, EventEmitter, booleanAttribute, Output, Input, ChangeDetectionStrategy, ViewEncapsulation, Component, Directive, NgModule } from '@angular/core';
3
- import { CuteBaseControl } from '@cute-widgets/base/abstract';
4
- import { trigger, state, transition, style, animate } from '@angular/animations';
5
- import { Subject } from 'rxjs';
6
- import { distinctUntilChanged } from 'rxjs/operators';
2
+ import { inject, NgZone, EventEmitter, booleanAttribute, Output, Input, Directive, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/cdk/accordion';
4
+ import { CdkAccordionItem } from '@angular/cdk/accordion';
5
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
6
+ import { CuteLayoutControl } from '@cute-widgets/base/abstract';
7
+ import { _animationsDisabled } from '@cute-widgets/base/core';
7
8
  import { CommonModule } from '@angular/common';
8
9
 
9
- /**
10
- * @license Apache-2.0
11
- *
12
- * Copyright (c) 2025 CuteWidgets Team. All Rights Reserved.
13
- *
14
- * You may not use this file except in compliance with the License
15
- * that can be found at http://www.apache.org/licenses/LICENSE-2.0
16
- */
17
- /** Time and timing curve for **collapse** animations. */
18
- const CUTE_COLLAPSE_ANIMATION_TIMING = '225ms cubic-bezier(0.4,0.0,0.2,1)';
19
- /**
20
- * Animations used by the CuteWidgets` collapse element.
21
- */
22
- const cuteCollapseAnimations = {
23
- /** Animation that rotates the indicator arrow. */
24
- /*
25
- indicatorRotate: trigger('indicatorRotate', [
26
- state('collapsed, void', style({transform: 'rotate(0deg)'})),
27
- state('expanded', style({transform: 'rotate(180deg)'})),
28
- transition(
29
- 'expanded <=> collapsed, void => collapsed',
30
- animate(EXPANSION_PANEL_ANIMATION_TIMING),
31
- ),
32
- ]),
33
- */
34
- /** Animation that expands and collapses the panel content. */
35
- bodyExpansion: trigger('bodyExpansion', [
36
- state('collapsed, void', style({ height: '0px', visibility: 'hidden' })),
37
- state('collapsed-hor, void', style({ width: '0px', visibility: 'hidden' })),
38
- // Clear the `visibility` while open, otherwise the content will be visible when placed in
39
- // a parent that's `visibility: hidden`, because `visibility` doesn't apply to descendants
40
- // that have a `visibility` of their own (see #27436).
41
- state('expanded', style({ height: '*', visibility: '' })),
42
- state('expanded-hor', style({ width: '*', visibility: '' })),
43
- transition(
44
- //'expanded <=> collapsed, expanded-hor <=> collapsed-hor, :enter',
45
- '* => *, :enter, :leave', animate(CUTE_COLLAPSE_ANIMATION_TIMING))
46
- ]),
47
- };
48
-
49
10
  /**
50
11
  * @license Apache-2.0
51
12
  *
@@ -56,33 +17,21 @@ const cuteCollapseAnimations = {
56
17
  */
57
18
  // Increasing integer for generating unique ids for checkbox components.
58
19
  let nextUniqueId = 0;
59
- /**
60
- * This collapse component is used to show and hide content.
61
- * Buttons or anchors are used as triggers that are mapped to specific elements you toggle.
62
- */
63
- class CuteCollapse extends CuteBaseControl {
64
- /** Sets the element's current state to _collapsed_ or _expanded_ value. */
65
- get collapsed() { return this._collapsed(); }
66
- set collapsed(value) {
67
- if (value !== this._collapsed()) {
68
- if (this.disableAnimation) {
69
- (value ? this.beforeCollapse : this.beforeExpand).emit();
70
- }
71
- this._collapsed.set(value);
72
- if (this.disableAnimation) {
73
- (value ? this.afterCollapse : this.afterExpand).emit();
74
- }
75
- }
76
- }
77
- /** Weather the current state is _collapsed_ or _expanded_. Part of `Expandable` interface. */
78
- get expanded() { return !this.collapsed; }
20
+ class CuteCollapseBase extends CuteLayoutControl {
21
+ /** Whether the `CuteCollapse` is expanded. */
22
+ get expanded() { return this._accordionItem.expanded; }
23
+ set expanded(value) { this._accordionItem.expanded = value; }
24
+ /** Whether the animation while collapsing/expanding should be disabled */
25
+ get disableAnimation() { return this._disableAnimation ?? this._animationsDisabled; }
26
+ set disableAnimation(value) { this._disableAnimation = value; }
79
27
  constructor() {
80
28
  super();
81
- this._collapsed = signal(true, ...(ngDevMode ? [{ debugName: "_collapsed" }] : []));
29
+ this._ngZone = inject(NgZone);
30
+ this._accordionItem = inject(CdkAccordionItem);
31
+ this._animationsDisabled = _animationsDisabled();
32
+ this._cleanupTransitionHandlers = [];
82
33
  /** Expanding/Collapsing directionality, _horizontal_ or _vertical_. Default is _vertical_. */
83
34
  this.horizontal = false;
84
- /** Whether the animation while collapsing/expanding should be disabled */
85
- this.disableAnimation = false;
86
35
  /** Event emitting before expand element */
87
36
  this.beforeExpand = new EventEmitter();
88
37
  /** Event emitting before collapse element */
@@ -91,81 +40,104 @@ class CuteCollapse extends CuteBaseControl {
91
40
  this.afterExpand = new EventEmitter();
92
41
  /** Event emitting after collapse element */
93
42
  this.afterCollapse = new EventEmitter();
94
- /** Stream of body animation events. */
95
- this._bodyAnimation$ = new Subject();
96
- // We need a Subject with distinctUntilChanged, because the `done` event
97
- // fires twice on some browsers. See https://github.com/angular/angular/issues/24084
98
- this._bodyAnimation$
99
- .pipe(distinctUntilChanged((x, y) => {
100
- return x.phaseName === y.phaseName && x.fromState === y.fromState && x.toState === y.toState;
101
- }))
102
- .subscribe((event) => {
103
- this.onAnimationEvent(event);
104
- });
105
- }
106
- onAnimationEvent(event) {
107
- if (event.fromState !== 'void') {
108
- const toState = event.toState;
109
- if (event.phaseName == "start") {
110
- if (toState.startsWith('expanded')) {
111
- this.beforeExpand.emit();
112
- }
113
- else if (toState.startsWith('collapsed')) {
114
- this.beforeCollapse.emit();
115
- }
43
+ this._transitionStartListener = (event) => {
44
+ if (event.target === this._nativeElement &&
45
+ (event.propertyName === 'grid-template-rows' || event.propertyName === 'grid-template-columns')) {
46
+ this._ngZone.run(() => {
47
+ if (this._accordionItem.expanded) {
48
+ this.beforeExpand.emit();
49
+ }
50
+ else {
51
+ this.beforeCollapse.emit();
52
+ }
53
+ });
116
54
  }
117
- else if (event.phaseName == "done") {
118
- if (toState.startsWith('expanded')) {
119
- this.afterExpand.emit();
120
- }
121
- else if (toState.startsWith('collapsed')) {
122
- this.afterCollapse.emit();
123
- }
55
+ };
56
+ this._transitionEndListener = (event) => {
57
+ if (event.target === this._nativeElement &&
58
+ (event.propertyName === 'grid-template-rows' || event.propertyName === 'grid-template-columns')) {
59
+ this._ngZone.run(() => {
60
+ if (this._accordionItem.expanded) {
61
+ this.afterExpand.emit();
62
+ }
63
+ else {
64
+ this.afterCollapse.emit();
65
+ }
66
+ });
124
67
  }
68
+ };
69
+ }
70
+ setDisabledState(newState, emitEvent) {
71
+ if (super.setDisabledState(newState, emitEvent)) {
72
+ this._accordionItem.disabled = coerceBooleanProperty(newState);
73
+ return true;
125
74
  }
75
+ return false;
126
76
  }
127
77
  generateId() {
128
78
  return `cute-collapse-${nextUniqueId++}`;
129
79
  }
130
80
  /** Gets the expanded state string. */
131
81
  getState() {
132
- return this.collapsed ? 'collapsed' : 'expanded';
82
+ return this._accordionItem.expanded ? 'expanded' : 'collapsed';
133
83
  }
134
- /** Part of `Expandable` interface */
84
+ /**
85
+ * @inheritDoc
86
+ * Part of `Expandable` interface.
87
+ */
135
88
  toggle() {
136
- this.collapsed = !this.collapsed;
89
+ this._accordionItem.toggle();
137
90
  }
138
- /** Part of `Expandable` interface */
91
+ /**
92
+ * @inheritDoc
93
+ * Part of `Expandable` interface.
94
+ */
139
95
  open() {
140
- if (this.collapsed) {
141
- this.collapsed = false;
142
- }
96
+ this._accordionItem.open();
143
97
  }
144
- /** Part of `Expandable` interface */
98
+ /**
99
+ * @inheritDoc
100
+ * Part of `Expandable` interface.
101
+ */
145
102
  close() {
146
- if (!this.collapsed) {
147
- this.collapsed = true;
148
- }
103
+ this._accordionItem.close();
104
+ }
105
+ _setupAnimationEvents() {
106
+ // This method is defined separately, because we need to
107
+ // disable this logic in some internal components.
108
+ this._ngZone.runOutsideAngular(() => {
109
+ if (this.disableAnimation) {
110
+ this._accordionItem.opened.subscribe(() => this._ngZone.run(() => this.beforeExpand.emit()));
111
+ this._accordionItem.closed.subscribe(() => this._ngZone.run(() => this.beforeCollapse.emit()));
112
+ this._accordionItem.opened.subscribe(() => this._ngZone.run(() => this.afterExpand.emit()));
113
+ this._accordionItem.closed.subscribe(() => this._ngZone.run(() => this.afterCollapse.emit()));
114
+ }
115
+ else {
116
+ setTimeout(() => {
117
+ const element = this._nativeElement;
118
+ this._cleanupTransitionHandlers.push(this._renderer.listen(element, 'transitionend', this._transitionEndListener), this._renderer.listen(element, 'transitionstart', this._transitionStartListener));
119
+ element.classList.add('cute-collapse-animations-enabled');
120
+ }, 200);
121
+ }
122
+ });
123
+ }
124
+ ngAfterContentInit() {
125
+ super.ngAfterContentInit();
126
+ this._setupAnimationEvents();
149
127
  }
150
128
  ngOnDestroy() {
151
129
  super.ngOnDestroy();
152
- this._bodyAnimation$.complete();
130
+ this._cleanupTransitionHandlers.forEach(cleanup => cleanup());
153
131
  }
154
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapse, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
155
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "20.3.15", type: CuteCollapse, isStandalone: true, selector: "cute-collapse", inputs: { collapsed: ["collapsed", "collapsed", booleanAttribute], horizontal: ["horizontal", "horizontal", booleanAttribute], disableAnimation: ["disableAnimation", "disableAnimation", booleanAttribute] }, outputs: { beforeExpand: "beforeExpand", beforeCollapse: "beforeCollapse", afterExpand: "afterExpand", afterCollapse: "afterCollapse" }, host: { listeners: { "@bodyExpansion.start": "_bodyAnimation$.next($event)", "@bodyExpansion.done": "_bodyAnimation$.next($event)" }, properties: { "id": "id || null", "@bodyExpansion": "getState()+(horizontal?\"-hor\":\"\")", "@.disabled": "disableAnimation" }, classAttribute: "cute-collapse" }, exportAs: ["cuteCollapse"], usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".cute-collapse{display:block}.ng-animating{overflow:hidden}\n"], animations: [cuteCollapseAnimations.bodyExpansion], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
132
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapseBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
133
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.3.15", type: CuteCollapseBase, isStandalone: true, inputs: { expanded: ["expanded", "expanded", booleanAttribute], horizontal: ["horizontal", "horizontal", booleanAttribute], disableAnimation: ["disableAnimation", "disableAnimation", booleanAttribute] }, outputs: { beforeExpand: "beforeExpand", beforeCollapse: "beforeCollapse", afterExpand: "afterExpand", afterCollapse: "afterCollapse" }, usesInheritance: true, hostDirectives: [{ directive: i1.CdkAccordionItem, outputs: ["expandedChange", "expandedChange"] }], ngImport: i0 }); }
156
134
  }
157
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapse, decorators: [{
158
- type: Component,
159
- args: [{ selector: 'cute-collapse', template: '<ng-content></ng-content>', exportAs: 'cuteCollapse', host: {
160
- 'class': 'cute-collapse', // collapse',
161
- //'[class.show]': '!collapsed',
162
- '[id]': 'id || null',
163
- '[@bodyExpansion]': 'getState()+(horizontal?"-hor":"")',
164
- '[@.disabled]': 'disableAnimation',
165
- '(@bodyExpansion.start)': '_bodyAnimation$.next($event)',
166
- '(@bodyExpansion.done)': '_bodyAnimation$.next($event)',
167
- }, animations: [cuteCollapseAnimations.bodyExpansion], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, styles: [".cute-collapse{display:block}.ng-animating{overflow:hidden}\n"] }]
168
- }], ctorParameters: () => [], propDecorators: { collapsed: [{
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapseBase, decorators: [{
136
+ type: Directive,
137
+ args: [{
138
+ hostDirectives: [{ directive: CdkAccordionItem, outputs: ["expandedChange"] }],
139
+ }]
140
+ }], ctorParameters: () => [], propDecorators: { expanded: [{
169
141
  type: Input,
170
142
  args: [{ transform: booleanAttribute }]
171
143
  }], horizontal: [{
@@ -183,6 +155,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
183
155
  }], afterCollapse: [{
184
156
  type: Output
185
157
  }] } });
158
+ /**
159
+ * This collapse component is used to show and hide content.
160
+ * Buttons or anchors are used as triggers that are mapped to specific elements you toggle.
161
+ */
162
+ class CuteCollapse extends CuteCollapseBase {
163
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapse, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
164
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: CuteCollapse, isStandalone: true, selector: "cute-collapse", host: { properties: { "class": "\"cute-collapse-\"+(horizontal ? \"horizontal\" : \"vertical\")+\" \"+getState()", "id": "id || null" }, classAttribute: "cute-collapse" }, exportAs: ["cuteCollapse"], usesInheritance: true, ngImport: i0, template: "<div class=\"cute-collapse-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [".cute-collapse{display:grid;width:100%;overflow:hidden}.cute-collapse .cute-collapse-content{min-height:0;overflow:hidden;transition:display .1s;transition-timing-function:ease-in-out;transition-behavior:allow-discrete;display:none}.cute-collapse.expanded .cute-collapse-content{display:block}.cute-collapse.collapsed .cute-collapse-content{display:none}.cute-collapse.cute-collapse-vertical{grid-template-rows:0fr}.cute-collapse.cute-collapse-vertical.expanded{grid-template-rows:1fr}.cute-collapse.cute-collapse-vertical.collapsed{grid-template-rows:0fr}.cute-collapse.cute-collapse-vertical.cute-collapse-animations-enabled{transition:grid-template-rows .2s}.cute-collapse.cute-collapse-horizontal{grid-template-columns:0fr}.cute-collapse.cute-collapse-horizontal.expanded{grid-template-columns:1fr}.cute-collapse.cute-collapse-horizontal.collapsed{grid-template-columns:0fr}.cute-collapse.cute-collapse-horizontal.cute-collapse-animations-enabled{transition:grid-template-columns .2s}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
165
+ }
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapse, decorators: [{
167
+ type: Component,
168
+ args: [{ selector: 'cute-collapse', exportAs: 'cuteCollapse', host: {
169
+ 'class': 'cute-collapse',
170
+ '[class]': '"cute-collapse-"+(horizontal ? "horizontal" : "vertical")+" "+getState()',
171
+ '[id]': 'id || null',
172
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cute-collapse-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\r\n", styles: [".cute-collapse{display:grid;width:100%;overflow:hidden}.cute-collapse .cute-collapse-content{min-height:0;overflow:hidden;transition:display .1s;transition-timing-function:ease-in-out;transition-behavior:allow-discrete;display:none}.cute-collapse.expanded .cute-collapse-content{display:block}.cute-collapse.collapsed .cute-collapse-content{display:none}.cute-collapse.cute-collapse-vertical{grid-template-rows:0fr}.cute-collapse.cute-collapse-vertical.expanded{grid-template-rows:1fr}.cute-collapse.cute-collapse-vertical.collapsed{grid-template-rows:0fr}.cute-collapse.cute-collapse-vertical.cute-collapse-animations-enabled{transition:grid-template-rows .2s}.cute-collapse.cute-collapse-horizontal{grid-template-columns:0fr}.cute-collapse.cute-collapse-horizontal.expanded{grid-template-columns:1fr}.cute-collapse.cute-collapse-horizontal.collapsed{grid-template-columns:0fr}.cute-collapse.cute-collapse-horizontal.cute-collapse-animations-enabled{transition:grid-template-columns .2s}\n"] }]
173
+ }] });
186
174
 
187
175
  /**
188
176
  * @license Apache-2.0
@@ -202,7 +190,7 @@ class CuteCollapseTrigger {
202
190
  this._collapseControl = collapse;
203
191
  }
204
192
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapseTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
205
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteCollapseTrigger, isStandalone: true, selector: "[cuteCollapseTriggerFor]", inputs: { collapseControl: ["cuteCollapseTriggerFor", "collapseControl"] }, host: { listeners: { "click": "collapseControl?.toggle()" }, properties: { "class.collapsed": "collapseControl?.collapsed", "attr.aria-expanded": "collapseControl ? collapseControl.expanded : null", "attr.aria-controls": "collapseControl?.id || null" }, classAttribute: "cute-collapse-trigger" }, exportAs: ["cuteCollapseTrigger"], ngImport: i0 }); }
193
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteCollapseTrigger, isStandalone: true, selector: "[cuteCollapseTriggerFor]", inputs: { collapseControl: ["cuteCollapseTriggerFor", "collapseControl"] }, host: { listeners: { "click": "collapseControl?.toggle()" }, properties: { "class.collapsed": "!collapseControl?.expanded", "attr.aria-expanded": "collapseControl ? collapseControl.expanded : null", "attr.aria-controls": "collapseControl?.id || null" }, classAttribute: "cute-collapse-trigger" }, exportAs: ["cuteCollapseTrigger"], ngImport: i0 }); }
206
194
  }
207
195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteCollapseTrigger, decorators: [{
208
196
  type: Directive,
@@ -211,7 +199,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
211
199
  exportAs: 'cuteCollapseTrigger',
212
200
  host: {
213
201
  'class': 'cute-collapse-trigger',
214
- '[class.collapsed]': 'collapseControl?.collapsed',
202
+ '[class.collapsed]': '!collapseControl?.expanded',
215
203
  '[attr.aria-expanded]': 'collapseControl ? collapseControl.expanded : null',
216
204
  '[attr.aria-controls]': 'collapseControl?.id || null',
217
205
  '(click)': 'collapseControl?.toggle()',
@@ -255,5 +243,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
255
243
  * Generated bundle index. Do not edit.
256
244
  */
257
245
 
258
- export { CUTE_COLLAPSE_ANIMATION_TIMING, CuteCollapse, CuteCollapseModule, CuteCollapseTrigger, cuteCollapseAnimations };
246
+ export { CuteCollapse, CuteCollapseBase, CuteCollapseModule, CuteCollapseTrigger };
259
247
  //# sourceMappingURL=cute-widgets-base-collapse.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cute-widgets-base-collapse.mjs","sources":["../../../../projects/cute-widgets/base/collapse/src/collapse-animations.ts","../../../../projects/cute-widgets/base/collapse/src/collapse.component.ts","../../../../projects/cute-widgets/base/collapse/src/collapse-trigger.directive.ts","../../../../projects/cute-widgets/base/collapse/src/collapse.module.ts","../../../../projects/cute-widgets/base/collapse/cute-widgets-base-collapse.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 {\r\n animate,\r\n AnimationTriggerMetadata,\r\n state,\r\n style,\r\n transition,\r\n trigger,\r\n} from '@angular/animations';\r\n\r\n/** Time and timing curve for **collapse** animations. */\r\nexport const CUTE_COLLAPSE_ANIMATION_TIMING = '225ms cubic-bezier(0.4,0.0,0.2,1)';\r\n\r\n/**\r\n * Animations used by the CuteWidgets` collapse element.\r\n */\r\nexport const cuteCollapseAnimations: {\r\n //readonly indicatorRotate: AnimationTriggerMetadata;\r\n readonly bodyExpansion: AnimationTriggerMetadata;\r\n} = {\r\n /** Animation that rotates the indicator arrow. */\r\n /*\r\n indicatorRotate: trigger('indicatorRotate', [\r\n state('collapsed, void', style({transform: 'rotate(0deg)'})),\r\n state('expanded', style({transform: 'rotate(180deg)'})),\r\n transition(\r\n 'expanded <=> collapsed, void => collapsed',\r\n animate(EXPANSION_PANEL_ANIMATION_TIMING),\r\n ),\r\n ]),\r\n */\r\n /** Animation that expands and collapses the panel content. */\r\n bodyExpansion: trigger('bodyExpansion', [\r\n state('collapsed, void', style({height: '0px', visibility: 'hidden'})),\r\n state('collapsed-hor, void', style({width: '0px', visibility: 'hidden'})),\r\n // Clear the `visibility` while open, otherwise the content will be visible when placed in\r\n // a parent that's `visibility: hidden`, because `visibility` doesn't apply to descendants\r\n // that have a `visibility` of their own (see #27436).\r\n state('expanded', style({height: '*', visibility: ''})),\r\n state('expanded-hor', style({width: '*', visibility: ''})),\r\n transition(\r\n //'expanded <=> collapsed, expanded-hor <=> collapsed-hor, :enter',\r\n '* => *, :enter, :leave',\r\n animate(CUTE_COLLAPSE_ANIMATION_TIMING),\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 ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input, OnDestroy,\r\n Output, signal,\r\n ViewEncapsulation\r\n} from \"@angular/core\";\r\nimport {CuteBaseControl, Expandable} from \"@cute-widgets/base/abstract\";\r\nimport {cuteCollapseAnimations} from \"./collapse-animations\";\r\nimport {Subject} from \"rxjs\";\r\nimport {distinctUntilChanged} from \"rxjs/operators\";\r\nimport {AnimationEvent} from \"@angular/animations\";\r\n\r\n// Increasing integer for generating unique ids for checkbox components.\r\nlet nextUniqueId = 0;\r\n\r\n/** Animation states */\r\nexport type CuteCollapseState = 'expanded' | 'collapsed';\r\n\r\n/**\r\n * This collapse component is used to show and hide content.\r\n * Buttons or anchors are used as triggers that are mapped to specific elements you toggle.\r\n */\r\n@Component({\r\n selector: 'cute-collapse',\r\n template: '<ng-content></ng-content>',\r\n styles: `\r\n .cute-collapse {display: block;}\r\n .ng-animating {overflow: hidden;}\r\n `,\r\n exportAs: 'cuteCollapse',\r\n host: {\r\n 'class': 'cute-collapse', // collapse',\r\n //'[class.show]': '!collapsed',\r\n '[id]': 'id || null',\r\n '[@bodyExpansion]': 'getState()+(horizontal?\"-hor\":\"\")',\r\n '[@.disabled]': 'disableAnimation',\r\n '(@bodyExpansion.start)': '_bodyAnimation$.next($event)',\r\n '(@bodyExpansion.done)': '_bodyAnimation$.next($event)',\r\n },\r\n animations: [cuteCollapseAnimations.bodyExpansion],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true\r\n})\r\nexport class CuteCollapse extends CuteBaseControl implements Expandable, OnDestroy {\r\n\r\n /** Sets the element's current state to _collapsed_ or _expanded_ value. */\r\n @Input({transform: booleanAttribute})\r\n get collapsed(): boolean { return this._collapsed(); }\r\n set collapsed(value: boolean) {\r\n if (value !== this._collapsed()) {\r\n if (this.disableAnimation) {\r\n (value ? this.beforeCollapse : this.beforeExpand).emit();\r\n }\r\n this._collapsed.set(value);\r\n if (this.disableAnimation) {\r\n (value ? this.afterCollapse : this.afterExpand).emit();\r\n }\r\n }\r\n }\r\n private _collapsed = signal<boolean>(true);\r\n\r\n /** Expanding/Collapsing directionality, _horizontal_ or _vertical_. Default is _vertical_. */\r\n @Input({transform: booleanAttribute})\r\n horizontal: boolean = false;\r\n\r\n /** Whether the animation while collapsing/expanding should be disabled */\r\n @Input({transform: booleanAttribute})\r\n disableAnimation: boolean = false;\r\n\r\n /** Event emitting before expand element */\r\n @Output() readonly beforeExpand = new EventEmitter<void>();\r\n /** Event emitting before collapse element */\r\n @Output() readonly beforeCollapse = new EventEmitter<void>();\r\n\r\n /** Event emitting after expand element */\r\n @Output() readonly afterExpand = new EventEmitter<void>();\r\n /** Event emitting after collapse element */\r\n @Output() readonly afterCollapse = new EventEmitter<void>();\r\n\r\n /** Weather the current state is _collapsed_ or _expanded_. Part of `Expandable` interface. */\r\n public get expanded(): boolean { return !this.collapsed; }\r\n\r\n /** Stream of body animation events. */\r\n protected readonly _bodyAnimation$ = new Subject<AnimationEvent>();\r\n\r\n constructor() {\r\n super();\r\n\r\n // We need a Subject with distinctUntilChanged, because the `done` event\r\n // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\r\n this._bodyAnimation$\r\n .pipe(\r\n distinctUntilChanged((x, y) => {\r\n return x.phaseName === y.phaseName && x.fromState === y.fromState && x.toState === y.toState;\r\n }),\r\n )\r\n .subscribe((event: AnimationEvent) => {\r\n this.onAnimationEvent(event);\r\n });\r\n }\r\n\r\n protected onAnimationEvent(event: AnimationEvent) {\r\n if (event.fromState !== 'void') {\r\n const toState = event.toState;\r\n if (event.phaseName == \"start\") {\r\n if (toState.startsWith('expanded')) {\r\n this.beforeExpand.emit();\r\n } else if (toState.startsWith('collapsed')) {\r\n this.beforeCollapse.emit();\r\n }\r\n } else if (event.phaseName == \"done\") {\r\n if (toState.startsWith('expanded')) {\r\n this.afterExpand.emit();\r\n } else if (toState.startsWith('collapsed')) {\r\n this.afterCollapse.emit();\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override generateId(): string {\r\n return `cute-collapse-${nextUniqueId++}`;\r\n }\r\n\r\n /** Gets the expanded state string. */\r\n getState(): CuteCollapseState {\r\n return this.collapsed ? 'collapsed' : 'expanded';\r\n }\r\n\r\n /** Part of `Expandable` interface */\r\n toggle(): void {\r\n this.collapsed = !this.collapsed;\r\n }\r\n\r\n /** Part of `Expandable` interface */\r\n open(): void {\r\n if (this.collapsed) {\r\n this.collapsed = false;\r\n }\r\n }\r\n\r\n /** Part of `Expandable` interface */\r\n close(): void {\r\n if (!this.collapsed) {\r\n this.collapsed = true;\r\n }\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n this._bodyAnimation$.complete();\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, Input} from \"@angular/core\";\r\nimport {CuteCollapse} from \"./collapse.component\";\r\n\r\n@Directive({\r\n selector: '[cuteCollapseTriggerFor]',\r\n exportAs: 'cuteCollapseTrigger',\r\n host: {\r\n 'class': 'cute-collapse-trigger',\r\n '[class.collapsed]': 'collapseControl?.collapsed',\r\n '[attr.aria-expanded]': 'collapseControl ? collapseControl.expanded : null',\r\n '[attr.aria-controls]': 'collapseControl?.id || null',\r\n '(click)': 'collapseControl?.toggle()',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteCollapseTrigger {\r\n\r\n /** Reference to the `cute-collapse` component to toggle its visibility */\r\n @Input(\"cuteCollapseTriggerFor\")\r\n get collapseControl(): CuteCollapse | null {return this._collapseControl;}\r\n set collapseControl(collapse: CuteCollapse | null) {\r\n this._collapseControl = collapse;\r\n }\r\n private _collapseControl: CuteCollapse | null = null;\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 {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteCollapse} from \"./collapse.component\";\r\nimport {CuteCollapseTrigger} from \"./collapse-trigger.directive\";\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteCollapse,\r\n CuteCollapseTrigger,\r\n];\r\n\r\n@NgModule({\r\n imports: [CommonModule, ...TYPES],\r\n exports: TYPES,\r\n declarations: [],\r\n})\r\nexport class CuteCollapseModule {\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-collapse.mjs","sources":["../../../../projects/cute-widgets/base/collapse/src/collapse.component.ts","../../../../projects/cute-widgets/base/collapse/src/collapse.component.html","../../../../projects/cute-widgets/base/collapse/src/collapse-trigger.directive.ts","../../../../projects/cute-widgets/base/collapse/src/collapse.module.ts","../../../../projects/cute-widgets/base/collapse/cute-widgets-base-collapse.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 {\r\n AfterContentInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component, Directive,\r\n EventEmitter, inject,\r\n Input, NgZone,\r\n Output,\r\n ViewEncapsulation\r\n} from \"@angular/core\";\r\nimport {CdkAccordionItem} from '@angular/cdk/accordion';\r\nimport {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion';\r\nimport {CuteLayoutControl, Expandable} from \"@cute-widgets/base/abstract\";\r\nimport {_animationsDisabled} from '@cute-widgets/base/core';\r\n\r\n// Increasing integer for generating unique ids for checkbox components.\r\nlet nextUniqueId = 0;\r\n\r\n/** Animation states */\r\nexport type CuteCollapseState = 'expanded' | 'collapsed';\r\n\r\n@Directive({\r\n hostDirectives: [{directive: CdkAccordionItem, outputs: [\"expandedChange\"]}],\r\n})\r\nexport abstract class CuteCollapseBase extends CuteLayoutControl implements Expandable, AfterContentInit {\r\n protected _ngZone = inject(NgZone);\r\n protected _accordionItem = inject(CdkAccordionItem);\r\n protected _animationsDisabled = _animationsDisabled();\r\n private _cleanupTransitionHandlers: (() => void)[] = [];\r\n\r\n /** Whether the `CuteCollapse` is expanded. */\r\n @Input({transform: booleanAttribute})\r\n get expanded(): boolean {return this._accordionItem.expanded;}\r\n set expanded(value: boolean) {this._accordionItem.expanded = value;}\r\n\r\n /** Expanding/Collapsing directionality, _horizontal_ or _vertical_. Default is _vertical_. */\r\n @Input({transform: booleanAttribute})\r\n horizontal: boolean = false;\r\n\r\n /** Whether the animation while collapsing/expanding should be disabled */\r\n @Input({transform: booleanAttribute})\r\n get disableAnimation(): boolean {return this._disableAnimation ?? this._animationsDisabled;}\r\n set disableAnimation(value: boolean) { this._disableAnimation = value; }\r\n private _disableAnimation: boolean | undefined;\r\n\r\n /** Event emitting before expand element */\r\n @Output() readonly beforeExpand = new EventEmitter<void>();\r\n /** Event emitting before collapse element */\r\n @Output() readonly beforeCollapse = new EventEmitter<void>();\r\n\r\n /** Event emitting after expand element */\r\n @Output() readonly afterExpand = new EventEmitter<void>();\r\n /** Event emitting after collapse element */\r\n @Output() readonly afterCollapse = new EventEmitter<void>();\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected override setDisabledState(newState: BooleanInput, emitEvent?: boolean): boolean {\r\n if (super.setDisabledState(newState, emitEvent)) {\r\n this._accordionItem.disabled = coerceBooleanProperty(newState);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n protected override generateId(): string {\r\n return `cute-collapse-${nextUniqueId++}`;\r\n }\r\n\r\n /** Gets the expanded state string. */\r\n getState(): CuteCollapseState {\r\n return this._accordionItem.expanded ? 'expanded' : 'collapsed';\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n * Part of `Expandable` interface.\r\n */\r\n toggle(): void {\r\n this._accordionItem.toggle();\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n * Part of `Expandable` interface.\r\n */\r\n open(): void {\r\n this._accordionItem.open();\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n * Part of `Expandable` interface.\r\n */\r\n close(): void {\r\n this._accordionItem.close();\r\n }\r\n\r\n private _transitionStartListener = (event: TransitionEvent) => {\r\n if (event.target === this._nativeElement &&\r\n (event.propertyName === 'grid-template-rows' || event.propertyName === 'grid-template-columns')\r\n ) {\r\n this._ngZone.run(() => {\r\n if (this._accordionItem.expanded) {\r\n this.beforeExpand.emit();\r\n } else {\r\n this.beforeCollapse.emit();\r\n }\r\n });\r\n }\r\n }\r\n\r\n private _transitionEndListener = (event: TransitionEvent) => {\r\n if (event.target === this._nativeElement &&\r\n (event.propertyName === 'grid-template-rows' || event.propertyName === 'grid-template-columns')\r\n ) {\r\n this._ngZone.run(() => {\r\n if (this._accordionItem.expanded) {\r\n this.afterExpand.emit();\r\n } else {\r\n this.afterCollapse.emit();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected _setupAnimationEvents() {\r\n // This method is defined separately, because we need to\r\n // disable this logic in some internal components.\r\n this._ngZone.runOutsideAngular(() => {\r\n if (this.disableAnimation) {\r\n this._accordionItem.opened.subscribe(() => this._ngZone.run(() => this.beforeExpand.emit()));\r\n this._accordionItem.closed.subscribe(() => this._ngZone.run(() => this.beforeCollapse.emit()));\r\n this._accordionItem.opened.subscribe(() => this._ngZone.run(() => this.afterExpand.emit()));\r\n this._accordionItem.closed.subscribe(() => this._ngZone.run(() => this.afterCollapse.emit()));\r\n } else {\r\n setTimeout(() => {\r\n const element = this._nativeElement;\r\n this._cleanupTransitionHandlers.push(\r\n this._renderer.listen(element, 'transitionend', this._transitionEndListener),\r\n this._renderer.listen(element, 'transitionstart', this._transitionStartListener),\r\n );\r\n element.classList.add('cute-collapse-animations-enabled');\r\n }, 200);\r\n }\r\n });\r\n }\r\n\r\n override ngAfterContentInit() {\r\n super.ngAfterContentInit();\r\n this._setupAnimationEvents();\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n this._cleanupTransitionHandlers.forEach(cleanup => cleanup());\r\n }\r\n\r\n}\r\n\r\n/**\r\n * This collapse component is used to show and hide content.\r\n * Buttons or anchors are used as triggers that are mapped to specific elements you toggle.\r\n */\r\n@Component({\r\n selector: 'cute-collapse',\r\n templateUrl: './collapse.component.html',\r\n styleUrl: './collapse.component.scss',\r\n exportAs: 'cuteCollapse',\r\n host: {\r\n 'class': 'cute-collapse',\r\n '[class]': '\"cute-collapse-\"+(horizontal ? \"horizontal\" : \"vertical\")+\" \"+getState()',\r\n '[id]': 'id || null',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteCollapse extends CuteCollapseBase {}\r\n","<div class=\"cute-collapse-content\" #content>\r\n <ng-content></ng-content>\r\n</div>\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, Input} from \"@angular/core\";\r\nimport {CuteCollapse} from \"./collapse.component\";\r\nimport {Expandable} from '@cute-widgets/base/abstract';\r\n\r\n@Directive({\r\n selector: '[cuteCollapseTriggerFor]',\r\n exportAs: 'cuteCollapseTrigger',\r\n host: {\r\n 'class': 'cute-collapse-trigger',\r\n '[class.collapsed]': '!collapseControl?.expanded',\r\n '[attr.aria-expanded]': 'collapseControl ? collapseControl.expanded : null',\r\n '[attr.aria-controls]': 'collapseControl?.id || null',\r\n '(click)': 'collapseControl?.toggle()',\r\n },\r\n standalone: true,\r\n})\r\nexport class CuteCollapseTrigger {\r\n\r\n /** Reference to the `cute-collapse` component to toggle its visibility */\r\n @Input(\"cuteCollapseTriggerFor\")\r\n get collapseControl(): Expandable | null {return this._collapseControl;}\r\n set collapseControl(collapse: Expandable | null) {\r\n this._collapseControl = collapse;\r\n }\r\n private _collapseControl: Expandable | null = null;\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 {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteCollapse} from \"./collapse.component\";\r\nimport {CuteCollapseTrigger} from \"./collapse-trigger.directive\";\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteCollapse,\r\n CuteCollapseTrigger,\r\n];\r\n\r\n@NgModule({\r\n imports: [CommonModule, ...TYPES],\r\n exports: TYPES,\r\n declarations: [],\r\n})\r\nexport class CuteCollapseModule {\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -65,12 +65,24 @@ const bsBreakpoints = {
65
65
  * @param code Bootstrap's breakpoint abbreviation.
66
66
  * @returns Media query string or _undefined_ if the code has an unknown value.
67
67
  */
68
- getQuery(code) {
68
+ getMediaQuery(code) {
69
69
  if (code in this.query) {
70
70
  return this.query[code];
71
71
  }
72
72
  return undefined;
73
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
+ },
74
86
  /**
75
87
  * Gets the name of the media-query by its value.
76
88
  * @param query The media-query text.
@@ -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 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 getQuery(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 * 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":"AAAA;;;;;;;AAOG;AAEH;;AAEG;AACI,MAAM,aAAa,GAAG;AAE3B,IAAA,KAAK,EAAE;AACL,QAAA,YAAY,EAAI,oBAAoB;AACpC,QAAA,aAAa,EAAG,oBAAoB;AACpC,QAAA,YAAY,EAAI,oBAAoB;AACpC,QAAA,aAAa,EAAG,qBAAqB;AACrC,QAAA,cAAc,EAAE,qBAAqB;AAErC,QAAA,MAAM,EAAI,uBAAuB;AACjC,QAAA,KAAK,EAAK,8CAA8C;AACxD,QAAA,MAAM,EAAI,8CAA8C;AACxD,QAAA,KAAK,EAAK,+CAA+C;AACzD,QAAA,MAAM,EAAI,gDAAgD;AAC1D,QAAA,OAAO,EAAG,qBAAqB;QAE/B,IAAI,EAAE,KAAY,OAAO,IAAI,CAAC,MAAM,CAAA,CAAA,CAAC;QACrC,IAAI,EAAE,KAAY,OAAO,IAAI,CAAC,KAAK,CAAA,CAAA,CAAC;QACpC,IAAI,EAAE,KAAY,OAAO,IAAI,CAAC,MAAM,CAAA,CAAA,CAAC;QACrC,IAAI,EAAE,KAAY,OAAO,IAAI,CAAC,KAAK,CAAA,CAAA,CAAC;QACpC,IAAI,EAAE,KAAY,OAAO,IAAI,CAAC,MAAM,CAAA,CAAA,CAAC;QACrC,IAAI,GAAG,KAAY,OAAO,IAAI,CAAC,OAAO,CAAA,CAAA,CAAC;AACxC,KAAA;AAED,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,EAAC,EAAE,EAAC,CAAC,EAAE,EAAE,EAAC,GAAG,EAAE,EAAE,EAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAC;IAC7D,CAAC;AAED;;;;AAIG;AACH,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC/B,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;;AAEpB,QAAA,OAAO,EAAE;IACX,CAAC;AAED;;;;AAIG;AACH,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,OAAQ,IAAI,CAAC,KAAa,CAAC,IAAI,CAAC;QAClC;AACA,QAAA,OAAO,SAAS;IAClB,CAAC;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,GAAuB;QAC3B,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACrD,gBAAA,IAAI,KAAK,KAAK,KAAK,EAAE;oBACnB,GAAG,GAAG,GAAG;oBACT;gBACF;YACF;QACF;AACA,QAAA,OAAO,GAAG;IACZ,CAAC;;;ACjGH;;AAEG;;;;"}
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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"}
@@ -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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"}
@@ -118,12 +118,24 @@ const bsBreakpoints = {
118
118
  * @param code Bootstrap's breakpoint abbreviation.
119
119
  * @returns Media query string or _undefined_ if the code has an unknown value.
120
120
  */
121
- getQuery(code) {
121
+ getMediaQuery(code) {
122
122
  if (code in this.query) {
123
123
  return this.query[code];
124
124
  }
125
125
  return undefined;
126
126
  },
127
+ /**
128
+ * Returns the media query string array for the specified breakpoint one or more symbols.
129
+ * @param codes Bootstrap's breakpoint abbreviation list.
130
+ * @returns Media query string array for each specified code of breakpoint.
131
+ */
132
+ getMediaQueries(codes) {
133
+ const bpArray = Array.isArray(codes) ? [...codes] : [codes];
134
+ return bpArray.map(value => {
135
+ const label = this.getLabel(value);
136
+ return this.getMediaQuery(label + "AndDown") ?? "";
137
+ });
138
+ },
127
139
  /**
128
140
  * Gets the name of the media-query by its value.
129
141
  * @param query The media-query text.
@@ -1422,7 +1434,7 @@ function toBgCssClass(color) {
1422
1434
  if (isExtendedColor(richThemeColor)) {
1423
1435
  themeColor = getBaseColor(richThemeColor);
1424
1436
  if (richThemeColor.endsWith("-emphasis")) {
1425
- return `bg-${themeColor}-subtle`;
1437
+ return `bg-${themeColor}-subtle text-${themeColor}-emphasis`;
1426
1438
  }
1427
1439
  // contrast
1428
1440
  return `text-bg-${themeColor}`;