@enigmax/primitives 0.22.0 → 0.23.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.
Files changed (67) hide show
  1. package/dist/chunk-3BQVOOAM.js +388 -0
  2. package/dist/{chunk-QQFNAKMY.js → chunk-45UHLZYT.js} +1 -1
  3. package/dist/chunk-4VUHQFAT.js +130 -0
  4. package/dist/{chunk-D5A2ZMAG.js → chunk-4ZPMP47J.js} +6 -1
  5. package/dist/chunk-DSBYVA7V.js +713 -0
  6. package/dist/{chunk-FWVWX67R.js → chunk-FGBIZDV2.js} +3 -3
  7. package/dist/{chunk-R4ZAEE7V.js → chunk-KEVZ5XQV.js} +1 -1
  8. package/dist/chunk-N6PDHMAX.js +213 -0
  9. package/dist/chunk-NONGREXC.js +248 -0
  10. package/dist/chunk-VKL3DEIQ.js +804 -0
  11. package/dist/chunk-WSQC3PCC.js +466 -0
  12. package/dist/context-menu-D3FtTn7v.d.ts +174 -0
  13. package/dist/{index-BHpOZncw.d.ts → index-DQNnohoo.d.ts} +1 -1
  14. package/dist/index.d.ts +5 -1
  15. package/dist/index.js +8 -4
  16. package/dist/keys-D2zJs1uB.d.ts +100 -0
  17. package/dist/next/index.d.ts +9 -2
  18. package/dist/next/index.js +20 -13
  19. package/dist/react/context-menu.d.ts +202 -0
  20. package/dist/react/context-menu.js +6 -0
  21. package/dist/react/index.d.ts +10 -3
  22. package/dist/react/index.js +19 -12
  23. package/dist/react/input.d.ts +2 -2
  24. package/dist/react/input.js +1 -1
  25. package/dist/react/palette.d.ts +1 -1
  26. package/dist/react/palette.js +3 -3
  27. package/dist/react/search.d.ts +1 -1
  28. package/dist/react/search.js +2 -2
  29. package/dist/react/select.d.ts +217 -0
  30. package/dist/react/select.js +7 -0
  31. package/dist/react/selection.d.ts +104 -0
  32. package/dist/react/selection.js +4 -0
  33. package/dist/react-router/index.d.ts +9 -2
  34. package/dist/react-router/index.js +20 -13
  35. package/dist/search/index.d.ts +2 -2
  36. package/dist/search/index.js +1 -1
  37. package/dist/{search-BD9-5O5U.d.ts → search-DYgqRp37.d.ts} +13 -1
  38. package/dist/{search-UQEXAPQB.js → search-PBZORZ7P.js} +1 -1
  39. package/dist/select-ClSy-J1f.d.ts +100 -0
  40. package/dist/selection-B_pmzHpy.d.ts +150 -0
  41. package/package.json +21 -2
  42. package/recipes/context-menu/styles.css +177 -0
  43. package/recipes/input/styles.css +9 -0
  44. package/recipes/palette/styles.css +3 -0
  45. package/recipes/search/tailwind.tsx +3 -2
  46. package/recipes/select/styles.css +230 -0
  47. package/recipes/toast/styles.css +1 -1
  48. package/registry.json +358 -1
  49. package/src/core/context-menu.ts +694 -0
  50. package/src/core/keys.ts +264 -0
  51. package/src/core/search.ts +19 -0
  52. package/src/core/select.ts +404 -0
  53. package/src/core/selection.ts +648 -0
  54. package/src/index.ts +60 -1
  55. package/src/react/context-menu/context.ts +57 -0
  56. package/src/react/context-menu/index.tsx +94 -0
  57. package/src/react/context-menu/root.tsx +846 -0
  58. package/src/react/context-menu/styles.ts +186 -0
  59. package/src/react/index.ts +68 -1
  60. package/src/react/palette/root.tsx +2 -2
  61. package/src/react/select/context.ts +56 -0
  62. package/src/react/select/index.tsx +96 -0
  63. package/src/react/select/root.tsx +839 -0
  64. package/src/react/select/styles.ts +238 -0
  65. package/src/react/selection/index.tsx +115 -0
  66. package/src/react/selection/use-selection.ts +260 -0
  67. /package/dist/{chunk-U3V4EHOB.js → chunk-3HDEZ2E7.js} +0 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Keyboard shortcuts as data: parsed from a string, matched against an event, and written
