@star-ng/ui 0.0.0-stage → 0.1.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -2
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +978 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2523 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3477 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +281 -3
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +118 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5803 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +197 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +540 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +829 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +310 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-select.mjs","names":[],"sources":["../../../projects/star-ng/select/cascade-select.ts","../../../projects/star-ng/select/option-list-base.ts","../../../projects/star-ng/select/multi-select.ts","../../../projects/star-ng/select/select.ts"],"sourcesContent":["import { _IdGenerator } from '@angular/cdk/a11y';\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport {\n optionText,\n readOption,\n STAR_UI_TEXT,\n StarDirectionService,\n StarOptionKey,\n} from '@star-ng/ui/core';\nimport { STAR_MENU_POSITIONS, StarMenu, StarMenuInDialog, StarMenuItem } from '@star-ng/ui/menu';\n\ninterface Leaf<TOption, TValue> {\n readonly option: TOption;\n readonly value: TValue;\n /** Labels from the top level to the leaf. */\n readonly path: readonly string[];\n}\n\n/**\n * Cascade select (PrimeNG `p-cascadeselect`): choose one leaf of nested options, for example\n * country → state → city. The popup is a menu with submenus (CDK Menu: arrow keys, typeahead,\n * Escape). The value is the leaf (`optionValue`, or the whole option).\n *\n * ```html\n * <star-cascade-select [options]=\"countries\" optionLabel=\"name\" optionChildren=\"children\"\n * optionValue=\"code\" [(value)]=\"city\" showPath />\n * ```\n */\n@Component({\n selector: 'star-cascade-select',\n imports: [CdkMenuTrigger, StarMenu, StarMenuInDialog],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-select star-cascade',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': 'invalid() && touched()',\n '[class.star-select--sm]': \"size() === 'sm'\",\n },\n template: `\n <div class=\"star-select__control\">\n <button\n #trigger=\"cdkMenuTriggerFor\"\n type=\"button\"\n class=\"star-select__trigger star-cascade__trigger\"\n [id]=\"inputId()\"\n [cdkMenuTriggerFor]=\"menu.template()\"\n [cdkMenuTriggerData]=\"{ $implicit: menuItems() }\"\n [cdkMenuPosition]=\"positions\"\n [disabled]=\"disabled() || readonly()\"\n [attr.aria-label]=\"triggerName()\"\n [attr.aria-invalid]=\"(invalid() && touched()) || null\"\n (cdkMenuClosed)=\"touch.emit()\"\n >\n @if (selected(); as leaf) {\n <span class=\"star-select__value\">{{ display(leaf) }}</span>\n } @else {\n <span class=\"star-select__placeholder\">{{\n placeholder() ?? text.selectPlaceholder\n }}</span>\n }\n </button>\n @if (showClear() && selected() && !disabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.clear\"\n (click)=\"clear()\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n <i class=\"ph-bold ph-caret-down star-select__caret\" aria-hidden=\"true\"></i>\n </div>\n <star-menu #menu [ariaLabel]=\"ariaLabel()\" />\n `,\n})\nexport class StarCascadeSelect<\n TOption,\n TValue = TOption,\n> implements FormValueControl<TValue | null> {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly positions = STAR_MENU_POSITIONS;\n\n readonly value = model<TValue | null>(null);\n readonly options = input<readonly TOption[]>([]);\n readonly optionLabel = input<StarOptionKey<TOption> | null>(null);\n /** Value stored in the form, read from the leaf. Omit to store the whole leaf option. */\n readonly optionValue = input<StarOptionKey<TOption> | null>(null);\n /** Property (or function) with the child options. An option without children is a leaf. */\n readonly optionChildren = input<StarOptionKey<TOption, readonly TOption[] | null | undefined>>(\n 'children' as StarOptionKey<TOption, readonly TOption[] | null | undefined>,\n );\n readonly optionDisabled = input<StarOptionKey<TOption> | null>(null);\n readonly compareWith = input<(a: TValue, b: TValue) => boolean>(Object.is);\n readonly placeholder = input<string | null>(null);\n /** Show the whole path (\"Germany / Bavaria / Munich\") instead of the leaf label. */\n readonly showPath = input(false, { transform: booleanAttribute });\n readonly showClear = input(false, { transform: booleanAttribute });\n readonly size = input<'sm' | 'md'>('md');\n readonly ariaLabel = input<string | null>(null);\n readonly inputId = input(inject(_IdGenerator).getId('star-cascade-'));\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly touch = output<void>();\n /** The user chose a leaf. */\n readonly optionSelect = output<TOption>();\n\n private childrenOf(option: TOption): readonly TOption[] {\n const children = readOption(option, this.optionChildren());\n return Array.isArray(children) ? (children as readonly TOption[]) : [];\n }\n\n private labelOf(option: TOption): string {\n return optionText(option, this.optionLabel() ?? null);\n }\n\n /** Every leaf with its path, in display order. */\n private readonly leaves = computed(() => {\n const out: Leaf<TOption, TValue>[] = [];\n const walk = (options: readonly TOption[], path: readonly string[]) => {\n for (const option of options) {\n const next = [...path, this.labelOf(option)];\n const children = this.childrenOf(option);\n if (children.length) walk(children, next);\n else {\n out.push({\n option,\n value: readOption(option, this.optionValue()) as TValue,\n path: next,\n });\n }\n }\n };\n walk(this.options(), []);\n return out;\n });\n\n protected readonly selected = computed(() => {\n const value = this.value();\n if (value === null || value === undefined) return null;\n return this.leaves().find((leaf) => this.compareWith()(leaf.value, value)) ?? null;\n });\n\n /** The options as menu items: a parent opens a submenu, a leaf sets the value. */\n protected readonly menuItems = computed<readonly StarMenuItem[]>(() => {\n const disabledKey = this.optionDisabled();\n const selected = this.selected()?.option;\n const build = (options: readonly TOption[]): StarMenuItem[] =>\n options.map((option) => {\n const children = this.childrenOf(option);\n const disabled = disabledKey ? !!readOption(option, disabledKey) : false;\n return children.length\n ? { label: this.labelOf(option), disabled, items: build(children) }\n : {\n label: this.labelOf(option),\n disabled,\n icon: option === selected ? 'ph-bold ph-check' : undefined,\n command: () => this.choose(option),\n };\n });\n return build(this.options());\n });\n\n /**\n * Accessible name of the trigger button: the label and the text on the button, so the visible\n * text is part of the name (WCAG 2.5.3). `null` without `ariaLabel`: a `star-field` label then\n * names the button.\n */\n protected readonly triggerName = computed(() => {\n const label = this.ariaLabel();\n if (!label) return null;\n const leaf = this.selected();\n return `${label}: ${leaf ? this.display(leaf) : (this.placeholder() ?? this.text.selectPlaceholder)}`;\n });\n\n protected display(leaf: Leaf<TOption, TValue>): string {\n return this.showPath() ? leaf.path.join(' / ') : (leaf.path.at(-1) ?? '');\n }\n\n private choose(option: TOption): void {\n this.value.set(readOption(option, this.optionValue()) as TValue);\n this.optionSelect.emit(option);\n }\n\n clear(): void {\n this.value.set(null);\n }\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport { ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport {\n matchesFilter,\n optionText,\n readOption,\n STAR_UI_TEXT,\n StarDirectionService,\n StarOptionKey,\n} from '@star-ng/ui/core';\n\n/** Context of the custom option template: `<ng-template starOption let-option let-selected=\"selected\">`. */\nexport interface StarOptionContext<T> {\n readonly $implicit: T;\n readonly selected: boolean;\n readonly index: number;\n}\n\n/** Custom option row template for `star-select` and `star-multi-select`. */\n@Directive({ selector: 'ng-template[starOption]' })\nexport class StarOptionTemplate<T = unknown> {\n /** Optional: pass the options array to type `let-option` in strict templates. */\n readonly starOptionOf = input<readonly T[] | null>(null);\n readonly template = inject<TemplateRef<StarOptionContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: StarOptionTemplate<T>,\n _ctx: unknown,\n ): _ctx is StarOptionContext<T> {\n return true;\n }\n}\n\n/** One rendered line of the option list: a group heading or an option. */\nexport type StarListRow<T> =\n | { readonly kind: 'group'; readonly key: string; readonly label: string; readonly id: string }\n | {\n readonly kind: 'option';\n readonly key: string;\n readonly option: T;\n /** Index in the visible options (keyboard order). */\n readonly index: number;\n readonly groupId: string | null;\n };\n\n/** Lines rendered above and below the lines in view with `virtualScroll`. */\nconst VIRTUAL_BUFFER = 6;\n/** List height in pixels before the first scroll event gives the real height. */\nconst VIRTUAL_FALLBACK_HEIGHT = 256;\n\nconst PANEL_POSITIONS: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 6 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -6 },\n];\n\n/**\n * Shared state and keyboard model of the dropdown list controls (WAI-ARIA combobox +\n * listbox with `aria-activedescendant`). Subclasses add the selection model.\n */\n@Directive()\nexport abstract class StarOptionListBase<TOption, TValue> {\n /** Keeps the CDK direction (overlays and menus) in step with `<html dir>`. */\n private readonly directionSync = inject(StarDirectionService);\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly ids = inject(_IdGenerator);\n\n readonly options = input<readonly TOption[]>([]);\n readonly optionLabel = input<StarOptionKey<TOption> | null>(null);\n /** Value stored in the form. Omit to store the whole option. */\n readonly optionValue = input<StarOptionKey<TOption> | null>(null);\n readonly optionDisabled = input<StarOptionKey<TOption> | null>(null);\n /** Equality for values (default `Object.is`). Use for object values from the server. */\n readonly compareWith = input<(a: TValue, b: TValue) => boolean>(Object.is);\n /**\n * Group heading of an option (property name or function). Options with the same heading\n * show together under it, in the order in which the headings first appear.\n */\n readonly optionGroup = input<StarOptionKey<TOption> | null>(null);\n /**\n * Renders only the lines in view, for long option lists. Every line has the height\n * `virtualItemSize` and option text stays on one line.\n */\n readonly virtualScroll = input(false, { transform: booleanAttribute });\n /** Line height in pixels with `virtualScroll`. */\n readonly virtualItemSize = input(40);\n\n readonly placeholder = input<string | null>(null);\n readonly filter = input(false, { transform: booleanAttribute });\n readonly filterPlaceholder = input<string | null>(null);\n readonly showClear = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyMessage = input<string | null>(null);\n readonly scrollHeight = input('16rem');\n readonly size = input<'sm' | 'md'>('md');\n readonly ariaLabel = input<string | null>(null);\n readonly ariaLabelledBy = input<string | null>(null);\n readonly inputId = input(this.ids.getId('star-select-'));\n\n // Signal Forms state (bound by [formField]).\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly name = input('');\n\n readonly touch = output<void>();\n readonly opened = output<void>();\n readonly closed = output<void>();\n readonly filterChange = output<string>();\n\n protected readonly optionTemplate = contentChild(StarOptionTemplate);\n protected readonly trigger = viewChild.required<ElementRef<HTMLElement>>('trigger');\n private readonly filterInput = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n\n protected readonly positions = PANEL_POSITIONS;\n protected readonly listId = this.ids.getId('star-listbox-');\n protected readonly open = signal(false);\n protected readonly filterValue = signal('');\n protected readonly activeIndex = signal(-1);\n protected readonly showInvalid = computed(() => this.invalid() && this.touched());\n protected readonly interactive = computed(() => !this.disabled() && !this.readonly());\n\n protected readonly visibleOptions = computed(() => {\n const query = this.filterValue();\n const all = this.options();\n const options =\n !this.filter() || !query\n ? all\n : all.filter((option) => matchesFilter(this.labelOf(option), query));\n return this.groupedOrder(options);\n });\n\n /** With `optionGroup`: keeps each group together, in the order the groups first appear. */\n protected groupedOrder(options: readonly TOption[]): readonly TOption[] {\n if (!this.optionGroup()) return options;\n const order = new Map<string, number>();\n for (const option of options) {\n const group = this.groupOf(option);\n if (!order.has(group)) order.set(group, order.size);\n }\n return options\n .map((option, index) => ({ option, index, rank: order.get(this.groupOf(option)) ?? 0 }))\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map(({ option }) => option);\n }\n\n /** Group headings and options, in display order. */\n protected readonly rows = computed<readonly StarListRow<TOption>[]>(() => {\n const grouped = !!this.optionGroup();\n const rows: StarListRow<TOption>[] = [];\n let current: string | null = null;\n let groupId: string | null = null;\n this.visibleOptions().forEach((option, index) => {\n if (grouped) {\n const label = this.groupOf(option);\n if (label !== current) {\n current = label;\n groupId = `${this.listId}-group-${rows.length}`;\n rows.push({ kind: 'group', key: `g:${label}`, label, id: groupId });\n }\n }\n rows.push({ kind: 'option', key: `o:${index}`, option, index, groupId });\n });\n return rows;\n });\n\n private readonly listScrollTop = signal(0);\n private readonly listHeight = signal(0);\n\n /** First and last rendered line, and the heights of the lines left out. */\n protected readonly virtualWindow = computed(() => {\n const count = this.rows().length;\n if (!this.virtualScroll()) return { start: 0, end: count, before: 0, after: 0 };\n const size = Math.max(1, this.virtualItemSize());\n const visible = Math.ceil((this.listHeight() || VIRTUAL_FALLBACK_HEIGHT) / size);\n const first = Math.min(Math.floor(this.listScrollTop() / size), Math.max(0, count - visible));\n const start = Math.max(0, first - VIRTUAL_BUFFER);\n const end = Math.min(count, first + visible + VIRTUAL_BUFFER);\n return { start, end, before: start * size, after: (count - end) * size };\n });\n\n protected readonly renderedRows = computed(() => {\n const rows = this.rows();\n const { start, end } = this.virtualWindow();\n return start === 0 && end === rows.length ? rows : rows.slice(start, end);\n });\n\n protected onListScroll(event: Event): void {\n if (!this.virtualScroll()) return;\n const list = event.target as HTMLElement;\n this.listScrollTop.set(list.scrollTop);\n this.listHeight.set(list.clientHeight);\n }\n\n protected readonly activeId = computed(() =>\n this.open() && this.activeIndex() >= 0 ? this.optionId(this.activeIndex()) : null,\n );\n\n protected readonly emptyText = computed(() =>\n this.filterValue()\n ? this.text.emptyFilterMessage\n : (this.emptyMessage() ?? this.text.emptyMessage),\n );\n\n private typeahead = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => clearTimeout(this.typeaheadTimer));\n }\n\n /** True when the option is part of the current value. */\n protected abstract isSelected(option: TOption): boolean;\n /** Applies the user's choice of an option. */\n protected abstract choose(option: TOption): void;\n /** Index to highlight when the panel opens. */\n protected abstract initialActiveIndex(): number;\n /** Whether choosing an option closes the panel. */\n protected abstract readonly closeOnChoose: boolean;\n\n labelOf(option: TOption): string {\n return optionText(option, this.optionLabel() ?? null);\n }\n\n protected groupOf(option: TOption): string {\n const key = this.optionGroup();\n const group = key ? readOption(option, key) : null;\n return group === null || group === undefined ? '' : String(group);\n }\n\n protected valueOf(option: TOption): TValue {\n return readOption(option, this.optionValue()) as TValue;\n }\n\n protected isDisabled(option: TOption): boolean {\n const key = this.optionDisabled();\n return key ? !!readOption(option, key) : false;\n }\n\n protected equals(a: TValue, b: TValue): boolean {\n return this.compareWith()(a, b);\n }\n\n protected optionId(index: number): string {\n return `${this.listId}-${index}`;\n }\n\n protected optionContext(option: TOption, index: number): StarOptionContext<TOption> {\n return { $implicit: option, selected: this.isSelected(option), index };\n }\n\n openPanel(): void {\n if (!this.interactive() || this.open()) return;\n this.open.set(true);\n this.activeIndex.set(this.initialActiveIndex());\n this.opened.emit();\n }\n\n closePanel(focusTrigger = true): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeIndex.set(-1);\n this.listScrollTop.set(0);\n if (this.filterValue()) {\n this.filterValue.set('');\n this.filterChange.emit('');\n }\n if (focusTrigger) this.trigger().nativeElement.focus();\n this.closed.emit();\n }\n\n protected toggle(): void {\n if (this.open()) this.closePanel();\n else this.openPanel();\n }\n\n focus(options?: FocusOptions): void {\n this.trigger().nativeElement.focus(options);\n }\n\n protected onPanelAttached(): void {\n this.filterInput()?.nativeElement.focus();\n this.scrollActiveIntoView();\n }\n\n protected onOutsideClick(event: MouseEvent): void {\n // Clicks on the trigger are handled by its own (click) toggle.\n if (this.trigger().nativeElement.contains(event.target as Node)) return;\n this.closePanel(false);\n this.touch.emit();\n }\n\n /** Keeps focus on the trigger (or filter) while the user clicks inside the panel. */\n protected onPanelMousedown(event: MouseEvent): void {\n if (!(event.target instanceof HTMLInputElement)) event.preventDefault();\n }\n\n protected onTriggerBlur(): void {\n if (!this.open()) this.touch.emit();\n }\n\n protected onFilterInput(value: string): void {\n this.filterValue.set(value);\n this.filterChange.emit(value);\n this.listScrollTop.set(0);\n this.activeIndex.set(this.firstEnabledFrom(0, 1));\n }\n\n protected onOptionClick(option: TOption, index: number): void {\n if (this.isDisabled(option)) return;\n this.activeIndex.set(index);\n this.choose(option);\n if (this.closeOnChoose) this.closePanel();\n }\n\n /** Keyboard model for both the trigger and the filter input. */\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.interactive()) return;\n const open = this.open();\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp': {\n event.preventDefault();\n if (!open) {\n this.openPanel();\n return;\n }\n const step = event.key === 'ArrowDown' ? 1 : -1;\n if (event.altKey && step === -1) {\n this.chooseActive();\n this.closePanel();\n return;\n }\n this.moveActive(step);\n return;\n }\n case 'Home':\n case 'End':\n if (!open) return;\n event.preventDefault();\n this.activeIndex.set(\n event.key === 'Home'\n ? this.firstEnabledFrom(0, 1)\n : this.firstEnabledFrom(this.visibleOptions().length - 1, -1),\n );\n this.scrollActiveIntoView();\n return;\n case 'Enter':\n event.preventDefault();\n if (!open) this.openPanel();\n else this.chooseActive(this.closeOnChoose);\n return;\n case ' ':\n // Space types into the filter field.\n if (event.target instanceof HTMLInputElement) return;\n event.preventDefault();\n if (!open) this.openPanel();\n else this.chooseActive(this.closeOnChoose);\n return;\n case 'Escape':\n if (open) {\n event.preventDefault();\n event.stopPropagation();\n this.closePanel();\n }\n return;\n case 'Tab':\n if (open) this.closePanel(false);\n return;\n default:\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n !(event.target instanceof HTMLInputElement)\n ) {\n this.runTypeahead(event.key);\n }\n }\n }\n\n private chooseActive(thenClose = false): void {\n const option = this.visibleOptions()[this.activeIndex()];\n if (option === undefined || this.isDisabled(option)) return;\n this.choose(option);\n if (thenClose) this.closePanel();\n }\n\n private moveActive(step: 1 | -1): void {\n const count = this.visibleOptions().length;\n if (!count) return;\n const start = this.activeIndex() < 0 ? (step === 1 ? 0 : count - 1) : this.activeIndex() + step;\n const next = this.firstEnabledFrom(Math.min(Math.max(start, 0), count - 1), step);\n if (next >= 0) this.activeIndex.set(next);\n this.scrollActiveIntoView();\n }\n\n protected firstEnabledFrom(start: number, step: 1 | -1): number {\n const options = this.visibleOptions();\n for (let i = start; i >= 0 && i < options.length; i += step) {\n if (!this.isDisabled(options[i])) return i;\n }\n return -1;\n }\n\n /** Type a letter to jump to the next option whose label starts with the typed text. */\n private runTypeahead(char: string): void {\n clearTimeout(this.typeaheadTimer);\n this.typeahead += char.toLocaleLowerCase();\n this.typeaheadTimer = setTimeout(() => (this.typeahead = ''), 500);\n const options = this.visibleOptions();\n const start = Math.max(this.activeIndex(), 0);\n const ordered = [...options.keys()].map(\n (i) => (start + (this.typeahead.length === 1 ? 1 : 0) + i) % options.length,\n );\n const match = ordered.find(\n (i) =>\n !this.isDisabled(options[i]) &&\n this.labelOf(options[i]).toLocaleLowerCase().startsWith(this.typeahead),\n );\n if (match === undefined) return;\n this.activeIndex.set(match);\n if (!this.open() && this.closeOnChoose) this.choose(options[match]);\n this.scrollActiveIntoView();\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n if (!id) return;\n if (this.virtualScroll()) {\n // The active line may not be rendered yet: move the list so its position is in view.\n const active = this.activeIndex();\n const line = this.rows().findIndex((row) => row.kind === 'option' && row.index === active);\n const list = this.trigger().nativeElement.ownerDocument.getElementById(this.listId);\n if (line < 0 || !list) return;\n const size = Math.max(1, this.virtualItemSize());\n const height = list.clientHeight || VIRTUAL_FALLBACK_HEIGHT;\n const top = line * size;\n let scrollTop = this.listScrollTop();\n if (top < scrollTop) scrollTop = top;\n else if (top + size > scrollTop + height) scrollTop = top + size - height;\n this.listScrollTop.set(scrollTop);\n this.listHeight.set(height);\n queueMicrotask(() => (list.scrollTop = scrollTop));\n return;\n }\n queueMicrotask(() =>\n this.trigger()\n .nativeElement.ownerDocument.getElementById(id)\n ?.scrollIntoView?.({ block: 'nearest' }),\n );\n }\n}\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { StarOptionListBase } from './option-list-base';\n\n/**\n * Multiple-choice dropdown (PrimeNG `p-multiselect`): checkbox list, \"select all\", filter,\n * chip or comma display, `maxSelectedLabels`, `selectionLimit` and clear. Same keyboard model\n * as `star-select`; Enter / Space toggle the active option and keep the panel open.\n *\n * `<star-multi-select [options]=\"tags\" optionLabel=\"name\" optionValue=\"id\" [(value)]=\"ids\" display=\"chip\" filter />`\n */\n@Component({\n selector: 'star-multi-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-select star-select--multi',\n '[class.star-select--open]': 'open()',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': 'showInvalid()',\n '[class.star-select--sm]': \"size() === 'sm'\",\n },\n template: `\n <div class=\"star-select__control\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div\n #trigger\n class=\"star-select__trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-readonly]=\"readonly() || null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTriggerBlur()\"\n >\n @if (selectedOptions().length === 0) {\n <span class=\"star-select__placeholder\">{{\n placeholder() ?? text.selectPlaceholder\n }}</span>\n } @else if (collapsed()) {\n <span class=\"star-select__value\">{{ text.selectedItems(selectedOptions().length) }}</span>\n } @else if (display() === 'chip') {\n <span class=\"star-select__chips\">\n @for (option of selectedOptions(); track $index) {\n <span class=\"star-chip star-chip--sm\">\n {{ labelOf(option) }}\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"star-chip__remove\"\n tabindex=\"-1\"\n [attr.aria-label]=\"text.removeItem(labelOf(option))\"\n (click)=\"$event.stopPropagation(); remove(option)\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n </span>\n }\n </span>\n } @else {\n <span class=\"star-select__value\">{{ selectedLabels() }}</span>\n }\n </div>\n @if (showClear() && selectedOptions().length && interactive()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.clear\"\n (click)=\"clear()\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (loading()) {\n <i\n class=\"ph-bold ph-spinner-gap star-spin star-select__caret\"\n role=\"img\"\n [attr.aria-label]=\"text.loading\"\n ></i>\n } @else {\n <i class=\"ph-bold ph-caret-down star-select__caret\" aria-hidden=\"true\"></i>\n }\n </div>\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayUsePopover=\"inline\"\n cdkConnectedOverlayMatchWidth\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (attach)=\"onPanelAttached()\"\n (detach)=\"closePanel(false)\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n >\n <div class=\"star-panel\" (mousedown)=\"onPanelMousedown($event)\">\n @if (showToggleAll() || filter()) {\n <div class=\"star-panel__filter\">\n @if (showToggleAll() && !selectionLimit()) {\n <button\n type=\"button\"\n class=\"star-panel__toggle-all\"\n role=\"checkbox\"\n tabindex=\"-1\"\n [attr.aria-checked]=\"allState()\"\n [attr.aria-label]=\"text.selectAll\"\n (click)=\"toggleAll()\"\n >\n <span class=\"star-check__box\" aria-hidden=\"true\">\n @if (allState() === 'mixed') {\n <i class=\"ph-bold ph-minus\"></i>\n } @else if (allState() === true) {\n <i class=\"ph-bold ph-check\"></i>\n }\n </span>\n </button>\n }\n @if (filter()) {\n <i class=\"ph-bold ph-magnifying-glass\" aria-hidden=\"true\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"star-input star-input--sm\"\n role=\"searchbox\"\n autocomplete=\"off\"\n [value]=\"filterValue()\"\n [attr.placeholder]=\"filterPlaceholder() ?? text.filterPlaceholder\"\n [attr.aria-label]=\"filterPlaceholder() ?? text.filterPlaceholder\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeId()\"\n (input)=\"onFilterInput(filterInput.value)\"\n (keydown)=\"onKeydown($event)\"\n />\n } @else {\n <span class=\"star-panel__toggle-label\">{{ text.selectAll }}</span>\n }\n </div>\n }\n <ul\n class=\"star-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listId\"\n [class.star-listbox--virtual]=\"virtualScroll()\"\n [style.--star-item-size.px]=\"virtualScroll() ? virtualItemSize() : null\"\n [style.max-height]=\"scrollHeight()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n (scroll)=\"onListScroll($event)\"\n >\n @if (virtualWindow().before) {\n <li\n class=\"star-listbox__spacer\"\n role=\"presentation\"\n [style.height.px]=\"virtualWindow().before\"\n ></li>\n }\n @for (row of renderedRows(); track row.key) {\n @if (row.kind === 'group') {\n <li class=\"star-listbox__group\" role=\"presentation\" [id]=\"row.id\">{{ row.label }}</li>\n } @else {\n @let option = row.option;\n @let i = row.index;\n <!-- Keyboard is handled on the combobox via aria-activedescendant (WAI-ARIA combobox pattern). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"star-listbox__option\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [class.star-listbox__option--active]=\"activeIndex() === i\"\n [class.star-listbox__option--selected]=\"isSelected(option)\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option) || null\"\n [attr.aria-describedby]=\"row.groupId\"\n [attr.aria-setsize]=\"virtualScroll() ? visibleOptions().length : null\"\n [attr.aria-posinset]=\"virtualScroll() ? i + 1 : null\"\n (click)=\"onOptionClick(option, i)\"\n (mousemove)=\"isDisabled(option) || activeIndex.set(i)\"\n >\n <span class=\"star-check__box\" aria-hidden=\"true\">\n @if (isSelected(option)) {\n <i class=\"ph-bold ph-check\"></i>\n }\n </span>\n <span class=\"star-listbox__label\">\n @if (optionTemplate(); as custom) {\n <ng-container\n *ngTemplateOutlet=\"custom.template; context: optionContext(option, i)\"\n />\n } @else {\n {{ labelOf(option) }}\n }\n </span>\n </li>\n }\n } @empty {\n <li class=\"star-listbox__empty\" role=\"presentation\">{{ emptyText() }}</li>\n }\n @if (virtualWindow().after) {\n <li\n class=\"star-listbox__spacer\"\n role=\"presentation\"\n [style.height.px]=\"virtualWindow().after\"\n ></li>\n }\n </ul>\n </div>\n </ng-template>\n `,\n})\nexport class StarMultiSelect<TOption = unknown, TValue = TOption>\n extends StarOptionListBase<TOption, TValue>\n implements FormValueControl<readonly TValue[]>\n{\n readonly value = model<readonly TValue[]>([]);\n /** `comma`: \"A, B, C\". `chip`: removable chips. */\n readonly display = input<'comma' | 'chip'>('comma');\n /** Above this count the trigger shows \"{n} items selected\". */\n readonly maxSelectedLabels = input(3);\n /** Maximum number of selected items (0 = no limit). Hides \"select all\". */\n readonly selectionLimit = input(0);\n readonly showToggleAll = input(true);\n\n protected readonly closeOnChoose = false;\n\n protected readonly selectedOptions = computed(() =>\n this.options().filter((option) => this.isSelected(option)),\n );\n protected readonly collapsed = computed(\n () => this.selectedOptions().length > this.maxSelectedLabels(),\n );\n protected readonly selectedLabels = computed(() =>\n this.selectedOptions()\n .map((option) => this.labelOf(option))\n .join(', '),\n );\n\n private readonly selectableVisible = computed(() =>\n this.visibleOptions().filter((option) => !this.isDisabled(option)),\n );\n\n /** `true`, `false` or `'mixed'` for the \"select all\" box (over visible, enabled options). */\n protected readonly allState = computed<boolean | 'mixed'>(() => {\n const options = this.selectableVisible();\n const selected = options.filter((option) => this.isSelected(option)).length;\n if (!options.length || selected === 0) return false;\n return selected === options.length ? true : 'mixed';\n });\n\n protected isSelected(option: TOption): boolean {\n const optionValue = this.valueOf(option);\n return this.value().some((value) => this.equals(value, optionValue));\n }\n\n protected choose(option: TOption): void {\n if (this.isSelected(option)) {\n this.remove(option);\n return;\n }\n const limit = this.selectionLimit();\n if (limit > 0 && this.value().length >= limit) return;\n this.value.update((values) => [...values, this.valueOf(option)]);\n }\n\n protected initialActiveIndex(): number {\n return this.firstEnabledFrom(0, 1);\n }\n\n remove(option: TOption): void {\n const optionValue = this.valueOf(option);\n this.value.update((values) => values.filter((value) => !this.equals(value, optionValue)));\n }\n\n protected toggleAll(): void {\n const options = this.selectableVisible();\n if (this.allState() === true) {\n const visibleValues = options.map((option) => this.valueOf(option));\n this.value.update((values) =>\n values.filter((value) => !visibleValues.some((visible) => this.equals(visible, value))),\n );\n return;\n }\n const additions = options\n .filter((option) => !this.isSelected(option))\n .map((option) => this.valueOf(option));\n this.value.update((values) => [...values, ...additions]);\n }\n\n clear(): void {\n this.value.set([]);\n this.focus();\n }\n}\n","import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, model } from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { StarOptionListBase } from './option-list-base';\n\n/**\n * Single-choice dropdown (PrimeNG `p-select`): typed options, `optionLabel` / `optionValue` /\n * `optionDisabled`, filter, clear button, loading state, typeahead and full keyboard support\n * (WAI-ARIA select-only combobox). The panel is a native popover, so it also works inside\n * modal `star-dialog`s.\n *\n * ```html\n * <star-select [options]=\"countries\" optionLabel=\"name\" optionValue=\"code\"\n * [formField]=\"form.country\" filter showClear placeholder=\"Country\" />\n * ```\n */\n@Component({\n selector: 'star-select',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-select',\n '[class.star-select--open]': 'open()',\n '[class.star-select--disabled]': 'disabled()',\n '[class.star-select--invalid]': 'showInvalid()',\n '[class.star-select--sm]': \"size() === 'sm'\",\n },\n template: `\n <div class=\"star-select__control\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div\n #trigger\n class=\"star-select__trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"inputId()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-readonly]=\"readonly() || null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onTriggerBlur()\"\n >\n @if (selectedOption(); as option) {\n <span class=\"star-select__value\">{{ labelOf(option) }}</span>\n } @else {\n <span class=\"star-select__placeholder\">{{\n placeholder() ?? text.selectPlaceholder\n }}</span>\n }\n </div>\n @if (showClear() && selectedOption() !== undefined && interactive()) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.clear\"\n (click)=\"clear()\"\n >\n <i class=\"ph-bold ph-x\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (loading()) {\n <i\n class=\"ph-bold ph-spinner-gap star-spin star-select__caret\"\n role=\"img\"\n [attr.aria-label]=\"text.loading\"\n ></i>\n } @else {\n <i class=\"ph-bold ph-caret-down star-select__caret\" aria-hidden=\"true\"></i>\n }\n </div>\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayUsePopover=\"inline\"\n cdkConnectedOverlayMatchWidth\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (attach)=\"onPanelAttached()\"\n (detach)=\"closePanel(false)\"\n (overlayOutsideClick)=\"onOutsideClick($event)\"\n >\n <div class=\"star-panel\" (mousedown)=\"onPanelMousedown($event)\">\n @if (filter()) {\n <div class=\"star-panel__filter\">\n <i class=\"ph-bold ph-magnifying-glass\" aria-hidden=\"true\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"star-input star-input--sm\"\n role=\"searchbox\"\n autocomplete=\"off\"\n [value]=\"filterValue()\"\n [attr.placeholder]=\"filterPlaceholder() ?? text.filterPlaceholder\"\n [attr.aria-label]=\"filterPlaceholder() ?? text.filterPlaceholder\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"activeId()\"\n (input)=\"onFilterInput(filterInput.value)\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n }\n <ul\n class=\"star-listbox\"\n role=\"listbox\"\n [id]=\"listId\"\n [class.star-listbox--virtual]=\"virtualScroll()\"\n [style.--star-item-size.px]=\"virtualScroll() ? virtualItemSize() : null\"\n [style.max-height]=\"scrollHeight()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n (scroll)=\"onListScroll($event)\"\n >\n @if (virtualWindow().before) {\n <li\n class=\"star-listbox__spacer\"\n role=\"presentation\"\n [style.height.px]=\"virtualWindow().before\"\n ></li>\n }\n @for (row of renderedRows(); track row.key) {\n @if (row.kind === 'group') {\n <li class=\"star-listbox__group\" role=\"presentation\" [id]=\"row.id\">{{ row.label }}</li>\n } @else {\n @let option = row.option;\n @let i = row.index;\n <!-- Keyboard is handled on the combobox via aria-activedescendant (WAI-ARIA combobox pattern). -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n class=\"star-listbox__option\"\n role=\"option\"\n [id]=\"optionId(i)\"\n [class.star-listbox__option--active]=\"activeIndex() === i\"\n [class.star-listbox__option--selected]=\"isSelected(option)\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option) || null\"\n [attr.aria-describedby]=\"row.groupId\"\n [attr.aria-setsize]=\"virtualScroll() ? visibleOptions().length : null\"\n [attr.aria-posinset]=\"virtualScroll() ? i + 1 : null\"\n (click)=\"onOptionClick(option, i)\"\n (mousemove)=\"isDisabled(option) || activeIndex.set(i)\"\n >\n <span class=\"star-listbox__label\">\n @if (optionTemplate(); as custom) {\n <ng-container\n *ngTemplateOutlet=\"custom.template; context: optionContext(option, i)\"\n />\n } @else {\n {{ labelOf(option) }}\n }\n </span>\n @if (isSelected(option)) {\n <i class=\"ph-bold ph-check star-listbox__check\" aria-hidden=\"true\"></i>\n }\n </li>\n }\n } @empty {\n <li class=\"star-listbox__empty\" role=\"presentation\">{{ emptyText() }}</li>\n }\n @if (virtualWindow().after) {\n <li\n class=\"star-listbox__spacer\"\n role=\"presentation\"\n [style.height.px]=\"virtualWindow().after\"\n ></li>\n }\n </ul>\n </div>\n </ng-template>\n `,\n})\nexport class StarSelect<TOption = unknown, TValue = TOption>\n extends StarOptionListBase<TOption, TValue>\n implements FormValueControl<TValue | null>\n{\n readonly value = model<TValue | null>(null);\n\n protected readonly closeOnChoose = true;\n\n /** The option that matches the current value, or `undefined`. */\n protected readonly selectedOption = computed(() => {\n const value = this.value();\n if (value === null) return undefined;\n return this.options().find((option) => this.equals(this.valueOf(option), value));\n });\n\n protected isSelected(option: TOption): boolean {\n const value = this.value();\n return value !== null && this.equals(this.valueOf(option), value);\n }\n\n protected choose(option: TOption): void {\n this.value.set(this.valueOf(option));\n }\n\n protected initialActiveIndex(): number {\n const index = this.visibleOptions().findIndex((option) => this.isSelected(option));\n return index >= 0 ? index : this.firstEnabledFrom(0, 1);\n }\n\n clear(): void {\n this.value.set(null);\n this.focus();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, input } from "@angular/core";
3
+ var StarSkeleton = class StarSkeleton {
4
+ shape = input("rectangle", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
5
+ width = input("100%", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
6
+ height = input("1rem", ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
7
+ size = input(null, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
8
+ borderRadius = input(null, ...ngDevMode ? [{ debugName: "borderRadius" }] : /* istanbul ignore next */ []);
9
+ animation = input("wave", ...ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []);
10
+ static ɵfac = i0.ɵɵngDeclareFactory({
11
+ minVersion: "12.0.0",
12
+ version: "22.2.6",
13
+ ngImport: i0,
14
+ type: StarSkeleton,
15
+ deps: [],
16
+ target: i0.ɵɵFactoryTarget.Component
17
+ });
18
+ static ɵcmp = i0.ɵɵngDeclareComponent({
19
+ minVersion: "17.1.0",
20
+ version: "22.2.6",
21
+ type: StarSkeleton,
22
+ isStandalone: true,
23
+ selector: "star-skeleton",
24
+ inputs: {
25
+ shape: {
26
+ classPropertyName: "shape",
27
+ publicName: "shape",
28
+ isSignal: true,
29
+ isRequired: false,
30
+ transformFunction: null
31
+ },
32
+ width: {
33
+ classPropertyName: "width",
34
+ publicName: "width",
35
+ isSignal: true,
36
+ isRequired: false,
37
+ transformFunction: null
38
+ },
39
+ height: {
40
+ classPropertyName: "height",
41
+ publicName: "height",
42
+ isSignal: true,
43
+ isRequired: false,
44
+ transformFunction: null
45
+ },
46
+ size: {
47
+ classPropertyName: "size",
48
+ publicName: "size",
49
+ isSignal: true,
50
+ isRequired: false,
51
+ transformFunction: null
52
+ },
53
+ borderRadius: {
54
+ classPropertyName: "borderRadius",
55
+ publicName: "borderRadius",
56
+ isSignal: true,
57
+ isRequired: false,
58
+ transformFunction: null
59
+ },
60
+ animation: {
61
+ classPropertyName: "animation",
62
+ publicName: "animation",
63
+ isSignal: true,
64
+ isRequired: false,
65
+ transformFunction: null
66
+ }
67
+ },
68
+ host: {
69
+ attributes: { "aria-hidden": "true" },
70
+ properties: {
71
+ "class.star-skeleton--circle": "shape() === 'circle'",
72
+ "class.star-skeleton--static": "animation() === 'none'",
73
+ "style.width": "size() ?? width()",
74
+ "style.height": "size() ?? height()",
75
+ "style.border-radius": "borderRadius()"
76
+ },
77
+ classAttribute: "star-skeleton"
78
+ },
79
+ ngImport: i0,
80
+ template: ``,
81
+ isInline: true,
82
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
83
+ });
84
+ };
85
+ i0.ɵɵngDeclareClassMetadata({
86
+ minVersion: "12.0.0",
87
+ version: "22.2.6",
88
+ ngImport: i0,
89
+ type: StarSkeleton,
90
+ decorators: [{
91
+ type: Component,
92
+ args: [{
93
+ selector: "star-skeleton",
94
+ changeDetection: ChangeDetectionStrategy.OnPush,
95
+ host: {
96
+ class: "star-skeleton",
97
+ "aria-hidden": "true",
98
+ "[class.star-skeleton--circle]": "shape() === 'circle'",
99
+ "[class.star-skeleton--static]": "animation() === 'none'",
100
+ "[style.width]": "size() ?? width()",
101
+ "[style.height]": "size() ?? height()",
102
+ "[style.border-radius]": "borderRadius()"
103
+ },
104
+ template: ``
105
+ }]
106
+ }],
107
+ propDecorators: {
108
+ shape: [{
109
+ type: i0.Input,
110
+ args: [{
111
+ isSignal: true,
112
+ alias: "shape",
113
+ required: false
114
+ }]
115
+ }],
116
+ width: [{
117
+ type: i0.Input,
118
+ args: [{
119
+ isSignal: true,
120
+ alias: "width",
121
+ required: false
122
+ }]
123
+ }],
124
+ height: [{
125
+ type: i0.Input,
126
+ args: [{
127
+ isSignal: true,
128
+ alias: "height",
129
+ required: false
130
+ }]
131
+ }],
132
+ size: [{
133
+ type: i0.Input,
134
+ args: [{
135
+ isSignal: true,
136
+ alias: "size",
137
+ required: false
138
+ }]
139
+ }],
140
+ borderRadius: [{
141
+ type: i0.Input,
142
+ args: [{
143
+ isSignal: true,
144
+ alias: "borderRadius",
145
+ required: false
146
+ }]
147
+ }],
148
+ animation: [{
149
+ type: i0.Input,
150
+ args: [{
151
+ isSignal: true,
152
+ alias: "animation",
153
+ required: false
154
+ }]
155
+ }]
156
+ }
157
+ });
158
+ export { StarSkeleton };
159
+
160
+ //# sourceMappingURL=star-ng-ui-skeleton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-skeleton.mjs","names":[],"sources":["../../../projects/star-ng/skeleton/skeleton.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * Loading placeholder (PrimeNG `p-skeleton`). Respects `prefers-reduced-motion`.\n * `<star-skeleton width=\"60%\" height=\"1rem\" />`, `<star-skeleton shape=\"circle\" size=\"2.5rem\" />`\n */\n@Component({\n selector: 'star-skeleton',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-skeleton',\n 'aria-hidden': 'true',\n '[class.star-skeleton--circle]': \"shape() === 'circle'\",\n '[class.star-skeleton--static]': \"animation() === 'none'\",\n '[style.width]': 'size() ?? width()',\n '[style.height]': 'size() ?? height()',\n '[style.border-radius]': 'borderRadius()',\n },\n template: ``,\n})\nexport class StarSkeleton {\n readonly shape = input<'rectangle' | 'circle'>('rectangle');\n readonly width = input('100%');\n readonly height = input('1rem');\n /** Width and height together (squares and circles). */\n readonly size = input<string | null>(null);\n readonly borderRadius = input<string | null>(null);\n readonly animation = input<'wave' | 'none'>('wave');\n}\n"],"mappings":";;AAoBA,IAAa,eAAb,MAAa,aAAY;CACd,QAAQ,MAA8B,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClD,QAAQ,MAAM,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACrB,SAAS,MAAM,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,OAAO,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,eAAe,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,YAAY,MAAuB,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAPxC,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAY,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,QAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,eAAA,OAAA;GAAA,YAAA;IAAA,+BAAA;IAAA,+BAAA;IAAA,eAAA;IAAA,gBAAA;IAAA,uBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAFb;EAAE,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAED,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EAdxB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,OAAO;IACP,eAAe;IACf,iCAAiC;IACjC,iCAAiC;IACjC,iBAAiB;IACjB,kBAAkB;IAClB,yBAAyB;GAC1B;GACD,UAAU;EACX,CAAA"}