snice 2.5.4 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +501 -882
- package/bin/templates/base/src/components/counter-button.ts +13 -26
- package/bin/templates/base/src/controllers/counter-controller.ts +3 -3
- package/dist/components/accordion/snice-accordion-item.d.ts +4 -5
- package/dist/components/accordion/snice-accordion-item.js +37 -39
- package/dist/components/accordion/snice-accordion-item.js.map +1 -1
- package/dist/components/accordion/snice-accordion.d.ts +5 -11
- package/dist/components/accordion/snice-accordion.js +51 -52
- package/dist/components/accordion/snice-accordion.js.map +1 -1
- package/dist/components/alert/snice-alert.d.ts +2 -6
- package/dist/components/alert/snice-alert.js +41 -56
- package/dist/components/alert/snice-alert.js.map +1 -1
- package/dist/components/avatar/snice-avatar.d.ts +2 -6
- package/dist/components/avatar/snice-avatar.js +64 -71
- package/dist/components/avatar/snice-avatar.js.map +1 -1
- package/dist/components/badge/snice-badge.d.ts +2 -3
- package/dist/components/badge/snice-badge.js +22 -23
- package/dist/components/badge/snice-badge.js.map +1 -1
- package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +5 -12
- package/dist/components/breadcrumbs/snice-breadcrumbs.js +88 -89
- package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -1
- package/dist/components/button/snice-button.d.ts +3 -7
- package/dist/components/button/snice-button.js +37 -58
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/components/card/snice-card.d.ts +5 -8
- package/dist/components/card/snice-card.js +71 -56
- package/dist/components/card/snice-card.js.map +1 -1
- package/dist/components/checkbox/snice-checkbox.d.ts +4 -13
- package/dist/components/checkbox/snice-checkbox.js +66 -137
- package/dist/components/checkbox/snice-checkbox.js.map +1 -1
- package/dist/components/chip/snice-chip.d.ts +5 -11
- package/dist/components/chip/snice-chip.js +44 -47
- package/dist/components/chip/snice-chip.js.map +1 -1
- package/dist/components/date-picker/snice-date-picker.d.ts +11 -11
- package/dist/components/date-picker/snice-date-picker.js +134 -133
- package/dist/components/date-picker/snice-date-picker.js.map +1 -1
- package/dist/components/divider/snice-divider.d.ts +2 -4
- package/dist/components/divider/snice-divider.js +14 -22
- package/dist/components/divider/snice-divider.js.map +1 -1
- package/dist/components/drawer/snice-drawer.d.ts +4 -4
- package/dist/components/drawer/snice-drawer.js +25 -19
- package/dist/components/drawer/snice-drawer.js.map +1 -1
- package/dist/components/input/snice-input.d.ts +8 -6
- package/dist/components/input/snice-input.js +122 -105
- package/dist/components/input/snice-input.js.map +1 -1
- package/dist/components/layout/snice-layout-blog.d.ts +4 -4
- package/dist/components/layout/snice-layout-blog.js +21 -19
- package/dist/components/layout/snice-layout-blog.js.map +1 -1
- package/dist/components/layout/snice-layout-card.d.ts +2 -2
- package/dist/components/layout/snice-layout-card.js +16 -9
- package/dist/components/layout/snice-layout-card.js.map +1 -1
- package/dist/components/layout/snice-layout-centered.d.ts +2 -2
- package/dist/components/layout/snice-layout-centered.js +14 -7
- package/dist/components/layout/snice-layout-centered.js.map +1 -1
- package/dist/components/layout/snice-layout-dashboard.d.ts +5 -5
- package/dist/components/layout/snice-layout-dashboard.js +38 -30
- package/dist/components/layout/snice-layout-dashboard.js.map +1 -1
- package/dist/components/layout/snice-layout-fullscreen.d.ts +2 -2
- package/dist/components/layout/snice-layout-fullscreen.js +17 -10
- package/dist/components/layout/snice-layout-fullscreen.js.map +1 -1
- package/dist/components/layout/snice-layout-landing.d.ts +4 -4
- package/dist/components/layout/snice-layout-landing.js +21 -19
- package/dist/components/layout/snice-layout-landing.js.map +1 -1
- package/dist/components/layout/snice-layout-minimal.d.ts +2 -2
- package/dist/components/layout/snice-layout-minimal.js +17 -6
- package/dist/components/layout/snice-layout-minimal.js.map +1 -1
- package/dist/components/layout/snice-layout-sidebar.d.ts +5 -4
- package/dist/components/layout/snice-layout-sidebar.js +42 -20
- package/dist/components/layout/snice-layout-sidebar.js.map +1 -1
- package/dist/components/layout/snice-layout-split.d.ts +2 -2
- package/dist/components/layout/snice-layout-split.js +14 -7
- package/dist/components/layout/snice-layout-split.js.map +1 -1
- package/dist/components/layout/snice-layout.d.ts +4 -4
- package/dist/components/layout/snice-layout.js +16 -10
- package/dist/components/layout/snice-layout.js.map +1 -1
- package/dist/components/login/snice-login.d.ts +6 -11
- package/dist/components/login/snice-login.js +97 -71
- package/dist/components/login/snice-login.js.map +1 -1
- package/dist/components/modal/snice-modal.d.ts +5 -9
- package/dist/components/modal/snice-modal.js +47 -78
- package/dist/components/modal/snice-modal.js.map +1 -1
- package/dist/components/nav/snice-nav.d.ts +13 -7
- package/dist/components/nav/snice-nav.js +191 -100
- package/dist/components/nav/snice-nav.js.map +1 -1
- package/dist/components/nav/snice-nav.types.d.ts +3 -3
- package/dist/components/pagination/snice-pagination.d.ts +6 -7
- package/dist/components/pagination/snice-pagination.js +94 -81
- package/dist/components/pagination/snice-pagination.js.map +1 -1
- package/dist/components/progress/snice-progress.d.ts +2 -7
- package/dist/components/progress/snice-progress.js +41 -98
- package/dist/components/progress/snice-progress.js.map +1 -1
- package/dist/components/radio/snice-radio.d.ts +4 -4
- package/dist/components/radio/snice-radio.js +52 -44
- package/dist/components/radio/snice-radio.js.map +1 -1
- package/dist/components/select/snice-option.d.ts +2 -1
- package/dist/components/select/snice-option.js +12 -5
- package/dist/components/select/snice-option.js.map +1 -1
- package/dist/components/select/snice-select.d.ts +9 -21
- package/dist/components/select/snice-select.js +98 -170
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/skeleton/snice-skeleton.d.ts +2 -6
- package/dist/components/skeleton/snice-skeleton.js +18 -49
- package/dist/components/skeleton/snice-skeleton.js.map +1 -1
- package/dist/components/snice-cell-BLFVdxPp.js +4 -0
- package/dist/components/snice-cell-BLFVdxPp.js.map +1 -0
- package/dist/components/switch/snice-switch.d.ts +2 -2
- package/dist/components/switch/snice-switch.js +38 -26
- package/dist/components/switch/snice-switch.js.map +1 -1
- package/dist/components/table/snice-cell-actions.d.ts +24 -0
- package/dist/components/table/snice-cell-actions.js +149 -0
- package/dist/components/table/snice-cell-actions.js.map +1 -0
- package/dist/components/table/snice-cell-boolean.d.ts +2 -2
- package/dist/components/table/snice-cell-boolean.js +13 -7
- package/dist/components/table/snice-cell-boolean.js.map +1 -1
- package/dist/components/table/snice-cell-color.d.ts +18 -0
- package/dist/components/table/snice-cell-color.js +149 -0
- package/dist/components/table/snice-cell-color.js.map +1 -0
- package/dist/components/table/snice-cell-currency.d.ts +24 -0
- package/dist/components/table/snice-cell-currency.js +235 -0
- package/dist/components/table/snice-cell-currency.js.map +1 -0
- package/dist/components/table/snice-cell-date.d.ts +2 -2
- package/dist/components/table/snice-cell-date.js +14 -8
- package/dist/components/table/snice-cell-date.js.map +1 -1
- package/dist/components/table/snice-cell-duration.d.ts +2 -2
- package/dist/components/table/snice-cell-duration.js +12 -6
- package/dist/components/table/snice-cell-duration.js.map +1 -1
- package/dist/components/table/snice-cell-email.d.ts +15 -0
- package/dist/components/table/snice-cell-email.js +125 -0
- package/dist/components/table/snice-cell-email.js.map +1 -0
- package/dist/components/table/snice-cell-filesize.d.ts +2 -2
- package/dist/components/table/snice-cell-filesize.js +12 -6
- package/dist/components/table/snice-cell-filesize.js.map +1 -1
- package/dist/components/table/snice-cell-image.d.ts +20 -0
- package/dist/components/table/snice-cell-image.js +162 -0
- package/dist/components/table/snice-cell-image.js.map +1 -0
- package/dist/components/table/snice-cell-json.d.ts +20 -0
- package/dist/components/table/snice-cell-json.js +186 -0
- package/dist/components/table/snice-cell-json.js.map +1 -0
- package/dist/components/table/snice-cell-link.d.ts +17 -0
- package/dist/components/table/snice-cell-link.js +142 -0
- package/dist/components/table/snice-cell-link.js.map +1 -0
- package/dist/components/table/snice-cell-location.d.ts +19 -0
- package/dist/components/table/snice-cell-location.js +185 -0
- package/dist/components/table/snice-cell-location.js.map +1 -0
- package/dist/components/table/snice-cell-number.d.ts +2 -2
- package/dist/components/table/snice-cell-number.js +12 -6
- package/dist/components/table/snice-cell-number.js.map +1 -1
- package/dist/components/table/snice-cell-percentage.d.ts +22 -0
- package/dist/components/table/snice-cell-percentage.js +208 -0
- package/dist/components/table/snice-cell-percentage.js.map +1 -0
- package/dist/components/table/snice-cell-phone.d.ts +18 -0
- package/dist/components/table/snice-cell-phone.js +153 -0
- package/dist/components/table/snice-cell-phone.js.map +1 -0
- package/dist/components/table/snice-cell-progress.d.ts +2 -2
- package/dist/components/table/snice-cell-progress.js +12 -6
- package/dist/components/table/snice-cell-progress.js.map +1 -1
- package/dist/components/table/snice-cell-rating.d.ts +2 -2
- package/dist/components/table/snice-cell-rating.js +12 -6
- package/dist/components/table/snice-cell-rating.js.map +1 -1
- package/dist/components/table/snice-cell-sparkline.d.ts +2 -2
- package/dist/components/table/snice-cell-sparkline.js +13 -7
- package/dist/components/table/snice-cell-sparkline.js.map +1 -1
- package/dist/components/table/snice-cell-status.d.ts +17 -0
- package/dist/components/table/snice-cell-status.js +144 -0
- package/dist/components/table/snice-cell-status.js.map +1 -0
- package/dist/components/table/snice-cell-tag.d.ts +16 -0
- package/dist/components/table/snice-cell-tag.js +131 -0
- package/dist/components/table/snice-cell-tag.js.map +1 -0
- package/dist/components/table/snice-cell-text.d.ts +2 -2
- package/dist/components/table/snice-cell-text.js +14 -8
- package/dist/components/table/snice-cell-text.js.map +1 -1
- package/dist/components/table/snice-cell.d.ts +2 -2
- package/dist/components/table/snice-cell.js +12 -6
- package/dist/components/table/snice-cell.js.map +1 -1
- package/dist/components/table/snice-column.d.ts +1 -1
- package/dist/components/table/snice-column.js +6 -3
- package/dist/components/table/snice-column.js.map +1 -1
- package/dist/components/table/snice-header.d.ts +5 -5
- package/dist/components/table/snice-header.js +60 -50
- package/dist/components/table/snice-header.js.map +1 -1
- package/dist/components/table/snice-progress.d.ts +2 -2
- package/dist/components/table/snice-progress.js +18 -11
- package/dist/components/table/snice-progress.js.map +1 -1
- package/dist/components/table/snice-rating.d.ts +2 -2
- package/dist/components/table/snice-rating.js +15 -8
- package/dist/components/table/snice-rating.js.map +1 -1
- package/dist/components/table/snice-row.d.ts +17 -6
- package/dist/components/table/snice-row.js +95 -44
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.d.ts +18 -10
- package/dist/components/table/snice-table.js +355 -173
- package/dist/components/table/snice-table.js.map +1 -1
- package/dist/components/table/snice-table.types.d.ts +101 -2
- package/dist/components/tabs/snice-tab-panel.d.ts +2 -2
- package/dist/components/tabs/snice-tab-panel.js +12 -6
- package/dist/components/tabs/snice-tab-panel.js.map +1 -1
- package/dist/components/tabs/snice-tab.d.ts +6 -5
- package/dist/components/tabs/snice-tab.js +36 -19
- package/dist/components/tabs/snice-tab.js.map +1 -1
- package/dist/components/tabs/snice-tabs.d.ts +5 -5
- package/dist/components/tabs/snice-tabs.js +38 -28
- package/dist/components/tabs/snice-tabs.js.map +1 -1
- package/dist/components/toast/snice-toast-container.d.ts +7 -7
- package/dist/components/toast/snice-toast-container.js +19 -12
- package/dist/components/toast/snice-toast-container.js.map +1 -1
- package/dist/components/toast/snice-toast.d.ts +3 -15
- package/dist/components/toast/snice-toast.js +49 -108
- package/dist/components/toast/snice-toast.js.map +1 -1
- package/dist/components/tooltip/snice-tooltip.d.ts +2 -2
- package/dist/components/tooltip/snice-tooltip.js +14 -7
- package/dist/components/tooltip/snice-tooltip.js.map +1 -1
- package/dist/context.d.ts +44 -0
- package/dist/element-ready.d.ts +40 -0
- package/dist/{types/element.d.ts → element.d.ts} +2 -8
- package/dist/{types/events.d.ts → events.d.ts} +0 -4
- package/dist/index.cjs +2589 -605
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +21 -0
- package/dist/index.esm.js +2568 -604
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +2589 -605
- package/dist/index.iife.js.map +1 -1
- package/dist/method-decorators.d.ts +121 -0
- package/dist/on.d.ts +59 -0
- package/dist/parts.d.ts +159 -0
- package/dist/render-debug.d.ts +27 -0
- package/dist/render-tracker.d.ts +14 -0
- package/dist/render.d.ts +96 -0
- package/dist/symbols.cjs +163 -0
- package/dist/symbols.cjs.map +1 -1
- package/dist/{types/symbols.d.ts → symbols.d.ts} +22 -0
- package/dist/symbols.esm.js +27 -3
- package/dist/symbols.esm.js.map +1 -1
- package/dist/template.d.ts +100 -0
- package/dist/transitions.cjs +219 -0
- package/dist/transitions.esm.js +2 -2
- package/dist/types/context.d.ts +48 -0
- package/dist/types/element-options.d.ts +26 -0
- package/dist/types/index.d.ts +25 -9
- package/dist/types/nav-context.d.ts +19 -0
- package/dist/types/{types/on-options.d.ts → on-options.d.ts} +2 -0
- package/dist/types/{types/placard.d.ts → placard.d.ts} +0 -1
- package/docs/ai/README.md +17 -0
- package/docs/ai/api.md +175 -0
- package/docs/ai/architecture.md +160 -0
- package/docs/ai/components/accordion.md +174 -0
- package/docs/ai/components/alert.md +77 -0
- package/docs/ai/components/avatar.md +61 -0
- package/docs/ai/components/badge.md +69 -0
- package/docs/ai/components/breadcrumbs.md +74 -0
- package/docs/ai/components/button.md +75 -0
- package/docs/ai/components/card.md +61 -0
- package/docs/ai/components/checkbox.md +74 -0
- package/docs/ai/components/chip.md +73 -0
- package/docs/ai/components/date-picker.md +75 -0
- package/docs/ai/components/divider.md +66 -0
- package/docs/ai/components/drawer.md +80 -0
- package/docs/ai/components/input.md +111 -0
- package/docs/ai/components/login.md +109 -0
- package/docs/ai/components/modal.md +67 -0
- package/docs/ai/components/nav.md +76 -0
- package/docs/ai/components/pagination.md +55 -0
- package/docs/ai/components/progress.md +72 -0
- package/docs/ai/components/radio.md +79 -0
- package/docs/ai/components/select.md +92 -0
- package/docs/ai/components/skeleton.md +57 -0
- package/docs/ai/components/switch.md +53 -0
- package/docs/ai/components/table.md +227 -0
- package/docs/ai/components/tabs.md +83 -0
- package/docs/ai/components/toast.md +140 -0
- package/docs/ai/components/tooltip.md +146 -0
- package/docs/ai/patterns.md +244 -0
- package/docs/components/accordion.md +558 -0
- package/docs/components/drawer.md +602 -0
- package/docs/components/modal.md +558 -0
- package/docs/components/nav.md +239 -0
- package/docs/components/pagination.md +289 -0
- package/docs/components/select.md +599 -0
- package/docs/components/switch.md +354 -0
- package/docs/components/tabs.md +546 -0
- package/docs/components/toast.md +506 -0
- package/docs/components/tooltip.md +523 -0
- package/docs/controllers.md +744 -0
- package/docs/elements.md +855 -0
- package/docs/events.md +807 -0
- package/docs/migration-v2-to-v3.md +569 -0
- package/docs/observe.md +588 -0
- package/docs/placards.md +401 -0
- package/docs/request-response.md +852 -0
- package/docs/routing.md +1186 -0
- package/package.json +10 -11
- package/dist/components/snice-cell-C9N6yGxQ.js +0 -4
- package/dist/components/snice-cell-C9N6yGxQ.js.map +0 -1
- package/dist/types/types/index.d.ts +0 -23
- /package/dist/{types/controller.d.ts → controller.d.ts} +0 -0
- /package/dist/{types/global.d.ts → global.d.ts} +0 -0
- /package/dist/{types/observe.d.ts → observe.d.ts} +0 -0
- /package/dist/{types/request-response.d.ts → request-response.d.ts} +0 -0
- /package/dist/{types/router.d.ts → router.d.ts} +0 -0
- /package/dist/{types/testing.d.ts → testing.d.ts} +0 -0
- /package/dist/{types/transitions.d.ts → transitions.d.ts} +0 -0
- /package/dist/types/{types/adopted-options.d.ts → adopted-options.d.ts} +0 -0
- /package/dist/types/{types/app-context.d.ts → app-context.d.ts} +0 -0
- /package/dist/types/{types/dispatch-options.d.ts → dispatch-options.d.ts} +0 -0
- /package/dist/types/{types/guard.d.ts → guard.d.ts} +0 -0
- /package/dist/types/{types/i-controller.d.ts → i-controller.d.ts} +0 -0
- /package/dist/types/{types/moved-options.d.ts → moved-options.d.ts} +0 -0
- /package/dist/types/{types/observe-options.d.ts → observe-options.d.ts} +0 -0
- /package/dist/types/{types/page-options.d.ts → page-options.d.ts} +0 -0
- /package/dist/types/{types/part-options.d.ts → part-options.d.ts} +0 -0
- /package/dist/types/{types/property-converter.d.ts → property-converter.d.ts} +0 -0
- /package/dist/types/{types/property-options.d.ts → property-options.d.ts} +0 -0
- /package/dist/types/{types/query-options.d.ts → query-options.d.ts} +0 -0
- /package/dist/types/{types/request-options.d.ts → request-options.d.ts} +0 -0
- /package/dist/types/{types/respond-options.d.ts → respond-options.d.ts} +0 -0
- /package/dist/types/{types/route-params.d.ts → route-params.d.ts} +0 -0
- /package/dist/types/{types/router-instance.d.ts → router-instance.d.ts} +0 -0
- /package/dist/types/{types/router-options.d.ts → router-options.d.ts} +0 -0
- /package/dist/types/{types/simple-array.d.ts → simple-array.d.ts} +0 -0
- /package/dist/types/{types/snice-element.d.ts → snice-element.d.ts} +0 -0
- /package/dist/types/{types/snice-global.d.ts → snice-global.d.ts} +0 -0
- /package/dist/types/{types/transition.d.ts → transition.d.ts} +0 -0
- /package/dist/{types/utils.d.ts → utils.d.ts} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __runInitializers, __esDecorate } from 'tslib';
|
|
2
|
-
import { element, property, query, queryAll, ready, dispose,
|
|
2
|
+
import { element, property, query, queryAll, render, styles, ready, dispose, watch, dispatch, html, css } from 'snice';
|
|
3
3
|
import './snice-option.js';
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var cssContent = ":host {\n display: inline-block;\n font-family: var(--snice-font-family);\n position: relative;\n width: 100%;\n max-width: 18.75rem; /* 300px */\n}\n\n[hidden] {\n display: none !important;\n}\n\n/* Hide empty image tags */\nimg[src=\"\"] {\n display: none;\n}\n\n.select-wrapper {\n position: relative;\n width: 100%;\n}\n\n/* Label */\n.select-label {\n display: block;\n margin-bottom: 0.25rem; /* 4px */\n color: var(--snice-color-text);\n font-weight: 500;\n}\n\n.select-label--small {\n font-size: var(--snice-font-size-sm);\n}\n\n.select-label--medium {\n font-size: var(--snice-font-size-md);\n}\n\n.select-label--large {\n font-size: var(--snice-font-size-lg);\n}\n\n.select-label--required::after {\n content: ' *';\n color: var(--snice-color-danger);\n}\n\n/* Select trigger button */\n.select-trigger {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n cursor: pointer;\n transition: all var(--snice-transition-fast) ease;\n position: relative;\n text-align: left;\n font-family: inherit;\n color: var(--snice-color-text);\n}\n\n.select-trigger--small {\n padding: 0.375rem 2rem 0.375rem 0.625rem; /* 6px 32px 6px 10px */\n font-size: var(--snice-font-size-sm);\n min-height: 2rem; /* 32px */\n}\n\n.select-trigger--medium {\n padding: 0.5rem 2.25rem 0.5rem 0.75rem; /* 8px 36px 8px 12px */\n font-size: var(--snice-font-size-md);\n min-height: var(--snice-select-min-height, 2.5rem); /* 40px */\n}\n\n.select-trigger--large {\n padding: 0.625rem 2.5rem 0.625rem 0.875rem; /* 10px 40px 10px 14px */\n font-size: var(--snice-font-size-lg);\n min-height: 3rem; /* 48px */\n}\n\n.select-trigger:hover:not(.select-trigger--disabled) {\n border-color: var(--snice-color-border-hover);\n}\n\n.select-trigger:focus-visible {\n outline: 2px solid var(--snice-color-primary);\n outline-offset: 2px;\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--open {\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--disabled {\n background: var(--snice-color-background-secondary);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.select-trigger--readonly {\n background: var(--snice-color-background-secondary);\n cursor: default;\n}\n\n.select-trigger--invalid {\n border-color: var(--snice-color-danger);\n}\n\n/* Placeholder */\n.select-placeholder {\n color: var(--snice-color-text-secondary);\n}\n\n/* Selected value display */\n.select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.select-value--single {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* 8px */\n}\n\n.select-value-icon {\n width: 1rem; /* 16px */\n height: 1rem; /* 16px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-value--multiple {\n display: flex;\n gap: 0.25rem; /* 4px */\n flex-wrap: wrap;\n}\n\n.select-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n padding: 0.125rem 0.375rem; /* 2px 6px */\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-xs);\n}\n\n.select-tag-icon {\n width: 0.75rem; /* 12px */\n height: 0.75rem; /* 12px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-tag-remove {\n cursor: pointer;\n padding: 0;\n background: none;\n border: none;\n color: inherit;\n font-size: 0.75rem; /* 12px */\n line-height: 1;\n}\n\n.select-tag-remove:hover {\n opacity: 0.7;\n}\n\n/* Icons */\n.select-icons {\n position: absolute;\n right: 0.5rem; /* 8px */\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n pointer-events: none;\n z-index: 1;\n}\n\n.select-clear {\n padding: 2px;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--snice-color-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--snice-border-radius-sm);\n pointer-events: auto;\n}\n\n.select-clear:hover {\n background: var(--snice-color-background-secondary);\n color: var(--snice-color-text);\n}\n\n.select-arrow {\n transition: transform var(--snice-transition-fast) ease;\n color: var(--snice-color-text-secondary);\n pointer-events: none;\n}\n\n.select-arrow--open {\n transform: rotate(180deg);\n}\n\n/* Dropdown */\n.select-dropdown {\n position: absolute;\n top: 100%;\n margin-top: 4px;\n left: 0;\n right: 0;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n box-shadow: var(--snice-shadow-lg);\n z-index: 1000;\n opacity: 0;\n transform: translateY(-8px) scaleY(0.95);\n transform-origin: top;\n pointer-events: none;\n transition: opacity var(--snice-transition-fast) ease,\n transform var(--snice-transition-fast) ease;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.select-dropdown--open {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n pointer-events: auto;\n}\n\n/* Search input */\n.select-search {\n padding: 8px;\n border-bottom: 1px solid var(--snice-color-border);\n flex-shrink: 0;\n}\n\n.select-search-input {\n width: 100%;\n padding: 6px 10px;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-sm);\n font-family: inherit;\n color: var(--snice-color-text);\n box-sizing: border-box;\n}\n\n.select-search-input:focus {\n outline: none;\n border-color: var(--snice-color-primary);\n}\n\n/* Options list */\n.select-options {\n max-height: 200px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px;\n scrollbar-gutter: stable;\n}\n\n/* Custom scrollbar styling for better appearance */\n.select-options::-webkit-scrollbar {\n width: 8px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 4px;\n margin: 4px 0;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 4px;\n border: 2px solid var(--snice-color-background);\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}\n\n/* Firefox scrollbar styling */\n.select-options {\n scrollbar-width: thin;\n scrollbar-color: var(--snice-color-border) var(--snice-color-background-secondary);\n}\n\n.select-option {\n padding: 8px 12px;\n cursor: pointer;\n border-radius: var(--snice-border-radius-sm);\n transition: background var(--snice-transition-fast) ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.select-option:hover:not(.select-option--disabled) {\n background: var(--snice-color-background-secondary);\n}\n\n.select-option--selected {\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n font-weight: 500;\n}\n\n.select-option--focused {\n background: var(--snice-color-background-secondary);\n outline: 2px solid var(--snice-color-primary);\n outline-offset: -2px;\n}\n\n.select-option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Option icon */\n.select-option-icon {\n width: 16px;\n height: 16px;\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-option-check {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.select-option-label {\n flex: 1;\n}\n\n/* No options message */\n.select-no-options {\n padding: 16px;\n text-align: center;\n color: var(--snice-color-text-secondary);\n font-size: var(--snice-font-size-sm);\n}\n\n/* Native select (hidden) */\n.select-native {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n width: 0;\n height: 0;\n}\n\n/* Scrollbar styling */\n.select-options::-webkit-scrollbar {\n width: 6px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}";
|
|
6
6
|
|
|
7
7
|
let SniceSelect = (() => {
|
|
8
8
|
let _classDecorators = [element('snice-select')];
|
|
@@ -86,30 +86,14 @@ let SniceSelect = (() => {
|
|
|
86
86
|
let _optionElements_decorators;
|
|
87
87
|
let _optionElements_initializers = [];
|
|
88
88
|
let _optionElements_extraInitializers = [];
|
|
89
|
+
let _renderContent_decorators;
|
|
90
|
+
let _componentStyles_decorators;
|
|
89
91
|
let _init_decorators;
|
|
90
92
|
let _cleanup_decorators;
|
|
91
|
-
let _handleTriggerOpen_decorators;
|
|
92
|
-
let _handleSearchEscape_decorators;
|
|
93
|
-
let _handleSearchArrowDown_decorators;
|
|
94
|
-
let _handleSearchArrowUp_decorators;
|
|
95
|
-
let _handleSearchEnter_decorators;
|
|
96
|
-
let _handleTriggerClick_decorators;
|
|
97
|
-
let _handleClearClick_decorators;
|
|
98
|
-
let _handleTagRemove_decorators;
|
|
99
|
-
let _handleOptionsClick_decorators;
|
|
100
|
-
let _handleSearchInput_decorators;
|
|
101
93
|
let _handleValueChange_decorators;
|
|
102
94
|
let _handleDisabledChange_decorators;
|
|
103
|
-
let _handleReadonlyChange_decorators;
|
|
104
|
-
let _handleInvalidChange_decorators;
|
|
105
95
|
let _handleOpenChange_decorators;
|
|
106
|
-
let
|
|
107
|
-
let _handlePlaceholderChange_decorators;
|
|
108
|
-
let _handleRequiredChange_decorators;
|
|
109
|
-
let _handleMultipleChange_decorators;
|
|
110
|
-
let _handleNameChange_decorators;
|
|
111
|
-
let _handleClearableChange_decorators;
|
|
112
|
-
let _handleSearchableChange_decorators;
|
|
96
|
+
let _handleNativeSelectAttributeChange_decorators;
|
|
113
97
|
let _dispatchChangeEvent_decorators;
|
|
114
98
|
let _dispatchOpenEvent_decorators;
|
|
115
99
|
let _dispatchCloseEvent_decorators;
|
|
@@ -175,57 +159,25 @@ let SniceSelect = (() => {
|
|
|
175
159
|
_arrow_decorators = [query('.select-arrow')];
|
|
176
160
|
_searchContainer_decorators = [query('.select-search')];
|
|
177
161
|
_optionElements_decorators = [queryAll('.select-option')];
|
|
162
|
+
_renderContent_decorators = [render()];
|
|
163
|
+
_componentStyles_decorators = [styles()];
|
|
178
164
|
_init_decorators = [ready()];
|
|
179
165
|
_cleanup_decorators = [dispose()];
|
|
180
|
-
_handleTriggerOpen_decorators = [on(['keydown:Enter', 'keydown:Space', 'keydown:ArrowDown', 'keydown:ArrowUp'], '.select-trigger')];
|
|
181
|
-
_handleSearchEscape_decorators = [on('keydown:Escape', '.select-search-input')];
|
|
182
|
-
_handleSearchArrowDown_decorators = [on('keydown:ArrowDown', '.select-search-input')];
|
|
183
|
-
_handleSearchArrowUp_decorators = [on('keydown:ArrowUp', '.select-search-input')];
|
|
184
|
-
_handleSearchEnter_decorators = [on('keydown:Enter', '.select-search-input')];
|
|
185
|
-
_handleTriggerClick_decorators = [on('click', '.select-trigger')];
|
|
186
|
-
_handleClearClick_decorators = [on('click', '.select-clear', { preventDefault: true, stopPropagation: true })];
|
|
187
|
-
_handleTagRemove_decorators = [on('click', '.select-tag-remove')];
|
|
188
|
-
_handleOptionsClick_decorators = [on('click', '.select-options')];
|
|
189
|
-
_handleSearchInput_decorators = [on('input', '.select-search-input')];
|
|
190
166
|
_handleValueChange_decorators = [watch('value')];
|
|
191
167
|
_handleDisabledChange_decorators = [watch('disabled')];
|
|
192
|
-
_handleReadonlyChange_decorators = [watch('readonly')];
|
|
193
|
-
_handleInvalidChange_decorators = [watch('invalid')];
|
|
194
168
|
_handleOpenChange_decorators = [watch('open')];
|
|
195
|
-
|
|
196
|
-
_handlePlaceholderChange_decorators = [watch('placeholder')];
|
|
197
|
-
_handleRequiredChange_decorators = [watch('required')];
|
|
198
|
-
_handleMultipleChange_decorators = [watch('multiple')];
|
|
199
|
-
_handleNameChange_decorators = [watch('name')];
|
|
200
|
-
_handleClearableChange_decorators = [watch('clearable')];
|
|
201
|
-
_handleSearchableChange_decorators = [watch('searchable')];
|
|
169
|
+
_handleNativeSelectAttributeChange_decorators = [watch('multiple', 'name')];
|
|
202
170
|
_dispatchChangeEvent_decorators = [dispatch('@snice/select-change', { bubbles: true, composed: true })];
|
|
203
171
|
_dispatchOpenEvent_decorators = [dispatch('@snice/select-open', { bubbles: true, composed: true })];
|
|
204
172
|
_dispatchCloseEvent_decorators = [dispatch('@snice/select-close', { bubbles: true, composed: true })];
|
|
173
|
+
__esDecorate(this, null, _renderContent_decorators, { kind: "method", name: "renderContent", static: false, private: false, access: { has: obj => "renderContent" in obj, get: obj => obj.renderContent }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
174
|
+
__esDecorate(this, null, _componentStyles_decorators, { kind: "method", name: "componentStyles", static: false, private: false, access: { has: obj => "componentStyles" in obj, get: obj => obj.componentStyles }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
205
175
|
__esDecorate(this, null, _init_decorators, { kind: "method", name: "init", static: false, private: false, access: { has: obj => "init" in obj, get: obj => obj.init }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
206
176
|
__esDecorate(this, null, _cleanup_decorators, { kind: "method", name: "cleanup", static: false, private: false, access: { has: obj => "cleanup" in obj, get: obj => obj.cleanup }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
207
|
-
__esDecorate(this, null, _handleTriggerOpen_decorators, { kind: "method", name: "handleTriggerOpen", static: false, private: false, access: { has: obj => "handleTriggerOpen" in obj, get: obj => obj.handleTriggerOpen }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
208
|
-
__esDecorate(this, null, _handleSearchEscape_decorators, { kind: "method", name: "handleSearchEscape", static: false, private: false, access: { has: obj => "handleSearchEscape" in obj, get: obj => obj.handleSearchEscape }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
209
|
-
__esDecorate(this, null, _handleSearchArrowDown_decorators, { kind: "method", name: "handleSearchArrowDown", static: false, private: false, access: { has: obj => "handleSearchArrowDown" in obj, get: obj => obj.handleSearchArrowDown }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
210
|
-
__esDecorate(this, null, _handleSearchArrowUp_decorators, { kind: "method", name: "handleSearchArrowUp", static: false, private: false, access: { has: obj => "handleSearchArrowUp" in obj, get: obj => obj.handleSearchArrowUp }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
211
|
-
__esDecorate(this, null, _handleSearchEnter_decorators, { kind: "method", name: "handleSearchEnter", static: false, private: false, access: { has: obj => "handleSearchEnter" in obj, get: obj => obj.handleSearchEnter }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
212
|
-
__esDecorate(this, null, _handleTriggerClick_decorators, { kind: "method", name: "handleTriggerClick", static: false, private: false, access: { has: obj => "handleTriggerClick" in obj, get: obj => obj.handleTriggerClick }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
213
|
-
__esDecorate(this, null, _handleClearClick_decorators, { kind: "method", name: "handleClearClick", static: false, private: false, access: { has: obj => "handleClearClick" in obj, get: obj => obj.handleClearClick }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
214
|
-
__esDecorate(this, null, _handleTagRemove_decorators, { kind: "method", name: "handleTagRemove", static: false, private: false, access: { has: obj => "handleTagRemove" in obj, get: obj => obj.handleTagRemove }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
215
|
-
__esDecorate(this, null, _handleOptionsClick_decorators, { kind: "method", name: "handleOptionsClick", static: false, private: false, access: { has: obj => "handleOptionsClick" in obj, get: obj => obj.handleOptionsClick }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
216
|
-
__esDecorate(this, null, _handleSearchInput_decorators, { kind: "method", name: "handleSearchInput", static: false, private: false, access: { has: obj => "handleSearchInput" in obj, get: obj => obj.handleSearchInput }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
217
177
|
__esDecorate(this, null, _handleValueChange_decorators, { kind: "method", name: "handleValueChange", static: false, private: false, access: { has: obj => "handleValueChange" in obj, get: obj => obj.handleValueChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
218
178
|
__esDecorate(this, null, _handleDisabledChange_decorators, { kind: "method", name: "handleDisabledChange", static: false, private: false, access: { has: obj => "handleDisabledChange" in obj, get: obj => obj.handleDisabledChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
219
|
-
__esDecorate(this, null, _handleReadonlyChange_decorators, { kind: "method", name: "handleReadonlyChange", static: false, private: false, access: { has: obj => "handleReadonlyChange" in obj, get: obj => obj.handleReadonlyChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
220
|
-
__esDecorate(this, null, _handleInvalidChange_decorators, { kind: "method", name: "handleInvalidChange", static: false, private: false, access: { has: obj => "handleInvalidChange" in obj, get: obj => obj.handleInvalidChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
221
179
|
__esDecorate(this, null, _handleOpenChange_decorators, { kind: "method", name: "handleOpenChange", static: false, private: false, access: { has: obj => "handleOpenChange" in obj, get: obj => obj.handleOpenChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
222
|
-
__esDecorate(this, null,
|
|
223
|
-
__esDecorate(this, null, _handlePlaceholderChange_decorators, { kind: "method", name: "handlePlaceholderChange", static: false, private: false, access: { has: obj => "handlePlaceholderChange" in obj, get: obj => obj.handlePlaceholderChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
224
|
-
__esDecorate(this, null, _handleRequiredChange_decorators, { kind: "method", name: "handleRequiredChange", static: false, private: false, access: { has: obj => "handleRequiredChange" in obj, get: obj => obj.handleRequiredChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
225
|
-
__esDecorate(this, null, _handleMultipleChange_decorators, { kind: "method", name: "handleMultipleChange", static: false, private: false, access: { has: obj => "handleMultipleChange" in obj, get: obj => obj.handleMultipleChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
226
|
-
__esDecorate(this, null, _handleNameChange_decorators, { kind: "method", name: "handleNameChange", static: false, private: false, access: { has: obj => "handleNameChange" in obj, get: obj => obj.handleNameChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
227
|
-
__esDecorate(this, null, _handleClearableChange_decorators, { kind: "method", name: "handleClearableChange", static: false, private: false, access: { has: obj => "handleClearableChange" in obj, get: obj => obj.handleClearableChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
228
|
-
__esDecorate(this, null, _handleSearchableChange_decorators, { kind: "method", name: "handleSearchableChange", static: false, private: false, access: { has: obj => "handleSearchableChange" in obj, get: obj => obj.handleSearchableChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
180
|
+
__esDecorate(this, null, _handleNativeSelectAttributeChange_decorators, { kind: "method", name: "handleNativeSelectAttributeChange", static: false, private: false, access: { has: obj => "handleNativeSelectAttributeChange" in obj, get: obj => obj.handleNativeSelectAttributeChange }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
229
181
|
__esDecorate(this, null, _dispatchChangeEvent_decorators, { kind: "method", name: "dispatchChangeEvent", static: false, private: false, access: { has: obj => "dispatchChangeEvent" in obj, get: obj => obj.dispatchChangeEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
230
182
|
__esDecorate(this, null, _dispatchOpenEvent_decorators, { kind: "method", name: "dispatchOpenEvent", static: false, private: false, access: { has: obj => "dispatchOpenEvent" in obj, get: obj => obj.dispatchOpenEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
231
183
|
__esDecorate(this, null, _dispatchCloseEvent_decorators, { kind: "method", name: "dispatchCloseEvent", static: false, private: false, access: { has: obj => "dispatchCloseEvent" in obj, get: obj => obj.dispatchCloseEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
@@ -259,28 +211,32 @@ let SniceSelect = (() => {
|
|
|
259
211
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
260
212
|
__runInitializers(_classThis, _classExtraInitializers);
|
|
261
213
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
214
|
+
renderContent() {
|
|
215
|
+
const labelClasses = `select-label select-label--${this.size} ${this.required ? 'select-label--required' : ''}`;
|
|
216
|
+
const triggerClasses = `select-trigger select-trigger--${this.size}`;
|
|
217
|
+
const searchHidden = !this.searchable;
|
|
218
|
+
return html `
|
|
265
219
|
<div class="select-wrapper">
|
|
266
|
-
<label class="
|
|
220
|
+
<label class="${labelClasses}" part="label" ?hidden="${!this.label}">
|
|
267
221
|
${this.label}
|
|
268
222
|
</label>
|
|
269
|
-
|
|
223
|
+
|
|
270
224
|
<button
|
|
271
225
|
type="button"
|
|
272
|
-
class="
|
|
226
|
+
class="${triggerClasses}"
|
|
273
227
|
aria-haspopup="listbox"
|
|
274
228
|
aria-expanded="false"
|
|
275
229
|
aria-label="${this.label || 'Select'}"
|
|
276
|
-
part="trigger"
|
|
277
|
-
|
|
230
|
+
part="trigger"
|
|
231
|
+
@keydown="${(e) => this.handleTriggerOpen(e)}"
|
|
232
|
+
@click="${(e) => this.handleTriggerClick(e)}">
|
|
233
|
+
|
|
278
234
|
<div class="select-value" part="value">
|
|
279
235
|
<span class="select-placeholder">${this.placeholder}</span>
|
|
280
236
|
</div>
|
|
281
|
-
|
|
237
|
+
|
|
282
238
|
<span class="select-icons">
|
|
283
|
-
<span class="select-clear" aria-label="Clear selection" style="display: none;">
|
|
239
|
+
<span class="select-clear" aria-label="Clear selection" style="display: none;" @click="${(e) => this.handleClearClick(e)}">
|
|
284
240
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
|
|
285
241
|
<path d="M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z"/>
|
|
286
242
|
</svg>
|
|
@@ -292,26 +248,29 @@ let SniceSelect = (() => {
|
|
|
292
248
|
</span>
|
|
293
249
|
</span>
|
|
294
250
|
</button>
|
|
295
|
-
|
|
296
|
-
<div class="select-dropdown"
|
|
297
|
-
role="listbox"
|
|
251
|
+
|
|
252
|
+
<div class="select-dropdown"
|
|
253
|
+
role="listbox"
|
|
298
254
|
aria-label="${this.label || 'Options'}"
|
|
299
|
-
part="dropdown"
|
|
300
|
-
|
|
301
|
-
|
|
255
|
+
part="dropdown"
|
|
256
|
+
@click="${(e) => this.handleOptionsClick(e)}">
|
|
257
|
+
|
|
258
|
+
<div class="select-search" part="search" ?hidden="${searchHidden}">
|
|
302
259
|
<input
|
|
303
260
|
type="text"
|
|
304
261
|
class="select-search-input"
|
|
305
262
|
placeholder="Search..."
|
|
306
263
|
aria-label="Search options"
|
|
307
|
-
part="search-input"
|
|
264
|
+
part="search-input"
|
|
265
|
+
@keydown="${(e) => this.handleSearchKeydown(e)}"
|
|
266
|
+
@input="${(e) => this.handleSearchInput(e)}" />
|
|
308
267
|
</div>
|
|
309
|
-
|
|
268
|
+
|
|
310
269
|
<div class="select-options" part="options">
|
|
311
270
|
<!-- Options will be rendered in @ready() -->
|
|
312
271
|
</div>
|
|
313
272
|
</div>
|
|
314
|
-
|
|
273
|
+
|
|
315
274
|
<!-- Hidden native select for form submission -->
|
|
316
275
|
<select
|
|
317
276
|
class="select-native"
|
|
@@ -357,8 +316,8 @@ let SniceSelect = (() => {
|
|
|
357
316
|
`;
|
|
358
317
|
}).join('');
|
|
359
318
|
}
|
|
360
|
-
|
|
361
|
-
return css
|
|
319
|
+
componentStyles() {
|
|
320
|
+
return css `${cssContent}`;
|
|
362
321
|
}
|
|
363
322
|
init() {
|
|
364
323
|
// Read options from child snice-option elements
|
|
@@ -487,31 +446,37 @@ let SniceSelect = (() => {
|
|
|
487
446
|
});
|
|
488
447
|
}
|
|
489
448
|
handleTriggerOpen(e) {
|
|
490
|
-
e.
|
|
491
|
-
|
|
492
|
-
this.
|
|
449
|
+
if (['Enter', ' ', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
|
|
450
|
+
e.preventDefault();
|
|
451
|
+
if (!this.open) {
|
|
452
|
+
this.openDropdown();
|
|
453
|
+
}
|
|
493
454
|
}
|
|
494
455
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
456
|
+
handleSearchKeydown(e) {
|
|
457
|
+
switch (e.key) {
|
|
458
|
+
case 'Escape':
|
|
459
|
+
this.closeDropdown();
|
|
460
|
+
this.trigger?.focus();
|
|
461
|
+
break;
|
|
462
|
+
case 'ArrowDown':
|
|
463
|
+
e.preventDefault();
|
|
464
|
+
this.focusNextOption();
|
|
465
|
+
break;
|
|
466
|
+
case 'ArrowUp':
|
|
467
|
+
e.preventDefault();
|
|
468
|
+
this.focusPreviousOption();
|
|
469
|
+
break;
|
|
470
|
+
case 'Enter':
|
|
471
|
+
e.preventDefault();
|
|
472
|
+
if (this.focusedIndex >= 0) {
|
|
473
|
+
const options = this.searchable ? this.filteredOptions : this.options;
|
|
474
|
+
const option = options[this.focusedIndex];
|
|
475
|
+
if (option && !option.disabled) {
|
|
476
|
+
this.handleOptionSelect(option);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
break;
|
|
515
480
|
}
|
|
516
481
|
}
|
|
517
482
|
focusNextOption() {
|
|
@@ -555,39 +520,43 @@ let SniceSelect = (() => {
|
|
|
555
520
|
});
|
|
556
521
|
}
|
|
557
522
|
}
|
|
558
|
-
|
|
523
|
+
handleClearClick(e) {
|
|
524
|
+
e.preventDefault();
|
|
559
525
|
e.stopPropagation();
|
|
560
|
-
|
|
526
|
+
this.clear();
|
|
527
|
+
}
|
|
528
|
+
handleTriggerClick(e) {
|
|
561
529
|
const target = e.target;
|
|
562
|
-
|
|
530
|
+
// Don't toggle if clicking on the clear button
|
|
531
|
+
if (target.closest('.select-clear')) {
|
|
563
532
|
return;
|
|
564
533
|
}
|
|
534
|
+
e.stopPropagation();
|
|
565
535
|
if (!this.disabled && !this.readonly) {
|
|
566
536
|
this.toggleDropdown();
|
|
567
537
|
}
|
|
568
538
|
}
|
|
569
|
-
handleClearClick(_e) {
|
|
570
|
-
this.clear();
|
|
571
|
-
}
|
|
572
|
-
handleTagRemove(e) {
|
|
573
|
-
e.stopPropagation();
|
|
574
|
-
const target = e.target;
|
|
575
|
-
const value = target.getAttribute('data-value');
|
|
576
|
-
if (value && this.multiple) {
|
|
577
|
-
this.selectedValues.delete(value);
|
|
578
|
-
this.value = Array.from(this.selectedValues).join(',');
|
|
579
|
-
this.updateNativeSelect();
|
|
580
|
-
this.updateValueDisplay();
|
|
581
|
-
this.updateClearButton();
|
|
582
|
-
this.dispatchChangeEvent();
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
539
|
handleOptionsClick(e) {
|
|
586
|
-
e.stopPropagation();
|
|
587
540
|
const target = e.target;
|
|
541
|
+
// Handle tag remove click
|
|
542
|
+
if (target.closest('.select-tag-remove')) {
|
|
543
|
+
e.stopPropagation();
|
|
544
|
+
const removeBtn = target.closest('.select-tag-remove');
|
|
545
|
+
const value = removeBtn.getAttribute('data-value');
|
|
546
|
+
if (value && this.multiple) {
|
|
547
|
+
this.selectedValues.delete(value);
|
|
548
|
+
this.value = Array.from(this.selectedValues).join(',');
|
|
549
|
+
this.updateNativeSelect();
|
|
550
|
+
this.updateValueDisplay();
|
|
551
|
+
this.updateClearButton();
|
|
552
|
+
this.dispatchChangeEvent();
|
|
553
|
+
}
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
588
556
|
const optionEl = target.closest('.select-option');
|
|
589
557
|
if (!optionEl)
|
|
590
558
|
return;
|
|
559
|
+
e.stopPropagation();
|
|
591
560
|
const value = optionEl.getAttribute('data-value');
|
|
592
561
|
if (!value)
|
|
593
562
|
return;
|
|
@@ -597,8 +566,8 @@ let SniceSelect = (() => {
|
|
|
597
566
|
}
|
|
598
567
|
}
|
|
599
568
|
handleSearchInput(e) {
|
|
600
|
-
const
|
|
601
|
-
const searchTerm =
|
|
569
|
+
const input = e.target;
|
|
570
|
+
const searchTerm = input.value.toLowerCase();
|
|
602
571
|
if (searchTerm) {
|
|
603
572
|
this.filteredOptions = this.options.filter(opt => opt.label.toLowerCase().includes(searchTerm));
|
|
604
573
|
}
|
|
@@ -640,24 +609,19 @@ let SniceSelect = (() => {
|
|
|
640
609
|
this.updateTriggerState();
|
|
641
610
|
this.updateNativeSelectAttributes();
|
|
642
611
|
this.updateClearButton();
|
|
612
|
+
// Side effect: close dropdown when disabled
|
|
643
613
|
if (this.disabled && this.open) {
|
|
644
614
|
this.closeDropdown();
|
|
645
615
|
}
|
|
646
616
|
}
|
|
647
|
-
handleReadonlyChange() {
|
|
648
|
-
this.updateTriggerState();
|
|
649
|
-
this.updateClearButton();
|
|
650
|
-
}
|
|
651
|
-
handleInvalidChange() {
|
|
652
|
-
this.updateTriggerState();
|
|
653
|
-
}
|
|
654
|
-
// Remove the @watch('options') since options are now read from children
|
|
655
617
|
handleOpenChange() {
|
|
656
618
|
this.updateDropdownState();
|
|
657
619
|
this.updateTriggerState();
|
|
620
|
+
// Side effect: focus search input when opened
|
|
658
621
|
if (this.open && this.searchable && this.searchInput) {
|
|
659
622
|
setTimeout(() => this.searchInput?.focus(), 100);
|
|
660
623
|
}
|
|
624
|
+
// Side effect: reset search when closed
|
|
661
625
|
if (!this.open) {
|
|
662
626
|
this.focusedIndex = -1;
|
|
663
627
|
if (this.searchInput) {
|
|
@@ -667,45 +631,9 @@ let SniceSelect = (() => {
|
|
|
667
631
|
}
|
|
668
632
|
}
|
|
669
633
|
}
|
|
670
|
-
|
|
671
|
-
if (this.labelElement) {
|
|
672
|
-
this.labelElement.textContent = this.label;
|
|
673
|
-
if (this.label) {
|
|
674
|
-
this.labelElement.removeAttribute('hidden');
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
this.labelElement.setAttribute('hidden', '');
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
handlePlaceholderChange() {
|
|
682
|
-
this.updateValueDisplay();
|
|
683
|
-
}
|
|
684
|
-
handleRequiredChange() {
|
|
685
|
-
if (this.labelElement) {
|
|
686
|
-
this.labelElement.classList.toggle('select-label--required', this.required);
|
|
687
|
-
}
|
|
688
|
-
this.updateNativeSelectAttributes();
|
|
689
|
-
}
|
|
690
|
-
handleMultipleChange() {
|
|
691
|
-
this.updateNativeSelectAttributes();
|
|
692
|
-
}
|
|
693
|
-
handleNameChange() {
|
|
634
|
+
handleNativeSelectAttributeChange() {
|
|
694
635
|
this.updateNativeSelectAttributes();
|
|
695
636
|
}
|
|
696
|
-
handleClearableChange() {
|
|
697
|
-
this.updateClearButton();
|
|
698
|
-
}
|
|
699
|
-
handleSearchableChange() {
|
|
700
|
-
if (this.searchContainer) {
|
|
701
|
-
if (this.searchable) {
|
|
702
|
-
this.searchContainer.removeAttribute('hidden');
|
|
703
|
-
}
|
|
704
|
-
else {
|
|
705
|
-
this.searchContainer.setAttribute('hidden', '');
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
637
|
updateValueDisplay() {
|
|
710
638
|
if (!this.valueDisplay)
|
|
711
639
|
return;
|