3
+ * back out the way the platform writes them.
4
+ *
5
+ * Two components need the same three things and would otherwise each get their own half of
6
+ * them - the context menu prints a shortcut beside an action, and the selection list matches
7
+ * one against a key press. A menu whose label says `Ctrl+A` while the list listens for
8
+ * `Meta+A` is the defect that shape produces, so both read this file.
9
+ *
10
+ * `Mod` is the whole point of the spec being a string. It means Command on an Apple keyboard
11
+ * and Control everywhere else, which is what every one of these shortcuts actually means -
12
+ * hardcoding either one is wrong on half the machines.
13
+ */
14
+ /** One shortcut, normalized. `mod` and `ctrl`/`meta` are exclusive: `Mod` sets only `mod`. */
15
+ interface Shortcut {
16
+ /** The `KeyboardEvent.key` to match, lowercased for letters (`a`, `f2`, `delete`, ` `). */
17
+ key: string;
18
+ /** Command on an Apple platform, Control elsewhere. */
19
+ mod?: boolean;
20
+ ctrl?: boolean;
21
+ meta?: boolean;
22
+ shift?: boolean;
23
+ alt?: boolean;
24
+ }
25
+ /** The parts of a key press a shortcut reads. A real KeyboardEvent satisfies it. */
26
+ interface ShortcutEvent {
27
+ key: string;
28
+ ctrlKey?: boolean;
29
+ metaKey?: boolean;
30
+ shiftKey?: boolean;
31
+ altKey?: boolean;
32
+ }
33
+ /**
34
+ * A shortcut as written: `"Mod+A"`, `"Shift+F10"`, `"Delete"`, `"Ctrl+Shift+N"`. A list means
35
+ * several presses do the same thing, and `false` means the command has no binding at all.
36
+ */
37
+ type ShortcutSpec = string | Shortcut | readonly (string | Shortcut)[] | false;
38
+ /**
39
+ * Whether this is an Apple keyboard, and so whether `Mod` is Command.
40
+ *
41
+ * `navigator.platform` is deprecated and still the only reliable answer where it exists, so
42
+ * it is tried first and the user agent is the fallback. A server has neither and gets `false`,
43
+ * which is the right guess: a label rendered on the server is corrected on hydration, and a
44
+ * key press cannot happen there at all.
45
+ */
46
+ declare function isApplePlatform(): boolean;
47
+ /** `"Mod+Shift+A"` -> the shortcut it stands for. Unknown words are treated as the key. */
48
+ declare function parseShortcut(spec: string | Shortcut): Shortcut;
49
+ /** A spec as a list, so one binding and several read the same downstream. */
50
+ declare function shortcutList(spec: ShortcutSpec): Shortcut[];
51
+ /**
52
+ * Whether a key press is this shortcut.
53
+ *
54
+ * Every modifier is checked, including the ones the shortcut does NOT ask for: `Delete` must
55
+ * not fire on `Ctrl+Delete`, which means something else in every file manager there is. Shift
56
+ * is the one exception the caller can waive, because a shifted letter arrives as a different
57
+ * `key` on some layouts.
58
+ */
59
+ declare function matchesShortcut(event: ShortcutEvent, spec: ShortcutSpec, apple?: boolean): boolean;
60
+ /**
61
+ * The shortcut written the way this platform writes it, as tokens.
62
+ *
63
+ * Tokens rather than a string because that is what a menu renders: one `<kbd>` per key, so
64
+ * `Ctrl` and `A` can be spaced and styled apart. `shortcutText` joins them for anything that
65
+ * only has room for a string.
66
+ */
67
+ declare function shortcutTokens(spec: string | Shortcut, apple?: boolean): string[];
68
+ /** One string, for a `title`, an `aria-keyshortcuts` neighbour, or a menu with no room. */
69
+ declare function shortcutText(spec: string | Shortcut, apple?: boolean): string;
70
+ /**
71
+ * How long a typeahead buffer survives. Long enough to type a word, short enough to reset
72
+ * before the next thing you meant.
73
+ */
74
+ declare const TYPEAHEAD_MS = 600;
75
+ /** The buffer between two presses: what has been typed, and when. */
76
+ interface TypeaheadState {
77
+ typed: string;
78
+ at: number;
79
+ }
80
+ interface TypeaheadStep extends TypeaheadState {
81
+ /** What to look for. The buffer, or its one repeated character - see below. */
82
+ needle: string;
83
+ /**
84
+ * Whether this press CYCLES through the rows starting with the letter rather than refining
85
+ * what the last one found. True for a single letter and for the same letter pressed again,
86
+ * which is the rule every desktop list follows: "rrr" is not a word anybody is typing, it
87
+ * is someone walking through the Rs.
88
+ */
89
+ cycle: boolean;
90
+ }
91
+ /**
92
+ * Advance a typeahead buffer.
93
+ *
94
+ * Shared because two lists in this package do the same thing with it - a select with no filter
95
+ * and a menu - and a buffer that timed out differently in the two would be felt as one of them
96
+ * being broken.
97
+ */
98
+ declare function typeaheadStep(state: TypeaheadState, character: string, now?: number, windowMs?: number): TypeaheadStep;
99
+
100
+ export { type Shortcut as S, TYPEAHEAD_MS as T, type ShortcutEvent as a, type ShortcutSpec as b, type TypeaheadState as c, type TypeaheadStep as d, shortcutText as e, shortcutTokens as f, isApplePlatform as i, matchesShortcut as m, parseShortcut as p, shortcutList as s, typeaheadStep as t };
@@ -5,9 +5,9 @@ export { M as MarqueeHover, a as MarqueeInstance, b as MarqueeOptions } from '..
5
5
  export { PasswordStrength, PasswordStrengthProps, UseButtonResult, UseInputResult, getLinkComponent, setLinkComponent, useButton, useInput } from '../react/index.js';
6
6
  export { UseSearchResult, useSearch } from '../react/search.js';
7
7
  export { I as InputAction, b as InputIcon, d as InputOptions } from '../input-BwXjFenq.js';
8
- export { F as FuseConstructor, a as FuseLike, S as SearchInstance, b as SearchMatch, c as SearchOptions } from '../search-BD9-5O5U.js';
8
+ export { F as FuseConstructor, a as FuseLike, S as SearchInstance, b as SearchMatch, c as SearchOptions, s as shortenQuery } from '../search-DYgqRp37.js';
9
9
  export { c as ButtonOptions, d as ButtonState } from '../button-CaXaqG_K.js';
10
- export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-BHpOZncw.js';
10
+ export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-DQNnohoo.js';
11
11
  export { Slot, SlotProps, mergeSlotProps } from '../react/slot.js';
12
12
  export { E as EstimateOptions, G as GeneratePasswordOptions, a as PasswordScore, b as PasswordStrengthReport, e as estimatePasswordStrength, g as generatePassword } from '../password-C8lG4Zm9.js';
13
13
  export { UseNotificationsResult, createNotificationQueue, defaultQueue, useNotifications } from '../react/notifications.js';
@@ -21,6 +21,13 @@ export { Flag, FlagProps } from '../react/flag.js';
21
21
  export { c as FlagFormat, d as FlagOptions, e as FlagShape, f as FlagSource, h as configureFlags, i as flagAttributes, k as flagName, l as flagSrc, m as flagView, n as normalizeFlagCode } from '../flags-BQU1V9rE.js';
22
22
  export { PaletteContent, PaletteContextValue, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteListProps, PaletteRoot, PaletteRootProps, PaletteRow, PaletteSection, PaletteTrigger, SearchPalette, SearchPaletteProps, usePaletteContext } from '../react/palette.js';
23
23
  export { R as RecentEntry, b as RecentStore, e as createRecentStore, g as groupRows, i as isPaletteShortcut, m as moveActive, r as recentKey, s as shortcutLabel } from '../palette-D7iuQh_T.js';
