@diwacopilot/components 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/diwa-checkbox.cjs.entry.js +1 -3
- package/dist/cjs/diwa-checkbox.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-components.cjs.js +1 -1
- package/dist/cjs/diwa-heading.cjs.entry.js +126 -0
- package/dist/cjs/diwa-heading.cjs.entry.js.map +1 -0
- package/dist/cjs/diwa-icon.cjs.entry.js +1 -1
- package/dist/cjs/diwa-inline-notification.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-date.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-email.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-month.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-number.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-password.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-search.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-tel.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-text.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-time.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-url.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input-week.cjs.entry.js +1 -1
- package/dist/cjs/diwa-input.cjs.entry.js +1 -1
- package/dist/cjs/diwa-link-pure.cjs.entry.js +1 -1
- package/dist/cjs/diwa-link.cjs.entry.js +1 -1
- package/dist/cjs/diwa-modal.cjs.entry.js +1 -1
- package/dist/cjs/diwa-multi-select-option.cjs.entry.js +1 -1
- package/dist/cjs/diwa-multi-select.cjs.entry.js +2 -2
- package/dist/cjs/diwa-pagination.cjs.entry.js +1 -1
- package/dist/cjs/diwa-pin-code.cjs.entry.js +2 -2
- package/dist/cjs/diwa-popover.cjs.entry.js +1 -1
- package/dist/cjs/diwa-radio-group-item.cjs.entry.js +2 -3
- package/dist/cjs/diwa-radio-group-item.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-radio-group.cjs.entry.js +1 -1
- package/dist/cjs/diwa-scroller.cjs.entry.js +23 -13
- package/dist/cjs/diwa-scroller.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-segmented-control-item.cjs.entry.js +1 -1
- package/dist/cjs/diwa-segmented-control.cjs.entry.js +1 -1
- package/dist/cjs/diwa-select-option.cjs.entry.js +24 -10
- package/dist/cjs/diwa-select-option.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-select.cjs.entry.js +15 -1
- package/dist/cjs/diwa-select.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-spinner.cjs.entry.js +1 -1
- package/dist/cjs/diwa-stepper-horizontal-item.cjs.entry.js +1 -1
- package/dist/cjs/diwa-stepper-horizontal.cjs.entry.js +1 -1
- package/dist/cjs/diwa-switch.cjs.entry.js +1 -1
- package/dist/cjs/diwa-table-body.cjs.entry.js +1 -1
- package/dist/cjs/diwa-table-cell.cjs.entry.js +15 -15
- package/dist/cjs/diwa-table-cell.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-table-head-cell.cjs.entry.js +64 -53
- package/dist/cjs/diwa-table-head-cell.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-table-head.cjs.entry.js +16 -11
- package/dist/cjs/diwa-table-head.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-table-row.cjs.entry.js +11 -10
- package/dist/cjs/diwa-table-row.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-table.cjs.entry.js +83 -43
- package/dist/cjs/diwa-table.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-tabs-bar.cjs.entry.js +1 -1
- package/dist/cjs/diwa-tabs-item.cjs.entry.js +1 -1
- package/dist/cjs/diwa-tabs.cjs.entry.js +12 -12
- package/dist/cjs/diwa-tabs.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-tag-dismissible.cjs.entry.js +6 -8
- package/dist/cjs/diwa-tag-dismissible.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-tag.cjs.entry.js +2 -2
- package/dist/cjs/diwa-tag.cjs.entry.js.map +1 -1
- package/dist/cjs/diwa-text-list-item.cjs.entry.js +1 -1
- package/dist/cjs/diwa-text-list.cjs.entry.js +1 -1
- package/dist/cjs/diwa-text.cjs.entry.js +1 -1
- package/dist/cjs/diwa-textarea.cjs.entry.js +1 -1
- package/dist/cjs/diwa-toast-item.cjs.entry.js +1 -1
- package/dist/cjs/diwa-toast.cjs.entry.js +111 -17
- package/dist/cjs/diwa-toast.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/diwa-checkbox/diwa-checkbox-styles.js +1 -3
- package/dist/collection/components/diwa-checkbox/diwa-checkbox-styles.js.map +1 -1
- package/dist/collection/components/diwa-heading/diwa-heading-styles.js +53 -0
- package/dist/collection/components/diwa-heading/diwa-heading-styles.js.map +1 -0
- package/dist/collection/components/diwa-heading/diwa-heading-utils.js +26 -0
- package/dist/collection/components/diwa-heading/diwa-heading-utils.js.map +1 -0
- package/dist/collection/components/diwa-heading/diwa-heading.js +235 -0
- package/dist/collection/components/diwa-heading/diwa-heading.js.map +1 -0
- package/dist/collection/components/diwa-heading/types.js +2 -0
- package/dist/collection/components/diwa-heading/types.js.map +1 -0
- package/dist/collection/components/diwa-icon/diwa-icon.js +1 -1
- package/dist/collection/components/diwa-inline-notification/diwa-inline-notification.js +1 -1
- package/dist/collection/components/diwa-input/diwa-input.js +1 -1
- package/dist/collection/components/diwa-input-date/diwa-input-date.js +1 -1
- package/dist/collection/components/diwa-input-email/diwa-input-email.js +1 -1
- package/dist/collection/components/diwa-input-month/diwa-input-month.js +1 -1
- package/dist/collection/components/diwa-input-number/diwa-input-number.js +1 -1
- package/dist/collection/components/diwa-input-password/diwa-input-password.js +1 -1
- package/dist/collection/components/diwa-input-search/diwa-input-search.js +1 -1
- package/dist/collection/components/diwa-input-tel/diwa-input-tel.js +1 -1
- package/dist/collection/components/diwa-input-text/diwa-input-text.js +1 -1
- package/dist/collection/components/diwa-input-time/diwa-input-time.js +1 -1
- package/dist/collection/components/diwa-input-url/diwa-input-url.js +1 -1
- package/dist/collection/components/diwa-input-week/diwa-input-week.js +1 -1
- package/dist/collection/components/diwa-link/diwa-link.js +1 -1
- package/dist/collection/components/diwa-link-pure/diwa-link-pure.js +1 -1
- package/dist/collection/components/diwa-modal/diwa-modal.js +1 -1
- package/dist/collection/components/diwa-multi-select/diwa-multi-select.js +2 -2
- package/dist/collection/components/diwa-multi-select-option/diwa-multi-select-option.js +1 -1
- package/dist/collection/components/diwa-pagination/diwa-pagination.js +1 -1
- package/dist/collection/components/diwa-pin-code/diwa-pin-code.js +2 -2
- package/dist/collection/components/diwa-popover/diwa-popover.js +1 -1
- package/dist/collection/components/diwa-radio-group/diwa-radio-group.js +1 -1
- package/dist/collection/components/diwa-radio-group-item/diwa-radio-group-item-styles.js +1 -2
- package/dist/collection/components/diwa-radio-group-item/diwa-radio-group-item-styles.js.map +1 -1
- package/dist/collection/components/diwa-radio-group-item/diwa-radio-group-item.js +1 -1
- package/dist/collection/components/diwa-scroller/diwa-scroller-styles.js +14 -9
- package/dist/collection/components/diwa-scroller/diwa-scroller-styles.js.map +1 -1
- package/dist/collection/components/diwa-scroller/diwa-scroller.js +9 -13
- package/dist/collection/components/diwa-scroller/diwa-scroller.js.map +1 -1
- package/dist/collection/components/diwa-segmented-control/diwa-segmented-control.js +1 -1
- package/dist/collection/components/diwa-segmented-control-item/diwa-segmented-control-item.js +1 -1
- package/dist/collection/components/diwa-select/diwa-select.js +17 -1
- package/dist/collection/components/diwa-select/diwa-select.js.map +1 -1
- package/dist/collection/components/diwa-select-option/diwa-select-option-styles.js +21 -9
- package/dist/collection/components/diwa-select-option/diwa-select-option-styles.js.map +1 -1
- package/dist/collection/components/diwa-select-option/diwa-select-option.js +23 -1
- package/dist/collection/components/diwa-select-option/diwa-select-option.js.map +1 -1
- package/dist/collection/components/diwa-spinner/diwa-spinner.js +1 -1
- package/dist/collection/components/diwa-stepper-horizontal/diwa-stepper-horizontal.js +1 -1
- package/dist/collection/components/diwa-stepper-horizontal-item/diwa-stepper-horizontal-item.js +1 -1
- package/dist/collection/components/diwa-switch/diwa-switch.js +1 -1
- package/dist/collection/components/diwa-table/diwa-table-styles.js +81 -42
- package/dist/collection/components/diwa-table/diwa-table-styles.js.map +1 -1
- package/dist/collection/components/diwa-table/diwa-table.js +3 -2
- package/dist/collection/components/diwa-table/diwa-table.js.map +1 -1
- package/dist/collection/components/diwa-table-body/diwa-table-body.js +1 -1
- package/dist/collection/components/diwa-table-cell/diwa-table-cell-styles.js +14 -14
- package/dist/collection/components/diwa-table-cell/diwa-table-cell-styles.js.map +1 -1
- package/dist/collection/components/diwa-table-cell/diwa-table-cell.js +1 -1
- package/dist/collection/components/diwa-table-cell/diwa-table-cell.js.map +1 -1
- package/dist/collection/components/diwa-table-head/diwa-table-head-styles.js +15 -10
- package/dist/collection/components/diwa-table-head/diwa-table-head-styles.js.map +1 -1
- package/dist/collection/components/diwa-table-head/diwa-table-head.js +1 -1
- package/dist/collection/components/diwa-table-head-cell/diwa-table-head-cell-styles.js +60 -49
- package/dist/collection/components/diwa-table-head-cell/diwa-table-head-cell-styles.js.map +1 -1
- package/dist/collection/components/diwa-table-head-cell/diwa-table-head-cell.js +4 -4
- package/dist/collection/components/diwa-table-head-cell/diwa-table-head-cell.js.map +1 -1
- package/dist/collection/components/diwa-table-row/diwa-table-row-styles.js +10 -9
- package/dist/collection/components/diwa-table-row/diwa-table-row-styles.js.map +1 -1
- package/dist/collection/components/diwa-table-row/diwa-table-row.js +1 -1
- package/dist/collection/components/diwa-tabs/diwa-tabs-styles.js +11 -11
- package/dist/collection/components/diwa-tabs/diwa-tabs-styles.js.map +1 -1
- package/dist/collection/components/diwa-tabs/diwa-tabs.js +1 -1
- package/dist/collection/components/diwa-tabs-bar/diwa-tabs-bar.js +1 -1
- package/dist/collection/components/diwa-tabs-item/diwa-tabs-item.js +1 -1
- package/dist/collection/components/diwa-tag/diwa-tag-styles.js +1 -1
- package/dist/collection/components/diwa-tag/diwa-tag-styles.js.map +1 -1
- package/dist/collection/components/diwa-tag/diwa-tag.js +1 -1
- package/dist/collection/components/diwa-tag-dismissible/diwa-tag-dismissible-styles.js +5 -6
- package/dist/collection/components/diwa-tag-dismissible/diwa-tag-dismissible-styles.js.map +1 -1
- package/dist/collection/components/diwa-tag-dismissible/diwa-tag-dismissible.js +1 -2
- package/dist/collection/components/diwa-tag-dismissible/diwa-tag-dismissible.js.map +1 -1
- package/dist/collection/components/diwa-text/diwa-text.js +1 -1
- package/dist/collection/components/diwa-text-list/diwa-text-list.js +1 -1
- package/dist/collection/components/diwa-text-list-item/diwa-text-list-item.js +1 -1
- package/dist/collection/components/diwa-textarea/diwa-textarea.js +1 -1
- package/dist/collection/components/diwa-toast/diwa-toast-manager.js +96 -0
- package/dist/collection/components/diwa-toast/diwa-toast-manager.js.map +1 -0
- package/dist/collection/components/diwa-toast/diwa-toast.js +24 -25
- package/dist/collection/components/diwa-toast/diwa-toast.js.map +1 -1
- package/dist/collection/components/diwa-toast-item/diwa-toast-item.js +1 -1
- package/dist/diwa-components/diwa-components.css +2 -2
- package/dist/diwa-components/diwa-components.esm.js +1 -1
- package/dist/diwa-components/diwa-components.esm.js.map +1 -1
- package/dist/diwa-components/{p-2b54c761.entry.js → p-09f2e643.entry.js} +2 -2
- package/dist/diwa-components/{p-4ac5a26e.entry.js → p-117dc41d.entry.js} +2 -2
- package/dist/diwa-components/p-117dc41d.entry.js.map +1 -0
- package/dist/diwa-components/{p-1022a474.entry.js → p-1250d0c7.entry.js} +2 -2
- package/dist/diwa-components/{p-1a1bd7ed.entry.js → p-13e71247.entry.js} +2 -2
- package/dist/diwa-components/p-1830772d.entry.js +2 -0
- package/dist/diwa-components/{p-f4a589b5.entry.js → p-1d708e1e.entry.js} +2 -2
- package/dist/diwa-components/{p-bb04cdd6.entry.js → p-238da82a.entry.js} +2 -2
- package/dist/diwa-components/p-29419c9a.entry.js +2 -0
- package/dist/diwa-components/p-29419c9a.entry.js.map +1 -0
- package/dist/diwa-components/{p-c896dfa5.entry.js → p-3269a4b7.entry.js} +2 -2
- package/dist/diwa-components/p-35b69160.entry.js +2 -0
- package/dist/diwa-components/p-35b69160.entry.js.map +1 -0
- package/dist/diwa-components/{p-fbe73240.entry.js → p-3660b09a.entry.js} +2 -2
- package/dist/diwa-components/{p-c37374ab.entry.js → p-36b004e9.entry.js} +2 -2
- package/dist/diwa-components/p-37e1bea3.entry.js +2 -0
- package/dist/diwa-components/p-37e1bea3.entry.js.map +1 -0
- package/dist/diwa-components/{p-851cbfb8.entry.js → p-3b38fa01.entry.js} +2 -2
- package/dist/diwa-components/p-3fb5cc30.entry.js +2 -0
- package/dist/diwa-components/p-429c596d.entry.js +2 -0
- package/dist/diwa-components/p-429c596d.entry.js.map +1 -0
- package/dist/diwa-components/p-50866c5a.entry.js +2 -0
- package/dist/diwa-components/p-50866c5a.entry.js.map +1 -0
- package/dist/diwa-components/p-5a597e27.entry.js +2 -0
- package/dist/diwa-components/p-5f9139bc.entry.js +2 -0
- package/dist/diwa-components/p-5f9139bc.entry.js.map +1 -0
- package/dist/diwa-components/p-66c15f66.entry.js +2 -0
- package/dist/diwa-components/p-66c53adc.entry.js +2 -0
- package/dist/diwa-components/p-66c53adc.entry.js.map +1 -0
- package/dist/diwa-components/{p-6253fff6.entry.js → p-71c45961.entry.js} +2 -2
- package/dist/diwa-components/{p-358e1177.entry.js → p-78b16866.entry.js} +2 -2
- package/dist/diwa-components/p-7a99a2aa.entry.js +2 -0
- package/dist/diwa-components/p-7a99a2aa.entry.js.map +1 -0
- package/dist/diwa-components/p-7dc7291f.entry.js +2 -0
- package/dist/diwa-components/{p-09a9e0a0.entry.js → p-8369c48e.entry.js} +2 -2
- package/dist/diwa-components/{p-c0614fb1.entry.js → p-8506ea0c.entry.js} +2 -2
- package/dist/diwa-components/p-863c88a4.entry.js +2 -0
- package/dist/diwa-components/{p-339f6ba7.entry.js.map → p-863c88a4.entry.js.map} +1 -1
- package/dist/diwa-components/{p-ba1ffa71.entry.js → p-87932af2.entry.js} +2 -2
- package/dist/diwa-components/{p-48009a79.entry.js → p-926e283b.entry.js} +2 -2
- package/dist/diwa-components/p-952af214.entry.js +2 -0
- package/dist/diwa-components/p-952af214.entry.js.map +1 -0
- package/dist/diwa-components/{p-4ff58224.entry.js → p-95b0fdea.entry.js} +2 -2
- package/dist/diwa-components/p-9910d570.entry.js +2 -0
- package/dist/diwa-components/p-9910d570.entry.js.map +1 -0
- package/dist/diwa-components/{p-20fd1505.entry.js → p-998dd88e.entry.js} +2 -2
- package/dist/diwa-components/p-9ade0403.entry.js +2 -0
- package/dist/diwa-components/{p-57db0c31.entry.js → p-9c89e586.entry.js} +2 -2
- package/dist/diwa-components/p-b072ff72.entry.js +2 -0
- package/dist/diwa-components/p-b072ff72.entry.js.map +1 -0
- package/dist/diwa-components/{p-565f623e.entry.js → p-bd501daa.entry.js} +2 -2
- package/dist/diwa-components/{p-c1c85f9e.entry.js → p-c6ca8d8b.entry.js} +2 -2
- package/dist/diwa-components/{p-53e21a74.entry.js → p-c78591ce.entry.js} +2 -2
- package/dist/diwa-components/{p-996f7110.entry.js → p-cc0e1662.entry.js} +2 -2
- package/dist/diwa-components/{p-711e295e.entry.js → p-d25377eb.entry.js} +2 -2
- package/dist/diwa-components/{p-7f0ce623.entry.js → p-d917625e.entry.js} +2 -2
- package/dist/diwa-components/{p-d0762292.entry.js → p-db70e030.entry.js} +2 -2
- package/dist/diwa-components/p-db70e030.entry.js.map +1 -0
- package/dist/diwa-components/p-def36bc4.entry.js +2 -0
- package/dist/diwa-components/p-def36bc4.entry.js.map +1 -0
- package/dist/diwa-components/p-e137afc9.entry.js +2 -0
- package/dist/diwa-components/{p-666844e0.entry.js → p-e1935375.entry.js} +2 -2
- package/dist/diwa-components/{p-87ea8001.entry.js → p-e602c199.entry.js} +2 -2
- package/dist/diwa-components/{p-9f140e14.entry.js → p-e9673253.entry.js} +2 -2
- package/dist/diwa-components/p-f44d4091.entry.js +2 -0
- package/dist/diwa-components/p-f44d4091.entry.js.map +1 -0
- package/dist/diwa-components/p-f60f1d81.entry.js +2 -0
- package/dist/diwa-components/p-fae653f7.entry.js +2 -0
- package/dist/esm/diwa-checkbox.entry.js +1 -3
- package/dist/esm/diwa-checkbox.entry.js.map +1 -1
- package/dist/esm/diwa-components.js +1 -1
- package/dist/esm/diwa-heading.entry.js +122 -0
- package/dist/esm/diwa-heading.entry.js.map +1 -0
- package/dist/esm/diwa-icon.entry.js +1 -1
- package/dist/esm/diwa-inline-notification.entry.js +1 -1
- package/dist/esm/diwa-input-date.entry.js +1 -1
- package/dist/esm/diwa-input-email.entry.js +1 -1
- package/dist/esm/diwa-input-month.entry.js +1 -1
- package/dist/esm/diwa-input-number.entry.js +1 -1
- package/dist/esm/diwa-input-password.entry.js +1 -1
- package/dist/esm/diwa-input-search.entry.js +1 -1
- package/dist/esm/diwa-input-tel.entry.js +1 -1
- package/dist/esm/diwa-input-text.entry.js +1 -1
- package/dist/esm/diwa-input-time.entry.js +1 -1
- package/dist/esm/diwa-input-url.entry.js +1 -1
- package/dist/esm/diwa-input-week.entry.js +1 -1
- package/dist/esm/diwa-input.entry.js +1 -1
- package/dist/esm/diwa-link-pure.entry.js +1 -1
- package/dist/esm/diwa-link.entry.js +1 -1
- package/dist/esm/diwa-modal.entry.js +1 -1
- package/dist/esm/diwa-multi-select-option.entry.js +1 -1
- package/dist/esm/diwa-multi-select.entry.js +2 -2
- package/dist/esm/diwa-pagination.entry.js +1 -1
- package/dist/esm/diwa-pin-code.entry.js +2 -2
- package/dist/esm/diwa-popover.entry.js +1 -1
- package/dist/esm/diwa-radio-group-item.entry.js +2 -3
- package/dist/esm/diwa-radio-group-item.entry.js.map +1 -1
- package/dist/esm/diwa-radio-group.entry.js +1 -1
- package/dist/esm/diwa-scroller.entry.js +23 -13
- package/dist/esm/diwa-scroller.entry.js.map +1 -1
- package/dist/esm/diwa-segmented-control-item.entry.js +1 -1
- package/dist/esm/diwa-segmented-control.entry.js +1 -1
- package/dist/esm/diwa-select-option.entry.js +24 -10
- package/dist/esm/diwa-select-option.entry.js.map +1 -1
- package/dist/esm/diwa-select.entry.js +15 -1
- package/dist/esm/diwa-select.entry.js.map +1 -1
- package/dist/esm/diwa-spinner.entry.js +1 -1
- package/dist/esm/diwa-stepper-horizontal-item.entry.js +1 -1
- package/dist/esm/diwa-stepper-horizontal.entry.js +1 -1
- package/dist/esm/diwa-switch.entry.js +1 -1
- package/dist/esm/diwa-table-body.entry.js +1 -1
- package/dist/esm/diwa-table-cell.entry.js +15 -15
- package/dist/esm/diwa-table-cell.entry.js.map +1 -1
- package/dist/esm/diwa-table-head-cell.entry.js +64 -53
- package/dist/esm/diwa-table-head-cell.entry.js.map +1 -1
- package/dist/esm/diwa-table-head.entry.js +16 -11
- package/dist/esm/diwa-table-head.entry.js.map +1 -1
- package/dist/esm/diwa-table-row.entry.js +11 -10
- package/dist/esm/diwa-table-row.entry.js.map +1 -1
- package/dist/esm/diwa-table.entry.js +83 -43
- package/dist/esm/diwa-table.entry.js.map +1 -1
- package/dist/esm/diwa-tabs-bar.entry.js +1 -1
- package/dist/esm/diwa-tabs-item.entry.js +1 -1
- package/dist/esm/diwa-tabs.entry.js +12 -12
- package/dist/esm/diwa-tabs.entry.js.map +1 -1
- package/dist/esm/diwa-tag-dismissible.entry.js +6 -8
- package/dist/esm/diwa-tag-dismissible.entry.js.map +1 -1
- package/dist/esm/diwa-tag.entry.js +2 -2
- package/dist/esm/diwa-tag.entry.js.map +1 -1
- package/dist/esm/diwa-text-list-item.entry.js +1 -1
- package/dist/esm/diwa-text-list.entry.js +1 -1
- package/dist/esm/diwa-text.entry.js +1 -1
- package/dist/esm/diwa-textarea.entry.js +1 -1
- package/dist/esm/diwa-toast-item.entry.js +1 -1
- package/dist/esm/diwa-toast.entry.js +111 -17
- package/dist/esm/diwa-toast.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/types/components/diwa-heading/diwa-heading-styles.d.ts +3 -0
- package/dist/types/components/diwa-heading/diwa-heading-utils.d.ts +10 -0
- package/dist/types/components/diwa-heading/diwa-heading.d.ts +49 -0
- package/dist/types/components/diwa-heading/types.d.ts +17 -0
- package/dist/types/components/diwa-scroller/diwa-scroller-styles.d.ts +1 -1
- package/dist/types/components/diwa-scroller/diwa-scroller.d.ts +2 -1
- package/dist/types/components/diwa-select/diwa-select.d.ts +2 -0
- package/dist/types/components/diwa-select-option/diwa-select-option.d.ts +2 -0
- package/dist/types/components/diwa-table/diwa-table.d.ts +1 -1
- package/dist/types/components/diwa-toast/diwa-toast-manager.d.ts +34 -0
- package/dist/types/components/diwa-toast/diwa-toast.d.ts +12 -12
- package/dist/types/components.d.ts +144 -25
- package/dist-custom-elements/diwa-accordion.js +1 -1
- package/dist-custom-elements/diwa-button-pure.js +1 -1
- package/dist-custom-elements/diwa-button.js +1 -1
- package/dist-custom-elements/diwa-checkbox.js +1 -3
- package/dist-custom-elements/diwa-checkbox.js.map +1 -1
- package/dist-custom-elements/diwa-flyout.js +2 -2
- package/dist-custom-elements/diwa-heading.d.ts +11 -0
- package/dist-custom-elements/diwa-heading.js +149 -0
- package/dist-custom-elements/diwa-heading.js.map +1 -0
- package/dist-custom-elements/diwa-icon.js +1 -1
- package/dist-custom-elements/diwa-inline-notification.js +3 -3
- package/dist-custom-elements/diwa-input-date.js +1 -1
- package/dist-custom-elements/diwa-input-email.js +1 -1
- package/dist-custom-elements/diwa-input-month.js +1 -1
- package/dist-custom-elements/diwa-input-number.js +1 -1
- package/dist-custom-elements/diwa-input-password.js +2 -2
- package/dist-custom-elements/diwa-input-search.js +2 -2
- package/dist-custom-elements/diwa-input-tel.js +1 -1
- package/dist-custom-elements/diwa-input-text.js +1 -1
- package/dist-custom-elements/diwa-input-time.js +1 -1
- package/dist-custom-elements/diwa-input-url.js +1 -1
- package/dist-custom-elements/diwa-input-week.js +1 -1
- package/dist-custom-elements/diwa-input.js +1 -1
- package/dist-custom-elements/diwa-link-pure.js +2 -2
- package/dist-custom-elements/diwa-link.js +2 -2
- package/dist-custom-elements/diwa-modal.js +1 -1
- package/dist-custom-elements/diwa-multi-select-option.js +1 -1
- package/dist-custom-elements/diwa-multi-select.js +2 -2
- package/dist-custom-elements/diwa-pagination.js +1 -1
- package/dist-custom-elements/diwa-pin-code.js +2 -2
- package/dist-custom-elements/diwa-popover.js +1 -1
- package/dist-custom-elements/diwa-radio-group-item.js +2 -3
- package/dist-custom-elements/diwa-radio-group-item.js.map +1 -1
- package/dist-custom-elements/diwa-radio-group.js +1 -1
- package/dist-custom-elements/diwa-scroller.js +24 -14
- package/dist-custom-elements/diwa-scroller.js.map +1 -1
- package/dist-custom-elements/diwa-segmented-control-item.js +1 -1
- package/dist-custom-elements/diwa-segmented-control.js +1 -1
- package/dist-custom-elements/diwa-select-option.js +25 -10
- package/dist-custom-elements/diwa-select-option.js.map +1 -1
- package/dist-custom-elements/diwa-select.js +16 -1
- package/dist-custom-elements/diwa-select.js.map +1 -1
- package/dist-custom-elements/diwa-spinner.js +1 -1
- package/dist-custom-elements/diwa-stepper-horizontal-item.js +1 -1
- package/dist-custom-elements/diwa-stepper-horizontal.js +1 -1
- package/dist-custom-elements/diwa-switch.js +2 -2
- package/dist-custom-elements/diwa-table-body.js +1 -1
- package/dist-custom-elements/diwa-table-cell.js +15 -15
- package/dist-custom-elements/diwa-table-cell.js.map +1 -1
- package/dist-custom-elements/diwa-table-head-cell.js +64 -53
- package/dist-custom-elements/diwa-table-head-cell.js.map +1 -1
- package/dist-custom-elements/diwa-table-head.js +16 -11
- package/dist-custom-elements/diwa-table-head.js.map +1 -1
- package/dist-custom-elements/diwa-table-row.js +11 -10
- package/dist-custom-elements/diwa-table-row.js.map +1 -1
- package/dist-custom-elements/diwa-table.js +83 -43
- package/dist-custom-elements/diwa-table.js.map +1 -1
- package/dist-custom-elements/diwa-tabs-bar.js +1 -1
- package/dist-custom-elements/diwa-tabs-item.js +1 -1
- package/dist-custom-elements/diwa-tabs.js +12 -12
- package/dist-custom-elements/diwa-tabs.js.map +1 -1
- package/dist-custom-elements/diwa-tag-dismissible.js +6 -8
- package/dist-custom-elements/diwa-tag-dismissible.js.map +1 -1
- package/dist-custom-elements/diwa-tag.js +3 -3
- package/dist-custom-elements/diwa-tag.js.map +1 -1
- package/dist-custom-elements/diwa-text-list-item.js +1 -1
- package/dist-custom-elements/diwa-text-list.js +1 -1
- package/dist-custom-elements/diwa-text.js +1 -1
- package/dist-custom-elements/diwa-textarea.js +1 -1
- package/dist-custom-elements/diwa-toast-item.js +1 -1
- package/dist-custom-elements/diwa-toast.js +113 -19
- package/dist-custom-elements/diwa-toast.js.map +1 -1
- package/dist-custom-elements/{p-54e5b3fb.js → p-105f3f97.js} +2 -2
- package/dist-custom-elements/{p-54e5b3fb.js.map → p-105f3f97.js.map} +1 -1
- package/dist-custom-elements/{p-f480bce8.js → p-7c951f7f.js} +2 -2
- package/dist-custom-elements/{p-f480bce8.js.map → p-7c951f7f.js.map} +1 -1
- package/dist-custom-elements/{p-302af10d.js → p-8972ae69.js} +2 -2
- package/dist-custom-elements/{p-302af10d.js.map → p-8972ae69.js.map} +1 -1
- package/dist-custom-elements/{p-ed901570.js → p-b7255dc4.js} +2 -2
- package/dist-custom-elements/{p-ed901570.js.map → p-b7255dc4.js.map} +1 -1
- package/package.json +11 -9
- package/dist/diwa-components/p-043e3e19.entry.js +0 -2
- package/dist/diwa-components/p-05988905.entry.js +0 -2
- package/dist/diwa-components/p-08c584fb.entry.js +0 -2
- package/dist/diwa-components/p-08c584fb.entry.js.map +0 -1
- package/dist/diwa-components/p-0cbe8ed4.entry.js +0 -2
- package/dist/diwa-components/p-0cbe8ed4.entry.js.map +0 -1
- package/dist/diwa-components/p-139f619d.entry.js +0 -2
- package/dist/diwa-components/p-139f619d.entry.js.map +0 -1
- package/dist/diwa-components/p-178d18c2.entry.js +0 -2
- package/dist/diwa-components/p-178d18c2.entry.js.map +0 -1
- package/dist/diwa-components/p-2b72a324.entry.js +0 -2
- package/dist/diwa-components/p-339f6ba7.entry.js +0 -2
- package/dist/diwa-components/p-3b7a1431.entry.js +0 -2
- package/dist/diwa-components/p-3b7a1431.entry.js.map +0 -1
- package/dist/diwa-components/p-4a84fee8.entry.js +0 -2
- package/dist/diwa-components/p-4ac5a26e.entry.js.map +0 -1
- package/dist/diwa-components/p-51673c06.entry.js +0 -2
- package/dist/diwa-components/p-51673c06.entry.js.map +0 -1
- package/dist/diwa-components/p-5c2325aa.entry.js +0 -2
- package/dist/diwa-components/p-5cd79382.entry.js +0 -2
- package/dist/diwa-components/p-67950f59.entry.js +0 -2
- package/dist/diwa-components/p-67950f59.entry.js.map +0 -1
- package/dist/diwa-components/p-8012c384.entry.js +0 -2
- package/dist/diwa-components/p-8012c384.entry.js.map +0 -1
- package/dist/diwa-components/p-9088f057.entry.js +0 -2
- package/dist/diwa-components/p-94f603c2.entry.js +0 -2
- package/dist/diwa-components/p-94f603c2.entry.js.map +0 -1
- package/dist/diwa-components/p-b7132ea7.entry.js +0 -2
- package/dist/diwa-components/p-b7132ea7.entry.js.map +0 -1
- package/dist/diwa-components/p-b988c5b3.entry.js +0 -2
- package/dist/diwa-components/p-b988c5b3.entry.js.map +0 -1
- package/dist/diwa-components/p-bc2eecd2.entry.js +0 -2
- package/dist/diwa-components/p-cf960cf6.entry.js +0 -2
- package/dist/diwa-components/p-d0762292.entry.js.map +0 -1
- package/dist/diwa-components/p-f22b6145.entry.js +0 -2
- package/dist/diwa-components/p-f22b6145.entry.js.map +0 -1
- /package/dist/diwa-components/{p-2b54c761.entry.js.map → p-09f2e643.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-1022a474.entry.js.map → p-1250d0c7.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-1a1bd7ed.entry.js.map → p-13e71247.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-711e295e.entry.js.map → p-1830772d.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-f4a589b5.entry.js.map → p-1d708e1e.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-bb04cdd6.entry.js.map → p-238da82a.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-c896dfa5.entry.js.map → p-3269a4b7.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-fbe73240.entry.js.map → p-3660b09a.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-c37374ab.entry.js.map → p-36b004e9.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-851cbfb8.entry.js.map → p-3b38fa01.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-4a84fee8.entry.js.map → p-3fb5cc30.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-5cd79382.entry.js.map → p-5a597e27.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-043e3e19.entry.js.map → p-66c15f66.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-6253fff6.entry.js.map → p-71c45961.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-358e1177.entry.js.map → p-78b16866.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-05988905.entry.js.map → p-7dc7291f.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-09a9e0a0.entry.js.map → p-8369c48e.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-bc2eecd2.entry.js.map → p-8506ea0c.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-ba1ffa71.entry.js.map → p-87932af2.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-48009a79.entry.js.map → p-926e283b.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-4ff58224.entry.js.map → p-95b0fdea.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-20fd1505.entry.js.map → p-998dd88e.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-5c2325aa.entry.js.map → p-9ade0403.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-57db0c31.entry.js.map → p-9c89e586.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-565f623e.entry.js.map → p-bd501daa.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-c1c85f9e.entry.js.map → p-c6ca8d8b.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-53e21a74.entry.js.map → p-c78591ce.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-996f7110.entry.js.map → p-cc0e1662.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-9088f057.entry.js.map → p-d25377eb.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-7f0ce623.entry.js.map → p-d917625e.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-2b72a324.entry.js.map → p-e137afc9.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-666844e0.entry.js.map → p-e1935375.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-87ea8001.entry.js.map → p-e602c199.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-9f140e14.entry.js.map → p-e9673253.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-cf960cf6.entry.js.map → p-f60f1d81.entry.js.map} +0 -0
- /package/dist/diwa-components/{p-c0614fb1.entry.js.map → p-fae653f7.entry.js.map} +0 -0
|
@@ -6,7 +6,7 @@ const ALIGN_MAP = {
|
|
|
6
6
|
center: 'center',
|
|
7
7
|
bottom: 'flex-end',
|
|
8
8
|
};
|
|
9
|
-
const getComponentCss = (scrollbar, alignScrollIndicator, hasOverflow) => {
|
|
9
|
+
const getComponentCss = (scrollbar, alignScrollIndicator, hasOverflow, canScrollLeft, canScrollRight) => {
|
|
10
10
|
const alignItems = ALIGN_MAP[alignScrollIndicator];
|
|
11
11
|
return `
|
|
12
12
|
:host {
|
|
@@ -49,9 +49,14 @@ const getComponentCss = (scrollbar, alignScrollIndicator, hasOverflow) => {
|
|
|
49
49
|
display: none;
|
|
50
50
|
}
|
|
51
51
|
${getFocusStyle('.scroll-button')}
|
|
52
|
+
${getFocusStyle('.scroll-area')}
|
|
53
|
+
.scroll-wrapper {
|
|
54
|
+
position: relative;
|
|
55
|
+
min-width: 0;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
}
|
|
52
58
|
.scroll-area {
|
|
53
59
|
display: flex;
|
|
54
|
-
position: relative;
|
|
55
60
|
align-items: ${alignItems};
|
|
56
61
|
overflow-x: auto;
|
|
57
62
|
overflow-y: hidden;
|
|
@@ -67,25 +72,25 @@ const getComponentCss = (scrollbar, alignScrollIndicator, hasOverflow) => {
|
|
|
67
72
|
display: none;
|
|
68
73
|
}
|
|
69
74
|
` : ''}
|
|
70
|
-
/* Fade-out gradient masks at the edges */
|
|
71
|
-
.
|
|
72
|
-
.scroll-area::after {
|
|
73
|
-
content: '';
|
|
75
|
+
/* Fade-out gradient masks — fixed at the visible edges via scroll-wrapper */
|
|
76
|
+
.fade {
|
|
74
77
|
position: absolute;
|
|
75
78
|
top: 0;
|
|
76
79
|
bottom: 0;
|
|
77
80
|
width: var(--diwa-scroller-fade-width);
|
|
78
81
|
pointer-events: none;
|
|
79
82
|
z-index: 1;
|
|
80
|
-
|
|
83
|
+
transition: opacity var(--diwa-transition-fast);
|
|
81
84
|
}
|
|
82
|
-
.
|
|
85
|
+
.fade--start {
|
|
83
86
|
left: 0;
|
|
84
87
|
background: var(--diwa-gradient-scrim-right);
|
|
88
|
+
opacity: ${canScrollLeft ? '1' : '0'};
|
|
85
89
|
}
|
|
86
|
-
.
|
|
90
|
+
.fade--end {
|
|
87
91
|
right: 0;
|
|
88
92
|
background: var(--diwa-gradient-scrim-left);
|
|
93
|
+
opacity: ${canScrollRight ? '1' : '0'};
|
|
89
94
|
}
|
|
90
95
|
`;
|
|
91
96
|
};
|
|
@@ -124,11 +129,16 @@ const DiwaScroller$1 = /*@__PURE__*/ proxyCustomElement(class DiwaScroller exten
|
|
|
124
129
|
});
|
|
125
130
|
};
|
|
126
131
|
}
|
|
127
|
-
handleWindowResize() {
|
|
128
|
-
this.updateScrollState();
|
|
129
|
-
}
|
|
130
132
|
componentDidLoad() {
|
|
131
133
|
this.updateScrollState();
|
|
134
|
+
if (this.scrollAreaEl) {
|
|
135
|
+
this.resizeObserver = new ResizeObserver(() => this.updateScrollState());
|
|
136
|
+
this.resizeObserver.observe(this.scrollAreaEl);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
disconnectedCallback() {
|
|
140
|
+
var _a;
|
|
141
|
+
(_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
132
142
|
}
|
|
133
143
|
updateScrollState() {
|
|
134
144
|
const el = this.scrollAreaEl;
|
|
@@ -142,7 +152,7 @@ const DiwaScroller$1 = /*@__PURE__*/ proxyCustomElement(class DiwaScroller exten
|
|
|
142
152
|
this.canScrollRight = currentScrollLeft < maxScrollLeft - epsilon;
|
|
143
153
|
}
|
|
144
154
|
render() {
|
|
145
|
-
return (h(Host, { key: '
|
|
155
|
+
return (h(Host, { key: '45f4f99a3620911a3c082174ca774e45ea873e4d', "data-theme": this.theme }, h("style", { key: 'c8ef4daca35a71b53e14fc7bfebbff0675924fca', innerHTML: getComponentCss(this.scrollbar, this.alignScrollIndicator, this.hasOverflow, this.canScrollLeft, this.canScrollRight) }), h("div", { key: '5238cd797598390d8f9dc4dee119a40415dbfc4a', class: "scroller" }, h("button", { key: '6518c1d1a3afaebf619b6c8eae48c4e382c6a9d9', type: "button", class: "scroll-button scroll-button--start", "aria-label": "Scroll left", disabled: !this.canScrollLeft, hidden: !this.hasOverflow, onClick: () => this.scrollByPage('start') }, h("svg", { key: '7f9fb5f92a32bd36262d92a8d91f91dd9f2c0944', viewBox: "0 0 16 16", width: "16", height: "16", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { key: '0a7a19e7be0d4522042f19a316dc95eb1a6eaab3', d: "M10 3.5 5 8l5 4.5" }))), h("div", { key: '7388a4c9a666c5d0427af95a1ff7f1f614042f44', class: "scroll-wrapper" }, h("div", { key: '74dde4823c6bb81ae2709c3c605c9670f29ca5b2', class: "scroll-area", tabIndex: this.hasOverflow ? 0 : undefined, role: this.hasOverflow ? 'region' : undefined, "aria-label": this.hasOverflow ? 'Scrollable content' : undefined, onScroll: this.handleScroll, ref: this.setScrollAreaRef }, h("slot", { key: '88077bcfbeeefdb356b3b9dd4fa4f8fe49cb33ec', onSlotchange: this.handleSlotChange })), h("div", { key: '6058d245a910c7edc139789b10627c55366b0767', class: "fade fade--start", "aria-hidden": "true" }), h("div", { key: '2353970bea7c49c8d689ee7115cbbf0c580ef065', class: "fade fade--end", "aria-hidden": "true" })), h("button", { key: '0f51472148bf56d3a1f24406fe8a8b9b560be666', type: "button", class: "scroll-button scroll-button--end", "aria-label": "Scroll right", disabled: !this.canScrollRight, hidden: !this.hasOverflow, onClick: () => this.scrollByPage('end') }, h("svg", { key: 'c74842bea946222b5939bc85336315e276daf4d0', viewBox: "0 0 16 16", width: "16", height: "16", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { key: 'cdf90c5eb1036fb911153f3f2fc6adda2ced7afc', d: "M6 3.5 11 8l-5 4.5" }))))));
|
|
146
156
|
}
|
|
147
157
|
}, [1, "diwa-scroller", {
|
|
148
158
|
"alignScrollIndicator": [1, "align-scroll-indicator"],
|
|
@@ -151,7 +161,7 @@ const DiwaScroller$1 = /*@__PURE__*/ proxyCustomElement(class DiwaScroller exten
|
|
|
151
161
|
"hasOverflow": [32],
|
|
152
162
|
"canScrollLeft": [32],
|
|
153
163
|
"canScrollRight": [32]
|
|
154
|
-
}
|
|
164
|
+
}]);
|
|
155
165
|
function defineCustomElement$1() {
|
|
156
166
|
if (typeof customElements === "undefined") {
|
|
157
167
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"diwa-scroller.js","mappings":"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","names":["DiwaScroller"],"sources":["src/components/diwa-scroller/diwa-scroller-styles.ts","src/components/diwa-scroller/diwa-scroller.tsx"],"sourcesContent":["import { getFocusStyle } from '../../utils/styles';\r\nimport type { ScrollerScrollIndicatorPosition } from './types';\r\n\r\nconst ALIGN_MAP: Record<ScrollerScrollIndicatorPosition, string> = {\r\n top: 'flex-start',\r\n center: 'center',\r\n bottom: 'flex-end',\r\n};\r\n\r\nexport const getComponentCss = (\r\n scrollbar: boolean,\r\n alignScrollIndicator: ScrollerScrollIndicatorPosition,\r\n hasOverflow: boolean,\r\n): string => {\r\n const alignItems = ALIGN_MAP[alignScrollIndicator];\r\n\r\n return `\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n :host([hidden]) {\r\n display: none;\r\n }\r\n .scroller {\r\n display: grid;\r\n grid-template-columns: ${hasOverflow ? 'auto minmax(0, 1fr) auto' : 'minmax(0, 1fr)'};\r\n align-items: ${alignItems};\r\n gap: var(--diwa-space-2);\r\n }\r\n .scroll-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--diwa-space-8);\r\n height: var(--diwa-space-8);\r\n padding: 0;\r\n border: var(--diwa-border-width-thin) solid var(--diwa-border);\r\n border-radius: var(--diwa-radius-full);\r\n background: var(--diwa-bg-surface);\r\n color: var(--diwa-text-secondary);\r\n cursor: pointer;\r\n transition: var(--diwa-transition-colors), box-shadow var(--diwa-transition-fast);\r\n flex-shrink: 0;\r\n }\r\n .scroll-button:hover:not(:disabled) {\r\n color: var(--diwa-text-primary);\r\n background: var(--diwa-bg-hover);\r\n }\r\n .scroll-button:disabled {\r\n opacity: var(--diwa-opacity-disabled);\r\n cursor: not-allowed;\r\n }\r\n .scroll-button[hidden] {\r\n display: none;\r\n }\r\n ${getFocusStyle('.scroll-button')}\r\n .scroll-area {\r\n display: flex;\r\n position: relative;\r\n align-items: ${alignItems};\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scroll-behavior: smooth;\r\n -webkit-overflow-scrolling: touch;\r\n ${scrollbar ? '' : 'scrollbar-width: none;'}\r\n }\r\n ::slotted(*) {\r\n flex: 0 0 auto;\r\n }\r\n ${!scrollbar ? `\r\n .scroll-area::-webkit-scrollbar {\r\n display: none;\r\n }\r\n ` : ''}\r\n /* Fade-out gradient masks at the edges */\r\n .scroll-area::before,\r\n .scroll-area::after {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: var(--diwa-scroller-fade-width);\r\n pointer-events: none;\r\n z-index: 1;\r\n opacity: ${hasOverflow ? '1' : '0'};\r\n }\r\n .scroll-area::before {\r\n left: 0;\r\n background: var(--diwa-gradient-scrim-right);\r\n }\r\n .scroll-area::after {\r\n right: 0;\r\n background: var(--diwa-gradient-scrim-left);\r\n }\r\n `;\r\n};\r\n","import { Component, Host, Listen, Prop, State, h } from '@stencil/core';\r\nimport type { Theme } from '../../utils/styles';\r\nimport type { ScrollerScrollIndicatorPosition } from './types';\r\nimport { getComponentCss } from './diwa-scroller-styles';\r\n\r\n/**\r\n * @slot default — Items to be scrolled horizontally.\r\n */\r\n@Component({\r\n tag: 'diwa-scroller',\r\n shadow: true,\r\n})\r\nexport class DiwaScroller {\r\n /** Position of gradient fade indicators relative to the scroll area. */\r\n @Prop() alignScrollIndicator: ScrollerScrollIndicatorPosition = 'center';\r\n\r\n /** Whether to show the native horizontal scrollbar. */\r\n @Prop() scrollbar: boolean = false;\r\n\r\n /** Adapts the color when used on a light or dark background. */\r\n @Prop({ reflect: true }) theme: Theme = 'dark';\r\n\r\n @State() private hasOverflow: boolean = false;\r\n @State() private canScrollLeft: boolean = false;\r\n @State() private canScrollRight: boolean = false;\r\n\r\n private scrollAreaEl?: HTMLDivElement;\r\n\r\n @Listen('resize', { target: 'window' })\r\n handleWindowResize(): void {\r\n this.updateScrollState();\r\n }\r\n\r\n componentDidLoad(): void {\r\n this.updateScrollState();\r\n }\r\n\r\n private setScrollAreaRef = (el?: HTMLDivElement): void => {\r\n this.scrollAreaEl = el;\r\n };\r\n\r\n private handleScroll = (): void => {\r\n this.updateScrollState();\r\n };\r\n\r\n private handleSlotChange = (): void => {\r\n requestAnimationFrame(() => this.updateScrollState());\r\n };\r\n\r\n private updateScrollState(): void {\r\n const el = this.scrollAreaEl;\r\n if (!el) return;\r\n\r\n const maxScrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\r\n const currentScrollLeft = el.scrollLeft;\r\n const epsilon = 1;\r\n\r\n this.hasOverflow = maxScrollLeft > epsilon;\r\n this.canScrollLeft = currentScrollLeft > epsilon;\r\n this.canScrollRight = currentScrollLeft < maxScrollLeft - epsilon;\r\n }\r\n\r\n private scrollByPage = (direction: 'start' | 'end'): void => {\r\n const el = this.scrollAreaEl;\r\n if (!el) return;\r\n\r\n const distance = Math.max(el.clientWidth * 0.8, 1);\r\n el.scrollBy({\r\n left: direction === 'start' ? -distance : distance,\r\n behavior: 'smooth',\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n <Host data-theme={this.theme}>\r\n <style innerHTML={getComponentCss(this.scrollbar, this.alignScrollIndicator, this.hasOverflow)} />\r\n <div class=\"scroller\">\r\n <button\r\n type=\"button\"\r\n class=\"scroll-button scroll-button--start\"\r\n aria-label=\"Scroll left\"\r\n disabled={!this.canScrollLeft}\r\n hidden={!this.hasOverflow}\r\n onClick={() => this.scrollByPage('start')}\r\n >\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M10 3.5 5 8l5 4.5\" />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"scroll-area\" onScroll={this.handleScroll} ref={this.setScrollAreaRef}>\r\n <slot onSlotchange={this.handleSlotChange} />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"scroll-button scroll-button--end\"\r\n aria-label=\"Scroll right\"\r\n disabled={!this.canScrollRight}\r\n hidden={!this.hasOverflow}\r\n onClick={() => this.scrollByPage('end')}\r\n >\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M6 3.5 11 8l-5 4.5\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"version":3}
|
|
1
|
+
{"file":"diwa-scroller.js","mappings":"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","names":["DiwaScroller"],"sources":["src/components/diwa-scroller/diwa-scroller-styles.ts","src/components/diwa-scroller/diwa-scroller.tsx"],"sourcesContent":["import { getFocusStyle } from '../../utils/styles';\r\nimport type { ScrollerScrollIndicatorPosition } from './types';\r\n\r\nconst ALIGN_MAP: Record<ScrollerScrollIndicatorPosition, string> = {\r\n top: 'flex-start',\r\n center: 'center',\r\n bottom: 'flex-end',\r\n};\r\n\r\nexport const getComponentCss = (\r\n scrollbar: boolean,\r\n alignScrollIndicator: ScrollerScrollIndicatorPosition,\r\n hasOverflow: boolean,\r\n canScrollLeft: boolean,\r\n canScrollRight: boolean,\r\n): string => {\r\n const alignItems = ALIGN_MAP[alignScrollIndicator];\r\n\r\n return `\r\n :host {\r\n display: block;\r\n position: relative;\r\n }\r\n :host([hidden]) {\r\n display: none;\r\n }\r\n .scroller {\r\n display: grid;\r\n grid-template-columns: ${hasOverflow ? 'auto minmax(0, 1fr) auto' : 'minmax(0, 1fr)'};\r\n align-items: ${alignItems};\r\n gap: var(--diwa-space-2);\r\n }\r\n .scroll-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--diwa-space-8);\r\n height: var(--diwa-space-8);\r\n padding: 0;\r\n border: var(--diwa-border-width-thin) solid var(--diwa-border);\r\n border-radius: var(--diwa-radius-full);\r\n background: var(--diwa-bg-surface);\r\n color: var(--diwa-text-secondary);\r\n cursor: pointer;\r\n transition: var(--diwa-transition-colors), box-shadow var(--diwa-transition-fast);\r\n flex-shrink: 0;\r\n }\r\n .scroll-button:hover:not(:disabled) {\r\n color: var(--diwa-text-primary);\r\n background: var(--diwa-bg-hover);\r\n }\r\n .scroll-button:disabled {\r\n opacity: var(--diwa-opacity-disabled);\r\n cursor: not-allowed;\r\n }\r\n .scroll-button[hidden] {\r\n display: none;\r\n }\r\n ${getFocusStyle('.scroll-button')}\r\n ${getFocusStyle('.scroll-area')}\r\n .scroll-wrapper {\r\n position: relative;\r\n min-width: 0;\r\n overflow: hidden;\r\n }\r\n .scroll-area {\r\n display: flex;\r\n align-items: ${alignItems};\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n scroll-behavior: smooth;\r\n -webkit-overflow-scrolling: touch;\r\n ${scrollbar ? '' : 'scrollbar-width: none;'}\r\n }\r\n ::slotted(*) {\r\n flex: 0 0 auto;\r\n }\r\n ${!scrollbar ? `\r\n .scroll-area::-webkit-scrollbar {\r\n display: none;\r\n }\r\n ` : ''}\r\n /* Fade-out gradient masks — fixed at the visible edges via scroll-wrapper */\r\n .fade {\r\n position: absolute;\r\n top: 0;\r\n bottom: 0;\r\n width: var(--diwa-scroller-fade-width);\r\n pointer-events: none;\r\n z-index: 1;\r\n transition: opacity var(--diwa-transition-fast);\r\n }\r\n .fade--start {\r\n left: 0;\r\n background: var(--diwa-gradient-scrim-right);\r\n opacity: ${canScrollLeft ? '1' : '0'};\r\n }\r\n .fade--end {\r\n right: 0;\r\n background: var(--diwa-gradient-scrim-left);\r\n opacity: ${canScrollRight ? '1' : '0'};\r\n }\r\n `;\r\n};\r\n","import { Component, Host, Prop, State, h } from '@stencil/core';\r\nimport type { Theme } from '../../utils/styles';\r\nimport type { ScrollerScrollIndicatorPosition } from './types';\r\nimport { getComponentCss } from './diwa-scroller-styles';\r\n\r\n/**\r\n * @slot default — Items to be scrolled horizontally.\r\n */\r\n@Component({\r\n tag: 'diwa-scroller',\r\n shadow: true,\r\n})\r\nexport class DiwaScroller {\r\n /** Position of gradient fade indicators relative to the scroll area. */\r\n @Prop() alignScrollIndicator: ScrollerScrollIndicatorPosition = 'center';\r\n\r\n /** Whether to show the native horizontal scrollbar. */\r\n @Prop() scrollbar: boolean = false;\r\n\r\n /** Adapts the color when used on a light or dark background. */\r\n @Prop({ reflect: true }) theme: Theme = 'dark';\r\n\r\n @State() private hasOverflow: boolean = false;\r\n @State() private canScrollLeft: boolean = false;\r\n @State() private canScrollRight: boolean = false;\r\n\r\n private scrollAreaEl?: HTMLDivElement;\r\n private resizeObserver?: ResizeObserver;\r\n\r\n componentDidLoad(): void {\r\n this.updateScrollState();\r\n if (this.scrollAreaEl) {\r\n this.resizeObserver = new ResizeObserver(() => this.updateScrollState());\r\n this.resizeObserver.observe(this.scrollAreaEl);\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.resizeObserver?.disconnect();\r\n }\r\n\r\n private setScrollAreaRef = (el?: HTMLDivElement): void => {\r\n this.scrollAreaEl = el;\r\n };\r\n\r\n private handleScroll = (): void => {\r\n this.updateScrollState();\r\n };\r\n\r\n private handleSlotChange = (): void => {\r\n requestAnimationFrame(() => this.updateScrollState());\r\n };\r\n\r\n private updateScrollState(): void {\r\n const el = this.scrollAreaEl;\r\n if (!el) return;\r\n\r\n const maxScrollLeft = Math.max(0, el.scrollWidth - el.clientWidth);\r\n const currentScrollLeft = el.scrollLeft;\r\n const epsilon = 1;\r\n\r\n this.hasOverflow = maxScrollLeft > epsilon;\r\n this.canScrollLeft = currentScrollLeft > epsilon;\r\n this.canScrollRight = currentScrollLeft < maxScrollLeft - epsilon;\r\n }\r\n\r\n private scrollByPage = (direction: 'start' | 'end'): void => {\r\n const el = this.scrollAreaEl;\r\n if (!el) return;\r\n\r\n const distance = Math.max(el.clientWidth * 0.8, 1);\r\n el.scrollBy({\r\n left: direction === 'start' ? -distance : distance,\r\n behavior: 'smooth',\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n <Host data-theme={this.theme}>\r\n <style innerHTML={getComponentCss(\r\n this.scrollbar,\r\n this.alignScrollIndicator,\r\n this.hasOverflow,\r\n this.canScrollLeft,\r\n this.canScrollRight,\r\n )} />\r\n <div class=\"scroller\">\r\n <button\r\n type=\"button\"\r\n class=\"scroll-button scroll-button--start\"\r\n aria-label=\"Scroll left\"\r\n disabled={!this.canScrollLeft}\r\n hidden={!this.hasOverflow}\r\n onClick={() => this.scrollByPage('start')}\r\n >\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M10 3.5 5 8l5 4.5\" />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"scroll-wrapper\">\r\n <div\r\n class=\"scroll-area\"\r\n tabIndex={this.hasOverflow ? 0 : undefined}\r\n role={this.hasOverflow ? 'region' : undefined}\r\n aria-label={this.hasOverflow ? 'Scrollable content' : undefined}\r\n onScroll={this.handleScroll}\r\n ref={this.setScrollAreaRef}\r\n >\r\n <slot onSlotchange={this.handleSlotChange} />\r\n </div>\r\n <div class=\"fade fade--start\" aria-hidden=\"true\" />\r\n <div class=\"fade fade--end\" aria-hidden=\"true\" />\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"scroll-button scroll-button--end\"\r\n aria-label=\"Scroll right\"\r\n disabled={!this.canScrollRight}\r\n hidden={!this.hasOverflow}\r\n onClick={() => this.scrollByPage('end')}\r\n >\r\n <svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M6 3.5 11 8l-5 4.5\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"version":3}
|
|
@@ -64,7 +64,7 @@ const DiwaSegmentedControlItem$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSe
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
render() {
|
|
67
|
-
return (h(Host, { key: '
|
|
67
|
+
return (h(Host, { key: '2a0ee21e2203bc962d2cb1156ebe70b0cbc30d1e' }, h("style", { key: 'e8ff2c5b70860cc872cad97d689e16cf9c82c064', innerHTML: getComponentCss(this.selected, this.disabled, this.compact) }), h("button", { key: '112f93b906318888f5113417fdfddf0ce1aad3a8', class: "btn", type: "button", disabled: this.disabled, "aria-pressed": this.selected ? 'true' : 'false', onClick: this.handleClick }, h("slot", { key: 'bd6ef60d2fc09a59cfd8108377f1981aaefc991c' }))));
|
|
68
68
|
}
|
|
69
69
|
static get delegatesFocus() { return true; }
|
|
70
70
|
get host() { return this; }
|
|
@@ -56,7 +56,7 @@ const DiwaSegmentedControl$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSegmen
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
render() {
|
|
59
|
-
return (h(Host, { key: '
|
|
59
|
+
return (h(Host, { key: 'a234c388f48d3c866ffdab8c6eadc9b8bb5af4c8', role: "group", "data-theme": this.theme }, h("style", { key: 'bfad2e8a1da5a8395b9dcc3662913ff13f4607fe', innerHTML: getComponentCss() }), h("div", { key: 'f08d1b1bdd31d095333e51ac72ae3f40ebd27812', class: "track" }, h("slot", { key: 'b5ff001d635e09aa097cd8b3b6b32500490a19da' }))));
|
|
60
60
|
}
|
|
61
61
|
get host() { return this; }
|
|
62
62
|
}, [1, "diwa-segmented-control", {
|
|
@@ -59,15 +59,15 @@ const getComponentCss = () => `
|
|
|
59
59
|
|
|
60
60
|
/* ── Highlighted (keyboard / hover) ─────────────────────────────────── */
|
|
61
61
|
|
|
62
|
-
:host([highlighted]) .option {
|
|
63
|
-
background-color: var(--diwa-bg-hover);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
@media (hover: hover) and (pointer: fine) {
|
|
67
|
-
.option:hover {
|
|
68
|
-
background-color: var(--diwa-bg-hover);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
62
|
+
:host([highlighted]) .option {
|
|
63
|
+
background-color: var(--diwa-bg-hover);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@media (hover: hover) and (pointer: fine) {
|
|
67
|
+
.option:hover {
|
|
68
|
+
background-color: var(--diwa-bg-hover);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
71
|
|
|
72
72
|
/* ── Label text ─────────────────────────────────────────────────────── */
|
|
73
73
|
|
|
@@ -79,6 +79,18 @@ const getComponentCss = () => `
|
|
|
79
79
|
white-space: nowrap;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/* ── Compact ────────────────────────────────────────────────────────── */
|
|
83
|
+
|
|
84
|
+
:host([compact]) .option {
|
|
85
|
+
padding: var(--diwa-space-1) var(--diwa-space-2);
|
|
86
|
+
font-size: var(--diwa-font-size-md);
|
|
87
|
+
min-height: 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:host([compact]) .check {
|
|
91
|
+
font-size: var(--diwa-font-size-md);
|
|
92
|
+
}
|
|
93
|
+
|
|
82
94
|
/* ── Disabled ───────────────────────────────────────────────────────── */
|
|
83
95
|
|
|
84
96
|
:host([disabled]) {
|
|
@@ -115,6 +127,8 @@ const DiwaSelectOption$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelectOpti
|
|
|
115
127
|
this.highlighted = false;
|
|
116
128
|
/** Theme — inherited from the parent diwa-select. */
|
|
117
129
|
this.theme = 'dark';
|
|
130
|
+
/** Compact mode — inherited from the parent diwa-select. */
|
|
131
|
+
this.compact = false;
|
|
118
132
|
this.handleClick = () => {
|
|
119
133
|
if (this.disabled)
|
|
120
134
|
return;
|
|
@@ -135,7 +149,7 @@ const DiwaSelectOption$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelectOpti
|
|
|
135
149
|
(_a = this.optionEl) === null || _a === void 0 ? void 0 : _a.focus();
|
|
136
150
|
}
|
|
137
151
|
render() {
|
|
138
|
-
return (h(Host, { key: '
|
|
152
|
+
return (h(Host, { key: '86c5dd52dbfc96056c5031be22e751c4c741527f', "data-theme": this.theme }, h("style", { key: '903154a75ff36b77647ee2c769717e5f1df574e6', innerHTML: getComponentCss() }), h("div", { key: 'c95e357baac1fd10642383cb4259d29dd356825e', class: "option", role: "option", "aria-selected": this.selected ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, tabIndex: this.disabled ? -1 : 0, onClick: this.handleClick, onKeyDown: this.handleKeyDown, ref: (el) => (this.optionEl = el), part: "option" }, h("span", { key: '902e2a17f8bbff2e450349f5e2ef1df3d5b54df7', class: "check", "aria-hidden": "true", part: "check" }, "\u2713"), h("span", { key: '535f939bb208a6dad985b803ef18ebb240cd2c30', class: "label", part: "label" }, h("slot", { key: '055c66f037f5783f2aad7256a15dbfae034b5796' })))));
|
|
139
153
|
}
|
|
140
154
|
static get delegatesFocus() { return true; }
|
|
141
155
|
get host() { return this; }
|
|
@@ -145,6 +159,7 @@ const DiwaSelectOption$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelectOpti
|
|
|
145
159
|
"selected": [1540],
|
|
146
160
|
"highlighted": [1540],
|
|
147
161
|
"theme": [1025],
|
|
162
|
+
"compact": [1540],
|
|
148
163
|
"setFocus": [64]
|
|
149
164
|
}]);
|
|
150
165
|
function defineCustomElement$1() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"diwa-select-option.js","mappings":";;;AAEO,MAAM,eAAe,GAAG,MAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiCzC,aAAa,CAAC,SAAS,CAAC
|
|
1
|
+
{"file":"diwa-select-option.js","mappings":";;;AAEO,MAAM,eAAe,GAAG,MAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiCzC,aAAa,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsExB,qBAAqB,CAAC,SAAS,CAAC;CACnC;;MCrFYA,kBAAgB;IAJ7B;;;;;;QAW2B,aAAQ,GAAY,KAAK,CAAC;;;;;QAMX,aAAQ,GAAY,KAAK,CAAC;;;;;QAM1B,gBAAW,GAAY,KAAK,CAAC;;QAG5C,UAAK,GAAU,MAAM,CAAC;;QAGP,YAAO,GAAY,KAAK,CAAC;QAiBzD,gBAAW,GAAG;YACpB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACzD,CAAC;QAEM,kBAAa,GAAG,CAAC,CAAgB;YACvC,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE;gBACtC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;aACzD;SACF,CAAC;KAyBH;;IA1CC,MAAM,QAAQ;;QACZ,MAAA,IAAI,CAAC,QAAQ,0CAAE,KAAK,EAAE,CAAC;KACxB;IAiBD,MAAM;QACJ,QACE,EAAC,IAAI,mEAAa,IAAI,CAAC,KAAK,IAC1B,8DAAO,SAAS,EAAE,eAAe,EAAE,GAAI,EACvC,4DACE,KAAK,EAAC,QAAQ,EACd,IAAI,EAAC,QAAQ,mBACE,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,OAAO,mBAChC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS,EACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EAChC,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,SAAS,EAAE,IAAI,CAAC,aAAa,EAC7B,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,QAAQ,GAAG,EAAoB,CAAC,EACnD,IAAI,EAAC,QAAQ,IAEb,6DAAM,KAAK,EAAC,OAAO,iBAAa,MAAM,EAAC,IAAI,EAAC,OAAO,aAAS,EAC5D,6DAAM,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,IAC9B,8DAAQ,CACH,CACH,CACD,EACP;KACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["DiwaSelectOption"],"sources":["src/components/diwa-select-option/diwa-select-option-styles.ts","src/components/diwa-select-option/diwa-select-option.tsx"],"sourcesContent":["import { getFocusStyle, getReducedMotionStyle } from '../../utils/styles';\r\n\r\nexport const getComponentCss = (): string => `\r\n /* ── Host ──────────────────────────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n font-family: var(--diwa-font-family-base);\r\n outline: none;\r\n }\r\n\r\n :host([hidden]) {\r\n display: none;\r\n }\r\n\r\n /* ── Option row ─────────────────────────────────────────────────────── */\r\n\r\n .option {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--diwa-space-3);\r\n padding: var(--diwa-space-2) var(--diwa-space-3);\r\n min-height: var(--diwa-select-option-min-height);\r\n box-sizing: border-box;\r\n cursor: pointer;\r\n user-select: none;\r\n -webkit-font-smoothing: antialiased;\r\n color: var(--diwa-text-primary);\r\n font-size: var(--diwa-font-size-base);\r\n font-weight: var(--diwa-font-weight-normal);\r\n line-height: 1.4;\r\n border-radius: var(--diwa-radius-sm);\r\n transition: background-color var(--diwa-transition-fast);\r\n }\r\n\r\n ${getFocusStyle('.option')}\r\n\r\n /* ── Check mark ─────────────────────────────────────────────────────── */\r\n\r\n .check {\r\n flex-shrink: 0;\r\n width: var(--diwa-icon-size-md);\r\n height: var(--diwa-icon-size-md);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--diwa-accent);\r\n font-size: var(--diwa-font-size-base);\r\n line-height: 1;\r\n visibility: hidden;\r\n }\r\n\r\n /* ── Selected state ─────────────────────────────────────────────────── */\r\n\r\n :host([selected]) .check {\r\n visibility: visible;\r\n }\r\n\r\n /* ── Highlighted (keyboard / hover) ─────────────────────────────────── */\r\n\r\n :host([highlighted]) .option {\r\n background-color: var(--diwa-bg-hover);\r\n }\r\n\r\n @media (hover: hover) and (pointer: fine) {\r\n .option:hover {\r\n background-color: var(--diwa-bg-hover);\r\n }\r\n }\r\n\r\n /* ── Label text ─────────────────────────────────────────────────────── */\r\n\r\n .label {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n /* ── Compact ────────────────────────────────────────────────────────── */\r\n\r\n :host([compact]) .option {\r\n padding: var(--diwa-space-1) var(--diwa-space-2);\r\n font-size: var(--diwa-font-size-md);\r\n min-height: 0;\r\n }\r\n\r\n :host([compact]) .check {\r\n font-size: var(--diwa-font-size-md);\r\n }\r\n\r\n /* ── Disabled ───────────────────────────────────────────────────────── */\r\n\r\n :host([disabled]) {\r\n pointer-events: none;\r\n }\r\n\r\n :host([disabled]) .option {\r\n opacity: var(--diwa-opacity-disabled);\r\n cursor: not-allowed;\r\n }\r\n\r\n /* ── Reduced motion ─────────────────────────────────────────────────── */\r\n\r\n ${getReducedMotionStyle('.option')}\r\n`;\r\n","import { Component, Element, Event, type EventEmitter, Host, Method, Prop, h } from '@stencil/core';\r\nimport type { Theme } from '../../utils/styles';\r\nimport { getComponentCss } from './diwa-select-option-styles';\r\n\r\n/**\r\n * @component diwa-select-option\r\n *\r\n * Individual option element for use inside <diwa-select>.\r\n * Renders a row with a checkmark indicator and label text.\r\n *\r\n * Not intended for standalone use — must be slotted into <diwa-select>.\r\n *\r\n * Provide an option without a value to allow deselection / show a placeholder:\r\n * <diwa-select-option>Please select…</diwa-select-option>\r\n *\r\n * @slot default — Option label text (plain text or inline phrasing content)\r\n */\r\n@Component({\r\n tag: 'diwa-select-option',\r\n shadow: { delegatesFocus: true },\r\n})\r\nexport class DiwaSelectOption {\r\n @Element() host!: HTMLDiwaSelectOptionElement;\r\n\r\n /** The value submitted/emitted when this option is selected. */\r\n @Prop({ reflect: true }) value?: string;\r\n\r\n /** Disables the option — it cannot be selected. */\r\n @Prop({ reflect: true }) disabled: boolean = false;\r\n\r\n /**\r\n * Whether the option is currently selected.\r\n * Maintained by the parent <diwa-select>.\r\n */\r\n @Prop({ mutable: true, reflect: true }) selected: boolean = false;\r\n\r\n /**\r\n * Whether the option is currently keyboard-highlighted.\r\n * Set exclusively by the parent component.\r\n */\r\n @Prop({ mutable: true, reflect: true }) highlighted: boolean = false;\r\n\r\n /** Theme — inherited from the parent diwa-select. */\r\n @Prop({ mutable: true }) theme: Theme = 'dark';\r\n\r\n /** Compact mode — inherited from the parent diwa-select. */\r\n @Prop({ mutable: true, reflect: true }) compact: boolean = false;\r\n\r\n /**\r\n * Emitted when the user clicks or presses Enter on the option.\r\n * Bubbles and crosses Shadow DOM so the parent can catch it via @Listen.\r\n */\r\n @Event({ bubbles: true, composed: true })\r\n diwaSelectOptionUpdate!: EventEmitter<{ value: string | undefined }>;\r\n\r\n /** Focuses the inner option element. */\r\n @Method()\r\n async setFocus(): Promise<void> {\r\n this.optionEl?.focus();\r\n }\r\n\r\n private optionEl?: HTMLDivElement;\r\n\r\n private handleClick = (): void => {\r\n if (this.disabled) return;\r\n this.diwaSelectOptionUpdate.emit({ value: this.value });\r\n };\r\n\r\n private handleKeyDown = (e: KeyboardEvent): void => {\r\n if (this.disabled) return;\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n this.diwaSelectOptionUpdate.emit({ value: this.value });\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n <Host data-theme={this.theme}>\r\n <style innerHTML={getComponentCss()} />\r\n <div\r\n class=\"option\"\r\n role=\"option\"\r\n aria-selected={this.selected ? 'true' : 'false'}\r\n aria-disabled={this.disabled ? 'true' : undefined}\r\n tabIndex={this.disabled ? -1 : 0}\r\n onClick={this.handleClick}\r\n onKeyDown={this.handleKeyDown}\r\n ref={(el) => (this.optionEl = el as HTMLDivElement)}\r\n part=\"option\"\r\n >\r\n <span class=\"check\" aria-hidden=\"true\" part=\"check\">✓</span>\r\n <span class=\"label\" part=\"label\">\r\n <slot />\r\n </span>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"version":3}
|
|
@@ -400,6 +400,9 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
400
400
|
onThemeChange() {
|
|
401
401
|
this.syncChildThemes();
|
|
402
402
|
}
|
|
403
|
+
onCompactChange() {
|
|
404
|
+
this.syncChildCompact();
|
|
405
|
+
}
|
|
403
406
|
onValueChange() {
|
|
404
407
|
this.syncSelectionFromValue();
|
|
405
408
|
}
|
|
@@ -433,6 +436,7 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
433
436
|
this.collectOptions();
|
|
434
437
|
this.syncSelectionFromValue();
|
|
435
438
|
this.syncChildThemes();
|
|
439
|
+
this.syncChildCompact();
|
|
436
440
|
}
|
|
437
441
|
// ──────────────────────────────────────────────────────────────
|
|
438
442
|
// Public methods
|
|
@@ -464,6 +468,7 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
464
468
|
this.collectOptions();
|
|
465
469
|
this.syncSelectionFromValue();
|
|
466
470
|
this.syncChildThemes();
|
|
471
|
+
this.syncChildCompact();
|
|
467
472
|
}
|
|
468
473
|
// ──────────────────────────────────────────────────────────────
|
|
469
474
|
// Private helpers
|
|
@@ -488,6 +493,14 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
488
493
|
}
|
|
489
494
|
}
|
|
490
495
|
}
|
|
496
|
+
syncChildCompact() {
|
|
497
|
+
for (const opt of this.options) {
|
|
498
|
+
if (opt.compact !== this.compact) {
|
|
499
|
+
opt.compact = this.compact;
|
|
500
|
+
forceUpdate(opt);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
491
504
|
getVisibleOptions() {
|
|
492
505
|
return this.options.filter((o) => !o.disabled && o.style.display !== 'none');
|
|
493
506
|
}
|
|
@@ -544,12 +557,13 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
544
557
|
const hasMessage = !!this.message && this.state !== 'none';
|
|
545
558
|
const hasValue = this.value !== undefined && this.value !== '';
|
|
546
559
|
const displayLabel = hasValue ? this.selectedLabel : undefined;
|
|
547
|
-
return (h(Host, { key: '
|
|
560
|
+
return (h(Host, { key: '78cb284c75c35d7a8c9c55c65a1b2da507cb3825', "data-theme": this.theme }, h("style", { key: '56535329000ff0addc23203c53161262d077d0ae', innerHTML: getComponentCss(this.isOpen, this.disabled, this.state, this.compact, this.dropdownClass.includes('--up')) }), (this.label || this.host.querySelector('[slot="label"]')) && (h("span", { key: 'a50ee541c02fddefb765c9e8be397bc5fd8fdbe3', class: "label", id: labelId, part: "label" }, h("slot", { key: '5acac4fc52daaa0a7e8137f41bd0b5e91ba4be86', name: "label" }, this.label), this.required && h("span", { key: '1f61ca50a28561365e8491e108268680b0e1ccf1', class: "label__required", "aria-hidden": "true" }, "*"))), (this.description || this.host.querySelector('[slot="description"]')) && (h("span", { key: '41e461a959513a8dafe4a8fd6d7c7c0597dd11be', class: "description", part: "description" }, h("slot", { key: '33f083c62405b70fd4df87ccd5770946778a168c', name: "description" }, this.description))), h("div", { key: '88a408a5abaa1f4c48f54b8dda240a3ee8ed3a5e', class: "trigger", role: "combobox", "aria-haspopup": "listbox", "aria-expanded": this.isOpen ? 'true' : 'false', "aria-controls": listboxId, "aria-labelledby": this.label ? labelId : undefined, "aria-required": this.required ? 'true' : undefined, "aria-invalid": this.state === 'error' ? 'true' : undefined, "aria-describedby": hasMessage ? hintId : undefined, tabIndex: this.disabled ? -1 : 0, onClick: this.onTriggerClick, onKeyDown: this.onTriggerKeyDown, ref: (el) => (this.triggerEl = el), part: "trigger" }, h("span", { key: 'c397c30576a9396ca26a150d4b31686b34324c50', class: `trigger__value${!displayLabel ? ' trigger__placeholder' : ''}`, part: "value" }, displayLabel !== null && displayLabel !== void 0 ? displayLabel : (this.label || 'Select an option')), h("span", { key: '3c4c6ba3dfc5e53102754e8c8f99b01041cb034c', class: "trigger__chevron", "aria-hidden": "true", part: "chevron" }, h("svg", { key: '9d7a5b129826e3d448c3cebb41cd1c6cba9af980', viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("polyline", { key: '6c4b2336e5e0968cb79034a17c12ef7f1475d1d4', points: "6 9 12 15 18 9" })))), h("div", { key: '9a004e9726798f987e73de928cff74aae2192eba', class: this.dropdownClass, role: "listbox", id: listboxId, "aria-multiselectable": "false", "aria-labelledby": this.label ? labelId : undefined, part: "dropdown" }, h("div", { key: 'be02228e7c2763174b84c98665e43c1b41be96c4', class: "filter", part: "filter" }, h("input", { key: 'df2a97b9017bf0fa550ddd7edf81bb5b63daa567', class: "filter__input", type: "text", placeholder: "Filter options\u2026", "aria-label": "Filter options", onInput: this.onFilterInput, ref: (el) => (this.filterInputEl = el), part: "filter-input" })), h("div", { key: 'f1b7dff287feb28cacea9353263a3efb530d77f2', class: "options", part: "options" }, !this.hasFilterResults && (h("div", { key: '11c5108f2e3e2e1ae36e2f4f15f5da49b5e4f645', class: "no-results", "aria-live": "polite" }, "No options found")), h("slot", { key: 'f220f388ef3964448427dd45943193bce7419f88' }))), hasMessage && (h("span", { key: '8ceca0f175af448577d629581d39a44dfd39f63f', class: "message", id: hintId, role: "status", part: "message" }, h("slot", { key: '91c7a0c99fa7a642ba0987cbab196d61e61cea9e', name: "message" }, this.message)))));
|
|
548
561
|
}
|
|
549
562
|
static get delegatesFocus() { return true; }
|
|
550
563
|
get host() { return this; }
|
|
551
564
|
static get watchers() { return {
|
|
552
565
|
"theme": ["onThemeChange"],
|
|
566
|
+
"compact": ["onCompactChange"],
|
|
553
567
|
"value": ["onValueChange"],
|
|
554
568
|
"isOpen": ["onIsOpenChange"]
|
|
555
569
|
}; }
|
|
@@ -573,6 +587,7 @@ const DiwaSelect$1 = /*@__PURE__*/ proxyCustomElement(class DiwaSelect extends H
|
|
|
573
587
|
"close": [64]
|
|
574
588
|
}, [[0, "diwaSelectOptionUpdate", "onOptionUpdate"], [0, "slotchange", "onSlotChange"]], {
|
|
575
589
|
"theme": ["onThemeChange"],
|
|
590
|
+
"compact": ["onCompactChange"],
|
|
576
591
|
"value": ["onValueChange"],
|
|
577
592
|
"isOpen": ["onIsOpenChange"]
|
|
578
593
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"diwa-select.js","mappings":"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","names":["DiwaSelect"],"sources":["src/components/diwa-select/diwa-select-styles.ts","src/components/diwa-select/diwa-select.tsx"],"sourcesContent":["import { getFocusStyle, getReducedMotionStyle } from '../../utils/styles';\nimport type { SelectState } from './types';\r\n\r\nexport const getComponentCss = (\r\n isOpen: boolean,\r\n _disabled: boolean,\r\n _state: SelectState,\r\n _compact: boolean,\r\n isUp: boolean = false,\r\n): string => `\r\n /* ── Host ──────────────────────────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n min-width: 0;\r\n font-family: var(--diwa-font-family-base);\r\n outline: none;\r\n }\r\n\r\n :host([hidden]) {\r\n display: none;\r\n }\r\n\r\n /* ── Label ──────────────────────────────────────────────────────────── */\r\n\r\n .label {\r\n display: block;\r\n margin-bottom: var(--diwa-space-1);\r\n font-size: var(--diwa-font-size-sm);\r\n font-weight: var(--diwa-font-weight-semibold);\r\n color: var(--diwa-text-secondary);\r\n line-height: var(--diwa-line-height-normal);\r\n cursor: default;\r\n }\r\n\r\n :host([hide-label]) .label {\r\n border: 0;\r\n clip: rect(0, 0, 0, 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n white-space: nowrap;\r\n width: 1px;\r\n }\r\n\r\n .label__required {\r\n color: var(--diwa-notification-error);\r\n font-weight: var(--diwa-font-weight-semibold);\r\n margin-left: var(--diwa-space-1);\r\n }\r\n\r\n /* ── Description ────────────────────────────────────────────────────── */\r\n\r\n .description {\r\n display: block;\r\n margin-bottom: var(--diwa-space-2);\r\n font-size: var(--diwa-font-size-sm);\r\n color: var(--diwa-text-secondary);\r\n line-height: var(--diwa-line-height-normal);\r\n }\r\n\r\n /* ── Trigger ────────────────────────────────────────────────────────── */\r\n\r\n .trigger {\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n min-height: var(--diwa-input-height, var(--diwa-touch-target-min-size, 44px));\n padding: 0 var(--diwa-space-3);\r\n box-sizing: border-box;\r\n gap: var(--diwa-space-2);\r\n\r\n background: var(--diwa-input-bg, var(--diwa-bg-input));\r\n border: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n border-radius: var(--diwa-input-radius, var(--diwa-radius-md));\r\n\r\n font-size: var(--diwa-font-size-base);\r\n font-weight: var(--diwa-font-weight-normal);\r\n font-family: inherit;\r\n color: var(--diwa-text-primary);\r\n text-align: left;\r\n line-height: 1;\r\n\r\n cursor: pointer;\r\n user-select: none;\r\n -webkit-font-smoothing: antialiased;\r\n\r\n transition: border-color var(--diwa-transition-fast), background var(--diwa-transition-fast);\r\n appearance: none;\r\n -webkit-appearance: none;\r\n }\r\n\r\n @media (hover: hover) and (pointer: fine) {\n :host(:not([disabled])) .trigger:hover {\n border-color: var(--diwa-border-hover);\n }\n }\n\r\n ${isOpen && !isUp ? '.trigger { border-color: var(--diwa-border-focus); border-radius: var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)) 0 0; }' : ''}\r\n ${isOpen && isUp ? '.trigger { border-color: var(--diwa-border-focus); border-radius: 0 0 var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)); }' : ''}\r\n\r\n /* ── Focus ring on trigger itself ───────────────────────────────────── */\r\n\r\n ${getFocusStyle('.trigger')}\r\n\r\n /* ── Selected text ──────────────────────────────────────────────────── */\r\n\r\n .trigger__value {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .trigger__placeholder {\r\n color: var(--diwa-text-secondary);\r\n }\r\n\r\n /* ── Chevron icon ───────────────────────────────────────────────────── */\r\n\r\n .trigger__chevron {\r\n flex-shrink: 0;\r\n width: var(--diwa-icon-size-md);\r\n height: var(--diwa-icon-size-md);\r\n color: var(--diwa-text-secondary);\r\n transition: transform var(--diwa-transition-fast);\r\n ${isOpen ? 'transform: rotate(180deg);' : ''}\r\n }\r\n\r\n .trigger__chevron svg {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n /* ── Dropdown panel ─────────────────────────────────────────────────── */\r\n\r\n .dropdown {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n z-index: var(--diwa-z-dropdown);\r\n background-color: var(--diwa-bg-elevated);\r\n border: var(--diwa-border-width-thin) solid var(--diwa-border-focus);\r\n border-top: none;\r\n border-radius: 0 0 var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md));\r\n overflow: hidden;\r\n box-shadow: var(--diwa-shadow-lg);\r\n display: ${isOpen ? 'block' : 'none'};\r\n }\r\n\r\n .dropdown--up {\r\n top: auto;\r\n bottom: 100%;\r\n border-top: var(--diwa-border-width-thin) solid var(--diwa-border-focus);\r\n border-bottom: none;\r\n border-radius: var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)) 0 0;\r\n margin-bottom: -1px;\r\n }\r\n\r\n /* ── Filter input ───────────────────────────────────────────────────── */\r\n\r\n .filter {\r\n padding: var(--diwa-space-2) var(--diwa-space-2) var(--diwa-space-1);\r\n border-bottom: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n }\r\n\r\n .filter__input {\r\n width: 100%;\r\n box-sizing: border-box;\r\n padding: var(--diwa-space-2) var(--diwa-space-3);\r\n background: var(--diwa-input-bg, var(--diwa-bg-input));\r\n border: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n border-radius: var(--diwa-radius-sm);\r\n color: var(--diwa-text-primary);\r\n font-size: var(--diwa-font-size-sm);\r\n font-family: inherit;\r\n outline: none;\r\n transition: border-color var(--diwa-transition-fast);\r\n }\r\n\r\n .filter__input::placeholder {\n color: var(--diwa-text-secondary);\n }\n\n .filter__input:focus-visible {\n outline: var(--diwa-focus-ring-width) solid var(--diwa-border-focus);\n outline-offset: var(--diwa-focus-ring-offset);\n }\n\n .filter__input:focus:not(:focus-visible) {\n outline: none;\n }\n\r\n /* ── Options list ───────────────────────────────────────────────────── */\r\n\r\n .options {\r\n max-height: var(--diwa-select-dropdown-max-height);\r\n overflow-y: auto;\r\n padding: var(--diwa-space-1);\r\n }\r\n\r\n .options::-webkit-scrollbar {\r\n width: var(--diwa-scrollbar-width);\r\n }\r\n\r\n .options::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n\r\n .options::-webkit-scrollbar-thumb {\r\n background-color: var(--diwa-border);\r\n border-radius: var(--diwa-radius-sm);\r\n }\r\n\r\n /* ── Compact ────────────────────────────────────────────────────────── */\r\n\r\n :host([compact]) .trigger {\n min-height: var(--diwa-touch-target-min-size-compact, 32px);\n font-size: var(--diwa-font-size-md);\n padding: 0 var(--diwa-space-2);\n }\n\r\n /* ── States: error / success ────────────────────────────────────────── */\r\n\r\n :host([state=\"error\"]) .trigger {\r\n border-color: var(--diwa-notification-error);\r\n }\r\n\r\n :host([state=\"success\"]) .trigger {\r\n border-color: var(--diwa-notification-success);\r\n }\r\n\r\n /* ── Message ────────────────────────────────────────────────────────── */\r\n\r\n .message {\r\n display: block;\r\n margin-top: var(--diwa-space-1);\r\n font-size: var(--diwa-font-size-sm);\r\n line-height: var(--diwa-line-height-normal);\r\n color: var(--diwa-text-secondary);\r\n }\r\n\r\n :host([state=\"error\"]) .message {\r\n color: var(--diwa-notification-error);\r\n }\r\n\r\n :host([state=\"success\"]) .message {\r\n color: var(--diwa-notification-success);\r\n }\r\n\r\n /* ── Disabled ───────────────────────────────────────────────────────── */\r\n\r\n :host([disabled]) .trigger {\r\n opacity: var(--diwa-opacity-disabled);\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n :host([disabled]) .label {\r\n opacity: var(--diwa-opacity-disabled);\r\n }\r\n\r\n /* ── Reduced motion ─────────────────────────────────────────────────── */\r\n\r\n ${getReducedMotionStyle('.trigger', '.trigger__chevron', '.filter__input')}\r\n`;\r\n\r\n\r\n","import {\r\n Component,\r\n Element,\r\n Event,\r\n type EventEmitter,\r\n Host,\r\n Listen,\r\n Method,\r\n Prop,\r\n State,\r\n Watch,\r\n forceUpdate,\r\n h,\r\n} from '@stencil/core';\r\nimport type {\r\n SelectChangeEventDetail,\r\n SelectDropdownDirection,\r\n SelectState,\r\n SelectTheme,\r\n SelectToggleEventDetail,\r\n} from './types';\r\nimport { getComponentCss } from './diwa-select-styles';\r\n\r\n/** Module-level counter for unique IDs. */\r\nlet selectIdCounter = 0;\r\n\r\n/**\r\n * @component diwa-select\r\n *\r\n * A fully accessible single-select dropdown with built-in text filter,\r\n * keyboard navigation, and form integration.\r\n *\r\n * Based on the Diwa select API contract.\n *\r\n * Usage:\r\n * <diwa-select name=\"fruit\" label=\"Favourite fruit\">\r\n * <diwa-select-option>Please select…</diwa-select-option>\r\n * <diwa-select-option value=\"apple\">Apple</diwa-select-option>\r\n * <diwa-select-option value=\"banana\">Banana</diwa-select-option>\r\n * </diwa-select>\r\n *\r\n * @slot default — diwa-select-option elements\r\n * @slot label — Custom label content (overrides the label prop)\r\n * @slot description — Custom description content\r\n * @slot message — Custom message content\r\n */\r\n@Component({\r\n tag: 'diwa-select',\r\n shadow: { delegatesFocus: true },\r\n})\r\nexport class DiwaSelect {\r\n @Element() host!: HTMLElement;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Props\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Theme — cascades down to child options. */\r\n @Prop({ reflect: true }) theme: SelectTheme = 'dark';\r\n\r\n /** Visible label text. */\r\n @Prop() label?: string;\r\n\r\n /** Optional description shown below the label. */\r\n @Prop() description?: string;\r\n\r\n /** HTML name attribute — identifies the field in form submissions. */\r\n @Prop() name: string = '';\r\n\r\n /** Currently selected value. Mutable — updated on user interaction. */\r\n @Prop({ mutable: true }) value?: string;\r\n\r\n /** Validation state. */\r\n @Prop({ reflect: true }) state: SelectState = 'none';\r\n\r\n /** Helper / validation message shown below the trigger. */\r\n @Prop() message?: string;\r\n\r\n /** Hides the label visually while keeping it accessible. */\r\n @Prop({ reflect: true, attribute: 'hide-label' }) hideLabel: boolean = false;\r\n\r\n /** Disables interaction. */\r\n @Prop({ reflect: true }) disabled: boolean = false;\r\n\r\n /** Marks the field as required. */\r\n @Prop() required: boolean = false;\r\n\r\n /** Compact variant — reduces the trigger height. */\r\n @Prop({ reflect: true }) compact: boolean = false;\r\n\r\n /**\r\n * Preferred direction for the dropdown panel.\r\n * `'auto'` detects viewport space and flips upward if needed.\r\n */\r\n @Prop() dropdownDirection: SelectDropdownDirection = 'auto';\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Events\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Emitted when the selection changes. */\r\n @Event({ bubbles: true })\r\n change!: EventEmitter<SelectChangeEventDetail>;\r\n\r\n /** Emitted when the dropdown opens or closes. */\r\n @Event({ bubbles: false })\r\n toggle!: EventEmitter<SelectToggleEventDetail>;\r\n\r\n /** Emitted when the component loses focus (dropdown closes via click-outside). */\r\n @Event({ bubbles: false })\r\n blur!: EventEmitter<void>;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Internal state\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @State() private isOpen: boolean = false;\r\n @State() private hasFilterResults: boolean = true;\r\n @State() private dropdownClass: string = 'dropdown';\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Private refs / tracking\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private internalId: string = `diwa-s-${++selectIdCounter}`;\r\n private triggerEl!: HTMLDivElement;\r\n private filterInputEl?: HTMLInputElement;\r\n private options: HTMLDiwaSelectOptionElement[] = [];\r\n private highlightedIndex: number = -1;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Watchers\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @Watch('theme')\r\n onThemeChange(): void {\r\n this.syncChildThemes();\r\n }\r\n\r\n @Watch('value')\r\n onValueChange(): void {\r\n this.syncSelectionFromValue();\r\n }\r\n\r\n @Watch('isOpen')\r\n onIsOpenChange(open: boolean): void {\r\n this.toggle.emit({ open });\r\n if (open) {\r\n this.updateDropdownDirection();\r\n this.highlightedIndex = this.getFirstHighlightIndex();\r\n this.applyHighlight();\r\n requestAnimationFrame(() => {\r\n this.filterInputEl?.focus();\r\n });\r\n } else {\r\n this.clearHighlight();\r\n this.highlightedIndex = -1;\r\n this.resetFilter();\r\n }\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Lifecycle\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n connectedCallback(): void {\r\n document.addEventListener('mousedown', this.onClickOutside, true);\r\n }\r\n\r\n disconnectedCallback(): void {\r\n document.removeEventListener('mousedown', this.onClickOutside, true);\r\n }\r\n\r\n componentDidLoad(): void {\r\n this.collectOptions();\r\n this.syncSelectionFromValue();\r\n this.syncChildThemes();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Public methods\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Programmatically opens the dropdown. */\r\n @Method()\r\n async open(): Promise<void> {\r\n this.isOpen = true;\r\n }\r\n\r\n /** Programmatically closes the dropdown. */\r\n @Method()\r\n async close(): Promise<void> {\r\n this.isOpen = false;\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Event listeners\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @Listen('diwaSelectOptionUpdate')\r\n onOptionUpdate(e: CustomEvent<{ value: string | undefined }>): void {\r\n e.stopPropagation();\r\n this.value = e.detail.value;\r\n this.syncSelectionFromValue();\r\n this.change.emit({ name: this.name, value: this.value ?? '' });\r\n this.isOpen = false;\r\n forceUpdate(this.host);\r\n requestAnimationFrame(() => {\r\n this.triggerEl.focus();\r\n });\r\n }\r\n\r\n @Listen('slotchange')\r\n onSlotChange(): void {\r\n this.collectOptions();\r\n this.syncSelectionFromValue();\r\n this.syncChildThemes();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Private helpers\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private collectOptions(): void {\r\n this.options = Array.from(\r\n this.host.querySelectorAll<HTMLDiwaSelectOptionElement>('diwa-select-option'),\r\n );\r\n }\r\n\r\n private syncSelectionFromValue(): void {\r\n for (const opt of this.options) {\r\n const shouldBeSelected = opt.value !== undefined && opt.value === this.value;\r\n if (opt.selected !== shouldBeSelected) {\r\n opt.selected = shouldBeSelected;\r\n forceUpdate(opt);\r\n }\r\n }\r\n }\r\n\r\n private syncChildThemes(): void {\r\n for (const opt of this.options) {\r\n if (opt.theme !== this.theme) {\r\n opt.theme = this.theme;\r\n forceUpdate(opt);\r\n }\r\n }\r\n }\r\n\r\n private getVisibleOptions(): HTMLDiwaSelectOptionElement[] {\r\n return this.options.filter((o) => !o.disabled && o.style.display !== 'none');\r\n }\r\n\r\n private getFirstHighlightIndex(): number {\r\n const visible = this.getVisibleOptions();\r\n const firstSelected = visible.findIndex((o) => o.selected);\r\n return firstSelected >= 0 ? firstSelected : 0;\r\n }\r\n\r\n private applyHighlight(): void {\r\n const visible = this.getVisibleOptions();\r\n visible.forEach((opt, i) => {\r\n opt.highlighted = i === this.highlightedIndex;\r\n });\r\n }\r\n\r\n private clearHighlight(): void {\r\n for (const opt of this.options) {\r\n if (opt.highlighted) opt.highlighted = false;\r\n }\r\n this.highlightedIndex = -1;\r\n }\r\n\r\n private updateDropdownDirection(): void {\r\n if (this.dropdownDirection !== 'auto') {\r\n this.dropdownClass = this.dropdownDirection === 'up' ? 'dropdown dropdown--up' : 'dropdown';\r\n return;\r\n }\r\n const rect = this.triggerEl.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.dropdownClass = spaceBelow < 260 ? 'dropdown dropdown--up' : 'dropdown';\r\n }\r\n\r\n private resetFilter(): void {\r\n if (this.filterInputEl) this.filterInputEl.value = '';\r\n this.hasFilterResults = true;\r\n for (const opt of this.options) {\r\n opt.style.display = '';\r\n }\r\n }\r\n\r\n private onClickOutside = (e: MouseEvent): void => {\r\n if (!this.isOpen) return;\r\n const path = e.composedPath();\r\n if (!path.includes(this.host)) {\r\n this.isOpen = false;\r\n this.blur.emit();\r\n }\r\n };\r\n\r\n private onTriggerClick = (): void => {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n };\r\n\r\n private onTriggerKeyDown = (e: KeyboardEvent): void => {\r\n if (this.disabled) return;\r\n\r\n if (!this.isOpen) {\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n this.isOpen = true;\r\n }\r\n return;\r\n }\r\n\r\n switch (e.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n e.preventDefault();\r\n this.isOpen = false;\r\n this.triggerEl.focus();\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n e.preventDefault();\r\n const visible = this.getVisibleOptions();\r\n this.highlightedIndex = Math.min(this.highlightedIndex + 1, visible.length - 1);\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault();\r\n this.highlightedIndex = Math.max(this.highlightedIndex - 1, 0);\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'Home': {\r\n e.preventDefault();\r\n this.highlightedIndex = 0;\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'End': {\r\n e.preventDefault();\r\n const vis = this.getVisibleOptions();\r\n this.highlightedIndex = vis.length - 1;\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'Enter':\r\n case ' ': {\r\n e.preventDefault();\r\n const current = this.getVisibleOptions()[this.highlightedIndex];\r\n if (current && !current.disabled) {\r\n current.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true }));\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n private onFilterInput = (e: Event): void => {\r\n const term = (e.target as HTMLInputElement).value.toLowerCase();\r\n\r\n let anyVisible = false;\r\n for (const opt of this.options) {\r\n const text = (opt.textContent ?? '').toLowerCase();\r\n const match = text.includes(term);\r\n opt.style.display = match ? '' : 'none';\r\n if (match) anyVisible = true;\r\n }\r\n this.hasFilterResults = anyVisible;\r\n this.highlightedIndex = 0;\r\n this.applyHighlight();\r\n };\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Computed display values\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private get selectedLabel(): string {\r\n const selected = this.options.find((o) => o.value !== undefined && o.value === this.value);\r\n return (selected?.textContent ?? '').trim();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Render\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n render() {\r\n const labelId = `${this.internalId}-label`;\r\n const listboxId = `${this.internalId}-listbox`;\r\n const hintId = `${this.internalId}-hint`;\r\n const hasMessage = !!this.message && this.state !== 'none';\r\n const hasValue = this.value !== undefined && this.value !== '';\r\n const displayLabel = hasValue ? this.selectedLabel : undefined;\r\n\r\n return (\r\n <Host data-theme={this.theme}>\r\n <style innerHTML={getComponentCss(this.isOpen, this.disabled, this.state, this.compact, this.dropdownClass.includes('--up'))} />\r\n\r\n {/* Label */}\r\n {(this.label || this.host.querySelector('[slot=\"label\"]')) && (\r\n <span class=\"label\" id={labelId} part=\"label\">\r\n <slot name=\"label\">{this.label}</slot>\r\n {this.required && <span class=\"label__required\" aria-hidden=\"true\">*</span>}\r\n </span>\r\n )}\r\n\r\n {/* Description */}\r\n {(this.description || this.host.querySelector('[slot=\"description\"]')) && (\r\n <span class=\"description\" part=\"description\">\r\n <slot name=\"description\">{this.description}</slot>\r\n </span>\r\n )}\r\n\r\n {/* Trigger */}\r\n <div\r\n class=\"trigger\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={this.isOpen ? 'true' : 'false'}\r\n aria-controls={listboxId}\r\n aria-labelledby={this.label ? labelId : undefined}\r\n aria-required={this.required ? 'true' : undefined}\r\n aria-invalid={this.state === 'error' ? 'true' : undefined}\r\n aria-describedby={hasMessage ? hintId : undefined}\r\n tabIndex={this.disabled ? -1 : 0}\r\n onClick={this.onTriggerClick}\r\n onKeyDown={this.onTriggerKeyDown}\r\n ref={(el) => (this.triggerEl = el as HTMLDivElement)}\r\n part=\"trigger\"\r\n >\r\n <span class={`trigger__value${!displayLabel ? ' trigger__placeholder' : ''}`} part=\"value\">\r\n {displayLabel ?? (this.label || 'Select an option')}\r\n </span>\r\n\r\n {/* Chevron */}\r\n <span class=\"trigger__chevron\" aria-hidden=\"true\" part=\"chevron\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n {/* Dropdown */}\r\n <div\r\n class={this.dropdownClass}\r\n role=\"listbox\"\r\n id={listboxId}\r\n aria-multiselectable=\"false\"\r\n aria-labelledby={this.label ? labelId : undefined}\r\n part=\"dropdown\"\r\n >\r\n {/* Filter */}\r\n <div class=\"filter\" part=\"filter\">\r\n <input\r\n class=\"filter__input\"\r\n type=\"text\"\r\n placeholder=\"Filter options…\"\r\n aria-label=\"Filter options\"\r\n onInput={this.onFilterInput}\r\n ref={(el) => (this.filterInputEl = el as HTMLInputElement)}\r\n part=\"filter-input\"\r\n />\r\n </div>\r\n\r\n {/* Options */}\r\n <div class=\"options\" part=\"options\">\r\n {!this.hasFilterResults && (\r\n <div class=\"no-results\" aria-live=\"polite\">No options found</div>\r\n )}\r\n <slot />\r\n </div>\r\n </div>\r\n\r\n {/* Message */}\r\n {hasMessage && (\r\n <span class=\"message\" id={hintId} role=\"status\" part=\"message\">\r\n <slot name=\"message\">{this.message}</slot>\r\n </span>\r\n )}\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"version":3}
|
|
1
|
+
{"file":"diwa-select.js","mappings":"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","names":["DiwaSelect"],"sources":["src/components/diwa-select/diwa-select-styles.ts","src/components/diwa-select/diwa-select.tsx"],"sourcesContent":["import { getFocusStyle, getReducedMotionStyle } from '../../utils/styles';\nimport type { SelectState } from './types';\r\n\r\nexport const getComponentCss = (\r\n isOpen: boolean,\r\n _disabled: boolean,\r\n _state: SelectState,\r\n _compact: boolean,\r\n isUp: boolean = false,\r\n): string => `\r\n /* ── Host ──────────────────────────────────────────────────────────── */\r\n\r\n :host {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n min-width: 0;\r\n font-family: var(--diwa-font-family-base);\r\n outline: none;\r\n }\r\n\r\n :host([hidden]) {\r\n display: none;\r\n }\r\n\r\n /* ── Label ──────────────────────────────────────────────────────────── */\r\n\r\n .label {\r\n display: block;\r\n margin-bottom: var(--diwa-space-1);\r\n font-size: var(--diwa-font-size-sm);\r\n font-weight: var(--diwa-font-weight-semibold);\r\n color: var(--diwa-text-secondary);\r\n line-height: var(--diwa-line-height-normal);\r\n cursor: default;\r\n }\r\n\r\n :host([hide-label]) .label {\r\n border: 0;\r\n clip: rect(0, 0, 0, 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n white-space: nowrap;\r\n width: 1px;\r\n }\r\n\r\n .label__required {\r\n color: var(--diwa-notification-error);\r\n font-weight: var(--diwa-font-weight-semibold);\r\n margin-left: var(--diwa-space-1);\r\n }\r\n\r\n /* ── Description ────────────────────────────────────────────────────── */\r\n\r\n .description {\r\n display: block;\r\n margin-bottom: var(--diwa-space-2);\r\n font-size: var(--diwa-font-size-sm);\r\n color: var(--diwa-text-secondary);\r\n line-height: var(--diwa-line-height-normal);\r\n }\r\n\r\n /* ── Trigger ────────────────────────────────────────────────────────── */\r\n\r\n .trigger {\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n min-height: var(--diwa-input-height, var(--diwa-touch-target-min-size, 44px));\n padding: 0 var(--diwa-space-3);\r\n box-sizing: border-box;\r\n gap: var(--diwa-space-2);\r\n\r\n background: var(--diwa-input-bg, var(--diwa-bg-input));\r\n border: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n border-radius: var(--diwa-input-radius, var(--diwa-radius-md));\r\n\r\n font-size: var(--diwa-font-size-base);\r\n font-weight: var(--diwa-font-weight-normal);\r\n font-family: inherit;\r\n color: var(--diwa-text-primary);\r\n text-align: left;\r\n line-height: 1;\r\n\r\n cursor: pointer;\r\n user-select: none;\r\n -webkit-font-smoothing: antialiased;\r\n\r\n transition: border-color var(--diwa-transition-fast), background var(--diwa-transition-fast);\r\n appearance: none;\r\n -webkit-appearance: none;\r\n }\r\n\r\n @media (hover: hover) and (pointer: fine) {\n :host(:not([disabled])) .trigger:hover {\n border-color: var(--diwa-border-hover);\n }\n }\n\r\n ${isOpen && !isUp ? '.trigger { border-color: var(--diwa-border-focus); border-radius: var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)) 0 0; }' : ''}\r\n ${isOpen && isUp ? '.trigger { border-color: var(--diwa-border-focus); border-radius: 0 0 var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)); }' : ''}\r\n\r\n /* ── Focus ring on trigger itself ───────────────────────────────────── */\r\n\r\n ${getFocusStyle('.trigger')}\r\n\r\n /* ── Selected text ──────────────────────────────────────────────────── */\r\n\r\n .trigger__value {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .trigger__placeholder {\r\n color: var(--diwa-text-secondary);\r\n }\r\n\r\n /* ── Chevron icon ───────────────────────────────────────────────────── */\r\n\r\n .trigger__chevron {\r\n flex-shrink: 0;\r\n width: var(--diwa-icon-size-md);\r\n height: var(--diwa-icon-size-md);\r\n color: var(--diwa-text-secondary);\r\n transition: transform var(--diwa-transition-fast);\r\n ${isOpen ? 'transform: rotate(180deg);' : ''}\r\n }\r\n\r\n .trigger__chevron svg {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n /* ── Dropdown panel ─────────────────────────────────────────────────── */\r\n\r\n .dropdown {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n z-index: var(--diwa-z-dropdown);\r\n background-color: var(--diwa-bg-elevated);\r\n border: var(--diwa-border-width-thin) solid var(--diwa-border-focus);\r\n border-top: none;\r\n border-radius: 0 0 var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md));\r\n overflow: hidden;\r\n box-shadow: var(--diwa-shadow-lg);\r\n display: ${isOpen ? 'block' : 'none'};\r\n }\r\n\r\n .dropdown--up {\r\n top: auto;\r\n bottom: 100%;\r\n border-top: var(--diwa-border-width-thin) solid var(--diwa-border-focus);\r\n border-bottom: none;\r\n border-radius: var(--diwa-input-radius, var(--diwa-radius-md)) var(--diwa-input-radius, var(--diwa-radius-md)) 0 0;\r\n margin-bottom: -1px;\r\n }\r\n\r\n /* ── Filter input ───────────────────────────────────────────────────── */\r\n\r\n .filter {\r\n padding: var(--diwa-space-2) var(--diwa-space-2) var(--diwa-space-1);\r\n border-bottom: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n }\r\n\r\n .filter__input {\r\n width: 100%;\r\n box-sizing: border-box;\r\n padding: var(--diwa-space-2) var(--diwa-space-3);\r\n background: var(--diwa-input-bg, var(--diwa-bg-input));\r\n border: var(--diwa-border-width-thin) solid var(--diwa-input-border);\r\n border-radius: var(--diwa-radius-sm);\r\n color: var(--diwa-text-primary);\r\n font-size: var(--diwa-font-size-sm);\r\n font-family: inherit;\r\n outline: none;\r\n transition: border-color var(--diwa-transition-fast);\r\n }\r\n\r\n .filter__input::placeholder {\n color: var(--diwa-text-secondary);\n }\n\n .filter__input:focus-visible {\n outline: var(--diwa-focus-ring-width) solid var(--diwa-border-focus);\n outline-offset: var(--diwa-focus-ring-offset);\n }\n\n .filter__input:focus:not(:focus-visible) {\n outline: none;\n }\n\r\n /* ── Options list ───────────────────────────────────────────────────── */\r\n\r\n .options {\r\n max-height: var(--diwa-select-dropdown-max-height);\r\n overflow-y: auto;\r\n padding: var(--diwa-space-1);\r\n }\r\n\r\n .options::-webkit-scrollbar {\r\n width: var(--diwa-scrollbar-width);\r\n }\r\n\r\n .options::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n\r\n .options::-webkit-scrollbar-thumb {\r\n background-color: var(--diwa-border);\r\n border-radius: var(--diwa-radius-sm);\r\n }\r\n\r\n /* ── Compact ────────────────────────────────────────────────────────── */\r\n\r\n :host([compact]) .trigger {\n min-height: var(--diwa-touch-target-min-size-compact, 32px);\n font-size: var(--diwa-font-size-md);\n padding: 0 var(--diwa-space-2);\n }\n\r\n /* ── States: error / success ────────────────────────────────────────── */\r\n\r\n :host([state=\"error\"]) .trigger {\r\n border-color: var(--diwa-notification-error);\r\n }\r\n\r\n :host([state=\"success\"]) .trigger {\r\n border-color: var(--diwa-notification-success);\r\n }\r\n\r\n /* ── Message ────────────────────────────────────────────────────────── */\r\n\r\n .message {\r\n display: block;\r\n margin-top: var(--diwa-space-1);\r\n font-size: var(--diwa-font-size-sm);\r\n line-height: var(--diwa-line-height-normal);\r\n color: var(--diwa-text-secondary);\r\n }\r\n\r\n :host([state=\"error\"]) .message {\r\n color: var(--diwa-notification-error);\r\n }\r\n\r\n :host([state=\"success\"]) .message {\r\n color: var(--diwa-notification-success);\r\n }\r\n\r\n /* ── Disabled ───────────────────────────────────────────────────────── */\r\n\r\n :host([disabled]) .trigger {\r\n opacity: var(--diwa-opacity-disabled);\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n :host([disabled]) .label {\r\n opacity: var(--diwa-opacity-disabled);\r\n }\r\n\r\n /* ── Reduced motion ─────────────────────────────────────────────────── */\r\n\r\n ${getReducedMotionStyle('.trigger', '.trigger__chevron', '.filter__input')}\r\n`;\r\n\r\n\r\n","import {\r\n Component,\r\n Element,\r\n Event,\r\n type EventEmitter,\r\n Host,\r\n Listen,\r\n Method,\r\n Prop,\r\n State,\r\n Watch,\r\n forceUpdate,\r\n h,\r\n} from '@stencil/core';\r\nimport type {\r\n SelectChangeEventDetail,\r\n SelectDropdownDirection,\r\n SelectState,\r\n SelectTheme,\r\n SelectToggleEventDetail,\r\n} from './types';\r\nimport { getComponentCss } from './diwa-select-styles';\r\n\r\n/** Module-level counter for unique IDs. */\r\nlet selectIdCounter = 0;\r\n\r\n/**\r\n * @component diwa-select\r\n *\r\n * A fully accessible single-select dropdown with built-in text filter,\r\n * keyboard navigation, and form integration.\r\n *\r\n * Based on the Diwa select API contract.\r\n *\r\n * Usage:\r\n * <diwa-select name=\"fruit\" label=\"Favourite fruit\">\r\n * <diwa-select-option>Please select…</diwa-select-option>\r\n * <diwa-select-option value=\"apple\">Apple</diwa-select-option>\r\n * <diwa-select-option value=\"banana\">Banana</diwa-select-option>\r\n * </diwa-select>\r\n *\r\n * @slot default — diwa-select-option elements\r\n * @slot label — Custom label content (overrides the label prop)\r\n * @slot description — Custom description content\r\n * @slot message — Custom message content\r\n */\r\n@Component({\r\n tag: 'diwa-select',\r\n shadow: { delegatesFocus: true },\r\n})\r\nexport class DiwaSelect {\r\n @Element() host!: HTMLElement;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Props\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Theme — cascades down to child options. */\r\n @Prop({ reflect: true }) theme: SelectTheme = 'dark';\r\n\r\n /** Visible label text. */\r\n @Prop() label?: string;\r\n\r\n /** Optional description shown below the label. */\r\n @Prop() description?: string;\r\n\r\n /** HTML name attribute — identifies the field in form submissions. */\r\n @Prop() name: string = '';\r\n\r\n /** Currently selected value. Mutable — updated on user interaction. */\r\n @Prop({ mutable: true }) value?: string;\r\n\r\n /** Validation state. */\r\n @Prop({ reflect: true }) state: SelectState = 'none';\r\n\r\n /** Helper / validation message shown below the trigger. */\r\n @Prop() message?: string;\r\n\r\n /** Hides the label visually while keeping it accessible. */\r\n @Prop({ reflect: true, attribute: 'hide-label' }) hideLabel: boolean = false;\r\n\r\n /** Disables interaction. */\r\n @Prop({ reflect: true }) disabled: boolean = false;\r\n\r\n /** Marks the field as required. */\r\n @Prop() required: boolean = false;\r\n\r\n /** Compact variant — reduces the trigger height. */\r\n @Prop({ reflect: true }) compact: boolean = false;\r\n\r\n /**\r\n * Preferred direction for the dropdown panel.\r\n * `'auto'` detects viewport space and flips upward if needed.\r\n */\r\n @Prop() dropdownDirection: SelectDropdownDirection = 'auto';\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Events\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Emitted when the selection changes. */\r\n @Event({ bubbles: true })\r\n change!: EventEmitter<SelectChangeEventDetail>;\r\n\r\n /** Emitted when the dropdown opens or closes. */\r\n @Event({ bubbles: false })\r\n toggle!: EventEmitter<SelectToggleEventDetail>;\r\n\r\n /** Emitted when the component loses focus (dropdown closes via click-outside). */\r\n @Event({ bubbles: false })\r\n blur!: EventEmitter<void>;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Internal state\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @State() private isOpen: boolean = false;\r\n @State() private hasFilterResults: boolean = true;\r\n @State() private dropdownClass: string = 'dropdown';\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Private refs / tracking\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private internalId: string = `diwa-s-${++selectIdCounter}`;\r\n private triggerEl!: HTMLDivElement;\r\n private filterInputEl?: HTMLInputElement;\r\n private options: HTMLDiwaSelectOptionElement[] = [];\r\n private highlightedIndex: number = -1;\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Watchers\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @Watch('theme')\r\n onThemeChange(): void {\r\n this.syncChildThemes();\r\n }\r\n\r\n @Watch('compact')\r\n onCompactChange(): void {\r\n this.syncChildCompact();\r\n }\r\n\r\n @Watch('value')\r\n onValueChange(): void {\r\n this.syncSelectionFromValue();\r\n }\r\n\r\n @Watch('isOpen')\r\n onIsOpenChange(open: boolean): void {\r\n this.toggle.emit({ open });\r\n if (open) {\r\n this.updateDropdownDirection();\r\n this.highlightedIndex = this.getFirstHighlightIndex();\r\n this.applyHighlight();\r\n requestAnimationFrame(() => {\r\n this.filterInputEl?.focus();\r\n });\r\n } else {\r\n this.clearHighlight();\r\n this.highlightedIndex = -1;\r\n this.resetFilter();\r\n }\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Lifecycle\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n connectedCallback(): void {\r\n document.addEventListener('mousedown', this.onClickOutside, true);\r\n }\r\n\r\n disconnectedCallback(): void {\r\n document.removeEventListener('mousedown', this.onClickOutside, true);\r\n }\r\n\r\n componentDidLoad(): void {\r\n this.collectOptions();\r\n this.syncSelectionFromValue();\r\n this.syncChildThemes();\r\n this.syncChildCompact();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Public methods\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n /** Programmatically opens the dropdown. */\r\n @Method()\r\n async open(): Promise<void> {\r\n this.isOpen = true;\r\n }\r\n\r\n /** Programmatically closes the dropdown. */\r\n @Method()\r\n async close(): Promise<void> {\r\n this.isOpen = false;\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Event listeners\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n @Listen('diwaSelectOptionUpdate')\r\n onOptionUpdate(e: CustomEvent<{ value: string | undefined }>): void {\r\n e.stopPropagation();\r\n this.value = e.detail.value;\r\n this.syncSelectionFromValue();\r\n this.change.emit({ name: this.name, value: this.value ?? '' });\r\n this.isOpen = false;\r\n forceUpdate(this.host);\r\n requestAnimationFrame(() => {\r\n this.triggerEl.focus();\r\n });\r\n }\r\n\r\n @Listen('slotchange')\r\n onSlotChange(): void {\r\n this.collectOptions();\r\n this.syncSelectionFromValue();\r\n this.syncChildThemes();\r\n this.syncChildCompact();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Private helpers\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private collectOptions(): void {\r\n this.options = Array.from(\r\n this.host.querySelectorAll<HTMLDiwaSelectOptionElement>('diwa-select-option'),\r\n );\r\n }\r\n\r\n private syncSelectionFromValue(): void {\r\n for (const opt of this.options) {\r\n const shouldBeSelected = opt.value !== undefined && opt.value === this.value;\r\n if (opt.selected !== shouldBeSelected) {\r\n opt.selected = shouldBeSelected;\r\n forceUpdate(opt);\r\n }\r\n }\r\n }\r\n\r\n private syncChildThemes(): void {\r\n for (const opt of this.options) {\r\n if (opt.theme !== this.theme) {\r\n opt.theme = this.theme;\r\n forceUpdate(opt);\r\n }\r\n }\r\n }\r\n\r\n private syncChildCompact(): void {\r\n for (const opt of this.options) {\r\n if (opt.compact !== this.compact) {\r\n opt.compact = this.compact;\r\n forceUpdate(opt);\r\n }\r\n }\r\n }\r\n\r\n private getVisibleOptions(): HTMLDiwaSelectOptionElement[] {\r\n return this.options.filter((o) => !o.disabled && o.style.display !== 'none');\r\n }\r\n\r\n private getFirstHighlightIndex(): number {\r\n const visible = this.getVisibleOptions();\r\n const firstSelected = visible.findIndex((o) => o.selected);\r\n return firstSelected >= 0 ? firstSelected : 0;\r\n }\r\n\r\n private applyHighlight(): void {\r\n const visible = this.getVisibleOptions();\r\n visible.forEach((opt, i) => {\r\n opt.highlighted = i === this.highlightedIndex;\r\n });\r\n }\r\n\r\n private clearHighlight(): void {\r\n for (const opt of this.options) {\r\n if (opt.highlighted) opt.highlighted = false;\r\n }\r\n this.highlightedIndex = -1;\r\n }\r\n\r\n private updateDropdownDirection(): void {\r\n if (this.dropdownDirection !== 'auto') {\r\n this.dropdownClass = this.dropdownDirection === 'up' ? 'dropdown dropdown--up' : 'dropdown';\r\n return;\r\n }\r\n const rect = this.triggerEl.getBoundingClientRect();\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n this.dropdownClass = spaceBelow < 260 ? 'dropdown dropdown--up' : 'dropdown';\r\n }\r\n\r\n private resetFilter(): void {\r\n if (this.filterInputEl) this.filterInputEl.value = '';\r\n this.hasFilterResults = true;\r\n for (const opt of this.options) {\r\n opt.style.display = '';\r\n }\r\n }\r\n\r\n private onClickOutside = (e: MouseEvent): void => {\r\n if (!this.isOpen) return;\r\n const path = e.composedPath();\r\n if (!path.includes(this.host)) {\r\n this.isOpen = false;\r\n this.blur.emit();\r\n }\r\n };\r\n\r\n private onTriggerClick = (): void => {\r\n if (this.disabled) return;\r\n this.isOpen = !this.isOpen;\r\n };\r\n\r\n private onTriggerKeyDown = (e: KeyboardEvent): void => {\r\n if (this.disabled) return;\r\n\r\n if (!this.isOpen) {\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n this.isOpen = true;\r\n }\r\n return;\r\n }\r\n\r\n switch (e.key) {\r\n case 'Escape':\r\n case 'Tab': {\r\n e.preventDefault();\r\n this.isOpen = false;\r\n this.triggerEl.focus();\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n e.preventDefault();\r\n const visible = this.getVisibleOptions();\r\n this.highlightedIndex = Math.min(this.highlightedIndex + 1, visible.length - 1);\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault();\r\n this.highlightedIndex = Math.max(this.highlightedIndex - 1, 0);\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'Home': {\r\n e.preventDefault();\r\n this.highlightedIndex = 0;\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'End': {\r\n e.preventDefault();\r\n const vis = this.getVisibleOptions();\r\n this.highlightedIndex = vis.length - 1;\r\n this.applyHighlight();\r\n break;\r\n }\r\n case 'Enter':\r\n case ' ': {\r\n e.preventDefault();\r\n const current = this.getVisibleOptions()[this.highlightedIndex];\r\n if (current && !current.disabled) {\r\n current.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true }));\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n private onFilterInput = (e: Event): void => {\r\n const term = (e.target as HTMLInputElement).value.toLowerCase();\r\n\r\n let anyVisible = false;\r\n for (const opt of this.options) {\r\n const text = (opt.textContent ?? '').toLowerCase();\r\n const match = text.includes(term);\r\n opt.style.display = match ? '' : 'none';\r\n if (match) anyVisible = true;\r\n }\r\n this.hasFilterResults = anyVisible;\r\n this.highlightedIndex = 0;\r\n this.applyHighlight();\r\n };\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Computed display values\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n private get selectedLabel(): string {\r\n const selected = this.options.find((o) => o.value !== undefined && o.value === this.value);\r\n return (selected?.textContent ?? '').trim();\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────\r\n // Render\r\n // ──────────────────────────────────────────────────────────────\r\n\r\n render() {\r\n const labelId = `${this.internalId}-label`;\r\n const listboxId = `${this.internalId}-listbox`;\r\n const hintId = `${this.internalId}-hint`;\r\n const hasMessage = !!this.message && this.state !== 'none';\r\n const hasValue = this.value !== undefined && this.value !== '';\r\n const displayLabel = hasValue ? this.selectedLabel : undefined;\r\n\r\n return (\r\n <Host data-theme={this.theme}>\r\n <style innerHTML={getComponentCss(this.isOpen, this.disabled, this.state, this.compact, this.dropdownClass.includes('--up'))} />\r\n\r\n {/* Label */}\r\n {(this.label || this.host.querySelector('[slot=\"label\"]')) && (\r\n <span class=\"label\" id={labelId} part=\"label\">\r\n <slot name=\"label\">{this.label}</slot>\r\n {this.required && <span class=\"label__required\" aria-hidden=\"true\">*</span>}\r\n </span>\r\n )}\r\n\r\n {/* Description */}\r\n {(this.description || this.host.querySelector('[slot=\"description\"]')) && (\r\n <span class=\"description\" part=\"description\">\r\n <slot name=\"description\">{this.description}</slot>\r\n </span>\r\n )}\r\n\r\n {/* Trigger */}\r\n <div\r\n class=\"trigger\"\r\n role=\"combobox\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={this.isOpen ? 'true' : 'false'}\r\n aria-controls={listboxId}\r\n aria-labelledby={this.label ? labelId : undefined}\r\n aria-required={this.required ? 'true' : undefined}\r\n aria-invalid={this.state === 'error' ? 'true' : undefined}\r\n aria-describedby={hasMessage ? hintId : undefined}\r\n tabIndex={this.disabled ? -1 : 0}\r\n onClick={this.onTriggerClick}\r\n onKeyDown={this.onTriggerKeyDown}\r\n ref={(el) => (this.triggerEl = el as HTMLDivElement)}\r\n part=\"trigger\"\r\n >\r\n <span class={`trigger__value${!displayLabel ? ' trigger__placeholder' : ''}`} part=\"value\">\r\n {displayLabel ?? (this.label || 'Select an option')}\r\n </span>\r\n\r\n {/* Chevron */}\r\n <span class=\"trigger__chevron\" aria-hidden=\"true\" part=\"chevron\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n {/* Dropdown */}\r\n <div\r\n class={this.dropdownClass}\r\n role=\"listbox\"\r\n id={listboxId}\r\n aria-multiselectable=\"false\"\r\n aria-labelledby={this.label ? labelId : undefined}\r\n part=\"dropdown\"\r\n >\r\n {/* Filter */}\r\n <div class=\"filter\" part=\"filter\">\r\n <input\r\n class=\"filter__input\"\r\n type=\"text\"\r\n placeholder=\"Filter options…\"\r\n aria-label=\"Filter options\"\r\n onInput={this.onFilterInput}\r\n ref={(el) => (this.filterInputEl = el as HTMLInputElement)}\r\n part=\"filter-input\"\r\n />\r\n </div>\r\n\r\n {/* Options */}\r\n <div class=\"options\" part=\"options\">\r\n {!this.hasFilterResults && (\r\n <div class=\"no-results\" aria-live=\"polite\">No options found</div>\r\n )}\r\n <slot />\r\n </div>\r\n </div>\r\n\r\n {/* Message */}\r\n {hasMessage && (\r\n <span class=\"message\" id={hintId} role=\"status\" part=\"message\">\r\n <slot name=\"message\">{this.message}</slot>\r\n </span>\r\n )}\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"version":3}
|