@vielzeug/refine 2.4.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.map +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 +2 -2
- package/dist/card.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 +2 -2
- package/dist/combobox.cjs.map +1 -1
- package/dist/combobox.js +7 -3
- 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/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/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 +215 -17
- package/dist/datagrid.cjs +73 -73
- package/dist/datagrid.cjs.map +1 -1
- package/dist/datagrid.js +331 -332
- 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 +3 -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 +5 -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 -86
- 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/inputs/combobox/combobox.d.ts +12 -1
- package/dist/inputs/combobox/combobox.d.ts.map +1 -1
- package/dist/inputs/datagrid/datagrid.d.ts +24 -32
- 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 +2 -3
- package/dist/inputs/index.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 +1 -1
- package/dist/layout/navbar/navbar.d.ts.map +1 -1
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +6 -6
- package/dist/menu.js.map +1 -1
- package/dist/navbar.cjs +1 -1
- package/dist/navbar.cjs.map +1 -1
- package/dist/navbar.js +87 -85
- 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 +1 -1
- 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.d.ts.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 +5 -5
- package/dist/radio.js.map +1 -1
- package/dist/rating.cjs +1 -1
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.js +1 -1
- package/dist/rating.js.map +1 -1
- package/dist/refine.cjs +207 -207
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +268 -268
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +222 -222
- package/dist/refine.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 +1 -1
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.js +83 -83
- 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 +20 -20
- package/dist/slider.js.map +1 -1
- package/dist/stats.cjs +1 -1
- package/dist/stats.cjs.map +1 -1
- package/dist/stats.js +2 -2
- package/dist/stats.js.map +1 -1
- package/dist/tab-item.cjs.map +1 -1
- package/dist/tab-item.js.map +1 -1
- package/dist/tabs.cjs.map +1 -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 +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option-list.cjs","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { restoreFocus } from '@vielzeug/focus';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport {\n createListControl,\n type ListNavigationAction,\n type ListNavigationChange,\n type ListNavigationTypeaheadOptions,\n} from './nav';\nimport { createOutsidePointerDismissal, type DropdownCloseReason, type OverlayOpenReason } from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItems: () => readonly T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, readonly string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (change: ListNavigationChange<T>) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n typeahead?: ListNavigationTypeaheadOptions<T>;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n [Symbol.dispose](): void;\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n /** Closes the dropdown (without restoring focus) and disposes list navigation state. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (change) => {\n scrollFocusedIntoView();\n options.onNavigate?.(change);\n },\n orientation: options.orientation,\n signal: options.signal,\n typeahead: options.typeahead,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n
|
|
1
|
+
{"version":3,"file":"option-list.cjs","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { restoreFocus } from '@vielzeug/focus';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport {\n createListControl,\n type ListNavigationAction,\n type ListNavigationChange,\n type ListNavigationTypeaheadOptions,\n} from './nav';\nimport { createOutsidePointerDismissal, type DropdownCloseReason, type OverlayOpenReason } from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItems: () => readonly T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, readonly string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (change: ListNavigationChange<T>) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n typeahead?: ListNavigationTypeaheadOptions<T>;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n [Symbol.dispose](): void;\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n /** Closes the dropdown (without restoring focus) and disposes list navigation state. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let disposed = false;\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n if (!disposed) options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (change) => {\n scrollFocusedIntoView();\n options.onNavigate?.(change);\n },\n orientation: options.orientation,\n signal: options.signal,\n typeahead: options.typeahead,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (disposed || !isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (disposed || options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (disposed) return;\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n list.dispose();\n\n if (isOpen.value) {\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n }\n };\n\n options.signal.addEventListener('abort', dispose, { once: true });\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (disposed || !isOpen.value) return false;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n close('escape');\n\n return true;\n }\n\n return list.handleKeydown(event);\n };\n\n return {\n ariaActiveDescendant,\n ariaExpanded,\n close,\n dispose,\n get disposed() {\n return disposed;\n },\n focusedIndex: list.focusedIndex,\n getActiveItem: list.getActiveItem,\n handleKeydown,\n isOpen,\n navigate: list.navigate,\n open,\n scrollFocusedIntoView,\n set: list.set,\n [Symbol.dispose]: dispose,\n toggle,\n updatePosition: () => {\n if (!disposed) positioner.update();\n },\n };\n};\n"],"mappings":"gLAiEA,IAAa,EACX,GACuB,CACvB,GAAI,OAAO,EAAQ,aAAgB,WACjC,MAAM,IAAI,EAAA,kBAAkB,gDAAgD,EAG9E,GAAI,OAAO,EAAQ,UAAa,WAC9B,MAAM,IAAI,EAAA,kBAAkB,6CAA6C,EAG3E,GAAI,OAAO,EAAQ,cAAiB,WAClC,MAAM,IAAI,EAAA,kBAAkB,iDAAiD,EAG/E,IAAM,GAAA,EAAS,EAAA,OAAA,CAAO,EAAK,EACrB,GAAA,EAAe,EAAA,SAAA,KAAe,OAAO,EAAO,KAAK,CAAC,EACpD,EAAW,GACX,EAAuC,KAErC,EAAa,EAAA,yBAAyB,CAC1C,GAAG,EAAQ,YACX,YAAa,EAAQ,SACrB,aAAc,EAAQ,YACxB,CAAC,EAEK,MAAoC,CACnC,GAAU,EAAQ,0BAA0B,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,CACzF,EAEM,EAAO,EAAA,kBAAqB,CAChC,UAAA,EAAU,EAAA,SAAA,KAAe,CAAC,EAAO,KAAK,EACtC,SAAU,EAAQ,SAClB,eAAgB,EAAQ,eACxB,KAAM,EAAQ,KACd,KAAM,EAAQ,MAAQ,GACtB,WAAa,GAAW,CACtB,EAAsB,EACtB,EAAQ,aAAa,CAAM,CAC7B,EACA,YAAa,EAAQ,YACrB,OAAQ,EAAQ,OAChB,UAAW,EAAQ,SACrB,CAAC,EAEK,GAAA,EAAuB,EAAA,SAAA,KAA8B,CACzD,IAAM,EAAQ,EAAK,aAAa,MAEhC,OAAO,EAAQ,aAAe,EAAO,OAAS,GAAS,EAAI,EAAQ,YAAY,CAAK,EAAI,IAC1F,CAAC,EAEK,MACG,OAAO,EAAQ,cAAiB,WAAa,EAAQ,aAAa,EAAK,EAAQ,cAAgB,GAGlG,GAAS,EAA8B,eAAgB,EAAgB,KAAe,CACtF,IAAa,EAAO,QAExB,EAAO,MAAQ,GACf,EAAK,MAAM,EACX,IAAkB,EAClB,EAAkB,KAEd,GAAiB,EAAmB,GAAK,EAAQ,aAAY,EAAA,EAAA,aAAA,CAAa,EAAQ,UAAU,EAEhG,EAAQ,UAAU,CAAM,EAC1B,EAEM,GAAQ,EAA4B,iBAAyB,CAC7D,GAAY,EAAQ,aAAa,GAAK,EAAO,QAEjD,EAAO,MAAQ,GACf,EAAW,OAAO,EAClB,EAAkB,EAAW,kBAAkB,GAAK,KACpD,EAAQ,SAAS,CAAM,EACzB,EAEM,GAAU,EAAgC,QAAS,EAAmC,YAAoB,CAC1G,IACA,EAAO,MAAO,EAAM,CAAW,EAC9B,EAAK,CAAU,EACtB,EAEA,EAAA,8BAA8B,CAC5B,eAAkB,CAAC,EAAQ,YAAY,EAAG,EAAQ,SAAS,CAAC,EAC5D,aAAgB,EAAO,MACvB,cAAiB,EAAM,cAAc,EACrC,OAAQ,EAAQ,MAClB,CAAC,EAED,IAAM,MAAsB,CACtB,IAEJ,EAAW,GACX,EAAK,QAAQ,EAET,EAAO,QACT,EAAO,MAAQ,GACf,EAAK,MAAM,EACX,IAAkB,EAClB,EAAkB,MAEtB,EAiBA,OAfA,EAAQ,OAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EAezD,CACL,uBACA,eACA,QACA,UACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,aAAc,EAAK,aACnB,cAAe,EAAK,cACpB,cAvBqB,GACjB,GAAY,CAAC,EAAO,MAAc,GAElC,EAAM,MAAQ,UAChB,EAAM,eAAe,EACrB,EAAM,QAAQ,EAEP,IAGF,EAAK,cAAc,CAAK,EAc/B,SACA,SAAU,EAAK,SACf,OACA,wBACA,IAAK,EAAK,KACT,OAAO,SAAU,EAClB,SACA,mBAAsB,CACf,GAAU,EAAW,OAAO,CACnC,CACF,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option-list.d.ts","sourceRoot":"","sources":["../../src/core/option-list.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"option-list.d.ts","sourceRoot":"","sources":["../../src/core/option-list.ts"],"names":[],"mappings":"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"}
|
package/dist/core/option-list.js
CHANGED
|
@@ -9,62 +9,64 @@ var s = (s) => {
|
|
|
9
9
|
if (typeof s.getBoundary != "function") throw new e("createListboxDropdown: getBoundary is required");
|
|
10
10
|
if (typeof s.getPanel != "function") throw new e("createListboxDropdown: getPanel is required");
|
|
11
11
|
if (typeof s.getReference != "function") throw new e("createListboxDropdown: getReference is required");
|
|
12
|
-
let c = a(!1), l = i(() => String(c.value)), u =
|
|
12
|
+
let c = a(!1), l = i(() => String(c.value)), u = !1, d = null, f = r({
|
|
13
13
|
...s.positioning,
|
|
14
14
|
getFloating: s.getPanel,
|
|
15
15
|
getReference: s.getReference
|
|
16
|
-
}),
|
|
17
|
-
s.getFocusedOptionElement?.()?.scrollIntoView({ block: "nearest" });
|
|
18
|
-
},
|
|
16
|
+
}), p = () => {
|
|
17
|
+
u || s.getFocusedOptionElement?.()?.scrollIntoView({ block: "nearest" });
|
|
18
|
+
}, m = n({
|
|
19
19
|
disabled: i(() => !c.value),
|
|
20
20
|
getItems: s.getItems,
|
|
21
21
|
isItemDisabled: s.isItemDisabled,
|
|
22
22
|
keys: s.keys,
|
|
23
23
|
loop: s.loop ?? !0,
|
|
24
24
|
onNavigate: (e) => {
|
|
25
|
-
|
|
25
|
+
p(), s.onNavigate?.(e);
|
|
26
26
|
},
|
|
27
27
|
orientation: s.orientation,
|
|
28
28
|
signal: s.signal,
|
|
29
29
|
typeahead: s.typeahead
|
|
30
|
-
}),
|
|
31
|
-
let e =
|
|
30
|
+
}), h = i(() => {
|
|
31
|
+
let e = m.focusedIndex.value;
|
|
32
32
|
return s.getOptionId && c.value && e >= 0 ? s.getOptionId(e) : null;
|
|
33
|
-
}),
|
|
34
|
-
c.value && (c.value = !1,
|
|
35
|
-
},
|
|
36
|
-
s.isDisabled?.() || c.value || (c.value = !0,
|
|
37
|
-
},
|
|
38
|
-
c.value ?
|
|
33
|
+
}), g = () => typeof s.restoreFocus == "function" ? s.restoreFocus() : s.restoreFocus ?? !0, _ = (e = "programmatic", t = !0) => {
|
|
34
|
+
!u && c.value && (c.value = !1, m.reset(), d?.(), d = null, t && g() && s.getTrigger && o(s.getTrigger), s.onClose?.(e));
|
|
35
|
+
}, v = (e = "programmatic") => {
|
|
36
|
+
u || s.isDisabled?.() || c.value || (c.value = !0, f.update(), d = f.startAutoUpdate?.() ?? null, s.onOpen?.(e));
|
|
37
|
+
}, y = (e = "click", t = "trigger") => {
|
|
38
|
+
u || (c.value ? _(t) : v(e));
|
|
39
39
|
};
|
|
40
40
|
t({
|
|
41
41
|
getTargets: () => [s.getBoundary(), s.getPanel()],
|
|
42
42
|
isActive: () => c.value,
|
|
43
|
-
onDismiss: () =>
|
|
43
|
+
onDismiss: () => _("outsideClick"),
|
|
44
44
|
signal: s.signal
|
|
45
45
|
});
|
|
46
|
-
let
|
|
47
|
-
|
|
46
|
+
let b = () => {
|
|
47
|
+
u || (u = !0, m.dispose(), c.value && (c.value = !1, m.reset(), d?.(), d = null));
|
|
48
48
|
};
|
|
49
49
|
return s.signal.addEventListener("abort", b, { once: !0 }), {
|
|
50
|
-
ariaActiveDescendant:
|
|
50
|
+
ariaActiveDescendant: h,
|
|
51
51
|
ariaExpanded: l,
|
|
52
|
-
close:
|
|
52
|
+
close: _,
|
|
53
53
|
dispose: b,
|
|
54
54
|
get disposed() {
|
|
55
|
-
return
|
|
55
|
+
return u;
|
|
56
56
|
},
|
|
57
|
-
focusedIndex:
|
|
58
|
-
getActiveItem:
|
|
59
|
-
handleKeydown: (e) => c.value ? e.key === "Escape" ? (e.preventDefault(),
|
|
57
|
+
focusedIndex: m.focusedIndex,
|
|
58
|
+
getActiveItem: m.getActiveItem,
|
|
59
|
+
handleKeydown: (e) => u || !c.value ? !1 : e.key === "Escape" ? (e.preventDefault(), _("escape"), !0) : m.handleKeydown(e),
|
|
60
60
|
isOpen: c,
|
|
61
|
-
navigate:
|
|
62
|
-
open:
|
|
63
|
-
scrollFocusedIntoView:
|
|
64
|
-
set:
|
|
61
|
+
navigate: m.navigate,
|
|
62
|
+
open: v,
|
|
63
|
+
scrollFocusedIntoView: p,
|
|
64
|
+
set: m.set,
|
|
65
65
|
[Symbol.dispose]: b,
|
|
66
|
-
toggle:
|
|
67
|
-
updatePosition:
|
|
66
|
+
toggle: y,
|
|
67
|
+
updatePosition: () => {
|
|
68
|
+
u || f.update();
|
|
69
|
+
}
|
|
68
70
|
};
|
|
69
71
|
};
|
|
70
72
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"option-list.js","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { restoreFocus } from '@vielzeug/focus';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport {\n createListControl,\n type ListNavigationAction,\n type ListNavigationChange,\n type ListNavigationTypeaheadOptions,\n} from './nav';\nimport { createOutsidePointerDismissal, type DropdownCloseReason, type OverlayOpenReason } from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItems: () => readonly T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, readonly string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (change: ListNavigationChange<T>) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n typeahead?: ListNavigationTypeaheadOptions<T>;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n [Symbol.dispose](): void;\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n /** Closes the dropdown (without restoring focus) and disposes list navigation state. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (change) => {\n scrollFocusedIntoView();\n options.onNavigate?.(change);\n },\n orientation: options.orientation,\n signal: options.signal,\n typeahead: options.typeahead,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n
|
|
1
|
+
{"version":3,"file":"option-list.js","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { restoreFocus } from '@vielzeug/focus';\nimport { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport {\n createListControl,\n type ListNavigationAction,\n type ListNavigationChange,\n type ListNavigationTypeaheadOptions,\n} from './nav';\nimport { createOutsidePointerDismissal, type DropdownCloseReason, type OverlayOpenReason } from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItems: () => readonly T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, readonly string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (change: ListNavigationChange<T>) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n typeahead?: ListNavigationTypeaheadOptions<T>;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n [Symbol.dispose](): void;\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n /** Closes the dropdown (without restoring focus) and disposes list navigation state. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let disposed = false;\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n if (!disposed) options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (change) => {\n scrollFocusedIntoView();\n options.onNavigate?.(change);\n },\n orientation: options.orientation,\n signal: options.signal,\n typeahead: options.typeahead,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (disposed || !isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (disposed || options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (disposed) return;\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n list.dispose();\n\n if (isOpen.value) {\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n }\n };\n\n options.signal.addEventListener('abort', dispose, { once: true });\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (disposed || !isOpen.value) return false;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n close('escape');\n\n return true;\n }\n\n return list.handleKeydown(event);\n };\n\n return {\n ariaActiveDescendant,\n ariaExpanded,\n close,\n dispose,\n get disposed() {\n return disposed;\n },\n focusedIndex: list.focusedIndex,\n getActiveItem: list.getActiveItem,\n handleKeydown,\n isOpen,\n navigate: list.navigate,\n open,\n scrollFocusedIntoView,\n set: list.set,\n [Symbol.dispose]: dispose,\n toggle,\n updatePosition: () => {\n if (!disposed) positioner.update();\n },\n };\n};\n"],"mappings":";;;;;;;AAiEA,IAAa,KACX,MACuB;CACvB,IAAI,OAAO,EAAQ,eAAgB,YACjC,MAAM,IAAI,EAAkB,gDAAgD;CAG9E,IAAI,OAAO,EAAQ,YAAa,YAC9B,MAAM,IAAI,EAAkB,6CAA6C;CAG3E,IAAI,OAAO,EAAQ,gBAAiB,YAClC,MAAM,IAAI,EAAkB,iDAAiD;CAG/E,IAAM,IAAS,EAAO,EAAK,GACrB,IAAe,QAAe,OAAO,EAAO,KAAK,CAAC,GACpD,IAAW,IACX,IAAuC,MAErC,IAAa,EAAyB;EAC1C,GAAG,EAAQ;EACX,aAAa,EAAQ;EACrB,cAAc,EAAQ;CACxB,CAAC,GAEK,UAAoC;EACxC,AAAK,KAAU,EAAQ,0BAA0B,CAAC,EAAE,eAAe,EAAE,OAAO,UAAU,CAAC;CACzF,GAEM,IAAO,EAAqB;EAChC,UAAU,QAAe,CAAC,EAAO,KAAK;EACtC,UAAU,EAAQ;EAClB,gBAAgB,EAAQ;EACxB,MAAM,EAAQ;EACd,MAAM,EAAQ,QAAQ;EACtB,aAAa,MAAW;GAEtB,AADA,EAAsB,GACtB,EAAQ,aAAa,CAAM;EAC7B;EACA,aAAa,EAAQ;EACrB,QAAQ,EAAQ;EAChB,WAAW,EAAQ;CACrB,CAAC,GAEK,IAAuB,QAA8B;EACzD,IAAM,IAAQ,EAAK,aAAa;EAEhC,OAAO,EAAQ,eAAe,EAAO,SAAS,KAAS,IAAI,EAAQ,YAAY,CAAK,IAAI;CAC1F,CAAC,GAEK,UACG,OAAO,EAAQ,gBAAiB,aAAa,EAAQ,aAAa,IAAK,EAAQ,gBAAgB,IAGlG,KAAS,IAA8B,gBAAgB,IAAgB,OAAe;EACtF,MAAa,EAAO,UAExB,EAAO,QAAQ,IACf,EAAK,MAAM,GACX,IAAkB,GAClB,IAAkB,MAEd,KAAiB,EAAmB,KAAK,EAAQ,cAAY,EAAa,EAAQ,UAAU,GAEhG,EAAQ,UAAU,CAAM;CAC1B,GAEM,KAAQ,IAA4B,mBAAyB;EAC7D,KAAY,EAAQ,aAAa,KAAK,EAAO,UAEjD,EAAO,QAAQ,IACf,EAAW,OAAO,GAClB,IAAkB,EAAW,kBAAkB,KAAK,MACpD,EAAQ,SAAS,CAAM;CACzB,GAEM,KAAU,IAAgC,SAAS,IAAmC,cAAoB;EAC1G,MACA,EAAO,QAAO,EAAM,CAAW,IAC9B,EAAK,CAAU;CACtB;CAEA,EAA8B;EAC5B,kBAAkB,CAAC,EAAQ,YAAY,GAAG,EAAQ,SAAS,CAAC;EAC5D,gBAAgB,EAAO;EACvB,iBAAiB,EAAM,cAAc;EACrC,QAAQ,EAAQ;CAClB,CAAC;CAED,IAAM,UAAsB;EACtB,MAEJ,IAAW,IACX,EAAK,QAAQ,GAET,EAAO,UACT,EAAO,QAAQ,IACf,EAAK,MAAM,GACX,IAAkB,GAClB,IAAkB;CAEtB;CAiBA,OAfA,EAAQ,OAAO,iBAAiB,SAAS,GAAS,EAAE,MAAM,GAAK,CAAC,GAezD;EACL;EACA;EACA;EACA;EACA,IAAI,WAAW;GACb,OAAO;EACT;EACA,cAAc,EAAK;EACnB,eAAe,EAAK;EACpB,gBAvBqB,MACjB,KAAY,CAAC,EAAO,QAAc,KAElC,EAAM,QAAQ,YAChB,EAAM,eAAe,GACrB,EAAM,QAAQ,GAEP,MAGF,EAAK,cAAc,CAAK;EAc/B;EACA,UAAU,EAAK;EACf;EACA;EACA,KAAK,EAAK;GACT,OAAO,UAAU;EAClB;EACA,sBAAsB;GACpB,AAAK,KAAU,EAAW,OAAO;EACnC;CACF;AACF"}
|
package/dist/core/slider.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./numbers.cjs");let t=require("@vielzeug/arsenal
|
|
1
|
+
const e=require("./numbers.cjs");let t=require("@vielzeug/arsenal");var n=n=>{let r=()=>e.toFiniteNumberOr(n.min?.value,0),i=()=>e.toFiniteNumberOr(n.max?.value,100),a=()=>e.toPositiveStep(n.step?.value,1),o=n=>{let a=r(),o=i();return(0,t.clamp)(e.toFiniteNumberOr(n,a),a,o)},s=t=>{let n=r();return o(Math.round(e.toFiniteNumberOr(t,n)/a())*a())},c=t=>{let n=r(),a=i(),o=e.toFiniteNumberOr(t,n);return a<=n?0:(o-n)/(a-n)*100},l=(e,t)=>{if(t.width<=0)return s(r());let n=Math.max(0,Math.min(1,(e-t.left)/t.width)),a=r(),o=i();return s(a+n*(o-a))},u=(t,n)=>{let s=e.toFiniteNumberOr(n,r());return t===`ArrowRight`||t===`ArrowUp`?o(s+a()):t===`ArrowLeft`||t===`ArrowDown`?o(s-a()):t===`Home`?r():t===`End`?i():null};return{clamp:o,fromClientX:l,handleKeydown:(e,t,r)=>{if(n.disabled?.value||n.readonly?.value)return!1;let i=u(e.key,t);return i!==null&&(e.preventDefault(),r(i),!0)},max:i,min:r,nextFromKey:u,snap:s,toPercent:c}};exports.createSliderControl=n;
|
|
2
2
|
//# sourceMappingURL=slider.cjs.map
|
package/dist/core/slider.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.cjs","names":[],"sources":["../../src/core/slider.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal
|
|
1
|
+
{"version":3,"file":"slider.cjs","names":[],"sources":["../../src/core/slider.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport { toFiniteNumberOr, toPositiveStep } from './numbers';\n\n// ── Slider control ────────────────────────────────────────────────────────────\n\nexport type SliderControlOptions = {\n disabled?: Readable<boolean | undefined>;\n max?: Readable<number | string | undefined>;\n min?: Readable<number | string | undefined>;\n readonly?: Readable<boolean | undefined>;\n step?: Readable<number | string | undefined>;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n /**\n * Handles keyboard navigation for a slider input.\n * When the slider is disabled or readonly, the event is ignored and `false` is returned.\n * @returns `true` when the event was handled and `onCommit` was called, `false` otherwise.\n */\n handleKeydown: (event: KeyboardEvent, currentValue: number, onCommit: (value: number) => void) => boolean;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.value, 0);\n const max = (): number => toFiniteNumberOr(options.max?.value, 100);\n const step = (): number => toPositiveStep(options.step?.value, 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n\n return clampRange(toFiniteNumberOr(value, minValue), minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n\n return clamp(Math.round(toFiniteNumberOr(value, minValue) / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = toFiniteNumberOr(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = toFiniteNumberOr(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n const handleKeydown = (event: KeyboardEvent, currentValue: number, onCommit: (value: number) => void): boolean => {\n if (options.disabled?.value || options.readonly?.value) return false;\n\n const next = nextFromKey(event.key, currentValue);\n\n if (next === null) return false;\n\n event.preventDefault();\n onCommit(next);\n\n return true;\n };\n\n return { clamp, fromClientX, handleKeydown, max, min, nextFromKey, snap, toPercent };\n};\n"],"mappings":"oEA+BA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAA,iBAAiB,EAAQ,KAAK,MAAO,CAAC,EAC1D,MAAoB,EAAA,iBAAiB,EAAQ,KAAK,MAAO,GAAG,EAC5D,MAAqB,EAAA,eAAe,EAAQ,MAAM,MAAO,CAAC,EAE1D,EAAS,GAA0B,CACvC,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EAErB,OAAA,EAAO,EAAA,MAAA,CAAW,EAAA,iBAAiB,EAAO,CAAQ,EAAG,EAAU,CAAQ,CACzE,EAEM,EAAQ,GAA0B,CACtC,IAAM,EAAW,EAAI,EAErB,OAAO,EAAM,KAAK,MAAM,EAAA,iBAAiB,EAAO,CAAQ,EAAI,EAAK,CAAC,EAAI,EAAK,CAAC,CAC9E,EAEM,EAAa,GAA0B,CAC3C,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EACf,EAAa,EAAA,iBAAiB,EAAO,CAAQ,EAInD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,GAC7D,EAEM,GAAe,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,EAAI,CAAC,EAEtC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,KAAK,CAAC,EACjE,EAAW,EAAI,EACf,EAAW,EAAI,EAErB,OAAO,EAAK,EAAW,GAAO,EAAW,EAAS,CACpD,EAEM,GAAe,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAA,iBAAiB,EAAS,EAAI,CAAC,EAUlD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,EAAK,CAAC,EAE3E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,EAAK,CAAC,EAE5E,IAAQ,OAAe,EAAI,EAE3B,IAAQ,MAAc,EAAI,EAEvB,IACT,EAeA,MAAO,CAAE,QAAO,cAAa,eAbN,EAAsB,EAAsB,IAA+C,CAChH,GAAI,EAAQ,UAAU,OAAS,EAAQ,UAAU,MAAO,MAAO,GAE/D,IAAM,EAAO,EAAY,EAAM,IAAK,CAAY,EAOhD,OALI,IAAS,OAEb,EAAM,eAAe,EACrB,EAAS,CAAI,EAEN,GACT,EAE4C,MAAK,MAAK,cAAa,OAAM,WAAU,CACrF"}
|
package/dist/core/slider.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toFiniteNumberOr as e, toPositiveStep as t } from "./numbers.js";
|
|
2
|
-
import { clamp as n } from "@vielzeug/arsenal
|
|
2
|
+
import { clamp as n } from "@vielzeug/arsenal";
|
|
3
3
|
//#region src/core/slider.ts
|
|
4
4
|
var r = (r) => {
|
|
5
5
|
let i = () => e(r.min?.value, 0), a = () => e(r.max?.value, 100), o = () => t(r.step?.value, 1), s = (t) => {
|
package/dist/core/slider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slider.js","names":[],"sources":["../../src/core/slider.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal
|
|
1
|
+
{"version":3,"file":"slider.js","names":[],"sources":["../../src/core/slider.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport { toFiniteNumberOr, toPositiveStep } from './numbers';\n\n// ── Slider control ────────────────────────────────────────────────────────────\n\nexport type SliderControlOptions = {\n disabled?: Readable<boolean | undefined>;\n max?: Readable<number | string | undefined>;\n min?: Readable<number | string | undefined>;\n readonly?: Readable<boolean | undefined>;\n step?: Readable<number | string | undefined>;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n /**\n * Handles keyboard navigation for a slider input.\n * When the slider is disabled or readonly, the event is ignored and `false` is returned.\n * @returns `true` when the event was handled and `onCommit` was called, `false` otherwise.\n */\n handleKeydown: (event: KeyboardEvent, currentValue: number, onCommit: (value: number) => void) => boolean;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.value, 0);\n const max = (): number => toFiniteNumberOr(options.max?.value, 100);\n const step = (): number => toPositiveStep(options.step?.value, 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n\n return clampRange(toFiniteNumberOr(value, minValue), minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n\n return clamp(Math.round(toFiniteNumberOr(value, minValue) / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = toFiniteNumberOr(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = toFiniteNumberOr(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n const handleKeydown = (event: KeyboardEvent, currentValue: number, onCommit: (value: number) => void): boolean => {\n if (options.disabled?.value || options.readonly?.value) return false;\n\n const next = nextFromKey(event.key, currentValue);\n\n if (next === null) return false;\n\n event.preventDefault();\n onCommit(next);\n\n return true;\n };\n\n return { clamp, fromClientX, handleKeydown, max, min, nextFromKey, snap, toPercent };\n};\n"],"mappings":";;;AA+BA,IAAa,KAAuB,MAAiD;CACnF,IAAM,UAAoB,EAAiB,EAAQ,KAAK,OAAO,CAAC,GAC1D,UAAoB,EAAiB,EAAQ,KAAK,OAAO,GAAG,GAC5D,UAAqB,EAAe,EAAQ,MAAM,OAAO,CAAC,GAE1D,KAAS,MAA0B;EACvC,IAAM,IAAW,EAAI,GACf,IAAW,EAAI;EAErB,OAAO,EAAW,EAAiB,GAAO,CAAQ,GAAG,GAAU,CAAQ;CACzE,GAEM,KAAQ,MAA0B;EACtC,IAAM,IAAW,EAAI;EAErB,OAAO,EAAM,KAAK,MAAM,EAAiB,GAAO,CAAQ,IAAI,EAAK,CAAC,IAAI,EAAK,CAAC;CAC9E,GAEM,KAAa,MAA0B;EAC3C,IAAM,IAAW,EAAI,GACf,IAAW,EAAI,GACf,IAAa,EAAiB,GAAO,CAAQ;EAInD,OAFI,KAAY,IAAiB,KAExB,IAAa,MAAa,IAAW,KAAa;CAC7D,GAEM,KAAe,GAAiB,MAAkD;EACtF,IAAI,EAAK,SAAS,GAAG,OAAO,EAAK,EAAI,CAAC;EAEtC,IAAM,IAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAU,EAAK,QAAQ,EAAK,KAAK,CAAC,GACjE,IAAW,EAAI,GACf,IAAW,EAAI;EAErB,OAAO,EAAK,IAAW,KAAO,IAAW,EAAS;CACpD,GAEM,KAAe,GAAa,MAAmC;EACnE,IAAM,IAAa,EAAiB,GAAS,EAAI,CAAC;EAUlD,OARI,MAAQ,gBAAgB,MAAQ,YAAkB,EAAM,IAAa,EAAK,CAAC,IAE3E,MAAQ,eAAe,MAAQ,cAAoB,EAAM,IAAa,EAAK,CAAC,IAE5E,MAAQ,SAAe,EAAI,IAE3B,MAAQ,QAAc,EAAI,IAEvB;CACT;CAeA,OAAO;EAAE,OAAA;EAAO;EAAa,gBAbN,GAAsB,GAAsB,MAA+C;GAChH,IAAI,EAAQ,UAAU,SAAS,EAAQ,UAAU,OAAO,OAAO;GAE/D,IAAM,IAAO,EAAY,EAAM,KAAK,CAAY;GAOhD,OALI,MAAS,SAEb,EAAM,eAAe,GACrB,EAAS,CAAI,GAEN;EACT;EAE4C;EAAK;EAAK;EAAa;EAAM;CAAU;AACrF"}
|
package/dist/core/spinner.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./keyboard.cjs"),t=require("./numbers.cjs");let n=require("@vielzeug/arsenal
|
|
1
|
+
const e=require("./keyboard.cjs"),t=require("./numbers.cjs");let n=require("@vielzeug/arsenal");var r=r=>{let i=()=>!!r.disabled?.value||!!r.readonly?.value,a=()=>t.toFiniteNumber(r.min?.value),o=()=>t.toFiniteNumber(r.max?.value),s=e=>(0,n.clamp)(e,a(),o()),c=()=>t.toPositiveStep(r.step?.value,1),l=()=>{let e=c();return t.toPositiveStep(r.largeStep?.value,e*10)},u=()=>r.parse()??a()??0,d=(e,t)=>{if(e==null){r.commit(null,t);return}r.commit(s(e),t)},f=(e,t)=>{i()||d(u()+e,t)};return{atMax:()=>{let e=r.parse(),t=o();return e!=null&&t!=null&&e>=t},atMin:()=>{let e=r.parse(),t=a();return e!=null&&t!=null&&e<=t},handleKeydown:t=>!i()&&e.dispatchKeyboardAction(t,{keymap:{ArrowDown:()=>f(-c(),t),ArrowUp:()=>f(c(),t),End:()=>{let e=o();if(e==null)return!1;d(e,t)},Home:()=>{let e=a();if(e==null)return!1;d(e,t)},PageDown:()=>f(-l(),t),PageUp:()=>f(l(),t)},preventDefault:`after`}),incrementBy:f}};exports.createSpinnerControl=r;
|
|
2
2
|
//# sourceMappingURL=spinner.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.cjs","names":[],"sources":["../../src/core/spinner.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal
|
|
1
|
+
{"version":3,"file":"spinner.cjs","names":[],"sources":["../../src/core/spinner.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport { dispatchKeyboardAction } from './keyboard';\nimport { toFiniteNumber, toPositiveStep } from './numbers';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: Readable<boolean | undefined>;\n largeStep?: Readable<number | string | undefined>;\n max?: Readable<number | string | undefined>;\n min?: Readable<number | string | undefined>;\n parse: () => number | null;\n readonly?: Readable<boolean | undefined>;\n step?: Readable<number | string | undefined>;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.value) || Boolean(options.readonly?.value);\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.value);\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.value);\n };\n\n const clamp = (value: number): number => {\n return clampRange(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.value, 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.value, s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (isBlocked()) return false;\n\n return dispatchKeyboardAction(event, {\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"gGAwBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,UAAU,OAAU,EAAQ,EAAQ,UAAU,MAEzF,MACG,EAAA,eAAe,EAAQ,KAAK,KAAK,EAGpC,MACG,EAAA,eAAe,EAAQ,KAAK,KAAK,EAGpC,EAAS,IACb,EAAO,EAAA,MAAA,CAAW,EAAO,EAAI,EAAG,EAAI,CAAC,EAGjC,MAAqB,EAAA,eAAe,EAAQ,MAAM,MAAO,CAAC,EAE1D,MAA0B,CAC9B,IAAM,EAAI,EAAK,EAEf,OAAO,EAAA,eAAe,EAAQ,WAAW,MAAO,EAAI,EAAE,CACxD,EAEM,MACW,EAAQ,MAEnB,GAEa,EAEb,GAEG,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,CAAa,EAElC,MACF,CAEA,EAAQ,OAAO,EAAM,CAAK,EAAG,CAAa,CAC5C,EAEM,GAAe,EAAe,IAAgC,CAC9D,EAAU,GAEd,EAAO,EAAkB,EAAI,EAAO,CAAa,CACnD,EA4CA,MAAO,CACL,UApC2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EAgCE,UA5C2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EAwCE,cA/BqB,GACrB,CAAI,EAAU,GAEP,EAAA,uBAAuB,EAAO,CACnC,OAAQ,CACN,cAAiB,EAAY,CAAC,EAAK,EAAG,CAAK,EAC3C,YAAe,EAAY,EAAK,EAAG,CAAK,EACxC,QAAW,CACT,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,SAAY,CACV,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,aAAgB,EAAY,CAAC,EAAU,EAAG,CAAK,EAC/C,WAAc,EAAY,EAAU,EAAG,CAAK,CAC9C,EACA,eAAgB,OAClB,CAAC,EAOD,aACF,CACF"}
|
package/dist/core/spinner.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { dispatchKeyboardAction as e } from "./keyboard.js";
|
|
2
2
|
import { toFiniteNumber as t, toPositiveStep as n } from "./numbers.js";
|
|
3
|
-
import { clamp as r } from "@vielzeug/arsenal
|
|
3
|
+
import { clamp as r } from "@vielzeug/arsenal";
|
|
4
4
|
//#region src/core/spinner.ts
|
|
5
5
|
var i = (i) => {
|
|
6
6
|
let a = () => !!i.disabled?.value || !!i.readonly?.value, o = () => t(i.min?.value), s = () => t(i.max?.value), c = (e) => r(e, o(), s()), l = () => n(i.step?.value, 1), u = () => {
|
package/dist/core/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","names":[],"sources":["../../src/core/spinner.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal
|
|
1
|
+
{"version":3,"file":"spinner.js","names":[],"sources":["../../src/core/spinner.ts"],"sourcesContent":["import { clamp as clampRange } from '@vielzeug/arsenal';\nimport type { Readable } from '@vielzeug/ripple';\n\nimport { dispatchKeyboardAction } from './keyboard';\nimport { toFiniteNumber, toPositiveStep } from './numbers';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: Readable<boolean | undefined>;\n largeStep?: Readable<number | string | undefined>;\n max?: Readable<number | string | undefined>;\n min?: Readable<number | string | undefined>;\n parse: () => number | null;\n readonly?: Readable<boolean | undefined>;\n step?: Readable<number | string | undefined>;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.value) || Boolean(options.readonly?.value);\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.value);\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.value);\n };\n\n const clamp = (value: number): number => {\n return clampRange(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.value, 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.value, s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (isBlocked()) return false;\n\n return dispatchKeyboardAction(event, {\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":";;;;AAwBA,IAAa,KAAwB,MAAmD;CACtF,IAAM,UAA2B,EAAQ,EAAQ,UAAU,SAAU,EAAQ,EAAQ,UAAU,OAEzF,UACG,EAAe,EAAQ,KAAK,KAAK,GAGpC,UACG,EAAe,EAAQ,KAAK,KAAK,GAGpC,KAAS,MACN,EAAW,GAAO,EAAI,GAAG,EAAI,CAAC,GAGjC,UAAqB,EAAe,EAAQ,MAAM,OAAO,CAAC,GAE1D,UAA0B;EAC9B,IAAM,IAAI,EAAK;EAEf,OAAO,EAAe,EAAQ,WAAW,OAAO,IAAI,EAAE;CACxD,GAEM,UACW,EAAQ,MAEnB,KAEa,EAEb,KAEG,GAGH,KAAU,GAAsB,MAAgC;EACpE,IAAI,KAAS,MAAM;GACjB,EAAQ,OAAO,MAAM,CAAa;GAElC;EACF;EAEA,EAAQ,OAAO,EAAM,CAAK,GAAG,CAAa;CAC5C,GAEM,KAAe,GAAe,MAAgC;EAC9D,EAAU,KAEd,EAAO,EAAkB,IAAI,GAAO,CAAa;CACnD;CA4CA,OAAO;EACL,aApC2B;GAC3B,IAAM,IAAS,EAAQ,MAAM,GACvB,IAAW,EAAI;GAErB,OAAO,KAAU,QAAQ,KAAY,QAAQ,KAAU;EACzD;EAgCE,aA5C2B;GAC3B,IAAM,IAAS,EAAQ,MAAM,GACvB,IAAW,EAAI;GAErB,OAAO,KAAU,QAAQ,KAAY,QAAQ,KAAU;EACzD;EAwCE,gBA/BqB,MACrB,CAAI,EAAU,KAEP,EAAuB,GAAO;GACnC,QAAQ;IACN,iBAAiB,EAAY,CAAC,EAAK,GAAG,CAAK;IAC3C,eAAe,EAAY,EAAK,GAAG,CAAK;IACxC,WAAW;KACT,IAAM,IAAW,EAAI;KAErB,IAAI,KAAY,MAAM,OAAO;KAE7B,EAAO,GAAU,CAAK;IACxB;IACA,YAAY;KACV,IAAM,IAAW,EAAI;KAErB,IAAI,KAAY,MAAM,OAAO;KAE7B,EAAO,GAAU,CAAK;IACxB;IACA,gBAAgB,EAAY,CAAC,EAAU,GAAG,CAAK;IAC/C,cAAc,EAAY,EAAU,GAAG,CAAK;GAC9C;GACA,gBAAgB;EAClB,CAAC;EAOD;CACF;AACF"}
|