24
+ export { Select, SelectContent, SelectContextValue, SelectItem, SelectList, SelectMultipleProps, SelectOptionRow, SelectProps, SelectRoot, SelectRootProps, SelectSearch, SelectSingleProps, SelectTrigger, SelectValue, useSelectContext } from '../react/select.js';
25
+ export { a as SelectInstance, c as SelectOption, d as SelectOptions, e as SelectState, f as createSelect } from '../select-ClSy-J1f.js';
26
+ export { ContextMenu, ContextMenuContent, ContextMenuContentProps, ContextMenuContextValue, ContextMenuItem, ContextMenuList, ContextMenuNode, ContextMenuPanel, ContextMenuProps, ContextMenuRoot, ContextMenuRootProps, ContextMenuRow, ContextMenuSearch, ContextMenuTrigger, ContextMenuTriggerProps, useContextMenuContext } from '../react/context-menu.js';
27
+ export { a as ContextMenuAction, b as ContextMenuEntry, c as ContextMenuInstance, g as ContextMenuOptions, j as ContextMenuState, k as createContextMenu, l as isAction } from '../context-menu-D3FtTn7v.js';
28
+ export { MarqueeRect, SelectionList, SelectionListProps, SelectionRenderer, SelectionRowRender, UseSelectionOptions, UseSelectionResult, useSelection } from '../react/selection.js';
29
+ export { D as DEFAULT_SELECTION_SHORTCUTS, a as SelectionCommand, b as SelectionCommandEvent, c as SelectionCommandName, d as SelectionInstance, e as SelectionOptions, f as SelectionShortcuts, g as SelectionState, h as createSelection } from '../selection-B_pmzHpy.js';
30
+ export { S as Shortcut, b as ShortcutSpec, i as isApplePlatform, m as matchesShortcut, p as parseShortcut, e as shortcutText, f as shortcutTokens } from '../keys-D2zJs1uB.js';
24
31
 
