@cute-widgets/base 20.0.5 → 21.0.0

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 (168) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/fesm2022/cute-widgets-base-abstract.mjs +15 -15
  3. package/fesm2022/cute-widgets-base-abstract.mjs.map +1 -1
  4. package/fesm2022/cute-widgets-base-alert.mjs +10 -10
  5. package/fesm2022/cute-widgets-base-alert.mjs.map +1 -1
  6. package/fesm2022/cute-widgets-base-autocomplete.mjs +14 -14
  7. package/fesm2022/cute-widgets-base-autocomplete.mjs.map +1 -1
  8. package/fesm2022/cute-widgets-base-badge.mjs +46 -14
  9. package/fesm2022/cute-widgets-base-badge.mjs.map +1 -1
  10. package/fesm2022/cute-widgets-base-bottom-sheet.mjs +11 -11
  11. package/fesm2022/cute-widgets-base-bottom-sheet.mjs.map +1 -1
  12. package/fesm2022/cute-widgets-base-button-toggle.mjs +29 -12
  13. package/fesm2022/cute-widgets-base-button-toggle.mjs.map +1 -1
  14. package/fesm2022/cute-widgets-base-button.mjs +20 -20
  15. package/fesm2022/cute-widgets-base-button.mjs.map +1 -1
  16. package/fesm2022/cute-widgets-base-card.mjs +40 -40
  17. package/fesm2022/cute-widgets-base-card.mjs.map +1 -1
  18. package/fesm2022/cute-widgets-base-checkbox.mjs +28 -28
  19. package/fesm2022/cute-widgets-base-checkbox.mjs.map +1 -1
  20. package/fesm2022/cute-widgets-base-chips.mjs +49 -49
  21. package/fesm2022/cute-widgets-base-chips.mjs.map +1 -1
  22. package/fesm2022/cute-widgets-base-collapse.mjs +14 -14
  23. package/fesm2022/cute-widgets-base-collapse.mjs.map +1 -1
  24. package/fesm2022/cute-widgets-base-core-datetime.mjs +11 -11
  25. package/fesm2022/cute-widgets-base-core-datetime.mjs.map +1 -1
  26. package/fesm2022/cute-widgets-base-core-directives.mjs +21 -21
  27. package/fesm2022/cute-widgets-base-core-directives.mjs.map +1 -1
  28. package/fesm2022/cute-widgets-base-core-error.mjs +6 -6
  29. package/fesm2022/cute-widgets-base-core-error.mjs.map +1 -1
  30. package/fesm2022/cute-widgets-base-core-line.mjs +7 -7
  31. package/fesm2022/cute-widgets-base-core-line.mjs.map +1 -1
  32. package/fesm2022/cute-widgets-base-core-nav.mjs +30 -28
  33. package/fesm2022/cute-widgets-base-core-nav.mjs.map +1 -1
  34. package/fesm2022/cute-widgets-base-core-observers.mjs +16 -16
  35. package/fesm2022/cute-widgets-base-core-observers.mjs.map +1 -1
  36. package/fesm2022/cute-widgets-base-core-option.mjs +10 -10
  37. package/fesm2022/cute-widgets-base-core-option.mjs.map +1 -1
  38. package/fesm2022/cute-widgets-base-core-pipes.mjs +6 -6
  39. package/fesm2022/cute-widgets-base-core-pipes.mjs.map +1 -1
  40. package/fesm2022/cute-widgets-base-core-ripple.mjs +3 -3
  41. package/fesm2022/cute-widgets-base-core-ripple.mjs.map +1 -1
  42. package/fesm2022/cute-widgets-base-core-theming.mjs +6 -6
  43. package/fesm2022/cute-widgets-base-core-theming.mjs.map +1 -1
  44. package/fesm2022/cute-widgets-base-core-utils.mjs +3 -3
  45. package/fesm2022/cute-widgets-base-core-utils.mjs.map +1 -1
  46. package/fesm2022/cute-widgets-base-core.mjs +36 -36
  47. package/fesm2022/cute-widgets-base-core.mjs.map +1 -1
  48. package/fesm2022/cute-widgets-base-datepicker.mjs +100 -99
  49. package/fesm2022/cute-widgets-base-datepicker.mjs.map +1 -1
  50. package/fesm2022/cute-widgets-base-dialog.mjs +31 -31
  51. package/fesm2022/cute-widgets-base-dialog.mjs.map +1 -1
  52. package/fesm2022/cute-widgets-base-divider.mjs +7 -7
  53. package/fesm2022/cute-widgets-base-divider.mjs.map +1 -1
  54. package/fesm2022/cute-widgets-base-expansion.mjs +27 -27
  55. package/fesm2022/cute-widgets-base-expansion.mjs.map +1 -1
  56. package/fesm2022/cute-widgets-base-form-field.mjs +28 -28
  57. package/fesm2022/cute-widgets-base-form-field.mjs.map +1 -1
  58. package/fesm2022/cute-widgets-base-grid-list.mjs +22 -22
  59. package/fesm2022/cute-widgets-base-grid-list.mjs.map +1 -1
  60. package/fesm2022/cute-widgets-base-icon.mjs +10 -10
  61. package/fesm2022/cute-widgets-base-icon.mjs.map +1 -1
  62. package/fesm2022/cute-widgets-base-input.mjs +7 -7
  63. package/fesm2022/cute-widgets-base-input.mjs.map +1 -1
  64. package/fesm2022/cute-widgets-base-layout-container.mjs +10 -10
  65. package/fesm2022/cute-widgets-base-layout-container.mjs.map +1 -1
  66. package/fesm2022/cute-widgets-base-layout-stack.mjs +13 -13
  67. package/fesm2022/cute-widgets-base-layout-stack.mjs.map +1 -1
  68. package/fesm2022/cute-widgets-base-layout.mjs +23 -23
  69. package/fesm2022/cute-widgets-base-layout.mjs.map +1 -1
  70. package/fesm2022/cute-widgets-base-list.mjs +56 -56
  71. package/fesm2022/cute-widgets-base-list.mjs.map +1 -1
  72. package/fesm2022/cute-widgets-base-menu.mjs +579 -364
  73. package/fesm2022/cute-widgets-base-menu.mjs.map +1 -1
  74. package/fesm2022/cute-widgets-base-navbar.mjs +27 -27
  75. package/fesm2022/cute-widgets-base-navbar.mjs.map +1 -1
  76. package/fesm2022/cute-widgets-base-paginator.mjs +11 -11
  77. package/fesm2022/cute-widgets-base-paginator.mjs.map +1 -1
  78. package/fesm2022/cute-widgets-base-progress.mjs +10 -10
  79. package/fesm2022/cute-widgets-base-progress.mjs.map +1 -1
  80. package/fesm2022/cute-widgets-base-radio.mjs +11 -11
  81. package/fesm2022/cute-widgets-base-radio.mjs.map +1 -1
  82. package/fesm2022/cute-widgets-base-select.mjs +11 -11
  83. package/fesm2022/cute-widgets-base-select.mjs.map +1 -1
  84. package/fesm2022/cute-widgets-base-sidenav.mjs +26 -26
  85. package/fesm2022/cute-widgets-base-sidenav.mjs.map +1 -1
  86. package/fesm2022/cute-widgets-base-slider.mjs +10 -10
  87. package/fesm2022/cute-widgets-base-slider.mjs.map +1 -1
  88. package/fesm2022/cute-widgets-base-snack-bar.mjs +28 -28
  89. package/fesm2022/cute-widgets-base-snack-bar.mjs.map +1 -1
  90. package/fesm2022/cute-widgets-base-sort.mjs +13 -13
  91. package/fesm2022/cute-widgets-base-sort.mjs.map +1 -1
  92. package/fesm2022/cute-widgets-base-spinner.mjs +8 -8
  93. package/fesm2022/cute-widgets-base-spinner.mjs.map +1 -1
  94. package/fesm2022/cute-widgets-base-stepper.mjs +40 -40
  95. package/fesm2022/cute-widgets-base-stepper.mjs.map +1 -1
  96. package/fesm2022/cute-widgets-base-table.mjs +58 -66
  97. package/fesm2022/cute-widgets-base-table.mjs.map +1 -1
  98. package/fesm2022/cute-widgets-base-tabs.mjs +16 -16
  99. package/fesm2022/cute-widgets-base-tabs.mjs.map +1 -1
  100. package/fesm2022/cute-widgets-base-timepicker.mjs +34 -63
  101. package/fesm2022/cute-widgets-base-timepicker.mjs.map +1 -1
  102. package/fesm2022/cute-widgets-base-toolbar.mjs +13 -13
  103. package/fesm2022/cute-widgets-base-toolbar.mjs.map +1 -1
  104. package/fesm2022/cute-widgets-base-tooltip.mjs +10 -10
  105. package/fesm2022/cute-widgets-base-tooltip.mjs.map +1 -1
  106. package/fesm2022/cute-widgets-base-tree.mjs +25 -25
  107. package/fesm2022/cute-widgets-base-tree.mjs.map +1 -1
  108. package/fesm2022/cute-widgets-base.mjs +4 -4
  109. package/package.json +118 -118
  110. package/{abstract/index.d.ts → types/cute-widgets-base-abstract.d.ts} +1 -1
  111. package/{autocomplete/index.d.ts → types/cute-widgets-base-autocomplete.d.ts} +2 -2
  112. package/{badge/index.d.ts → types/cute-widgets-base-badge.d.ts} +6 -5
  113. package/{bottom-sheet/index.d.ts → types/cute-widgets-base-bottom-sheet.d.ts} +1 -1
  114. package/{button-toggle/index.d.ts → types/cute-widgets-base-button-toggle.d.ts} +7 -1
  115. package/{button/index.d.ts → types/cute-widgets-base-button.d.ts} +1 -1
  116. package/{checkbox/index.d.ts → types/cute-widgets-base-checkbox.d.ts} +1 -1
  117. package/{chips/index.d.ts → types/cute-widgets-base-chips.d.ts} +1 -1
  118. package/{core/nav/index.d.ts → types/cute-widgets-base-core-nav.d.ts} +2 -1
  119. package/{core/observers/index.d.ts → types/cute-widgets-base-core-observers.d.ts} +1 -1
  120. package/{core/option/index.d.ts → types/cute-widgets-base-core-option.d.ts} +1 -1
  121. package/{datepicker/index.d.ts → types/cute-widgets-base-datepicker.d.ts} +2 -2
  122. package/{expansion/index.d.ts → types/cute-widgets-base-expansion.d.ts} +4 -14
  123. package/{form-field/index.d.ts → types/cute-widgets-base-form-field.d.ts} +1 -1
  124. package/{icon/index.d.ts → types/cute-widgets-base-icon.d.ts} +1 -1
  125. package/{input/index.d.ts → types/cute-widgets-base-input.d.ts} +1 -1
  126. package/{menu/index.d.ts → types/cute-widgets-base-menu.d.ts} +202 -121
  127. package/{progress/index.d.ts → types/cute-widgets-base-progress.d.ts} +1 -1
  128. package/{radio/index.d.ts → types/cute-widgets-base-radio.d.ts} +2 -2
  129. package/{sidenav/index.d.ts → types/cute-widgets-base-sidenav.d.ts} +1 -1
  130. package/{snack-bar/index.d.ts → types/cute-widgets-base-snack-bar.d.ts} +1 -1
  131. package/{sort/index.d.ts → types/cute-widgets-base-sort.d.ts} +1 -1
  132. package/{table/index.d.ts → types/cute-widgets-base-table.d.ts} +1 -1
  133. package/{tree/index.d.ts → types/cute-widgets-base-tree.d.ts} +2 -2
  134. /package/{alert/index.d.ts → types/cute-widgets-base-alert.d.ts} +0 -0
  135. /package/{card/index.d.ts → types/cute-widgets-base-card.d.ts} +0 -0
  136. /package/{collapse/index.d.ts → types/cute-widgets-base-collapse.d.ts} +0 -0
  137. /package/{core/animation/index.d.ts → types/cute-widgets-base-core-animation.d.ts} +0 -0
  138. /package/{core/datetime/index.d.ts → types/cute-widgets-base-core-datetime.d.ts} +0 -0
  139. /package/{core/directives/index.d.ts → types/cute-widgets-base-core-directives.d.ts} +0 -0
  140. /package/{core/error/index.d.ts → types/cute-widgets-base-core-error.d.ts} +0 -0
  141. /package/{core/interfaces/index.d.ts → types/cute-widgets-base-core-interfaces.d.ts} +0 -0
  142. /package/{core/layout/index.d.ts → types/cute-widgets-base-core-layout.d.ts} +0 -0
  143. /package/{core/line/index.d.ts → types/cute-widgets-base-core-line.d.ts} +0 -0
  144. /package/{core/pipes/index.d.ts → types/cute-widgets-base-core-pipes.d.ts} +0 -0
  145. /package/{core/ripple/index.d.ts → types/cute-widgets-base-core-ripple.d.ts} +0 -0
  146. /package/{core/testing/index.d.ts → types/cute-widgets-base-core-testing.d.ts} +0 -0
  147. /package/{core/theming/index.d.ts → types/cute-widgets-base-core-theming.d.ts} +0 -0
  148. /package/{core/types/index.d.ts → types/cute-widgets-base-core-types.d.ts} +0 -0
  149. /package/{core/utils/index.d.ts → types/cute-widgets-base-core-utils.d.ts} +0 -0
  150. /package/{core/index.d.ts → types/cute-widgets-base-core.d.ts} +0 -0
  151. /package/{dialog/index.d.ts → types/cute-widgets-base-dialog.d.ts} +0 -0
  152. /package/{divider/index.d.ts → types/cute-widgets-base-divider.d.ts} +0 -0
  153. /package/{grid-list/index.d.ts → types/cute-widgets-base-grid-list.d.ts} +0 -0
  154. /package/{layout/container/index.d.ts → types/cute-widgets-base-layout-container.d.ts} +0 -0
  155. /package/{layout/stack/index.d.ts → types/cute-widgets-base-layout-stack.d.ts} +0 -0
  156. /package/{layout/index.d.ts → types/cute-widgets-base-layout.d.ts} +0 -0
  157. /package/{list/index.d.ts → types/cute-widgets-base-list.d.ts} +0 -0
  158. /package/{navbar/index.d.ts → types/cute-widgets-base-navbar.d.ts} +0 -0
  159. /package/{paginator/index.d.ts → types/cute-widgets-base-paginator.d.ts} +0 -0
  160. /package/{select/index.d.ts → types/cute-widgets-base-select.d.ts} +0 -0
  161. /package/{slider/index.d.ts → types/cute-widgets-base-slider.d.ts} +0 -0
  162. /package/{spinner/index.d.ts → types/cute-widgets-base-spinner.d.ts} +0 -0
  163. /package/{stepper/index.d.ts → types/cute-widgets-base-stepper.d.ts} +0 -0
  164. /package/{tabs/index.d.ts → types/cute-widgets-base-tabs.d.ts} +0 -0
  165. /package/{timepicker/index.d.ts → types/cute-widgets-base-timepicker.d.ts} +0 -0
  166. /package/{toolbar/index.d.ts → types/cute-widgets-base-toolbar.d.ts} +0 -0
  167. /package/{tooltip/index.d.ts → types/cute-widgets-base-tooltip.d.ts} +0 -0
  168. /package/{index.d.ts → types/cute-widgets-base.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cute-widgets-base-core-option.mjs","sources":["../../../../projects/cute-widgets/base/core/option/src/option-parent.interface.ts","../../../../projects/cute-widgets/base/core/option/src/optgroup.component.ts","../../../../projects/cute-widgets/base/core/option/src/optgroup.component.html","../../../../projects/cute-widgets/base/core/option/src/option.component.ts","../../../../projects/cute-widgets/base/core/option/src/option.component.html","../../../../projects/cute-widgets/base/core/option/src/option.module.ts","../../../../projects/cute-widgets/base/core/option/cute-widgets-base-core-option.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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {InjectionToken, Signal} from '@angular/core';\r\n\r\n/**\r\n * Describes a parent component that manages a list of options.\r\n * Contains properties that the options can inherit.\r\n */\r\nexport interface CuteOptionParentComponent {\r\n disableRipple?: boolean| Signal<boolean>;\r\n multiple?: boolean;\r\n inertGroups?: boolean;\r\n hideSingleSelectionIndicator?: boolean;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent component to options.\r\n */\r\nexport const CUTE_OPTION_PARENT_COMPONENT = new InjectionToken<CuteOptionParentComponent>(\r\n 'CUTE_OPTION_PARENT_COMPONENT',\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n Input,\r\n InjectionToken,\r\n booleanAttribute, inject,\r\n} from '@angular/core';\r\nimport {CuteOptionParentComponent, CUTE_OPTION_PARENT_COMPONENT} from './option-parent.interface';\r\n\r\n// Notes on the accessibility pattern used for `cute-optgroup`.\r\n// The option group has two different \"modes\": regular and inert. The regular mode uses the\r\n// recommended a11y pattern which has `role=\"group\"` on the group element with `aria-labelledby`\r\n// pointing to the label. This works for `cute-select`, but it seems to hit a bug for autocomplete\r\n// under VoiceOver where the group doesn't get read out at all. The bug appears to be that if\r\n// there's __any__ a11y-related attribute on the group (e.g. `role` or `aria-labelledby`),\r\n// VoiceOver on Safari won't read it out.\r\n// We've introduced the `inert` mode as a workaround. Under this mode, all a11y attributes are\r\n// removed from the group, and we get the screen reader to read out the group label by mirroring it\r\n// inside an invisible element in the option. This is suboptimal, because the screen reader will\r\n// repeat the group label on each navigation, whereas the default pattern only reads the group when\r\n// the user enters a new group. The following alternate approaches were considered:\r\n// 1. Reading out the group label using the `LiveAnnouncer` solves the problem, but we can't control\r\n// when the text will be read out, so sometimes it comes in too late or never if the user\r\n// navigates quickly.\r\n// 2. `<cute-option aria-describedby=\"groupLabel\"` - This works on Safari, but VoiceOver in Chrome\r\n// won't read out the description at all.\r\n// 3. `<cute-option aria-labelledby=\"optionLabel groupLabel\"` - This works on Chrome, but Safari\r\n// doesn't read out the text at all. Furthermore, on\r\n\r\n// Counter for unique group ids.\r\nlet _uniqueOptgroupIdCounter = 0;\r\n\r\n/**\r\n * Injection token that can be used to reference instances of `CuteOptgroup`. It serves as\r\n * an alternative token to the actual `CuteOptgroup` class which could cause unnecessary\r\n * retention of the class and its component metadata.\r\n */\r\nexport const CUTE_OPTGROUP = new InjectionToken<CuteOptgroup>('CuteOptgroup');\r\n\r\n/**\r\n * Component that is used to group instances of `mat-option`.\r\n */\r\n@Component({\r\n selector: 'cute-optgroup',\r\n exportAs: 'cuteOptgroup',\r\n templateUrl: './optgroup.component.html',\r\n styleUrls: ['./optgroup.component.scss'],\r\n host: {\r\n 'class': 'cute-optgroup',\r\n '[attr.role]': '_inert ? null : \"group\"',\r\n '[attr.aria-disabled]': '_inert ? null : disabled',\r\n '[attr.aria-labelledby]': '_inert ? null : _labelId',\r\n },\r\n providers: [{provide: CUTE_OPTGROUP, useExisting: CuteOptgroup}],\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteOptgroup {\r\n /** Label for the option group. */\r\n @Input() label: string | undefined;\r\n\r\n /** whether the option group is disabled. */\r\n @Input({transform: booleanAttribute}) disabled: boolean = false;\r\n\r\n /** Unique id for the underlying label. */\r\n _labelId: string = `cute-optgroup-label-${_uniqueOptgroupIdCounter++}`;\r\n\r\n /** Whether the group is in inert a11y mode. */\r\n _inert: boolean;\r\n\r\n constructor(...args: unknown[]);\r\n constructor() {\r\n const parent = inject<CuteOptionParentComponent>(CUTE_OPTION_PARENT_COMPONENT, {optional: true});\r\n this._inert = parent?.inertGroups ?? false;\r\n }\r\n}\r\n","<span\r\n class=\"cute-optgroup-label\"\r\n role=\"presentation\"\r\n [class.disabled]=\"disabled\"\r\n [id]=\"_labelId\">\r\n <span class=\"cute-list-item__primary-text\">{{ label }} <ng-content></ng-content></span>\r\n</span>\r\n\r\n<ng-content select=\"cute-option, ng-container\"></ng-content>\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {ENTER, hasModifierKey, SPACE} from '@angular/cdk/keycodes';\r\nimport {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n ElementRef,\r\n AfterViewChecked,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n QueryList,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport {Subject} from 'rxjs';\r\nimport {CUTE_OPTGROUP, CuteOptgroup} from './optgroup.component';\r\nimport {CuteOptionParentComponent, CUTE_OPTION_PARENT_COMPONENT} from './option-parent.interface';\r\nimport {CuteFocusableControl} from \"@cute-widgets/base/abstract\";\r\nimport {Highlightable} from \"@angular/cdk/a11y\";\r\nimport {toTextBgCssClass} from \"@cute-widgets/base/core/theming\";\r\n\r\n\r\n/**\r\n * Option IDs need to be unique across components, so this counter exists outside\r\n * the component definition.\r\n */\r\nlet _uniqueIdCounter = 0;\r\n\r\n/** Event object emitted by CuteOption when selected or deselected. */\r\nexport class CuteOptionSelectionChange<T = any> {\r\n constructor(\r\n /** Reference to the option that emitted the event. */\r\n public source: CuteOption<T>,\r\n /** Whether the change in the option's value was a result of a user action. */\r\n public isUserInput = false,\r\n ) {}\r\n}\r\n\r\n/**\r\n * Single option inside a `<cute-select>` element.\r\n */\r\n@Component({\r\n selector: 'cute-option',\r\n templateUrl: './option.component.html',\r\n styleUrls: ['./option.component.scss'],\r\n exportAs: 'cuteOption',\r\n host: {\r\n 'role': 'option',\r\n 'class': 'cute-option ',\r\n //'[class]': 'selected ? \"text-bg-\"+(color ? color : \"primary\") : \"\" ',\r\n '[class]': 'selected ? toTextBgCssClass(color??\"primary\") : undefined',\r\n '[class.selected]': 'selected',\r\n '[class.multiple]': 'multiple',\r\n '[class.active]': 'active',\r\n '[class.disabled]': 'disabled',\r\n '[id]': 'id',\r\n '[tabindex]': 'disabled ? -1 : 0',\r\n // Set aria-selected to false for non-selected items and true for selected items. Conform to\r\n // [WAI ARIA Listbox authoring practices guide](\r\n // https://www.w3.org/WAI/ARIA/apg/patterns/listbox/), \"If any options are selected, each\r\n // selected option has either aria-selected or aria-checked set to true. All options that are\r\n // selectable but not selected have either aria-selected or aria-checked set to false.\" Align\r\n // aria-selected implementation of Chips and List components.\r\n //\r\n // Set `aria-selected=\"false\"` on not-selected listbox options to fix VoiceOver announcing\r\n // every option as \"selected\" (#21491).\r\n '[attr.aria-selected]': 'selected',\r\n '[attr.aria-disabled]': 'disabled',\r\n '(click)': '_selectViaInteraction()',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteOption<T = any> extends CuteFocusableControl implements Highlightable, AfterViewChecked {\r\n private _parent = inject<CuteOptionParentComponent>(CUTE_OPTION_PARENT_COMPONENT, {optional: true});\r\n public readonly group = inject<CuteOptgroup>(CUTE_OPTGROUP, {optional: true});\r\n\r\n private _selected = false;\r\n private _active = false;\r\n private _mostRecentViewValue = '';\r\n\r\n /** Whether the wrapping component is in multiple selection mode. */\r\n get multiple() {\r\n return this._parent && this._parent.multiple;\r\n }\r\n\r\n /** Whether the option is currently selected. */\r\n get selected(): boolean {\r\n return this._selected;\r\n }\r\n\r\n /** Whether ripples for the option are disabled. */\r\n get disableRipple(): boolean {\r\n return !!(this._parent && this._parent.disableRipple);\r\n }\r\n\r\n /** Whether to display checkmark for single-selection. */\r\n get hideSingleSelectionIndicator(): boolean {\r\n return !!(this._parent && this._parent.hideSingleSelectionIndicator);\r\n }\r\n\r\n protected override getDisabledState(): boolean {\r\n return (this.group && this.group.disabled) || super.getDisabledState();\r\n }\r\n\r\n protected override generateId(): string {\r\n return `cute-option-${_uniqueIdCounter++}`;;\r\n }\r\n\r\n /** The form value of the option. */\r\n @Input() value: T | undefined;\r\n\r\n /** Event emitted when the option is selected or deselected. */\r\n @Output() readonly onSelectionChange = new EventEmitter<CuteOptionSelectionChange<T>>();\r\n\r\n /** Element containing the option's text. */\r\n @ViewChild('text', {static: true}) _text: ElementRef<HTMLElement> | undefined;\r\n\r\n /** Emits when the state of the option changes and any parents have to be notified. */\r\n readonly _stateChanges = new Subject<void>();\r\n\r\n constructor(...args: unknown[]);\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Whether the option is currently active and ready to be selected.\r\n * An active option displays styles, as if it is focused, but the\r\n * focus is actually retained somewhere else. This comes in handy\r\n * for components like autocomplete where focus must remain on the input.\r\n */\r\n get active(): boolean {\r\n return this._active;\r\n }\r\n\r\n /**\r\n * The displayed value of the option. It is necessary to show the selected option in the\r\n * select's trigger.\r\n */\r\n get viewValue(): string {\r\n // TODO(kara): Add input property alternative for node envs.\r\n return (this._text?.nativeElement.textContent || '').trim();\r\n }\r\n\r\n /** Selects the option. */\r\n select(emitEvent = true): void {\r\n if (!this._selected) {\r\n this._selected = true;\r\n this.markForCheck();\r\n\r\n if (emitEvent) {\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n /** Deselects the option. */\r\n deselect(emitEvent = true): void {\r\n if (this._selected) {\r\n this._selected = false;\r\n this.markForCheck();\r\n\r\n if (emitEvent) {\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This method sets display styles on the option to make it appear\r\n * active. This is used by the ActiveDescendantKeyManager so key\r\n * events will display the proper options as active on arrow key events.\r\n */\r\n setActiveStyles(): void {\r\n if (!this._active) {\r\n this._active = true;\r\n this.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * This method removes display styles on the option that made it appear\r\n * active. This is used by the ActiveDescendantKeyManager so key\r\n * events will display the proper options as active on arrow key events.\r\n */\r\n setInactiveStyles(): void {\r\n if (this._active) {\r\n this._active = false;\r\n this.markForCheck();\r\n }\r\n }\r\n\r\n /** Gets the label to be used when determining whether the option should be focused. */\r\n override getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /** Ensures the option is selected when activated from the keyboard. */\r\n protected _handleKeydown(event: KeyboardEvent): void {\r\n if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {\r\n this._selectViaInteraction();\r\n\r\n // Prevent the page from scrolling down and form submits.\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Selects the option while indicating the selection came from the user. Used to\r\n * determine if the select's view -> model callback should be invoked.\r\n * Used by `CuteSelect` component.\r\n */\r\n public _selectViaInteraction(): void {\r\n if (!this.disabled) {\r\n this._selected = this.multiple ? !this._selected : true;\r\n this.markForCheck();\r\n this._emitSelectionChangeEvent(true);\r\n }\r\n }\r\n\r\n /** Gets the host DOM element. */\r\n _getHostElement(): HTMLElement {\r\n return this._elementRef.nativeElement;\r\n }\r\n\r\n ngAfterViewChecked() {\r\n // Since parent components could be using the option's label to display the selected values\r\n // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed,\r\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\r\n // relatively cheap, however; we still limit them only to selected options in order to avoid\r\n // hitting the DOM too often.\r\n if (this._selected) {\r\n const viewValue = this.viewValue;\r\n\r\n if (viewValue !== this._mostRecentViewValue) {\r\n if (this._mostRecentViewValue) {\r\n this._stateChanges.next();\r\n }\r\n this._mostRecentViewValue = viewValue;\r\n }\r\n }\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n this._stateChanges.complete();\r\n }\r\n\r\n /** Emits the selection change event. */\r\n private _emitSelectionChangeEvent(isUserInput = false): void {\r\n this.onSelectionChange.emit(new CuteOptionSelectionChange<T>(this, isUserInput));\r\n }\r\n\r\n protected readonly toTextBgCssClass = toTextBgCssClass;\r\n}\r\n\r\n/**\r\n * Counts the number of option group labels that precede the specified option.\r\n * @param optionIndex Index of the option at which to start counting.\r\n * @param options Flat list of all the options.\r\n * @param optionGroups Flat list of all the option groups.\r\n * @docs-private\r\n */\r\nexport function _countGroupLabelsBeforeOption(\r\n optionIndex: number,\r\n options: QueryList<CuteOption>,\r\n optionGroups: QueryList<CuteOptgroup>,\r\n): number {\r\n if (optionGroups.length) {\r\n let optionsArray = options.toArray();\r\n let groups = optionGroups.toArray();\r\n let groupCounter = 0;\r\n\r\n for (let i = 0; i < optionIndex + 1; i++) {\r\n if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {\r\n groupCounter++;\r\n }\r\n }\r\n\r\n return groupCounter;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Determines the position to which to scroll a panel in order for an option to be into view.\r\n * @param optionOffset Offset of the option from the top of the panel.\r\n * @param optionHeight Height of the options.\r\n * @param currentScrollPosition Current scroll position of the panel.\r\n * @param panelHeight Height of the panel.\r\n * @docs-private\r\n */\r\nexport function _getOptionScrollPosition(\r\n optionOffset: number,\r\n optionHeight: number,\r\n currentScrollPosition: number,\r\n panelHeight: number,\r\n): number {\r\n if (optionOffset < currentScrollPosition) {\r\n return optionOffset;\r\n }\r\n\r\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\r\n return Math.max(0, optionOffset - panelHeight + optionHeight);\r\n }\r\n\r\n return currentScrollPosition;\r\n}\r\n","\r\n<ng-content select=\"cute-icon, i, img, [role=img]\"></ng-content>\r\n\r\n<span class=\"cute-list-item__primary-text\" #text><ng-content></ng-content></span>\r\n","import {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteOption} from './option.component';\r\nimport {CuteOptgroup} from './optgroup.component';\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteOption,\r\n CuteOptgroup,\r\n];\r\n\r\n@NgModule({\r\n imports: [CommonModule, ...TYPES],\r\n exports: TYPES,\r\n declarations: [],\r\n})\r\nexport class CuteOptionModule {\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-option.mjs","sources":["../../../../projects/cute-widgets/base/core/option/src/option-parent.interface.ts","../../../../projects/cute-widgets/base/core/option/src/optgroup.component.ts","../../../../projects/cute-widgets/base/core/option/src/optgroup.component.html","../../../../projects/cute-widgets/base/core/option/src/option.component.ts","../../../../projects/cute-widgets/base/core/option/src/option.component.html","../../../../projects/cute-widgets/base/core/option/src/option.module.ts","../../../../projects/cute-widgets/base/core/option/cute-widgets-base-core-option.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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {InjectionToken, Signal} from '@angular/core';\r\n\r\n/**\r\n * Describes a parent component that manages a list of options.\r\n * Contains properties that the options can inherit.\r\n */\r\nexport interface CuteOptionParentComponent {\r\n disableRipple?: boolean| Signal<boolean>;\r\n multiple?: boolean;\r\n inertGroups?: boolean;\r\n hideSingleSelectionIndicator?: boolean;\r\n}\r\n\r\n/**\r\n * Injection token used to provide the parent component to options.\r\n */\r\nexport const CUTE_OPTION_PARENT_COMPONENT = new InjectionToken<CuteOptionParentComponent>(\r\n 'CUTE_OPTION_PARENT_COMPONENT',\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n Input,\r\n InjectionToken,\r\n booleanAttribute, inject,\r\n} from '@angular/core';\r\nimport {CuteOptionParentComponent, CUTE_OPTION_PARENT_COMPONENT} from './option-parent.interface';\r\n\r\n// Notes on the accessibility pattern used for `cute-optgroup`.\r\n// The option group has two different \"modes\": regular and inert. The regular mode uses the\r\n// recommended a11y pattern which has `role=\"group\"` on the group element with `aria-labelledby`\r\n// pointing to the label. This works for `cute-select`, but it seems to hit a bug for autocomplete\r\n// under VoiceOver where the group doesn't get read out at all. The bug appears to be that if\r\n// there's __any__ a11y-related attribute on the group (e.g. `role` or `aria-labelledby`),\r\n// VoiceOver on Safari won't read it out.\r\n// We've introduced the `inert` mode as a workaround. Under this mode, all a11y attributes are\r\n// removed from the group, and we get the screen reader to read out the group label by mirroring it\r\n// inside an invisible element in the option. This is suboptimal, because the screen reader will\r\n// repeat the group label on each navigation, whereas the default pattern only reads the group when\r\n// the user enters a new group. The following alternate approaches were considered:\r\n// 1. Reading out the group label using the `LiveAnnouncer` solves the problem, but we can't control\r\n// when the text will be read out, so sometimes it comes in too late or never if the user\r\n// navigates quickly.\r\n// 2. `<cute-option aria-describedby=\"groupLabel\"` - This works on Safari, but VoiceOver in Chrome\r\n// won't read out the description at all.\r\n// 3. `<cute-option aria-labelledby=\"optionLabel groupLabel\"` - This works on Chrome, but Safari\r\n// doesn't read out the text at all. Furthermore, on\r\n\r\n// Counter for unique group ids.\r\nlet _uniqueOptgroupIdCounter = 0;\r\n\r\n/**\r\n * Injection token that can be used to reference instances of `CuteOptgroup`. It serves as\r\n * an alternative token to the actual `CuteOptgroup` class which could cause unnecessary\r\n * retention of the class and its component metadata.\r\n */\r\nexport const CUTE_OPTGROUP = new InjectionToken<CuteOptgroup>('CuteOptgroup');\r\n\r\n/**\r\n * Component that is used to group instances of `mat-option`.\r\n */\r\n@Component({\r\n selector: 'cute-optgroup',\r\n exportAs: 'cuteOptgroup',\r\n templateUrl: './optgroup.component.html',\r\n styleUrls: ['./optgroup.component.scss'],\r\n host: {\r\n 'class': 'cute-optgroup',\r\n '[attr.role]': '_inert ? null : \"group\"',\r\n '[attr.aria-disabled]': '_inert ? null : disabled',\r\n '[attr.aria-labelledby]': '_inert ? null : _labelId',\r\n },\r\n providers: [{provide: CUTE_OPTGROUP, useExisting: CuteOptgroup}],\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteOptgroup {\r\n /** Label for the option group. */\r\n @Input() label: string | undefined;\r\n\r\n /** whether the option group is disabled. */\r\n @Input({transform: booleanAttribute}) disabled: boolean = false;\r\n\r\n /** Unique id for the underlying label. */\r\n _labelId: string = `cute-optgroup-label-${_uniqueOptgroupIdCounter++}`;\r\n\r\n /** Whether the group is in inert a11y mode. */\r\n _inert: boolean;\r\n\r\n constructor(...args: unknown[]);\r\n constructor() {\r\n const parent = inject<CuteOptionParentComponent>(CUTE_OPTION_PARENT_COMPONENT, {optional: true});\r\n this._inert = parent?.inertGroups ?? false;\r\n }\r\n}\r\n","<span\r\n class=\"cute-optgroup-label\"\r\n role=\"presentation\"\r\n [class.disabled]=\"disabled\"\r\n [id]=\"_labelId\">\r\n <span class=\"cute-list-item__primary-text\">{{ label }} <ng-content></ng-content></span>\r\n</span>\r\n\r\n<ng-content select=\"cute-option, ng-container\"></ng-content>\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {ENTER, hasModifierKey, SPACE} from '@angular/cdk/keycodes';\r\nimport {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n ElementRef,\r\n AfterViewChecked,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n QueryList,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport {Subject} from 'rxjs';\r\nimport {CUTE_OPTGROUP, CuteOptgroup} from './optgroup.component';\r\nimport {CuteOptionParentComponent, CUTE_OPTION_PARENT_COMPONENT} from './option-parent.interface';\r\nimport {CuteFocusableControl} from \"@cute-widgets/base/abstract\";\r\nimport {Highlightable} from \"@angular/cdk/a11y\";\r\nimport {toTextBgCssClass} from \"@cute-widgets/base/core/theming\";\r\n\r\n\r\n/**\r\n * Option IDs need to be unique across components, so this counter exists outside\r\n * the component definition.\r\n */\r\nlet _uniqueIdCounter = 0;\r\n\r\n/** Event object emitted by CuteOption when selected or deselected. */\r\nexport class CuteOptionSelectionChange<T = any> {\r\n constructor(\r\n /** Reference to the option that emitted the event. */\r\n public source: CuteOption<T>,\r\n /** Whether the change in the option's value was a result of a user action. */\r\n public isUserInput = false,\r\n ) {}\r\n}\r\n\r\n/**\r\n * Single option inside a `<cute-select>` element.\r\n */\r\n@Component({\r\n selector: 'cute-option',\r\n templateUrl: './option.component.html',\r\n styleUrls: ['./option.component.scss'],\r\n exportAs: 'cuteOption',\r\n host: {\r\n 'role': 'option',\r\n 'class': 'cute-option ',\r\n //'[class]': 'selected ? \"text-bg-\"+(color ? color : \"primary\") : \"\" ',\r\n '[class]': 'selected ? toTextBgCssClass(color??\"primary\") : undefined',\r\n '[class.selected]': 'selected',\r\n '[class.multiple]': 'multiple',\r\n '[class.active]': 'active',\r\n '[class.disabled]': 'disabled',\r\n '[id]': 'id',\r\n '[tabindex]': 'disabled ? -1 : 0',\r\n // Set aria-selected to false for non-selected items and true for selected items. Conform to\r\n // [WAI ARIA Listbox authoring practices guide](\r\n // https://www.w3.org/WAI/ARIA/apg/patterns/listbox/), \"If any options are selected, each\r\n // selected option has either aria-selected or aria-checked set to true. All options that are\r\n // selectable but not selected have either aria-selected or aria-checked set to false.\" Align\r\n // aria-selected implementation of Chips and List components.\r\n //\r\n // Set `aria-selected=\"false\"` on not-selected listbox options to fix VoiceOver announcing\r\n // every option as \"selected\" (#21491).\r\n '[attr.aria-selected]': 'selected',\r\n '[attr.aria-disabled]': 'disabled',\r\n '(click)': '_selectViaInteraction()',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CuteOption<T = any> extends CuteFocusableControl implements Highlightable, AfterViewChecked {\r\n private _parent = inject<CuteOptionParentComponent>(CUTE_OPTION_PARENT_COMPONENT, {optional: true});\r\n public readonly group = inject<CuteOptgroup>(CUTE_OPTGROUP, {optional: true});\r\n\r\n private _selected = false;\r\n private _active = false;\r\n private _mostRecentViewValue = '';\r\n\r\n /** Whether the wrapping component is in multiple selection mode. */\r\n get multiple() {\r\n return this._parent && this._parent.multiple;\r\n }\r\n\r\n /** Whether the option is currently selected. */\r\n get selected(): boolean {\r\n return this._selected;\r\n }\r\n\r\n /** Whether ripples for the option are disabled. */\r\n get disableRipple(): boolean {\r\n return !!(this._parent && this._parent.disableRipple);\r\n }\r\n\r\n /** Whether to display checkmark for single-selection. */\r\n get hideSingleSelectionIndicator(): boolean {\r\n return !!(this._parent && this._parent.hideSingleSelectionIndicator);\r\n }\r\n\r\n protected override getDisabledState(): boolean {\r\n return (this.group && this.group.disabled) || super.getDisabledState();\r\n }\r\n\r\n protected override generateId(): string {\r\n return `cute-option-${_uniqueIdCounter++}`;;\r\n }\r\n\r\n /** The form value of the option. */\r\n @Input() value: T | undefined;\r\n\r\n /** Event emitted when the option is selected or deselected. */\r\n @Output() readonly onSelectionChange = new EventEmitter<CuteOptionSelectionChange<T>>();\r\n\r\n /** Element containing the option's text. */\r\n @ViewChild('text', {static: true}) _text: ElementRef<HTMLElement> | undefined;\r\n\r\n /** Emits when the state of the option changes and any parents have to be notified. */\r\n readonly _stateChanges = new Subject<void>();\r\n\r\n constructor(...args: unknown[]);\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n * Whether the option is currently active and ready to be selected.\r\n * An active option displays styles, as if it is focused, but the\r\n * focus is actually retained somewhere else. This comes in handy\r\n * for components like autocomplete where focus must remain on the input.\r\n */\r\n get active(): boolean {\r\n return this._active;\r\n }\r\n\r\n /**\r\n * The displayed value of the option. It is necessary to show the selected option in the\r\n * select's trigger.\r\n */\r\n get viewValue(): string {\r\n // TODO(kara): Add input property alternative for node envs.\r\n return (this._text?.nativeElement.textContent || '').trim();\r\n }\r\n\r\n /** Selects the option. */\r\n select(emitEvent = true): void {\r\n if (!this._selected) {\r\n this._selected = true;\r\n this.markForCheck();\r\n\r\n if (emitEvent) {\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n /** Deselects the option. */\r\n deselect(emitEvent = true): void {\r\n if (this._selected) {\r\n this._selected = false;\r\n this.markForCheck();\r\n\r\n if (emitEvent) {\r\n this._emitSelectionChangeEvent();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This method sets display styles on the option to make it appear\r\n * active. This is used by the ActiveDescendantKeyManager so key\r\n * events will display the proper options as active on arrow key events.\r\n */\r\n setActiveStyles(): void {\r\n if (!this._active) {\r\n this._active = true;\r\n this.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * This method removes display styles on the option that made it appear\r\n * active. This is used by the ActiveDescendantKeyManager so key\r\n * events will display the proper options as active on arrow key events.\r\n */\r\n setInactiveStyles(): void {\r\n if (this._active) {\r\n this._active = false;\r\n this.markForCheck();\r\n }\r\n }\r\n\r\n /** Gets the label to be used when determining whether the option should be focused. */\r\n override getLabel(): string {\r\n return this.viewValue;\r\n }\r\n\r\n /** Ensures the option is selected when activated from the keyboard. */\r\n protected _handleKeydown(event: KeyboardEvent): void {\r\n if ((event.keyCode === ENTER || event.keyCode === SPACE) && !hasModifierKey(event)) {\r\n this._selectViaInteraction();\r\n\r\n // Prevent the page from scrolling down and form submits.\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Selects the option while indicating the selection came from the user. Used to\r\n * determine if the select's view -> model callback should be invoked.\r\n * Used by `CuteSelect` component.\r\n */\r\n public _selectViaInteraction(): void {\r\n if (!this.disabled) {\r\n this._selected = this.multiple ? !this._selected : true;\r\n this.markForCheck();\r\n this._emitSelectionChangeEvent(true);\r\n }\r\n }\r\n\r\n /** Gets the host DOM element. */\r\n _getHostElement(): HTMLElement {\r\n return this._elementRef.nativeElement;\r\n }\r\n\r\n ngAfterViewChecked() {\r\n // Since parent components could be using the option's label to display the selected values\r\n // (e.g. `mat-select`) and they don't have a way of knowing if the option's label has changed,\r\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\r\n // relatively cheap, however; we still limit them only to selected options in order to avoid\r\n // hitting the DOM too often.\r\n if (this._selected) {\r\n const viewValue = this.viewValue;\r\n\r\n if (viewValue !== this._mostRecentViewValue) {\r\n if (this._mostRecentViewValue) {\r\n this._stateChanges.next();\r\n }\r\n this._mostRecentViewValue = viewValue;\r\n }\r\n }\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n this._stateChanges.complete();\r\n }\r\n\r\n /** Emits the selection change event. */\r\n private _emitSelectionChangeEvent(isUserInput = false): void {\r\n this.onSelectionChange.emit(new CuteOptionSelectionChange<T>(this, isUserInput));\r\n }\r\n\r\n protected readonly toTextBgCssClass = toTextBgCssClass;\r\n}\r\n\r\n/**\r\n * Counts the number of option group labels that precede the specified option.\r\n * @param optionIndex Index of the option at which to start counting.\r\n * @param options Flat list of all the options.\r\n * @param optionGroups Flat list of all the option groups.\r\n * @docs-private\r\n */\r\nexport function _countGroupLabelsBeforeOption(\r\n optionIndex: number,\r\n options: QueryList<CuteOption>,\r\n optionGroups: QueryList<CuteOptgroup>,\r\n): number {\r\n if (optionGroups.length) {\r\n let optionsArray = options.toArray();\r\n let groups = optionGroups.toArray();\r\n let groupCounter = 0;\r\n\r\n for (let i = 0; i < optionIndex + 1; i++) {\r\n if (optionsArray[i].group && optionsArray[i].group === groups[groupCounter]) {\r\n groupCounter++;\r\n }\r\n }\r\n\r\n return groupCounter;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Determines the position to which to scroll a panel in order for an option to be into view.\r\n * @param optionOffset Offset of the option from the top of the panel.\r\n * @param optionHeight Height of the options.\r\n * @param currentScrollPosition Current scroll position of the panel.\r\n * @param panelHeight Height of the panel.\r\n * @docs-private\r\n */\r\nexport function _getOptionScrollPosition(\r\n optionOffset: number,\r\n optionHeight: number,\r\n currentScrollPosition: number,\r\n panelHeight: number,\r\n): number {\r\n if (optionOffset < currentScrollPosition) {\r\n return optionOffset;\r\n }\r\n\r\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\r\n return Math.max(0, optionOffset - panelHeight + optionHeight);\r\n }\r\n\r\n return currentScrollPosition;\r\n}\r\n","\r\n<ng-content select=\"cute-icon, i, img, [role=img]\"></ng-content>\r\n\r\n<span class=\"cute-list-item__primary-text\" #text><ng-content></ng-content></span>\r\n","import {NgModule, Type} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {CuteOption} from './option.component';\r\nimport {CuteOptgroup} from './optgroup.component';\r\n\r\nconst TYPES: (any | Type<any>)[] = [\r\n CuteOption,\r\n CuteOptgroup,\r\n];\r\n\r\n@NgModule({\r\n imports: [CommonModule, ...TYPES],\r\n exports: TYPES,\r\n declarations: [],\r\n})\r\nexport class CuteOptionModule {\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -35,10 +35,10 @@ class CuteSafePipe {
35
35
  }
36
36
  return "";
37
37
  }
