@vielzeug/refine 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -18
- package/dist/accordion-item.cjs +1 -1
- package/dist/accordion-item.cjs.map +1 -1
- package/dist/accordion-item.js +1 -1
- package/dist/accordion-item.js.map +1 -1
- package/dist/accordion.cjs.map +1 -1
- package/dist/accordion.js.map +1 -1
- package/dist/async.cjs +1 -1
- package/dist/async.cjs.map +1 -1
- package/dist/async.js +3 -3
- package/dist/async.js.map +1 -1
- package/dist/box.cjs.map +1 -1
- package/dist/box.js.map +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.cjs.map +1 -1
- package/dist/card.js +3 -3
- package/dist/card.js.map +1 -1
- package/dist/chat-message.cjs +1 -1
- package/dist/chat-message.cjs.map +1 -1
- package/dist/chat-message.js +1 -1
- package/dist/chat-message.js.map +1 -1
- package/dist/checkbox-group.cjs +1 -1
- package/dist/checkbox-group.cjs.map +1 -1
- package/dist/checkbox-group.js +1 -1
- package/dist/checkbox-group.js.map +1 -1
- package/dist/combobox.cjs +10 -8
- package/dist/combobox.cjs.map +1 -1
- package/dist/combobox.js +62 -51
- package/dist/combobox.js.map +1 -1
- package/dist/command-palette.cjs +1 -1
- package/dist/command-palette.cjs.map +1 -1
- package/dist/command-palette.js +6 -2
- package/dist/command-palette.js.map +1 -1
- package/dist/content/card/card.css.cjs +1 -1
- package/dist/content/card/card.css.cjs.map +1 -1
- package/dist/content/card/card.css.js +1 -1
- package/dist/content/card/card.css.js.map +1 -1
- package/dist/content/card/card.d.ts +2 -2
- package/dist/content/card/card.d.ts.map +1 -1
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/list/list-item.css.cjs +1 -1
- package/dist/content/list/list-item.css.cjs.map +1 -1
- package/dist/content/list/list-item.css.js +1 -1
- package/dist/content/list/list-item.css.js.map +1 -1
- package/dist/content/list/list-item.d.ts +9 -0
- package/dist/content/list/list-item.d.ts.map +1 -1
- package/dist/content/pagination/pagination.css.cjs +1 -1
- package/dist/content/pagination/pagination.css.cjs.map +1 -1
- package/dist/content/pagination/pagination.css.js +1 -1
- package/dist/content/pagination/pagination.css.js.map +1 -1
- package/dist/content/stats/stats.css.cjs +2 -0
- package/dist/content/stats/stats.css.cjs.map +1 -0
- package/dist/content/stats/stats.css.js +6 -0
- package/dist/content/stats/stats.css.js.map +1 -0
- package/dist/content/stats/stats.d.ts +72 -0
- package/dist/content/stats/stats.d.ts.map +1 -0
- package/dist/core/auto-resize.cjs +1 -1
- package/dist/core/auto-resize.cjs.map +1 -1
- package/dist/core/auto-resize.js +1 -1
- package/dist/core/auto-resize.js.map +1 -1
- package/dist/core/field-base.cjs +1 -1
- package/dist/core/field-base.cjs.map +1 -1
- package/dist/core/field-base.d.ts +1 -1
- package/dist/core/field-base.js +1 -1
- package/dist/core/field-base.js.map +1 -1
- package/dist/core/nav.cjs +1 -1
- package/dist/core/nav.cjs.map +1 -1
- package/dist/core/nav.d.ts +4 -1
- package/dist/core/nav.d.ts.map +1 -1
- package/dist/core/nav.js +41 -28
- package/dist/core/nav.js.map +1 -1
- package/dist/core/option-list.cjs +1 -1
- package/dist/core/option-list.cjs.map +1 -1
- package/dist/core/option-list.d.ts.map +1 -1
- package/dist/core/option-list.js +30 -28
- package/dist/core/option-list.js.map +1 -1
- package/dist/core/slider.cjs +1 -1
- package/dist/core/slider.cjs.map +1 -1
- package/dist/core/slider.js +1 -1
- package/dist/core/slider.js.map +1 -1
- package/dist/core/spinner.cjs +1 -1
- package/dist/core/spinner.cjs.map +1 -1
- package/dist/core/spinner.js +1 -1
- package/dist/core/spinner.js.map +1 -1
- package/dist/custom-elements.json +5471 -4977
- package/dist/datagrid.cjs +219 -199
- package/dist/datagrid.cjs.map +1 -1
- package/dist/datagrid.js +415 -302
- package/dist/datagrid.js.map +1 -1
- package/dist/disclosure/accordion/accordion.css.cjs +1 -1
- package/dist/disclosure/accordion/accordion.css.cjs.map +1 -1
- package/dist/disclosure/accordion/accordion.css.js +1 -1
- package/dist/disclosure/accordion/accordion.css.js.map +1 -1
- package/dist/disclosure/accordion/accordion.d.ts +5 -5
- package/dist/disclosure/accordion/accordion.d.ts.map +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
- package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
- package/dist/disclosure/accordion-item/accordion-item.d.ts +3 -3
- package/dist/disclosure/accordion-item/accordion-item.d.ts.map +1 -1
- package/dist/disclosure/tab-item/tab-item.css.cjs +1 -1
- package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
- package/dist/disclosure/tab-item/tab-item.css.js +1 -1
- package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
- package/dist/disclosure/tab-item/tab-item.d.ts +6 -3
- package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
- package/dist/disclosure/tabs/tabs.css.cjs +1 -1
- package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
- package/dist/disclosure/tabs/tabs.css.js +1 -1
- package/dist/disclosure/tabs/tabs.css.js.map +1 -1
- package/dist/disclosure/tabs/tabs.d.ts +9 -5
- package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
- package/dist/drawer.cjs +1 -1
- package/dist/drawer.cjs.map +1 -1
- package/dist/drawer.js +1 -1
- package/dist/drawer.js.map +1 -1
- package/dist/feedback/toast/toast.d.ts.map +1 -1
- package/dist/file-input.cjs +1 -1
- package/dist/file-input.cjs.map +1 -1
- package/dist/file-input.js +2 -2
- package/dist/file-input.js.map +1 -1
- package/dist/frameworks/elements.d.ts +4 -85
- package/dist/frameworks/react.d.ts +5 -4
- package/dist/frameworks/vue.d.ts +4 -4
- package/dist/grid.cjs +2 -2
- package/dist/grid.cjs.map +1 -1
- package/dist/grid.js +21 -18
- package/dist/grid.js.map +1 -1
- package/dist/icon.cjs +1 -1
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js +1 -1
- package/dist/icon.js.map +1 -1
- package/dist/input.cjs +5 -4
- package/dist/input.cjs.map +1 -1
- package/dist/input.js +14 -8
- package/dist/input.js.map +1 -1
- package/dist/inputs/combobox/combobox-options.cjs +1 -1
- package/dist/inputs/combobox/combobox-options.cjs.map +1 -1
- package/dist/inputs/combobox/combobox-options.d.ts.map +1 -1
- package/dist/inputs/combobox/combobox-options.js +1 -0
- package/dist/inputs/combobox/combobox-options.js.map +1 -1
- package/dist/inputs/combobox/combobox.css.cjs +1 -1
- package/dist/inputs/combobox/combobox.css.cjs.map +1 -1
- package/dist/inputs/combobox/combobox.css.js +1 -1
- package/dist/inputs/combobox/combobox.css.js.map +1 -1
- package/dist/inputs/combobox/combobox.d.ts +13 -1
- package/dist/inputs/combobox/combobox.d.ts.map +1 -1
- package/dist/inputs/combobox/combobox.types.d.ts +7 -0
- package/dist/inputs/combobox/combobox.types.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
- package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.d.ts +17 -3
- package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid-model.js +93 -70
- package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
- package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
- package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
- package/dist/inputs/datagrid/datagrid.css.js +1 -1
- package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
- package/dist/inputs/datagrid/datagrid.d.ts +78 -36
- package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
- package/dist/inputs/file-input/file-input-upload.cjs +1 -1
- package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
- package/dist/inputs/file-input/file-input-upload.js +1 -1
- package/dist/inputs/file-input/file-input-upload.js.map +1 -1
- package/dist/inputs/index.d.ts +3 -4
- package/dist/inputs/index.d.ts.map +1 -1
- package/dist/inputs/input/input.css.cjs +1 -1
- package/dist/inputs/input/input.css.cjs.map +1 -1
- package/dist/inputs/input/input.css.js +1 -1
- package/dist/inputs/input/input.css.js.map +1 -1
- package/dist/inputs/input/input.d.ts +3 -0
- package/dist/inputs/input/input.d.ts.map +1 -1
- package/dist/inputs/select/select.css.cjs +1 -1
- package/dist/inputs/select/select.css.cjs.map +1 -1
- package/dist/inputs/select/select.css.js +1 -1
- package/dist/inputs/select/select.css.js.map +1 -1
- package/dist/inputs/select/select.d.ts +5 -0
- package/dist/inputs/select/select.d.ts.map +1 -1
- package/dist/inputs/shared/field-binding.cjs +1 -1
- package/dist/inputs/shared/field-binding.cjs.map +1 -1
- package/dist/inputs/shared/field-binding.js +6 -6
- package/dist/inputs/shared/field-binding.js.map +1 -1
- package/dist/layout/box/box.css.cjs +1 -1
- package/dist/layout/box/box.css.cjs.map +1 -1
- package/dist/layout/box/box.css.js +1 -1
- package/dist/layout/box/box.css.js.map +1 -1
- package/dist/layout/box/box.d.ts +3 -3
- package/dist/layout/box/box.d.ts.map +1 -1
- package/dist/layout/grid/grid.d.ts.map +1 -1
- package/dist/layout/navbar/navbar.css.cjs +1 -1
- package/dist/layout/navbar/navbar.css.cjs.map +1 -1
- package/dist/layout/navbar/navbar.css.js +1 -1
- package/dist/layout/navbar/navbar.css.js.map +1 -1
- package/dist/layout/navbar/navbar.d.ts +3 -1
- package/dist/layout/navbar/navbar.d.ts.map +1 -1
- package/dist/layout/sidebar/sidebar.css.cjs +1 -1
- package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
- package/dist/layout/sidebar/sidebar.css.js +1 -1
- package/dist/layout/sidebar/sidebar.css.js.map +1 -1
- package/dist/layout/sidebar/sidebar.d.ts +8 -0
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
- package/dist/list-item.cjs +6 -5
- package/dist/list-item.cjs.map +1 -1
- package/dist/list-item.js +23 -17
- package/dist/list-item.js.map +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.cjs.map +1 -1
- package/dist/list.js +1 -1
- package/dist/list.js.map +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +7 -7
- package/dist/menu.js.map +1 -1
- package/dist/navbar.cjs +2 -2
- package/dist/navbar.cjs.map +1 -1
- package/dist/navbar.js +91 -87
- package/dist/navbar.js.map +1 -1
- package/dist/navigation-menu.cjs +1 -1
- package/dist/navigation-menu.cjs.map +1 -1
- package/dist/navigation-menu.js +2 -2
- package/dist/navigation-menu.js.map +1 -1
- package/dist/number-input.cjs +1 -1
- package/dist/number-input.cjs.map +1 -1
- package/dist/number-input.js +1 -1
- package/dist/number-input.js.map +1 -1
- package/dist/overlay/popover/popover.css.cjs +1 -1
- package/dist/overlay/popover/popover.css.cjs.map +1 -1
- package/dist/overlay/popover/popover.css.js +1 -1
- package/dist/overlay/popover/popover.css.js.map +1 -1
- package/dist/overlay/popover/popover.d.ts +1 -0
- package/dist/overlay/popover/popover.d.ts.map +1 -1
- package/dist/overlay/shared/use-dialog.cjs +1 -1
- package/dist/overlay/shared/use-dialog.cjs.map +1 -1
- package/dist/overlay/shared/use-dialog.js +1 -1
- package/dist/overlay/shared/use-dialog.js.map +1 -1
- package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
- package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
- package/dist/overlay/shared/use-floating-trigger.js +1 -1
- package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
- package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
- package/dist/popover.cjs +1 -1
- package/dist/popover.cjs.map +1 -1
- package/dist/popover.js +6 -6
- package/dist/popover.js.map +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.cjs.map +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/radio-group.js.map +1 -1
- package/dist/radio.cjs +1 -1
- package/dist/radio.cjs.map +1 -1
- package/dist/radio.js +15 -13
- package/dist/radio.js.map +1 -1
- package/dist/rating.cjs +1 -1
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.js +2 -2
- package/dist/rating.js.map +1 -1
- package/dist/refine.cjs +373 -324
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +382 -333
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +417 -368
- package/dist/refine.js.map +1 -1
- package/dist/select.cjs +16 -14
- package/dist/select.cjs.map +1 -1
- package/dist/select.js +118 -112
- package/dist/select.js.map +1 -1
- package/dist/shared/types.d.ts +0 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/sidebar.cjs +28 -23
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.js +143 -108
- package/dist/sidebar.js.map +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +11 -9
- package/dist/skeleton.js.map +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +21 -21
- package/dist/slider.js.map +1 -1
- package/dist/stats.cjs +18 -0
- package/dist/stats.cjs.map +1 -0
- package/dist/stats.js +88 -0
- package/dist/stats.js.map +1 -0
- package/dist/stepper.cjs +1 -1
- package/dist/stepper.cjs.map +1 -1
- package/dist/stepper.js +1 -1
- package/dist/stepper.js.map +1 -1
- package/dist/styles/mixins/animation.css.cjs +2 -0
- package/dist/styles/mixins/animation.css.cjs.map +1 -1
- package/dist/styles/mixins/animation.css.d.ts.map +1 -1
- package/dist/styles/mixins/animation.css.js +2 -0
- package/dist/styles/mixins/animation.css.js.map +1 -1
- package/dist/tab-item.cjs +1 -1
- package/dist/tab-item.cjs.map +1 -1
- package/dist/tab-item.js +3 -2
- package/dist/tab-item.js.map +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.js +3 -1
- package/dist/tabs.js.map +1 -1
- package/dist/toast.cjs +8 -8
- package/dist/toast.cjs.map +1 -1
- package/dist/toast.js +32 -33
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.js +2 -2
- package/dist/tooltip.js.map +1 -1
- package/dist/types/elements.d.ts +207 -0
- package/package.json +70 -62
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/inputs/combobox/combobox.css?inline
|
|
2
|
-
var e = "@layer refine.base{:host{--_dropdown-bg:var(--combobox-dropdown-bg,var(--color-canvas));--_dropdown-border-color:var(--combobox-dropdown-border-color,var(--color-contrast-200));--_option-hover-bg:var(--combobox-option-hover-bg,var(--color-contrast-100));--_option-focus-bg:var(--combobox-option-focus-bg,color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100)));--_option-selected-bg:var(--combobox-option-selected-bg,color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50)));--_option-selected-focus-bg:var(--combobox-option-selected-focus-bg,color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100)));min-width:var(--combobox-min-width,12rem);flex-direction:column;align-items:stretch;display:inline-flex}:host([fullwidth]){width:100%;display:block}.trigger::part(input){cursor:text}.trigger::part(field){height:auto;min-height:var(--input-height,var(--size-10))}.trigger::part(input-row){row-gap:var(--size-1);flex-wrap:wrap;align-items:center}.chips-row,.chips-list{display:contents}ore-chip:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-right:var(--size-1)}ore-chip:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-1)}.combobox-suffix{gap:var(--size-1);flex-shrink:0;align-items:center;display:flex}.clear-btn{color:var(--color-contrast-400);cursor:pointer;background:0 0;border:0;flex-shrink:0;align-items:center;padding:0;display:inline-flex}.clear-btn[hidden]{display:none}.clear-btn:hover{color:var(--color-contrast-600)}.combobox-suffix-end{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.chevron{transition:var(--_motion-transition,transform var(--transition-fast));flex-shrink:0;align-items:center;display:inline-flex}:host([open]) .chevron{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:calc(var(--z-popover,1000) + 1);box-sizing:border-box;max-height:min(16rem,50dvh);padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;scrollbar-width:thin;background:var(--_dropdown-bg);border:var(--border) solid var(--_dropdown-border-color);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);margin:0;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:not(:is(.option-check,.option-icon)){text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.option:hover:not([data-disabled]){background:var(--_option-hover-bg)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:var(--_option-focus-bg)}.option[data-selected],.option[aria-selected=true]{font-weight:var(--font-medium);color:var(--_theme-base);background:var(--_option-selected-bg)}.option[data-selected][data-focused],.option[aria-selected=true][data-focused]{background:var(--_option-selected-focus-bg)}.option[data-disabled]{color:var(--color-contrast-
|
|
2
|
+
var e = "@layer refine.base{:host{--_dropdown-bg:var(--combobox-dropdown-bg,var(--color-canvas));--_dropdown-border-color:var(--combobox-dropdown-border-color,var(--color-contrast-200));--_option-hover-bg:var(--combobox-option-hover-bg,var(--color-contrast-100));--_option-focus-bg:var(--combobox-option-focus-bg,color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100)));--_option-selected-bg:var(--combobox-option-selected-bg,color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50)));--_option-selected-focus-bg:var(--combobox-option-selected-focus-bg,color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100)));min-width:var(--combobox-min-width,12rem);flex-direction:column;align-items:stretch;display:inline-flex}:host([fullwidth]){width:100%;display:block}.trigger::part(input){cursor:text}.trigger::part(field){height:auto;min-height:var(--input-height,var(--size-10))}.trigger::part(input-row){row-gap:var(--size-1);flex-wrap:wrap;align-items:center}.chips-row,.chips-list{display:contents}ore-chip:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-right:var(--size-1)}ore-chip:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-1)}.combobox-suffix{gap:var(--size-1);flex-shrink:0;align-items:center;display:flex}.clear-btn{color:var(--color-contrast-400);cursor:pointer;background:0 0;border:0;flex-shrink:0;align-items:center;padding:0;display:inline-flex}.clear-btn[hidden]{display:none}.clear-btn:hover{color:var(--color-contrast-600)}.combobox-suffix-end{gap:var(--size-1);color:var(--color-contrast-500);align-items:center;display:flex}.chevron{transition:var(--_motion-transition,transform var(--transition-fast));flex-shrink:0;align-items:center;display:inline-flex}:host([open]) .chevron{transform:rotate(180deg)}.loader{width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border:2px solid;border-radius:50%;flex-shrink:0;display:none}.loader:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes spin{to{transform:rotate(360deg)}}:host([loading]) .loader{display:inline-block}.dropdown{z-index:calc(var(--z-popover,1000) + 1);box-sizing:border-box;max-height:min(16rem,50dvh);padding:var(--size-1);overscroll-behavior:contain;pointer-events:none;scrollbar-width:thin;background:var(--_dropdown-bg);border:var(--border) solid var(--_dropdown-border-color);border-radius:var(--_radius);box-shadow:var(--shadow-lg);opacity:0;-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transform:translateY(var(--overlay-enter-translate-y));transition:var(--_motion-transition,opacity var(--transition-fast), transform var(--transition-fast), display var(--transition-fast) allow-discrete);margin:0;position:fixed;inset:0 auto auto 0;overflow-y:auto}.dropdown:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.dropdown:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.dropdown[data-open]{pointer-events:auto;opacity:1;transform:translateY(0)}@starting-style{.dropdown[data-open]{opacity:0;transform:translateY(var(--overlay-enter-translate-y))}}.option{gap:var(--size-2);padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);line-height:var(--leading-normal);cursor:pointer;border-radius:var(--rounded-sm);transition:background var(--transition-fast), color var(--transition-fast);align-items:center;display:flex}.option>span:not(:is(.option-check,.option-icon)){text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.disabled-reason{text-overflow:ellipsis;min-width:0;font-size:var(--text-xs);color:var(--text-color-tertiary);white-space:nowrap;flex:0 45%;overflow:hidden}.disabled-reason:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:right}.disabled-reason:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:left}.option:hover:not([data-disabled]){background:var(--_option-hover-bg)}.option[data-focused]:not([data-disabled]){color:var(--_theme-base);background:var(--_option-focus-bg)}.option[data-selected],.option[aria-selected=true]{font-weight:var(--font-medium);color:var(--_theme-base);background:var(--_option-selected-bg)}.option[data-selected][data-focused],.option[aria-selected=true][data-focused]{background:var(--_option-selected-focus-bg)}.option[data-disabled]{color:var(--color-contrast-500);cursor:not-allowed}.option-check{color:var(--_theme-base);opacity:0;transition:opacity var(--transition-fast);flex-shrink:0;display:inline-flex}.option-check:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){margin-left:auto}.option-check:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:auto}.option[data-selected] .option-check,.option[aria-selected=true] .option-check{opacity:1}.no-results,.no-results-create,.dropdown-loading{padding:var(--size-3) var(--size-2-5);font-size:var(--text-sm);color:var(--color-contrast-400);text-align:center}.no-results-create{gap:var(--size-1-5);width:100%;padding:var(--size-1-5) var(--size-2-5);font-size:var(--text-sm);color:var(--_theme-content,var(--color-primary-content));cursor:pointer;border-radius:var(--rounded-sm);background:0 0;border:0;align-items:center;display:flex}.no-results-create:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){text-align:left}.no-results-create:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){text-align:right}.no-results-create:hover,.no-results-create[data-focused]{background:color-mix(in oklch, var(--_theme-base,var(--color-primary)) 10%, transparent)}.option-icon{flex-shrink:0;align-items:center;display:inline-flex}::slotted(ore-combobox-option){display:none}}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.css.js","names":[],"sources":["../../../src/inputs/combobox/combobox.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_dropdown-bg: var(--combobox-dropdown-bg, var(--color-canvas));\n --_dropdown-border-color: var(--combobox-dropdown-border-color, var(--color-contrast-200));\n --_option-hover-bg: var(--combobox-option-hover-bg, var(--color-contrast-100));\n --_option-focus-bg: var(\n --combobox-option-focus-bg,\n color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))\n );\n --_option-selected-bg: var(\n --combobox-option-selected-bg,\n color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))\n );\n --_option-selected-focus-bg: var(\n --combobox-option-selected-focus-bg,\n color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))\n );\n\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n min-width: var(--combobox-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n }\n\n /* .sr-only is provided by the shared srOnlyMixin (see styles: [...] in combobox.ts) */\n\n /* ore-input cursor override so the field still feels like a text input */\n .trigger::part(input) {\n cursor: text;\n }\n\n /* Allow the field to grow vertically when chips wrap to multiple rows. */\n .trigger::part(field) {\n height: auto;\n min-height: var(--input-height, var(--size-10));\n }\n\n /* Wrap chips + input across rows; suffix stays on same row as input.\n Only row-gap is set here — column spacing between chips is handled\n via margin on ore-chip so the empty prefix slot adds no extra offset\n (which would shift the input rightward vs the inset label). */\n .trigger::part(input-row) {\n flex-wrap: wrap;\n row-gap: var(--size-1);\n align-items: center;\n }\n\n /* ========================================\n Chips (prefix slot)\n ======================================== */\n\n /* display:contents removes chips-row from the flex layout so chips\n become direct flex items of input-row — no extra gap before input\n when there are no chips (fixes inset-label alignment). */\n .chips-row {\n display: contents;\n }\n\n /* chips-list is also display:contents so individual ore-chip elements\n are the direct flex items, wrapping inline with the search input. */\n .chips-list {\n display: contents;\n }\n\n /* Trailing space after each chip covers both inter-chip spacing and\n the gap between the last chip and the search input. */\n ore-chip {\n margin-inline-end: var(--size-1);\n }\n\n /* ========================================\n Suffix: clear button + loader + chevron\n ======================================== */\n\n .combobox-suffix {\n display: flex;\n flex-shrink: 0;\n gap: var(--size-1);\n align-items: center;\n }\n\n .clear-btn {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n padding: 0;\n color: var(--color-contrast-400);\n cursor: pointer;\n background: none;\n border: 0;\n }\n\n .clear-btn[hidden] {\n display: none;\n }\n\n .clear-btn:hover {\n color: var(--color-contrast-600);\n }\n\n .combobox-suffix-end {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .chevron {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n transition: var(--_motion-transition, transform var(--transition-fast));\n }\n\n :host([open]) .chevron {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown / Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: calc(var(--z-popover, 1000) + 1);\n box-sizing: border-box;\n max-height: min(16rem, 50dvh);\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n scrollbar-width: thin;\n background: var(--_dropdown-bg);\n border: var(--border) solid var(--_dropdown-border-color);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels so options always stay single-line (fixed virtualizer row height). */\n .option > span:not(.option-check, .option-icon) {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--_option-hover-bg);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: var(--_option-focus-bg);\n }\n\n .option[data-selected],\n .option[aria-selected='true'] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: var(--_option-selected-bg);\n }\n\n .option[data-selected][data-focused],\n .option[aria-selected='true'][data-focused] {\n background: var(--_option-selected-focus-bg);\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-
|
|
1
|
+
{"version":3,"file":"combobox.css.js","names":[],"sources":["../../../src/inputs/combobox/combobox.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_dropdown-bg: var(--combobox-dropdown-bg, var(--color-canvas));\n --_dropdown-border-color: var(--combobox-dropdown-border-color, var(--color-contrast-200));\n --_option-hover-bg: var(--combobox-option-hover-bg, var(--color-contrast-100));\n --_option-focus-bg: var(\n --combobox-option-focus-bg,\n color-mix(in oklch, var(--_theme-base) 12%, var(--color-contrast-100))\n );\n --_option-selected-bg: var(\n --combobox-option-selected-bg,\n color-mix(in oklch, var(--_theme-base) 10%, var(--color-contrast-50))\n );\n --_option-selected-focus-bg: var(\n --combobox-option-selected-focus-bg,\n color-mix(in oklch, var(--_theme-base) 20%, var(--color-contrast-100))\n );\n\n display: inline-flex;\n flex-direction: column;\n align-items: stretch;\n min-width: var(--combobox-min-width, 12rem);\n }\n\n :host([fullwidth]) {\n display: block;\n width: 100%;\n }\n\n /* .sr-only is provided by the shared srOnlyMixin (see styles: [...] in combobox.ts) */\n\n /* ore-input cursor override so the field still feels like a text input */\n .trigger::part(input) {\n cursor: text;\n }\n\n /* Allow the field to grow vertically when chips wrap to multiple rows. */\n .trigger::part(field) {\n height: auto;\n min-height: var(--input-height, var(--size-10));\n }\n\n /* Wrap chips + input across rows; suffix stays on same row as input.\n Only row-gap is set here — column spacing between chips is handled\n via margin on ore-chip so the empty prefix slot adds no extra offset\n (which would shift the input rightward vs the inset label). */\n .trigger::part(input-row) {\n flex-wrap: wrap;\n row-gap: var(--size-1);\n align-items: center;\n }\n\n /* ========================================\n Chips (prefix slot)\n ======================================== */\n\n /* display:contents removes chips-row from the flex layout so chips\n become direct flex items of input-row — no extra gap before input\n when there are no chips (fixes inset-label alignment). */\n .chips-row {\n display: contents;\n }\n\n /* chips-list is also display:contents so individual ore-chip elements\n are the direct flex items, wrapping inline with the search input. */\n .chips-list {\n display: contents;\n }\n\n /* Trailing space after each chip covers both inter-chip spacing and\n the gap between the last chip and the search input. */\n ore-chip {\n margin-inline-end: var(--size-1);\n }\n\n /* ========================================\n Suffix: clear button + loader + chevron\n ======================================== */\n\n .combobox-suffix {\n display: flex;\n flex-shrink: 0;\n gap: var(--size-1);\n align-items: center;\n }\n\n .clear-btn {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n padding: 0;\n color: var(--color-contrast-400);\n cursor: pointer;\n background: none;\n border: 0;\n }\n\n .clear-btn[hidden] {\n display: none;\n }\n\n .clear-btn:hover {\n color: var(--color-contrast-600);\n }\n\n .combobox-suffix-end {\n display: flex;\n gap: var(--size-1);\n align-items: center;\n color: var(--color-contrast-500);\n }\n\n .chevron {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n transition: var(--_motion-transition, transform var(--transition-fast));\n }\n\n :host([open]) .chevron {\n transform: rotate(180deg);\n }\n\n .loader {\n display: none;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n border: 2px solid currentcolor;\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, spin var(--transition-loader) infinite);\n }\n\n /* Keyframe must live in shadow DOM — @keyframes don't inherit across shadow roots */\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n :host([loading]) .loader {\n display: inline-block;\n }\n\n /* ========================================\n Dropdown / Listbox\n ======================================== */\n\n .dropdown {\n position: fixed;\n inset: 0 auto auto 0;\n z-index: calc(var(--z-popover, 1000) + 1);\n box-sizing: border-box;\n max-height: min(16rem, 50dvh);\n padding: var(--size-1);\n margin: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n text-align: start;\n pointer-events: none;\n scrollbar-width: thin;\n background: var(--_dropdown-bg);\n border: var(--border) solid var(--_dropdown-border-color);\n border-radius: var(--_radius);\n box-shadow: var(--shadow-lg);\n opacity: 0;\n backdrop-filter: blur(var(--blur-md));\n transform: translateY(var(--overlay-enter-translate-y));\n transition: var(\n --_motion-transition,\n opacity var(--transition-fast),\n transform var(--transition-fast),\n display var(--transition-fast) allow-discrete\n );\n }\n\n .dropdown[data-open] {\n pointer-events: auto;\n opacity: 1;\n transform: translateY(0);\n\n @starting-style {\n opacity: 0;\n transform: translateY(var(--overlay-enter-translate-y));\n }\n }\n\n /* ========================================\n Option Items\n ======================================== */\n\n .option {\n display: flex;\n gap: var(--size-2);\n align-items: center;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n cursor: pointer;\n border-radius: var(--rounded-sm);\n transition:\n background var(--transition-fast),\n color var(--transition-fast);\n }\n\n /* Truncate long labels so options always stay single-line (fixed virtualizer row height). */\n .option > span:not(.option-check, .option-icon) {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .disabled-reason {\n flex: 0 1 45%;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--text-color-tertiary);\n text-align: end;\n white-space: nowrap;\n }\n\n .option:hover:not([data-disabled]) {\n background: var(--_option-hover-bg);\n }\n\n .option[data-focused]:not([data-disabled]) {\n color: var(--_theme-base);\n background: var(--_option-focus-bg);\n }\n\n .option[data-selected],\n .option[aria-selected='true'] {\n font-weight: var(--font-medium);\n color: var(--_theme-base);\n background: var(--_option-selected-bg);\n }\n\n .option[data-selected][data-focused],\n .option[aria-selected='true'][data-focused] {\n background: var(--_option-selected-focus-bg);\n }\n\n .option[data-disabled] {\n color: var(--color-contrast-500);\n cursor: not-allowed;\n }\n\n .option-check {\n display: inline-flex;\n flex-shrink: 0;\n margin-inline-start: auto;\n color: var(--_theme-base);\n opacity: 0;\n transition: opacity var(--transition-fast);\n }\n\n .option[data-selected] .option-check,\n .option[aria-selected='true'] .option-check {\n opacity: 1;\n }\n\n .no-results,\n .no-results-create,\n .dropdown-loading {\n padding: var(--size-3) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--color-contrast-400);\n text-align: center;\n }\n\n .no-results-create {\n display: flex;\n gap: var(--size-1-5);\n align-items: center;\n width: 100%;\n padding: var(--size-1-5) var(--size-2-5);\n font-size: var(--text-sm);\n color: var(--_theme-content, var(--color-primary-content));\n text-align: start;\n cursor: pointer;\n background: none;\n border: 0;\n border-radius: var(--rounded-sm);\n }\n\n .no-results-create:hover,\n .no-results-create[data-focused] {\n background: color-mix(in oklch, var(--_theme-base, var(--color-primary)) 10%, transparent);\n }\n\n /* ========================================\n Option Icon\n ======================================== */\n\n .option-icon {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n }\n\n /* ========================================\n Slotted option elements (hidden data nodes)\n ======================================== */\n\n ::slotted(ore-combobox-option) {\n display: none;\n }\n}\n"],"mappings":""}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import '../../feedback/chip/chip';
|
|
2
2
|
import '../input/input';
|
|
3
|
-
export type { OreComboboxEvents, OreComboboxProps } from './combobox.types';
|
|
3
|
+
export type { ComboboxOptionInput, OreComboboxEvents, OreComboboxOptionProps, OreComboboxProps, } from './combobox.types';
|
|
4
|
+
/**
|
|
5
|
+
* Declarative option data for `ore-combobox`.
|
|
6
|
+
*
|
|
7
|
+
* @element ore-combobox-option
|
|
8
|
+
* @attr {string} value - Submitted option value
|
|
9
|
+
* @attr {string} label - Label override; defaults to text content
|
|
10
|
+
* @attr {boolean} disabled - Prevent selection
|
|
11
|
+
* @attr {string} disabled-reason - Explanation shown for a disabled option
|
|
12
|
+
* @slot icon - Leading option icon
|
|
13
|
+
*/
|
|
14
|
+
export declare const COMBOBOX_OPTION_TAG: "ore-combobox-option";
|
|
4
15
|
/**
|
|
5
16
|
* A searchable select field with multiple selection, custom option creation, and large-list support.
|
|
6
17
|
*
|
|
@@ -10,6 +21,7 @@ export type { OreComboboxEvents, OreComboboxProps } from './combobox.types';
|
|
|
10
21
|
* @attr {boolean} multiple - Enable multiple selection
|
|
11
22
|
* @attr {boolean} creatable - Allow users to create custom options from search query
|
|
12
23
|
* @attr {boolean} no-filter - Disable client-side filtering (useful for server-side search)
|
|
24
|
+
* @attr {boolean} hide-label - Hide the visible label while retaining its accessible name
|
|
13
25
|
* @attr {string} placeholder - Placeholder text
|
|
14
26
|
* @attr {boolean} required - Require a non-blank selection for native form validation
|
|
15
27
|
* @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/inputs/combobox/combobox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/inputs/combobox/combobox.ts"],"names":[],"mappings":"AAiCA,OAAO,0BAA0B,CAAC;AAClC,OAAO,gBAAgB,CAAC;AAGxB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAG,qBAA8B,CAAC;AAOlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,eAAO,MAAM,YAAY,EAAG,cAAuB,CAAC"}
|
|
@@ -11,12 +11,15 @@ export type OreComboboxEvents = {
|
|
|
11
11
|
};
|
|
12
12
|
export type ComboboxOptionInput = {
|
|
13
13
|
disabled?: boolean;
|
|
14
|
+
/** Explanation displayed and announced when the option is disabled. */
|
|
15
|
+
disabledReason?: string;
|
|
14
16
|
iconEl?: Element | null;
|
|
15
17
|
label?: string;
|
|
16
18
|
value: string;
|
|
17
19
|
};
|
|
18
20
|
export type ComboboxOptionItem = {
|
|
19
21
|
disabled: boolean;
|
|
22
|
+
disabledReason?: string;
|
|
20
23
|
iconEl: Element | null;
|
|
21
24
|
label: string;
|
|
22
25
|
value: string;
|
|
@@ -27,6 +30,8 @@ export type OreComboboxProps = Omit<SelectableFieldProps<Exclude<VisualVariant,
|
|
|
27
30
|
/** Allow typing a new value to create a new option */
|
|
28
31
|
creatable?: boolean;
|
|
29
32
|
'label-placement'?: 'outside' | 'inset';
|
|
33
|
+
/** Hide the visible label while preserving the combobox's accessible name. */
|
|
34
|
+
'hide-label'?: boolean;
|
|
30
35
|
/** Show loading state in the dropdown */
|
|
31
36
|
loading?: boolean;
|
|
32
37
|
multiple?: boolean;
|
|
@@ -38,6 +43,8 @@ export type OreComboboxProps = Omit<SelectableFieldProps<Exclude<VisualVariant,
|
|
|
38
43
|
};
|
|
39
44
|
export type OreComboboxOptionProps = {
|
|
40
45
|
disabled?: boolean;
|
|
46
|
+
/** Explanation displayed and announced when the option is disabled. */
|
|
47
|
+
'disabled-reason'?: string;
|
|
41
48
|
/** Explicit label text; falls back to the element's text content. */
|
|
42
49
|
label?: string;
|
|
43
50
|
value?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.types.d.ts","sourceRoot":"","sources":["../../../src/inputs/combobox/combobox.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,uBAAuB,CAAC;IACvC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAC9D,iBAAiB,GAAG,OAAO,CAC5B,GAAG;IACF,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACxC,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"combobox.types.d.ts","sourceRoot":"","sources":["../../../src/inputs/combobox/combobox.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,EAAE,uBAAuB,CAAC;IACvC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAC9D,iBAAiB,GAAG,OAAO,CAC5B,GAAG;IACF,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACxC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=require("@vielzeug/ripple");var t=[{label:`Contains`,value:`contains`},{label:`Equals`,value:`equals`},{label:`Greater than`,value:`gt`},{label:`Less than`,value:`lt`}],n=n=>{let r=(0,e.signal)(``),i=(0,e.signal)(!1),a=(0,e.signal)(new Set),o=(0,e.signal)(new Set),s=(0,e.signal)(new Map),c=(0,e.signal)(``),l=(0,e.signal)(`none`),u=(0,e.signal)(new Set),d=(0,e.signal)(0),f=(0,e.computed)(()=>new Set(n.columns.value.map(e=>e.key))),p=(0,e.computed)(()=>n.columns.value.filter(e=>!a.value.has(e.key))),m=(0,e.computed)(()=>{let e=new Set((n.filterOptions.value??[]).map(e=>e.key)),t=[...o.value].filter(t=>!e.has(t));if(!t.length)return new Map;let r=new Map;for(let e of t){let t=new Set,
|
|
1
|
+
let e=require("@vielzeug/ripple");var t=[{label:`Contains`,value:`contains`},{label:`Equals`,value:`equals`},{label:`Greater than`,value:`gt`},{label:`Less than`,value:`lt`}],n=n=>{let r=(0,e.signal)(``),i=(0,e.signal)(!1),a=(0,e.signal)(new Set),o=(0,e.signal)(new Set),s=(0,e.signal)(new Map),c=(0,e.signal)(``),l=(0,e.signal)(`none`),u=(0,e.signal)(new Set),d=(0,e.signal)(0),f=(0,e.computed)(()=>new Set([...n.columns.value.map(e=>e.key),...(n.filterOptions.value??[]).map(e=>e.key)])),p=(0,e.computed)(()=>n.columns.value.filter(e=>!a.value.has(e.key))),m=(0,e.computed)(()=>{let e=n.items.value;if(!n.clientSide.value)return e;let t=n.activeView?.value?.filter;return t?e.filter(t):e}),h=(e,t)=>{let r=n.columns.value.find(e=>e.key===t);return r?.filterValue?r.filterValue(e):e[t]},g=(0,e.computed)(()=>{let e=new Set((n.filterOptions.value??[]).map(e=>e.key)),t=[...o.value].filter(t=>!e.has(t));if(!t.length)return new Map;let r=new Map;for(let e of t){let t=n.columns.value.find(t=>t.key===e),i=new Set,a=[];for(let r of m.value){let o=h(r,e),s=o==null?``:String(o),c=t?.filterLabel?.(r)??t?.cell?.(r)??s;i.has(s)||(i.add(s),a.push({label:c||n.emptyValueLabel?.value||`(empty)`,value:s}))}r.set(e,a)}return r}),_=(0,e.computed)(()=>{let e=n.filterOptions.value??[],r=new Set(e.map(e=>e.key)),i=e.filter(e=>o.value.has(e.key)),a=[...o.value].filter(e=>!r.has(e)).map(e=>({key:e,label:n.columns.value.find(t=>t.key===e)?.label??e,operators:n.filterOperators?.value??t,options:g.value.get(e)??[]}));return[...i.map(e=>({...e,operators:e.operators??n.filterOperators?.value??t})),...a]}),v=(0,e.computed)(()=>{let e=m.value;if(!n.clientSide.value)return e;let t=r.value.trim().toLowerCase();return t?e.filter(e=>n.columns.value.some(n=>{let r=n.cell?n.cell(e):h(e,n.key);return r!=null&&String(r).toLowerCase().includes(t)})):e}),y=(0,e.computed)(()=>{let e=v.value;return!n.clientSide.value||!s.value.size?e:e.filter(e=>{for(let[t,n]of s.value){if(!n.values.size||!f.value.has(t))continue;let r=h(e,t),i=r==null?``:String(r);if(n.operator===`equals`&&!n.values.has(i)||n.operator===`contains`&&![...n.values].some(e=>i.toLowerCase().includes(e.toLowerCase())))return!1;if(n.operator===`gt`||n.operator===`lt`){let e=parseFloat(i),t=[...n.values].map(parseFloat).filter(e=>!Number.isNaN(e));if(!t.length)continue;if(n.operator===`gt`&&!t.some(t=>e>t)||n.operator===`lt`&&!t.some(t=>e<t))return!1}}return!0})}),b=(0,e.computed)(()=>({direction:l.value,key:c.value})),x=(0,e.computed)(()=>{let e=y.value;if(!n.clientSide.value||n.sortMode.value===`server`)return e;let{direction:t,key:r}=b.value;if(!r||t===`none`)return e;let i=n.columns.value.find(e=>e.key===r);return e.slice().sort((e,n)=>{let a=i?.sortValue?i.sortValue(e):e[r],o=i?.sortValue?i.sortValue(n):n[r],s=typeof a==`number`&&typeof o==`number`?a-o:String(a??``).localeCompare(String(o??``));return t===`asc`?s:-s})}),S=(0,e.computed)(()=>x.value.length),C=(0,e.computed)(()=>{let e=n.pageSize.value;return Math.ceil(S.value/(e<=0?2**53-1:e))}),w=(0,e.computed)(()=>C.value?Math.min(d.value,C.value-1):-1),T=(0,e.computed)(()=>{let e=n.pageSize.value;if(e<=0)return x.value;let t=w.value*e;return x.value.slice(t,t+e)}),E=(0,e.computed)(()=>C.value>0&&w.value<C.value-1),D=(0,e.computed)(()=>w.value>0),O=(0,e.computed)(()=>n.items.value.filter(e=>u.value.has(n.getRowKey(e))));(0,e.watch)(f,e=>{let t=new Set([...o.value].filter(t=>e.has(t))),n=new Map([...s.value].filter(([t])=>e.has(t)));t.size!==o.value.size&&(o.value=t),n.size!==s.value.size&&(s.value=n)},{immediate:!1}),(0,e.watch)(x,()=>{d.value=0});let k=e=>{u.value=e,n.onSelectionChange?.(e)},A=(e,t)=>{let n=new Map(s.value);if(t.length){let r=_.value.find(t=>t.key===e)?.operators?.[0]?.value;n.set(e,{operator:n.get(e)?.operator??r??`contains`,values:new Set(t)})}else n.delete(e);s.value=n},j=(e,t)=>{let n=s.value.get(e);s.value=new Map(s.value).set(e,{operator:t,values:n?.values??new Set})},M=(e,t)=>{c.value=t===`none`?``:e,l.value=t,d.value=0,n.onSortChange?.(b.value)};return{activateFilterKey:e=>{o.value.has(e)||(o.value=new Set([...o.value,e]))},clearAllFilters:()=>{o.value=new Set,s.value=new Map},clearSelection:()=>k(new Set),currentPageItems:T,filterDefs:_,filteredRows:y,filterValues:s,goToPage:e=>{Number.isFinite(e)&&(d.value=Math.max(0,e))},hasNextPage:E,hasPrevPage:D,hiddenColumns:a,isAllSelected:()=>{let e=T.value;return e.length>0&&e.every(e=>u.value.has(n.getRowKey(e)))},nextPage:()=>{E.value&&(d.value=w.value+1)},pageCount:C,pageIndex:w,prevPage:()=>{D.value&&(d.value=w.value-1)},removeFilter:e=>{let t=new Set(o.value);t.delete(e),o.value=t;let n=new Map(s.value);n.delete(e),s.value=n},resetColumnVisibility:()=>{a.value=new Set},resetFilters:()=>{o.value=new Set,s.value=new Map},resetSearch:()=>{r.value=``,i.value=!1},searchActive:i,searchQuery:r,selectAll:()=>{if(n.selectionMode.value!==`multi`)return;let e=new Set(u.value);if(T.value.every(t=>e.has(n.getRowKey(t))))for(let t of T.value)e.delete(n.getRowKey(t));else for(let t of T.value)e.add(n.getRowKey(t));k(e)},selectedKeys:(0,e.computed)(()=>new Set(u.value)),selectedRows:O,setActiveFilterKeys:e=>{let t=new Set(e);o.value=t,s.value=new Map([...s.value].filter(([e])=>t.has(e)))},setFilter:A,setFilterOperator:j,setSearchQuery:e=>{r.value=e},setSelection:e=>k(new Set(e)),sortBy:e=>{let t=c.value===e?l.value===`asc`?`desc`:l.value===`desc`?`none`:`asc`:`asc`;M(t===`none`?``:e,t)},sortState:b,sortTo:M,toggleColumnVisibility:e=>{let t=new Set(a.value);if(t.has(e))t.delete(e);else{if(p.value.length<=1)return;t.add(e)}a.value=t},toggleRow:e=>{if(n.selectionMode.value===`none`)return;let t=new Set(u.value);t.has(e)?t.delete(e):(n.selectionMode.value===`single`&&t.clear(),t.add(e)),k(t)},toggleSearch:()=>{i.value&&(r.value=``),i.value=!i.value},totalItems:S,visibleColumns:p}};exports.createDataGridModel=n;
|
|
2
2
|
//# sourceMappingURL=datagrid-model.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datagrid-model.cjs","names":[],"sources":["../../../src/inputs/datagrid/datagrid-model.ts"],"sourcesContent":["import { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nexport type SortDirection = 'asc' | 'desc' | 'none';\n\nexport type SortState = {\n direction: SortDirection;\n key: string;\n};\n\nexport type DataGridColumn<T = Record<string, unknown>> = {\n align?: 'left' | 'center' | 'right';\n cell?: (item: T) => string;\n headerLabel?: string;\n key: string;\n label: string;\n renderExpanded?: (item: T) => string;\n resizable?: boolean;\n sortable?: boolean;\n sortValue?: (item: T) => number | string;\n width?: string;\n};\n\nexport type SelectionMode = 'multi' | 'none' | 'single';\n\nexport type FilterOption = {\n key: string;\n label: string;\n operators?: { label: string; value: string }[];\n options: { label?: string; value: string }[];\n};\n\nexport type FilterOperator = 'contains' | 'equals' | 'gt' | 'lt';\n\nexport type FilterRule = {\n operator: FilterOperator;\n values: Set<string>;\n};\n\nexport type DataGridView = {\n id: string;\n label: string;\n};\n\nexport type DataGridModelOptions<T = Record<string, unknown>> = {\n clientSide: Readable<boolean>;\n columns: Readable<DataGridColumn<T>[]>;\n filterOptions: Readable<FilterOption[] | undefined>;\n getRowKey: (item: T) => string;\n items: Readable<T[]>;\n onSelectionChange?: (keys: Set<string>) => void;\n onSortChange?: (sort: SortState) => void;\n pageSize: Readable<number>;\n selectionMode: Readable<SelectionMode>;\n sortMode: Readable<'client' | 'server'>;\n};\n\nexport type DataGridModel<T = Record<string, unknown>> = {\n activateFilterKey(key: string): void;\n clearAllFilters(): void;\n clearSelection(): void;\n readonly currentPageItems: Readable<T[]>;\n readonly filterDefs: Readable<FilterOption[]>;\n readonly filteredRows: Readable<T[]>;\n readonly filterValues: Readable<Map<string, FilterRule>>;\n goToPage(index: number): void;\n readonly hasNextPage: Readable<boolean>;\n readonly hasPrevPage: Readable<boolean>;\n readonly hiddenColumns: Readable<Set<string>>;\n isAllSelected(): boolean;\n nextPage(): void;\n readonly pageCount: Readable<number>;\n readonly pageIndex: Readable<number>;\n prevPage(): void;\n removeFilter(key: string): void;\n resetFilters(): void;\n resetSearch(): void;\n readonly searchActive: Readable<boolean>;\n readonly searchQuery: Readable<string>;\n selectAll(): void;\n readonly selectedKeys: Readable<ReadonlySet<string>>;\n readonly selectedRows: Readable<T[]>;\n setActiveFilterKeys(keys: string[]): void;\n setFilter(key: string, values: string[]): void;\n setFilterOperator(key: string, operator: FilterOperator): void;\n setSearchQuery(query: string): void;\n setSelection(keys: Set<string>): void;\n sortBy(key: string): void;\n readonly sortState: Readable<SortState>;\n sortTo(key: string, direction: SortDirection): void;\n toggleColumnVisibility(key: string): void;\n toggleRow(key: string): void;\n toggleSearch(): void;\n readonly totalItems: Readable<number>;\n readonly visibleColumns: Readable<DataGridColumn<T>[]>;\n};\n\nconst DEFAULT_OPERATORS: { label: string; value: FilterOperator }[] = [\n { label: 'Contains', value: 'contains' },\n { label: 'Equals', value: 'equals' },\n { label: 'Greater than', value: 'gt' },\n { label: 'Less than', value: 'lt' },\n];\n\n/**\n * Feature-owned state and transform pipeline for `ore-datagrid`.\n *\n * Rows flow through query, filters, sorting, and pagination in order. Selection\n * and column visibility share the same model so every interactive grid concern\n * has one reactive owner. Source-backed grids retain their server-owned rows by\n * setting `clientSide` to false.\n */\nexport const createDataGridModel = <T extends Record<string, unknown>>(\n options: DataGridModelOptions<T>,\n): DataGridModel<T> => {\n const searchQuery = signal('');\n const searchActive = signal(false);\n const hiddenColumns = signal(new Set<string>());\n const activeFilterKeys = signal(new Set<string>());\n const filterValues = signal(new Map<string, FilterRule>());\n const sortKey = signal('');\n const sortDirection = signal<SortDirection>('none');\n const selectedKeys = signal(new Set<string>());\n const pageIndex = signal(0);\n\n const columnKeys = computed(() => new Set(options.columns.value.map((column) => column.key)));\n const visibleColumns = computed(() => options.columns.value.filter((column) => !hiddenColumns.value.has(column.key)));\n\n const colOptions = computed(() => {\n const externalKeys = new Set((options.filterOptions.value ?? []).map((filter) => filter.key));\n const activeKeys = [...activeFilterKeys.value].filter((key) => !externalKeys.has(key));\n\n if (!activeKeys.length) return new Map<string, { label: string; value: string }[]>();\n\n const derived = new Map<string, { label: string; value: string }[]>();\n\n for (const key of activeKeys) {\n const seen = new Set<string>();\n const values: { label: string; value: string }[] = [];\n\n for (const row of options.items.value) {\n const value = row[key];\n const stringValue = value == null ? '' : String(value);\n\n if (!seen.has(stringValue)) {\n seen.add(stringValue);\n values.push({ label: stringValue || '(empty)', value: stringValue });\n }\n }\n\n derived.set(key, values);\n }\n\n return derived;\n });\n\n const filterDefs = computed<FilterOption[]>(() => {\n const provided = options.filterOptions.value ?? [];\n const providedKeys = new Set(provided.map((filter) => filter.key));\n const derived = [...activeFilterKeys.value]\n .filter((key) => !providedKeys.has(key))\n .map((key) => {\n const column = options.columns.value.find((candidate) => candidate.key === key);\n\n return {\n key,\n label: column?.label ?? key,\n operators: DEFAULT_OPERATORS,\n options: colOptions.value.get(key) ?? [],\n };\n });\n\n return [...provided.map((filter) => ({ ...filter, operators: filter.operators ?? DEFAULT_OPERATORS })), ...derived];\n });\n\n const searchedRows = computed(() => {\n const rows = options.items.value;\n\n if (!options.clientSide.value) return rows;\n\n const query = searchQuery.value.trim().toLowerCase();\n\n if (!query) return rows;\n\n return rows.filter((row) =>\n Object.values(row).some((value) => value != null && String(value).toLowerCase().includes(query)),\n );\n });\n\n const filteredRows = computed(() => {\n const rows = searchedRows.value;\n\n if (!options.clientSide.value || !filterValues.value.size) return rows;\n\n return rows.filter((row) => {\n for (const [key, rule] of filterValues.value) {\n if (!rule.values.size || !columnKeys.value.has(key)) continue;\n\n const value = row[key];\n const stringValue = value == null ? '' : String(value);\n\n if (rule.operator === 'equals' && !rule.values.has(stringValue)) return false;\n\n if (\n rule.operator === 'contains' &&\n ![...rule.values].some((target) => stringValue.toLowerCase().includes(target.toLowerCase()))\n ) {\n return false;\n }\n\n if (rule.operator === 'gt' || rule.operator === 'lt') {\n const numericValue = parseFloat(stringValue);\n const targets = [...rule.values].map(parseFloat).filter((target) => !Number.isNaN(target));\n\n if (!targets.length) continue;\n\n if (rule.operator === 'gt' && !targets.some((target) => numericValue > target)) return false;\n\n if (rule.operator === 'lt' && !targets.some((target) => numericValue < target)) return false;\n }\n }\n\n return true;\n });\n });\n\n const sortState = computed<SortState>(() => ({ direction: sortDirection.value, key: sortKey.value }));\n const sortedRows = computed(() => {\n const rows = filteredRows.value;\n\n if (!options.clientSide.value || options.sortMode.value === 'server') return rows;\n\n const { direction, key } = sortState.value;\n\n if (!key || direction === 'none') return rows;\n\n const column = options.columns.value.find((candidate) => candidate.key === key);\n\n return rows.slice().sort((a, b) => {\n const aValue = column?.sortValue ? column.sortValue(a) : (a[key] as number | string);\n const bValue = column?.sortValue ? column.sortValue(b) : (b[key] as number | string);\n const comparison =\n typeof aValue === 'number' && typeof bValue === 'number'\n ? aValue - bValue\n : String(aValue ?? '').localeCompare(String(bValue ?? ''));\n\n return direction === 'asc' ? comparison : -comparison;\n });\n });\n\n const totalItems = computed(() => sortedRows.value.length);\n const pageCount = computed(() => {\n const size = options.pageSize.value;\n\n return Math.ceil(totalItems.value / (size <= 0 ? Number.MAX_SAFE_INTEGER : size));\n });\n const safePageIndex = computed(() => (pageCount.value ? Math.min(pageIndex.value, pageCount.value - 1) : -1));\n const currentPageItems = computed(() => {\n const size = options.pageSize.value;\n\n if (size <= 0) return sortedRows.value;\n\n const start = safePageIndex.value * size;\n\n return sortedRows.value.slice(start, start + size);\n });\n const hasNextPage = computed(() => pageCount.value > 0 && safePageIndex.value < pageCount.value - 1);\n const hasPrevPage = computed(() => safePageIndex.value > 0);\n const selectedRows = computed(() =>\n options.items.value.filter((item) => selectedKeys.value.has(options.getRowKey(item))),\n );\n\n watch(\n columnKeys,\n (keys) => {\n const nextActiveKeys = new Set([...activeFilterKeys.value].filter((key) => keys.has(key)));\n const nextValues = new Map([...filterValues.value].filter(([key]) => keys.has(key)));\n\n if (nextActiveKeys.size !== activeFilterKeys.value.size) activeFilterKeys.value = nextActiveKeys;\n\n if (nextValues.size !== filterValues.value.size) filterValues.value = nextValues;\n },\n { immediate: false },\n );\n\n watch(sortedRows, () => {\n pageIndex.value = 0;\n });\n\n const commitSelection = (next: Set<string>): void => {\n selectedKeys.value = next;\n options.onSelectionChange?.(next);\n };\n\n const setFilter = (key: string, values: string[]): void => {\n const next = new Map(filterValues.value);\n\n if (values.length) {\n next.set(key, { operator: next.get(key)?.operator ?? 'contains', values: new Set(values) });\n } else {\n next.delete(key);\n }\n\n filterValues.value = next;\n };\n\n const setFilterOperator = (key: string, operator: FilterOperator): void => {\n const rule = filterValues.value.get(key);\n\n if (rule) filterValues.value = new Map(filterValues.value).set(key, { ...rule, operator });\n };\n\n const sortTo = (key: string, direction: SortDirection): void => {\n sortKey.value = direction === 'none' ? '' : key;\n sortDirection.value = direction;\n pageIndex.value = 0;\n options.onSortChange?.(sortState.value);\n };\n\n return {\n activateFilterKey: (key) => {\n if (!activeFilterKeys.value.has(key)) activeFilterKeys.value = new Set([...activeFilterKeys.value, key]);\n },\n clearAllFilters: () => {\n activeFilterKeys.value = new Set();\n filterValues.value = new Map();\n },\n clearSelection: () => commitSelection(new Set()),\n currentPageItems,\n filterDefs,\n filteredRows,\n filterValues,\n goToPage: (index) => {\n if (Number.isFinite(index)) pageIndex.value = Math.max(0, index);\n },\n hasNextPage,\n hasPrevPage,\n hiddenColumns,\n isAllSelected: () => {\n const page = currentPageItems.value;\n\n return page.length > 0 && page.every((item) => selectedKeys.value.has(options.getRowKey(item)));\n },\n nextPage: () => {\n if (hasNextPage.value) pageIndex.value = safePageIndex.value + 1;\n },\n pageCount,\n pageIndex: safePageIndex,\n prevPage: () => {\n if (hasPrevPage.value) pageIndex.value = safePageIndex.value - 1;\n },\n removeFilter: (key) => {\n const nextActiveKeys = new Set(activeFilterKeys.value);\n\n nextActiveKeys.delete(key);\n activeFilterKeys.value = nextActiveKeys;\n\n const nextValues = new Map(filterValues.value);\n\n nextValues.delete(key);\n filterValues.value = nextValues;\n },\n resetFilters: () => {\n activeFilterKeys.value = new Set();\n filterValues.value = new Map();\n },\n resetSearch: () => {\n searchQuery.value = '';\n searchActive.value = false;\n },\n searchActive,\n searchQuery,\n selectAll: () => {\n if (options.selectionMode.value !== 'multi') return;\n\n const next = new Set(selectedKeys.value);\n\n if (currentPageItems.value.every((item) => next.has(options.getRowKey(item)))) {\n for (const item of currentPageItems.value) next.delete(options.getRowKey(item));\n } else {\n for (const item of currentPageItems.value) next.add(options.getRowKey(item));\n }\n\n commitSelection(next);\n },\n selectedKeys: computed(() => new Set(selectedKeys.value)),\n selectedRows,\n setActiveFilterKeys: (keys) => {\n const nextActiveKeys = new Set(keys);\n\n activeFilterKeys.value = nextActiveKeys;\n filterValues.value = new Map([...filterValues.value].filter(([key]) => nextActiveKeys.has(key)));\n },\n setFilter,\n setFilterOperator,\n setSearchQuery: (query) => {\n searchQuery.value = query;\n },\n setSelection: (keys) => commitSelection(new Set(keys)),\n sortBy: (key) => {\n const nextDirection =\n sortKey.value !== key\n ? 'asc'\n : sortDirection.value === 'asc'\n ? 'desc'\n : sortDirection.value === 'desc'\n ? 'none'\n : 'asc';\n\n sortTo(nextDirection === 'none' ? '' : key, nextDirection);\n },\n sortState,\n sortTo,\n toggleColumnVisibility: (key) => {\n const next = new Set(hiddenColumns.value);\n\n if (next.has(key)) next.delete(key);\n else next.add(key);\n\n hiddenColumns.value = next;\n },\n toggleRow: (key) => {\n if (options.selectionMode.value === 'none') return;\n\n const next = new Set(selectedKeys.value);\n\n if (next.has(key)) next.delete(key);\n else {\n if (options.selectionMode.value === 'single') next.clear();\n\n next.add(key);\n }\n\n commitSelection(next);\n },\n toggleSearch: () => {\n if (searchActive.value) searchQuery.value = '';\n\n searchActive.value = !searchActive.value;\n },\n totalItems,\n visibleColumns,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"datagrid-model.cjs","names":[],"sources":["../../../src/inputs/datagrid/datagrid-model.ts"],"sourcesContent":["import type { HTMLResult } from '@vielzeug/ore';\nimport { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nexport type SortDirection = 'asc' | 'desc' | 'none';\n\nexport type SortState = {\n direction: SortDirection;\n key: string;\n};\n\nexport type DataGridColumn<T = Record<string, unknown>> = {\n align?: 'left' | 'center' | 'right';\n cell?: (item: T) => string;\n filterLabel?: (item: T) => string;\n filterValue?: (item: T) => number | string;\n headerLabel?: string;\n key: string;\n label: string;\n /** Render trusted structured cell content with Ore's safe template result. */\n renderCell?: (item: T) => HTMLResult;\n renderExpanded?: (item: T) => string;\n resizable?: boolean;\n sortable?: boolean;\n sortType?: 'number' | 'text';\n sortValue?: (item: T) => number | string;\n width?: string;\n};\n\nexport type SelectionMode = 'multi' | 'none' | 'single';\n\nexport type FilterOption = {\n key: string;\n label: string;\n operators?: { label: string; value: FilterOperator }[];\n options: { label?: string; value: string }[];\n};\n\nexport type FilterOperator = 'contains' | 'equals' | 'gt' | 'lt';\n\nexport type FilterRule = {\n operator: FilterOperator;\n values: Set<string>;\n};\n\nexport type DataGridView<T = Record<string, unknown>> = {\n filter?: (item: T) => boolean;\n id: string;\n label: string;\n};\n\nexport type DataGridModelOptions<T = Record<string, unknown>> = {\n activeView?: Readable<DataGridView<T> | undefined>;\n clientSide: Readable<boolean>;\n columns: Readable<DataGridColumn<T>[]>;\n emptyValueLabel?: Readable<string>;\n filterOperators?: Readable<{ label: string; value: FilterOperator }[]>;\n filterOptions: Readable<FilterOption[] | undefined>;\n getRowKey: (item: T) => string;\n items: Readable<T[]>;\n onSelectionChange?: (keys: Set<string>) => void;\n onSortChange?: (sort: SortState) => void;\n pageSize: Readable<number>;\n selectionMode: Readable<SelectionMode>;\n sortMode: Readable<'client' | 'server'>;\n};\n\nexport type DataGridModel<T = Record<string, unknown>> = {\n activateFilterKey(key: string): void;\n clearAllFilters(): void;\n clearSelection(): void;\n readonly currentPageItems: Readable<T[]>;\n readonly filterDefs: Readable<FilterOption[]>;\n readonly filteredRows: Readable<T[]>;\n readonly filterValues: Readable<Map<string, FilterRule>>;\n goToPage(index: number): void;\n readonly hasNextPage: Readable<boolean>;\n readonly hasPrevPage: Readable<boolean>;\n readonly hiddenColumns: Readable<Set<string>>;\n isAllSelected(): boolean;\n nextPage(): void;\n readonly pageCount: Readable<number>;\n readonly pageIndex: Readable<number>;\n prevPage(): void;\n removeFilter(key: string): void;\n resetColumnVisibility(): void;\n resetFilters(): void;\n resetSearch(): void;\n readonly searchActive: Readable<boolean>;\n readonly searchQuery: Readable<string>;\n selectAll(): void;\n readonly selectedKeys: Readable<ReadonlySet<string>>;\n readonly selectedRows: Readable<T[]>;\n setActiveFilterKeys(keys: string[]): void;\n setFilter(key: string, values: string[]): void;\n setFilterOperator(key: string, operator: FilterOperator): void;\n setSearchQuery(query: string): void;\n setSelection(keys: Set<string>): void;\n sortBy(key: string): void;\n readonly sortState: Readable<SortState>;\n sortTo(key: string, direction: SortDirection): void;\n toggleColumnVisibility(key: string): void;\n toggleRow(key: string): void;\n toggleSearch(): void;\n readonly totalItems: Readable<number>;\n readonly visibleColumns: Readable<DataGridColumn<T>[]>;\n};\n\nconst DEFAULT_OPERATORS: { label: string; value: FilterOperator }[] = [\n { label: 'Contains', value: 'contains' },\n { label: 'Equals', value: 'equals' },\n { label: 'Greater than', value: 'gt' },\n { label: 'Less than', value: 'lt' },\n];\n\n/**\n * Feature-owned state and transform pipeline for `ore-datagrid`.\n *\n * Rows flow through the active view, query, filters, sorting, and pagination in order. Selection\n * and column visibility share the same model so every interactive grid concern\n * has one reactive owner. Source-backed grids retain their server-owned rows by\n * setting `clientSide` to false.\n */\nexport const createDataGridModel = <T extends Record<string, unknown>>(\n options: DataGridModelOptions<T>,\n): DataGridModel<T> => {\n const searchQuery = signal('');\n const searchActive = signal(false);\n const hiddenColumns = signal(new Set<string>());\n const activeFilterKeys = signal(new Set<string>());\n const filterValues = signal(new Map<string, FilterRule>());\n const sortKey = signal('');\n const sortDirection = signal<SortDirection>('none');\n const selectedKeys = signal(new Set<string>());\n const pageIndex = signal(0);\n\n const filterKeys = computed(\n () =>\n new Set([\n ...options.columns.value.map((column) => column.key),\n ...(options.filterOptions.value ?? []).map((filter) => filter.key),\n ]),\n );\n const visibleColumns = computed(() => options.columns.value.filter((column) => !hiddenColumns.value.has(column.key)));\n const viewedRows = computed(() => {\n const rows = options.items.value;\n\n if (!options.clientSide.value) return rows;\n\n const filter = options.activeView?.value?.filter;\n return filter ? rows.filter(filter) : rows;\n });\n\n const resolveFilterValue = (row: T, key: string): unknown => {\n const column = options.columns.value.find((candidate) => candidate.key === key);\n return column?.filterValue ? column.filterValue(row) : row[key];\n };\n\n const colOptions = computed(() => {\n const externalKeys = new Set((options.filterOptions.value ?? []).map((filter) => filter.key));\n const activeKeys = [...activeFilterKeys.value].filter((key) => !externalKeys.has(key));\n\n if (!activeKeys.length) return new Map<string, { label: string; value: string }[]>();\n\n const derived = new Map<string, { label: string; value: string }[]>();\n\n for (const key of activeKeys) {\n const column = options.columns.value.find((candidate) => candidate.key === key);\n const seen = new Set<string>();\n const values: { label: string; value: string }[] = [];\n\n for (const row of viewedRows.value) {\n const value = resolveFilterValue(row, key);\n const stringValue = value == null ? '' : String(value);\n const displayValue = column?.filterLabel?.(row) ?? column?.cell?.(row) ?? stringValue;\n\n if (!seen.has(stringValue)) {\n seen.add(stringValue);\n values.push({ label: displayValue || options.emptyValueLabel?.value || '(empty)', value: stringValue });\n }\n }\n\n derived.set(key, values);\n }\n\n return derived;\n });\n\n const filterDefs = computed<FilterOption[]>(() => {\n const provided = options.filterOptions.value ?? [];\n const providedKeys = new Set(provided.map((filter) => filter.key));\n const activeProvided = provided.filter((filter) => activeFilterKeys.value.has(filter.key));\n const derived = [...activeFilterKeys.value]\n .filter((key) => !providedKeys.has(key))\n .map((key) => {\n const column = options.columns.value.find((candidate) => candidate.key === key);\n\n return {\n key,\n label: column?.label ?? key,\n operators: options.filterOperators?.value ?? DEFAULT_OPERATORS,\n options: colOptions.value.get(key) ?? [],\n };\n });\n\n return [\n ...activeProvided.map((filter) => ({\n ...filter,\n operators: filter.operators ?? options.filterOperators?.value ?? DEFAULT_OPERATORS,\n })),\n ...derived,\n ];\n });\n\n const searchedRows = computed(() => {\n const rows = viewedRows.value;\n\n if (!options.clientSide.value) return rows;\n\n const query = searchQuery.value.trim().toLowerCase();\n\n if (!query) return rows;\n\n return rows.filter((row) =>\n options.columns.value.some((column) => {\n const value = column.cell ? column.cell(row) : resolveFilterValue(row, column.key);\n return value != null && String(value).toLowerCase().includes(query);\n }),\n );\n });\n\n const filteredRows = computed(() => {\n const rows = searchedRows.value;\n\n if (!options.clientSide.value || !filterValues.value.size) return rows;\n\n return rows.filter((row) => {\n for (const [key, rule] of filterValues.value) {\n if (!rule.values.size || !filterKeys.value.has(key)) continue;\n\n const value = resolveFilterValue(row, key);\n const stringValue = value == null ? '' : String(value);\n\n if (rule.operator === 'equals' && !rule.values.has(stringValue)) return false;\n\n if (\n rule.operator === 'contains' &&\n ![...rule.values].some((target) => stringValue.toLowerCase().includes(target.toLowerCase()))\n ) {\n return false;\n }\n\n if (rule.operator === 'gt' || rule.operator === 'lt') {\n const numericValue = parseFloat(stringValue);\n const targets = [...rule.values].map(parseFloat).filter((target) => !Number.isNaN(target));\n\n if (!targets.length) continue;\n\n if (rule.operator === 'gt' && !targets.some((target) => numericValue > target)) return false;\n\n if (rule.operator === 'lt' && !targets.some((target) => numericValue < target)) return false;\n }\n }\n\n return true;\n });\n });\n\n const sortState = computed<SortState>(() => ({ direction: sortDirection.value, key: sortKey.value }));\n const sortedRows = computed(() => {\n const rows = filteredRows.value;\n\n if (!options.clientSide.value || options.sortMode.value === 'server') return rows;\n\n const { direction, key } = sortState.value;\n\n if (!key || direction === 'none') return rows;\n\n const column = options.columns.value.find((candidate) => candidate.key === key);\n\n return rows.slice().sort((a, b) => {\n const aValue = column?.sortValue ? column.sortValue(a) : (a[key] as number | string);\n const bValue = column?.sortValue ? column.sortValue(b) : (b[key] as number | string);\n const comparison =\n typeof aValue === 'number' && typeof bValue === 'number'\n ? aValue - bValue\n : String(aValue ?? '').localeCompare(String(bValue ?? ''));\n\n return direction === 'asc' ? comparison : -comparison;\n });\n });\n\n const totalItems = computed(() => sortedRows.value.length);\n const pageCount = computed(() => {\n const size = options.pageSize.value;\n\n return Math.ceil(totalItems.value / (size <= 0 ? Number.MAX_SAFE_INTEGER : size));\n });\n const safePageIndex = computed(() => (pageCount.value ? Math.min(pageIndex.value, pageCount.value - 1) : -1));\n const currentPageItems = computed(() => {\n const size = options.pageSize.value;\n\n if (size <= 0) return sortedRows.value;\n\n const start = safePageIndex.value * size;\n\n return sortedRows.value.slice(start, start + size);\n });\n const hasNextPage = computed(() => pageCount.value > 0 && safePageIndex.value < pageCount.value - 1);\n const hasPrevPage = computed(() => safePageIndex.value > 0);\n const selectedRows = computed(() =>\n options.items.value.filter((item) => selectedKeys.value.has(options.getRowKey(item))),\n );\n\n watch(\n filterKeys,\n (keys) => {\n const nextActiveKeys = new Set([...activeFilterKeys.value].filter((key) => keys.has(key)));\n const nextValues = new Map([...filterValues.value].filter(([key]) => keys.has(key)));\n\n if (nextActiveKeys.size !== activeFilterKeys.value.size) activeFilterKeys.value = nextActiveKeys;\n\n if (nextValues.size !== filterValues.value.size) filterValues.value = nextValues;\n },\n { immediate: false },\n );\n\n watch(sortedRows, () => {\n pageIndex.value = 0;\n });\n\n const commitSelection = (next: Set<string>): void => {\n selectedKeys.value = next;\n options.onSelectionChange?.(next);\n };\n\n const setFilter = (key: string, values: string[]): void => {\n const next = new Map(filterValues.value);\n\n if (values.length) {\n const defaultOperator = filterDefs.value.find((filter) => filter.key === key)?.operators?.[0]?.value;\n next.set(key, { operator: next.get(key)?.operator ?? defaultOperator ?? 'contains', values: new Set(values) });\n } else {\n next.delete(key);\n }\n\n filterValues.value = next;\n };\n\n const setFilterOperator = (key: string, operator: FilterOperator): void => {\n const rule = filterValues.value.get(key);\n filterValues.value = new Map(filterValues.value).set(key, {\n operator,\n values: rule?.values ?? new Set(),\n });\n };\n\n const sortTo = (key: string, direction: SortDirection): void => {\n sortKey.value = direction === 'none' ? '' : key;\n sortDirection.value = direction;\n pageIndex.value = 0;\n options.onSortChange?.(sortState.value);\n };\n\n return {\n activateFilterKey: (key) => {\n if (!activeFilterKeys.value.has(key)) activeFilterKeys.value = new Set([...activeFilterKeys.value, key]);\n },\n clearAllFilters: () => {\n activeFilterKeys.value = new Set();\n filterValues.value = new Map();\n },\n clearSelection: () => commitSelection(new Set()),\n currentPageItems,\n filterDefs,\n filteredRows,\n filterValues,\n goToPage: (index) => {\n if (Number.isFinite(index)) pageIndex.value = Math.max(0, index);\n },\n hasNextPage,\n hasPrevPage,\n hiddenColumns,\n isAllSelected: () => {\n const page = currentPageItems.value;\n\n return page.length > 0 && page.every((item) => selectedKeys.value.has(options.getRowKey(item)));\n },\n nextPage: () => {\n if (hasNextPage.value) pageIndex.value = safePageIndex.value + 1;\n },\n pageCount,\n pageIndex: safePageIndex,\n prevPage: () => {\n if (hasPrevPage.value) pageIndex.value = safePageIndex.value - 1;\n },\n removeFilter: (key) => {\n const nextActiveKeys = new Set(activeFilterKeys.value);\n\n nextActiveKeys.delete(key);\n activeFilterKeys.value = nextActiveKeys;\n\n const nextValues = new Map(filterValues.value);\n\n nextValues.delete(key);\n filterValues.value = nextValues;\n },\n resetColumnVisibility: () => {\n hiddenColumns.value = new Set();\n },\n resetFilters: () => {\n activeFilterKeys.value = new Set();\n filterValues.value = new Map();\n },\n resetSearch: () => {\n searchQuery.value = '';\n searchActive.value = false;\n },\n searchActive,\n searchQuery,\n selectAll: () => {\n if (options.selectionMode.value !== 'multi') return;\n\n const next = new Set(selectedKeys.value);\n\n if (currentPageItems.value.every((item) => next.has(options.getRowKey(item)))) {\n for (const item of currentPageItems.value) next.delete(options.getRowKey(item));\n } else {\n for (const item of currentPageItems.value) next.add(options.getRowKey(item));\n }\n\n commitSelection(next);\n },\n selectedKeys: computed(() => new Set(selectedKeys.value)),\n selectedRows,\n setActiveFilterKeys: (keys) => {\n const nextActiveKeys = new Set(keys);\n\n activeFilterKeys.value = nextActiveKeys;\n filterValues.value = new Map([...filterValues.value].filter(([key]) => nextActiveKeys.has(key)));\n },\n setFilter,\n setFilterOperator,\n setSearchQuery: (query) => {\n searchQuery.value = query;\n },\n setSelection: (keys) => commitSelection(new Set(keys)),\n sortBy: (key) => {\n const nextDirection =\n sortKey.value !== key\n ? 'asc'\n : sortDirection.value === 'asc'\n ? 'desc'\n : sortDirection.value === 'desc'\n ? 'none'\n : 'asc';\n\n sortTo(nextDirection === 'none' ? '' : key, nextDirection);\n },\n sortState,\n sortTo,\n toggleColumnVisibility: (key) => {\n const next = new Set(hiddenColumns.value);\n\n if (next.has(key)) next.delete(key);\n else {\n if (visibleColumns.value.length <= 1) return;\n next.add(key);\n }\n\n hiddenColumns.value = next;\n },\n toggleRow: (key) => {\n if (options.selectionMode.value === 'none') return;\n\n const next = new Set(selectedKeys.value);\n\n if (next.has(key)) next.delete(key);\n else {\n if (options.selectionMode.value === 'single') next.clear();\n\n next.add(key);\n }\n\n commitSelection(next);\n },\n toggleSearch: () => {\n if (searchActive.value) searchQuery.value = '';\n\n searchActive.value = !searchActive.value;\n },\n totalItems,\n visibleColumns,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { HTMLResult } from '@vielzeug/ore';
|
|
1
2
|
import { type Readable } from '@vielzeug/ripple';
|
|
2
3
|
export type SortDirection = 'asc' | 'desc' | 'none';
|
|
3
4
|
export type SortState = {
|
|
@@ -7,12 +8,17 @@ export type SortState = {
|
|
|
7
8
|
export type DataGridColumn<T = Record<string, unknown>> = {
|
|
8
9
|
align?: 'left' | 'center' | 'right';
|
|
9
10
|
cell?: (item: T) => string;
|
|
11
|
+
filterLabel?: (item: T) => string;
|
|
12
|
+
filterValue?: (item: T) => number | string;
|
|
10
13
|
headerLabel?: string;
|
|
11
14
|
key: string;
|
|
12
15
|
label: string;
|
|
16
|
+
/** Render trusted structured cell content with Ore's safe template result. */
|
|
17
|
+
renderCell?: (item: T) => HTMLResult;
|
|
13
18
|
renderExpanded?: (item: T) => string;
|
|
14
19
|
resizable?: boolean;
|
|
15
20
|
sortable?: boolean;
|
|
21
|
+
sortType?: 'number' | 'text';
|
|
16
22
|
sortValue?: (item: T) => number | string;
|
|
17
23
|
width?: string;
|
|
18
24
|
};
|
|
@@ -22,7 +28,7 @@ export type FilterOption = {
|
|
|
22
28
|
label: string;
|
|
23
29
|
operators?: {
|
|
24
30
|
label: string;
|
|
25
|
-
value:
|
|
31
|
+
value: FilterOperator;
|
|
26
32
|
}[];
|
|
27
33
|
options: {
|
|
28
34
|
label?: string;
|
|
@@ -34,13 +40,20 @@ export type FilterRule = {
|
|
|
34
40
|
operator: FilterOperator;
|
|
35
41
|
values: Set<string>;
|
|
36
42
|
};
|
|
37
|
-
export type DataGridView = {
|
|
43
|
+
export type DataGridView<T = Record<string, unknown>> = {
|
|
44
|
+
filter?: (item: T) => boolean;
|
|
38
45
|
id: string;
|
|
39
46
|
label: string;
|
|
40
47
|
};
|
|
41
48
|
export type DataGridModelOptions<T = Record<string, unknown>> = {
|
|
49
|
+
activeView?: Readable<DataGridView<T> | undefined>;
|
|
42
50
|
clientSide: Readable<boolean>;
|
|
43
51
|
columns: Readable<DataGridColumn<T>[]>;
|
|
52
|
+
emptyValueLabel?: Readable<string>;
|
|
53
|
+
filterOperators?: Readable<{
|
|
54
|
+
label: string;
|
|
55
|
+
value: FilterOperator;
|
|
56
|
+
}[]>;
|
|
44
57
|
filterOptions: Readable<FilterOption[] | undefined>;
|
|
45
58
|
getRowKey: (item: T) => string;
|
|
46
59
|
items: Readable<T[]>;
|
|
@@ -68,6 +81,7 @@ export type DataGridModel<T = Record<string, unknown>> = {
|
|
|
68
81
|
readonly pageIndex: Readable<number>;
|
|
69
82
|
prevPage(): void;
|
|
70
83
|
removeFilter(key: string): void;
|
|
84
|
+
resetColumnVisibility(): void;
|
|
71
85
|
resetFilters(): void;
|
|
72
86
|
resetSearch(): void;
|
|
73
87
|
readonly searchActive: Readable<boolean>;
|
|
@@ -92,7 +106,7 @@ export type DataGridModel<T = Record<string, unknown>> = {
|
|
|
92
106
|
/**
|
|
93
107
|
* Feature-owned state and transform pipeline for `ore-datagrid`.
|
|
94
108
|
*
|
|
95
|
-
* Rows flow through query, filters, sorting, and pagination in order. Selection
|
|
109
|
+
* Rows flow through the active view, query, filters, sorting, and pagination in order. Selection
|
|
96
110
|
* and column visibility share the same model so every interactive grid concern
|
|
97
111
|
* has one reactive owner. Source-backed grids retain their server-owned rows by
|
|
98
112
|
* setting `clientSide` to false.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datagrid-model.d.ts","sourceRoot":"","sources":["../../../src/inputs/datagrid/datagrid-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAiB,MAAM,kBAAkB,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,aAAa,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACxD,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"datagrid-model.d.ts","sourceRoot":"","sources":["../../../src/inputs/datagrid/datagrid-model.ts"],"names":[],"mappings":"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"}
|