25
32
  /**
26
33
  * The Next.js entry. Same components, wired to `next/link`.
@@ -1,29 +1,36 @@
1
1
  "use client";
2
- export { useInput } from '../chunk-U3V4EHOB.js';
2
+ export { useInput } from '../chunk-3HDEZ2E7.js';
3
+ export { RelativeTime } from '../chunk-OCMI7R6H.js';
3
4
  export { PasswordStrength } from '../chunk-XQHCZAPJ.js';
5
+ export { ContextMenu, ContextMenuContent, ContextMenuList, ContextMenuPanel, ContextMenuRoot, ContextMenuRow, ContextMenuSearch, ContextMenuTrigger, useContextMenuContext } from '../chunk-DSBYVA7V.js';
6
+ export { SelectionList, useSelection } from '../chunk-N6PDHMAX.js';
7
+ import { Button } from '../chunk-6BGBYUSZ.js';
8
+ export { getLinkComponent, setLinkComponent, useButton } from '../chunk-6BGBYUSZ.js';
4
9
  export { Flag } from '../chunk-NPHRS2Q7.js';
5
10
  export { Toaster, toast, useSonner } from '../chunk-WPTBURIC.js';
11
+ export { createNotificationQueue, defaultQueue, useNotifications } from '../chunk-QYMUIW5I.js';
6
12
  export { useMarquee } from '../chunk-ZWR2EXHQ.js';
7
- export { useSearch } from '../chunk-QQFNAKMY.js';
13
+ export { useSearch } from '../chunk-45UHLZYT.js';
8
14
  export { useNetworkState } from '../chunk-S653GLSF.js';
9
- export { createNotificationQueue, defaultQueue, useNotifications } from '../chunk-QYMUIW5I.js';
10
- export { RelativeTime } from '../chunk-OCMI7R6H.js';
11
15
  import '../chunk-KJINGUQN.js';
16
+ import '../chunk-IXVMRVD4.js';
12
17
  export { estimatePasswordStrength, generatePassword } from '../chunk-HC2ME5PU.js';
18
+ export { createContextMenu, isAction } from '../chunk-3BQVOOAM.js';
19
+ export { DEFAULT_SELECTION_SHORTCUTS, createSelection } from '../chunk-WSQC3PCC.js';
20
+ import '../chunk-MMQPZGSU.js';
13
21
  export { configureFlags, flagAttributes, flagName, flagSrc, flagView, normalizeFlagCode } from '../chunk-LMZJBOZG.js';
22
+ import '../chunk-SNYUBXWQ.js';
14
23
  import '../chunk-UOSSNUSC.js';
15
24
  import '../chunk-2QFTRNAZ.js';
16
- import '../chunk-SNYUBXWQ.js';
17
- import '../chunk-IXVMRVD4.js';
18
- export { Input } from '../chunk-R4ZAEE7V.js';
25
+ export { Input } from '../chunk-KEVZ5XQV.js';
19
26
  import '../chunk-F25CGNQC.js';
20
- export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FWVWX67R.js';
21
- export { createRecentStore, groupRows, isPaletteShortcut, moveActive, recentKey, shortcutLabel } from '../chunk-DTWZDONY.js';
22
- import '../chunk-D5A2ZMAG.js';
23
- import { Button } from '../chunk-6BGBYUSZ.js';
24
- export { getLinkComponent, setLinkComponent, useButton } from '../chunk-6BGBYUSZ.js';
25
- import '../chunk-MMQPZGSU.js';
27
+ export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FGBIZDV2.js';
28
+ export { Select, SelectContent, SelectList, SelectOptionRow, SelectRoot, SelectSearch, SelectTrigger, SelectValue, useSelectContext } from '../chunk-VKL3DEIQ.js';
29
+ export { createSelect } from '../chunk-NONGREXC.js';
30
+ export { isApplePlatform, matchesShortcut, parseShortcut, shortcutText, shortcutTokens } from '../chunk-4VUHQFAT.js';
26
31
  export { Slot, mergeSlotProps } from '../chunk-HS3X3XCW.js';
32
+ export { createRecentStore, groupRows, isPaletteShortcut, moveActive, recentKey, shortcutLabel } from '../chunk-DTWZDONY.js';
33
+ export { shortenQuery } from '../chunk-4ZPMP47J.js';
27
34
  import Link from 'next/link';
28
35
  import { forwardRef, createElement } from 'react';
29
36
 
@@ -0,0 +1,202 @@
1
+ import { ReactNode, RefObject, ComponentPropsWithoutRef } from 'react';
2
+ import { a as ContextMenuAction, b as ContextMenuEntry, c as ContextMenuInstance, j as ContextMenuState, h as ContextMenuPoint, g as ContextMenuOptions } from '../context-menu-D3FtTn7v.js';
3
+ export { C as CONTEXT_MENU_SEARCH_KEYS, d as ContextMenuLabel, e as ContextMenuLevel, f as ContextMenuMoveKey, i as ContextMenuSeparator, k as createContextMenu, l as isAction } from '../context-menu-D3FtTn7v.js';
4
+ export { S as Shortcut, b as ShortcutSpec, m as matchesShortcut, p as parseShortcut, e as shortcutText, f as shortcutTokens } from '../keys-D2zJs1uB.js';
5
+ import '../search-DYgqRp37.js';
6
+
7
+ /**
8
+ * One row, as React draws it. The core carries `icon` as `unknown` because it cannot know
9
+ * what a node is; here it is one.
10
+ */
11
+ interface ContextMenuItem extends Omit<ContextMenuAction, "icon" | "items"> {
12
+ icon?: ReactNode;
13
+ items?: readonly ContextMenuNode[];
14
+ }
15
+ /** Anything that can appear in a menu, with React's icon type. */
16
+ type ContextMenuNode = ContextMenuItem | Exclude<ContextMenuEntry, ContextMenuAction>;
17
+ interface ContextMenuContextValue {
18
+ instance: ContextMenuInstance;
19
+ state: ContextMenuState;
20
+ /** Open at a point. False when there was nothing to show, so the press is left alone. */
21
+ open: (point: ContextMenuPoint) => boolean;
22
+ close: () => void;
23
+ /** ids the parts need to point at each other. */
24
+ ids: {
25
+ trigger: string;
26
+ };
27
+ panelId: (level: number) => string;
28
+ itemId: (level: number, index: number) => string;
29
+ triggerRef: RefObject<HTMLElement | null>;
30
+ /** Which panel the keyboard is in. Always the deepest open one. */
31
+ onMenuKeyDown: (event: React.KeyboardEvent) => void;
32
+ /** How long the pointer must rest on a row before its submenu opens, and before one closes. */
33
+ delays: {
34
+ open: number;
35
+ close: number;
36
+ };
37
+ /** Drop the pending close, wherever it was scheduled. Called wherever the pointer lands. */
38
+ cancelClose: () => void;
39
+ /** Close everything below `level`, after the beat - replacing any close already waiting. */
40
+ scheduleClose: (level: number) => void;
41
+ /** Draw a row instead of the default icon / label / shortcut. */
42
+ renderItem?: (item: ContextMenuItem, level: number, index: number) => ReactNode;
43
+ /** Shown while a fetched submenu has not answered. */
44
+ loadingLabel: ReactNode;
45
+ /** Shown when a filter matched nothing, or a fetched submenu came back with nothing. */
46
+ emptyLabel: ReactNode;
47
+ }
48
+ declare function useContextMenuContext(part: string): ContextMenuContextValue;
49
+
50
+ interface ContextMenuRootProps {
51
+ /** The rows. A list with nothing selectable in it opens no menu at all. */
52
+ items: readonly ContextMenuNode[];
53
+ /** A heading over the rows, naming what the menu is acting on. */
54
+ title?: string;
55
+ /** A row was invoked. The menu has already closed by the time this runs. */
56
+ onSelect?: (item: ContextMenuItem, path: string[]) => void;
57
+ onOpenChange?: (open: boolean) => void;
58
+ /** Nothing opens, and the press is left to the browser. For a disabled row or a read-only view. */
59
+ disabled?: boolean;
60
+ /** Fuse.js's constructor, for fuzzy filtering. Omit it for the built-in matcher. */
61
+ fuse?: ContextMenuOptions["fuse"];
62
+ fuseOptions?: Record<string, unknown>;
63
+ matcher?: ContextMenuOptions["matcher"];
64
+ searchKeys?: string[];
65
+ /** How long a fetched submenu stays cached. 0 refetches every time. Default 5 minutes. */
66
+ cacheMs?: number;
67
+ /** Hover timings, in ms. Leave them alone unless the design genuinely needs otherwise. */
68
+ openDelay?: number;
69
+ closeDelay?: number;
70
+ /** Draw a row instead of the default icon / label / shortcut. */
71
+ renderItem?: (item: ContextMenuItem, level: number, index: number) => ReactNode;
72
+ loadingLabel?: ReactNode;
73
+ emptyLabel?: ReactNode;
74
+ /** Inject the baseline stylesheet. See the note above. */
75
+ styles?: boolean;
76
+ children?: ReactNode;
77
+ }
78
+ declare function ContextMenuRoot(props: ContextMenuRootProps): ReactNode;
79
+ interface ContextMenuTriggerProps extends ComponentPropsWithoutRef<"div"> {
80
+ /** Put the behaviour on your own element instead of a wrapper div. */
81
+ asChild?: boolean;
82
+ /** Open on a long press as well, which is what a right-click is on a touch screen. */
83
+ longPress?: boolean;
84
+ }
85
+ /**
86
+ * The area a right-click opens the menu over.
87
+ *
88
+ * It is `tabIndex={0}` and answers Shift+F10 and the Menu key, because a context menu reached
89
+ * only by right-clicking is one a keyboard user cannot open at all - and those two are the
90
+ * shortcuts the platform already assigns to it. Opened that way it appears at the element's
91
+ * own corner rather than at a pointer that was never there.
92
+ */
93
+ declare function ContextMenuTrigger({ asChild, longPress, children, ...props }: ContextMenuTriggerProps): ReactNode;
94
+ interface ContextMenuContentProps extends ComponentPropsWithoutRef<"div"> {
95
+ /** How many rows to put in the document at once. `Infinity` renders the lot. */
96
+ chunk?: number;
97
+ /** Render the panels where they are instead of in `<body>`. See the note on Root. */
98
+ portal?: boolean;
99
+ }
100
+ /** The whole open branch: the root panel, then one panel per open submenu. */
101
+ declare function ContextMenuContent({ chunk, portal, ...props }: ContextMenuContentProps): ReactNode;
102
+ interface ContextMenuPanelProps extends ComponentPropsWithoutRef<"div"> {
103
+ level: number;
104
+ chunk?: number;
105
+ }
106
+ /**
107
+ * One level: its heading, its filter and its rows, placed against the thing that opened it.
108
+ *
109
+ * The root panel is placed at the pointer; a submenu is placed against the ROW that opened
110
+ * it. Both flip rather than overflow - a menu opened near the right edge of the window opens
111
+ * leftwards, and one near the bottom opens upwards, because the alternative is a panel whose
112
+ * rows are off the screen and unreachable.
113
+ */
114
+ declare function ContextMenuPanel({ level, chunk, ...props }: ContextMenuPanelProps): ReactNode;
115
+ interface ContextMenuSearchProps extends Omit<ComponentPropsWithoutRef<"input">, "value" | "onChange" | "type"> {
116
+ level: number;
117
+ placeholder?: string;
118
+ }
119
+ declare function ContextMenuSearch({ level, placeholder, onKeyDown, ...props }: ContextMenuSearchProps): ReactNode;
120
+ interface ContextMenuListProps extends ComponentPropsWithoutRef<"div"> {
121
+ level: number;
122
+ chunk?: number;
123
+ }
124
+ /**
125
+ * The rows of one level, rendered a window at a time.
126
+ *
127
+ * A menu is usually short and this costs nothing there. It stops costing nothing the moment a
128
+ * submenu is a list of files, a branch, a tag or a device - which is exactly the submenu that
129
+ * is fetched, and the one that would otherwise put five hundred subtrees in the document for
130
+ * the eight rows anybody sees.
131
+ */
132
+ declare function ContextMenuList({ level, chunk, ...props }: ContextMenuListProps): ReactNode;
133
+ interface ContextMenuRowProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
134
+ level: number;
135
+ /** Its position in the level's VISIBLE list, which is what the keyboard moves through. */
136
+ index: number;
137
+ entry: ContextMenuEntry;
138
+ children?: ReactNode;
139
+ }
140
+ declare function ContextMenuRow({ level, index, entry, children, ...props }: ContextMenuRowProps): ReactNode;
141
+
142
+ /**
143
+ * The context menu's baseline look.
144
+ *
145
+ * A string rather than a stylesheet because `<ContextMenu.Root>` injects it, for the same
146
+ * reason the select does: a popup with no styles is not a plain-looking control, it is
147
+ * transparent text lying on top of the page - and this one is drawn at the pointer, over
148
+ * whatever happens to be under it. `scripts/sync-recipes.mjs` generates
149
+ * `recipes/context-menu/styles.css` from here, and CI fails when the two drift.
150
+ *
151
+ * Everything below is either a custom property or an attribute selector: override the
152
+ * properties on `:root` for a different-looking menu without writing one selector. The sheet
153
+ * is PREPENDED to `<head>`, so anything the document already has wins on source order at
154
+ * equal specificity.
155
+ */
156
+ declare const CONTEXT_MENU_STYLES = "\n:root {\n --enigma-menu-bg: #1c1c1c;\n --enigma-menu-border: #333333;\n --enigma-menu-radius: 0.625rem;\n --enigma-menu-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);\n --enigma-menu-text: #f5f5f5;\n --enigma-menu-muted: #a3a3a3;\n --enigma-menu-font-size: 0.8125rem;\n --enigma-menu-min-width: 12rem;\n --enigma-menu-max-height: 20rem;\n\n --enigma-menu-active-bg: #2a2a2a;\n --enigma-menu-accent: #fbbf24;\n --enigma-menu-danger: #f87171;\n --enigma-menu-danger-bg: rgba(248, 113, 113, 0.12);\n}\n\n@media (prefers-color-scheme: light) {\n :root {\n --enigma-menu-bg: #ffffff;\n --enigma-menu-border: #e5e5e5;\n --enigma-menu-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);\n --enigma-menu-text: #171717;\n --enigma-menu-muted: #737373;\n --enigma-menu-active-bg: #f5f5f5;\n --enigma-menu-accent: #b45309;\n --enigma-menu-danger: #b91c1c;\n --enigma-menu-danger-bg: rgba(185, 28, 28, 0.08);\n }\n}\n\n/* Every panel is positioned in VIEWPORT coordinates, which is what a pointer event reports\n and what a menu opened at the pointer needs. Fixed rather than absolute so a scrolling\n ancestor cannot drag it away from the place it was opened. */\n[data-enigma-menu-panel] {\n position: fixed; z-index: 60;\n box-sizing: border-box;\n min-width: var(--enigma-menu-min-width);\n max-width: min(22rem, calc(100vw - 1rem));\n padding: 0.25rem;\n color: var(--enigma-menu-text);\n background: var(--enigma-menu-bg);\n border: 1px solid var(--enigma-menu-border);\n border-radius: var(--enigma-menu-radius);\n box-shadow: var(--enigma-menu-shadow);\n font-size: var(--enigma-menu-font-size);\n animation: enigma-menu-in 90ms ease-out;\n /* Measured before it is placed, and placed before it is seen: without this the panel is\n painted at 0,0 for one frame and jumps to the pointer on the next. */\n visibility: hidden;\n}\n[data-enigma-menu-panel][data-placed] { visibility: visible; }\n@keyframes enigma-menu-in {\n from { opacity: 0; transform: scale(0.98); }\n to { opacity: 1; transform: none; }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-enigma-menu-panel] { animation: none; }\n}\n\n/* The heading: what the menu is acting ON. A long file name is cut rather than allowed to\n set the panel's width, and the full one stays reachable through its title attribute. */\n[data-enigma-menu-title] {\n margin: 0; padding: 0.375rem 0.5rem 0.25rem;\n font-size: 0.6875rem; font-weight: 600;\n color: var(--enigma-menu-muted);\n overflow: hidden; white-space: nowrap; text-overflow: ellipsis;\n}\n\n[data-enigma-menu-search] {\n width: 100%; box-sizing: border-box;\n padding: 0.375rem 0.5rem 0.5rem;\n font: inherit; font-size: var(--enigma-menu-font-size);\n color: var(--enigma-menu-text); background: transparent;\n border: 0; border-bottom: 1px solid var(--enigma-menu-border);\n outline: none;\n}\n[data-enigma-menu-search]::-webkit-search-cancel-button,\n[data-enigma-menu-search]::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }\n\n[data-enigma-menu-list] {\n max-height: var(--enigma-menu-max-height);\n overflow-y: auto; overscroll-behavior: contain;\n}\n\n[data-enigma-menu-item] {\n display: flex; align-items: center; gap: 0.5rem;\n padding: 0.3125rem 0.5rem; border-radius: 0.375rem;\n line-height: 1.4;\n color: var(--enigma-menu-text);\n /* The hand, not the arrow. A native menu uses the arrow because the whole surface is\n drawn by the OS and nothing on a page looks like it; here the rows sit on a web page,\n where the hand is what says \"this is a thing you press\". */\n cursor: pointer; user-select: none;\n}\n[data-enigma-menu-item][data-active] { background: var(--enigma-menu-active-bg); }\n[data-enigma-menu-item][data-disabled] { opacity: 0.45; cursor: not-allowed; }\n[data-enigma-menu-item][data-destructive] { color: var(--enigma-menu-danger); }\n[data-enigma-menu-item][data-destructive][data-active] { background: var(--enigma-menu-danger-bg); }\n\n[data-enigma-menu-item-text] { display: grid; min-width: 0; }\n[data-enigma-menu-item-label] { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n[data-enigma-menu-item-description] {\n font-size: 0.6875rem; color: var(--enigma-menu-muted);\n overflow: hidden; white-space: nowrap; text-overflow: ellipsis;\n}\n\n[data-enigma-menu-icon] { display: inline-flex; align-items: center; flex: none; width: 1rem; max-height: 1.25em; line-height: 0; }\n\n/* The shortcut, on the right, the way every desktop menu prints it. margin-left: auto is\n what pushes it there, and flex: none is what stops a long label squashing it. */\n[data-enigma-menu-shortcut] {\n display: flex; align-items: center; gap: 0.125rem;\n flex: none; margin-left: auto; padding-left: 1.5rem;\n font-size: 0.6875rem; color: var(--enigma-menu-muted);\n font-variant-numeric: tabular-nums;\n}\n[data-enigma-menu-shortcut] kbd { font: inherit; }\n\n/* The submenu arrow shares the shortcut's slot, so a row never has both pushed apart. */\n[data-enigma-menu-arrow] {\n flex: none; margin-left: auto;\n width: 0.35rem; height: 0.35rem;\n border-right: 1.5px solid currentColor; border-top: 1.5px solid currentColor;\n transform: rotate(45deg);\n opacity: 0.6;\n}\n[data-enigma-menu-shortcut] + [data-enigma-menu-arrow] { margin-left: 0.5rem; }\n\n/* Check and radio: drawn rather than loaded, and reserving their space either way so\n choosing a row does not shift the label under the pointer. */\n[data-enigma-menu-check] {\n flex: none; width: 1rem; height: 1rem;\n display: grid; place-items: center;\n color: var(--enigma-menu-accent);\n}\n[data-enigma-menu-check]::after { content: \"\"; width: 0.35rem; height: 0.6rem; opacity: 0; }\n[data-enigma-menu-item][aria-checked=\"true\"] [data-enigma-menu-check]::after {\n opacity: 1;\n border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;\n transform: rotate(45deg) translate(-0.05rem, -0.05rem);\n}\n[data-enigma-menu-item][role=\"menuitemradio\"] [data-enigma-menu-check]::after {\n width: 0.4rem; height: 0.4rem; border-radius: 999px; background: currentColor;\n transform: none; border: 0;\n}\n\n[data-enigma-menu-separator] {\n height: 1px; margin: 0.25rem 0.25rem;\n background: var(--enigma-menu-border);\n}\n\n[data-enigma-menu-label] {\n margin: 0.375rem 0 0.125rem; padding: 0 0.5rem;\n font-size: 0.6875rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em;\n color: var(--enigma-menu-muted);\n}\n\n[data-enigma-menu-status] {\n margin: 0; padding: 0.625rem 0.5rem;\n font-size: var(--enigma-menu-font-size); color: var(--enigma-menu-muted);\n /* The quoted query is cut in the text as well, but a pasted string with no spaces has no\n break opportunity at all - so this is what stops it stretching the panel. */\n overflow-wrap: anywhere;\n}\n[data-enigma-menu-status][data-error] { color: var(--enigma-menu-danger); }\n\n/* The end-of-window marker: one pixel, so it has a box to be scrolled into. */\n[data-enigma-menu-more] { height: 1px; }\n";
157
+
158
+ type ContextMenuProps = ContextMenuRootProps & {
159
+ /** How many rows to put in the document at once. `Infinity` renders the lot. */
160
+ chunk?: ContextMenuContentProps["chunk"];
161
+ /** Open on a long press as well, which is what a right-click is on a touch screen. */
162
+ longPress?: boolean;
163
+ triggerProps?: ContextMenuTriggerProps;
164
+ contentProps?: ContextMenuContentProps;
165
+ };
166
+ /**
167
+ * The context menu, assembled.
168
+ *
169
+ * ```tsx
170
+ * <ContextMenu
171
+ * title={file.name}
172
+ * items={[
173
+ * { id: "rename", label: "Rename", shortcut: "F2", icon: <Pencil /> },
174
+ * { type: "separator" },
175
+ * { id: "delete", label: "Delete", shortcut: "Delete", destructive: true }
176
+ * ]}
177
+ * onSelect={(item) => run(item.id)}
178
+ * >
179
+ * <FileRow file={file} />
180
+ * </ContextMenu>
181
+ * ```
182
+ *
183
+ * Everything it renders is a part you can render yourself instead - see `ContextMenu.Root`
184
+ * for the anatomy. This is those parts in the order they belong in, not a different
185
+ * component: the children become the area a right-click opens the menu over.
186
+ *
187
+ * A menu with no rows to show does not open, and the press falls through to the browser's own
188
+ * menu - an empty box at the pointer tells the reader nothing, and swallowing the press to
189
+ * show one tells them less.
190
+ */
191
+ declare function ContextMenu(props: ContextMenuProps): ReactNode;
192
+ declare namespace ContextMenu {
193
+ var Root: typeof ContextMenuRoot;
194
+ var Trigger: typeof ContextMenuTrigger;
195
+ var Content: typeof ContextMenuContent;
196
+ var Panel: typeof ContextMenuPanel;
197
+ var Search: typeof ContextMenuSearch;
198
+ var List: typeof ContextMenuList;
199
+ var Item: typeof ContextMenuRow;
200
+ }
201
+
202
+ export { CONTEXT_MENU_STYLES, ContextMenu, ContextMenuAction, ContextMenuContent, type ContextMenuContentProps, type ContextMenuContextValue, ContextMenuEntry, ContextMenuInstance, type ContextMenuItem, ContextMenuList, type ContextMenuListProps, type ContextMenuNode, ContextMenuOptions, ContextMenuPanel, type ContextMenuPanelProps, ContextMenuPoint, type ContextMenuProps, ContextMenuRoot, type ContextMenuRootProps, ContextMenuRow, type ContextMenuRowProps, ContextMenuSearch, type ContextMenuSearchProps, ContextMenuState, ContextMenuTrigger, type ContextMenuTriggerProps, useContextMenuContext };
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ export { CONTEXT_MENU_STYLES, ContextMenu, ContextMenuContent, ContextMenuList, ContextMenuPanel, ContextMenuRoot, ContextMenuRow, ContextMenuSearch, ContextMenuTrigger, useContextMenuContext } from '../chunk-DSBYVA7V.js';
3
+ export { CONTEXT_MENU_SEARCH_KEYS, createContextMenu, isAction } from '../chunk-3BQVOOAM.js';
4
+ export { matchesShortcut, parseShortcut, shortcutText, shortcutTokens } from '../chunk-4VUHQFAT.js';
5
+ import '../chunk-HS3X3XCW.js';
6
+ import '../chunk-4ZPMP47J.js';
@@ -4,11 +4,11 @@ import { d as InputOptions } from '../input-BwXjFenq.js';
4
4
  export { I as InputAction, b as InputIcon } from '../input-BwXjFenq.js';