38
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSafePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
39
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: CuteSafePipe, isStandalone: true, name: "safe" }); }
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteSafePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
39
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: CuteSafePipe, isStandalone: true, name: "safe" }); }
40
40
  }
41
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSafePipe, decorators: [{
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteSafePipe, decorators: [{
42
42
  type: Pipe,
43
43
  args: [{
44
44
  name: 'safe'
@@ -79,10 +79,10 @@ class CuteSanitizePipe {
79
79
  }
80
80
  return "";
81
81
  }
82
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSanitizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
83
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: CuteSanitizePipe, isStandalone: true, name: "sanitize" }); }
82
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteSanitizePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
83
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: CuteSanitizePipe, isStandalone: true, name: "sanitize" }); }
84
84
  }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteSanitizePipe, decorators: [{
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteSanitizePipe, decorators: [{
86
86
  type: Pipe,
87
87
  args: [{
88
88
  name: 'sanitize'
@@ -1 +1 @@
1
- {"version":3,"file":"cute-widgets-base-core-pipes.mjs","sources":["../../../../projects/cute-widgets/base/core/pipes/src/safe.pipe.ts","../../../../projects/cute-widgets/base/core/pipes/src/sanitize.pipe.ts","../../../../projects/cute-widgets/base/core/pipes/cute-widgets-base-core-pipes.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 {inject, Pipe, PipeTransform} from '@angular/core';\r\nimport { DomSanitizer, SafeValue } from \"@angular/platform-browser\";\r\n\r\n/**\r\n * Bypass security and trust the given value to be a safe resource.\r\n * > WARNING: calling this method with untrusted user data exposes your application to XSS security risks!\r\n * @example\r\n * ```html\r\n * <img [src]=\"item.source | safe:'url'\" alt=\"Item image\"/>\r\n * ```\r\n */\r\n@Pipe({\r\n name: 'safe'\r\n})\r\nexport class CuteSafePipe implements PipeTransform {\r\n protected sanitizer: DomSanitizer = inject(DomSanitizer);\r\n\r\n transform(value: any, type: 'html'|'style'|'script'|'url'|'resourceUrl' = \"html\"): SafeValue {\r\n if (typeof value===\"string\") {\r\n switch (type.toLowerCase()) {\r\n case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);\r\n case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);\r\n case 'script': return this.sanitizer.bypassSecurityTrustScript(value);\r\n case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);\r\n case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n default: throw new Error(`Invalid safe type specified: ${type}`);\r\n }\r\n }\r\n return \"\";\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 {inject, Pipe, PipeTransform, SecurityContext} from '@angular/core';\r\nimport {DomSanitizer, SafeValue} from \"@angular/platform-browser\";\r\n\r\n/**\r\n * Gets a safe value from either a known safe value or a value with unknown safety.\r\n *\r\n * @example\r\n * ```html\r\n * <div [innerHTML]=\"item.htmlContent | sanitize:'html'\"></div>\r\n * ```\r\n */\r\n@Pipe({\r\n name: 'sanitize'\r\n})\r\nexport class CuteSanitizePipe implements PipeTransform {\r\n protected sanitizer: DomSanitizer = inject(DomSanitizer);\r\n\r\n transform(value: any, context: 'html'|'style'|'script'|'url'|'resourceUrl'|'none' = 'html'): SafeValue|null {\r\n if (typeof value===\"string\") {\r\n switch (context.toLowerCase()) {\r\n case 'html': return this.sanitizer.sanitize(SecurityContext.HTML, value);\r\n case 'style': return this.sanitizer.sanitize(SecurityContext.STYLE, value);\r\n case 'script': return this.sanitizer.sanitize(SecurityContext.SCRIPT, value);\r\n case 'url': return this.sanitizer.sanitize(SecurityContext.URL, value);\r\n case 'resourceUrl': return this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, value);\r\n case 'none': return this.sanitizer.sanitize(SecurityContext.NONE, value);\r\n default: throw new Error(`Invalid security context specified: ${context}`);\r\n }\r\n }\r\n return \"\";\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAAA;;;;;;;AAOG;AAIH;;;;;;;AAOG;MAIU,YAAY,CAAA;AAHzB,IAAA,WAAA,GAAA;AAIY,QAAA,IAAA,CAAA,SAAS,GAAiB,MAAM,CAAC,YAAY,CAAC;AAezD,IAAA;AAbC,IAAA,SAAS,CAAC,KAAU,EAAE,IAAA,GAAoD,MAAM,EAAA;AAC9E,QAAA,IAAI,OAAO,KAAK,KAAG,QAAQ,EAAE;AAC3B,YAAA,QAAQ,IAAI,CAAC,WAAW,EAAE;AACxB,gBAAA,KAAK,MAAM,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACjE,gBAAA,KAAK,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,KAAK,CAAC;AACnE,gBAAA,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC;AACrE,gBAAA,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAC/D,gBAAA,KAAK,aAAa,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,KAAK,CAAC;gBAC/E,SAAS,MAAM,IAAI,KAAK,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAC;;QAEpE;AACA,QAAA,OAAO,EAAE;IACX;+GAfW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE;AACP,iBAAA;;;ACrBD;;;;;;;AAOG;AAIH;;;;;;;AAOG;MAIU,gBAAgB,CAAA;AAH7B,IAAA,WAAA,GAAA;AAIY,QAAA,IAAA,CAAA,SAAS,GAAiB,MAAM,CAAC,YAAY,CAAC;AAgBzD,IAAA;AAdC,IAAA,SAAS,CAAC,KAAU,EAAE,OAAA,GAA8D,MAAM,EAAA;AACxF,QAAA,IAAI,OAAO,KAAK,KAAG,QAAQ,EAAE;AAC3B,YAAA,QAAQ,OAAO,CAAC,WAAW,EAAE;AAC3B,gBAAA,KAAK,MAAM,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;AACxE,gBAAA,KAAK,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1E,gBAAA,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;AAC5E,gBAAA,KAAK,KAAK,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;AACtE,gBAAA,KAAK,aAAa,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC;AACvF,gBAAA,KAAK,MAAM,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;gBACxE,SAAS,MAAM,IAAI,KAAK,CAAC,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAE,CAAC;;QAE9E;AACA,QAAA,OAAO,EAAE;IACX;+GAhBW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE;AACP,iBAAA;;;ACrBD;;AAEG;;;;"}
1
+ {"version":3,"file":"cute-widgets-base-core-pipes.mjs","sources":["../../../../projects/cute-widgets/base/core/pipes/src/safe.pipe.ts","../../../../projects/cute-widgets/base/core/pipes/src/sanitize.pipe.ts","../../../../projects/cute-widgets/base/core/pipes/cute-widgets-base-core-pipes.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 {inject, Pipe, PipeTransform} from '@angular/core';\r\nimport { DomSanitizer, SafeValue } from \"@angular/platform-browser\";\r\n\r\n/**\r\n * Bypass security and trust the given value to be a safe resource.\r\n * > WARNING: calling this method with untrusted user data exposes your application to XSS security risks!\r\n * @example\r\n * ```html\r\n * <img [src]=\"item.source | safe:'url'\" alt=\"Item image\"/>\r\n * ```\r\n */\r\n@Pipe({\r\n name: 'safe'\r\n})\r\nexport class CuteSafePipe implements PipeTransform {\r\n protected sanitizer: DomSanitizer = inject(DomSanitizer);\r\n\r\n transform(value: any, type: 'html'|'style'|'script'|'url'|'resourceUrl' = \"html\"): SafeValue {\r\n if (typeof value===\"string\") {\r\n switch (type.toLowerCase()) {\r\n case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);\r\n case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);\r\n case 'script': return this.sanitizer.bypassSecurityTrustScript(value);\r\n case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);\r\n case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n default: throw new Error(`Invalid safe type specified: ${type}`);\r\n }\r\n }\r\n return \"\";\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 {inject, Pipe, PipeTransform, SecurityContext} from '@angular/core';\r\nimport {DomSanitizer, SafeValue} from \"@angular/platform-browser\";\r\n\r\n/**\r\n * Gets a safe value from either a known safe value or a value with unknown safety.\r\n *\r\n * @example\r\n * ```html\r\n * <div [innerHTML]=\"item.htmlContent | sanitize:'html'\"></div>\r\n * ```\r\n */\r\n@Pipe({\r\n name: 'sanitize'\r\n})\r\nexport class CuteSanitizePipe implements PipeTransform {\r\n protected sanitizer: DomSanitizer = inject(DomSanitizer);\r\n\r\n transform(value: any, context: 'html'|'style'|'script'|'url'|'resourceUrl'|'none' = 'html'): SafeValue|null {\r\n if (typeof value===\"string\") {\r\n switch (context.toLowerCase()) {\r\n case 'html': return this.sanitizer.sanitize(SecurityContext.HTML, value);\r\n case 'style': return this.sanitizer.sanitize(SecurityContext.STYLE, value);\r\n case 'script': return this.sanitizer.sanitize(SecurityContext.SCRIPT, value);\r\n case 'url': return this.sanitizer.sanitize(SecurityContext.URL, value);\r\n case 'resourceUrl': return this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, value);\r\n case 'none': return this.sanitizer.sanitize(SecurityContext.NONE, value);\r\n default: throw new Error(`Invalid security context specified: ${context}`);\r\n }\r\n }\r\n return \"\";\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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"}
@@ -145,10 +145,10 @@ class CuteRipple /* extends ... */ {
145
145
  ngOnDestroy() {
146
146
  RippleManager.removeRipple(this._elemRef.nativeElement);
147
147
  }
148
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteRipple /* extends ... */, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
149
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteRipple /* extends ... */, isStandalone: true, selector: "[cuteRipple]", inputs: { rippleOptions: ["cuteRipple", "rippleOptions"] }, host: { listeners: { "mousedown": "onMouseDown($event)" } }, exportAs: ["cuteRipple"], ngImport: i0 }); }
148
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteRipple /* extends ... */, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
149
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: CuteRipple /* extends ... */, isStandalone: true, selector: "[cuteRipple]", inputs: { rippleOptions: ["cuteRipple", "rippleOptions"] }, host: { listeners: { "mousedown": "onMouseDown($event)" } }, exportAs: ["cuteRipple"], ngImport: i0 }); }
150
150
  }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteRipple /* extends ... */, decorators: [{
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteRipple /* extends ... */, decorators: [{
152
152
  type: Directive,
153
153
  args: [{
154
154
  selector: '[cuteRipple]',
@@ -1 +1 @@
1
- {"version":3,"file":"cute-widgets-base-core-ripple.mjs","sources":["../../../../projects/cute-widgets/base/core/ripple/src/Ripple.ts","../../../../projects/cute-widgets/base/core/ripple/src/RippleManager.ts","../../../../projects/cute-widgets/base/core/ripple/src/ripple.directive.ts","../../../../projects/cute-widgets/base/core/ripple/cute-widgets-base-core-ripple.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 {computed, signal} from \"@angular/core\";\r\nimport {firstValueFrom, fromEvent} from \"rxjs\";\r\nimport {take} from \"rxjs/operators\";\r\n\r\nconst RIPPLE_CLASS_NAME = \"cute-ripple-element\";\r\n\r\nexport type RippleOptions = {centered?: boolean, color?: string|null, duration?: string|number};\r\n\r\nexport abstract class Ripple {\r\n private _active = signal<boolean>(false);\r\n private _disabled: boolean = false;\r\n private readonly _target: HTMLElement | undefined;\r\n\r\n protected constructor(target: HTMLElement) {\r\n this._target = target;\r\n }\r\n\r\n get disabled(): boolean {return this._disabled}\r\n set disabled(v: boolean) {this._disabled = v;}\r\n\r\n isActive = computed(() => this._active());\r\n\r\n stop(): void {\r\n if (this._target) {\r\n const existingRipple = this._target.getElementsByClassName(RIPPLE_CLASS_NAME)[0];\r\n if (existingRipple) {\r\n existingRipple.parentElement?.remove();\r\n }\r\n }\r\n this._active.set(false);\r\n }\r\n\r\n launch(event: MouseEvent, options?: RippleOptions): void {\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.isActive()) {\r\n this.stop();\r\n }\r\n\r\n if (this._target && event) {\r\n const rect = this._target.getBoundingClientRect();\r\n\r\n const parent = document.createElement(\"div\");\r\n parent.style.position = \"absolute\";\r\n parent.style.top = \"0\";\r\n parent.style.right = \"0\";\r\n parent.style.bottom = \"0\";\r\n parent.style.left = \"0\";\r\n parent.style.overflow = \"hidden\";\r\n parent.style.borderRadius = \"inherit\";\r\n parent.style.transform = \"perspective(0)\";\r\n parent.ariaHidden = \"true\";\r\n parent.classList.add(\"cute-ripple\")\r\n\r\n const circle = document.createElement(\"span\");\r\n const diameter = Math.max(rect.width, rect.height);\r\n const radius = diameter/2;\r\n\r\n circle.style.width = circle.style.height = `${diameter}px`;\r\n if (options?.centered) {\r\n circle.style.left = `${rect.width / 2 - radius}px`;\r\n circle.style.top = `${rect.height / 2 - radius}px`;\r\n } else {\r\n circle.style.left = `${event.clientX - rect.left - radius}px`;\r\n circle.style.top = `${event.clientY - rect.top - radius}px`;\r\n }\r\n if (options?.color) {\r\n circle.style.setProperty(\"--cute-ripple-bg-color\", options.color);\r\n }\r\n if (options?.duration) {\r\n circle.style.setProperty(\"--cute-ripple-duration\", String(options.duration));\r\n }\r\n circle.classList.add(RIPPLE_CLASS_NAME);\r\n\r\n parent.appendChild(circle);\r\n this._target.appendChild(parent);\r\n\r\n this._active.set(true);\r\n\r\n Promise.any([\r\n firstValueFrom(fromEvent(circle, \"animationend\").pipe(take(1))),\r\n firstValueFrom(fromEvent(circle, \"animationcancel\").pipe(take(1))),\r\n //firstValueFrom(fromEvent(document, \"mouseup\").pipe(take(1))),\r\n ]).then(() => {\r\n circle.parentElement?.remove();\r\n this._active.set(false);\r\n })\r\n\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 {Ripple} from \"./Ripple\";\r\n\r\nexport class RippleManager {\r\n private static readonly _ripples = new WeakMap<HTMLElement, Ripple>();\r\n\r\n\r\n static getInstance(target: HTMLElement): Ripple {\r\n return RippleManager.createRipple(target);\r\n }\r\n\r\n static createRipple(target: HTMLElement): Ripple {\r\n\r\n if (!target) {\r\n throw new Error(\"'target' is required when instantiating a Ripple object\")\r\n }\r\n let ripple = this._ripples.get(target);\r\n if (!ripple) {\r\n ripple = new RippleImpl(target);\r\n this._ripples.set(target, ripple);\r\n }\r\n return ripple;\r\n }\r\n\r\n static removeRipple(target: HTMLElement) {\r\n if (target) {\r\n let ripple = this._ripples.get(target);\r\n if (ripple) {\r\n ripple.stop();\r\n }\r\n this._ripples.delete(target);\r\n }\r\n }\r\n}\r\n\r\nclass RippleImpl extends Ripple {\r\n constructor(target: HTMLElement) {\r\n super(target);\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, ElementRef, HostListener, Input, OnDestroy} from \"@angular/core\";\r\nimport {Ripple, RippleOptions} from \"./Ripple\";\r\nimport {RippleManager} from \"./RippleManager\";\r\n\r\n@Directive({\r\n selector: '[cuteRipple]',\r\n exportAs: 'cuteRipple',\r\n host: {},\r\n standalone: true,\r\n})\r\nexport class CuteRipple /* extends ... */ implements OnDestroy {\r\n private readonly _ripple: Ripple | undefined;\r\n\r\n @Input(\"cuteRipple\")\r\n rippleOptions: RippleOptions | undefined;\r\n\r\n @HostListener(\"mousedown\", ['$event'])\r\n protected onMouseDown(event: MouseEvent) {\r\n if (this._ripple) {\r\n this._ripple.launch(event, this.rippleOptions);\r\n }\r\n }\r\n\r\n constructor(private _elemRef: ElementRef<HTMLElement>) {\r\n this._ripple = RippleManager.createRipple(_elemRef.nativeElement);\r\n }\r\n\r\n ngOnDestroy() {\r\n RippleManager.removeRipple(this._elemRef.nativeElement);\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-ripple.mjs","sources":["../../../../projects/cute-widgets/base/core/ripple/src/Ripple.ts","../../../../projects/cute-widgets/base/core/ripple/src/RippleManager.ts","../../../../projects/cute-widgets/base/core/ripple/src/ripple.directive.ts","../../../../projects/cute-widgets/base/core/ripple/cute-widgets-base-core-ripple.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 {computed, signal} from \"@angular/core\";\r\nimport {firstValueFrom, fromEvent} from \"rxjs\";\r\nimport {take} from \"rxjs/operators\";\r\n\r\nconst RIPPLE_CLASS_NAME = \"cute-ripple-element\";\r\n\r\nexport type RippleOptions = {centered?: boolean, color?: string|null, duration?: string|number};\r\n\r\nexport abstract class Ripple {\r\n private _active = signal<boolean>(false);\r\n private _disabled: boolean = false;\r\n private readonly _target: HTMLElement | undefined;\r\n\r\n protected constructor(target: HTMLElement) {\r\n this._target = target;\r\n }\r\n\r\n get disabled(): boolean {return this._disabled}\r\n set disabled(v: boolean) {this._disabled = v;}\r\n\r\n isActive = computed(() => this._active());\r\n\r\n stop(): void {\r\n if (this._target) {\r\n const existingRipple = this._target.getElementsByClassName(RIPPLE_CLASS_NAME)[0];\r\n if (existingRipple) {\r\n existingRipple.parentElement?.remove();\r\n }\r\n }\r\n this._active.set(false);\r\n }\r\n\r\n launch(event: MouseEvent, options?: RippleOptions): void {\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.isActive()) {\r\n this.stop();\r\n }\r\n\r\n if (this._target && event) {\r\n const rect = this._target.getBoundingClientRect();\r\n\r\n const parent = document.createElement(\"div\");\r\n parent.style.position = \"absolute\";\r\n parent.style.top = \"0\";\r\n parent.style.right = \"0\";\r\n parent.style.bottom = \"0\";\r\n parent.style.left = \"0\";\r\n parent.style.overflow = \"hidden\";\r\n parent.style.borderRadius = \"inherit\";\r\n parent.style.transform = \"perspective(0)\";\r\n parent.ariaHidden = \"true\";\r\n parent.classList.add(\"cute-ripple\")\r\n\r\n const circle = document.createElement(\"span\");\r\n const diameter = Math.max(rect.width, rect.height);\r\n const radius = diameter/2;\r\n\r\n circle.style.width = circle.style.height = `${diameter}px`;\r\n if (options?.centered) {\r\n circle.style.left = `${rect.width / 2 - radius}px`;\r\n circle.style.top = `${rect.height / 2 - radius}px`;\r\n } else {\r\n circle.style.left = `${event.clientX - rect.left - radius}px`;\r\n circle.style.top = `${event.clientY - rect.top - radius}px`;\r\n }\r\n if (options?.color) {\r\n circle.style.setProperty(\"--cute-ripple-bg-color\", options.color);\r\n }\r\n if (options?.duration) {\r\n circle.style.setProperty(\"--cute-ripple-duration\", String(options.duration));\r\n }\r\n circle.classList.add(RIPPLE_CLASS_NAME);\r\n\r\n parent.appendChild(circle);\r\n this._target.appendChild(parent);\r\n\r\n this._active.set(true);\r\n\r\n Promise.any([\r\n firstValueFrom(fromEvent(circle, \"animationend\").pipe(take(1))),\r\n firstValueFrom(fromEvent(circle, \"animationcancel\").pipe(take(1))),\r\n //firstValueFrom(fromEvent(document, \"mouseup\").pipe(take(1))),\r\n ]).then(() => {\r\n circle.parentElement?.remove();\r\n this._active.set(false);\r\n })\r\n\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 {Ripple} from \"./Ripple\";\r\n\r\nexport class RippleManager {\r\n private static readonly _ripples = new WeakMap<HTMLElement, Ripple>();\r\n\r\n\r\n static getInstance(target: HTMLElement): Ripple {\r\n return RippleManager.createRipple(target);\r\n }\r\n\r\n static createRipple(target: HTMLElement): Ripple {\r\n\r\n if (!target) {\r\n throw new Error(\"'target' is required when instantiating a Ripple object\")\r\n }\r\n let ripple = this._ripples.get(target);\r\n if (!ripple) {\r\n ripple = new RippleImpl(target);\r\n this._ripples.set(target, ripple);\r\n }\r\n return ripple;\r\n }\r\n\r\n static removeRipple(target: HTMLElement) {\r\n if (target) {\r\n let ripple = this._ripples.get(target);\r\n if (ripple) {\r\n ripple.stop();\r\n }\r\n this._ripples.delete(target);\r\n }\r\n }\r\n}\r\n\r\nclass RippleImpl extends Ripple {\r\n constructor(target: HTMLElement) {\r\n super(target);\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, ElementRef, HostListener, Input, OnDestroy} from \"@angular/core\";\r\nimport {Ripple, RippleOptions} from \"./Ripple\";\r\nimport {RippleManager} from \"./RippleManager\";\r\n\r\n@Directive({\r\n selector: '[cuteRipple]',\r\n exportAs: 'cuteRipple',\r\n host: {},\r\n standalone: true,\r\n})\r\nexport class CuteRipple /* extends ... */ implements OnDestroy {\r\n private readonly _ripple: Ripple | undefined;\r\n\r\n @Input(\"cuteRipple\")\r\n rippleOptions: RippleOptions | undefined;\r\n\r\n @HostListener(\"mousedown\", ['$event'])\r\n protected onMouseDown(event: MouseEvent) {\r\n if (this._ripple) {\r\n this._ripple.launch(event, this.rippleOptions);\r\n }\r\n }\r\n\r\n constructor(private _elemRef: ElementRef<HTMLElement>) {\r\n this._ripple = RippleManager.createRipple(_elemRef.nativeElement);\r\n }\r\n\r\n ngOnDestroy() {\r\n RippleManager.removeRipple(this._elemRef.nativeElement);\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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"}
@@ -191,10 +191,10 @@ class CuteThemeColor /* extends ... */ {
191
191
  textBgClass() {
192
192
  return toTextBgCssClass(this.color);
193
193
  }
194
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteThemeColor /* extends ... */, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
195
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: CuteThemeColor /* extends ... */, isStandalone: true, selector: "[cuteThemeColor]", inputs: { color: ["cuteThemeColor", "color"] }, providers: [{ provide: CUTE_THEME_COLOR, useExisting: CuteThemeColor }], exportAs: ["cuteThemeColor"], ngImport: i0 }); }
194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteThemeColor /* extends ... */, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
195
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.0", type: CuteThemeColor /* extends ... */, isStandalone: true, selector: "[cuteThemeColor]", inputs: { color: ["cuteThemeColor", "color"] }, providers: [{ provide: CUTE_THEME_COLOR, useExisting: CuteThemeColor }], exportAs: ["cuteThemeColor"], ngImport: i0 }); }
196
196
  }
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteThemeColor /* extends ... */, decorators: [{
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteThemeColor /* extends ... */, decorators: [{
198
198
  type: Directive,
199
199
  args: [{
200
200
  selector: '[cuteThemeColor]',
@@ -296,10 +296,10 @@ class CuteThemeService {
296
296
  ngOnDestroy() {
297
297
  this._mediaChange.complete();
298
298
  }
299
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
300
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteThemeService, providedIn: "root" }); }
299
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
300
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteThemeService, providedIn: "root" }); }
301
301
  }
302
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: CuteThemeService, decorators: [{
302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CuteThemeService, decorators: [{
303
303
  type: Injectable,
304
304
  args: [{
305
305
  providedIn: "root"
@@ -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 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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"}
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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"}
@@ -188,10 +188,10 @@ class IdGenerator {
188
188
  return v.toString(16);
189
189
  });
190
190
  }
191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IdGenerator, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
192
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IdGenerator, providedIn: 'root' }); }
191
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IdGenerator, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
192
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IdGenerator, providedIn: 'root' }); }
193
193
  }
194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IdGenerator, decorators: [{
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IdGenerator, decorators: [{
195
195
  type: Injectable,
196
196
  args: [{ providedIn: 'root' }]
197
197
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"cute-widgets-base-core-utils.mjs","sources":["../../../../projects/cute-widgets/base/core/utils/src/transition.ts","../../../../projects/cute-widgets/base/core/utils/src/token.ts","../../../../projects/cute-widgets/base/core/utils/src/export.ts","../../../../projects/cute-widgets/base/core/utils/src/IdGenerator.ts","../../../../projects/cute-widgets/base/core/utils/src/Scheduler.ts","../../../../projects/cute-widgets/base/core/utils/cute-widgets-base-core-utils.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 * Gets transition duration total value\r\n * @param element Source HTML element\r\n * @returns Duration with delay time in milliseconds\r\n */\r\nexport function getOverallTransitionDuration(element: HTMLElement): number {\r\n return getTransitionDelay(element) + getTransitionDuration(element);\r\n}\r\n\r\n/**\r\n * Gets transition duration value\r\n * @param element Source HTML element\r\n * @returns Duration time in milliseconds\r\n */\r\nexport function getTransitionDuration(element: HTMLElement): number {\r\n const {transitionDuration } = window.getComputedStyle(element);\r\n const durationInMilliseconds = transitionDuration.toLowerCase().endsWith(\"ms\");\r\n const transitionDurationMs = parseFloat(transitionDuration) * (durationInMilliseconds ? 1 : 1000);\r\n\r\n return (transitionDurationMs);\r\n}\r\n\r\n/**\r\n * Gets duration to wait before starting transition\r\n * @param element Source HTML element\r\n * @returns Delay time in milliseconds\r\n */\r\nexport function getTransitionDelay(element: HTMLElement): number {\r\n const { transitionDelay} = window.getComputedStyle(element);\r\n const delayInMilliseconds = transitionDelay.toLowerCase().endsWith(\"ms\");\r\n const transitionDelayMs = parseFloat(transitionDelay) * (delayInMilliseconds ? 1 : 1000);\r\n\r\n return (transitionDelayMs);\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 {InjectionToken} from '@angular/core';\r\n\r\nexport function createValueToken<T>(value: T): InjectionToken<T> {\r\n return createFactoryToken(() => value);\r\n}\r\n\r\nexport function createFactoryToken<T>(factory: () => T): InjectionToken<T> {\r\n return new InjectionToken<T>(`createFactoryToken`, {factory});\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 {ElementRef} from \"@angular/core\";\r\n\r\nexport type ExportOptions = {\r\n filename?: string;\r\n delimiter?: string;\r\n columns?: string[];\r\n}\r\n\r\n/**\r\n * Forcibly starts the process of downloading and saving the file.\r\n * @param blobData Data to save\r\n * @param filename File name to save. Default is `download`.\r\n */\r\nexport function saveAs(blobData: Blob, filename?: string) {\r\n const link = document.createElement(\"a\");\r\n link.href = URL.createObjectURL(blobData);\r\n link.download = filename || \"download\";\r\n link.click();\r\n URL.revokeObjectURL(link.href);\r\n}\r\n\r\n/**\r\n * Exports data from HTML table to MS Excel format text\r\n * @param tableIdOrElem HTML table's `id` value or `ElementRef` object\r\n * @param options Export options\r\n */\r\nexport function exportToExcel(tableIdOrElem: string|ElementRef, options: ExportOptions = {filename: 'records.xls'}) {\r\n let tableElem: HTMLElement|null;\r\n if (typeof tableIdOrElem===\"string\") {\r\n tableElem = document.getElementById(tableIdOrElem);\r\n } else {\r\n tableElem = tableIdOrElem.nativeElement;\r\n }\r\n if (tableElem && tableElem instanceof HTMLTableElement) {\r\n //const tableHTML = encodeURIComponent(tableElem.outerHTML.replace(/ or .*?>/g, '>'));\r\n const tableHTML = tableElem.outerHTML.replace(/ or .*?>/g, '>');\r\n const blobData = new Blob([tableHTML], {type: '{type: application/vnd.ms-excel'});\r\n saveAs(blobData, options?.filename);\r\n }\r\n}\r\n\r\n/**\r\n * Exports data from HTML table to CSV format text\r\n * @param tableIdOrElem HTML table's `id` value or `ElementRef` object\r\n * @param options Export options\r\n */\r\nexport function exportToCSV(tableIdOrElem: string|ElementRef, options: ExportOptions = {filename: 'records.csv'}) {\r\n let tableElem: HTMLElement|null;\r\n if (typeof tableIdOrElem===\"string\") {\r\n tableElem = document.getElementById(tableIdOrElem);\r\n } else {\r\n tableElem = tableIdOrElem.nativeElement;\r\n }\r\n if (tableElem && tableElem instanceof HTMLTableElement) {\r\n const rows = tableElem.querySelectorAll(\"tr\");\r\n let csv: string[] = [];\r\n let keys: number[] = [];\r\n\r\n if (rows.length > 0 && options && options.columns?.length) {\r\n const headers = rows[0].querySelectorAll<HTMLTableColElement>(\"th\");\r\n headers.forEach((header, key) => {\r\n if (options.columns!.findIndex((name) => {\r\n const loweredName = name.toLowerCase();\r\n return header.innerText.toLowerCase() == loweredName || header.classList.contains(\"cdk-column-\"+loweredName);\r\n }) >= 0) {\r\n keys.push(key);\r\n }\r\n });\r\n }\r\n\r\n const appendCells = (cells: HTMLTableColElement[] | NodeListOf<HTMLTableColElement>) => {\r\n const rowText = Array.from(cells).map(cell => cell.innerText);\r\n csv.push(rowText.join(options?.delimiter ?? \",\"));\r\n };\r\n\r\n if (keys.length > 0) {\r\n rows.forEach((row)=>{\r\n const allCells = row.querySelectorAll<HTMLTableColElement>(\"th,td\");\r\n let cells: HTMLTableColElement[] = [];\r\n allCells.forEach((cell, key)=>{\r\n if (keys.indexOf(key) >= 0) {cells.push(cell)}\r\n });\r\n appendCells(cells);\r\n });\r\n } else {\r\n rows.forEach((row)=> {\r\n appendCells( row.querySelectorAll<HTMLTableColElement>(\"th,td\") );\r\n });\r\n }\r\n const blobData = new Blob([csv.join(\"\\n\")], {type: \"text/csv;charset=utf-8;\"});\r\n saveAs(blobData, options?.filename);\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {APP_ID, inject, Injectable} from '@angular/core';\r\n\r\n/**\r\n * Keeps track of the ID count per prefix. This helps us make the IDs a bit more deterministic\r\n * like they were before the service was introduced. Note that ideally we wouldn't have to do\r\n * this, but there are some internal tests that rely on the IDs.\r\n */\r\nconst counters: Record<string, number> = {};\r\n\r\n/** Service that generates unique IDs for DOM nodes. */\r\n@Injectable({providedIn: 'root'})\r\nexport class IdGenerator {\r\n private _appId = inject(APP_ID);\r\n\r\n /**\r\n * Generates a unique ID with a specific prefix.\r\n * @param prefix Prefix to add to the ID.\r\n */\r\n getId(prefix: string): string {\r\n // Omit the app ID if it's the default `ng`. Since the vast majority of pages have one\r\n // Angular app on them, we can reduce the number of breakages by not adding it.\r\n if (this._appId !== 'ng') {\r\n prefix += this._appId;\r\n }\r\n\r\n if (!counters.hasOwnProperty(prefix)) {\r\n counters[prefix] = 0;\r\n }\r\n\r\n return `${prefix}${counters[prefix]++}`;\r\n }\r\n\r\n /**\r\n * Generates UUID (ver.4) string using simple algorithm based on random value only\r\n */\r\n getUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\r\n .replace(/[xy]/g, (c) => {\r\n const r: number = (Math.random() * 16) | 0,\r\n v: number = c == 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\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\n\r\nexport type TaskPriority = \"user-blocking\"|\"user-visible\"|\"background\";\r\n\r\n/**\r\n * A class with static methods specifically designed for scheduling tasks in the browser.\r\n */\r\nexport class Scheduler {\r\n\r\n /** Yielding to the main thread in the browser. */\r\n static async yield(): Promise<void> {\r\n const globalScheduler = (globalThis as any).scheduler;\r\n if (globalScheduler?.yield) {\r\n return globalScheduler.yield();\r\n }\r\n\r\n // Fall back to yielding with setTimeout.\r\n return new Promise(resolve => {\r\n setTimeout(resolve, 0);\r\n });\r\n }\r\n\r\n /**\r\n * Resolves a promise after the delay time in milliseconds\r\n * @param ms Number of milliseconds to wait\r\n *\r\n * @see {@link delay}\r\n */\r\n static async wait(ms: number): Promise<void> {\r\n const startNow = performance.now();\r\n while ((performance.now() - startNow) < ms) {\r\n await Scheduler.yield();\r\n }\r\n }\r\n\r\n /**\r\n * Adding a task to be scheduled according to their priority.\r\n * @param callback Function to run\r\n * @param options Scheduler options\r\n *\r\n * @see {@link async.post}\r\n */\r\n static async postTask(callback: Function, options?: {priority?: TaskPriority, signal?: any, delay?: number}): Promise<void> {\r\n const globalScheduler = (globalThis as any).scheduler;\r\n if (globalScheduler?.postTask) {\r\n return globalScheduler.postTask(callback, options);\r\n }\r\n return new Promise((resolve)=> {\r\n setTimeout(() => resolve(callback()), options?.delay ?? 0);\r\n });\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-utils.mjs","sources":["../../../../projects/cute-widgets/base/core/utils/src/transition.ts","../../../../projects/cute-widgets/base/core/utils/src/token.ts","../../../../projects/cute-widgets/base/core/utils/src/export.ts","../../../../projects/cute-widgets/base/core/utils/src/IdGenerator.ts","../../../../projects/cute-widgets/base/core/utils/src/Scheduler.ts","../../../../projects/cute-widgets/base/core/utils/cute-widgets-base-core-utils.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 * Gets transition duration total value\r\n * @param element Source HTML element\r\n * @returns Duration with delay time in milliseconds\r\n */\r\nexport function getOverallTransitionDuration(element: HTMLElement): number {\r\n return getTransitionDelay(element) + getTransitionDuration(element);\r\n}\r\n\r\n/**\r\n * Gets transition duration value\r\n * @param element Source HTML element\r\n * @returns Duration time in milliseconds\r\n */\r\nexport function getTransitionDuration(element: HTMLElement): number {\r\n const {transitionDuration } = window.getComputedStyle(element);\r\n const durationInMilliseconds = transitionDuration.toLowerCase().endsWith(\"ms\");\r\n const transitionDurationMs = parseFloat(transitionDuration) * (durationInMilliseconds ? 1 : 1000);\r\n\r\n return (transitionDurationMs);\r\n}\r\n\r\n/**\r\n * Gets duration to wait before starting transition\r\n * @param element Source HTML element\r\n * @returns Delay time in milliseconds\r\n */\r\nexport function getTransitionDelay(element: HTMLElement): number {\r\n const { transitionDelay} = window.getComputedStyle(element);\r\n const delayInMilliseconds = transitionDelay.toLowerCase().endsWith(\"ms\");\r\n const transitionDelayMs = parseFloat(transitionDelay) * (delayInMilliseconds ? 1 : 1000);\r\n\r\n return (transitionDelayMs);\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 {InjectionToken} from '@angular/core';\r\n\r\nexport function createValueToken<T>(value: T): InjectionToken<T> {\r\n return createFactoryToken(() => value);\r\n}\r\n\r\nexport function createFactoryToken<T>(factory: () => T): InjectionToken<T> {\r\n return new InjectionToken<T>(`createFactoryToken`, {factory});\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 {ElementRef} from \"@angular/core\";\r\n\r\nexport type ExportOptions = {\r\n filename?: string;\r\n delimiter?: string;\r\n columns?: string[];\r\n}\r\n\r\n/**\r\n * Forcibly starts the process of downloading and saving the file.\r\n * @param blobData Data to save\r\n * @param filename File name to save. Default is `download`.\r\n */\r\nexport function saveAs(blobData: Blob, filename?: string) {\r\n const link = document.createElement(\"a\");\r\n link.href = URL.createObjectURL(blobData);\r\n link.download = filename || \"download\";\r\n link.click();\r\n URL.revokeObjectURL(link.href);\r\n}\r\n\r\n/**\r\n * Exports data from HTML table to MS Excel format text\r\n * @param tableIdOrElem HTML table's `id` value or `ElementRef` object\r\n * @param options Export options\r\n */\r\nexport function exportToExcel(tableIdOrElem: string|ElementRef, options: ExportOptions = {filename: 'records.xls'}) {\r\n let tableElem: HTMLElement|null;\r\n if (typeof tableIdOrElem===\"string\") {\r\n tableElem = document.getElementById(tableIdOrElem);\r\n } else {\r\n tableElem = tableIdOrElem.nativeElement;\r\n }\r\n if (tableElem && tableElem instanceof HTMLTableElement) {\r\n //const tableHTML = encodeURIComponent(tableElem.outerHTML.replace(/ or .*?>/g, '>'));\r\n const tableHTML = tableElem.outerHTML.replace(/ or .*?>/g, '>');\r\n const blobData = new Blob([tableHTML], {type: '{type: application/vnd.ms-excel'});\r\n saveAs(blobData, options?.filename);\r\n }\r\n}\r\n\r\n/**\r\n * Exports data from HTML table to CSV format text\r\n * @param tableIdOrElem HTML table's `id` value or `ElementRef` object\r\n * @param options Export options\r\n */\r\nexport function exportToCSV(tableIdOrElem: string|ElementRef, options: ExportOptions = {filename: 'records.csv'}) {\r\n let tableElem: HTMLElement|null;\r\n if (typeof tableIdOrElem===\"string\") {\r\n tableElem = document.getElementById(tableIdOrElem);\r\n } else {\r\n tableElem = tableIdOrElem.nativeElement;\r\n }\r\n if (tableElem && tableElem instanceof HTMLTableElement) {\r\n const rows = tableElem.querySelectorAll(\"tr\");\r\n let csv: string[] = [];\r\n let keys: number[] = [];\r\n\r\n if (rows.length > 0 && options && options.columns?.length) {\r\n const headers = rows[0].querySelectorAll<HTMLTableColElement>(\"th\");\r\n headers.forEach((header, key) => {\r\n if (options.columns!.findIndex((name) => {\r\n const loweredName = name.toLowerCase();\r\n return header.innerText.toLowerCase() == loweredName || header.classList.contains(\"cdk-column-\"+loweredName);\r\n }) >= 0) {\r\n keys.push(key);\r\n }\r\n });\r\n }\r\n\r\n const appendCells = (cells: HTMLTableColElement[] | NodeListOf<HTMLTableColElement>) => {\r\n const rowText = Array.from(cells).map(cell => cell.innerText);\r\n csv.push(rowText.join(options?.delimiter ?? \",\"));\r\n };\r\n\r\n if (keys.length > 0) {\r\n rows.forEach((row)=>{\r\n const allCells = row.querySelectorAll<HTMLTableColElement>(\"th,td\");\r\n let cells: HTMLTableColElement[] = [];\r\n allCells.forEach((cell, key)=>{\r\n if (keys.indexOf(key) >= 0) {cells.push(cell)}\r\n });\r\n appendCells(cells);\r\n });\r\n } else {\r\n rows.forEach((row)=> {\r\n appendCells( row.querySelectorAll<HTMLTableColElement>(\"th,td\") );\r\n });\r\n }\r\n const blobData = new Blob([csv.join(\"\\n\")], {type: \"text/csv;charset=utf-8;\"});\r\n saveAs(blobData, options?.filename);\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 * This code is a modification of the `@angular/material` original\r\n * code licensed under MIT-style License (https://angular.dev/license).\r\n */\r\nimport {APP_ID, inject, Injectable} from '@angular/core';\r\n\r\n/**\r\n * Keeps track of the ID count per prefix. This helps us make the IDs a bit more deterministic\r\n * like they were before the service was introduced. Note that ideally we wouldn't have to do\r\n * this, but there are some internal tests that rely on the IDs.\r\n */\r\nconst counters: Record<string, number> = {};\r\n\r\n/** Service that generates unique IDs for DOM nodes. */\r\n@Injectable({providedIn: 'root'})\r\nexport class IdGenerator {\r\n private _appId = inject(APP_ID);\r\n\r\n /**\r\n * Generates a unique ID with a specific prefix.\r\n * @param prefix Prefix to add to the ID.\r\n */\r\n getId(prefix: string): string {\r\n // Omit the app ID if it's the default `ng`. Since the vast majority of pages have one\r\n // Angular app on them, we can reduce the number of breakages by not adding it.\r\n if (this._appId !== 'ng') {\r\n prefix += this._appId;\r\n }\r\n\r\n if (!counters.hasOwnProperty(prefix)) {\r\n counters[prefix] = 0;\r\n }\r\n\r\n return `${prefix}${counters[prefix]++}`;\r\n }\r\n\r\n /**\r\n * Generates UUID (ver.4) string using simple algorithm based on random value only\r\n */\r\n getUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'\r\n .replace(/[xy]/g, (c) => {\r\n const r: number = (Math.random() * 16) | 0,\r\n v: number = c == 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\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\n\r\nexport type TaskPriority = \"user-blocking\"|\"user-visible\"|\"background\";\r\n\r\n/**\r\n * A class with static methods specifically designed for scheduling tasks in the browser.\r\n */\r\nexport class Scheduler {\r\n\r\n /** Yielding to the main thread in the browser. */\r\n static async yield(): Promise<void> {\r\n const globalScheduler = (globalThis as any).scheduler;\r\n if (globalScheduler?.yield) {\r\n return globalScheduler.yield();\r\n }\r\n\r\n // Fall back to yielding with setTimeout.\r\n return new Promise(resolve => {\r\n setTimeout(resolve, 0);\r\n });\r\n }\r\n\r\n /**\r\n * Resolves a promise after the delay time in milliseconds\r\n * @param ms Number of milliseconds to wait\r\n *\r\n * @see {@link delay}\r\n */\r\n static async wait(ms: number): Promise<void> {\r\n const startNow = performance.now();\r\n while ((performance.now() - startNow) < ms) {\r\n await Scheduler.yield();\r\n }\r\n }\r\n\r\n /**\r\n * Adding a task to be scheduled according to their priority.\r\n * @param callback Function to run\r\n * @param options Scheduler options\r\n *\r\n * @see {@link async.post}\r\n */\r\n static async postTask(callback: Function, options?: {priority?: TaskPriority, signal?: any, delay?: number}): Promise<void> {\r\n const globalScheduler = (globalThis as any).scheduler;\r\n if (globalScheduler?.postTask) {\r\n return globalScheduler.postTask(callback, options);\r\n }\r\n return new Promise((resolve)=> {\r\n setTimeout(() => resolve(callback()), options?.delay ?? 0);\r\n });\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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"}