@vadem/ui 0.0.0-stage → 0.0.1

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 (289) hide show
  1. package/LICENSE-lucide.txt +43 -0
  2. package/README.md +19 -2
  3. package/fesm2022/vadem-ui-accordion.mjs +139 -0
  4. package/fesm2022/vadem-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/vadem-ui-active-filters.mjs +355 -0
  6. package/fesm2022/vadem-ui-active-filters.mjs.map +1 -0
  7. package/fesm2022/vadem-ui-alert-dialog.mjs +433 -0
  8. package/fesm2022/vadem-ui-alert-dialog.mjs.map +1 -0
  9. package/fesm2022/vadem-ui-alert.mjs +266 -0
  10. package/fesm2022/vadem-ui-alert.mjs.map +1 -0
  11. package/fesm2022/vadem-ui-autocomplete.mjs +715 -0
  12. package/fesm2022/vadem-ui-autocomplete.mjs.map +1 -0
  13. package/fesm2022/vadem-ui-avatar.mjs +219 -0
  14. package/fesm2022/vadem-ui-avatar.mjs.map +1 -0
  15. package/fesm2022/vadem-ui-badge.mjs +86 -0
  16. package/fesm2022/vadem-ui-badge.mjs.map +1 -0
  17. package/fesm2022/vadem-ui-breadcrumbs.mjs +61 -0
  18. package/fesm2022/vadem-ui-breadcrumbs.mjs.map +1 -0
  19. package/fesm2022/vadem-ui-button.mjs +220 -0
  20. package/fesm2022/vadem-ui-button.mjs.map +1 -0
  21. package/fesm2022/vadem-ui-calendar.mjs +1314 -0
  22. package/fesm2022/vadem-ui-calendar.mjs.map +1 -0
  23. package/fesm2022/vadem-ui-card.mjs +271 -0
  24. package/fesm2022/vadem-ui-card.mjs.map +1 -0
  25. package/fesm2022/vadem-ui-character-count.mjs +269 -0
  26. package/fesm2022/vadem-ui-character-count.mjs.map +1 -0
  27. package/fesm2022/vadem-ui-chart.mjs +1984 -0
  28. package/fesm2022/vadem-ui-chart.mjs.map +1 -0
  29. package/fesm2022/vadem-ui-checkbox.mjs +67 -0
  30. package/fesm2022/vadem-ui-checkbox.mjs.map +1 -0
  31. package/fesm2022/vadem-ui-color-picker.mjs +815 -0
  32. package/fesm2022/vadem-ui-color-picker.mjs.map +1 -0
  33. package/fesm2022/vadem-ui-command.mjs +735 -0
  34. package/fesm2022/vadem-ui-command.mjs.map +1 -0
  35. package/fesm2022/vadem-ui-copy-button.mjs +375 -0
  36. package/fesm2022/vadem-ui-copy-button.mjs.map +1 -0
  37. package/fesm2022/vadem-ui-date-range-picker.mjs +1011 -0
  38. package/fesm2022/vadem-ui-date-range-picker.mjs.map +1 -0
  39. package/fesm2022/vadem-ui-description-list.mjs +59 -0
  40. package/fesm2022/vadem-ui-description-list.mjs.map +1 -0
  41. package/fesm2022/vadem-ui-dialog.mjs +587 -0
  42. package/fesm2022/vadem-ui-dialog.mjs.map +1 -0
  43. package/fesm2022/vadem-ui-dropzone.mjs +176 -0
  44. package/fesm2022/vadem-ui-dropzone.mjs.map +1 -0
  45. package/fesm2022/vadem-ui-editable-text.mjs +641 -0
  46. package/fesm2022/vadem-ui-editable-text.mjs.map +1 -0
  47. package/fesm2022/vadem-ui-empty-state.mjs +175 -0
  48. package/fesm2022/vadem-ui-empty-state.mjs.map +1 -0
  49. package/fesm2022/vadem-ui-expandable-text.mjs +244 -0
  50. package/fesm2022/vadem-ui-expandable-text.mjs.map +1 -0
  51. package/fesm2022/vadem-ui-field.mjs +583 -0
  52. package/fesm2022/vadem-ui-field.mjs.map +1 -0
  53. package/fesm2022/vadem-ui-file-preview.mjs +532 -0
  54. package/fesm2022/vadem-ui-file-preview.mjs.map +1 -0
  55. package/fesm2022/vadem-ui-file-size.mjs +83 -0
  56. package/fesm2022/vadem-ui-file-size.mjs.map +1 -0
  57. package/fesm2022/vadem-ui-form-error-summary.mjs +201 -0
  58. package/fesm2022/vadem-ui-form-error-summary.mjs.map +1 -0
  59. package/fesm2022/vadem-ui-icon.mjs +303 -0
  60. package/fesm2022/vadem-ui-icon.mjs.map +1 -0
  61. package/fesm2022/vadem-ui-input.mjs +120 -0
  62. package/fesm2022/vadem-ui-input.mjs.map +1 -0
  63. package/fesm2022/vadem-ui-kbd.mjs +286 -0
  64. package/fesm2022/vadem-ui-kbd.mjs.map +1 -0
  65. package/fesm2022/vadem-ui-keyboard.mjs +105 -0
  66. package/fesm2022/vadem-ui-keyboard.mjs.map +1 -0
  67. package/fesm2022/vadem-ui-locale.mjs +443 -0
  68. package/fesm2022/vadem-ui-locale.mjs.map +1 -0
  69. package/fesm2022/vadem-ui-menu.mjs +637 -0
  70. package/fesm2022/vadem-ui-menu.mjs.map +1 -0
  71. package/fesm2022/vadem-ui-navigation-list.mjs +130 -0
  72. package/fesm2022/vadem-ui-navigation-list.mjs.map +1 -0
  73. package/fesm2022/vadem-ui-number-input.mjs +264 -0
  74. package/fesm2022/vadem-ui-number-input.mjs.map +1 -0
  75. package/fesm2022/vadem-ui-otp-input.mjs +86 -0
  76. package/fesm2022/vadem-ui-otp-input.mjs.map +1 -0
  77. package/fesm2022/vadem-ui-pagination.mjs +353 -0
  78. package/fesm2022/vadem-ui-pagination.mjs.map +1 -0
  79. package/fesm2022/vadem-ui-password-input.mjs +213 -0
  80. package/fesm2022/vadem-ui-password-input.mjs.map +1 -0
  81. package/fesm2022/vadem-ui-popover.mjs +178 -0
  82. package/fesm2022/vadem-ui-popover.mjs.map +1 -0
  83. package/fesm2022/vadem-ui-progress.mjs +331 -0
  84. package/fesm2022/vadem-ui-progress.mjs.map +1 -0
  85. package/fesm2022/vadem-ui-radio.mjs +39 -0
  86. package/fesm2022/vadem-ui-radio.mjs.map +1 -0
  87. package/fesm2022/vadem-ui-range-slider.mjs +561 -0
  88. package/fesm2022/vadem-ui-range-slider.mjs.map +1 -0
  89. package/fesm2022/vadem-ui-rating.mjs +404 -0
  90. package/fesm2022/vadem-ui-rating.mjs.map +1 -0
  91. package/fesm2022/vadem-ui-relative-time.mjs +217 -0
  92. package/fesm2022/vadem-ui-relative-time.mjs.map +1 -0
  93. package/fesm2022/vadem-ui-reorder-list.mjs +601 -0
  94. package/fesm2022/vadem-ui-reorder-list.mjs.map +1 -0
  95. package/fesm2022/vadem-ui-scroll-area.mjs +65 -0
  96. package/fesm2022/vadem-ui-scroll-area.mjs.map +1 -0
  97. package/fesm2022/vadem-ui-search-input.mjs +307 -0
  98. package/fesm2022/vadem-ui-search-input.mjs.map +1 -0
  99. package/fesm2022/vadem-ui-segmented.mjs +297 -0
  100. package/fesm2022/vadem-ui-segmented.mjs.map +1 -0
  101. package/fesm2022/vadem-ui-select.mjs +1462 -0
  102. package/fesm2022/vadem-ui-select.mjs.map +1 -0
  103. package/fesm2022/vadem-ui-sidebar.mjs +493 -0
  104. package/fesm2022/vadem-ui-sidebar.mjs.map +1 -0
  105. package/fesm2022/vadem-ui-skeleton.mjs +106 -0
  106. package/fesm2022/vadem-ui-skeleton.mjs.map +1 -0
  107. package/fesm2022/vadem-ui-slider.mjs +60 -0
  108. package/fesm2022/vadem-ui-slider.mjs.map +1 -0
  109. package/fesm2022/vadem-ui-splitter.mjs +438 -0
  110. package/fesm2022/vadem-ui-splitter.mjs.map +1 -0
  111. package/fesm2022/vadem-ui-stat.mjs +369 -0
  112. package/fesm2022/vadem-ui-stat.mjs.map +1 -0
  113. package/fesm2022/vadem-ui-stepper.mjs +483 -0
  114. package/fesm2022/vadem-ui-stepper.mjs.map +1 -0
  115. package/fesm2022/vadem-ui-switch.mjs +45 -0
  116. package/fesm2022/vadem-ui-switch.mjs.map +1 -0
  117. package/fesm2022/vadem-ui-table.mjs +593 -0
  118. package/fesm2022/vadem-ui-table.mjs.map +1 -0
  119. package/fesm2022/vadem-ui-tabs.mjs +405 -0
  120. package/fesm2022/vadem-ui-tabs.mjs.map +1 -0
  121. package/fesm2022/vadem-ui-tag-input.mjs +685 -0
  122. package/fesm2022/vadem-ui-tag-input.mjs.map +1 -0
  123. package/fesm2022/vadem-ui-text-highlight.mjs +126 -0
  124. package/fesm2022/vadem-ui-text-highlight.mjs.map +1 -0
  125. package/fesm2022/vadem-ui-time-input.mjs +430 -0
  126. package/fesm2022/vadem-ui-time-input.mjs.map +1 -0
  127. package/fesm2022/vadem-ui-timeline.mjs +313 -0
  128. package/fesm2022/vadem-ui-timeline.mjs.map +1 -0
  129. package/fesm2022/vadem-ui-toast.mjs +397 -0
  130. package/fesm2022/vadem-ui-toast.mjs.map +1 -0
  131. package/fesm2022/vadem-ui-toolbar.mjs +396 -0
  132. package/fesm2022/vadem-ui-toolbar.mjs.map +1 -0
  133. package/fesm2022/vadem-ui-tooltip.mjs +218 -0
  134. package/fesm2022/vadem-ui-tooltip.mjs.map +1 -0
  135. package/fesm2022/vadem-ui-tree.mjs +551 -0
  136. package/fesm2022/vadem-ui-tree.mjs.map +1 -0
  137. package/fesm2022/vadem-ui-upload-list.mjs +408 -0
  138. package/fesm2022/vadem-ui-upload-list.mjs.map +1 -0
  139. package/fesm2022/vadem-ui.mjs +4 -0
  140. package/fesm2022/vadem-ui.mjs.map +1 -0
  141. package/fonts/jetbrains-mono/OFL.txt +93 -0
  142. package/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2 +0 -0
  143. package/fonts/jetbrains-mono/jetbrains-mono-latin.woff2 +0 -0
  144. package/fonts/manrope/OFL.txt +93 -0
  145. package/fonts/manrope/manrope-cyrillic.woff2 +0 -0
  146. package/fonts/manrope/manrope-latin.woff2 +0 -0
  147. package/package.json +306 -3
  148. package/styles/base.css +160 -0
  149. package/styles/components/accordion.css +130 -0
  150. package/styles/components/active-filters.css +42 -0
  151. package/styles/components/alert-dialog.css +34 -0
  152. package/styles/components/alert.css +159 -0
  153. package/styles/components/autocomplete.css +97 -0
  154. package/styles/components/avatar.css +90 -0
  155. package/styles/components/badge.css +91 -0
  156. package/styles/components/breadcrumbs.css +94 -0
  157. package/styles/components/button.css +174 -0
  158. package/styles/components/calendar.css +186 -0
  159. package/styles/components/card.css +206 -0
  160. package/styles/components/character-count.css +41 -0
  161. package/styles/components/chart.css +308 -0
  162. package/styles/components/checkbox.css +115 -0
  163. package/styles/components/color-picker.css +158 -0
  164. package/styles/components/command.css +175 -0
  165. package/styles/components/copy-button.css +58 -0
  166. package/styles/components/date-range-picker.css +153 -0
  167. package/styles/components/description-list.css +69 -0
  168. package/styles/components/dialog.css +334 -0
  169. package/styles/components/dropzone.css +89 -0
  170. package/styles/components/editable-text.css +58 -0
  171. package/styles/components/empty-state.css +72 -0
  172. package/styles/components/expandable-text.css +24 -0
  173. package/styles/components/field.css +148 -0
  174. package/styles/components/file-preview.css +65 -0
  175. package/styles/components/form-error-summary.css +71 -0
  176. package/styles/components/icon.css +38 -0
  177. package/styles/components/index.css +80 -0
  178. package/styles/components/input.css +171 -0
  179. package/styles/components/kbd.css +42 -0
  180. package/styles/components/menu.css +168 -0
  181. package/styles/components/multi-select.css +156 -0
  182. package/styles/components/navigation-list.css +147 -0
  183. package/styles/components/number-input.css +33 -0
  184. package/styles/components/otp-input.css +26 -0
  185. package/styles/components/pagination.css +127 -0
  186. package/styles/components/password-input.css +20 -0
  187. package/styles/components/popover.css +93 -0
  188. package/styles/components/progress-ring.css +112 -0
  189. package/styles/components/progress.css +162 -0
  190. package/styles/components/radio.css +117 -0
  191. package/styles/components/range-slider.css +158 -0
  192. package/styles/components/rating.css +100 -0
  193. package/styles/components/reorder-list.css +143 -0
  194. package/styles/components/scroll-area.css +39 -0
  195. package/styles/components/search-input.css +25 -0
  196. package/styles/components/segmented.css +136 -0
  197. package/styles/components/select.css +257 -0
  198. package/styles/components/sidebar.css +105 -0
  199. package/styles/components/skeleton.css +83 -0
  200. package/styles/components/slider.css +132 -0
  201. package/styles/components/splitter.css +83 -0
  202. package/styles/components/stat.css +62 -0
  203. package/styles/components/stepper.css +236 -0
  204. package/styles/components/switch.css +107 -0
  205. package/styles/components/table.css +195 -0
  206. package/styles/components/tabs.css +198 -0
  207. package/styles/components/tag-input.css +138 -0
  208. package/styles/components/text-highlight.css +22 -0
  209. package/styles/components/time-input.css +96 -0
  210. package/styles/components/timeline.css +182 -0
  211. package/styles/components/toast.css +146 -0
  212. package/styles/components/toolbar.css +72 -0
  213. package/styles/components/tooltip.css +93 -0
  214. package/styles/components/tree.css +88 -0
  215. package/styles/components/upload-list.css +113 -0
  216. package/styles/fonts.css +67 -0
  217. package/styles/index.css +14 -0
  218. package/styles/reset.css +57 -0
  219. package/styles/tokens/primitives.css +364 -0
  220. package/styles/tokens/semantic.css +233 -0
  221. package/types/vadem-ui-accordion.d.ts +43 -0
  222. package/types/vadem-ui-active-filters.d.ts +73 -0
  223. package/types/vadem-ui-alert-dialog.d.ts +87 -0
  224. package/types/vadem-ui-alert.d.ts +64 -0
  225. package/types/vadem-ui-autocomplete.d.ts +156 -0
  226. package/types/vadem-ui-avatar.d.ts +59 -0
  227. package/types/vadem-ui-badge.d.ts +25 -0
  228. package/types/vadem-ui-breadcrumbs.d.ts +22 -0
  229. package/types/vadem-ui-button.d.ts +52 -0
  230. package/types/vadem-ui-calendar.d.ts +327 -0
  231. package/types/vadem-ui-card.d.ts +58 -0
  232. package/types/vadem-ui-character-count.d.ts +71 -0
  233. package/types/vadem-ui-chart.d.ts +452 -0
  234. package/types/vadem-ui-checkbox.d.ts +20 -0
  235. package/types/vadem-ui-color-picker.d.ts +171 -0
  236. package/types/vadem-ui-command.d.ts +145 -0
  237. package/types/vadem-ui-copy-button.d.ts +90 -0
  238. package/types/vadem-ui-date-range-picker.d.ts +216 -0
  239. package/types/vadem-ui-description-list.d.ts +15 -0
  240. package/types/vadem-ui-dialog.d.ts +174 -0
  241. package/types/vadem-ui-dropzone.d.ts +73 -0
  242. package/types/vadem-ui-editable-text.d.ts +141 -0
  243. package/types/vadem-ui-empty-state.d.ts +34 -0
  244. package/types/vadem-ui-expandable-text.d.ts +52 -0
  245. package/types/vadem-ui-field.d.ts +180 -0
  246. package/types/vadem-ui-file-preview.d.ts +108 -0
  247. package/types/vadem-ui-file-size.d.ts +18 -0
  248. package/types/vadem-ui-form-error-summary.d.ts +46 -0
  249. package/types/vadem-ui-icon.d.ts +152 -0
  250. package/types/vadem-ui-input.d.ts +31 -0
  251. package/types/vadem-ui-kbd.d.ts +66 -0
  252. package/types/vadem-ui-keyboard.d.ts +61 -0
  253. package/types/vadem-ui-locale.d.ts +241 -0
  254. package/types/vadem-ui-menu.d.ts +132 -0
  255. package/types/vadem-ui-navigation-list.d.ts +28 -0
  256. package/types/vadem-ui-number-input.d.ts +39 -0
  257. package/types/vadem-ui-otp-input.d.ts +15 -0
  258. package/types/vadem-ui-pagination.d.ts +96 -0
  259. package/types/vadem-ui-password-input.d.ts +36 -0
  260. package/types/vadem-ui-popover.d.ts +48 -0
  261. package/types/vadem-ui-progress.d.ts +95 -0
  262. package/types/vadem-ui-radio.d.ts +11 -0
  263. package/types/vadem-ui-range-slider.d.ts +136 -0
  264. package/types/vadem-ui-rating.d.ts +95 -0
  265. package/types/vadem-ui-relative-time.d.ts +58 -0
  266. package/types/vadem-ui-reorder-list.d.ts +120 -0
  267. package/types/vadem-ui-scroll-area.d.ts +13 -0
  268. package/types/vadem-ui-search-input.d.ts +58 -0
  269. package/types/vadem-ui-segmented.d.ts +76 -0
  270. package/types/vadem-ui-select.d.ts +303 -0
  271. package/types/vadem-ui-sidebar.d.ts +70 -0
  272. package/types/vadem-ui-skeleton.d.ts +28 -0
  273. package/types/vadem-ui-slider.d.ts +17 -0
  274. package/types/vadem-ui-splitter.d.ts +99 -0
  275. package/types/vadem-ui-stat.d.ts +101 -0
  276. package/types/vadem-ui-stepper.d.ts +108 -0
  277. package/types/vadem-ui-switch.d.ts +10 -0
  278. package/types/vadem-ui-table.d.ts +172 -0
  279. package/types/vadem-ui-tabs.d.ts +101 -0
  280. package/types/vadem-ui-tag-input.d.ts +170 -0
  281. package/types/vadem-ui-text-highlight.d.ts +27 -0
  282. package/types/vadem-ui-time-input.d.ts +47 -0
  283. package/types/vadem-ui-timeline.d.ts +54 -0
  284. package/types/vadem-ui-toast.d.ts +104 -0
  285. package/types/vadem-ui-toolbar.d.ts +80 -0
  286. package/types/vadem-ui-tooltip.d.ts +71 -0
  287. package/types/vadem-ui-tree.d.ts +123 -0
  288. package/types/vadem-ui-upload-list.d.ts +70 -0
  289. package/types/vadem-ui.d.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-select.mjs","names":[],"sources":["../../../projects/ui/select/src/listbox-base.ts","../../../projects/ui/select/src/listbox-host.ts","../../../projects/ui/select/src/combobox.ts","../../../projects/ui/select/src/core/multi-selection.ts","../../../projects/ui/select/src/multi-select.ts","../../../projects/ui/select/src/option.ts","../../../projects/ui/select/src/select.ts"],"sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n ModelSignal,\n OnInit,\n Signal,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport {\n VD_FIELD,\n VdFieldControl,\n VdNgControlState,\n vdNgControlState,\n vdUniqueId,\n} from '@vadem/ui/field';\nimport { VdTypeahead, vdListTarget } from '@vadem/ui/keyboard';\nimport { VdListboxHost } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\nexport type VdSelectSize = 'sm' | 'md' | 'lg';\n\nconst NO_NG_STATE: VdNgControlState = {\n invalid: false,\n touched: false,\n disabled: false,\n required: false,\n};\n\n/**\n * Shared behavior of select, combobox, and multi-select: option registry, active option\n * (aria-activedescendant - focus stays on the combobox element), popover listbox anchored to\n * the field, value + ControlValueAccessor, and `vd-field` wiring.\n */\n@Directive()\nexport abstract class VdListboxBase<T = string | null>\n implements VdListboxHost, ControlValueAccessor, OnInit\n{\n /** Concrete controls define a single-value or array-valued selection model. */\n abstract readonly value: ModelSignal<T>;\n readonly placeholder = input('');\n readonly size = input<VdSelectSize>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Invalid state (e.g. server error); form validity is detected after touch. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Gate for `invalid`; Signal Forms binds it (FormUiControl contract). */\n readonly touched = input<boolean | undefined>(undefined);\n readonly required = input(false, { transform: booleanAttribute });\n /** Shown when no option is visible (e.g. nothing matches the filter). */\n readonly emptyText = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('select', { emptyText: this.emptyText });\n /** Accessible name when there's no `vd-field` label; applied to the inner combobox element. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n readonly listboxId = vdUniqueId('vd-listbox');\n readonly controlId = vdUniqueId('vd-combobox');\n\n protected readonly field = inject(VD_FIELD, { optional: true });\n protected readonly hostEl: HTMLElement = inject(ElementRef).nativeElement;\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly options = signal<readonly VdOption[]>([]);\n protected readonly open = signal(false);\n protected readonly activeId = signal<string | null>(null);\n private readonly formDisabled = signal(false);\n private readonly ngSource = signal<Signal<VdNgControlState> | null>(null);\n private readonly typeahead = new VdTypeahead();\n\n /** The popover listbox element. */\n protected abstract listEl(): HTMLElement | undefined;\n /** What the listbox is anchored to (the visible field). */\n protected abstract anchorEl(): HTMLElement | undefined;\n\n protected readonly ordered = computed(() =>\n [...this.options()].sort((a, b) =>\n a.el.compareDocumentPosition(b.el) & a.el.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n ),\n );\n protected readonly visibleOptions = computed(() =>\n this.ordered().filter((o) => this.isVisible(o)),\n );\n protected readonly selectedOption = computed(() =>\n this.ordered().find((o) => this.isSelected(o)),\n );\n protected readonly selectedLabel = computed(() => this.selectedOption()?.textLabel() ?? '');\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\n private readonly ngState = computed(() => this.ngSource()?.() ?? NO_NG_STATE);\n\n protected readonly showInvalid = computed(() => {\n if (this.invalid() && this.touched() !== false) return true;\n const ng = this.ngState();\n return ng.invalid && ng.touched;\n });\n protected readonly isRequired = computed(() => this.required() || this.ngState().required);\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n\n private onChange: (value: T) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n constructor() {\n const fieldControl: VdFieldControl = {\n id: signal(this.controlId),\n invalid: this.showInvalid,\n required: this.isRequired,\n disabled: this.isDisabled,\n };\n this.field?.register(fieldControl);\n this.destroyRef.onDestroy(() => this.field?.unregister(fieldControl));\n\n // Browser-only: anchor the listbox and keep `open` in sync with light dismiss / Escape.\n afterNextRender(() => {\n const list = this.listEl();\n const anchor = this.anchorEl();\n if (!list || !anchor) return;\n const name = `--${this.listboxId}`;\n anchor.style.setProperty('anchor-name', name);\n list.style.setProperty('position-anchor', name);\n const onToggle = (e: Event) => {\n if ((e as ToggleEvent).newState === 'closed') this.afterClose();\n };\n list.addEventListener('toggle', onToggle);\n this.destroyRef.onDestroy(() => list.removeEventListener('toggle', onToggle));\n });\n\n // Keep the active option visible while navigating.\n afterRenderEffect(() => {\n const id = this.activeId();\n if (!this.open() || !id) return;\n this.ordered()\n .find((o) => o.id === id)\n ?.el.scrollIntoView({ block: 'nearest' });\n });\n }\n\n ngOnInit(): void {\n // Can't inject NgControl in the constructor: it depends on this value accessor.\n const ngControl = this.injector.get(NgControl, null, { self: true, optional: true });\n this.ngSource.set(vdNgControlState(ngControl, this.destroyRef));\n }\n\n // ------------------------------------------------------------- VdListboxHost\n\n abstract isSelected(option: VdOption): boolean;\n\n isActive(option: VdOption): boolean {\n return option.id === this.activeId();\n }\n\n isVisible(_option: VdOption): boolean {\n return true;\n }\n\n abstract choose(option: VdOption): void;\n\n hover(option: VdOption): void {\n if (!option.disabled()) this.activeId.set(option.id);\n }\n\n register(option: VdOption): () => void {\n this.options.update((list) => [...list, option]);\n return () => this.options.update((list) => list.filter((o) => o !== option));\n }\n\n // --------------------------------------------------------- ControlValueAccessor\n\n abstract writeValue(value: T | null): void;\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n // ------------------------------------------------------------------ internals\n\n /** Hook for subclasses after an option was chosen. */\n protected onChosen(_option: VdOption): void {\n /* default: nothing */\n }\n\n /** Hook for subclasses after the list closed (any reason). */\n protected onClosed(): void {\n /* default: nothing */\n }\n\n protected setValue(value: T): void {\n if (value === this.value()) return;\n this.value.set(value);\n this.onChange(value);\n }\n\n protected markTouched(): void {\n this.onTouched();\n }\n\n protected openList(start: 'selected' | 'first' | 'last' = 'selected'): void {\n if (this.isDisabled() || this.open()) return;\n const list = this.listEl();\n if (!list) return;\n this.open.set(true);\n // `source` ties the popover to its field: clicks on the field don't light-dismiss it.\n // Engines without the option ignore it.\n list.showPopover({ source: this.anchorEl() } as ShowPopoverOptions);\n this.activate(start);\n }\n\n protected closeList(): void {\n const list = this.listEl();\n if (list?.matches(':popover-open')) list.hidePopover();\n else this.afterClose();\n }\n\n protected activate(start: 'selected' | 'first' | 'last'): void {\n const visible = this.visibleOptions();\n const enabled = visible.filter((o) => !o.disabled());\n const pick =\n start === 'selected'\n ? (enabled.find((o) => this.isSelected(o)) ?? enabled[0])\n : start === 'first'\n ? enabled[0]\n : enabled[enabled.length - 1];\n this.activeId.set(pick?.id ?? null);\n }\n\n /** Handles list navigation keys. Returns true when the key was used. */\n protected navigate(event: KeyboardEvent): boolean {\n const visible = this.visibleOptions();\n const current = visible.findIndex((o) => o.id === this.activeId());\n const target = vdListTarget(\n event.key,\n current,\n visible.map((o) => o.disabled()),\n { loop: false, pageSize: 10 },\n );\n if (target === null) return false;\n event.preventDefault();\n this.activeId.set(visible[target]?.id ?? null);\n return true;\n }\n\n /** Feeds a printable key to typeahead. Returns the matched option, if any. */\n protected typeaheadMatch(event: KeyboardEvent): VdOption | undefined {\n if (!VdTypeahead.accepts(event)) return undefined;\n const visible = this.visibleOptions();\n const current = visible.findIndex(\n (o) => o.id === (this.activeId() ?? this.selectedOption()?.id),\n );\n const idx = this.typeahead.match(\n event.key,\n visible.map((o) => o.textLabel()),\n visible.map((o) => o.disabled()),\n current,\n );\n return idx === null ? undefined : visible[idx];\n }\n\n protected activeOption(): VdOption | undefined {\n return this.visibleOptions().find((o) => o.id === this.activeId());\n }\n\n private afterClose(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.activeId.set(null);\n this.typeahead.reset();\n this.onClosed();\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport type { VdOption } from './option';\n\n/** What an option needs from the select, combobox, or multi-select that owns it. */\nexport interface VdListboxHost {\n isSelected(option: VdOption): boolean;\n isActive(option: VdOption): boolean;\n isVisible(option: VdOption): boolean;\n choose(option: VdOption): void;\n hover(option: VdOption): void;\n register(option: VdOption): () => void;\n}\n\nexport const VD_LISTBOX = new InjectionToken<VdListboxHost>('VD_LISTBOX');\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Editable combobox with list autocomplete (APG): type to filter, pick with arrows + Enter or\n * click. The value is always one of the options; free text reverts on blur. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-combobox',\n imports: [VdIcon],\n template: `\n <!-- Pointer convenience only: the input inside handles every key. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div\n #field\n class=\"vd-combobox__field\"\n (pointerdown)=\"onFieldPointerDown($event)\"\n (click)=\"onFieldClick($event)\"\n >\n <vd-icon name=\"search\" class=\"vd-combobox__icon\" />\n <input\n #input\n class=\"vd-combobox__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"inputText()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-combobox',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdCombobox) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdCombobox), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdCombobox extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen();\n this.closeList();\n }\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n\n /** Text being typed; `null` when not filtering (the input shows the selected label). */\n private readonly query = signal<string | null>(null);\n protected readonly inputText = computed(() => this.query() ?? this.selectedLabel());\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n override isVisible(option: VdOption): boolean {\n const q = this.query();\n return q === null || vdMatchesQuery(option.textLabel(), q);\n }\n\n protected override onChosen(): void {\n this.query.set(null);\n }\n\n protected override onClosed(): void {\n this.query.set(null);\n if (this.hostEl.ownerDocument.activeElement !== this.inputRef().nativeElement)\n this.markTouched();\n }\n\n /** Whether the list was open when the press started (light dismiss may close it first). */\n private wasOpen = false;\n\n protected onFieldPointerDown(event: PointerEvent): void {\n this.wasOpen = this.open();\n const input = this.inputRef().nativeElement;\n // Icons and padding focus the input instead of stealing focus.\n if (event.target !== input && !this.isDisabled()) {\n event.preventDefault();\n input.focus();\n }\n }\n\n protected onFieldClick(event: MouseEvent): void {\n if (this.isDisabled()) return;\n const onInput = event.target === this.inputRef().nativeElement;\n if (this.open() && !onInput) this.closeList();\n else if (!this.open() && !(this.wasOpen && !onInput)) this.openList('selected');\n this.wasOpen = false;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if (!this.open()) this.openList('first');\n else this.activate('first');\n }\n\n protected onBlur(): void {\n this.query.set(null);\n if (!this.open()) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n // Home/End keep moving the caret in the text field.\n this.navigate(event);\n }\n }\n}\n","/** Immutable, unique selection values. Unknown values remain until the consumer removes them. */\nexport function vdUniqueSelection(values: readonly string[] | null): string[] {\n return [...new Set(values ?? [])];\n}\n\nexport function vdToggleSelection(values: readonly string[], value: string): string[] {\n return values.includes(value)\n ? values.filter((item) => item !== value)\n : [...new Set([...values, value])];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n computed,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdMatchesQuery } from '@vadem/ui/keyboard';\nimport { vdToggleSelection, vdUniqueSelection } from './core/multi-selection';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** Searchable multiple selection. Spec: specs/multi-select.md. */\n@Component({\n selector: 'vd-multi-select',\n imports: [VdIcon],\n template: `\n <div #field class=\"vd-multi-select__field\" (pointerdown)=\"onFieldPointerDown($event)\">\n @for (item of selectedItems(); track item.value) {\n <span class=\"vd-multi-select__chip\">\n <span class=\"vd-multi-select__label\" [title]=\"item.label\">{{ item.label }}</span>\n <button\n type=\"button\"\n class=\"vd-multi-select__remove\"\n [disabled]=\"isDisabled() || item.disabled\"\n [attr.aria-label]=\"multiTexts().removeLabel(item.label)\"\n (click)=\"remove(item.value)\"\n >\n <vd-icon name=\"x\" />\n </button>\n </span>\n }\n <input\n #input\n class=\"vd-multi-select__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n autocomplete=\"off\"\n [id]=\"controlId\"\n [value]=\"query()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"descriptionIds()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (click)=\"openList()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (compositionend)=\"onInput($event)\"\n />\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </div>\n <span class=\"vd-visually-hidden\" [id]=\"summaryId\" role=\"status\" aria-atomic=\"true\">\n {{ multiTexts().selectionLabel(selectedItems().length) }}\n </span>\n <div\n #list\n class=\"vd-listbox vd-multi-select__list\"\n popover=\"auto\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [id]=\"listboxId\"\n tabindex=\"-1\"\n >\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-multi-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '(focusout)': 'onFocusOut($event)',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdMultiSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdMultiSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdMultiSelect extends VdListboxBase<string[]> {\n readonly value = model<string[]>([]);\n readonly removeLabel = input<(label: string) => string>();\n readonly selectionLabel = input<(count: number) => string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly multiTexts = vdTexts('multiSelect', {\n removeLabel: this.removeLabel,\n selectionLabel: this.selectionLabel,\n });\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLElement>>('field');\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n protected readonly query = signal('');\n protected readonly summaryId = vdUniqueId('vd-selection');\n protected readonly descriptionIds = computed(() =>\n [this.describedBy(), this.summaryId].filter(Boolean).join(' '),\n );\n protected readonly selectedItems = computed(() =>\n vdUniqueSelection(this.value()).map((value) => {\n const option = this.ordered().find((item) => item.value() === value);\n return { value, label: option?.textLabel() || value, disabled: option?.disabled() ?? false };\n }),\n );\n\n constructor() {\n super();\n afterRenderEffect(() => {\n if (this.isDisabled()) this.closeList();\n else if (this.open()) {\n // A query, dynamic option removal, or disabled change must never leave a dangling id.\n const active = this.activeOption();\n if (!active || active.disabled()) this.activate('first');\n }\n });\n }\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.fieldRef()?.nativeElement;\n }\n\n focus(): void {\n this.inputRef().nativeElement.focus();\n }\n\n isSelected(option: VdOption): boolean {\n return this.value().includes(option.value());\n }\n\n override isVisible(option: VdOption): boolean {\n return vdMatchesQuery(option.textLabel(), this.query());\n }\n\n choose(option: VdOption): void {\n if (this.isDisabled() || option.disabled()) return;\n this.setValue(vdToggleSelection(this.value(), option.value()));\n this.focus();\n }\n\n writeValue(value: string[] | null): void {\n this.value.set(vdUniqueSelection(value));\n }\n\n protected remove(value: string): void {\n const item = this.selectedItems().find((item) => item.value === value);\n if (this.isDisabled() || item?.disabled) return;\n this.setValue(this.value().filter((item) => item !== value));\n this.focus();\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n if ((event as InputEvent).isComposing) return;\n this.openList('first');\n this.activate('first');\n }\n\n protected onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget as Node | null;\n if (next && this.hostEl.contains(next)) return;\n this.markTouched();\n this.closeList();\n }\n\n protected onFieldPointerDown(event: PointerEvent): void {\n const target = event.target as HTMLElement;\n if (this.isDisabled() || target.closest('button') || target === this.inputRef().nativeElement)\n return;\n event.preventDefault();\n this.focus();\n this.openList();\n }\n\n protected override onClosed(): void {\n this.query.set('');\n if (!this.hostEl.contains(this.hostEl.ownerDocument.activeElement)) this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.isComposing || this.isDisabled()) return;\n const { key, altKey } = event;\n if (key === 'Backspace' && this.query() === '') {\n const last = this.selectedItems().at(-1);\n if (last && !last.disabled) {\n event.preventDefault();\n this.remove(last.value);\n }\n } else if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp') {\n event.preventDefault();\n this.openList(key === 'ArrowUp' ? 'last' : 'selected');\n }\n } else if (key === 'Escape' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n event.stopPropagation();\n this.closeList();\n } else if (key === 'Enter') {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n } else if (key === 'Tab') {\n this.closeList();\n } else if (key !== 'Home' && key !== 'End') {\n this.navigate(event);\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n OnInit,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VD_LISTBOX } from './listbox-host';\n\n/** One option of select, combobox, or multi-select. Specs: select.md, multi-select.md. */\n@Component({\n selector: 'vd-option',\n imports: [VdIcon],\n template: `\n <span class=\"vd-option__label\"><ng-content /></span>\n <vd-icon name=\"check\" class=\"vd-option__check\" />\n `,\n host: {\n class: 'vd-option',\n role: 'option',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.data-active]': 'active() ? \"\" : null',\n '[hidden]': '!visible()',\n '(click)': 'host.choose(this)',\n '(pointermove)': 'host.hover(this)',\n // Keep focus on the combobox element while clicking options.\n '(mousedown)': '$event.preventDefault()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdOption implements OnInit {\n readonly value = input.required<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Text for the trigger, typeahead and filtering. Defaults to the option's text content. */\n readonly label = input<string>();\n\n protected readonly host = inject(VD_LISTBOX);\n readonly el: HTMLElement = inject(ElementRef).nativeElement;\n readonly id = vdUniqueId('vd-option');\n private readonly destroyRef = inject(DestroyRef);\n\n protected readonly selected = computed(() => this.host.isSelected(this));\n protected readonly active = computed(() => this.host.isActive(this));\n protected readonly visible = computed(() => this.host.isVisible(this));\n\n textLabel(): string {\n return this.label() ?? this.el.querySelector('.vd-option__label')?.textContent?.trim() ?? '';\n }\n\n ngOnInit(): void {\n this.destroyRef.onDestroy(this.host.register(this));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n forwardRef,\n model,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VdListboxBase } from './listbox-base';\nimport { VD_LISTBOX } from './listbox-host';\nimport type { VdOption } from './option';\n\n/**\n * Select-only combobox (APG): a button that opens a listbox; focus stays on the button and the\n * active option is exposed with aria-activedescendant. Spec: specs/select.md\n */\n@Component({\n selector: 'vd-select',\n imports: [VdIcon],\n template: `\n <button\n #trigger\n type=\"button\"\n class=\"vd-select__trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [id]=\"controlId\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeId() : null\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n [attr.aria-required]=\"isRequired() || null\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n (pointerdown)=\"wasOpen = open()\"\n (click)=\"onClick()\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n >\n <span class=\"vd-select__value\" [attr.data-placeholder]=\"selectedLabel() ? null : ''\">\n {{ selectedLabel() || placeholder() }}\n </span>\n <vd-icon name=\"chevron-down\" class=\"vd-select__chevron\" />\n </button>\n <div #list class=\"vd-listbox\" popover=\"auto\" role=\"listbox\" [id]=\"listboxId\" tabindex=\"-1\">\n <ng-content />\n @if (visibleOptions().length === 0) {\n <p class=\"vd-listbox__empty\">{{ t().emptyText }}</p>\n }\n </div>\n `,\n host: {\n class: 'vd-select',\n '[attr.data-size]': 'size()',\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-invalid]': 'showInvalid() ? \"\" : null',\n '[attr.data-disabled]': 'isDisabled() ? \"\" : null',\n // Naming attributes move to the inner combobox element.\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n },\n providers: [\n { provide: VD_LISTBOX, useExisting: forwardRef(() => VdSelect) },\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => VdSelect), multi: true },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdSelect extends VdListboxBase {\n readonly value = model<string | null>(null);\n\n isSelected(option: VdOption): boolean {\n return option.value() === this.value();\n }\n\n writeValue(value: string | null): void {\n this.value.set(value ?? null);\n }\n\n choose(option: VdOption): void {\n if (option.disabled() || this.isDisabled()) return;\n this.setValue(option.value());\n this.onChosen(option);\n this.closeList();\n }\n\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly list = viewChild.required<ElementRef<HTMLElement>>('list');\n /** Light dismiss closes the list on pointerdown; the following click must not reopen it. */\n protected wasOpen = false;\n\n protected listEl(): HTMLElement | undefined {\n return this.list()?.nativeElement;\n }\n\n protected anchorEl(): HTMLElement | undefined {\n return this.trigger()?.nativeElement;\n }\n\n focus(): void {\n this.trigger().nativeElement.focus();\n }\n\n protected onClick(): void {\n if (this.wasOpen || this.open()) {\n this.wasOpen = false;\n this.closeList();\n return;\n }\n this.openList('selected');\n }\n\n protected onBlur(): void {\n if (!this.open()) this.markTouched();\n }\n\n protected override onClosed(): void {\n // Light dismiss moved focus elsewhere: the user has left the field.\n if (this.hostEl.ownerDocument.activeElement !== this.trigger().nativeElement)\n this.markTouched();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const { key, altKey } = event;\n\n if (!this.open()) {\n if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.openList('selected');\n } else if (key === 'Home' || key === 'End') {\n event.preventDefault();\n this.openList(key === 'Home' ? 'first' : 'last');\n } else {\n const match = this.typeaheadMatch(event);\n if (match) {\n // APG: typing on a closed select opens it on the match.\n this.openList('selected');\n this.activeId.set(match.id);\n }\n }\n return;\n }\n\n if (key === 'Escape') {\n event.preventDefault();\n this.closeList();\n } else if (key === 'Enter' || key === ' ' || (altKey && key === 'ArrowUp')) {\n event.preventDefault();\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (key === 'Tab') {\n const active = this.activeOption();\n if (active) this.choose(active);\n else this.closeList();\n } else if (!this.navigate(event)) {\n const match = this.typeaheadMatch(event);\n if (match) this.activeId.set(match.id);\n }\n }\n}\n"],"mappings":";;;;;;;AA+BA,MAAM,cAAgC;CACpC,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;AACX;AAQD,IAAsB,gBAAtB,MAAsB,cAAa;CAKxB,cAAc,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,OAAO,MAAoB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,UAAU,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,UAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAEpD,UAAU,MAA2B,QAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAC/C,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,YAAY,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEjB,IAAI,QAAQ,UAAU,EAAE,WAAW,KAAK,UAAS,CAAE;CAE7D,YAAY,MAA0B,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,YAAA,+BAAA,CAAA;EAAI,OAAO;CAAY,CAAA;CACtE,iBAAiB,MAA0B,QAAS;EAAA,GAAA,YAAA,EAAA,WAAA,iBAAA,+BAAA,CAAA;EAAI,OAAO;CAAiB,CAAA;CAEhF,YAAY,WAAW,YAAY;CACnC,YAAY,WAAW,aAAa;CAE1B,QAAQ,OAAO,UAAU,EAAE,UAAU,KAAI,CAAE;CAC3C,SAAsB,OAAO,UAAU,CAAC,CAAC;CAC3C,WAAW,OAAO,QAAQ;CAC1B,aAAa,OAAO,UAAU;CAE9B,UAAU,OAA4B,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACvC,OAAO,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACpB,WAAW,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACxC,eAAe,OAAO,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAC5B,WAAW,OAAwC,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACxD,YAAY,IAAI,YAAW;CAOzB,UAAU,eAC3B,CAAC,GAAG,KAAK,QAAO,CAAE,CAAC,CAAC,MAAM,GAAG,MAC3B,EAAE,GAAG,wBAAwB,EAAE,EAAE,IAAI,EAAE,GAAG,8BAA8B,KAAK,CAAC,GAEjF,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,iBAAiB,eAClC,KAAK,QAAO,CAAE,CAAC,QAAQ,MAAM,KAAK,UAAU,CAAC,CAAC,GAC/C,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,iBAAiB,eAClC,KAAK,QAAO,CAAE,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,GAC9C,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,gBAAgB,eAAe,KAAK,eAAc,CAAE,EAAE,UAAS,KAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CACxE,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,aAAY,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACrE,UAAU,eAAe,KAAK,SAAQ,CAAE,GAAE,KAAM,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAE1D,cAAc,eAAc;EAC7C,IAAI,KAAK,QAAO,KAAM,KAAK,QAAO,MAAO,OAAO,OAAO;EACvD,MAAM,KAAK,KAAK,QAAO;EACvB,OAAO,GAAG,WAAW,GAAG;CAC1B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,aAAa,eAAe,KAAK,SAAQ,KAAM,KAAK,QAAO,CAAE,CAAC,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACvE,cAAc,eAAe,KAAK,OAAO,YAAW,KAAM,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAE1E,iBAAqC;CACrC,kBAA8B;CAEtC,cAAA;EACE,MAAM,eAA+B;GACnC,IAAI,OAAO,KAAK,SAAS;GACzB,SAAS,KAAK;GACd,UAAU,KAAK;GACf,UAAU,KAAK;EAChB;EACD,KAAK,OAAO,SAAS,YAAY;EACjC,KAAK,WAAW,gBAAgB,KAAK,OAAO,WAAW,YAAY,CAAC;EAGpE,sBAAqB;GACnB,MAAM,OAAO,KAAK,OAAM;GACxB,MAAM,SAAS,KAAK,SAAQ;GAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ;GACtB,MAAM,OAAO,KAAK,KAAK;GACvB,OAAO,MAAM,YAAY,eAAe,IAAI;GAC5C,KAAK,MAAM,YAAY,mBAAmB,IAAI;GAC9C,MAAM,YAAY,MAAY;IAC5B,IAAK,EAAkB,aAAa,UAAU,KAAK,WAAU;GAC/D;GACA,KAAK,iBAAiB,UAAU,QAAQ;GACxC,KAAK,WAAW,gBAAgB,KAAK,oBAAoB,UAAU,QAAQ,CAAC;EAC9E,CAAC;EAGD,wBAAuB;GACrB,MAAM,KAAK,KAAK,SAAQ;GACxB,IAAI,CAAC,KAAK,KAAI,KAAM,CAAC,IAAI;GACzB,KAAK,QAAO,CAAE,CACX,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,EACvB,GAAG,eAAe,EAAE,OAAO,UAAS,CAAE;EAC5C,CAAC;CACH;CAEA,WAAQ;EAEN,MAAM,YAAY,KAAK,SAAS,IAAI,WAAW,MAAM;GAAE,MAAM;GAAM,UAAU;EAAI,CAAE;EACnF,KAAK,SAAS,IAAI,iBAAiB,WAAW,KAAK,UAAU,CAAC;CAChE;CAMA,SAAS,QAAgB;EACvB,OAAO,OAAO,OAAO,KAAK,SAAQ;CACpC;CAEA,UAAU,SAAiB;EACzB,OAAO;CACT;CAIA,MAAM,QAAgB;EACpB,IAAI,CAAC,OAAO,SAAQ,GAAI,KAAK,SAAS,IAAI,OAAO,EAAE;CACrD;CAEA,SAAS,QAAgB;EACvB,KAAK,QAAQ,QAAQ,SAAS,CAAC,GAAG,MAAM,MAAM,CAAC;EAC/C,aAAa,KAAK,QAAQ,QAAQ,SAAS,KAAK,QAAQ,MAAM,MAAM,MAAM,CAAC;CAC7E;CAMA,iBAAiB,IAAsB;EACrC,KAAK,WAAW;CAClB;CAEA,kBAAkB,IAAc;EAC9B,KAAK,YAAY;CACnB;CAEA,iBAAiB,UAAiB;EAChC,KAAK,aAAa,IAAI,QAAQ;CAChC;CAKU,SAAS,SAAiB,CAEpC;CAGU,WAAQ,CAElB;CAEU,SAAS,OAAQ;EACzB,IAAI,UAAU,KAAK,MAAK,GAAI;EAC5B,KAAK,MAAM,IAAI,KAAK;EACpB,KAAK,SAAS,KAAK;CACrB;CAEU,cAAW;EACnB,KAAK,UAAS;CAChB;CAEU,SAAS,QAAuC,YAAU;EAClE,IAAI,KAAK,WAAU,KAAM,KAAK,KAAI,GAAI;EACtC,MAAM,OAAO,KAAK,OAAM;EACxB,IAAI,CAAC,MAAM;EACX,KAAK,KAAK,IAAI,IAAI;EAGlB,KAAK,YAAY,EAAE,QAAQ,KAAK,SAAQ,EAAE,CAAwB;EAClE,KAAK,SAAS,KAAK;CACrB;CAEU,YAAS;EACjB,MAAM,OAAO,KAAK,OAAM;EACxB,IAAI,MAAM,QAAQ,eAAe,GAAG,KAAK,YAAW;OAC/C,KAAK,WAAU;CACtB;CAEU,SAAS,OAAoC;EAErD,MAAM,UADU,KAAK,eACL,CAAA,CAAQ,QAAQ,MAAM,CAAC,EAAE,SAAQ,CAAE;EACnD,MAAM,OACJ,UAAU,aACL,QAAQ,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,KAAK,QAAQ,KACpD,UAAU,UACR,QAAQ,KACR,QAAQ,QAAQ,SAAS;EACjC,KAAK,SAAS,IAAI,MAAM,MAAM,IAAI;CACpC;CAGU,SAAS,OAAoB;EACrC,MAAM,UAAU,KAAK,eAAc;EACnC,MAAM,UAAU,QAAQ,WAAW,MAAM,EAAE,OAAO,KAAK,SAAQ,CAAE;EACjE,MAAM,SAAS,aACb,MAAM,KACN,SACA,QAAQ,KAAK,MAAM,EAAE,SAAQ,CAAE,GAC/B;GAAE,MAAM;GAAO,UAAU;EAAE,CAAE;EAE/B,IAAI,WAAW,MAAM,OAAO;EAC5B,MAAM,eAAc;EACpB,KAAK,SAAS,IAAI,QAAQ,OAAO,EAAE,MAAM,IAAI;EAC7C,OAAO;CACT;CAGU,eAAe,OAAoB;EAC3C,IAAI,CAAC,YAAY,QAAQ,KAAK,GAAG,OAAO;EACxC,MAAM,UAAU,KAAK,eAAc;EACnC,MAAM,UAAU,QAAQ,WACrB,MAAM,EAAE,QAAQ,KAAK,SAAQ,KAAM,KAAK,eAAc,CAAE,EAAE,GAAG;EAEhE,MAAM,MAAM,KAAK,UAAU,MACzB,MAAM,KACN,QAAQ,KAAK,MAAM,EAAE,UAAS,CAAE,GAChC,QAAQ,KAAK,MAAM,EAAE,SAAQ,CAAE,GAC/B,OAAO;EAET,OAAO,QAAQ,OAAO,SAAY,QAAQ;CAC5C;CAEU,eAAY;EACpB,OAAO,KAAK,eAAc,CAAE,CAAC,MAAM,MAAM,EAAE,OAAO,KAAK,SAAQ,CAAE;CACnE;CAEQ,aAAU;EAChB,IAAI,CAAC,KAAK,KAAI,GAAI;EAClB,KAAK,KAAK,IAAI,KAAK;EACnB,KAAK,SAAS,IAAI,IAAI;EACtB,KAAK,UAAU,MAAK;EACpB,KAAK,SAAQ;CACf;CAhPoB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAa,cAAA;EAAA,QAAA;GAAA,aAAA;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,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,WAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAb,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA,EADlC,MAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9BD,MAAa,aAAa,IAAI,eAA8B,YAAY;ACsExE,IAAa,aAAb,MAAa,mBAAmB,cAAa;CAClC,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3C,WAAW,QAAgB;EACzB,OAAO,OAAO,MAAK,MAAO,KAAK,MAAK;CACtC;CAEA,WAAW,OAAoB;EAC7B,KAAK,MAAM,IAAI,SAAS,IAAI;CAC9B;CAEA,OAAO,QAAgB;EACrB,IAAI,OAAO,SAAQ,KAAM,KAAK,WAAU,GAAI;EAC5C,KAAK,SAAS,OAAO,MAAK,CAAE;EAC5B,KAAK,SAAQ;EACb,KAAK,UAAS;CAChB;CAEiB,WAAW,UAAU,SAAkC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,WAAW,UAAU,SAAuC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAG1D,QAAQ,OAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,YAAY,eAAe,KAAK,MAAK,KAAM,KAAK,cAAa,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CAEzE,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,SAAQ,CAAE,EAAE;CAC1B;CAEA,QAAK;EACH,KAAK,SAAQ,CAAE,CAAC,cAAc,MAAK;CACrC;CAES,UAAU,QAAgB;EACjC,MAAM,IAAI,KAAK,MAAK;EACpB,OAAO,MAAM,QAAQ,eAAe,OAAO,UAAS,GAAI,CAAC;CAC3D;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,IAAI;CACrB;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,IAAI;EACnB,IAAI,KAAK,OAAO,cAAc,kBAAkB,KAAK,SAAQ,CAAE,CAAC,eAC9D,KAAK,YAAW;CACpB;CAGQ,UAAU;CAER,mBAAmB,OAAmB;EAC9C,KAAK,UAAU,KAAK,KAAI;EACxB,MAAM,QAAQ,KAAK,SAAQ,CAAE,CAAC;EAE9B,IAAI,MAAM,WAAW,SAAS,CAAC,KAAK,WAAU,GAAI;GAChD,MAAM,eAAc;GACpB,MAAM,MAAK;EACb;CACF;CAEU,aAAa,OAAiB;EACtC,IAAI,KAAK,WAAU,GAAI;EACvB,MAAM,UAAU,MAAM,WAAW,KAAK,SAAQ,CAAE,CAAC;EACjD,IAAI,KAAK,KAAI,KAAM,CAAC,SAAS,KAAK,UAAS;OACtC,IAAI,CAAC,KAAK,KAAI,KAAM,EAAE,KAAK,WAAW,CAAC,UAAU,KAAK,SAAS,UAAU;EAC9E,KAAK,UAAU;CACjB;CAEU,QAAQ,OAAY;EAC5B,KAAK,MAAM,IAAK,MAAM,OAA4B,KAAK;EACvD,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,SAAS,OAAO;OAClC,KAAK,SAAS,OAAO;CAC5B;CAEU,SAAM;EACd,KAAK,MAAM,IAAI,IAAI;EACnB,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,YAAW;CACpC;CAEU,UAAU,OAAoB;EACtC,MAAM,EAAE,KAAK,WAAW;EAExB,IAAI,CAAC,KAAK,KAAI,GAAI;GAChB,IAAI,QAAQ,eAAe,QAAQ,WAAW;IAC5C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,YAAY,SAAS,UAAU;GACvD;GACA;EACF;EAEA,IAAI,QAAQ,UAAU;GACpB,MAAM,eAAc;GACpB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,WAAY,UAAU,QAAQ,WAAY;GAC3D,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,QAAQ,OACjB,KAAK,UAAS;OACT,IAAI,QAAQ,UAAU,QAAQ,OAEnC,KAAK,SAAS,KAAK;CAEvB;CA9GW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPV,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,UAAU;EAAC,GAChE;GAAE,SAAS;GAAmB,aAAa,iBAAiB,UAAU;GAAG,OAAO;EAAI,CACrF;EAAA,aAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,MAAA;IAAA,aAAA;IAAA,UAAA;GAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UAtDS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAzCS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AA2DL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EA7DtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IAExB,qBAAqB;IACrB,0BAA0B;GAC3B;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,UAAW;GAAC,GAChE;IAAE,SAAS;IAAmB,aAAa,iBAAgB,UAAW;IAAG,OAAO;GAAI,CACrF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAmByE,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACF,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAChB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;ACtG5E,SAAgB,kBAAkB,QAAgC;CAChE,OAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAA,CAAE,CAAC;AAClC;AAEA,SAAgB,kBAAkB,QAA2B,OAAa;CACxE,OAAO,OAAO,SAAS,KAAK,IACxB,OAAO,QAAQ,SAAS,SAAS,KAAK,IACtC,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC;AACrC;ACgGA,IAAa,gBAAb,MAAa,sBAAsB,cAAuB;CAC/C,QAAQ,MAAgB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC3B,cAAc,MAAkC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAChD,iBAAiB,MAAkC,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,aAAa,QAAQ,eAAe;EACrD,aAAa,KAAK;EAClB,gBAAgB,KAAK;CACtB,CAAA;CAEgB,WAAW,UAAU,SAAkC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CAC/D,WAAW,UAAU,SAAuC,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxD,QAAQ,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAClB,YAAY,WAAW,cAAc;CACrC,iBAAiB,eAClC,CAAC,KAAK,YAAW,GAAI,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GAC9D,GAAA,YAAA,CAAA,EAAA,WAAA,iBAAA,CAAA,+BAAA,CAAA,CAAA;CACkB,gBAAgB,eACjC,kBAAkB,KAAK,MAAK,CAAE,CAAC,CAAC,KAAK,UAAS;EAC5C,MAAM,SAAS,KAAK,QAAO,CAAE,CAAC,MAAM,SAAS,KAAK,MAAK,MAAO,KAAK;EACnE,OAAO;GAAE;GAAO,OAAO,QAAQ,UAAS,KAAM;GAAO,UAAU,QAAQ,SAAQ,KAAM;EAAK;CAC5F,CAAC,GACF,GAAA,YAAA,CAAA,EAAA,WAAA,gBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,cAAA;EACE,MAAK;EACL,wBAAuB;GACrB,IAAI,KAAK,WAAU,GAAI,KAAK,UAAS;QAChC,IAAI,KAAK,KAAI,GAAI;IAEpB,MAAM,SAAS,KAAK,aAAY;IAChC,IAAI,CAAC,UAAU,OAAO,SAAQ,GAAI,KAAK,SAAS,OAAO;GACzD;EACF,CAAC;CACH;CAEU,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,SAAQ,CAAE,EAAE;CAC1B;CAEA,QAAK;EACH,KAAK,SAAQ,CAAE,CAAC,cAAc,MAAK;CACrC;CAEA,WAAW,QAAgB;EACzB,OAAO,KAAK,MAAK,CAAE,CAAC,SAAS,OAAO,MAAK,CAAE;CAC7C;CAES,UAAU,QAAgB;EACjC,OAAO,eAAe,OAAO,UAAS,GAAI,KAAK,MAAK,CAAE;CACxD;CAEA,OAAO,QAAgB;EACrB,IAAI,KAAK,WAAU,KAAM,OAAO,SAAQ,GAAI;EAC5C,KAAK,SAAS,kBAAkB,KAAK,MAAK,GAAI,OAAO,MAAK,CAAE,CAAC;EAC7D,KAAK,MAAK;CACZ;CAEA,WAAW,OAAsB;EAC/B,KAAK,MAAM,IAAI,kBAAkB,KAAK,CAAC;CACzC;CAEU,OAAO,OAAa;EAC5B,MAAM,OAAO,KAAK,cAAa,CAAE,CAAC,MAAM,SAAS,KAAK,UAAU,KAAK;EACrE,IAAI,KAAK,WAAU,KAAM,MAAM,UAAU;EACzC,KAAK,SAAS,KAAK,MAAK,CAAE,CAAC,QAAQ,SAAS,SAAS,KAAK,CAAC;EAC3D,KAAK,MAAK;CACZ;CAEU,QAAQ,OAAY;EAC5B,KAAK,MAAM,IAAK,MAAM,OAA4B,KAAK;EACvD,IAAK,MAAqB,aAAa;EACvC,KAAK,SAAS,OAAO;EACrB,KAAK,SAAS,OAAO;CACvB;CAEU,WAAW,OAAiB;EACpC,MAAM,OAAO,MAAM;EACnB,IAAI,QAAQ,KAAK,OAAO,SAAS,IAAI,GAAG;EACxC,KAAK,YAAW;EAChB,KAAK,UAAS;CAChB;CAEU,mBAAmB,OAAmB;EAC9C,MAAM,SAAS,MAAM;EACrB,IAAI,KAAK,WAAU,KAAM,OAAO,QAAQ,QAAQ,KAAK,WAAW,KAAK,SAAQ,CAAE,CAAC,eAC9E;EACF,MAAM,eAAc;EACpB,KAAK,MAAK;EACV,KAAK,SAAQ;CACf;CAEmB,WAAQ;EACzB,KAAK,MAAM,IAAI,EAAE;EACjB,IAAI,CAAC,KAAK,OAAO,SAAS,KAAK,OAAO,cAAc,aAAa,GAAG,KAAK,YAAW;CACtF;CAEU,UAAU,OAAoB;EACtC,IAAI,MAAM,eAAe,KAAK,WAAU,GAAI;EAC5C,MAAM,EAAE,KAAK,WAAW;EACxB,IAAI,QAAQ,eAAe,KAAK,MAAK,MAAO,IAAI;GAC9C,MAAM,OAAO,KAAK,cAAa,CAAE,CAAC,GAAG,EAAE;GACvC,IAAI,QAAQ,CAAC,KAAK,UAAU;IAC1B,MAAM,eAAc;IACpB,KAAK,OAAO,KAAK,KAAK;GACxB;EACF,OAAO,IAAI,CAAC,KAAK,KAAI,GACnB;OAAI,QAAQ,eAAe,QAAQ,WAAW;IAC5C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,YAAY,SAAS,UAAU;GACvD;SACK,IAAI,QAAQ,YAAa,UAAU,QAAQ,WAAY;GAC5D,MAAM,eAAc;GACpB,MAAM,gBAAe;GACrB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,SAAS;GAC1B,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;EAChC,OAAO,IAAI,QAAQ,OACjB,KAAK,UAAS;OACT,IAAI,QAAQ,UAAU,QAAQ,OACnC,KAAK,SAAS,KAAK;CAEvB;CAjIW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAa,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAb,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAa,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,gBAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,WAAA,EAAA,YAAA,qBAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPb,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,aAAa;EAAC,GACnE;GAAE,SAAS;GAAmB,aAAa,iBAAiB,aAAa;GAAG,OAAO;EAAI,CACxF;EAAA,aAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,OAAA;IAAA,aAAA;IAAA,UAAA;GAAA;GAAA;IAAA,cAAA;IAAA,OAAA;IAAA,WAAA,CAAA,MAAA;IAAA,aAAA;IAAA,UAAA;GAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UA1ES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2DT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MA5DS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AA+EL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAa,YAAA,CAAA;EAjFzB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,qBAAqB;IACrB,0BAA0B;IAC1B,cAAc;GACf;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,aAAc;GAAC,GACnE;IAAE,SAAS;IAAmB,aAAa,iBAAgB,aAAc;IAAG,OAAO;GAAI,CACxF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAWyE,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,UAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CACF,SAAO,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAChB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA;AC7E5E,IAAa,WAAb,MAAa,SAAQ;CACV,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAChC,WAAW,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,WAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAErD,QAAQ,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEb,OAAO,OAAO,UAAU;CAClC,KAAkB,OAAO,UAAU,CAAC,CAAC;CACrC,KAAK,WAAW,WAAW;CACnB,aAAa,OAAO,UAAU;CAE5B,WAAW,eAAe,KAAK,KAAK,WAAW,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACrD,SAAS,eAAe,KAAK,KAAK,SAAS,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,UAAU,eAAe,KAAK,KAAK,UAAU,IAAI,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtE,YAAS;EACP,OAAO,KAAK,MAAK,KAAM,KAAK,GAAG,cAAc,mBAAmB,CAAC,EAAE,aAAa,KAAI,KAAM;CAC5F;CAEA,WAAQ;EACN,KAAK,WAAW,UAAU,KAAK,KAAK,SAAS,IAAI,CAAC;CACpD;CArBW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,SAAA;GAAA,WAAA;IAAA,SAAA;IAAA,eAAA;IAAA,aAAA;GAAA;GAAA,YAAA;IAAA,MAAA;IAAA,sBAAA;IAAA,sBAAA;IAAA,oBAAA;IAAA,UAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UApBT;;;;EAGT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAJS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAqBL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAvBpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;GAIV,MAAM;IACJ,OAAO;IACP,MAAM;IACN,QAAQ;IACR,wBAAwB;IACxB,wBAAwB;IACxB,sBAAsB;IACtB,YAAY;IACZ,WAAW;IACX,iBAAiB;IAEjB,eAAe;GAChB;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkCD,IAAa,WAAb,MAAa,iBAAiB,cAAa;CAChC,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE3C,WAAW,QAAgB;EACzB,OAAO,OAAO,MAAK,MAAO,KAAK,MAAK;CACtC;CAEA,WAAW,OAAoB;EAC7B,KAAK,MAAM,IAAI,SAAS,IAAI;CAC9B;CAEA,OAAO,QAAgB;EACrB,IAAI,OAAO,SAAQ,KAAM,KAAK,WAAU,GAAI;EAC5C,KAAK,SAAS,OAAO,MAAK,CAAE;EAC5B,KAAK,SAAS,MAAM;EACpB,KAAK,UAAS;CAChB;CAEiB,UAAU,UAAU,SAAwC,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACtE,OAAO,UAAU,SAAkC,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEjE,UAAU;CAEV,SAAM;EACd,OAAO,KAAK,KAAI,CAAE,EAAE;CACtB;CAEU,WAAQ;EAChB,OAAO,KAAK,QAAO,CAAE,EAAE;CACzB;CAEA,QAAK;EACH,KAAK,QAAO,CAAE,CAAC,cAAc,MAAK;CACpC;CAEU,UAAO;EACf,IAAI,KAAK,WAAW,KAAK,KAAI,GAAI;GAC/B,KAAK,UAAU;GACf,KAAK,UAAS;GACd;EACF;EACA,KAAK,SAAS,UAAU;CAC1B;CAEU,SAAM;EACd,IAAI,CAAC,KAAK,KAAI,GAAI,KAAK,YAAW;CACpC;CAEmB,WAAQ;EAEzB,IAAI,KAAK,OAAO,cAAc,kBAAkB,KAAK,QAAO,CAAE,CAAC,eAC7D,KAAK,YAAW;CACpB;CAEU,UAAU,OAAoB;EACtC,MAAM,EAAE,KAAK,WAAW;EAExB,IAAI,CAAC,KAAK,KAAI,GAAI;GAChB,IAAI,QAAQ,eAAe,QAAQ,aAAa,QAAQ,WAAW,QAAQ,KAAK;IAC9E,MAAM,eAAc;IACpB,KAAK,SAAS,UAAU;GAC1B,OAAO,IAAI,QAAQ,UAAU,QAAQ,OAAO;IAC1C,MAAM,eAAc;IACpB,KAAK,SAAS,QAAQ,SAAS,UAAU,MAAM;GACjD,OAAO;IACL,MAAM,QAAQ,KAAK,eAAe,KAAK;IACvC,IAAI,OAAO;KAET,KAAK,SAAS,UAAU;KACxB,KAAK,SAAS,IAAI,MAAM,EAAE;IAC5B;GACF;GACA;EACF;EAEA,IAAI,QAAQ,UAAU;GACpB,MAAM,eAAc;GACpB,KAAK,UAAS;EAChB,OAAO,IAAI,QAAQ,WAAW,QAAQ,OAAQ,UAAU,QAAQ,WAAY;GAC1E,MAAM,eAAc;GACpB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,QAAQ,OAAO;GACxB,MAAM,SAAS,KAAK,aAAY;GAChC,IAAI,QAAQ,KAAK,OAAO,MAAM;QACzB,KAAK,UAAS;EACrB,OAAO,IAAI,CAAC,KAAK,SAAS,KAAK,GAAG;GAChC,MAAM,QAAQ,KAAK,eAAe,KAAK;GACvC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,EAAE;EACvC;CACF;CA3FW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,MAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,kBAAA;IAAA,qBAAA;IAAA,sBAAA;IAAA,mBAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,WAPR,CACT;GAAE,SAAS;GAAY,aAAa,iBAAiB,QAAQ;EAAC,GAC9D;GAAE,SAAS;GAAmB,aAAa,iBAAiB,QAAQ;GAAG,OAAO;EAAI,CACnF;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,SAAA;GAAA,aAAA;GAAA,UAAA;EAAA,GAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,MAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,iBAAA;EAAA,UAAA;EAAA,UA/CS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MAlCS;GAAM,UAAA;GAAA,QAAA,CAAA,QAAA,OAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;EAAA,eAAA,GAAA,kBAAA;CAAA,CAAA;;AAoDL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAtDpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,MAAM;GAChB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCV,MAAM;IACJ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IACpB,uBAAuB;IACvB,wBAAwB;IAExB,qBAAqB;IACrB,0BAA0B;GAC3B;GACD,WAAW,CACT;IAAE,SAAS;IAAY,aAAa,iBAAgB,QAAS;GAAC,GAC9D;IAAE,SAAS;IAAmB,aAAa,iBAAgB,QAAS;IAAG,OAAO;GAAI,CACnF;GACD,iBAAiB,wBAAwB;GACzC,eAAe,kBAAkB;EAClC,CAAA;CAmB8E,CAAA;CAAA,gBAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,GAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,aAAA;EAAA,CAAA;EAAA,SAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,WAAS,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,MAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAClB,QAAM,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
@@ -0,0 +1,493 @@
1
+ import { NgTemplateOutlet } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, TemplateRef, ViewEncapsulation, afterNextRender, afterRenderEffect, computed, contentChild, inject, input, model, signal, viewChild } from "@angular/core";
4
+ import { VdButton } from "@vadem/ui/button";
5
+ import * as i1 from "@vadem/ui/dialog";
6
+ import { VD_DIALOG } from "@vadem/ui/dialog";
7
+ import { vdUniqueId } from "@vadem/ui/field";
8
+ import { VdIcon } from "@vadem/ui/icon";
9
+ import { VD_TOOLTIP_DEFAULTS, VdTooltipController } from "@vadem/ui/tooltip";
10
+ import { vdTexts } from "@vadem/ui/locale";
11
+ var VdSidebar = class VdSidebar {
12
+ template = inject(TemplateRef);
13
+ static ɵfac = i0.ɵɵngDeclareFactory({
14
+ minVersion: "12.0.0",
15
+ version: "22.2.1",
16
+ ngImport: i0,
17
+ type: VdSidebar,
18
+ deps: [],
19
+ target: i0.ɵɵFactoryTarget.Directive
20
+ });
21
+ static ɵdir = i0.ɵɵngDeclareDirective({
22
+ minVersion: "14.0.0",
23
+ version: "22.2.1",
24
+ type: VdSidebar,
25
+ isStandalone: true,
26
+ selector: "ng-template[vdSidebar]",
27
+ ngImport: i0
28
+ });
29
+ };
30
+ i0.ɵɵngDeclareClassMetadata({
31
+ minVersion: "12.0.0",
32
+ version: "22.2.1",
33
+ ngImport: i0,
34
+ type: VdSidebar,
35
+ decorators: [{
36
+ type: Directive,
37
+ args: [{ selector: "ng-template[vdSidebar]" }]
38
+ }]
39
+ });
40
+ var VdSidebarLayout = class VdSidebarLayout {
41
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
42
+ closeLabel = input(...ngDevMode ? [void 0, { debugName: "closeLabel" }] : /* istanbul ignore next */ []);
43
+ t = vdTexts("sidebar", {
44
+ label: this.label,
45
+ closeLabel: this.closeLabel
46
+ });
47
+ collapsed = model(false, ...ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []);
48
+ sidebarId = vdUniqueId("vd-sidebar");
49
+ mode = signal("docked", ...ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []);
50
+ drawerOpen = signal(false, ...ngDevMode ? [{ debugName: "drawerOpen" }] : /* istanbul ignore next */ []);
51
+ rail = computed(() => this.collapsed() && this.mode() === "docked", ...ngDevMode ? [{ debugName: "rail" }] : /* istanbul ignore next */ []);
52
+ content = contentChild(VdSidebar, ...ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []);
53
+ docked = viewChild("docked", ...ngDevMode ? [{ debugName: "docked" }] : /* istanbul ignore next */ []);
54
+ drawer = viewChild.required("drawer", ...ngDevMode ? [{ debugName: "drawer" }] : /* istanbul ignore next */ []);
55
+ drawerBody = viewChild.required("drawerBody", ...ngDevMode ? [{ debugName: "drawerBody" }] : /* istanbul ignore next */ []);
56
+ el = inject(ElementRef).nativeElement;
57
+ constructor() {
58
+ const destroyRef = inject(DestroyRef);
59
+ afterNextRender(() => {
60
+ const view = this.el.ownerDocument.defaultView;
61
+ if (!view) return;
62
+ const sync = () => {
63
+ const mode = view.getComputedStyle(this.el).getPropertyValue("--vd-sidebar-drawer").trim() === "1" ? "drawer" : "docked";
64
+ if (mode === this.mode()) return;
65
+ this.drawer().close();
66
+ this.mode.set(mode);
67
+ };
68
+ const body = this.drawerBody().nativeElement;
69
+ const onClick = (event) => this.closeOnNavigate(event);
70
+ body.addEventListener("click", onClick);
71
+ destroyRef.onDestroy(() => body.removeEventListener("click", onClick));
72
+ sync();
73
+ if (!view.ResizeObserver) return;
74
+ const observer = new view.ResizeObserver(sync);
75
+ observer.observe(this.el);
76
+ destroyRef.onDestroy(() => observer.disconnect());
77
+ });
78
+ afterRenderEffect((onCleanup) => {
79
+ const host = this.docked()?.nativeElement;
80
+ if (!host || !this.rail()) return;
81
+ const tips = new RailTooltips(host);
82
+ onCleanup(() => tips.destroy());
83
+ });
84
+ }
85
+ toggle() {
86
+ if (this.mode() === "drawer") this.drawer().show();
87
+ else this.collapsed.update((value) => !value);
88
+ }
89
+ closeOnNavigate(event) {
90
+ if (event.button !== 0) return;
91
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
92
+ const link = event.target.closest("a[href]");
93
+ if (link && link.getAttribute("target") !== "_blank") this.drawer().close();
94
+ }
95
+ static ɵfac = i0.ɵɵngDeclareFactory({
96
+ minVersion: "12.0.0",
97
+ version: "22.2.1",
98
+ ngImport: i0,
99
+ type: VdSidebarLayout,
100
+ deps: [],
101
+ target: i0.ɵɵFactoryTarget.Component
102
+ });
103
+ static ɵcmp = i0.ɵɵngDeclareComponent({
104
+ minVersion: "17.0.0",
105
+ version: "22.2.1",
106
+ type: VdSidebarLayout,
107
+ isStandalone: true,
108
+ selector: "vd-sidebar-layout",
109
+ inputs: {
110
+ label: {
111
+ classPropertyName: "label",
112
+ publicName: "label",
113
+ isSignal: true,
114
+ isRequired: false,
115
+ transformFunction: null
116
+ },
117
+ closeLabel: {
118
+ classPropertyName: "closeLabel",
119
+ publicName: "closeLabel",
120
+ isSignal: true,
121
+ isRequired: false,
122
+ transformFunction: null
123
+ },
124
+ collapsed: {
125
+ classPropertyName: "collapsed",
126
+ publicName: "collapsed",
127
+ isSignal: true,
128
+ isRequired: false,
129
+ transformFunction: null
130
+ }
131
+ },
132
+ outputs: { collapsed: "collapsedChange" },
133
+ host: {
134
+ properties: {
135
+ "attr.data-mode": "mode()",
136
+ "attr.data-collapsed": "rail() ? \"\" : null"
137
+ },
138
+ classAttribute: "vd-sidebar-layout"
139
+ },
140
+ queries: [{
141
+ propertyName: "content",
142
+ first: true,
143
+ predicate: VdSidebar,
144
+ descendants: true,
145
+ isSignal: true
146
+ }],
147
+ viewQueries: [
148
+ {
149
+ propertyName: "docked",
150
+ first: true,
151
+ predicate: ["docked"],
152
+ descendants: true,
153
+ isSignal: true
154
+ },
155
+ {
156
+ propertyName: "drawer",
157
+ first: true,
158
+ predicate: ["drawer"],
159
+ descendants: true,
160
+ isSignal: true
161
+ },
162
+ {
163
+ propertyName: "drawerBody",
164
+ first: true,
165
+ predicate: ["drawerBody"],
166
+ descendants: true,
167
+ isSignal: true
168
+ }
169
+ ],
170
+ ngImport: i0,
171
+ template: `
172
+ @if (mode() === 'docked') {
173
+ <div #docked class="vd-sidebar" [id]="sidebarId">
174
+ <ng-container [ngTemplateOutlet]="content()?.template ?? null" />
175
+ </div>
176
+ }
177
+ <div class="vd-sidebar-layout__body"><ng-content /></div>
178
+ <dialog
179
+ vdDialog
180
+ #drawer="vdDialog"
181
+ class="vd-sidebar-drawer"
182
+ placement="start"
183
+ size="sm"
184
+ [(open)]="drawerOpen"
185
+ >
186
+ <header vdDialogHeader>
187
+ <h2 vdDialogTitle>{{ t().label }}</h2>
188
+ <button
189
+ vdButton
190
+ vdDialogClose
191
+ variant="ghost"
192
+ iconOnly
193
+ size="sm"
194
+ [attr.aria-label]="t().closeLabel"
195
+ >
196
+ <vd-icon name="x" />
197
+ </button>
198
+ </header>
199
+ <div #drawerBody vdDialogBody class="vd-sidebar">
200
+ @if (mode() === 'drawer') {
201
+ <ng-container [ngTemplateOutlet]="content()?.template ?? null" />
202
+ }
203
+ </div>
204
+ </dialog>
205
+ `,
206
+ isInline: true,
207
+ dependencies: [
208
+ {
209
+ kind: "directive",
210
+ type: NgTemplateOutlet,
211
+ selector: "[ngTemplateOutlet]",
212
+ inputs: [
213
+ "ngTemplateOutletContext",
214
+ "ngTemplateOutlet",
215
+ "ngTemplateOutletInjector"
216
+ ]
217
+ },
218
+ {
219
+ kind: "directive",
220
+ type: i1.VdDialog,
221
+ selector: "dialog[vdDialog]",
222
+ inputs: [
223
+ "open",
224
+ "size",
225
+ "placement",
226
+ "dismissible"
227
+ ],
228
+ outputs: ["openChange", "closed"],
229
+ exportAs: ["vdDialog"]
230
+ },
231
+ {
232
+ kind: "directive",
233
+ type: i1.VdDialogHeader,
234
+ selector: "[vdDialogHeader]"
235
+ },
236
+ {
237
+ kind: "directive",
238
+ type: i1.VdDialogTitle,
239
+ selector: "[vdDialogTitle]"
240
+ },
241
+ {
242
+ kind: "directive",
243
+ type: i1.VdDialogBody,
244
+ selector: "[vdDialogBody]"
245
+ },
246
+ {
247
+ kind: "directive",
248
+ type: i1.VdDialogClose,
249
+ selector: "button[vdDialogClose]",
250
+ inputs: ["vdDialogClose"]
251
+ },
252
+ {
253
+ kind: "component",
254
+ type: VdButton,
255
+ selector: "button[vdButton], a[vdButton]",
256
+ inputs: [
257
+ "variant",
258
+ "size",
259
+ "disabled",
260
+ "loading",
261
+ "iconOnly",
262
+ "type"
263
+ ]
264
+ },
265
+ {
266
+ kind: "component",
267
+ type: VdIcon,
268
+ selector: "vd-icon",
269
+ inputs: ["name", "label"]
270
+ }
271
+ ],
272
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
273
+ encapsulation: i0.ViewEncapsulation.None
274
+ });
275
+ };
276
+ i0.ɵɵngDeclareClassMetadata({
277
+ minVersion: "12.0.0",
278
+ version: "22.2.1",
279
+ ngImport: i0,
280
+ type: VdSidebarLayout,
281
+ decorators: [{
282
+ type: Component,
283
+ args: [{
284
+ selector: "vd-sidebar-layout",
285
+ imports: [
286
+ NgTemplateOutlet,
287
+ VD_DIALOG,
288
+ VdButton,
289
+ VdIcon
290
+ ],
291
+ changeDetection: ChangeDetectionStrategy.OnPush,
292
+ encapsulation: ViewEncapsulation.None,
293
+ host: {
294
+ class: "vd-sidebar-layout",
295
+ "[attr.data-mode]": "mode()",
296
+ "[attr.data-collapsed]": "rail() ? \"\" : null"
297
+ },
298
+ template: `
299
+ @if (mode() === 'docked') {
300
+ <div #docked class="vd-sidebar" [id]="sidebarId">
301
+ <ng-container [ngTemplateOutlet]="content()?.template ?? null" />
302
+ </div>
303
+ }
304
+ <div class="vd-sidebar-layout__body"><ng-content /></div>
305
+ <dialog
306
+ vdDialog
307
+ #drawer="vdDialog"
308
+ class="vd-sidebar-drawer"
309
+ placement="start"
310
+ size="sm"
311
+ [(open)]="drawerOpen"
312
+ >
313
+ <header vdDialogHeader>
314
+ <h2 vdDialogTitle>{{ t().label }}</h2>
315
+ <button
316
+ vdButton
317
+ vdDialogClose
318
+ variant="ghost"
319
+ iconOnly
320
+ size="sm"
321
+ [attr.aria-label]="t().closeLabel"
322
+ >
323
+ <vd-icon name="x" />
324
+ </button>
325
+ </header>
326
+ <div #drawerBody vdDialogBody class="vd-sidebar">
327
+ @if (mode() === 'drawer') {
328
+ <ng-container [ngTemplateOutlet]="content()?.template ?? null" />
329
+ }
330
+ </div>
331
+ </dialog>
332
+ `
333
+ }]
334
+ }],
335
+ ctorParameters: () => [],
336
+ propDecorators: {
337
+ label: [{
338
+ type: i0.Input,
339
+ args: [{
340
+ isSignal: true,
341
+ alias: "label",
342
+ required: false
343
+ }]
344
+ }],
345
+ closeLabel: [{
346
+ type: i0.Input,
347
+ args: [{
348
+ isSignal: true,
349
+ alias: "closeLabel",
350
+ required: false
351
+ }]
352
+ }],
353
+ collapsed: [{
354
+ type: i0.Input,
355
+ args: [{
356
+ isSignal: true,
357
+ alias: "collapsed",
358
+ required: false
359
+ }]
360
+ }, {
361
+ type: i0.Output,
362
+ args: ["collapsedChange"]
363
+ }],
364
+ content: [{
365
+ type: i0.ContentChild,
366
+ args: [i0.forwardRef(() => VdSidebar), { isSignal: true }]
367
+ }],
368
+ docked: [{
369
+ type: i0.ViewChild,
370
+ args: ["docked", { isSignal: true }]
371
+ }],
372
+ drawer: [{
373
+ type: i0.ViewChild,
374
+ args: ["drawer", { isSignal: true }]
375
+ }],
376
+ drawerBody: [{
377
+ type: i0.ViewChild,
378
+ args: ["drawerBody", { isSignal: true }]
379
+ }]
380
+ }
381
+ });
382
+ var VdSidebarToggle = class VdSidebarToggle {
383
+ layout = inject(VdSidebarLayout);
384
+ expanded = computed(() => this.layout.mode() === "drawer" ? this.layout.drawerOpen() : !this.layout.collapsed(), ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
385
+ static ɵfac = i0.ɵɵngDeclareFactory({
386
+ minVersion: "12.0.0",
387
+ version: "22.2.1",
388
+ ngImport: i0,
389
+ type: VdSidebarToggle,
390
+ deps: [],
391
+ target: i0.ɵɵFactoryTarget.Directive
392
+ });
393
+ static ɵdir = i0.ɵɵngDeclareDirective({
394
+ minVersion: "14.0.0",
395
+ version: "22.2.1",
396
+ type: VdSidebarToggle,
397
+ isStandalone: true,
398
+ selector: "button[vdSidebarToggle]",
399
+ host: {
400
+ attributes: { "type": "button" },
401
+ listeners: { "click": "layout.toggle()" },
402
+ properties: {
403
+ "attr.aria-expanded": "expanded()",
404
+ "attr.aria-controls": "layout.mode() === \"docked\" ? layout.sidebarId : null",
405
+ "attr.aria-haspopup": "layout.mode() === \"drawer\" ? \"dialog\" : null"
406
+ },
407
+ classAttribute: "vd-sidebar-toggle"
408
+ },
409
+ ngImport: i0
410
+ });
411
+ };
412
+ i0.ɵɵngDeclareClassMetadata({
413
+ minVersion: "12.0.0",
414
+ version: "22.2.1",
415
+ ngImport: i0,
416
+ type: VdSidebarToggle,
417
+ decorators: [{
418
+ type: Directive,
419
+ args: [{
420
+ selector: "button[vdSidebarToggle]",
421
+ host: {
422
+ class: "vd-sidebar-toggle",
423
+ type: "button",
424
+ "[attr.aria-expanded]": "expanded()",
425
+ "[attr.aria-controls]": "layout.mode() === \"docked\" ? layout.sidebarId : null",
426
+ "[attr.aria-haspopup]": "layout.mode() === \"drawer\" ? \"dialog\" : null",
427
+ "(click)": "layout.toggle()"
428
+ }
429
+ }]
430
+ }]
431
+ });
432
+ var RailTooltips = class {
433
+ host;
434
+ entries = /* @__PURE__ */ new Map();
435
+ observer;
436
+ constructor(host) {
437
+ this.host = host;
438
+ this.observer = new MutationObserver(() => this.sync());
439
+ this.observer.observe(host, {
440
+ childList: true,
441
+ subtree: true,
442
+ characterData: true
443
+ });
444
+ this.sync();
445
+ }
446
+ destroy() {
447
+ this.observer.disconnect();
448
+ for (const link of [...this.entries.keys()]) this.remove(link);
449
+ }
450
+ sync() {
451
+ const links = new Set(this.host.querySelectorAll(".vd-navigation-link"));
452
+ for (const link of [...this.entries.keys()]) if (!links.has(link)) this.remove(link);
453
+ for (const link of links) {
454
+ const text = (link.querySelector(":scope > :not([slot])") ?? link).textContent?.trim() ?? "";
455
+ const entry = this.entries.get(link) ?? this.add(link);
456
+ if (entry.tip.textContent !== text) entry.tip.textContent = text;
457
+ }
458
+ }
459
+ add(link) {
460
+ const doc = link.ownerDocument;
461
+ const tip = doc.createElement("div");
462
+ const anchor = `--${vdUniqueId("vd-sidebar-tip")}`;
463
+ tip.className = "vd-tooltip";
464
+ tip.dataset["placement"] = "end";
465
+ tip.setAttribute("popover", "manual");
466
+ tip.setAttribute("aria-hidden", "true");
467
+ tip.style.setProperty("position-anchor", anchor);
468
+ link.style.setProperty("anchor-name", anchor);
469
+ doc.body.appendChild(tip);
470
+ const entry = {
471
+ tip,
472
+ ctl: new VdTooltipController(link, tip, VD_TOOLTIP_DEFAULTS)
473
+ };
474
+ this.entries.set(link, entry);
475
+ return entry;
476
+ }
477
+ remove(link) {
478
+ const entry = this.entries.get(link);
479
+ if (!entry) return;
480
+ entry.ctl.destroy();
481
+ entry.tip.remove();
482
+ link.style.removeProperty("anchor-name");
483
+ this.entries.delete(link);
484
+ }
485
+ };
486
+ const VD_SIDEBAR = [
487
+ VdSidebarLayout,
488
+ VdSidebar,
489
+ VdSidebarToggle
490
+ ];
491
+ export { VD_SIDEBAR, VdSidebar, VdSidebarLayout, VdSidebarToggle };
492
+
493
+ //# sourceMappingURL=vadem-ui-sidebar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-sidebar.mjs","names":[],"sources":["../../../projects/ui/sidebar/src/sidebar.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n afterNextRender,\n afterRenderEffect,\n computed,\n contentChild,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { VdButton } from '@vadem/ui/button';\nimport { VD_DIALOG, VdDialog } from '@vadem/ui/dialog';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VD_TOOLTIP_DEFAULTS, VdTooltipController } from '@vadem/ui/tooltip';\nimport { vdTexts } from '@vadem/ui/locale';\n\nexport type VdSidebarMode = 'docked' | 'drawer';\n\n/** Sidebar content, authored once and rendered either docked or inside the drawer. */\n@Directive({ selector: 'ng-template[vdSidebar]' })\nexport class VdSidebar {\n readonly template = inject(TemplateRef);\n}\n\n/**\n * App shell: docked sidebar (collapsible to an icon rail) on wide viewports, start-edge\n * Dialog drawer on narrow ones. The breakpoint lives in CSS. Spec: specs/sidebar.md\n */\n@Component({\n selector: 'vd-sidebar-layout',\n imports: [NgTemplateOutlet, VD_DIALOG, VdButton, VdIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'vd-sidebar-layout',\n '[attr.data-mode]': 'mode()',\n '[attr.data-collapsed]': 'rail() ? \"\" : null',\n },\n template: `\n @if (mode() === 'docked') {\n <div #docked class=\"vd-sidebar\" [id]=\"sidebarId\">\n <ng-container [ngTemplateOutlet]=\"content()?.template ?? null\" />\n </div>\n }\n <div class=\"vd-sidebar-layout__body\"><ng-content /></div>\n <dialog\n vdDialog\n #drawer=\"vdDialog\"\n class=\"vd-sidebar-drawer\"\n placement=\"start\"\n size=\"sm\"\n [(open)]=\"drawerOpen\"\n >\n <header vdDialogHeader>\n <h2 vdDialogTitle>{{ t().label }}</h2>\n <button\n vdButton\n vdDialogClose\n variant=\"ghost\"\n iconOnly\n size=\"sm\"\n [attr.aria-label]=\"t().closeLabel\"\n >\n <vd-icon name=\"x\" />\n </button>\n </header>\n <div #drawerBody vdDialogBody class=\"vd-sidebar\">\n @if (mode() === 'drawer') {\n <ng-container [ngTemplateOutlet]=\"content()?.template ?? null\" />\n }\n </div>\n </dialog>\n `,\n})\nexport class VdSidebarLayout {\n /** Drawer dialog title. */\n readonly label = input<string>();\n /** Accessible name of the drawer close button. */\n readonly closeLabel = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('sidebar', { label: this.label, closeLabel: this.closeLabel });\n /** Docked rail state. */\n readonly collapsed = model(false);\n\n readonly sidebarId = vdUniqueId('vd-sidebar');\n readonly mode = signal<VdSidebarMode>('docked');\n readonly drawerOpen = signal(false);\n /** Collapsed rail is only visible while docked; the drawer always shows full content. */\n readonly rail = computed(() => this.collapsed() && this.mode() === 'docked');\n\n protected readonly content = contentChild(VdSidebar);\n private readonly docked = viewChild<ElementRef<HTMLElement>>('docked');\n private readonly drawer = viewChild.required<VdDialog>('drawer');\n private readonly drawerBody = viewChild.required<ElementRef<HTMLElement>>('drawerBody');\n private readonly el: HTMLElement = inject(ElementRef).nativeElement;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n // Browser-only: CSS sets --vd-sidebar-drawer below the breakpoint; follow it on resize.\n afterNextRender(() => {\n const view = this.el.ownerDocument.defaultView;\n if (!view) return;\n const sync = () => {\n const drawer = view.getComputedStyle(this.el).getPropertyValue('--vd-sidebar-drawer');\n const mode: VdSidebarMode = drawer.trim() === '1' ? 'drawer' : 'docked';\n if (mode === this.mode()) return;\n // Dialog returns focus to the opening toggle, which stays visible in both modes.\n this.drawer().close();\n this.mode.set(mode);\n };\n // Delegated: Enter on a link also dispatches click, so keyboard navigation is covered.\n const body = this.drawerBody().nativeElement;\n const onClick = (event: MouseEvent) => this.closeOnNavigate(event);\n body.addEventListener('click', onClick);\n destroyRef.onDestroy(() => body.removeEventListener('click', onClick));\n sync();\n if (!view.ResizeObserver) return;\n const observer = new view.ResizeObserver(sync);\n observer.observe(this.el);\n destroyRef.onDestroy(() => observer.disconnect());\n });\n\n // Rail tooltips: visual duplicates of link text while collapsed.\n afterRenderEffect((onCleanup) => {\n const host = this.docked()?.nativeElement;\n if (!host || !this.rail()) return;\n const tips = new RailTooltips(host);\n onCleanup(() => tips.destroy());\n });\n }\n\n /** Collapses/expands the rail when docked, opens the drawer otherwise. */\n toggle(): void {\n if (this.mode() === 'drawer') this.drawer().show();\n else this.collapsed.update((value) => !value);\n }\n\n /** Following a link closes the drawer; modified clicks open elsewhere and keep it open. */\n private closeOnNavigate(event: MouseEvent): void {\n // Router links call preventDefault() for in-app navigation, so that flag is not checked.\n if (event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n const link = (event.target as Element).closest('a[href]');\n if (link && link.getAttribute('target') !== '_blank') this.drawer().close();\n }\n}\n\n/** Toggles the rail (docked) or opens the drawer (narrow viewports). */\n@Directive({\n selector: 'button[vdSidebarToggle]',\n host: {\n class: 'vd-sidebar-toggle',\n type: 'button',\n '[attr.aria-expanded]': 'expanded()',\n '[attr.aria-controls]': 'layout.mode() === \"docked\" ? layout.sidebarId : null',\n '[attr.aria-haspopup]': 'layout.mode() === \"drawer\" ? \"dialog\" : null',\n '(click)': 'layout.toggle()',\n },\n})\nexport class VdSidebarToggle {\n protected readonly layout = inject(VdSidebarLayout);\n protected readonly expanded = computed(() =>\n this.layout.mode() === 'drawer' ? this.layout.drawerOpen() : !this.layout.collapsed(),\n );\n}\n\n/** One aria-hidden tooltip per navigation link, kept in sync with the sidebar's content. */\nclass RailTooltips {\n private readonly entries = new Map<HTMLElement, { tip: HTMLElement; ctl: VdTooltipController }>();\n private readonly observer: MutationObserver;\n\n constructor(private readonly host: HTMLElement) {\n this.observer = new MutationObserver(() => this.sync());\n this.observer.observe(host, { childList: true, subtree: true, characterData: true });\n this.sync();\n }\n\n destroy(): void {\n this.observer.disconnect();\n for (const link of [...this.entries.keys()]) this.remove(link);\n }\n\n private sync(): void {\n const links = new Set(this.host.querySelectorAll<HTMLElement>('.vd-navigation-link'));\n for (const link of [...this.entries.keys()]) if (!links.has(link)) this.remove(link);\n for (const link of links) {\n const text = (link.querySelector(':scope > :not([slot])') ?? link).textContent?.trim() ?? '';\n const entry = this.entries.get(link) ?? this.add(link);\n if (entry.tip.textContent !== text) entry.tip.textContent = text;\n }\n }\n\n private add(link: HTMLElement) {\n const doc = link.ownerDocument;\n const tip = doc.createElement('div');\n const anchor = `--${vdUniqueId('vd-sidebar-tip')}`;\n tip.className = 'vd-tooltip';\n tip.dataset['placement'] = 'end';\n tip.setAttribute('popover', 'manual');\n // The link keeps its own (visually hidden) name; the tooltip only repeats it visually.\n tip.setAttribute('aria-hidden', 'true');\n tip.style.setProperty('position-anchor', anchor);\n link.style.setProperty('anchor-name', anchor);\n doc.body.appendChild(tip);\n const entry = { tip, ctl: new VdTooltipController(link, tip, VD_TOOLTIP_DEFAULTS) };\n this.entries.set(link, entry);\n return entry;\n }\n\n private remove(link: HTMLElement): void {\n const entry = this.entries.get(link);\n if (!entry) return;\n entry.ctl.destroy();\n entry.tip.remove();\n link.style.removeProperty('anchor-name');\n this.entries.delete(link);\n }\n}\n\nexport const VD_SIDEBAR = [VdSidebarLayout, VdSidebar, VdSidebarToggle] as const;\n"],"mappings":"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"}