5
5
  import { RefObject, ElementType, ComponentPropsWithoutRef, ReactNode } from 'react';
6
6
  export { UseSearchResult, useSearch } from './search.js';
7
- export { F as FuseConstructor, a as FuseLike, S as SearchInstance, b as SearchMatch, c as SearchOptions } from '../search-BD9-5O5U.js';
7
+ export { F as FuseConstructor, a as FuseLike, S as SearchInstance, b as SearchMatch, c as SearchOptions, s as shortenQuery } from '../search-DYgqRp37.js';
8
8
  import { d as ButtonState, c as ButtonOptions } from '../button-CaXaqG_K.js';
9
9
  export { Button, ButtonProps } from './button.js';
10
- import { f as PasswordStrengthClassNames } from '../index-BHpOZncw.js';
11
- export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-BHpOZncw.js';
10
+ import { f as PasswordStrengthClassNames } from '../index-DQNnohoo.js';
11
+ export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-DQNnohoo.js';
12
12
  import { b as PasswordStrengthReport } from '../password-C8lG4Zm9.js';
13
13
  export { E as EstimateOptions, G as GeneratePasswordOptions, a as PasswordScore, e as estimatePasswordStrength, g as generatePassword } from '../password-C8lG4Zm9.js';
14
14
  export { Slot, SlotProps, mergeSlotProps } from './slot.js';
