@vielzeug/refine 2.1.3 → 2.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion.cjs +1 -1
- package/dist/accordion.cjs.map +1 -1
- package/dist/accordion.js +2 -2
- package/dist/accordion.js.map +1 -1
- package/dist/carousel.cjs +25 -24
- package/dist/carousel.cjs.map +1 -1
- package/dist/carousel.js +125 -135
- package/dist/carousel.js.map +1 -1
- package/dist/combobox.cjs +14 -14
- package/dist/combobox.cjs.map +1 -1
- package/dist/combobox.js +88 -98
- package/dist/combobox.js.map +1 -1
- package/dist/content/carousel/carousel.d.ts.map +1 -1
- package/dist/content/list/_list-item-reveal.cjs +1 -1
- package/dist/content/list/_list-item-reveal.cjs.map +1 -1
- package/dist/content/list/_list-item-reveal.d.ts +3 -3
- package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
- package/dist/content/list/_list-item-reveal.js +22 -22
- package/dist/content/list/_list-item-reveal.js.map +1 -1
- package/dist/content/list/list-item.d.ts.map +1 -1
- package/dist/core/focus.cjs +1 -1
- package/dist/core/focus.cjs.map +1 -1
- package/dist/core/focus.d.ts.map +1 -1
- package/dist/core/focus.js +21 -20
- package/dist/core/focus.js.map +1 -1
- package/dist/core/index.d.ts +2 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/nav.cjs +1 -1
- package/dist/core/nav.cjs.map +1 -1
- package/dist/core/nav.d.ts +3 -62
- package/dist/core/nav.d.ts.map +1 -1
- package/dist/core/nav.js +41 -124
- 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 +5 -5
- package/dist/core/option-list.d.ts.map +1 -1
- package/dist/core/option-list.js +14 -13
- package/dist/core/option-list.js.map +1 -1
- package/dist/core/overlay.cjs +1 -1
- package/dist/core/overlay.cjs.map +1 -1
- package/dist/core/overlay.d.ts +0 -8
- package/dist/core/overlay.d.ts.map +1 -1
- package/dist/core/overlay.js +1 -3
- package/dist/core/overlay.js.map +1 -1
- package/dist/custom-elements.json +5636 -5683
- package/dist/drawer.cjs +6 -6
- package/dist/drawer.cjs.map +1 -1
- package/dist/drawer.js +65 -75
- package/dist/drawer.js.map +1 -1
- package/dist/feedback/skeleton/skeleton.css.cjs +1 -1
- package/dist/feedback/skeleton/skeleton.css.cjs.map +1 -1
- package/dist/feedback/skeleton/skeleton.css.js +1 -1
- package/dist/feedback/skeleton/skeleton.css.js.map +1 -1
- package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
- package/dist/feedback/toast/toast.d.ts.map +1 -1
- package/dist/grid.cjs +2 -2
- package/dist/grid.cjs.map +1 -1
- package/dist/grid.js +42 -41
- package/dist/grid.js.map +1 -1
- package/dist/input.cjs.map +1 -1
- package/dist/input.js.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 +2 -0
- package/dist/inputs/input/input.d.ts.map +1 -1
- package/dist/inputs/select/select.d.ts +2 -2
- package/dist/inputs/select/select.d.ts.map +1 -1
- package/dist/layout/grid/grid.d.ts.map +1 -1
- package/dist/layout/navbar/navbar.d.ts.map +1 -1
- package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
- package/dist/list-item.cjs +2 -6
- package/dist/list-item.cjs.map +1 -1
- package/dist/list-item.js +40 -39
- 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 +2 -2
- package/dist/list.js.map +1 -1
- package/dist/marquee.cjs +1 -1
- package/dist/marquee.cjs.map +1 -1
- package/dist/marquee.js +3 -1
- package/dist/marquee.js.map +1 -1
- package/dist/menu.cjs +5 -5
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +59 -59
- package/dist/menu.js.map +1 -1
- package/dist/navbar.cjs +9 -9
- package/dist/navbar.cjs.map +1 -1
- package/dist/navbar.js +124 -116
- package/dist/navbar.js.map +1 -1
- package/dist/otp-input.cjs +1 -1
- package/dist/otp-input.cjs.map +1 -1
- package/dist/otp-input.js +2 -2
- package/dist/otp-input.js.map +1 -1
- package/dist/overlay/drawer/drawer.d.ts.map +1 -1
- package/dist/overlay/menu/menu.d.ts.map +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.cjs.map +1 -1
- package/dist/radio-group.js +2 -3
- 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 +12 -11
- 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 +188 -195
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +212 -219
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +392 -399
- package/dist/refine.js.map +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.cjs.map +1 -1
- package/dist/select.js +1 -0
- package/dist/select.js.map +1 -1
- package/dist/sidebar.cjs +16 -16
- package/dist/sidebar.cjs.map +1 -1
- package/dist/sidebar.js +106 -91
- package/dist/sidebar.js.map +1 -1
- package/dist/skeleton.cjs +3 -3
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +8 -7
- package/dist/skeleton.js.map +1 -1
- package/dist/stepper.cjs +1 -1
- package/dist/stepper.cjs.map +1 -1
- package/dist/stepper.js +3 -3
- package/dist/stepper.js.map +1 -1
- package/dist/styles/fouc.css +22 -0
- package/dist/styles/preflight.css +2 -10
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.js +4 -5
- package/dist/tabs.js.map +1 -1
- package/dist/toast.cjs +13 -17
- package/dist/toast.cjs.map +1 -1
- package/dist/toast.js +86 -85
- package/dist/toast.js.map +1 -1
- package/package.json +18 -11
- package/dist/core/swipe.cjs +0 -2
- package/dist/core/swipe.cjs.map +0 -1
- package/dist/core/swipe.d.ts +0 -40
- package/dist/core/swipe.d.ts.map +0 -1
- package/dist/core/swipe.js +0 -63
- package/dist/core/swipe.js.map +0 -1
- package/dist/core/typeahead.cjs +0 -2
- package/dist/core/typeahead.cjs.map +0 -1
- package/dist/core/typeahead.d.ts +0 -53
- package/dist/core/typeahead.d.ts.map +0 -1
- package/dist/core/typeahead.js +0 -23
- package/dist/core/typeahead.js.map +0 -1
package/dist/core/swipe.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"swipe.js","names":[],"sources":["../../src/core/swipe.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nexport type SwipeAxis = 'x' | 'y';\n\nexport type SwipeControlDetail = {\n axis: SwipeAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n progress: number;\n start: number;\n threshold: number;\n};\n\nexport type SwipeControlOptions = {\n axis?: () => SwipeAxis;\n captureTarget?: (event: PointerEvent) => HTMLElement | null;\n disabled?: Readable<boolean | undefined>;\n /** Called when the platform interrupts an in-flight swipe (`pointercancel`). */\n onCancel?: (detail: SwipeControlDetail) => void;\n onCommit?: (detail: SwipeControlDetail) => void;\n onMove?: (detail: SwipeControlDetail) => void;\n /** Called when the pointer is released (`pointerup`) without crossing the commit threshold. */\n onRelease?: (detail: SwipeControlDetail) => void;\n onStart?: (detail: SwipeControlDetail) => void;\n shouldCommit?: (detail: SwipeControlDetail) => boolean;\n threshold?: () => number;\n};\n\nexport type SwipeControl = {\n [Symbol.dispose](): void;\n /** Cancel any in-flight swipe and clean up internal state. */\n dispose: () => void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n handlePointerCancel: (event: PointerEvent) => boolean;\n handlePointerDown: (event: PointerEvent) => boolean;\n handlePointerMove: (event: PointerEvent) => boolean;\n handlePointerUp: (event: PointerEvent) => boolean;\n isActive: () => boolean;\n};\n\ntype ActiveSwipe = {\n axis: SwipeAxis;\n pointerId: number;\n start: number;\n threshold: number;\n};\n\nconst resolveAxis = (options: SwipeControlOptions): SwipeAxis => options.axis?.() ?? 'x';\n\nconst resolveThreshold = (options: SwipeControlOptions): number => {\n const threshold = options.threshold?.() ?? 48;\n\n return Number.isFinite(threshold) && threshold > 0 ? threshold : 1;\n};\n\nconst getCoordinate = (event: PointerEvent, axis: SwipeAxis): number => {\n return axis === 'x' ? event.clientX : event.clientY;\n};\n\nconst defaultCaptureTarget = (event: PointerEvent): HTMLElement | null => {\n if (event.currentTarget instanceof HTMLElement) return event.currentTarget;\n\n if (event.target instanceof HTMLElement) return event.target;\n\n return null;\n};\n\nexport const createSwipeControl = (options: SwipeControlOptions): SwipeControl => {\n let active: ActiveSwipe | null = null;\n let disposed = false;\n\n const isDisabled = (): boolean => Boolean(options.disabled?.value);\n\n const reset = (): void => {\n active = null;\n };\n\n const dispose = (): void => {\n disposed = true;\n reset();\n };\n\n const matchesPointer = (event: PointerEvent): boolean => {\n return active?.pointerId === event.pointerId;\n };\n\n const createDetail = (event: PointerEvent): SwipeControlDetail | null => {\n if (!active) return null;\n\n const current = getCoordinate(event, active.axis);\n const distance = current - active.start;\n\n return {\n axis: active.axis,\n current,\n distance,\n event,\n pointerId: active.pointerId,\n progress: Math.min(Math.abs(distance) / active.threshold, 1),\n start: active.start,\n threshold: active.threshold,\n };\n };\n\n const handlePointerDown = (event: PointerEvent): boolean => {\n if (disposed || active || isDisabled()) return false;\n\n const axis = resolveAxis(options);\n\n active = {\n axis,\n pointerId: event.pointerId,\n start: getCoordinate(event, axis),\n threshold: resolveThreshold(options),\n };\n\n const captureTarget =\n typeof options.captureTarget === 'function' ? options.captureTarget(event) : defaultCaptureTarget(event);\n\n captureTarget?.setPointerCapture?.(event.pointerId);\n\n const detail = createDetail(event);\n\n if (detail) options.onStart?.(detail);\n\n return true;\n };\n\n const handlePointerMove = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n if (!detail) return false;\n\n options.onMove?.(detail);\n\n const shouldCommit = options.shouldCommit?.(detail) ?? Math.abs(detail.distance) >= detail.threshold;\n\n if (!shouldCommit) return true;\n\n reset();\n options.onCommit?.(detail);\n\n return true;\n };\n\n const handlePointerUp = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onRelease?.(detail);\n\n return true;\n };\n\n const handlePointerCancel = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onCancel?.(detail);\n\n return true;\n };\n\n return {\n dispose,\n get disposed() {\n return disposed;\n },\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n isActive: () => active != null,\n [Symbol.dispose]: dispose,\n };\n};\n"],"mappings":";AAkDA,IAAM,KAAe,MAA4C,EAAQ,OAAO,KAAK,KAE/E,KAAoB,MAAyC;CACjE,IAAM,IAAY,EAAQ,YAAY,KAAK;CAE3C,OAAO,OAAO,SAAS,CAAS,KAAK,IAAY,IAAI,IAAY;AACnE,GAEM,KAAiB,GAAqB,MACnC,MAAS,MAAM,EAAM,UAAU,EAAM,SAGxC,KAAwB,MACxB,EAAM,yBAAyB,cAAoB,EAAM,gBAEzD,EAAM,kBAAkB,cAAoB,EAAM,SAE/C,MAGI,KAAsB,MAA+C;CAChF,IAAI,IAA6B,MAC7B,IAAW,IAET,UAA4B,EAAQ,EAAQ,UAAU,OAEtD,UAAoB;EACxB,IAAS;CACX,GAEM,UAAsB;EAE1B,AADA,IAAW,IACX,EAAM;CACR,GAEM,KAAkB,MACf,GAAQ,cAAc,EAAM,WAG/B,KAAgB,MAAmD;EACvE,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAM,IAAU,EAAc,GAAO,EAAO,IAAI,GAC1C,IAAW,IAAU,EAAO;EAElC,OAAO;GACL,MAAM,EAAO;GACb;GACA;GACA;GACA,WAAW,EAAO;GAClB,UAAU,KAAK,IAAI,KAAK,IAAI,CAAQ,IAAI,EAAO,WAAW,CAAC;GAC3D,OAAO,EAAO;GACd,WAAW,EAAO;EACpB;CACF;CAqEA,OAAO;EACL;EACA,IAAI,WAAW;GACb,OAAO;EACT;EACA,sBAjB2B,MAAiC;GAC5D,IAAI,CAAC,KAAU,CAAC,EAAe,CAAK,GAAG,OAAO;GAE9C,IAAM,IAAS,EAAa,CAAK;GAMjC,OAJA,EAAM,GAEF,KAAQ,EAAQ,WAAW,CAAM,GAE9B;EACT;EAQE,oBAzEyB,MAAiC;GAC1D,IAAI,KAAY,KAAU,EAAW,GAAG,OAAO;GAE/C,IAAM,IAAO,EAAY,CAAO;GAYhC,AAVA,IAAS;IACP;IACA,WAAW,EAAM;IACjB,OAAO,EAAc,GAAO,CAAI;IAChC,WAAW,EAAiB,CAAO;GACrC,IAGE,OAAO,EAAQ,iBAAkB,aAAa,EAAQ,cAAc,CAAK,IAAI,EAAqB,CAAK,EAAA,EAE1F,oBAAoB,EAAM,SAAS;GAElD,IAAM,IAAS,EAAa,CAAK;GAIjC,OAFI,KAAQ,EAAQ,UAAU,CAAM,GAE7B;EACT;EAoDE,oBAlDyB,MAAiC;GAC1D,IAAI,CAAC,KAAU,CAAC,EAAe,CAAK,GAAG,OAAO;GAE9C,IAAM,IAAS,EAAa,CAAK;GAajC,OAXK,KAEL,EAAQ,SAAS,CAAM,GAEF,EAAQ,eAAe,CAAM,KAAK,KAAK,IAAI,EAAO,QAAQ,KAAK,EAAO,aAI3F,EAAM,GACN,EAAQ,WAAW,CAAM,GAElB,MALmB,MANN;EAYtB;EAkCE,kBAhCuB,MAAiC;GACxD,IAAI,CAAC,KAAU,CAAC,EAAe,CAAK,GAAG,OAAO;GAE9C,IAAM,IAAS,EAAa,CAAK;GAMjC,OAJA,EAAM,GAEF,KAAQ,EAAQ,YAAY,CAAM,GAE/B;EACT;EAuBE,gBAAgB,KAAU;GACzB,OAAO,UAAU;CACpB;AACF"}
|
package/dist/core/typeahead.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e=e=>{let t=e.delay??500,n=``,r=null,i=()=>{n=``,r!==null&&(clearTimeout(r),r=null)};return e.signal?.addEventListener(`abort`,i,{once:!0}),{handleKeydown:a=>{if(a.key.length!==1||a.ctrlKey||a.altKey||a.metaKey)return!1;n+=a.key.toLowerCase(),r!==null&&clearTimeout(r),r=setTimeout(i,t);let o=e.getItems(),s=e.getIndex(),c=s>=0?s+1:0;for(let t=0;t<o.length;t++){let r=(c+t)%o.length;if(!e.isItemDisabled?.(o[r],r)&&e.getItemLabel(o[r],r).toLowerCase().startsWith(n))return e.onNavigate(r,a),!0}return!1},reset:i}};exports.createTypeahead=e;
|
|
2
|
-
//# sourceMappingURL=typeahead.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.cjs","names":[],"sources":["../../src/core/typeahead.ts"],"sourcesContent":["// ── Typeahead ─────────────────────────────────────────────────────────────────\n// Standalone typeahead primitive: accumulates printable keystrokes, then finds\n// the first enabled item whose label starts with the buffer.\n//\n// Extracted from nav.ts so it can be reused independently (e.g. combobox input).\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type TypeaheadOptions<T> = {\n /**\n * Milliseconds of inactivity before the buffer resets.\n * ARIA APG recommended window. Default: `500`.\n */\n delay?: number;\n /** Returns the current focused index (used to search forward from current + 1). */\n getIndex: () => number;\n /** Returns a plain-text label for the item at `index`. */\n getItemLabel: (item: T, index: number) => string;\n /** Returns all items in the current list. */\n getItems: () => T[];\n /** Returns `true` for items that should be skipped during typeahead search. */\n isItemDisabled?: (item: T, index: number) => boolean;\n /** Called when typeahead navigation lands on an item. */\n onNavigate: (index: number, event: KeyboardEvent) => void;\n /**\n * When provided, the pending reset timer is cancelled automatically when the\n * signal aborts (e.g. when the owning component disconnects).\n */\n signal?: AbortSignal;\n};\n\nexport type Typeahead = {\n /**\n * Process a keyboard event. Returns `true` if the event was consumed by\n * typeahead (a printable character matched or was buffered).\n */\n handleKeydown(event: KeyboardEvent): boolean;\n /** Reset the buffer immediately. Call on list close to clear stale input. */\n reset(): void;\n};\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Creates a standalone typeahead handler for keyboard-navigable lists.\n *\n * Accumulates printable keystrokes into a buffer; on each keystroke searches\n * for the first enabled item whose label starts with the buffer. Cycles past\n * the current item on repeated same-character presses. Buffer resets after\n * `delay` ms of inactivity (default 500 — the ARIA APG recommended window).\n *\n * @example\n * ```ts\n * const typeahead = createTypeahead({\n * getIndex: () => focusedIndex,\n * getItemLabel: (item) => item.label,\n * getItems: () => items,\n * onNavigate: (index) => { focusedIndex = index; },\n * });\n *\n * listEl.addEventListener('keydown', (e) => typeahead.handleKeydown(e));\n * ```\n */\nexport const createTypeahead = <T>(options: TypeaheadOptions<T>): Typeahead => {\n const delay = options.delay ?? 500;\n let _buffer = '';\n let _timer: ReturnType<typeof setTimeout> | null = null;\n\n const reset = (): void => {\n _buffer = '';\n\n if (_timer !== null) {\n clearTimeout(_timer);\n _timer = null;\n }\n };\n\n options.signal?.addEventListener('abort', reset, { once: true });\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n // Single printable character only; exclude modifier combos.\n if (event.key.length !== 1 || event.ctrlKey || event.altKey || event.metaKey) return false;\n\n _buffer += event.key.toLowerCase();\n\n if (_timer !== null) clearTimeout(_timer);\n\n _timer = setTimeout(reset, delay);\n\n const items = options.getItems();\n const current = options.getIndex();\n const startAfter = current >= 0 ? current + 1 : 0;\n\n for (let n = 0; n < items.length; n++) {\n const i = (startAfter + n) % items.length;\n\n if (options.isItemDisabled?.(items[i], i)) continue;\n\n if (options.getItemLabel(items[i], i).toLowerCase().startsWith(_buffer)) {\n options.onNavigate(i, event);\n\n return true;\n }\n }\n\n return false;\n };\n\n return { handleKeydown, reset };\n};\n"],"mappings":"AA+DA,IAAa,EAAsB,GAA4C,CAC7E,IAAM,EAAQ,EAAQ,OAAS,IAC3B,EAAU,GACV,EAA+C,KAE7C,MAAoB,CACxB,EAAU,GAEN,IAAW,OACb,aAAa,CAAM,EACnB,EAAS,KAEb,EAiCA,OA/BA,EAAQ,QAAQ,iBAAiB,QAAS,EAAO,CAAE,KAAM,EAAK,CAAC,EA+BxD,CAAE,cA7Bc,GAAkC,CAEvD,GAAI,EAAM,IAAI,SAAW,GAAK,EAAM,SAAW,EAAM,QAAU,EAAM,QAAS,MAAO,GAErF,GAAW,EAAM,IAAI,YAAY,EAE7B,IAAW,MAAM,aAAa,CAAM,EAExC,EAAS,WAAW,EAAO,CAAK,EAEhC,IAAM,EAAQ,EAAQ,SAAS,EACzB,EAAU,EAAQ,SAAS,EAC3B,EAAa,GAAW,EAAI,EAAU,EAAI,EAEhD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAM,GAAK,EAAa,GAAK,EAAM,OAE/B,MAAQ,iBAAiB,EAAM,GAAI,CAAC,GAEpC,EAAQ,aAAa,EAAM,GAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAO,EAGpE,OAFA,EAAQ,WAAW,EAAG,CAAK,EAEpB,EAEX,CAEA,MAAO,EACT,EAEwB,OAAM,CAChC"}
|
package/dist/core/typeahead.d.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
export type TypeaheadOptions<T> = {
|
|
2
|
-
/**
|
|
3
|
-
* Milliseconds of inactivity before the buffer resets.
|
|
4
|
-
* ARIA APG recommended window. Default: `500`.
|
|
5
|
-
*/
|
|
6
|
-
delay?: number;
|
|
7
|
-
/** Returns the current focused index (used to search forward from current + 1). */
|
|
8
|
-
getIndex: () => number;
|
|
9
|
-
/** Returns a plain-text label for the item at `index`. */
|
|
10
|
-
getItemLabel: (item: T, index: number) => string;
|
|
11
|
-
/** Returns all items in the current list. */
|
|
12
|
-
getItems: () => T[];
|
|
13
|
-
/** Returns `true` for items that should be skipped during typeahead search. */
|
|
14
|
-
isItemDisabled?: (item: T, index: number) => boolean;
|
|
15
|
-
/** Called when typeahead navigation lands on an item. */
|
|
16
|
-
onNavigate: (index: number, event: KeyboardEvent) => void;
|
|
17
|
-
/**
|
|
18
|
-
* When provided, the pending reset timer is cancelled automatically when the
|
|
19
|
-
* signal aborts (e.g. when the owning component disconnects).
|
|
20
|
-
*/
|
|
21
|
-
signal?: AbortSignal;
|
|
22
|
-
};
|
|
23
|
-
export type Typeahead = {
|
|
24
|
-
/**
|
|
25
|
-
* Process a keyboard event. Returns `true` if the event was consumed by
|
|
26
|
-
* typeahead (a printable character matched or was buffered).
|
|
27
|
-
*/
|
|
28
|
-
handleKeydown(event: KeyboardEvent): boolean;
|
|
29
|
-
/** Reset the buffer immediately. Call on list close to clear stale input. */
|
|
30
|
-
reset(): void;
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Creates a standalone typeahead handler for keyboard-navigable lists.
|
|
34
|
-
*
|
|
35
|
-
* Accumulates printable keystrokes into a buffer; on each keystroke searches
|
|
36
|
-
* for the first enabled item whose label starts with the buffer. Cycles past
|
|
37
|
-
* the current item on repeated same-character presses. Buffer resets after
|
|
38
|
-
* `delay` ms of inactivity (default 500 — the ARIA APG recommended window).
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```ts
|
|
42
|
-
* const typeahead = createTypeahead({
|
|
43
|
-
* getIndex: () => focusedIndex,
|
|
44
|
-
* getItemLabel: (item) => item.label,
|
|
45
|
-
* getItems: () => items,
|
|
46
|
-
* onNavigate: (index) => { focusedIndex = index; },
|
|
47
|
-
* });
|
|
48
|
-
*
|
|
49
|
-
* listEl.addEventListener('keydown', (e) => typeahead.handleKeydown(e));
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare const createTypeahead: <T>(options: TypeaheadOptions<T>) => Typeahead;
|
|
53
|
-
//# sourceMappingURL=typeahead.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/core/typeahead.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACpB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,yDAAyD;IACzD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1D;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IAC7C,6EAA6E;IAC7E,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAIF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,SA8CjE,CAAC"}
|
package/dist/core/typeahead.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
//#region src/core/typeahead.ts
|
|
2
|
-
var e = (e) => {
|
|
3
|
-
let t = e.delay ?? 500, n = "", r = null, i = () => {
|
|
4
|
-
n = "", r !== null && (clearTimeout(r), r = null);
|
|
5
|
-
};
|
|
6
|
-
return e.signal?.addEventListener("abort", i, { once: !0 }), {
|
|
7
|
-
handleKeydown: (a) => {
|
|
8
|
-
if (a.key.length !== 1 || a.ctrlKey || a.altKey || a.metaKey) return !1;
|
|
9
|
-
n += a.key.toLowerCase(), r !== null && clearTimeout(r), r = setTimeout(i, t);
|
|
10
|
-
let o = e.getItems(), s = e.getIndex(), c = s >= 0 ? s + 1 : 0;
|
|
11
|
-
for (let t = 0; t < o.length; t++) {
|
|
12
|
-
let r = (c + t) % o.length;
|
|
13
|
-
if (!e.isItemDisabled?.(o[r], r) && e.getItemLabel(o[r], r).toLowerCase().startsWith(n)) return e.onNavigate(r, a), !0;
|
|
14
|
-
}
|
|
15
|
-
return !1;
|
|
16
|
-
},
|
|
17
|
-
reset: i
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
//#endregion
|
|
21
|
-
export { e as createTypeahead };
|
|
22
|
-
|
|
23
|
-
//# sourceMappingURL=typeahead.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeahead.js","names":[],"sources":["../../src/core/typeahead.ts"],"sourcesContent":["// ── Typeahead ─────────────────────────────────────────────────────────────────\n// Standalone typeahead primitive: accumulates printable keystrokes, then finds\n// the first enabled item whose label starts with the buffer.\n//\n// Extracted from nav.ts so it can be reused independently (e.g. combobox input).\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type TypeaheadOptions<T> = {\n /**\n * Milliseconds of inactivity before the buffer resets.\n * ARIA APG recommended window. Default: `500`.\n */\n delay?: number;\n /** Returns the current focused index (used to search forward from current + 1). */\n getIndex: () => number;\n /** Returns a plain-text label for the item at `index`. */\n getItemLabel: (item: T, index: number) => string;\n /** Returns all items in the current list. */\n getItems: () => T[];\n /** Returns `true` for items that should be skipped during typeahead search. */\n isItemDisabled?: (item: T, index: number) => boolean;\n /** Called when typeahead navigation lands on an item. */\n onNavigate: (index: number, event: KeyboardEvent) => void;\n /**\n * When provided, the pending reset timer is cancelled automatically when the\n * signal aborts (e.g. when the owning component disconnects).\n */\n signal?: AbortSignal;\n};\n\nexport type Typeahead = {\n /**\n * Process a keyboard event. Returns `true` if the event was consumed by\n * typeahead (a printable character matched or was buffered).\n */\n handleKeydown(event: KeyboardEvent): boolean;\n /** Reset the buffer immediately. Call on list close to clear stale input. */\n reset(): void;\n};\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Creates a standalone typeahead handler for keyboard-navigable lists.\n *\n * Accumulates printable keystrokes into a buffer; on each keystroke searches\n * for the first enabled item whose label starts with the buffer. Cycles past\n * the current item on repeated same-character presses. Buffer resets after\n * `delay` ms of inactivity (default 500 — the ARIA APG recommended window).\n *\n * @example\n * ```ts\n * const typeahead = createTypeahead({\n * getIndex: () => focusedIndex,\n * getItemLabel: (item) => item.label,\n * getItems: () => items,\n * onNavigate: (index) => { focusedIndex = index; },\n * });\n *\n * listEl.addEventListener('keydown', (e) => typeahead.handleKeydown(e));\n * ```\n */\nexport const createTypeahead = <T>(options: TypeaheadOptions<T>): Typeahead => {\n const delay = options.delay ?? 500;\n let _buffer = '';\n let _timer: ReturnType<typeof setTimeout> | null = null;\n\n const reset = (): void => {\n _buffer = '';\n\n if (_timer !== null) {\n clearTimeout(_timer);\n _timer = null;\n }\n };\n\n options.signal?.addEventListener('abort', reset, { once: true });\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n // Single printable character only; exclude modifier combos.\n if (event.key.length !== 1 || event.ctrlKey || event.altKey || event.metaKey) return false;\n\n _buffer += event.key.toLowerCase();\n\n if (_timer !== null) clearTimeout(_timer);\n\n _timer = setTimeout(reset, delay);\n\n const items = options.getItems();\n const current = options.getIndex();\n const startAfter = current >= 0 ? current + 1 : 0;\n\n for (let n = 0; n < items.length; n++) {\n const i = (startAfter + n) % items.length;\n\n if (options.isItemDisabled?.(items[i], i)) continue;\n\n if (options.getItemLabel(items[i], i).toLowerCase().startsWith(_buffer)) {\n options.onNavigate(i, event);\n\n return true;\n }\n }\n\n return false;\n };\n\n return { handleKeydown, reset };\n};\n"],"mappings":";AA+DA,IAAa,KAAsB,MAA4C;CAC7E,IAAM,IAAQ,EAAQ,SAAS,KAC3B,IAAU,IACV,IAA+C,MAE7C,UAAoB;EAGxB,AAFA,IAAU,IAEN,MAAW,SACb,aAAa,CAAM,GACnB,IAAS;CAEb;CAiCA,OA/BA,EAAQ,QAAQ,iBAAiB,SAAS,GAAO,EAAE,MAAM,GAAK,CAAC,GA+BxD;EAAE,gBA7Bc,MAAkC;GAEvD,IAAI,EAAM,IAAI,WAAW,KAAK,EAAM,WAAW,EAAM,UAAU,EAAM,SAAS,OAAO;GAMrF,AAJA,KAAW,EAAM,IAAI,YAAY,GAE7B,MAAW,QAAM,aAAa,CAAM,GAExC,IAAS,WAAW,GAAO,CAAK;GAEhC,IAAM,IAAQ,EAAQ,SAAS,GACzB,IAAU,EAAQ,SAAS,GAC3B,IAAa,KAAW,IAAI,IAAU,IAAI;GAEhD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;IACrC,IAAM,KAAK,IAAa,KAAK,EAAM;IAE/B,OAAQ,iBAAiB,EAAM,IAAI,CAAC,KAEpC,EAAQ,aAAa,EAAM,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAO,GAGpE,OAFA,EAAQ,WAAW,GAAG,CAAK,GAEpB;GAEX;GAEA,OAAO;EACT;EAEwB;CAAM;AAChC"}
|