@tailng-ui/primitives 0.12.0 → 0.13.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.
- package/package.json +12 -6
- package/src/lib/feedback/empty/tng-empty.d.ts +11 -0
- package/src/lib/feedback/empty/tng-empty.d.ts.map +1 -1
- package/src/lib/feedback/empty/tng-empty.js +76 -66
- package/src/lib/feedback/empty/tng-empty.js.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts +5 -0
- package/src/lib/feedback/progress-bar/tng-progress-bar.d.ts.map +1 -1
- package/src/lib/feedback/progress-bar/tng-progress-bar.js +50 -54
- package/src/lib/feedback/progress-bar/tng-progress-bar.js.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts +3 -0
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.d.ts.map +1 -1
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.js +35 -41
- package/src/lib/feedback/progress-spinner/tng-progress-spinner.js.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.d.ts +3 -0
- package/src/lib/feedback/skeleton/tng-skeleton.d.ts.map +1 -1
- package/src/lib/feedback/skeleton/tng-skeleton.js +30 -32
- package/src/lib/feedback/skeleton/tng-skeleton.js.map +1 -1
- package/src/lib/feedback/toast/tng-toast.d.ts +5 -0
- package/src/lib/feedback/toast/tng-toast.d.ts.map +1 -1
- package/src/lib/feedback/toast/tng-toast.js +51 -49
- package/src/lib/feedback/toast/tng-toast.js.map +1 -1
- package/src/lib/form/_shared/id/tng-unique-id.service.d.ts +3 -0
- package/src/lib/form/_shared/id/tng-unique-id.service.d.ts.map +1 -1
- package/src/lib/form/_shared/id/tng-unique-id.service.js +9 -7
- package/src/lib/form/_shared/id/tng-unique-id.service.js.map +1 -1
- package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts +3 -0
- package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts.map +1 -1
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js +22 -20
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js.map +1 -1
- package/src/lib/form/_shared/select/tng-select.parts.shared.d.ts +9 -0
- package/src/lib/form/_shared/select/tng-select.parts.shared.d.ts.map +1 -1
- package/src/lib/form/_shared/select/tng-select.parts.shared.js +106 -98
- package/src/lib/form/_shared/select/tng-select.parts.shared.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.d.ts +3 -0
- package/src/lib/form/autocomplete/tng-autocomplete.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.js +40 -38
- package/src/lib/form/autocomplete/tng-autocomplete.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.listbox.d.ts +6 -0
- package/src/lib/form/autocomplete/tng-autocomplete.listbox.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.listbox.js +54 -46
- package/src/lib/form/autocomplete/tng-autocomplete.listbox.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts +3 -0
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.js +22 -20
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.parts.d.ts +9 -0
- package/src/lib/form/autocomplete/tng-autocomplete.parts.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.parts.js +109 -101
- package/src/lib/form/autocomplete/tng-autocomplete.parts.js.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.d.ts +5 -0
- package/src/lib/form/button-toggle/tng-button-toggle.d.ts.map +1 -1
- package/src/lib/form/button-toggle/tng-button-toggle.js +121 -155
- package/src/lib/form/button-toggle/tng-button-toggle.js.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.d.ts +3 -0
- package/src/lib/form/checkbox/tng-checkbox.d.ts.map +1 -1
- package/src/lib/form/checkbox/tng-checkbox.js +95 -107
- package/src/lib/form/checkbox/tng-checkbox.js.map +1 -1
- package/src/lib/form/chips/tng-chips.d.ts +7 -0
- package/src/lib/form/chips/tng-chips.d.ts.map +1 -1
- package/src/lib/form/chips/tng-chips.js +107 -115
- package/src/lib/form/chips/tng-chips.js.map +1 -1
- package/src/lib/form/combobox/tng-combobox.d.ts +3 -0
- package/src/lib/form/combobox/tng-combobox.d.ts.map +1 -1
- package/src/lib/form/combobox/tng-combobox.js +16 -14
- package/src/lib/form/combobox/tng-combobox.js.map +1 -1
- package/src/lib/form/input/tng-input.d.ts +9 -0
- package/src/lib/form/input/tng-input.d.ts.map +1 -1
- package/src/lib/form/input/tng-input.js +161 -141
- package/src/lib/form/input/tng-input.js.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.d.ts +3 -0
- package/src/lib/form/input-otp/tng-input-otp.d.ts.map +1 -1
- package/src/lib/form/input-otp/tng-input-otp.js +58 -70
- package/src/lib/form/input-otp/tng-input-otp.js.map +1 -1
- package/src/lib/form/label/tng-label.d.ts +3 -0
- package/src/lib/form/label/tng-label.d.ts.map +1 -1
- package/src/lib/form/label/tng-label.js +24 -26
- package/src/lib/form/label/tng-label.js.map +1 -1
- package/src/lib/form/listbox/listbox.directive.d.ts +3 -0
- package/src/lib/form/listbox/listbox.directive.d.ts.map +1 -1
- package/src/lib/form/listbox/listbox.directive.js +45 -43
- package/src/lib/form/listbox/listbox.directive.js.map +1 -1
- package/src/lib/form/listbox/option.directive.d.ts +3 -0
- package/src/lib/form/listbox/option.directive.d.ts.map +1 -1
- package/src/lib/form/listbox/option.directive.js +40 -38
- package/src/lib/form/listbox/option.directive.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.d.ts +3 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.js +23 -21
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.d.ts +3 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.js +25 -23
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.d.ts +3 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.js +35 -33
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.d.ts +6 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.js +57 -46
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.listbox.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts +3 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js +16 -14
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts +3 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js +52 -50
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.trigger.js.map +1 -1
- package/src/lib/form/multi-select/tng-multi-select.d.ts +3 -0
- package/src/lib/form/multi-select/tng-multi-select.d.ts.map +1 -1
- package/src/lib/form/multi-select/tng-multi-select.js +41 -36
- package/src/lib/form/multi-select/tng-multi-select.js.map +1 -1
- package/src/lib/form/multi-select/tng-multi-select.listbox.d.ts +6 -0
- package/src/lib/form/multi-select/tng-multi-select.listbox.d.ts.map +1 -1
- package/src/lib/form/multi-select/tng-multi-select.listbox.js +50 -45
- package/src/lib/form/multi-select/tng-multi-select.listbox.js.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.d.ts +3 -0
- package/src/lib/form/multiselect/tng-multiselect.d.ts.map +1 -1
- package/src/lib/form/multiselect/tng-multiselect.js +16 -14
- package/src/lib/form/multiselect/tng-multiselect.js.map +1 -1
- package/src/lib/form/radio/tng-radio.d.ts +3 -0
- package/src/lib/form/radio/tng-radio.d.ts.map +1 -1
- package/src/lib/form/radio/tng-radio.js +91 -101
- package/src/lib/form/radio/tng-radio.js.map +1 -1
- package/src/lib/form/select/tng-select.d.ts +3 -0
- package/src/lib/form/select/tng-select.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.js +41 -36
- package/src/lib/form/select/tng-select.js.map +1 -1
- package/src/lib/form/select/tng-select.listbox.d.ts +6 -0
- package/src/lib/form/select/tng-select.listbox.d.ts.map +1 -1
- package/src/lib/form/select/tng-select.listbox.js +50 -45
- package/src/lib/form/select/tng-select.listbox.js.map +1 -1
- package/src/lib/form/slider/tng-slider.d.ts +3 -0
- package/src/lib/form/slider/tng-slider.d.ts.map +1 -1
- package/src/lib/form/slider/tng-slider.js +42 -50
- package/src/lib/form/slider/tng-slider.js.map +1 -1
- package/src/lib/form/switch/tng-switch.d.ts +3 -0
- package/src/lib/form/switch/tng-switch.d.ts.map +1 -1
- package/src/lib/form/switch/tng-switch.js +44 -48
- package/src/lib/form/switch/tng-switch.js.map +1 -1
- package/src/lib/form/textarea/tng-textarea.d.ts +4 -0
- package/src/lib/form/textarea/tng-textarea.d.ts.map +1 -1
- package/src/lib/form/textarea/tng-textarea.js +40 -41
- package/src/lib/form/textarea/tng-textarea.js.map +1 -1
- package/src/lib/form/toggle/tng-toggle.d.ts +3 -0
- package/src/lib/form/toggle/tng-toggle.d.ts.map +1 -1
- package/src/lib/form/toggle/tng-toggle.js +71 -75
- package/src/lib/form/toggle/tng-toggle.js.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.d.ts +3 -0
- package/src/lib/form/toggle-group/tng-toggle-group.d.ts.map +1 -1
- package/src/lib/form/toggle-group/tng-toggle-group.js +48 -50
- package/src/lib/form/toggle-group/tng-toggle-group.js.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.d.ts +9 -0
- package/src/lib/layout/accordion/tng-accordion.d.ts.map +1 -1
- package/src/lib/layout/accordion/tng-accordion.js +143 -155
- package/src/lib/layout/accordion/tng-accordion.js.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts +3 -0
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.d.ts.map +1 -1
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js +16 -14
- package/src/lib/layout/bottom-sheet/tng-bottom-sheet.js.map +1 -1
- package/src/lib/layout/card/tng-card.d.ts +21 -0
- package/src/lib/layout/card/tng-card.d.ts.map +1 -1
- package/src/lib/layout/card/tng-card.js +151 -131
- package/src/lib/layout/card/tng-card.js.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.d.ts +7 -0
- package/src/lib/layout/collapsible/tng-collapsible.d.ts.map +1 -1
- package/src/lib/layout/collapsible/tng-collapsible.js +82 -86
- package/src/lib/layout/collapsible/tng-collapsible.js.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.d.ts +13 -0
- package/src/lib/layout/drawer/tng-drawer.d.ts.map +1 -1
- package/src/lib/layout/drawer/tng-drawer.js +217 -226
- package/src/lib/layout/drawer/tng-drawer.js.map +1 -1
- package/src/lib/layout/grid/tng-grid.d.ts +3 -0
- package/src/lib/layout/grid/tng-grid.d.ts.map +1 -1
- package/src/lib/layout/grid/tng-grid.js +16 -14
- package/src/lib/layout/grid/tng-grid.js.map +1 -1
- package/src/lib/layout/separator/tng-separator.d.ts +3 -0
- package/src/lib/layout/separator/tng-separator.d.ts.map +1 -1
- package/src/lib/layout/separator/tng-separator.js +30 -30
- package/src/lib/layout/separator/tng-separator.js.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.d.ts +3 -0
- package/src/lib/layout/stepper/tng-stepper.d.ts.map +1 -1
- package/src/lib/layout/stepper/tng-stepper.js +16 -14
- package/src/lib/layout/stepper/tng-stepper.js.map +1 -1
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts +3 -0
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.d.ts.map +1 -1
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js +54 -11
- package/src/lib/layout/tree/__tests__/tng-tree.test-harness.js.map +1 -1
- package/src/lib/layout/tree/tng-tree-group.d.ts +3 -0
- package/src/lib/layout/tree/tng-tree-group.d.ts.map +1 -1
- package/src/lib/layout/tree/tng-tree-group.js +19 -17
- package/src/lib/layout/tree/tng-tree-group.js.map +1 -1
- package/src/lib/layout/tree/tng-tree-indicator.d.ts +3 -0
- package/src/lib/layout/tree/tng-tree-indicator.d.ts.map +1 -1
- package/src/lib/layout/tree/tng-tree-indicator.js +22 -20
- package/src/lib/layout/tree/tng-tree-indicator.js.map +1 -1
- package/src/lib/layout/tree/tng-tree-item.d.ts +3 -0
- package/src/lib/layout/tree/tng-tree-item.d.ts.map +1 -1
- package/src/lib/layout/tree/tng-tree-item.js +47 -53
- package/src/lib/layout/tree/tng-tree-item.js.map +1 -1
- package/src/lib/layout/tree/tng-tree.d.ts +3 -0
- package/src/lib/layout/tree/tng-tree.d.ts.map +1 -1
- package/src/lib/layout/tree/tng-tree.js +39 -43
- package/src/lib/layout/tree/tng-tree.js.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts +11 -0
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.d.ts.map +1 -1
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.js +79 -69
- package/src/lib/navigation/breadcrumb/tng-breadcrumb.js.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.d.ts +5 -0
- package/src/lib/navigation/context-menu/tng-context-menu.d.ts.map +1 -1
- package/src/lib/navigation/context-menu/tng-context-menu.js +44 -42
- package/src/lib/navigation/context-menu/tng-context-menu.js.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts +3 -0
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.d.ts.map +1 -1
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js +16 -14
- package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.js.map +1 -1
- package/src/lib/navigation/menu/tng-menu.d.ts +13 -0
- package/src/lib/navigation/menu/tng-menu.d.ts.map +1 -1
- package/src/lib/navigation/menu/tng-menu.js +184 -186
- package/src/lib/navigation/menu/tng-menu.js.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.d.ts +5 -0
- package/src/lib/navigation/menubar/tng-menubar.d.ts.map +1 -1
- package/src/lib/navigation/menubar/tng-menubar.js +72 -70
- package/src/lib/navigation/menubar/tng-menubar.js.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts +3 -0
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.d.ts.map +1 -1
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.js +16 -14
- package/src/lib/navigation/navigation-menu/tng-navigation-menu.js.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.d.ts +13 -0
- package/src/lib/navigation/tabs/tng-tabs.d.ts.map +1 -1
- package/src/lib/navigation/tabs/tng-tabs.js +234 -258
- package/src/lib/navigation/tabs/tng-tabs.js.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.d.ts +3 -0
- package/src/lib/navigation/toolbar/tng-toolbar.d.ts.map +1 -1
- package/src/lib/navigation/toolbar/tng-toolbar.js +16 -14
- package/src/lib/navigation/toolbar/tng-toolbar.js.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.d.ts +19 -0
- package/src/lib/overlay/dialog/tng-dialog.d.ts.map +1 -1
- package/src/lib/overlay/dialog/tng-dialog.js +249 -255
- package/src/lib/overlay/dialog/tng-dialog.js.map +1 -1
- package/src/lib/overlay/popover/tng-popover.d.ts +9 -0
- package/src/lib/overlay/popover/tng-popover.d.ts.map +1 -1
- package/src/lib/overlay/popover/tng-popover.js +152 -170
- package/src/lib/overlay/popover/tng-popover.js.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.d.ts +7 -0
- package/src/lib/overlay/tooltip/tng-tooltip.d.ts.map +1 -1
- package/src/lib/overlay/tooltip/tng-tooltip.js +124 -130
- package/src/lib/overlay/tooltip/tng-tooltip.js.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.d.ts +7 -0
- package/src/lib/utility/avatar/tng-avatar.d.ts.map +1 -1
- package/src/lib/utility/avatar/tng-avatar.js +46 -40
- package/src/lib/utility/avatar/tng-avatar.js.map +1 -1
- package/src/lib/utility/badge/tng-badge.d.ts +3 -0
- package/src/lib/utility/badge/tng-badge.d.ts.map +1 -1
- package/src/lib/utility/badge/tng-badge.js +26 -40
- package/src/lib/utility/badge/tng-badge.js.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.d.ts +11 -0
- package/src/lib/utility/code-block/tng-code-block.d.ts.map +1 -1
- package/src/lib/utility/code-block/tng-code-block.js +76 -66
- package/src/lib/utility/code-block/tng-code-block.js.map +1 -1
- package/src/lib/utility/copy/tng-copy.d.ts +3 -0
- package/src/lib/utility/copy/tng-copy.d.ts.map +1 -1
- package/src/lib/utility/copy/tng-copy.js +44 -52
- package/src/lib/utility/copy/tng-copy.js.map +1 -1
- package/src/lib/utility/press/tng-press.d.ts +3 -0
- package/src/lib/utility/press/tng-press.d.ts.map +1 -1
- package/src/lib/utility/press/tng-press.js +55 -61
- package/src/lib/utility/press/tng-press.js.map +1 -1
- package/src/lib/utility/tag/tng-tag.d.ts +7 -0
- package/src/lib/utility/tag/tng-tag.d.ts.map +1 -1
- package/src/lib/utility/tag/tng-tag.js +94 -96
- package/src/lib/utility/tag/tng-tag.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listbox.directive.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/listbox.directive.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,wCAAwC,GACzC,MAAM,UAAU,CAAC;AASX,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACb,cAAc,GAAG,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,yBAAyB,GACxC,MAAM,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;IACvE,aAAa,GAAG,KAAK,CAAU,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7D,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEhF,WAAW,GAAG,KAAK,CAA4B,UAAU,CAAC,CAAC;IAC3D,SAAS,GAAG,KAAK,CAAgB,KAAK,CAAC,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;IAE5B;;;;OAIG;IACH,SAAS,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;IAExB,KAAK,GAAG,KAAK,CAAkB,IAAI,CAAC,CAAC;IAE7B,EAAE,GAAG,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC;IAE9C,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,OAAO,GAAG,MAAM,CAAgD,EAAE,CAAC,CAAC;IACpE,UAAU,GAAG,MAAM,CAAuD,IAAI,CAAC,CAAC;IAChF,QAAQ,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE/C,uDAAuD;IACvD,gBAAgB;IAChB,uDAAuD;IAGvD,IAAI,GAAG,SAAS,CAAC;IAGjB,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAGD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAGD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,uDAAuD;IACvD,cAAc;IACd,uDAAuD;IAEvD;QACE,MAAM,MAAM,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,uBAAuB,CAAI;gBACtC,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;gBACtD,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;gBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aAClB,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO;gBAE9B,MAAM,CAAC,GAAG,QAAa,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE5C,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO;YAE9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACjC,CAAC,CAAE,QAAyB;gBAC5B,CAAC,CAAE,CAAC,QAAa,CAAkB,CAAC;YAEtC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE5C,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC,yBAAyB,CAAC;gBACxC,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAwB,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAElB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAE9B,MAAM,KAAK,GAAG,CAAC,CAAkB,EAAY,EAAE;gBAC7C,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAC,CAAC,CAAE,CAAC,CAAM,CAAW,CAAC;gBAEzE,MAAM,GAAG,GAAa,EAAE,CAAC;gBACzB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,GAAG;wBAAE,SAAS;oBACnB,IAAI,GAAG,CAAC,QAAQ;wBAAE,SAAS;oBAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,UAAU;IACV,uDAAuD;IAE/C,iBAAiB,CACvB,KAAQ,EACR,IAAgD;QAEhD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,iBAAiB,CACvB,KAAQ,EACR,IAAgD;QAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,wBAAwB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAC5B,CAAC;QAEnB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,wBAAwB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,yBAAyB,CAAC,MAAsC;QACtE,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QAExC,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,eAAe;YAC/B,MAAM,CAAC,IAAI,KAAK,eAAe;YAC/B,MAAM,CAAC,IAAI,KAAK,YAAY,CAC7B,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,sBAAsB;IACtB,uDAAuD;IAEvD,cAAc,CACZ,EAAU,EACV,KAAQ,EACR,QAAiB,EACjB,IAAa,EACb,EAAgB;QAEhB,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,gBAAgB,CAAC,EAAU;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpC,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,EAAU,EAAE,QAAiB;QAChD,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC1B,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,uDAAuD;IACvD,SAAS;IACT,uDAAuD;IAGvD,aAAa,CAAC,KAAoB;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,yBAAyB;QACzB,IACE,IAAI,CAAC,SAAS,EAAE;YAChB,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,MAAM,EACb,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAGD,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAGD,cAAc,CAAC,KAAiB;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;QACvC,IAAI,UAAU,YAAY,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO;QAExC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,iBAAiB,CAAC,EAAU,EAAE,QAAkB;QAC9C,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO;QAE5B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,GAAG,EAAE,QAAQ;YAAE,OAAO;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,sEAAsE;QACtE,wDAAwD;QACxD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,uDAAuD;IACvD,iBAAiB;IACjB,uDAAuD;IAE/C,6BAA6B,CACnC,IAAmD,EACnD,SAAkB;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAiB,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,UAAU,GACd,OAAO,KAAK,IAAI;gBACd,CAAC,CAAE,EAAmB;gBACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBACtB,CAAC,CAAE,OAAwB;oBAC3B,CAAC,CAAE,CAAC,OAAY,CAAW,CAAC;YAElC,MAAM,IAAI,GAAQ,EAAE,CAAC;YAErB,4EAA4E;YAC5E,iEAAiE;YACjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAExE,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,sEAAsE;YACtE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAoB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,+CAA+C;QAC/C,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,eAAe,CAAC,KAAQ;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAEpC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAyB,OAAO;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO;QACxC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEM,qBAAqB,CAAC,GAAW,EAAE,QAAkB;QAC1D,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAEM,qBAAqB,CAAC,GAAW;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK;YAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,WAAW,CAAC,EAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEM,cAAc;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,KAAK,CAAC;IACpB,CAAC;CACF,CAAA;AAzdC;IADC,WAAW,CAAC,WAAW,CAAC;iDACR;AAGjB;IADC,WAAW,CAAC,2BAA2B,CAAC;oDAGxC;AAGD;IADC,WAAW,CAAC,oBAAoB,CAAC;uDAGjC;AAGD;IADC,WAAW,CAAC,4BAA4B,CAAC;2DAGzC;AA8OD;IADC,YAAY,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;wDAuCnC;AAGD;IADC,YAAY,CAAC,SAAS,CAAC;wDAcvB;AAGD;IADC,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;yDAapC;AAnWU,mBAAmB;IAL/B,SAAS,CAAC;QACT,QAAQ,EAAE,cAAc;QACxB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;KACxE,CAAC;GACW,mBAAmB,CA0f/B","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { createListboxController } from '@tailng-ui/cdk';\nimport type { TngListNavigationAction } from '@tailng-ui/cdk';\nimport {\n TNG_LISTBOX,\n TNG_LISTBOX_FORCE_MULTIPLE,\n TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER,\n} from './tokens';\n\nexport type ListboxValue<T> = T | readonly T[] | null;\n\n@Directive({\n selector: '[tngListbox]',\n standalone: true,\n providers: [{ provide: TNG_LISTBOX, useExisting: TngListboxDirective }],\n})\nexport class TngListboxDirective<T> {\n private readonly _forceMultiple = inject(TNG_LISTBOX_FORCE_MULTIPLE, { optional: true });\n private readonly preserveValueOnUnregister =\n inject(TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER, { optional: true }) ?? false;\n readonly multipleInput = input<boolean>(false, { alias: 'multiple' });\n readonly multiple = computed(() => this._forceMultiple ?? this.multipleInput());\n\n orientation = input<'vertical' | 'horizontal'>('vertical');\n direction = input<'ltr' | 'rtl'>('ltr');\n disabled = input<boolean>(false);\n loop = input<boolean>(true);\n\n /**\n * Enable listbox typeahead (printable key moves active option by option text).\n * Default true for Select compatibility.\n * Autocomplete should set this to false (input owns typing/filtering).\n */\n typeahead = input<boolean>(true);\n\n readonly value = model<ListboxValue<T>>(null);\n\n private readonly el = inject(ElementRef<HTMLElement>);\n\n private idToElement = new Map<string, HTMLElement>();\n private options = signal<{ id: string; value: T; disabled: boolean }[]>([]);\n private controller = signal<ReturnType<typeof createListboxController<T>> | null>(null);\n private activeId = signal<string | null>(null);\n\n // ----------------------------------------------------\n // Host bindings\n // ----------------------------------------------------\n\n @HostBinding('attr.role')\n role = 'listbox';\n\n @HostBinding('attr.aria-multiselectable')\n get ariaMulti() {\n return this.multiple() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-disabled')\n get ariaDisabled() {\n return this.disabled() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-activedescendant')\n get activeDescendant() {\n return this.activeId();\n }\n\n // ----------------------------------------------------\n // Constructor\n // ----------------------------------------------------\n\n constructor() {\n const hostId = `tng-listbox-${Math.random().toString(36).slice(2)}`;\n\n // Controller creation effect\n effect(() => {\n const ctrl = createListboxController<T>({\n hostId,\n selectionMode: this.multiple() ? 'multiple' : 'single',\n orientation: this.orientation(),\n direction: this.direction(),\n disabled: this.disabled(),\n loop: this.loop(),\n });\n\n this.controller.set(ctrl);\n\n const opts = untracked(this.options);\n for (const option of opts) {\n ctrl.registerOption(option);\n }\n });\n\n // Controlled value sanitizer\n effect(() => {\n const isMulti = this.multiple();\n const opts = this.options();\n const external = this.value();\n\n if (!isMulti) {\n if (external === null) return;\n\n const v = external as T;\n const opt = this.findOptionByValue(v, opts);\n\n if (!opt && this.preserveValueOnUnregister) {\n return;\n }\n\n if (!opt || opt.disabled) {\n this.value.set(null);\n }\n return;\n }\n\n if (external === null) return;\n\n const arr = Array.isArray(external)\n ? (external as readonly T[])\n : ([external as T] as readonly T[]);\n\n const filtered = arr.filter((v) => {\n const opt = this.findOptionByValue(v, opts);\n\n if (!opt) {\n return this.preserveValueOnUnregister;\n }\n\n return !opt.disabled;\n });\n\n if (filtered.length !== arr.length) {\n this.value.set(filtered as readonly T[]);\n }\n });\n\n // External value -> controller selection\n effect(() => {\n const ctrl = this.controller();\n if (!ctrl) return;\n\n const opts = this.options();\n const external = this.value();\n\n const toIds = (v: ListboxValue<T>): string[] => {\n if (v === null) return [];\n const arr = Array.isArray(v) ? (v as readonly T[]) : ([v as T] as const);\n\n const ids: string[] = [];\n for (const val of arr) {\n const opt = opts.find((o) => Object.is(o.value, val));\n if (!opt) continue;\n if (opt.disabled) continue;\n ids.push(opt.id);\n }\n return ids;\n };\n\n const nextIds = toIds(external);\n\n if (nextIds.length === 0) {\n ctrl.clearSelection();\n return;\n }\n\n ctrl.setSelectedIds(nextIds);\n });\n\n // Scroll when active changes\n effect(() => {\n const id = this.activeId();\n if (!id) return;\n\n const el = this.idToElement.get(id);\n if (!el) return;\n\n el.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n // ----------------------------------------------------\n // Helpers\n // ----------------------------------------------------\n\n private findOptionByValue(\n value: T,\n opts: readonly { value: T; disabled: boolean }[],\n ) {\n return opts.find((o) => Object.is(o.value, value));\n }\n\n private isSelectableValue(\n value: T,\n opts: readonly { value: T; disabled: boolean }[],\n ): boolean {\n const opt = this.findOptionByValue(value, opts);\n return !!opt && !opt.disabled;\n }\n\n private syncDomOrderToController(): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n\n const root = this.el.nativeElement;\n const optionEls = Array.from(\n root.querySelectorAll('[role=\"option\"][id]'),\n ) as HTMLElement[];\n\n const ids = optionEls.map((x) => x.id).filter(Boolean);\n\n if (ids.length > 0) {\n ctrl.setItemOrder(ids);\n }\n }\n\n private syncActiveFromController(): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n this.activeId.set(ctrl.getActiveId());\n }\n\n private shouldSyncValueFromAction(action: TngListNavigationAction | null): boolean {\n if (!action) return false;\n if (action.extendSelection) return true;\n\n return (\n action.type === 'select-active' ||\n action.type === 'toggle-active' ||\n action.type === 'select-all'\n );\n }\n\n // ----------------------------------------------------\n // Option registration\n // ----------------------------------------------------\n\n registerOption(\n id: string,\n value: T,\n disabled: boolean,\n text?: string,\n el?: HTMLElement,\n ): void {\n if (el) {\n this.idToElement.set(id, el);\n }\n\n this.options.update((list) => {\n const idx = list.findIndex((x) => x.id === id);\n if (idx === -1) return [...list, { id, value, disabled }];\n const copy = list.slice();\n copy[idx] = { id, value, disabled };\n return copy;\n });\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.unregisterOption(id);\n ctrl.registerOption({ id, value, disabled, text });\n }\n\n unregisterOption(id: string): void {\n this.options.update((list) => list.filter((x) => x.id !== id));\n this.idToElement.delete(id);\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.unregisterOption(id);\n\n this.syncActiveFromController();\n\n if (!this.preserveValueOnUnregister) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n }\n\n updateOptionDisabled(id: string, disabled: boolean): void {\n let exists = false;\n\n this.options.update((list) =>\n list.map((o) => {\n if (o.id !== id) return o;\n exists = true;\n return { ...o, disabled };\n }),\n );\n\n if (!exists) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.setOptionDisabled(id, disabled);\n this.syncActiveFromController();\n }\n\n // ----------------------------------------------------\n // Events\n // ----------------------------------------------------\n\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n this.syncDomOrderToController();\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n // ✅ Typeahead (optional)\n if (\n this.typeahead() &&\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n const moved = ctrl.typeahead(event.key);\n if (moved) {\n this.syncActiveFromController();\n event.preventDefault();\n return;\n }\n }\n\n const action = ctrl.handleKeyDown(event);\n this.syncActiveFromController();\n\n if (action?.preventDefault) {\n event.preventDefault();\n }\n\n if (this.shouldSyncValueFromAction(action)) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n }\n\n @HostListener('focusin')\n handleFocusIn() {\n if (this.disabled()) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n if (ctrl.getActiveId() !== null) {\n this.syncActiveFromController();\n return;\n }\n\n ctrl.handleKeyDown({ key: 'Home' });\n this.syncActiveFromController();\n }\n\n @HostListener('focusout', ['$event'])\n handleFocusOut(event: FocusEvent) {\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && this.el.nativeElement.contains(nextTarget)) {\n return;\n }\n\n const ctrl = this.controller();\n if (!ctrl) return;\n if (ctrl.getActiveId() === null) return;\n\n ctrl.setActiveId(null);\n this.syncActiveFromController();\n }\n\n handleOptionClick(id: string, shiftKey?: boolean) {\n if (this.disabled()) return;\n\n this.syncDomOrderToController();\n\n const opt = this.options().find((o) => o.id === id);\n if (opt?.disabled) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n // Pointer selection should transfer keyboard focus to this listbox so\n // subsequent Arrow keys continue from the clicked list.\n this.el.nativeElement.focus();\n\n ctrl.handleClick(id, shiftKey);\n\n this.syncActiveFromController();\n this.syncExternalValueFromInternal(ctrl, true);\n }\n\n // ----------------------------------------------------\n // Selection sync\n // ----------------------------------------------------\n\n private syncExternalValueFromInternal(\n ctrl: ReturnType<typeof createListboxController<T>>,\n fromClick: boolean,\n ) {\n const selected = ctrl.getSelectedValues();\n\n if (this.multiple()) {\n if (!this.preserveValueOnUnregister) {\n this.value.set([...selected] as readonly T[]);\n return;\n }\n\n const opts = this.options();\n const current = this.value();\n const currentArr =\n current === null\n ? ([] as readonly T[])\n : Array.isArray(current)\n ? (current as readonly T[])\n : ([current as T] as const);\n\n const next: T[] = [];\n\n // Preserve hidden selections in their current order, and keep any currently\n // visible selections that remain selected after the interaction.\n for (const val of currentArr) {\n const isHidden = !opts.some((opt) => Object.is(opt.value, val));\n const isStillSelected = selected.some((entry) => Object.is(entry, val));\n\n if (isHidden || isStillSelected) {\n next.push(val);\n }\n }\n\n // Append newly selected visible values that were not already present.\n for (const val of selected) {\n const alreadyPresent = currentArr.some((entry) => Object.is(entry, val));\n if (!alreadyPresent) {\n next.push(val);\n }\n }\n\n this.value.set(next as readonly T[]);\n } else {\n const newVal = selected[0] ?? null;\n const current = this.value();\n this.value.set(newVal);\n if (fromClick && Object.is(newVal, current)) {\n this.value.set(null);\n this.value.set(newVal);\n }\n }\n }\n\n isSelected(id: string): boolean {\n const ctrl = this.controller();\n if (!ctrl) return false;\n \n // ✅ selection truth is IDs, not value equality\n return ctrl.getSelectedIds().includes(id);\n }\n\n isValueSelected(value: T): boolean {\n const selected = this.value();\n\n if (selected === null) return false;\n\n if (Array.isArray(selected)) {\n return selected.some((entry) => Object.is(entry, value));\n }\n\n return Object.is(selected, value);\n }\n\n isActive(id: string): boolean {\n return this.activeId() === id;\n }\n\n public getActiveId(): string | null {\n return this.activeId();\n }\n\n public ensureActive(pref: 'first' | 'last' = 'first'): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n if (ctrl.getActiveId() !== null) return;\n ctrl.handleKeyDown({ key: pref === 'last' ? 'End' : 'Home' });\n this.syncActiveFromController();\n }\n\n public handleKeyFromCombobox(key: string, shiftKey?: boolean): boolean {\n this.syncDomOrderToController();\n\n const ctrl = this.controller();\n if (!ctrl) return false;\n const action = ctrl.handleKeyDown({ key, shiftKey } as any);\n this.syncActiveFromController();\n if (this.shouldSyncValueFromAction(action)) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n return !!action;\n }\n\n public typeaheadFromCombobox(key: string): boolean {\n const ctrl = this.controller();\n if (!ctrl) return false;\n const moved = ctrl.typeahead(key);\n if (moved) this.syncActiveFromController();\n return moved;\n }\n\n public setActiveId(id: string | null): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n ctrl.setActiveId(id);\n this.syncActiveFromController();\n }\n\n public getActiveValue(): T | undefined {\n const active = this.activeId();\n if (!active) return undefined;\n const opt = this.options().find((o) => o.id === active);\n return opt?.value;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"listbox.directive.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/listbox.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACN,SAAS,GACV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,wCAAwC,GACzC,MAAM,UAAU,CAAC;;AASlB,MAAM,OAAO,mBAAmB;IACb,cAAc,GAAG,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,yBAAyB,GACxC,MAAM,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;IACvE,aAAa,GAAG,KAAK,CAAU,KAAK,0DAAI,KAAK,EAAE,UAAU,GAAG,CAAC;IAC7D,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,EAAE,oDAAC,CAAC;IAEhF,WAAW,GAAG,KAAK,CAA4B,UAAU,uDAAC,CAAC;IAC3D,SAAS,GAAG,KAAK,CAAgB,KAAK,qDAAC,CAAC;IACxC,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC,CAAC;IACjC,IAAI,GAAG,KAAK,CAAU,IAAI,gDAAC,CAAC;IAE5B;;;;OAIG;IACH,SAAS,GAAG,KAAK,CAAU,IAAI,qDAAC,CAAC;IAExB,KAAK,GAAG,KAAK,CAAkB,IAAI,iDAAC,CAAC;IAE7B,EAAE,GAAG,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC;IAE9C,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,OAAO,GAAG,MAAM,CAAgD,EAAE,mDAAC,CAAC;IACpE,UAAU,GAAG,MAAM,CAAuD,IAAI,sDAAC,CAAC;IAChF,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC,CAAC;IAE/C,uDAAuD;IACvD,gBAAgB;IAChB,uDAAuD;IAGvD,IAAI,GAAG,SAAS,CAAC;IAEjB,IACI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,IACI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,IACI,gBAAgB;QAClB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,uDAAuD;IACvD,cAAc;IACd,uDAAuD;IAEvD;QACE,MAAM,MAAM,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpE,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,uBAAuB,CAAI;gBACtC,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;gBACtD,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;gBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;gBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aAClB,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO;gBAE9B,MAAM,CAAC,GAAG,QAAa,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE5C,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO;YAE9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACjC,CAAC,CAAE,QAAyB;gBAC5B,CAAC,CAAE,CAAC,QAAa,CAAkB,CAAC;YAEtC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAE5C,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC,yBAAyB,CAAC;gBACxC,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAwB,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAElB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAE9B,MAAM,KAAK,GAAG,CAAC,CAAkB,EAAY,EAAE;gBAC7C,IAAI,CAAC,KAAK,IAAI;oBAAE,OAAO,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAC,CAAC,CAAE,CAAC,CAAM,CAAW,CAAC;gBAEzE,MAAM,GAAG,GAAa,EAAE,CAAC;gBACzB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,GAAG;wBAAE,SAAS;oBACnB,IAAI,GAAG,CAAC,QAAQ;wBAAE,SAAS;oBAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,UAAU;IACV,uDAAuD;IAE/C,iBAAiB,CACvB,KAAQ,EACR,IAAgD;QAEhD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,iBAAiB,CACvB,KAAQ,EACR,IAAgD;QAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,wBAAwB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QACnC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAC5B,CAAC;QAEnB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,wBAAwB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,yBAAyB,CAAC,MAAsC;QACtE,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QAExC,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,eAAe;YAC/B,MAAM,CAAC,IAAI,KAAK,eAAe;YAC/B,MAAM,CAAC,IAAI,KAAK,YAAY,CAC7B,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,sBAAsB;IACtB,uDAAuD;IAEvD,cAAc,CACZ,EAAU,EACV,KAAQ,EACR,QAAiB,EACjB,IAAa,EACb,EAAgB;QAEhB,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,gBAAgB,CAAC,EAAU;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACpC,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,EAAU,EAAE,QAAiB;QAChD,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC1B,MAAM,GAAG,IAAI,CAAC;YACd,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,uDAAuD;IACvD,SAAS;IACT,uDAAuD;IAGvD,aAAa,CAAC,KAAoB;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,yBAAyB;QACzB,IACE,IAAI,CAAC,SAAS,EAAE;YAChB,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YACtB,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,MAAM,EACb,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAGD,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO;QAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAGD,cAAc,CAAC,KAAiB;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;QACvC,IAAI,UAAU,YAAY,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO;QAExC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,iBAAiB,CAAC,EAAU,EAAE,QAAkB;QAC9C,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE,OAAO;QAE5B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,GAAG,EAAE,QAAQ;YAAE,OAAO;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,sEAAsE;QACtE,wDAAwD;QACxD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,uDAAuD;IACvD,iBAAiB;IACjB,uDAAuD;IAE/C,6BAA6B,CACnC,IAAmD,EACnD,SAAkB;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1C,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAiB,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,UAAU,GACd,OAAO,KAAK,IAAI;gBACd,CAAC,CAAE,EAAmB;gBACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBACtB,CAAC,CAAE,OAAwB;oBAC3B,CAAC,CAAE,CAAC,OAAY,CAAW,CAAC;YAElC,MAAM,IAAI,GAAQ,EAAE,CAAC;YAErB,4EAA4E;YAC5E,iEAAiE;YACjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBAExE,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,sEAAsE;YACtE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAoB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,+CAA+C;QAC/C,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,eAAe,CAAC,KAAQ;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAEpC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAEM,YAAY,CAAC,OAAyB,OAAO;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO;QACxC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEM,qBAAqB,CAAC,GAAW,EAAE,QAAkB;QAC1D,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAEM,qBAAqB,CAAC,GAAW;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK;YAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,WAAW,CAAC,EAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEM,cAAc;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,KAAK,CAAC;IACpB,CAAC;uGAzfU,mBAAmB;2FAAnB,mBAAmB,izCAFnB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;;2FAE5D,mBAAmB;kBAL/B,SAAS;mBAAC;oBACT,QAAQ,EAAE,cAAc;oBACxB,UAAU,EAAE,IAAI;oBAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,qBAAqB,EAAE,CAAC;iBACxE;;sBAiCE,WAAW;uBAAC,WAAW;;sBAGvB,WAAW;uBAAC,2BAA2B;;sBAKvC,WAAW;uBAAC,oBAAoB;;sBAKhC,WAAW;uBAAC,4BAA4B;;sBAgPxC,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;sBAyClC,YAAY;uBAAC,SAAS;;sBAgBtB,YAAY;uBAAC,UAAU,EAAE,CAAC,QAAQ,CAAC","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\n\nimport { createListboxController } from '@tailng-ui/cdk';\nimport type { TngListNavigationAction } from '@tailng-ui/cdk';\nimport {\n TNG_LISTBOX,\n TNG_LISTBOX_FORCE_MULTIPLE,\n TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER,\n} from './tokens';\n\nexport type ListboxValue<T> = T | readonly T[] | null;\n\n@Directive({\n selector: '[tngListbox]',\n standalone: true,\n providers: [{ provide: TNG_LISTBOX, useExisting: TngListboxDirective }],\n})\nexport class TngListboxDirective<T> {\n private readonly _forceMultiple = inject(TNG_LISTBOX_FORCE_MULTIPLE, { optional: true });\n private readonly preserveValueOnUnregister =\n inject(TNG_LISTBOX_PRESERVE_VALUE_ON_UNREGISTER, { optional: true }) ?? false;\n readonly multipleInput = input<boolean>(false, { alias: 'multiple' });\n readonly multiple = computed(() => this._forceMultiple ?? this.multipleInput());\n\n orientation = input<'vertical' | 'horizontal'>('vertical');\n direction = input<'ltr' | 'rtl'>('ltr');\n disabled = input<boolean>(false);\n loop = input<boolean>(true);\n\n /**\n * Enable listbox typeahead (printable key moves active option by option text).\n * Default true for Select compatibility.\n * Autocomplete should set this to false (input owns typing/filtering).\n */\n typeahead = input<boolean>(true);\n\n readonly value = model<ListboxValue<T>>(null);\n\n private readonly el = inject(ElementRef<HTMLElement>);\n\n private idToElement = new Map<string, HTMLElement>();\n private options = signal<{ id: string; value: T; disabled: boolean }[]>([]);\n private controller = signal<ReturnType<typeof createListboxController<T>> | null>(null);\n private activeId = signal<string | null>(null);\n\n // ----------------------------------------------------\n // Host bindings\n // ----------------------------------------------------\n\n @HostBinding('attr.role')\n role = 'listbox';\n\n @HostBinding('attr.aria-multiselectable')\n get ariaMulti() {\n return this.multiple() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-disabled')\n get ariaDisabled() {\n return this.disabled() ? 'true' : null;\n }\n\n @HostBinding('attr.aria-activedescendant')\n get activeDescendant() {\n return this.activeId();\n }\n\n // ----------------------------------------------------\n // Constructor\n // ----------------------------------------------------\n\n constructor() {\n const hostId = `tng-listbox-${Math.random().toString(36).slice(2)}`;\n\n // Controller creation effect\n effect(() => {\n const ctrl = createListboxController<T>({\n hostId,\n selectionMode: this.multiple() ? 'multiple' : 'single',\n orientation: this.orientation(),\n direction: this.direction(),\n disabled: this.disabled(),\n loop: this.loop(),\n });\n\n this.controller.set(ctrl);\n\n const opts = untracked(this.options);\n for (const option of opts) {\n ctrl.registerOption(option);\n }\n });\n\n // Controlled value sanitizer\n effect(() => {\n const isMulti = this.multiple();\n const opts = this.options();\n const external = this.value();\n\n if (!isMulti) {\n if (external === null) return;\n\n const v = external as T;\n const opt = this.findOptionByValue(v, opts);\n\n if (!opt && this.preserveValueOnUnregister) {\n return;\n }\n\n if (!opt || opt.disabled) {\n this.value.set(null);\n }\n return;\n }\n\n if (external === null) return;\n\n const arr = Array.isArray(external)\n ? (external as readonly T[])\n : ([external as T] as readonly T[]);\n\n const filtered = arr.filter((v) => {\n const opt = this.findOptionByValue(v, opts);\n\n if (!opt) {\n return this.preserveValueOnUnregister;\n }\n\n return !opt.disabled;\n });\n\n if (filtered.length !== arr.length) {\n this.value.set(filtered as readonly T[]);\n }\n });\n\n // External value -> controller selection\n effect(() => {\n const ctrl = this.controller();\n if (!ctrl) return;\n\n const opts = this.options();\n const external = this.value();\n\n const toIds = (v: ListboxValue<T>): string[] => {\n if (v === null) return [];\n const arr = Array.isArray(v) ? (v as readonly T[]) : ([v as T] as const);\n\n const ids: string[] = [];\n for (const val of arr) {\n const opt = opts.find((o) => Object.is(o.value, val));\n if (!opt) continue;\n if (opt.disabled) continue;\n ids.push(opt.id);\n }\n return ids;\n };\n\n const nextIds = toIds(external);\n\n if (nextIds.length === 0) {\n ctrl.clearSelection();\n return;\n }\n\n ctrl.setSelectedIds(nextIds);\n });\n\n // Scroll when active changes\n effect(() => {\n const id = this.activeId();\n if (!id) return;\n\n const el = this.idToElement.get(id);\n if (!el) return;\n\n el.scrollIntoView?.({ block: 'nearest' });\n });\n }\n\n // ----------------------------------------------------\n // Helpers\n // ----------------------------------------------------\n\n private findOptionByValue(\n value: T,\n opts: readonly { value: T; disabled: boolean }[],\n ) {\n return opts.find((o) => Object.is(o.value, value));\n }\n\n private isSelectableValue(\n value: T,\n opts: readonly { value: T; disabled: boolean }[],\n ): boolean {\n const opt = this.findOptionByValue(value, opts);\n return !!opt && !opt.disabled;\n }\n\n private syncDomOrderToController(): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n\n const root = this.el.nativeElement;\n const optionEls = Array.from(\n root.querySelectorAll('[role=\"option\"][id]'),\n ) as HTMLElement[];\n\n const ids = optionEls.map((x) => x.id).filter(Boolean);\n\n if (ids.length > 0) {\n ctrl.setItemOrder(ids);\n }\n }\n\n private syncActiveFromController(): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n this.activeId.set(ctrl.getActiveId());\n }\n\n private shouldSyncValueFromAction(action: TngListNavigationAction | null): boolean {\n if (!action) return false;\n if (action.extendSelection) return true;\n\n return (\n action.type === 'select-active' ||\n action.type === 'toggle-active' ||\n action.type === 'select-all'\n );\n }\n\n // ----------------------------------------------------\n // Option registration\n // ----------------------------------------------------\n\n registerOption(\n id: string,\n value: T,\n disabled: boolean,\n text?: string,\n el?: HTMLElement,\n ): void {\n if (el) {\n this.idToElement.set(id, el);\n }\n\n this.options.update((list) => {\n const idx = list.findIndex((x) => x.id === id);\n if (idx === -1) return [...list, { id, value, disabled }];\n const copy = list.slice();\n copy[idx] = { id, value, disabled };\n return copy;\n });\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.unregisterOption(id);\n ctrl.registerOption({ id, value, disabled, text });\n }\n\n unregisterOption(id: string): void {\n this.options.update((list) => list.filter((x) => x.id !== id));\n this.idToElement.delete(id);\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.unregisterOption(id);\n\n this.syncActiveFromController();\n\n if (!this.preserveValueOnUnregister) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n }\n\n updateOptionDisabled(id: string, disabled: boolean): void {\n let exists = false;\n\n this.options.update((list) =>\n list.map((o) => {\n if (o.id !== id) return o;\n exists = true;\n return { ...o, disabled };\n }),\n );\n\n if (!exists) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n ctrl.setOptionDisabled(id, disabled);\n this.syncActiveFromController();\n }\n\n // ----------------------------------------------------\n // Events\n // ----------------------------------------------------\n\n @HostListener('keydown', ['$event'])\n handleKeydown(event: KeyboardEvent) {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n this.syncDomOrderToController();\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n // ✅ Typeahead (optional)\n if (\n this.typeahead() &&\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n const moved = ctrl.typeahead(event.key);\n if (moved) {\n this.syncActiveFromController();\n event.preventDefault();\n return;\n }\n }\n\n const action = ctrl.handleKeyDown(event);\n this.syncActiveFromController();\n\n if (action?.preventDefault) {\n event.preventDefault();\n }\n\n if (this.shouldSyncValueFromAction(action)) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n }\n\n @HostListener('focusin')\n handleFocusIn() {\n if (this.disabled()) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n if (ctrl.getActiveId() !== null) {\n this.syncActiveFromController();\n return;\n }\n\n ctrl.handleKeyDown({ key: 'Home' });\n this.syncActiveFromController();\n }\n\n @HostListener('focusout', ['$event'])\n handleFocusOut(event: FocusEvent) {\n const nextTarget = event.relatedTarget;\n if (nextTarget instanceof Node && this.el.nativeElement.contains(nextTarget)) {\n return;\n }\n\n const ctrl = this.controller();\n if (!ctrl) return;\n if (ctrl.getActiveId() === null) return;\n\n ctrl.setActiveId(null);\n this.syncActiveFromController();\n }\n\n handleOptionClick(id: string, shiftKey?: boolean) {\n if (this.disabled()) return;\n\n this.syncDomOrderToController();\n\n const opt = this.options().find((o) => o.id === id);\n if (opt?.disabled) return;\n\n const ctrl = this.controller();\n if (!ctrl) return;\n\n // Pointer selection should transfer keyboard focus to this listbox so\n // subsequent Arrow keys continue from the clicked list.\n this.el.nativeElement.focus();\n\n ctrl.handleClick(id, shiftKey);\n\n this.syncActiveFromController();\n this.syncExternalValueFromInternal(ctrl, true);\n }\n\n // ----------------------------------------------------\n // Selection sync\n // ----------------------------------------------------\n\n private syncExternalValueFromInternal(\n ctrl: ReturnType<typeof createListboxController<T>>,\n fromClick: boolean,\n ) {\n const selected = ctrl.getSelectedValues();\n\n if (this.multiple()) {\n if (!this.preserveValueOnUnregister) {\n this.value.set([...selected] as readonly T[]);\n return;\n }\n\n const opts = this.options();\n const current = this.value();\n const currentArr =\n current === null\n ? ([] as readonly T[])\n : Array.isArray(current)\n ? (current as readonly T[])\n : ([current as T] as const);\n\n const next: T[] = [];\n\n // Preserve hidden selections in their current order, and keep any currently\n // visible selections that remain selected after the interaction.\n for (const val of currentArr) {\n const isHidden = !opts.some((opt) => Object.is(opt.value, val));\n const isStillSelected = selected.some((entry) => Object.is(entry, val));\n\n if (isHidden || isStillSelected) {\n next.push(val);\n }\n }\n\n // Append newly selected visible values that were not already present.\n for (const val of selected) {\n const alreadyPresent = currentArr.some((entry) => Object.is(entry, val));\n if (!alreadyPresent) {\n next.push(val);\n }\n }\n\n this.value.set(next as readonly T[]);\n } else {\n const newVal = selected[0] ?? null;\n const current = this.value();\n this.value.set(newVal);\n if (fromClick && Object.is(newVal, current)) {\n this.value.set(null);\n this.value.set(newVal);\n }\n }\n }\n\n isSelected(id: string): boolean {\n const ctrl = this.controller();\n if (!ctrl) return false;\n \n // ✅ selection truth is IDs, not value equality\n return ctrl.getSelectedIds().includes(id);\n }\n\n isValueSelected(value: T): boolean {\n const selected = this.value();\n\n if (selected === null) return false;\n\n if (Array.isArray(selected)) {\n return selected.some((entry) => Object.is(entry, value));\n }\n\n return Object.is(selected, value);\n }\n\n isActive(id: string): boolean {\n return this.activeId() === id;\n }\n\n public getActiveId(): string | null {\n return this.activeId();\n }\n\n public ensureActive(pref: 'first' | 'last' = 'first'): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n if (ctrl.getActiveId() !== null) return;\n ctrl.handleKeyDown({ key: pref === 'last' ? 'End' : 'Home' });\n this.syncActiveFromController();\n }\n\n public handleKeyFromCombobox(key: string, shiftKey?: boolean): boolean {\n this.syncDomOrderToController();\n\n const ctrl = this.controller();\n if (!ctrl) return false;\n const action = ctrl.handleKeyDown({ key, shiftKey } as any);\n this.syncActiveFromController();\n if (this.shouldSyncValueFromAction(action)) {\n this.syncExternalValueFromInternal(ctrl, false);\n }\n return !!action;\n }\n\n public typeaheadFromCombobox(key: string): boolean {\n const ctrl = this.controller();\n if (!ctrl) return false;\n const moved = ctrl.typeahead(key);\n if (moved) this.syncActiveFromController();\n return moved;\n }\n\n public setActiveId(id: string | null): void {\n const ctrl = this.controller();\n if (!ctrl) return;\n ctrl.setActiveId(id);\n this.syncActiveFromController();\n }\n\n public getActiveValue(): T | undefined {\n const active = this.activeId();\n if (!active) return undefined;\n const opt = this.options().find((o) => o.id === active);\n return opt?.value;\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AfterViewInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
2
3
|
export declare class TngOptionDirective<T = unknown> implements AfterViewInit, OnDestroy {
|
|
3
4
|
tngValue: import("@angular/core").InputSignal<T | undefined>;
|
|
4
5
|
disabled: import("@angular/core").InputSignal<boolean>;
|
|
@@ -18,5 +19,7 @@ export declare class TngOptionDirective<T = unknown> implements AfterViewInit, O
|
|
|
18
19
|
ngOnDestroy(): void;
|
|
19
20
|
onPointerDown(event: PointerEvent): void;
|
|
20
21
|
private isSelected;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngOptionDirective<any>, never>;
|
|
23
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngOptionDirective<any>, "[tngOption]", never, { "tngValue": { "alias": "tngValue"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
21
24
|
}
|
|
22
25
|
//# sourceMappingURL=option.directive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option.directive.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/option.directive.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAKb,SAAS,EAKV,MAAM,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"option.directive.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/option.directive.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAKb,SAAS,EAKV,MAAM,eAAe,CAAC;;AAOvB,qBAIa,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,aAAa,EAAE,SAAS;IAC9E,QAAQ,qDAA0B;IAClC,QAAQ,+CAAyB;IAEjC,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,EAAE,CAAc;IAGxB,OAAO,CAAC,UAAU,CAAiB;IAGnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG3B;IAGH,IAAI,SAAY;IAEhB,IACI,MAAM,WAET;IAED,IACI,YAAY,IAAI,MAAM,GAAG,OAAO,CAEnC;IAED,IACI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAGD,IACI,UAAU,IAAI,EAAE,GAAG,IAAI,CAE1B;IAED,IACI,YAAY,IAAI,EAAE,GAAG,IAAI,CAE5B;IAED,IACI,YAAY,IAAI,EAAE,GAAG,IAAI,CAE5B;IAED,eAAe;IAWf,WAAW;IAOX,aAAa,CAAC,KAAK,EAAE,YAAY;IAcjC,OAAO,CAAC,UAAU;yCAnFP,kBAAkB;2CAAlB,kBAAkB;CA4F9B"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
// option.directive.ts
|
|
3
2
|
import { Directive, ElementRef, HostBinding, HostListener, effect, inject, input, signal, } from '@angular/core';
|
|
4
3
|
import { createTngIdFactory } from '@tailng-ui/cdk';
|
|
5
4
|
import { TNG_LISTBOX } from './tokens';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
6
|
const createId = createTngIdFactory('tng-option');
|
|
7
|
-
|
|
8
|
-
tngValue = input();
|
|
9
|
-
disabled = input(false);
|
|
7
|
+
export class TngOptionDirective {
|
|
8
|
+
tngValue = input(...(ngDevMode ? [undefined, { debugName: "tngValue" }] : []));
|
|
9
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
|
|
10
10
|
el = inject((ElementRef));
|
|
11
11
|
listbox = inject(TNG_LISTBOX);
|
|
12
12
|
id = createId();
|
|
13
13
|
// gate to ensure we only push updates after initial registration
|
|
14
|
-
registered = signal(false);
|
|
14
|
+
registered = signal(false, ...(ngDevMode ? [{ debugName: "registered" }] : []));
|
|
15
15
|
// ✅ effect is created in injection context (field initializer)
|
|
16
16
|
_syncDisabled = effect(() => {
|
|
17
17
|
if (!this.registered())
|
|
18
18
|
return;
|
|
19
19
|
this.listbox.updateOptionDisabled(this.id, this.disabled());
|
|
20
|
-
});
|
|
20
|
+
}, ...(ngDevMode ? [{ debugName: "_syncDisabled" }] : []));
|
|
21
21
|
role = 'option';
|
|
22
22
|
get hostId() {
|
|
23
23
|
return this.id;
|
|
@@ -74,36 +74,38 @@ let TngOptionDirective = class TngOptionDirective {
|
|
|
74
74
|
return false;
|
|
75
75
|
return this.listbox.isValueSelected(value);
|
|
76
76
|
}
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
],
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
],
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
],
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
],
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
],
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
],
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
],
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
],
|
|
108
|
-
|
|
77
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngOptionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
78
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.1", type: TngOptionDirective, isStandalone: true, selector: "[tngOption]", inputs: { tngValue: { classPropertyName: "tngValue", publicName: "tngValue", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerdown": "onPointerDown($event)" }, properties: { "attr.role": "this.role", "attr.id": "this.hostId", "attr.aria-selected": "this.ariaSelected", "attr.aria-disabled": "this.ariaDisabled", "attr.data-active": "this.dataActive", "attr.data-selected": "this.dataSelected", "attr.data-disabled": "this.dataDisabled" } }, ngImport: i0 });
|
|
79
|
+
}
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngOptionDirective, decorators: [{
|
|
81
|
+
type: Directive,
|
|
82
|
+
args: [{
|
|
83
|
+
selector: '[tngOption]',
|
|
84
|
+
standalone: true,
|
|
85
|
+
}]
|
|
86
|
+
}], propDecorators: { tngValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngValue", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], role: [{
|
|
87
|
+
type: HostBinding,
|
|
88
|
+
args: ['attr.role']
|
|
89
|
+
}], hostId: [{
|
|
90
|
+
type: HostBinding,
|
|
91
|
+
args: ['attr.id']
|
|
92
|
+
}], ariaSelected: [{
|
|
93
|
+
type: HostBinding,
|
|
94
|
+
args: ['attr.aria-selected']
|
|
95
|
+
}], ariaDisabled: [{
|
|
96
|
+
type: HostBinding,
|
|
97
|
+
args: ['attr.aria-disabled']
|
|
98
|
+
}], dataActive: [{
|
|
99
|
+
type: HostBinding,
|
|
100
|
+
args: ['attr.data-active']
|
|
101
|
+
}], dataSelected: [{
|
|
102
|
+
type: HostBinding,
|
|
103
|
+
args: ['attr.data-selected']
|
|
104
|
+
}], dataDisabled: [{
|
|
105
|
+
type: HostBinding,
|
|
106
|
+
args: ['attr.data-disabled']
|
|
107
|
+
}], onPointerDown: [{
|
|
108
|
+
type: HostListener,
|
|
109
|
+
args: ['pointerdown', ['$event']]
|
|
110
|
+
}] } });
|
|
109
111
|
//# sourceMappingURL=option.directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option.directive.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/option.directive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"option.directive.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/listbox/option.directive.ts"],"names":[],"mappings":"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","sourcesContent":["// option.directive.ts\nimport {\n AfterViewInit,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n OnDestroy,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport { TNG_LISTBOX } from './tokens';\n\nconst createId = createTngIdFactory('tng-option');\n\n@Directive({\n selector: '[tngOption]',\n standalone: true,\n})\nexport class TngOptionDirective<T = unknown> implements AfterViewInit, OnDestroy {\n tngValue = input<T | undefined>();\n disabled = input<boolean>(false);\n\n private el = inject(ElementRef<HTMLElement>);\n private listbox = inject(TNG_LISTBOX);\n private id = createId();\n\n // gate to ensure we only push updates after initial registration\n private registered = signal(false);\n\n // ✅ effect is created in injection context (field initializer)\n private readonly _syncDisabled = effect(() => {\n if (!this.registered()) return;\n this.listbox.updateOptionDisabled(this.id, this.disabled());\n });\n\n @HostBinding('attr.role')\n role = 'option';\n\n @HostBinding('attr.id')\n get hostId() {\n return this.id;\n }\n\n @HostBinding('attr.aria-selected')\n get ariaSelected(): 'true' | 'false' {\n return this.isSelected() ? 'true' : 'false';\n }\n\n @HostBinding('attr.aria-disabled')\n get ariaDisabled(): 'true' | null {\n return this.disabled() ? 'true' : null;\n }\n\n // ✅ Tailwind-friendly state attributes (presence based)\n @HostBinding('attr.data-active')\n get dataActive(): '' | null {\n return this.listbox.isActive(this.id) ? '' : null;\n }\n\n @HostBinding('attr.data-selected')\n get dataSelected(): '' | null {\n return this.isSelected() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n get dataDisabled(): '' | null {\n return this.disabled() ? '' : null;\n }\n\n ngAfterViewInit() {\n const value = this.tngValue();\n if (value === undefined) return;\n\n const text = this.el.nativeElement.textContent?.trim() ?? '';\n // pass text for typeahead\n this.listbox.registerOption(this.id, value, this.disabled(), text, this.el.nativeElement);\n\n this.registered.set(true);\n }\n\n ngOnDestroy() {\n this.listbox.unregisterOption(this.id);\n this.registered.set(false);\n // Angular will destroy directive + tear down effect automatically\n }\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent) {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (event.button !== 0) return;\n\n // Prevent focus from moving / text selection, keep listbox behavior stable.\n event.preventDefault();\n\n this.listbox.handleOptionClick(this.id, event.shiftKey);\n }\n\n private isSelected(): boolean {\n if (this.listbox.isSelected(this.id)) return true;\n if (this.disabled()) return false;\n\n const value = this.tngValue();\n if (value === undefined) return false;\n\n return this.listbox.isValueSelected(value);\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
1
2
|
export declare class TngMultiAutocompleteChip<T = unknown> {
|
|
2
3
|
private readonly multi;
|
|
3
4
|
private readonly el;
|
|
@@ -7,5 +8,7 @@ export declare class TngMultiAutocompleteChip<T = unknown> {
|
|
|
7
8
|
protected readonly tabIndex = -1;
|
|
8
9
|
focus(): void;
|
|
9
10
|
protected onKeydown(event: KeyboardEvent): void;
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngMultiAutocompleteChip<any>, never>;
|
|
12
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngMultiAutocompleteChip<any>, "[tngMultiAutocompleteChip]", ["tngMultiAutocompleteChip"], { "tngValue": { "alias": "tngValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10
13
|
}
|
|
11
14
|
//# sourceMappingURL=tng-multi-autocomplete.chip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.chip.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":"AAYA,qBAKa,wBAAwB,CAAC,CAAC,GAAG,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;IACjF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmC;IAEtD,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,gDAAyB;IAG1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,yBAAyB,CAAU;IAGjE,SAAS,CAAC,QAAQ,CAAC,QAAQ,MAAM;IAEjC,KAAK,IAAI,IAAI;IAKb,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.chip.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":";AAYA,qBAKa,wBAAwB,CAAC,CAAC,GAAG,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2D;IACjF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmC;IAEtD,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,gDAAyB;IAG1C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,yBAAyB,CAAU;IAGjE,SAAS,CAAC,QAAQ,CAAC,QAAQ,MAAM;IAEjC,KAAK,IAAI,IAAI;IAKb,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;yCAlBpC,wBAAwB;2CAAxB,wBAAwB;CAuGpC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
import { Directive, ElementRef, HostBinding, HostListener, inject, input, } from '@angular/core';
|
|
3
2
|
import { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';
|
|
4
|
-
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class TngMultiAutocompleteChip {
|
|
5
5
|
multi = inject(TNG_MULTI_AUTOCOMPLETE);
|
|
6
6
|
el = inject((ElementRef));
|
|
7
7
|
/** The value represented by this chip (needed for Delete/Backspace remove). */
|
|
8
|
-
tngValue = input(null);
|
|
8
|
+
tngValue = input(null, ...(ngDevMode ? [{ debugName: "tngValue" }] : []));
|
|
9
9
|
dataSlot = 'multi-autocomplete-chip';
|
|
10
10
|
tabIndex = -1;
|
|
11
11
|
focus() {
|
|
@@ -77,22 +77,24 @@ let TngMultiAutocompleteChip = class TngMultiAutocompleteChip {
|
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
],
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
]
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
],
|
|
97
|
-
|
|
80
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteChip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
81
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.1", type: TngMultiAutocompleteChip, isStandalone: true, selector: "[tngMultiAutocompleteChip]", inputs: { tngValue: { classPropertyName: "tngValue", publicName: "tngValue", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "attr.data-slot": "this.dataSlot", "attr.tabindex": "this.tabIndex" } }, exportAs: ["tngMultiAutocompleteChip"], ngImport: i0 });
|
|
82
|
+
}
|
|
83
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteChip, decorators: [{
|
|
84
|
+
type: Directive,
|
|
85
|
+
args: [{
|
|
86
|
+
selector: '[tngMultiAutocompleteChip]',
|
|
87
|
+
exportAs: 'tngMultiAutocompleteChip',
|
|
88
|
+
standalone: true,
|
|
89
|
+
}]
|
|
90
|
+
}], propDecorators: { tngValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngValue", required: false }] }], dataSlot: [{
|
|
91
|
+
type: HostBinding,
|
|
92
|
+
args: ['attr.data-slot']
|
|
93
|
+
}], tabIndex: [{
|
|
94
|
+
type: HostBinding,
|
|
95
|
+
args: ['attr.tabindex']
|
|
96
|
+
}], onKeydown: [{
|
|
97
|
+
type: HostListener,
|
|
98
|
+
args: ['keydown', ['$event']]
|
|
99
|
+
}] } });
|
|
98
100
|
//# sourceMappingURL=tng-multi-autocomplete.chip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.chip.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.chip.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.chip.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n} from '@angular/core';\n\nimport { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';\nimport type { TngMultiAutocomplete } from './tng-multi-autocomplete';\n\n@Directive({\n selector: '[tngMultiAutocompleteChip]',\n exportAs: 'tngMultiAutocompleteChip',\n standalone: true,\n})\nexport class TngMultiAutocompleteChip<T = unknown> {\n private readonly multi = inject<TngMultiAutocomplete<T>>(TNG_MULTI_AUTOCOMPLETE);\n private readonly el = inject(ElementRef<HTMLElement>);\n\n /** The value represented by this chip (needed for Delete/Backspace remove). */\n readonly tngValue = input<T | null>(null);\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'multi-autocomplete-chip' as const;\n\n @HostBinding('attr.tabindex')\n protected readonly tabIndex = -1;\n\n focus(): void {\n this.el.nativeElement.focus();\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n const host = this.multi.hostElement;\n\n const chips = Array.from(\n host.querySelectorAll('[data-slot=\"multi-autocomplete-chip\"]'),\n ) as HTMLElement[];\n\n const currentIndex = chips.indexOf(this.el.nativeElement);\n if (currentIndex < 0) return;\n\n // ArrowLeft → previous chip (if any)\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n event.stopPropagation();\n const prev = chips[currentIndex - 1];\n prev?.focus();\n return;\n }\n\n // ArrowRight → next chip else input trigger\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n event.stopPropagation();\n\n const next = chips[currentIndex + 1];\n if (next) {\n next.focus();\n return;\n }\n\n const input = host.querySelector('[data-slot=\"multi-autocomplete-trigger\"]') as HTMLElement | null;\n input?.focus();\n return;\n }\n\n // Delete / Backspace → remove this chip value\n if (event.key === 'Delete' || event.key === 'Backspace') {\n if (this.multi.disabled()) return;\n\n const v = this.tngValue();\n if (v == null) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n // Choose next focus target *before* removing\n const prev = chips[currentIndex - 1] ?? null;\n const next = chips[currentIndex + 1] ?? null;\n const input = host.querySelector('[data-slot=\"multi-autocomplete-trigger\"]') as HTMLElement | null;\n\n // remove selected value\n this.multi.remove(v);\n\n // focus after DOM updates\n queueMicrotask(() => {\n (prev ?? next ?? input)?.focus?.();\n });\n\n return;\n }\n\n // Home → first chip\n if (event.key === 'Home') {\n event.preventDefault();\n event.stopPropagation();\n\n const first = chips[0] ?? null;\n first?.focus();\n return;\n }\n\n // End → last chip (if any) else input trigger\n // End → input trigger (jump out of chips)\n if (event.key === 'End') {\n event.preventDefault();\n event.stopPropagation();\n\n const input = host.querySelector(\n '[data-slot=\"multi-autocomplete-trigger\"]',\n ) as HTMLElement | null;\n\n input?.focus();\n return;\n }\n }\n}"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
1
2
|
export declare class TngMultiAutocompleteContent {
|
|
2
3
|
private readonly multi;
|
|
3
4
|
private readonly destroyRef;
|
|
@@ -6,5 +7,7 @@ export declare class TngMultiAutocompleteContent {
|
|
|
6
7
|
protected get hidden(): '' | null;
|
|
7
8
|
protected get ariaBusy(): 'true' | null;
|
|
8
9
|
constructor();
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngMultiAutocompleteContent, never>;
|
|
11
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngMultiAutocompleteContent, "[tngMultiAutocompleteContent]", ["tngMultiAutocompleteContent"], {}, {}, never, never, true, never>;
|
|
9
12
|
}
|
|
10
13
|
//# sourceMappingURL=tng-multi-autocomplete.content.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.content.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":"AAOA,qBAKa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAGjD,QAAQ,CAAC,EAAE,SAAqB;IAGhC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,4BAA4B,CAAU;IAGpE,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,IAAI,CAEhC;IAGD,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG,IAAI,CAEtC;;
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.content.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":";AAOA,qBAKa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAGjD,QAAQ,CAAC,EAAE,SAAqB;IAGhC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,4BAA4B,CAAU;IAGpE,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,IAAI,CAEhC;IAGD,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG,IAAI,CAEtC;;yCAlBU,2BAA2B;2CAA3B,2BAA2B;CA0BvC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
1
|
import { DestroyRef, Directive, HostBinding, inject } from '@angular/core';
|
|
3
2
|
import { createTngIdFactory } from '@tailng-ui/cdk';
|
|
4
3
|
import { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
5
|
const createContentId = createTngIdFactory('tng-multi-autocomplete-content');
|
|
6
|
-
|
|
6
|
+
export class TngMultiAutocompleteContent {
|
|
7
7
|
multi = inject(TNG_MULTI_AUTOCOMPLETE);
|
|
8
8
|
destroyRef = inject(DestroyRef);
|
|
9
9
|
id = createContentId();
|
|
@@ -21,25 +21,27 @@ let TngMultiAutocompleteContent = class TngMultiAutocompleteContent {
|
|
|
21
21
|
this.multi.setContentId(null);
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
],
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
]
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
],
|
|
44
|
-
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
25
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type: TngMultiAutocompleteContent, isStandalone: true, selector: "[tngMultiAutocompleteContent]", host: { properties: { "attr.id": "this.id", "attr.data-slot": "this.dataSlot", "attr.hidden": "this.hidden", "attr.aria-busy": "this.ariaBusy" } }, exportAs: ["tngMultiAutocompleteContent"], ngImport: i0 });
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngMultiAutocompleteContent, decorators: [{
|
|
28
|
+
type: Directive,
|
|
29
|
+
args: [{
|
|
30
|
+
selector: '[tngMultiAutocompleteContent]',
|
|
31
|
+
exportAs: 'tngMultiAutocompleteContent',
|
|
32
|
+
standalone: true,
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: () => [], propDecorators: { id: [{
|
|
35
|
+
type: HostBinding,
|
|
36
|
+
args: ['attr.id']
|
|
37
|
+
}], dataSlot: [{
|
|
38
|
+
type: HostBinding,
|
|
39
|
+
args: ['attr.data-slot']
|
|
40
|
+
}], hidden: [{
|
|
41
|
+
type: HostBinding,
|
|
42
|
+
args: ['attr.hidden']
|
|
43
|
+
}], ariaBusy: [{
|
|
44
|
+
type: HostBinding,
|
|
45
|
+
args: ['attr.aria-busy']
|
|
46
|
+
}] } });
|
|
45
47
|
//# sourceMappingURL=tng-multi-autocomplete.content.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.content.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.content.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;;AAGzE,MAAM,eAAe,GAAG,kBAAkB,CAAC,gCAAgC,CAAC,CAAC;AAO7E,MAAM,OAAO,2BAA2B;IACrB,KAAK,GAAG,MAAM,CAAuB,sBAAsB,CAAC,CAAC;IAC7D,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAGxC,EAAE,GAAG,eAAe,EAAE,CAAC;IAGb,QAAQ,GAAG,4BAAqC,CAAC;IAEpE,IACc,MAAM;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,IACc,QAAQ;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED;QACE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;uGAzBU,2BAA2B;2FAA3B,2BAA2B;;2FAA3B,2BAA2B;kBALvC,SAAS;mBAAC;oBACT,QAAQ,EAAE,+BAA+B;oBACzC,QAAQ,EAAE,6BAA6B;oBACvC,UAAU,EAAE,IAAI;iBACjB;;sBAKE,WAAW;uBAAC,SAAS;;sBAGrB,WAAW;uBAAC,gBAAgB;;sBAG5B,WAAW;uBAAC,aAAa;;sBAKzB,WAAW;uBAAC,gBAAgB","sourcesContent":["import { DestroyRef, Directive, HostBinding, inject } from '@angular/core';\nimport { createTngIdFactory } from '@tailng-ui/cdk';\nimport { TNG_MULTI_AUTOCOMPLETE } from './tng-multi-autocomplete.tokens';\nimport type { TngMultiAutocomplete } from './tng-multi-autocomplete';\n\nconst createContentId = createTngIdFactory('tng-multi-autocomplete-content');\n\n@Directive({\n selector: '[tngMultiAutocompleteContent]',\n exportAs: 'tngMultiAutocompleteContent',\n standalone: true,\n})\nexport class TngMultiAutocompleteContent {\n private readonly multi = inject<TngMultiAutocomplete>(TNG_MULTI_AUTOCOMPLETE);\n private readonly destroyRef = inject(DestroyRef);\n\n @HostBinding('attr.id')\n readonly id = createContentId();\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'multi-autocomplete-content' as const;\n\n @HostBinding('attr.hidden')\n protected get hidden(): '' | null {\n return this.multi.open() ? null : '';\n }\n\n @HostBinding('attr.aria-busy')\n protected get ariaBusy(): 'true' | null {\n return this.multi.loading() ? 'true' : null;\n }\n\n constructor() {\n this.multi.setContentId(this.id);\n this.destroyRef.onDestroy(() => {\n if (this.multi.getContentId() === this.id) this.multi.setContentId(null);\n });\n }\n}"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TngMultiAutocompleteListboxApi } from './tng-multi-autocomplete.listbox.types';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
2
3
|
export declare class TngMultiAutocomplete<T = unknown> {
|
|
3
4
|
readonly hostElement: any;
|
|
4
5
|
/** Whether overlay is open. */
|
|
@@ -39,5 +40,7 @@ export declare class TngMultiAutocomplete<T = unknown> {
|
|
|
39
40
|
getActiveDescendantId(): string | null;
|
|
40
41
|
setListboxApi(api: TngMultiAutocompleteListboxApi | null): void;
|
|
41
42
|
getListboxApi(): TngMultiAutocompleteListboxApi | null;
|
|
43
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngMultiAutocomplete<any>, never>;
|
|
44
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngMultiAutocomplete<any>, "[tngMultiAutocomplete]", ["tngMultiAutocomplete"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "value": "valueChange"; "query": "queryChange"; "queryChange": "queryChange"; }, never, never, true, never>;
|
|
42
45
|
}
|
|
43
46
|
//# sourceMappingURL=tng-multi-autocomplete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;;AAE7F,qBAMa,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC3C,QAAQ,CAAC,WAAW,MAAiD;IAErE,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,+CAAyB;IAEtC,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,+CAAyB;IAE1C,sCAAsC;IACtC,QAAQ,CAAC,KAAK,oDAA2B;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,8CAAqB;IAEnC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,mDAAoB;IAExC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,+CAAyB;IACzC,QAAQ,CAAC,OAAO,+CAAyB;IAGzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAA+C;IAKlE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,oBAAoB,CAAU;IAG5D,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,QAAQ,CAE3C;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAEtC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAErC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAErC;IAID,UAAU,IAAI,IAAI;IAKlB,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,IAAI;IASlB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAUnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAWtB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAatB,KAAK,IAAI,IAAI;IAKb,UAAU,IAAI,IAAI;IAalB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGrC,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGrC,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAG9C,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,GAAG,EAAE,8BAA8B,GAAG,IAAI,GAAG,IAAI;IAG/D,aAAa,IAAI,8BAA8B,GAAG,IAAI;yCArJ3C,oBAAoB;2CAApB,oBAAoB;CAwJhC"}
|