@@ -23,6 +23,13 @@ export { Flag, FlagProps } from './flag.js';
23
23
  export { c as FlagFormat, d as FlagOptions, e as FlagShape, f as FlagSource, h as configureFlags, i as flagAttributes, k as flagName, l as flagSrc, m as flagView, n as normalizeFlagCode } from '../flags-BQU1V9rE.js';
24
24
  export { PaletteContent, PaletteContextValue, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteListProps, PaletteRoot, PaletteRootProps, PaletteRow, PaletteSection, PaletteTrigger, SearchPalette, SearchPaletteProps, usePaletteContext } from './palette.js';
25
25
  export { R as RecentEntry, b as RecentStore, e as createRecentStore, g as groupRows, i as isPaletteShortcut, m as moveActive, r as recentKey, s as shortcutLabel } from '../palette-D7iuQh_T.js';
26
+ export { Select, SelectContent, SelectContextValue, SelectItem, SelectList, SelectMultipleProps, SelectOptionRow, SelectProps, SelectRoot, SelectRootProps, SelectSearch, SelectSingleProps, SelectTrigger, SelectValue, useSelectContext } from './select.js';
27
+ export { a as SelectInstance, c as SelectOption, d as SelectOptions, e as SelectState, f as createSelect } from '../select-ClSy-J1f.js';
28
+ export { ContextMenu, ContextMenuContent, ContextMenuContentProps, ContextMenuContextValue, ContextMenuItem, ContextMenuList, ContextMenuNode, ContextMenuPanel, ContextMenuProps, ContextMenuRoot, ContextMenuRootProps, ContextMenuRow, ContextMenuSearch, ContextMenuTrigger, ContextMenuTriggerProps, useContextMenuContext } from './context-menu.js';
29
+ export { a as ContextMenuAction, b as ContextMenuEntry, c as ContextMenuInstance, g as ContextMenuOptions, j as ContextMenuState, k as createContextMenu, l as isAction } from '../context-menu-D3FtTn7v.js';
30
+ export { MarqueeRect, SelectionList, SelectionListProps, SelectionRenderer, SelectionRowRender, UseSelectionOptions, UseSelectionResult, useSelection } from './selection.js';
31
+ export { D as DEFAULT_SELECTION_SHORTCUTS, a as SelectionCommand, b as SelectionCommandEvent, c as SelectionCommandName, d as SelectionInstance, e as SelectionOptions, f as SelectionShortcuts, g as SelectionState, h as createSelection } from '../selection-B_pmzHpy.js';
32
+ export { S as Shortcut, b as ShortcutSpec, i as isApplePlatform, m as matchesShortcut, p as parseShortcut, e as shortcutText, f as shortcutTokens } from '../keys-D2zJs1uB.js';
26
33
 
