@ixfx/components 0.11.9 → 0.13.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/bundle/index.d.ts +134 -1
- package/bundle/index.d.ts.map +1 -1
- package/bundle/index.js +7116 -6520
- package/bundle/index.js.map +1 -1
- package/dist/ac-text.js +1 -1
- package/dist/ac-token.js +1 -1
- package/dist/{checked-select-Dejl13qd.js → checked-select-lDgAQQ7v.js} +3 -3
- package/dist/{checked-select-Dejl13qd.js.map → checked-select-lDgAQQ7v.js.map} +1 -1
- package/dist/checked-select.js +1 -1
- package/dist/{colour-picker-WDrPuqoO.js → colour-picker-BCMU7W7R.js} +2 -2
- package/dist/{colour-picker-WDrPuqoO.js.map → colour-picker-BCMU7W7R.js.map} +1 -1
- package/dist/colour-picker.js +1 -1
- package/dist/crumbs.d.ts +1 -1
- package/dist/crumbs.d.ts.map +1 -1
- package/dist/crumbs.js +26 -10
- package/dist/crumbs.js.map +1 -1
- package/dist/{data-grid-Oiyt5qbA.d.ts → data-grid-BJ6XXvRc.d.ts} +11 -1
- package/dist/data-grid-BJ6XXvRc.d.ts.map +1 -0
- package/dist/data-grid.d.ts +1 -1
- package/dist/data-grid.js +62 -8
- package/dist/data-grid.js.map +1 -1
- package/dist/{defaults-kVl1t2tT.js → defaults-B4ePs4LB.js} +4 -1
- package/dist/{defaults-kVl1t2tT.js.map → defaults-B4ePs4LB.js.map} +1 -1
- package/dist/detail-list.js +1 -1
- package/dist/flat-list-eYItri8-.d.ts +126 -0
- package/dist/flat-list-eYItri8-.d.ts.map +1 -0
- package/dist/flat-list.d.ts +2 -0
- package/dist/flat-list.js +519 -0
- package/dist/flat-list.js.map +1 -0
- package/dist/{grid-list-Bwaf61is.js → grid-list-DjIl910A.js} +3 -3
- package/dist/{grid-list-Bwaf61is.js.map → grid-list-DjIl910A.js.map} +1 -1
- package/dist/{grid-list-bzKuNTtu.d.ts → grid-list-_gI9ckcT.d.ts} +2 -2
- package/dist/{grid-list-bzKuNTtu.d.ts.map → grid-list-_gI9ckcT.d.ts.map} +1 -1
- package/dist/grid-list.d.ts +1 -1
- package/dist/grid-list.js +1 -1
- package/dist/icons.js +1 -1
- package/dist/index-o-CWDt11.d.ts +78 -0
- package/dist/index-o-CWDt11.d.ts.map +1 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -11
- package/dist/index.js.map +1 -1
- package/dist/{interaction-BskmlA9t.js → interaction-ZTh4htzr.js} +1 -1
- package/dist/{menu-DaAlsyhf.js → menu-CwcXXeLM.js} +3 -3
- package/dist/{menu-DaAlsyhf.js.map → menu-CwcXXeLM.js.map} +1 -1
- package/dist/{menu-item-CDPFgaSF.js → menu-item-BDEekBVy.js} +3 -3
- package/dist/{menu-item-CDPFgaSF.js.map → menu-item-BDEekBVy.js.map} +1 -1
- package/dist/menu.js +2 -2
- package/dist/miller.d.ts +1 -1
- package/dist/miller.js +2 -2
- package/dist/narrowed-text.d.ts +2 -78
- package/dist/narrowed-text.js +2 -2
- package/dist/select-horiz.js +2 -2
- package/dist/{tickled-controller-Dh1Uh_vG.js → tickled-controller-D-HZymaZ.js} +10 -1
- package/dist/tickled-controller-D-HZymaZ.js.map +1 -0
- package/dist/{tickled-controller-C1ZsHpyg.d.ts → tickled-controller-DodxD3eQ.d.ts} +7 -1
- package/dist/{tickled-controller-C1ZsHpyg.d.ts.map → tickled-controller-DodxD3eQ.d.ts.map} +1 -1
- package/dist/{tree-Bm2TzTfe.js → tree-DGveys4K.js} +3 -3
- package/dist/{tree-Bm2TzTfe.js.map → tree-DGveys4K.js.map} +1 -1
- package/dist/tree.d.ts +1 -1
- package/dist/tree.js +1 -1
- package/dist/vertical-list-DheZSEmB.d.ts.map +1 -1
- package/dist/vertical-list.js +9 -1
- package/dist/vertical-list.js.map +1 -1
- package/docs-user/README.md +1 -0
- package/docs-user/data-grid.md +22 -0
- package/docs-user/flat-list.md +80 -0
- package/docs-user/index.json +7 -2
- package/docs-user/llms.txt +1 -0
- package/llms.txt +1 -0
- package/package.json +5 -1
- package/dist/data-grid-Oiyt5qbA.d.ts.map +0 -1
- package/dist/narrowed-text.d.ts.map +0 -1
- package/dist/tickled-controller-Dh1Uh_vG.js.map +0 -1
package/dist/narrowed-text.d.ts
CHANGED
|
@@ -1,78 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
//#region src/narrowed-text/types.d.ts
|
|
4
|
-
type NarrowedTextItem = Readonly<{
|
|
5
|
-
value: string;
|
|
6
|
-
label?: string;
|
|
7
|
-
description?: string;
|
|
8
|
-
iconName?: string;
|
|
9
|
-
selected?: boolean;
|
|
10
|
-
}>;
|
|
11
|
-
type NarrowedTextChangeDetail = {
|
|
12
|
-
readonly item: NarrowedTextItem | undefined;
|
|
13
|
-
readonly query: string;
|
|
14
|
-
readonly selected: readonly NarrowedTextItem[];
|
|
15
|
-
};
|
|
16
|
-
type NarrowedTextChangeEvent = CustomEvent<NarrowedTextChangeDetail>;
|
|
17
|
-
type SelectionMode = `single` | `multi`;
|
|
18
|
-
type Orientation = `horizontal` | `vertical`;
|
|
19
|
-
type FuzzySearchResult = {
|
|
20
|
-
item: NarrowedTextItem;
|
|
21
|
-
positions: ReadonlySet<number>;
|
|
22
|
-
score: number;
|
|
23
|
-
};
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/narrowed-text/narrowed-text.d.ts
|
|
26
|
-
declare class NarrowedTextElement extends LitElement {
|
|
27
|
-
#private;
|
|
28
|
-
selectionMode: SelectionMode;
|
|
29
|
-
requiredSelection: boolean;
|
|
30
|
-
orientation: Orientation;
|
|
31
|
-
nowrap: boolean;
|
|
32
|
-
separator: string;
|
|
33
|
-
width: string | undefined;
|
|
34
|
-
height: string | undefined;
|
|
35
|
-
preserveFilter: boolean;
|
|
36
|
-
value: string;
|
|
37
|
-
registry: CommandRegistry<unknown> | undefined;
|
|
38
|
-
private _query;
|
|
39
|
-
private _computedItems;
|
|
40
|
-
private _filteredItems;
|
|
41
|
-
private _isFocused;
|
|
42
|
-
private _slot;
|
|
43
|
-
private _selectedValues;
|
|
44
|
-
private _ownedRegistry;
|
|
45
|
-
private _search;
|
|
46
|
-
private _searchState;
|
|
47
|
-
private _unsubSearch;
|
|
48
|
-
private tickled;
|
|
49
|
-
get selected(): string | string[];
|
|
50
|
-
set selected(value: string | string[]);
|
|
51
|
-
selectAll(): void;
|
|
52
|
-
deselectAll(): void;
|
|
53
|
-
connectedCallback(): void;
|
|
54
|
-
disconnectedCallback(): void;
|
|
55
|
-
protected firstUpdated(): void;
|
|
56
|
-
protected updated(changedProperties: PropertyValues): void;
|
|
57
|
-
private _updateComputedItems;
|
|
58
|
-
private _updateSelectedFromValue;
|
|
59
|
-
private _updateFilteredItems;
|
|
60
|
-
private _applyHighlights;
|
|
61
|
-
focus(): void;
|
|
62
|
-
blur(): void;
|
|
63
|
-
setContents(contents: NarrowedTextItem[]): void;
|
|
64
|
-
deleteItem(value: string): boolean;
|
|
65
|
-
private _selectItem;
|
|
66
|
-
private _updateValueFromSelected;
|
|
67
|
-
protected render(): import("lit").TemplateResult<1>;
|
|
68
|
-
private _getContainerStyle;
|
|
69
|
-
static styles: import("lit").CSSResult[];
|
|
70
|
-
}
|
|
71
|
-
declare global {
|
|
72
|
-
interface HTMLElementTagNameMap {
|
|
73
|
-
'ixfx-narrowed-text': NarrowedTextElement;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//#endregion
|
|
77
|
-
export { FuzzySearchResult, NarrowedTextChangeDetail, NarrowedTextChangeEvent, NarrowedTextElement, NarrowedTextItem, Orientation, SelectionMode };
|
|
78
|
-
//# sourceMappingURL=narrowed-text.d.ts.map
|
|
1
|
+
import { a as NarrowedTextItem, i as NarrowedTextChangeEvent, n as FuzzySearchResult, o as Orientation, r as NarrowedTextChangeDetail, s as SelectionMode, t as NarrowedTextElement } from "./index-o-CWDt11.js";
|
|
2
|
+
export { FuzzySearchResult, NarrowedTextChangeDetail, NarrowedTextChangeEvent, NarrowedTextElement, NarrowedTextItem, Orientation, SelectionMode };
|
package/dist/narrowed-text.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { n as buildHighlightTargets, r as clearHighlights, t as applyHighlights } from "./highlight-B-eQrhhb.js";
|
|
2
|
-
import { t as TickledController } from "./tickled-controller-
|
|
2
|
+
import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
|
|
3
3
|
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
4
4
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
5
5
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
6
6
|
import { p as createIncrSearch } from "./incr-search-D91M4Ozq.js";
|
|
7
|
-
import "./interaction-
|
|
7
|
+
import "./interaction-ZTh4htzr.js";
|
|
8
8
|
import { LitElement, css, html, nothing } from "lit";
|
|
9
9
|
import { property, query, state } from "lit/decorators.js";
|
|
10
10
|
import { createCommandRegistry } from "@clinth/ui-commands";
|
package/dist/select-horiz.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as TickledController } from "./tickled-controller-
|
|
1
|
+
import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
|
|
2
2
|
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
3
3
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
4
4
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
|
-
import "./interaction-
|
|
5
|
+
import "./interaction-ZTh4htzr.js";
|
|
6
6
|
import { t as scrollFadeStyles } from "./scroll-fade-BrNUIYnm.js";
|
|
7
7
|
import { t as WheelNudgeMixin } from "./wheel-nudge-D5rmht3v.js";
|
|
8
8
|
import { LitElement, css, html } from "lit";
|
|
@@ -134,6 +134,14 @@ var TickledController = class TickledController {
|
|
|
134
134
|
TickledController._lastMouseClientY = clientY;
|
|
135
135
|
}
|
|
136
136
|
/**
|
|
137
|
+
* Ignore hover (pointerenter / pointerleave) until the pointer genuinely
|
|
138
|
+
* moves. Call this when something other than the pointer changes what is
|
|
139
|
+
* under it — a keypress, or the item set being swapped.
|
|
140
|
+
*/
|
|
141
|
+
static ignoreHoverUntilPointerMoves() {
|
|
142
|
+
TickledController._mouseMovedSinceKeyboard = false;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
137
145
|
* Check if actual mouse movement has occurred since last keyboard interaction.
|
|
138
146
|
* Used to distinguish real hover/leave from content-scrolling-induced events.
|
|
139
147
|
*/
|
|
@@ -176,6 +184,7 @@ var TickledController = class TickledController {
|
|
|
176
184
|
handleKeyboardNavigation(direction) {
|
|
177
185
|
const modeChanged = this._inputMode !== `keyboard`;
|
|
178
186
|
this._inputMode = `keyboard`;
|
|
187
|
+
TickledController.ignoreHoverUntilPointerMoves();
|
|
179
188
|
const enabledItems = this.config.getItems().filter((item) => item.enabled !== false);
|
|
180
189
|
if (enabledItems.length === 0) return;
|
|
181
190
|
let newId;
|
|
@@ -246,4 +255,4 @@ var TickledController = class TickledController {
|
|
|
246
255
|
//#endregion
|
|
247
256
|
export { TickledController as t };
|
|
248
257
|
|
|
249
|
-
//# sourceMappingURL=tickled-controller-
|
|
258
|
+
//# sourceMappingURL=tickled-controller-D-HZymaZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickled-controller-D-HZymaZ.js","names":[],"sources":["../src/interaction/tickled-controller.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\n/**\n * Represents an item that can be tickled (highlighted via hover or keyboard navigation)\n */\nexport type TickledItem<T = unknown> = {\n /**\n * Unique identifier for the item (e.g., index, id, path)\n */\n readonly id: T;\n\n /**\n * Whether the item is currently enabled/interactive\n */\n readonly enabled?: boolean;\n};\n\n/**\n * Input mode determines which mechanism controls the tickled state\n */\nexport type InputMode = `keyboard` | `mouse`;\n\n/**\n * Configuration for TickledController\n */\nexport type TickledControllerConfig<T> = {\n /**\n * Function to retrieve all items that can be tickled\n */\n getItems: () => ReadonlyArray<TickledItem<T>>;\n\n /**\n * Optional callback when an item becomes tickled\n * Use this for side effects like opening submenus\n * @param id - The id of the newly tickled item, or undefined if nothing is tickled\n */\n onTickle?: (id: T | undefined) => void;\n\n /**\n * Optional callback fired after any state change (tickled id or input mode)\n * Use this to sync DOM attributes for slotted content that can't use reactive rendering\n *\n * For components that render items directly, this is usually not needed as\n * Lit's reactive rendering will handle updates automatically via requestUpdate()\n *\n * @example\n * ```ts\n * onStateChange: () => {\n * // Sync data-tickled attributes for slotted items\n * const items = this.getItems();\n * items.forEach((item, i) => {\n * if (this.tickled.isTickled(i)) {\n * item.setAttribute('data-tickled', '');\n * } else {\n * item.removeAttribute('data-tickled');\n * }\n * });\n * }\n * ```\n */\n onStateChange?: () => void;\n\n /**\n * Optional initial input mode (defaults to 'mouse')\n */\n initialInputMode?: InputMode;\n\n /**\n * When this returns `true`, pointer hover no longer drives the cursor:\n * `handlePointerEnter` / `handlePointerLeave` become no-ops and hover never\n * switches the input mode to `mouse`. Keyboard navigation, programmatic\n * `focus()` / `setTickled()`, and click handling are unaffected. Read on every\n * hover event, so a host can flip it via a reactive property. Default: `false`.\n */\n hoverDisabled?: () => boolean;\n\n /**\n * Whether keyboard navigation wraps from last to first and vice versa.\n * - 'stop' (default): navigation stops at the boundary\n * - 'wrap': navigation wraps around\n */\n itemWrap?: `stop` | `wrap`;\n};\n\n/**\n * ReactiveController that manages \"tickled\" state for interactive lists.\n *\n * A \"tickled\" item is one that is under active attention via hover (mouse mode)\n * or keyboard focus (keyboard mode). Only one item can be tickled at a time.\n *\n * The input mode determines which mechanism controls tickled state:\n * - Mouse mode: hover controls tickled, keyboard navigation ignored\n * - Keyboard mode: keyboard navigation controls tickled, hover ignored\n *\n * Last interaction wins - any mouse hover switches to mouse mode, any keyboard\n * navigation switches to keyboard mode.\n *\n * ## Global Mouse Tracking\n *\n * This controller uses a single, ref-counted global `pointermove` listener (shared\n * across all instances) to track actual mouse movement. This prevents `pointerenter`\n * events caused by content scrolling from incorrectly switching to mouse mode when\n * the user is actually using keyboard navigation. The listener is attached when the\n * first host connects and removed once the last host disconnects.\n *\n * @example\n * ```ts\n * class MyList extends LitElement {\n * private tickled = new TickledController(this, {\n * getItems: () => this.items.map((item, i) => ({ id: i, enabled: !item.disabled })),\n * onTickle: (id) => {\n * // Optional: perform side effect when item is tickled\n * console.log('Tickled item:', id);\n * }\n * });\n *\n * render() {\n * return html`\n * <ul @pointerleave=${(e) => this.tickled.handlePointerLeave(e)}>\n * ${this.items.map((item, i) => html`\n * <li\n * class=\"item ${this.tickled.isTickled(i) ? 'tickled' : ''}\"\n * @pointerenter=${() => this.tickled.handlePointerEnter(i)}\n * >${item.label}</li>\n * `)}\n * </ul>\n * `;\n * }\n *\n * private handleKeyDown(e: KeyboardEvent) {\n * if (e.key === 'ArrowDown') {\n * this.tickled.handleKeyboardNavigation('next');\n * } else if (e.key === 'ArrowUp') {\n * this.tickled.handleKeyboardNavigation('previous');\n * }\n * }\n * }\n * ```\n */\nexport class TickledController<T = number> implements ReactiveController {\n private host: ReactiveControllerHost;\n private config: TickledControllerConfig<T>;\n private _tickledId: T | undefined = undefined;\n private _inputMode: InputMode;\n private hoverDisabled: () => boolean;\n\n private static _lastMouseClientX: number = Number.NaN;\n private static _lastMouseClientY: number = Number.NaN;\n private static _mouseMovedSinceKeyboard: boolean = true;\n private static _listenerRefCount: number = 0;\n\n private static readonly _onGlobalPointerMove = (e: PointerEvent): void => {\n TickledController.handleGlobalPointerMove(e.clientX, e.clientY);\n };\n\n constructor(host: ReactiveControllerHost, config: TickledControllerConfig<T>) {\n this.host = host;\n this.config = config;\n this._inputMode = config.initialInputMode ?? `mouse`;\n this.hoverDisabled = config.hoverDisabled ?? (() => false);\n host.addController(this);\n }\n\n hostConnected(): void {\n if (TickledController._listenerRefCount === 0) {\n document.addEventListener(`pointermove`, TickledController._onGlobalPointerMove, { passive: true });\n }\n TickledController._listenerRefCount++;\n }\n\n hostDisconnected(): void {\n TickledController._listenerRefCount--;\n if (TickledController._listenerRefCount === 0) {\n document.removeEventListener(`pointermove`, TickledController._onGlobalPointerMove);\n }\n }\n\n /**\n * Get the current input mode\n */\n get inputMode(): InputMode {\n return this._inputMode;\n }\n\n /**\n * Get the currently tickled item id\n */\n get tickledId(): T | undefined {\n return this._tickledId;\n }\n\n /**\n * The item currently under the cursor, or `undefined`. Alias of `tickledId`\n * for parity with other controllers.\n */\n get current(): T | undefined {\n return this._tickledId;\n }\n\n /**\n * Move the cursor programmatically (e.g. to reveal a match or re-seat it\n * after the item set changed). Does not change the input mode. Alias of\n * `setTickled`.\n */\n focus(id: T | undefined): void {\n this.setTickled(id);\n }\n\n /**\n * Check if a specific item is tickled\n */\n isTickled(id: T): boolean {\n return this._tickledId === id;\n }\n\n /**\n * Handle global pointer move event.\n * Called automatically by the global listener.\n * Tracks mouse movement to distinguish real hover from content scrolling.\n */\n private static handleGlobalPointerMove(clientX: number, clientY: number): void {\n if (!Number.isNaN(TickledController._lastMouseClientX)) {\n if (\n clientX !== TickledController._lastMouseClientX\n || clientY !== TickledController._lastMouseClientY\n ) {\n TickledController._mouseMovedSinceKeyboard = true;\n }\n }\n TickledController._lastMouseClientX = clientX;\n TickledController._lastMouseClientY = clientY;\n }\n\n /**\n * Ignore hover (pointerenter / pointerleave) until the pointer genuinely\n * moves. Call this when something other than the pointer changes what is\n * under it — a keypress, or the item set being swapped.\n */\n static ignoreHoverUntilPointerMoves(): void {\n TickledController._mouseMovedSinceKeyboard = false;\n }\n\n /**\n * Check if actual mouse movement has occurred since last keyboard interaction.\n * Used to distinguish real hover/leave from content-scrolling-induced events.\n */\n static get hasMouseMovedSinceKeyboard(): boolean {\n return TickledController._mouseMovedSinceKeyboard;\n }\n\n /**\n * Handle pointer enter event on an item (mouse hover).\n * Only processes if actual mouse movement is detected (not content scrolling).\n * Switches to mouse mode and tickles the item.\n */\n handlePointerEnter(id: T): void {\n if (this.hoverDisabled()) {\n return;\n }\n\n if (!TickledController._mouseMovedSinceKeyboard) {\n return;\n }\n\n const items = this.config.getItems();\n const item = items.find(item => item.id === id);\n if (item && item.enabled === false) {\n return;\n }\n\n const modeChanged = this._inputMode !== `mouse`;\n this._inputMode = `mouse`;\n\n const previousId = this._tickledId;\n this._tickledId = id;\n\n this.host.requestUpdate();\n\n if (previousId !== id && this.config.onTickle) {\n this.config.onTickle(id);\n }\n\n if ((previousId !== id || modeChanged) && this.config.onStateChange) {\n this.config.onStateChange();\n }\n }\n\n /**\n * Handle pointer leave event on an item.\n * Only clears tickled state if actual mouse movement is detected.\n * @param _e The pointer event (not used, but kept for API compatibility)\n */\n handlePointerLeave(_e: PointerEvent): void {\n if (this.hoverDisabled()) {\n return;\n }\n if (TickledController._mouseMovedSinceKeyboard) {\n this.clearTickled();\n }\n }\n\n /**\n * Handle keyboard navigation.\n * Switches to keyboard mode and moves tickled state.\n *\n * @param direction - 'next', 'previous', 'first', 'last', or specific id\n */\n handleKeyboardNavigation(direction: `next` | `previous` | `first` | `last` | T): void {\n const modeChanged = this._inputMode !== `keyboard`;\n this._inputMode = `keyboard`;\n // Rows that scroll under a resting pointer must not steal the cursor.\n TickledController.ignoreHoverUntilPointerMoves();\n\n const items = this.config.getItems();\n const enabledItems = items.filter(item => item.enabled !== false);\n\n if (enabledItems.length === 0) {\n return;\n }\n\n let newId: T | undefined;\n\n if (direction === `first`) {\n newId = enabledItems[0].id;\n } else if (direction === `last`) {\n newId = enabledItems.at(-1)?.id;\n } else if (direction === `next` || direction === `previous`) {\n const currentIndex = enabledItems.findIndex(item => item.id === this._tickledId);\n const wrap = this.config.itemWrap === `wrap`;\n\n if (currentIndex === -1) {\n newId = direction === `next` ? enabledItems[0].id : enabledItems.at(-1)?.id;\n } else {\n const delta = direction === `next` ? 1 : -1;\n let newIndex = currentIndex + delta;\n\n if (newIndex >= 0 && newIndex < enabledItems.length) {\n newId = enabledItems[newIndex].id;\n } else if (wrap) {\n // Wrap around\n if (newIndex < 0) {\n newIndex = enabledItems.length - 1;\n } else {\n newIndex = 0;\n }\n newId = enabledItems[newIndex].id;\n }\n // If newIndex is out of bounds and wrap is disabled, keep current tickled item\n }\n } else {\n const item = enabledItems.find(item => item.id === direction);\n if (item) {\n newId = item.id;\n }\n }\n\n if (newId !== undefined) {\n const previousId = this._tickledId;\n this._tickledId = newId;\n this.host.requestUpdate();\n\n if (previousId !== newId && this.config.onTickle) {\n this.config.onTickle(newId);\n }\n\n if ((previousId !== newId || modeChanged) && this.config.onStateChange) {\n this.config.onStateChange();\n }\n }\n }\n\n /**\n * Manually set the tickled item (useful for programmatic control).\n * Does NOT change input mode.\n */\n setTickled(id: T | undefined): void {\n const previousId = this._tickledId;\n this._tickledId = id;\n this.host.requestUpdate();\n\n if (previousId !== id && this.config.onTickle) {\n this.config.onTickle(id);\n }\n\n if (previousId !== id && this.config.onStateChange) {\n this.config.onStateChange();\n }\n }\n\n /**\n * Clear the tickled state (e.g., on pointer leave).\n * Note: For pointer leave events, prefer using handlePointerLeave() which\n * checks for actual mouse movement.\n */\n clearTickled(): void {\n if (this._tickledId !== undefined) {\n this._tickledId = undefined;\n this.host.requestUpdate();\n\n if (this.config.onTickle) {\n this.config.onTickle(undefined);\n }\n\n if (this.config.onStateChange) {\n this.config.onStateChange();\n }\n }\n }\n\n /**\n * Manually set the input mode.\n * When switching to keyboard mode, resets the mouse movement tracking.\n */\n setInputMode(mode: InputMode): void {\n if (this._inputMode !== mode) {\n this._inputMode = mode;\n this.host.requestUpdate();\n\n if (mode === `keyboard`) {\n TickledController._mouseMovedSinceKeyboard = false;\n }\n\n if (this.config.onStateChange) {\n this.config.onStateChange();\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -171,6 +171,12 @@ declare class TickledController<T = number> implements ReactiveController {
|
|
|
171
171
|
* Tracks mouse movement to distinguish real hover from content scrolling.
|
|
172
172
|
*/
|
|
173
173
|
private static handleGlobalPointerMove;
|
|
174
|
+
/**
|
|
175
|
+
* Ignore hover (pointerenter / pointerleave) until the pointer genuinely
|
|
176
|
+
* moves. Call this when something other than the pointer changes what is
|
|
177
|
+
* under it — a keypress, or the item set being swapped.
|
|
178
|
+
*/
|
|
179
|
+
static ignoreHoverUntilPointerMoves(): void;
|
|
174
180
|
/**
|
|
175
181
|
* Check if actual mouse movement has occurred since last keyboard interaction.
|
|
176
182
|
* Used to distinguish real hover/leave from content-scrolling-induced events.
|
|
@@ -214,4 +220,4 @@ declare class TickledController<T = number> implements ReactiveController {
|
|
|
214
220
|
}
|
|
215
221
|
//#endregion
|
|
216
222
|
export { TickledItem as i, TickledController as n, TickledControllerConfig as r, InputMode as t };
|
|
217
|
-
//# sourceMappingURL=tickled-controller-
|
|
223
|
+
//# sourceMappingURL=tickled-controller-DodxD3eQ.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tickled-controller-
|
|
1
|
+
{"version":3,"file":"tickled-controller-DodxD3eQ.d.ts","names":[],"sources":["../src/interaction/tickled-controller.ts"],"mappings":";;;;;KAKY,YAAY;;;;WAIb,IAAI;;;;WAKJ;;;;;KAMC;;;;KAKA,wBAAwB;;;;EAIlC,gBAAgB,cAAc,YAAY;;;;;;EAO1C,YAAY,IAAI;;;;;;;;;;;;;;;;;;;;;;;EAwBhB;;;;EAKA,mBAAmB;;;;;;;;EASnB;;;;;;EAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA0DW,kBAAkB,uBAAuB;UAC5C;UACA;UACA;UACA;UACA;iBAEO;iBACA;iBACA;iBACA;0BAES;EAIZ,YAAA,MAAM,wBAAwB,QAAQ,wBAAwB;EAQ1E;EAOA;;;;MAUI,aAAa;;;;MAOb,aAAa;;;;;MAQb,WAAW;;;;;;EASf,MAAM,IAAI;;;;EAOV,UAAU,IAAI;;;;;;iBASC;;;;;;SAkBR;;;;;aAQI;;;;;;EASX,mBAAmB,IAAI;;;;;;EAqCvB,mBAAmB,IAAI;;;;;;;EAevB,yBAAyB,oDAAoD;;;;;EAoE7E,WAAW,IAAI;;;;;;EAmBf;;;;;EAmBA,aAAa,MAAM"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { t as TickledController } from "./tickled-controller-
|
|
1
|
+
import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
|
|
2
2
|
import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
|
|
3
3
|
import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
|
|
4
4
|
import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
|
|
5
5
|
import { i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, t as createTreeListSearchAdapter } from "./incr-search-D91M4Ozq.js";
|
|
6
6
|
import { t as ListNativeDragController } from "./list-native-drag-controller-B9xO0XWn.js";
|
|
7
7
|
import { n as animateListItemIn, r as animateListItemOut } from "./list-item-animation-BUoEKi5s.js";
|
|
8
|
-
import "./interaction-
|
|
8
|
+
import "./interaction-ZTh4htzr.js";
|
|
9
9
|
import { t as collectDataResult } from "./data-provider-35TyWclX.js";
|
|
10
10
|
import { LitElement, css, html, nothing } from "lit";
|
|
11
11
|
import { property, state } from "lit/decorators.js";
|
|
@@ -2851,4 +2851,4 @@ var TreeController = class {
|
|
|
2851
2851
|
//#endregion
|
|
2852
2852
|
export { TreeDataModel as a, pruneDraggedDescendants as c, TreeDropController as i, TreeListElement as n, applyTreeDrop as o, TreeBaseElement as r, dropTargetFor as s, TreeController as t };
|
|
2853
2853
|
|
|
2854
|
-
//# sourceMappingURL=tree-
|
|
2854
|
+
//# sourceMappingURL=tree-DGveys4K.js.map
|