27
34
  interface UseInputResult {
28
35
  /** Attach to the `<input>`. */
@@ -1,25 +1,32 @@
1
1
  "use client";
2
- export { useInput } from '../chunk-U3V4EHOB.js';
2
+ export { useInput } from '../chunk-3HDEZ2E7.js';
3
+ export { RelativeTime } from '../chunk-OCMI7R6H.js';
3
4
  export { PasswordStrength } from '../chunk-XQHCZAPJ.js';
5
+ export { ContextMenu, ContextMenuContent, ContextMenuList, ContextMenuPanel, ContextMenuRoot, ContextMenuRow, ContextMenuSearch, ContextMenuTrigger, useContextMenuContext } from '../chunk-DSBYVA7V.js';
6
+ export { SelectionList, useSelection } from '../chunk-N6PDHMAX.js';
7
+ export { Button, getLinkComponent, setLinkComponent, useButton } from '../chunk-6BGBYUSZ.js';
4
8
  export { Flag } from '../chunk-NPHRS2Q7.js';
5
9
  export { Toaster, toast, useSonner } from '../chunk-WPTBURIC.js';
10
+ export { createNotificationQueue, defaultQueue, useNotifications } from '../chunk-QYMUIW5I.js';
6
11
  export { useMarquee } from '../chunk-ZWR2EXHQ.js';
7
- export { useSearch } from '../chunk-QQFNAKMY.js';
12
+ export { useSearch } from '../chunk-45UHLZYT.js';
8
13
  export { useNetworkState } from '../chunk-S653GLSF.js';
9
- export { createNotificationQueue, defaultQueue, useNotifications } from '../chunk-QYMUIW5I.js';
10
- export { RelativeTime } from '../chunk-OCMI7R6H.js';
11
14
  import '../chunk-KJINGUQN.js';
15
+ import '../chunk-IXVMRVD4.js';
12
16
  export { estimatePasswordStrength, generatePassword } from '../chunk-HC2ME5PU.js';
17
+ export { createContextMenu, isAction } from '../chunk-3BQVOOAM.js';
18
+ export { DEFAULT_SELECTION_SHORTCUTS, createSelection } from '../chunk-WSQC3PCC.js';
19
+ import '../chunk-MMQPZGSU.js';
13
20
  export { configureFlags, flagAttributes, flagName, flagSrc, flagView, normalizeFlagCode } from '../chunk-LMZJBOZG.js';
21
+ import '../chunk-SNYUBXWQ.js';
14
22
  import '../chunk-UOSSNUSC.js';
15
23
  import '../chunk-2QFTRNAZ.js';
16
- import '../chunk-SNYUBXWQ.js';
17
- import '../chunk-IXVMRVD4.js';
18
- export { Input } from '../chunk-R4ZAEE7V.js';
24
+ export { Input } from '../chunk-KEVZ5XQV.js';
19
25
  import '../chunk-F25CGNQC.js';
20
- export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FWVWX67R.js';
21
- export { createRecentStore, groupRows, isPaletteShortcut, moveActive, recentKey, shortcutLabel } from '../chunk-DTWZDONY.js';
22
- import '../chunk-D5A2ZMAG.js';
23
- export { Button, getLinkComponent, setLinkComponent, useButton } from '../chunk-6BGBYUSZ.js';
24
- import '../chunk-MMQPZGSU.js';
26
+ export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FGBIZDV2.js';
27
+ export { Select, SelectContent, SelectList, SelectOptionRow, SelectRoot, SelectSearch, SelectTrigger, SelectValue, useSelectContext } from '../chunk-VKL3DEIQ.js';
28
+ export { createSelect } from '../chunk-NONGREXC.js';
29
+ export { isApplePlatform, matchesShortcut, parseShortcut, shortcutText, shortcutTokens } from '../chunk-4VUHQFAT.js';
25
30
  export { Slot, mergeSlotProps } from '../chunk-HS3X3XCW.js';
31
+ export { createRecentStore, groupRows, isPaletteShortcut, moveActive, recentKey, shortcutLabel } from '../chunk-DTWZDONY.js';
32
+ export { shortenQuery } from '../chunk-4ZPMP47J.js';
@@ -1,4 +1,4 @@
1
- export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-BHpOZncw.js';
1
+ export { B as BreachChecker, a as BreachState, b as BreachStatus, F as FieldAction, I as Input, c as InputBaseProps, d as InputProps, e as InputType, P as PasswordOnlyProps, g as PlainOnlyProps, S as SearchOnlyProps } from '../index-DQNnohoo.js';
2
2
  import 'react';
3
- import '../search-BD9-5O5U.js';
3
+ import '../search-DYgqRp37.js';
4
4
  import '../password-C8lG4Zm9.js';
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export { Input } from '../chunk-R4ZAEE7V.js';
2
+ export { Input } from '../chunk-KEVZ5XQV.js';
3
3
  import '../chunk-F25CGNQC.js';
@@ -1,5 +1,5 @@
1
1
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
- import { b as SearchMatch, c as SearchOptions } from '../search-BD9-5O5U.js';
2
+ import { b as SearchMatch, c as SearchOptions } from '../search-DYgqRp37.js';
3
3
  import { R as RecentEntry } from '../palette-D7iuQh_T.js';
4
4
 
5
5
  /** One line in the palette, whatever it came from. */
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FWVWX67R.js';
3
- import '../chunk-DTWZDONY.js';
4
- import '../chunk-D5A2ZMAG.js';
2
+ export { PaletteContent, PaletteField, PaletteFooter, PaletteItem, PaletteList, PaletteRoot, PaletteTrigger, SearchPalette, usePaletteContext } from '../chunk-FGBIZDV2.js';
5
3
  import '../chunk-HS3X3XCW.js';
4
+ import '../chunk-DTWZDONY.js';
5
+ import '../chunk-4ZPMP47J.js';
@@ -1,5 +1,5 @@
1
1
  import { RefObject } from 'react';
2
- import { b as SearchMatch, c as SearchOptions } from '../search-BD9-5O5U.js';
2
+ import { b as SearchMatch, c as SearchOptions } from '../search-DYgqRp37.js';
3
3
 
4
4
  interface UseSearchResult<T> {
5
5
  /** Attach to the search field, or drive it yourself with `search`. */
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export { useSearch } from '../chunk-QQFNAKMY.js';
3
- import '../chunk-D5A2ZMAG.js';
2
+ export { useSearch } from '../chunk-45UHLZYT.js';
3
+ import '../chunk-4ZPMP47J.js';