@particle-academy/react-fancy 6.10.0 → 6.11.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/CHANGELOG.md +13 -0
- package/dist/{chunk-GEQKNV7E.js → chunk-26GRLVCQ.js} +17 -13
- package/dist/chunk-26GRLVCQ.js.map +1 -0
- package/dist/{chunk-HANQYZW2.cjs → chunk-GB2EGMVQ.cjs} +16 -12
- package/dist/chunk-GB2EGMVQ.cjs.map +1 -0
- package/dist/chunk-HHCVBIMM.js +21 -0
- package/dist/chunk-HHCVBIMM.js.map +1 -0
- package/dist/{chunk-ZBXJDQXN.js → chunk-JJYMRV62.js} +17 -13
- package/dist/chunk-JJYMRV62.js.map +1 -0
- package/dist/{chunk-R6O6SLXK.js → chunk-LG2O26CG.js} +13 -8
- package/dist/chunk-LG2O26CG.js.map +1 -0
- package/dist/{chunk-5U2DZ7AV.js → chunk-MUV7OK3W.js} +8 -6
- package/dist/chunk-MUV7OK3W.js.map +1 -0
- package/dist/{chunk-EC4ZYZNK.cjs → chunk-NFUKNVB7.cjs} +13 -8
- package/dist/chunk-NFUKNVB7.cjs.map +1 -0
- package/dist/chunk-RE3PMG47.cjs +23 -0
- package/dist/chunk-RE3PMG47.cjs.map +1 -0
- package/dist/{chunk-7NRG77U5.cjs → chunk-TXQT6S4D.cjs} +16 -12
- package/dist/chunk-TXQT6S4D.cjs.map +1 -0
- package/dist/{chunk-TXTRTTG7.cjs → chunk-UOG3O3KP.cjs} +8 -6
- package/dist/chunk-UOG3O3KP.cjs.map +1 -0
- package/dist/command.cjs +5 -4
- package/dist/command.js +3 -2
- package/dist/drawer.cjs +5 -4
- package/dist/drawer.d.cts +8 -1
- package/dist/drawer.d.ts +8 -1
- package/dist/drawer.js +3 -2
- package/dist/editor.cjs +1 -1
- package/dist/editor.js +1 -1
- package/dist/index.cjs +12 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/mobile-menu.cjs +1 -1
- package/dist/mobile-menu.js +1 -1
- package/dist/modal.cjs +5 -4
- package/dist/modal.d.cts +11 -1
- package/dist/modal.d.ts +11 -1
- package/dist/modal.js +3 -2
- package/dist/sidebar.cjs +1 -1
- package/dist/sidebar.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-5U2DZ7AV.js.map +0 -1
- package/dist/chunk-7NRG77U5.cjs.map +0 -1
- package/dist/chunk-EC4ZYZNK.cjs.map +0 -1
- package/dist/chunk-GEQKNV7E.js.map +0 -1
- package/dist/chunk-HANQYZW2.cjs.map +0 -1
- package/dist/chunk-R6O6SLXK.js.map +0 -1
- package/dist/chunk-TXTRTTG7.cjs.map +0 -1
- package/dist/chunk-ZBXJDQXN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Command/Command.context.ts","../src/components/Command/CommandInput.tsx","../src/components/Command/CommandList.tsx","../src/components/Command/CommandItem.tsx","../src/components/Command/CommandGroup.tsx","../src/components/Command/CommandEmpty.tsx","../src/components/Command/Command.tsx"],"names":["createContext","useContext","jsxs","jsx","Search","cn","useId","useControllableState","useState","useRef","useCallback","useEscapeKey","useEffect","isImeComposing","useLayoutEffect","useAnimation","useDialogFocusTrap","useMemo","Portal"],"mappings":"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","file":"chunk-NFUKNVB7.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { CommandContextValue } from \"./Command.types\";\n\nexport const CommandContext = createContext<CommandContextValue | null>(null);\n\nexport function useCommand(): CommandContextValue {\n const ctx = useContext(CommandContext);\n if (!ctx) {\n throw new Error(\n \"Command compound components must be used within <Command>\",\n );\n }\n return ctx;\n}\n","import { Search } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandInputProps } from \"./Command.types\";\n\nexport function CommandInput({\n placeholder = \"Type a command or search...\",\n className,\n}: CommandInputProps) {\n const { query, setQuery, listId } = useCommand();\n\n return (\n <div data-react-fancy-command-input=\"\" className=\"flex items-center border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n <Search size={16} className=\"shrink-0 text-zinc-400\" />\n <input\n type=\"text\"\n // A combobox: focus stays here while the arrows move the active option,\n // which Command announces through aria-activedescendant.\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"flex-1 bg-transparent px-3 py-3 text-sm outline-none placeholder:text-zinc-400\",\n className,\n )}\n autoFocus\n />\n </div>\n );\n}\n\nCommandInput.displayName = \"CommandInput\";\n","import { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandListProps } from \"./Command.types\";\n\nexport function CommandList({ children, className }: CommandListProps) {\n const { listId } = useCommand();\n\n return (\n <div\n id={listId}\n data-react-fancy-command-list=\"\"\n role=\"listbox\"\n className={cn(\"max-h-72 overflow-y-auto p-2\", className)}\n >\n {children}\n </div>\n );\n}\n\nCommandList.displayName = \"CommandList\";\n","import { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useCommand } from \"./Command.context\";\nimport type { CommandItemProps } from \"./Command.types\";\n\nexport function CommandItem({\n children,\n value,\n onSelect,\n className,\n}: CommandItemProps) {\n const { query, close, shouldFilter, setActiveIndex } = useCommand();\n // Called before the filter's early return, so the hook order never changes.\n const id = useId();\n\n // Filter by query — unless the caller filters for itself (`shouldFilter={false}`).\n const text = value ?? (typeof children === \"string\" ? children : \"\");\n if (shouldFilter && query && !text.toLowerCase().includes(query.toLowerCase())) {\n return null;\n }\n\n return (\n <button\n id={id}\n data-react-fancy-command-item=\"\"\n type=\"button\"\n role=\"option\"\n // Marked active by Command itself (aria-selected + data-active), since an\n // item cannot know its own position among the rendered options.\n aria-selected={false}\n // Keyboard focus stays in the input; the items are reached with the arrows.\n tabIndex={-1}\n onMouseEnter={(e) => {\n const options = e.currentTarget\n .closest(\"[data-react-fancy-command]\")\n ?.querySelectorAll('[role=\"option\"]');\n if (options) setActiveIndex(Array.from(options).indexOf(e.currentTarget));\n }}\n className={cn(\n \"flex w-full items-center rounded-lg px-3 py-2 text-start text-sm transition-colors\",\n \"text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] data-[active]:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:data-[active]:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n onClick={() => {\n onSelect?.();\n close();\n }}\n >\n {children}\n </button>\n );\n}\n\nCommandItem.displayName = \"CommandItem\";\n","import { cn } from \"../../utils/cn\";\nimport type { CommandGroupProps } from \"./Command.types\";\n\nexport function CommandGroup({\n children,\n heading,\n className,\n}: CommandGroupProps) {\n return (\n <div data-react-fancy-command-group=\"\" role=\"group\" className={cn(\"py-1\", className)}>\n {heading && (\n <div className=\"px-3 py-1.5 text-xs font-medium text-zinc-400\">\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nCommandGroup.displayName = \"CommandGroup\";\n","import { cn } from \"../../utils/cn\";\nimport type { CommandEmptyProps } from \"./Command.types\";\n\nexport function CommandEmpty({\n children = \"No results found.\",\n className,\n}: CommandEmptyProps) {\n return (\n <div\n data-react-fancy-command-empty=\"\"\n className={cn(\n \"py-6 text-center text-sm text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nCommandEmpty.displayName = \"CommandEmpty\";\n","import {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { Portal } from \"../Portal\";\nimport { CommandContext } from \"./Command.context\";\nimport { CommandInput } from \"./CommandInput\";\nimport { CommandList } from \"./CommandList\";\nimport { CommandItem } from \"./CommandItem\";\nimport { CommandGroup } from \"./CommandGroup\";\nimport { CommandEmpty } from \"./CommandEmpty\";\nimport { useDialogFocusTrap } from \"../../hooks/use-dialog-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport type { CommandProps } from \"./Command.types\";\n\nfunction CommandRoot({\n children,\n open,\n onClose,\n className,\n shouldFilter = true,\n query: controlledQuery,\n onQueryChange,\n}: CommandProps) {\n const [query, setQuery] = useControllableState(controlledQuery, \"\", onQueryChange);\n const [activeIndex, setActiveIndex] = useState(-1);\n const panelRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n\n const close = useCallback(() => {\n onClose();\n setQuery(\"\");\n setActiveIndex(-1);\n }, [onClose]);\n\n useEscapeKey(close, open);\n\n // Cmd+K global shortcut is handled by the consumer\n useEffect(() => {\n if (open) {\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }\n }, [open]);\n\n /*\n * Keyboard navigation, as a combobox: the arrows move the ACTIVE item while\n * focus stays in the input (announced through aria-activedescendant), and\n * Enter picks the active item — or the first visible one when none is active.\n *\n * Focus used to move onto the items, and Enter was handled nowhere, so typing\n * a query and pressing Enter did nothing: only a focused item took Enter, as a\n * native click. Found by Genie 2's real-window test.\n */\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const items = panelRef.current?.querySelectorAll<HTMLElement>(\n '[role=\"option\"]',\n );\n if (!items?.length) return;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex(activeIndex < items.length - 1 ? activeIndex + 1 : 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex(activeIndex > 0 ? activeIndex - 1 : items.length - 1);\n } else if (e.key === \"Enter\") {\n if (isImeComposing(e)) return;\n // A focused item takes Enter natively, as a click; picking here as well\n // would select it twice.\n if ((e.target as HTMLElement | null)?.getAttribute(\"role\") === \"option\") return;\n const pick = items[activeIndex] ?? items[0];\n e.preventDefault();\n pick.click();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, activeIndex]);\n\n /*\n * Mark the active item and point the input at it. Done on the DOM after each\n * render because an item cannot know its own index — that is its position\n * among the options currently rendered, which filtering changes.\n */\n useLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel) return;\n\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"option\"]'));\n const active = items[activeIndex];\n items.forEach((item) => {\n const on = item === active;\n item.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n if (on) item.setAttribute(\"data-active\", \"\");\n else item.removeAttribute(\"data-active\");\n });\n\n const input = panel.querySelector<HTMLInputElement>(\"[data-react-fancy-command-input] input\");\n if (active?.id) input?.setAttribute(\"aria-activedescendant\", active.id);\n else input?.removeAttribute(\"aria-activedescendant\");\n active?.scrollIntoView?.({ block: \"nearest\" });\n });\n\n // A new query is a new list: nothing in it is active yet, so Enter picks the first match.\n const changeQuery = useCallback(\n (next: string) => {\n setQuery(next);\n setActiveIndex(-1);\n },\n [setQuery],\n );\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: \"fancy-slide-up\",\n exitClass: \"fancy-fade-out\",\n });\n\n // The panel mounts renders after `open` flips; see useDialogFocusTrap.\n const attachTrap = useDialogFocusTrap(open);\n const attachPanel = useCallback(\n (node: HTMLDivElement | null) => {\n panelRef.current = node;\n (animRef as React.MutableRefObject<HTMLElement | null>).current = node;\n attachTrap(node);\n },\n [animRef, attachTrap],\n );\n\n const ctx = useMemo(\n () => ({\n open,\n close,\n query,\n setQuery: changeQuery,\n activeIndex,\n setActiveIndex,\n shouldFilter,\n listId,\n }),\n [open, close, query, changeQuery, activeIndex, shouldFilter, listId],\n );\n\n if (!mounted) return null;\n\n return (\n <CommandContext.Provider value={ctx}>\n <Portal>\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-[20vh]\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={close}\n aria-hidden=\"true\"\n />\n <div\n ref={attachPanel}\n data-react-fancy-command=\"\"\n className={cn(\n \"relative w-full max-w-lg overflow-hidden rounded-2xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-2xl dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n </Portal>\n </CommandContext.Provider>\n );\n}\n\nexport const Command = Object.assign(CommandRoot, {\n Input: CommandInput,\n List: CommandList,\n Item: CommandItem,\n Group: CommandGroup,\n Empty: CommandEmpty,\n});\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUOG3O3KP_cjs = require('./chunk-UOG3O3KP.cjs');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
function useDialogFocusTrap(open, enabled = true) {
|
|
7
|
+
const ref = react.useRef(null);
|
|
8
|
+
const opener = react.useRef(null);
|
|
9
|
+
const [node, setNode] = react.useState(null);
|
|
10
|
+
const active = open && enabled;
|
|
11
|
+
react.useLayoutEffect(() => {
|
|
12
|
+
if (active) opener.current = document.activeElement;
|
|
13
|
+
}, [active]);
|
|
14
|
+
chunkUOG3O3KP_cjs.useFocusTrap(ref, active && node !== null, opener);
|
|
15
|
+
return react.useCallback((el) => {
|
|
16
|
+
ref.current = el;
|
|
17
|
+
setNode(el);
|
|
18
|
+
}, []);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
exports.useDialogFocusTrap = useDialogFocusTrap;
|
|
22
|
+
//# sourceMappingURL=chunk-RE3PMG47.cjs.map
|
|
23
|
+
//# sourceMappingURL=chunk-RE3PMG47.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-dialog-focus-trap.ts"],"names":["useRef","useState","useLayoutEffect","useFocusTrap","useCallback"],"mappings":";;;;;AAoBO,SAAS,kBAAA,CACd,IAAA,EACA,OAAA,GAAmB,IAAA,EACiB;AACpC,EAAA,MAAM,GAAA,GAAMA,aAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,MAAA,GAASA,aAA2B,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,eAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,SAAS,IAAA,IAAQ,OAAA;AAEvB,EAAAC,qBAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,GAAU,QAAA,CAAS,aAAA;AAAA,EACxC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAC,8BAAA,CAAa,GAAA,EAAK,MAAA,IAAU,IAAA,KAAS,IAAA,EAAM,MAAM,CAAA;AAEjD,EAAA,OAAOC,iBAAA,CAAY,CAAC,EAAA,KAA2B;AAC7C,IAAA,GAAA,CAAI,OAAA,GAAU,EAAA;AACd,IAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,EACZ,CAAA,EAAG,EAAE,CAAA;AACP","file":"chunk-RE3PMG47.cjs","sourcesContent":["import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport { useFocusTrap } from \"./use-focus-trap\";\n\n/**\n * The focus trap for a dialog whose panel mounts LATER than `open` flips —\n * Modal, Drawer and Command, all of which render through `useAnimation` (the\n * panel mounts a render after `open`) and `Portal` (its children a render after\n * that). Returns a callback ref for the panel.\n *\n * Up to 6.10.0 these called `useFocusTrap(ref, open)` directly. Its effect ran in\n * the commit where `open` flipped, found `ref.current === null`, returned, and\n * never ran again because its deps had not changed — so focus never moved in,\n * Tab walked out of the dialog, and close restored nothing. Keying the trap on\n * the panel NODE makes it run in the commit the panel actually appears, with or\n * without an animation.\n *\n * The opener is captured when `open` flips, before the panel exists. Captured at\n * trap time instead it would be whatever the panel autofocused (Command's\n * input), and close would \"restore\" focus into the dialog that is going away.\n */\nexport function useDialogFocusTrap(\n open: boolean,\n enabled: boolean = true,\n): (node: HTMLElement | null) => void {\n const ref = useRef<HTMLElement | null>(null);\n const opener = useRef<HTMLElement | null>(null);\n const [node, setNode] = useState<HTMLElement | null>(null);\n const active = open && enabled;\n\n useLayoutEffect(() => {\n if (active) opener.current = document.activeElement as HTMLElement | null;\n }, [active]);\n\n useFocusTrap(ref, active && node !== null, opener);\n\n return useCallback((el: HTMLElement | null) => {\n ref.current = el;\n setNode(el);\n }, []);\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkRE3PMG47_cjs = require('./chunk-RE3PMG47.cjs');
|
|
4
4
|
var chunkFQZE5N2N_cjs = require('./chunk-FQZE5N2N.cjs');
|
|
5
5
|
var chunkTI7D4QDM_cjs = require('./chunk-TI7D4QDM.cjs');
|
|
6
6
|
var chunkOUYC6EIL_cjs = require('./chunk-OUYC6EIL.cjs');
|
|
@@ -17,7 +17,7 @@ function useDrawer() {
|
|
|
17
17
|
}
|
|
18
18
|
return ctx;
|
|
19
19
|
}
|
|
20
|
-
function DrawerHeader({ children, closable = true, className }) {
|
|
20
|
+
function DrawerHeader({ children, closable = true, className, closeLabel = "Close" }) {
|
|
21
21
|
const { close } = useDrawer();
|
|
22
22
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
23
23
|
"div",
|
|
@@ -34,8 +34,9 @@ function DrawerHeader({ children, closable = true, className }) {
|
|
|
34
34
|
{
|
|
35
35
|
type: "button",
|
|
36
36
|
onClick: close,
|
|
37
|
-
|
|
38
|
-
"
|
|
37
|
+
"data-react-fancy-drawer-close": "",
|
|
38
|
+
className: "relative rounded-lg p-1 text-zinc-400 before:absolute before:-inset-[9px] before:content-[''] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300",
|
|
39
|
+
"aria-label": closeLabel,
|
|
39
40
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 18 })
|
|
40
41
|
}
|
|
41
42
|
) : null
|
|
@@ -140,12 +141,10 @@ function DrawerRoot({
|
|
|
140
141
|
className,
|
|
141
142
|
...rest
|
|
142
143
|
}) {
|
|
143
|
-
const panelRef = react.useRef(null);
|
|
144
144
|
const horizontal = side !== "top" && side !== "bottom";
|
|
145
145
|
const isViewport = attach === "viewport";
|
|
146
146
|
const close = react.useCallback(() => onClose(), [onClose]);
|
|
147
147
|
chunkOUYC6EIL_cjs.useEscapeKey(close, open && dismissOnEscape);
|
|
148
|
-
chunkTXTRTTG7_cjs.useFocusTrap(panelRef, open && isViewport);
|
|
149
148
|
react.useEffect(() => {
|
|
150
149
|
if (!open || !isViewport) return;
|
|
151
150
|
const original = document.body.style.overflow;
|
|
@@ -159,6 +158,14 @@ function DrawerRoot({
|
|
|
159
158
|
enterClass: ENTER[side],
|
|
160
159
|
exitClass: EXIT[side]
|
|
161
160
|
});
|
|
161
|
+
const attachTrap = chunkRE3PMG47_cjs.useDialogFocusTrap(open, isViewport);
|
|
162
|
+
const attachPanel = react.useCallback(
|
|
163
|
+
(node) => {
|
|
164
|
+
animRef.current = node;
|
|
165
|
+
attachTrap(node);
|
|
166
|
+
},
|
|
167
|
+
[animRef, attachTrap]
|
|
168
|
+
);
|
|
162
169
|
const ctx = react.useMemo(() => ({ open, close, side }), [open, close, side]);
|
|
163
170
|
if (!mounted) return null;
|
|
164
171
|
const frame = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -183,10 +190,7 @@ function DrawerRoot({
|
|
|
183
190
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
184
191
|
"div",
|
|
185
192
|
{
|
|
186
|
-
ref:
|
|
187
|
-
panelRef.current = node;
|
|
188
|
-
animRef.current = node;
|
|
189
|
-
},
|
|
193
|
+
ref: attachPanel,
|
|
190
194
|
"data-react-fancy-drawer": "",
|
|
191
195
|
"data-side": side,
|
|
192
196
|
role: "dialog",
|
|
@@ -222,5 +226,5 @@ var Drawer = Object.assign(DrawerRoot, {
|
|
|
222
226
|
|
|
223
227
|
exports.Drawer = Drawer;
|
|
224
228
|
exports.useDrawer = useDrawer;
|
|
225
|
-
//# sourceMappingURL=chunk-
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
229
|
+
//# sourceMappingURL=chunk-TXQT6S4D.cjs.map
|
|
230
|
+
//# sourceMappingURL=chunk-TXQT6S4D.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Drawer/Drawer.context.ts","../src/components/Drawer/DrawerHeader.tsx","../src/components/Drawer/DrawerBody.tsx","../src/components/Drawer/DrawerFooter.tsx","../src/components/Drawer/DrawerContainer.tsx","../src/components/Drawer/Drawer.tsx"],"names":["createContext","useContext","jsxs","cn","jsx","X","useCallback","useEscapeKey","useEffect","useAnimation","useDialogFocusTrap","useMemo","Portal"],"mappings":"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","file":"chunk-TXQT6S4D.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { DrawerContextValue } from \"./Drawer.types\";\n\nexport const DrawerContext = createContext<DrawerContextValue | null>(null);\n\nexport function useDrawer(): DrawerContextValue {\n const ctx = useContext(DrawerContext);\n if (!ctx) {\n throw new Error(\"Drawer compound components must be used within <Drawer>\");\n }\n return ctx;\n}\n","import { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useDrawer } from \"./Drawer.context\";\nimport type { DrawerHeaderProps } from \"./Drawer.types\";\n\n/**\n * The close button draws at 26px (18px icon + `p-1`) and HITS at 44px (WCAG\n * 2.5.5, AAA): a `::before` overhangs it by 9px, inside the header's `py-3`. The\n * look is unchanged; see ModalHeader for why this over a size option.\n */\nexport function DrawerHeader({ children, closable = true, className, closeLabel = \"Close\" }: DrawerHeaderProps) {\n const { close } = useDrawer();\n\n return (\n <div\n data-react-fancy-drawer-header=\"\"\n className={cn(\n \"flex shrink-0 items-center justify-between border-b border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 py-3 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n <div className=\"text-sm font-semibold text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\">{children}</div>\n {closable ? (\n <button\n type=\"button\"\n onClick={close}\n data-react-fancy-drawer-close=\"\"\n className=\"relative rounded-lg p-1 text-zinc-400 before:absolute before:-inset-[9px] before:content-[''] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300\"\n aria-label={closeLabel}\n >\n <X size={18} />\n </button>\n ) : null}\n </div>\n );\n}\n\nDrawerHeader.displayName = \"DrawerHeader\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerBodyProps } from \"./Drawer.types\";\n\nexport function DrawerBody({ children, className }: DrawerBodyProps) {\n return (\n <div\n data-react-fancy-drawer-body=\"\"\n className={cn(\"min-h-0 flex-1 overflow-auto px-4 py-3 text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\", className)}\n >\n {children}\n </div>\n );\n}\n\nDrawerBody.displayName = \"DrawerBody\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerFooterProps } from \"./Drawer.types\";\n\nexport function DrawerFooter({ children, className }: DrawerFooterProps) {\n return (\n <div\n data-react-fancy-drawer-footer=\"\"\n className={cn(\n \"flex shrink-0 items-center justify-end gap-2 border-t border-[color:var(--fancy-border,var(--color-zinc-200))] px-4 py-3 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nDrawerFooter.displayName = \"DrawerFooter\";\n","import { cn } from \"../../utils/cn\";\nimport type { DrawerContainerProps } from \"./Drawer.types\";\n\n/**\n * The anchor for `<Drawer attach=\"container\">`.\n *\n * A container-attached drawer positions itself `absolute`, which resolves\n * against the nearest *positioned* ancestor — so without `relative` somewhere\n * above it, the drawer silently escapes to the viewport and looks like it\n * ignored `attach` entirely. This wrapper supplies `relative` + `overflow-hidden`\n * so the panel slides within the box rather than out of it.\n *\n * <Drawer.Container className=\"h-80 rounded-xl border\">\n * <YourContent />\n * <Drawer attach=\"container\" side=\"bottom\" open={open} onClose={close}>\n * <Drawer.Body>Filters</Drawer.Body>\n * </Drawer>\n * </Drawer.Container>\n *\n * Any element works as long as it is positioned — this is the shortcut, not a\n * requirement. Wrapping a Card, a layout pane, or a prompt-input shell in\n * `relative overflow-hidden` does the same job.\n */\nexport function DrawerContainer({ children, className, ...rest }: DrawerContainerProps) {\n return (\n <div\n data-react-fancy-drawer-container=\"\"\n {...rest}\n className={cn(\"relative overflow-hidden\", className)}\n >\n {children}\n </div>\n );\n}\n\nDrawerContainer.displayName = \"DrawerContainer\";\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Portal } from \"../Portal\";\nimport { DrawerContext } from \"./Drawer.context\";\nimport { DrawerHeader } from \"./DrawerHeader\";\nimport { DrawerBody } from \"./DrawerBody\";\nimport { DrawerFooter } from \"./DrawerFooter\";\nimport { DrawerContainer } from \"./DrawerContainer\";\nimport { useDialogFocusTrap } from \"../../hooks/use-dialog-focus-trap\";\nimport { useEscapeKey } from \"../../hooks/use-escape-key\";\nimport { useAnimation } from \"../../hooks/use-animation\";\nimport type { DrawerProps, DrawerSide } from \"./Drawer.types\";\n\n/**\n * `size` addresses the drawer's own axis: width on the horizontal edges,\n * height on the vertical ones. Keeping one scale across both means `size=\"lg\"`\n * does not have to be re-learned when a drawer moves from the side to the\n * bottom.\n */\nconst WIDTH = {\n sm: \"w-64\",\n md: \"w-80\",\n lg: \"w-96\",\n xl: \"w-[32rem]\",\n full: \"w-full\",\n} as const;\n\nconst HEIGHT = {\n sm: \"h-32\",\n md: \"h-64\",\n lg: \"h-96\",\n xl: \"h-[32rem]\",\n full: \"h-full\",\n} as const;\n\nconst ANCHOR: Record<DrawerSide, string> = {\n start: \"inset-y-0 start-0\",\n end: \"inset-y-0 end-0\",\n left: \"inset-y-0 left-0\",\n right: \"inset-y-0 right-0\",\n top: \"inset-x-0 top-0\",\n bottom: \"inset-x-0 bottom-0\",\n};\n\nconst ENTER: Record<DrawerSide, string> = {\n start: \"fancy-slide-in-start\",\n end: \"fancy-slide-in-end\",\n left: \"fancy-slide-in-left\",\n right: \"fancy-slide-in-right\",\n top: \"fancy-slide-in-top\",\n bottom: \"fancy-slide-in-bottom\",\n};\n\nconst EXIT: Record<DrawerSide, string> = {\n start: \"fancy-slide-out-start\",\n end: \"fancy-slide-out-end\",\n left: \"fancy-slide-out-left\",\n right: \"fancy-slide-out-right\",\n top: \"fancy-slide-out-top\",\n bottom: \"fancy-slide-out-bottom\",\n};\n\n/** The panel's edge shadow reads as depth away from the anchored edge. */\nconst EDGE: Record<DrawerSide, string> = {\n start: \"border-e\",\n end: \"border-s\",\n left: \"border-r\",\n right: \"border-l\",\n top: \"border-b\",\n bottom: \"border-t\",\n};\n\nfunction DrawerRoot({\n children,\n open,\n onClose,\n side = \"end\",\n size = \"md\",\n attach = \"viewport\",\n backdrop = true,\n dismissOnBackdrop = true,\n dismissOnEscape = true,\n className,\n ...rest\n}: DrawerProps) {\n const horizontal = side !== \"top\" && side !== \"bottom\";\n const isViewport = attach === \"viewport\";\n\n const close = useCallback(() => onClose(), [onClose]);\n useEscapeKey(close, open && dismissOnEscape);\n\n useEffect(() => {\n if (!open || !isViewport) return;\n const original = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = original;\n };\n }, [open, isViewport]);\n\n const { mounted, className: animClass, ref: animRef } = useAnimation({\n open,\n enterClass: ENTER[side],\n exitClass: EXIT[side],\n });\n\n // A container-attached drawer is a panel, not a dialog — trapping focus in it\n // would strand keyboard users inside a Card. Only the viewport form is modal.\n // The panel mounts renders after `open` flips; see useDialogFocusTrap.\n const attachTrap = useDialogFocusTrap(open, isViewport);\n const attachPanel = useCallback(\n (node: HTMLDivElement | null) => {\n (animRef as React.MutableRefObject<HTMLElement | null>).current = node;\n attachTrap(node);\n },\n [animRef, attachTrap],\n );\n\n const ctx = useMemo(() => ({ open, close, side }), [open, close, side]);\n\n if (!mounted) return null;\n\n const frame = (\n <div\n data-react-fancy-drawer-frame=\"\"\n className={cn(isViewport ? \"fixed inset-0 z-50\" : \"absolute inset-0 z-20\", !backdrop && \"pointer-events-none\")}\n >\n {backdrop ? (\n <div\n data-react-fancy-drawer-backdrop=\"\"\n className={cn(\n \"absolute inset-0 bg-black/40 transition-opacity\",\n isViewport && \"backdrop-blur-sm\",\n open ? \"opacity-100\" : \"opacity-0\",\n )}\n onClick={dismissOnBackdrop ? close : undefined}\n aria-hidden=\"true\"\n />\n ) : null}\n\n <div\n ref={attachPanel}\n data-react-fancy-drawer=\"\"\n data-side={side}\n role=\"dialog\"\n aria-modal={isViewport || undefined}\n {...rest}\n className={cn(\n \"pointer-events-auto absolute flex flex-col border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-xl dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n ANCHOR[side],\n EDGE[side],\n horizontal ? WIDTH[size] : HEIGHT[size],\n // Cross-axis fills the anchor; the main axis is capped so a viewport\n // drawer can never grow past the screen on a small device.\n horizontal ? \"h-full\" : \"w-full\",\n isViewport && (horizontal ? \"max-w-[90vw]\" : \"max-h-[90vh]\"),\n !isViewport && (horizontal ? \"max-w-full\" : \"max-h-full\"),\n animClass,\n className,\n )}\n >\n {children}\n </div>\n </div>\n );\n\n return (\n <DrawerContext.Provider value={ctx}>\n {isViewport ? <Portal>{frame}</Portal> : frame}\n </DrawerContext.Provider>\n );\n}\n\nexport const Drawer = Object.assign(DrawerRoot, {\n Header: DrawerHeader,\n Body: DrawerBody,\n Footer: DrawerFooter,\n Container: DrawerContainer,\n});\n"]}
|
|
@@ -11,13 +11,15 @@ var FOCUSABLE_SELECTOR = [
|
|
|
11
11
|
"select:not([disabled])",
|
|
12
12
|
"[tabindex]:not([tabindex='-1'])"
|
|
13
13
|
].join(", ");
|
|
14
|
-
function useFocusTrap(ref, enabled = true) {
|
|
14
|
+
function useFocusTrap(ref, enabled = true, restoreTo) {
|
|
15
15
|
react.useEffect(() => {
|
|
16
16
|
if (!enabled) return;
|
|
17
17
|
const el = ref.current;
|
|
18
18
|
if (!el) return;
|
|
19
19
|
const previouslyFocused = document.activeElement;
|
|
20
|
-
const focusables = () => Array.from(el.querySelectorAll(FOCUSABLE_SELECTOR))
|
|
20
|
+
const focusables = () => Array.from(el.querySelectorAll(FOCUSABLE_SELECTOR)).filter(
|
|
21
|
+
(node) => node.getAttribute("tabindex") !== "-1"
|
|
22
|
+
);
|
|
21
23
|
const first = focusables()[0];
|
|
22
24
|
first?.focus();
|
|
23
25
|
const listener = (event) => {
|
|
@@ -41,11 +43,11 @@ function useFocusTrap(ref, enabled = true) {
|
|
|
41
43
|
el.addEventListener("keydown", listener);
|
|
42
44
|
return () => {
|
|
43
45
|
el.removeEventListener("keydown", listener);
|
|
44
|
-
previouslyFocused?.focus();
|
|
46
|
+
(restoreTo?.current ?? previouslyFocused)?.focus();
|
|
45
47
|
};
|
|
46
|
-
}, [ref, enabled]);
|
|
48
|
+
}, [ref, enabled, restoreTo]);
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
exports.useFocusTrap = useFocusTrap;
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
52
|
+
//# sourceMappingURL=chunk-UOG3O3KP.cjs.map
|
|
53
|
+
//# sourceMappingURL=chunk-UOG3O3KP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-focus-trap.ts"],"names":["useEffect"],"mappings":";;;;;AAEA,IAAM,kBAAA,GAAqB;AAAA,EACzB,SAAA;AAAA,EACA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAaJ,SAAS,YAAA,CACd,GAAA,EACA,OAAA,GAAmB,IAAA,EACnB,SAAA,EACM;AACN,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,oBAAoB,QAAA,CAAS,aAAA;AAKnC,IAAA,MAAM,UAAA,GAAa,MACjB,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAA8B,kBAAkB,CAAC,CAAA,CAAE,MAAA;AAAA,MAC/D,CAAC,IAAA,KAAS,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,KAAM;AAAA,KAC9C;AAGF,IAAA,MAAM,KAAA,GAAQ,UAAA,EAAW,CAAE,CAAC,CAAA;AAC5B,IAAA,KAAA,EAAO,KAAA,EAAM;AAEb,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAyB;AACzC,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AAEzB,MAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAEvC,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,IAAI,QAAA,CAAS,kBAAkB,SAAA,EAAW;AACxC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,QAAA,CAAS,KAAA,EAAM;AAAA,QACjB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,IAAI,QAAA,CAAS,kBAAkB,QAAA,EAAU;AACvC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,CAAU,KAAA,EAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAEvC,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,WAAW,QAAQ,CAAA;AAC1C,MAAA,CAAC,SAAA,EAAW,OAAA,IAAW,iBAAA,GAAoB,KAAA,EAAM;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,SAAS,CAAC,CAAA;AAC9B","file":"chunk-UOG3O3KP.cjs","sourcesContent":["import { useEffect, type RefObject } from \"react\";\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"textarea:not([disabled])\",\n \"select:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\", \");\n\n/**\n * Moves focus into `ref`, keeps Tab inside it, and restores focus on disable.\n *\n * `ref.current` must already be set in the commit where `enabled` turns true:\n * the effect does not run again until `enabled` changes. A panel that mounts\n * later (an animation, a Portal) should key `enabled` on the node — see\n * `useDialogFocusTrap`.\n *\n * `restoreTo`, when it holds an element, is where focus returns on disable\n * instead of whatever was focused when the trap engaged.\n */\nexport function useFocusTrap(\n ref: RefObject<HTMLElement | null>,\n enabled: boolean = true,\n restoreTo?: RefObject<HTMLElement | null>,\n): void {\n useEffect(() => {\n if (!enabled) return;\n\n const el = ref.current;\n if (!el) return;\n\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n // Tab stops only. `button` / `input` match an element with `tabindex=\"-1\"`\n // too (Command's options), and treating one as the last stop meant Tab never\n // wrapped: focus was never ON it, so the browser walked out of the dialog.\n const focusables = () =>\n Array.from(el.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (node) => node.getAttribute(\"tabindex\") !== \"-1\",\n );\n\n // Focus first focusable element\n const first = focusables()[0];\n first?.focus();\n\n const listener = (event: KeyboardEvent) => {\n if (event.key !== \"Tab\") return;\n\n const items = focusables();\n if (items.length === 0) return;\n\n const firstItem = items[0];\n const lastItem = items[items.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstItem) {\n event.preventDefault();\n lastItem.focus();\n }\n } else {\n if (document.activeElement === lastItem) {\n event.preventDefault();\n firstItem.focus();\n }\n }\n };\n\n el.addEventListener(\"keydown\", listener);\n\n return () => {\n el.removeEventListener(\"keydown\", listener);\n (restoreTo?.current ?? previouslyFocused)?.focus();\n };\n }, [ref, enabled, restoreTo]);\n}\n"]}
|
package/dist/command.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var chunkNFUKNVB7_cjs = require('./chunk-NFUKNVB7.cjs');
|
|
4
|
+
require('./chunk-RE3PMG47.cjs');
|
|
5
|
+
require('./chunk-UOG3O3KP.cjs');
|
|
5
6
|
require('./chunk-FQZE5N2N.cjs');
|
|
6
7
|
require('./chunk-6V44RRSB.cjs');
|
|
7
8
|
require('./chunk-MKHYENKR.cjs');
|
|
@@ -14,11 +15,11 @@ require('./chunk-ZU5Q77OT.cjs');
|
|
|
14
15
|
|
|
15
16
|
Object.defineProperty(exports, "Command", {
|
|
16
17
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkNFUKNVB7_cjs.Command; }
|
|
18
19
|
});
|
|
19
20
|
Object.defineProperty(exports, "useCommand", {
|
|
20
21
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkNFUKNVB7_cjs.useCommand; }
|
|
22
23
|
});
|
|
23
24
|
//# sourceMappingURL=command.cjs.map
|
|
24
25
|
//# sourceMappingURL=command.cjs.map
|
package/dist/command.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { Command, useCommand } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Command, useCommand } from './chunk-LG2O26CG.js';
|
|
2
|
+
import './chunk-HHCVBIMM.js';
|
|
3
|
+
import './chunk-MUV7OK3W.js';
|
|
3
4
|
import './chunk-3K2CEAI7.js';
|
|
4
5
|
import './chunk-S42OGG43.js';
|
|
5
6
|
import './chunk-5VMILVWD.js';
|
package/dist/drawer.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var chunkTXQT6S4D_cjs = require('./chunk-TXQT6S4D.cjs');
|
|
4
|
+
require('./chunk-RE3PMG47.cjs');
|
|
5
|
+
require('./chunk-UOG3O3KP.cjs');
|
|
5
6
|
require('./chunk-FQZE5N2N.cjs');
|
|
6
7
|
require('./chunk-MKHYENKR.cjs');
|
|
7
8
|
require('./chunk-TI7D4QDM.cjs');
|
|
@@ -12,11 +13,11 @@ require('./chunk-ZU5Q77OT.cjs');
|
|
|
12
13
|
|
|
13
14
|
Object.defineProperty(exports, "Drawer", {
|
|
14
15
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
16
|
+
get: function () { return chunkTXQT6S4D_cjs.Drawer; }
|
|
16
17
|
});
|
|
17
18
|
Object.defineProperty(exports, "useDrawer", {
|
|
18
19
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
20
|
+
get: function () { return chunkTXQT6S4D_cjs.useDrawer; }
|
|
20
21
|
});
|
|
21
22
|
//# sourceMappingURL=drawer.cjs.map
|
|
22
23
|
//# sourceMappingURL=drawer.cjs.map
|
package/dist/drawer.d.cts
CHANGED
|
@@ -55,6 +55,8 @@ interface DrawerHeaderProps {
|
|
|
55
55
|
/** Show the close button. Default `true`. */
|
|
56
56
|
closable?: boolean;
|
|
57
57
|
className?: string;
|
|
58
|
+
/** Accessible name of the close button. Default `"Close"`; pass your locale's word. */
|
|
59
|
+
closeLabel?: string;
|
|
58
60
|
}
|
|
59
61
|
interface DrawerBodyProps {
|
|
60
62
|
children: ReactNode;
|
|
@@ -69,7 +71,12 @@ interface DrawerContainerProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
69
71
|
className?: string;
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The close button draws at 26px (18px icon + `p-1`) and HITS at 44px (WCAG
|
|
76
|
+
* 2.5.5, AAA): a `::before` overhangs it by 9px, inside the header's `py-3`. The
|
|
77
|
+
* look is unchanged; see ModalHeader for why this over a size option.
|
|
78
|
+
*/
|
|
79
|
+
declare function DrawerHeader({ children, closable, className, closeLabel }: DrawerHeaderProps): react.JSX.Element;
|
|
73
80
|
declare namespace DrawerHeader {
|
|
74
81
|
var displayName: string;
|
|
75
82
|
}
|
package/dist/drawer.d.ts
CHANGED
|
@@ -55,6 +55,8 @@ interface DrawerHeaderProps {
|
|
|
55
55
|
/** Show the close button. Default `true`. */
|
|
56
56
|
closable?: boolean;
|
|
57
57
|
className?: string;
|
|
58
|
+
/** Accessible name of the close button. Default `"Close"`; pass your locale's word. */
|
|
59
|
+
closeLabel?: string;
|
|
58
60
|
}
|
|
59
61
|
interface DrawerBodyProps {
|
|
60
62
|
children: ReactNode;
|
|
@@ -69,7 +71,12 @@ interface DrawerContainerProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
69
71
|
className?: string;
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The close button draws at 26px (18px icon + `p-1`) and HITS at 44px (WCAG
|
|
76
|
+
* 2.5.5, AAA): a `::before` overhangs it by 9px, inside the header's `py-3`. The
|
|
77
|
+
* look is unchanged; see ModalHeader for why this over a size option.
|
|
78
|
+
*/
|
|
79
|
+
declare function DrawerHeader({ children, closable, className, closeLabel }: DrawerHeaderProps): react.JSX.Element;
|
|
73
80
|
declare namespace DrawerHeader {
|
|
74
81
|
var displayName: string;
|
|
75
82
|
}
|
package/dist/drawer.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { Drawer, useDrawer } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Drawer, useDrawer } from './chunk-JJYMRV62.js';
|
|
2
|
+
import './chunk-HHCVBIMM.js';
|
|
3
|
+
import './chunk-MUV7OK3W.js';
|
|
3
4
|
import './chunk-3K2CEAI7.js';
|
|
4
5
|
import './chunk-5VMILVWD.js';
|
|
5
6
|
import './chunk-RBCMKPBX.js';
|
package/dist/editor.cjs
CHANGED
|
@@ -5,7 +5,7 @@ require('./chunk-A2JUTNE6.cjs');
|
|
|
5
5
|
require('./chunk-T6YELZPJ.cjs');
|
|
6
6
|
require('./chunk-VQJ5LJJH.cjs');
|
|
7
7
|
require('./chunk-4GOOSZEK.cjs');
|
|
8
|
-
require('./chunk-
|
|
8
|
+
require('./chunk-UOG3O3KP.cjs');
|
|
9
9
|
require('./chunk-FQZE5N2N.cjs');
|
|
10
10
|
require('./chunk-AIA5UNQ5.cjs');
|
|
11
11
|
require('./chunk-U4KUW3RK.cjs');
|
package/dist/editor.js
CHANGED
|
@@ -3,7 +3,7 @@ import './chunk-2BXMMVQS.js';
|
|
|
3
3
|
import './chunk-CPY7NHXM.js';
|
|
4
4
|
import './chunk-RP43ZFZP.js';
|
|
5
5
|
import './chunk-ZQ3VXRUY.js';
|
|
6
|
-
import './chunk-
|
|
6
|
+
import './chunk-MUV7OK3W.js';
|
|
7
7
|
import './chunk-3K2CEAI7.js';
|
|
8
8
|
import './chunk-TJ66S5K6.js';
|
|
9
9
|
import './chunk-ZL5QVNKG.js';
|
package/dist/index.cjs
CHANGED
|
@@ -51,7 +51,7 @@ var chunkTH7VP4CL_cjs = require('./chunk-TH7VP4CL.cjs');
|
|
|
51
51
|
var chunkHYU46SOE_cjs = require('./chunk-HYU46SOE.cjs');
|
|
52
52
|
var chunk5NTFXQ4K_cjs = require('./chunk-5NTFXQ4K.cjs');
|
|
53
53
|
var chunk3BBEVHSP_cjs = require('./chunk-3BBEVHSP.cjs');
|
|
54
|
-
var
|
|
54
|
+
var chunkGB2EGMVQ_cjs = require('./chunk-GB2EGMVQ.cjs');
|
|
55
55
|
var chunkCG3RCQVL_cjs = require('./chunk-CG3RCQVL.cjs');
|
|
56
56
|
var chunkGISORLGW_cjs = require('./chunk-GISORLGW.cjs');
|
|
57
57
|
require('./chunk-FJKZ5NOA.cjs');
|
|
@@ -78,21 +78,22 @@ var chunkXQF4HCOV_cjs = require('./chunk-XQF4HCOV.cjs');
|
|
|
78
78
|
var chunkNIFHAFKK_cjs = require('./chunk-NIFHAFKK.cjs');
|
|
79
79
|
var chunkWVSHAJKI_cjs = require('./chunk-WVSHAJKI.cjs');
|
|
80
80
|
var chunkOOZCJLEF_cjs = require('./chunk-OOZCJLEF.cjs');
|
|
81
|
-
var
|
|
81
|
+
var chunkNFUKNVB7_cjs = require('./chunk-NFUKNVB7.cjs');
|
|
82
82
|
var chunkZFXCZ2QO_cjs = require('./chunk-ZFXCZ2QO.cjs');
|
|
83
83
|
require('./chunk-JKD6CFIP.cjs');
|
|
84
84
|
var chunkTBLKVTJC_cjs = require('./chunk-TBLKVTJC.cjs');
|
|
85
85
|
var chunkMAY4NMRI_cjs = require('./chunk-MAY4NMRI.cjs');
|
|
86
86
|
var chunkFQSSVOVQ_cjs = require('./chunk-FQSSVOVQ.cjs');
|
|
87
87
|
var chunkQU6HZH6V_cjs = require('./chunk-QU6HZH6V.cjs');
|
|
88
|
-
var
|
|
88
|
+
var chunkTXQT6S4D_cjs = require('./chunk-TXQT6S4D.cjs');
|
|
89
|
+
require('./chunk-RE3PMG47.cjs');
|
|
89
90
|
var chunkHEGM5LMZ_cjs = require('./chunk-HEGM5LMZ.cjs');
|
|
90
91
|
var chunkGE6TSA3M_cjs = require('./chunk-GE6TSA3M.cjs');
|
|
91
92
|
var chunkA2JUTNE6_cjs = require('./chunk-A2JUTNE6.cjs');
|
|
92
93
|
var chunkT6YELZPJ_cjs = require('./chunk-T6YELZPJ.cjs');
|
|
93
94
|
var chunkVQJ5LJJH_cjs = require('./chunk-VQJ5LJJH.cjs');
|
|
94
95
|
var chunk4GOOSZEK_cjs = require('./chunk-4GOOSZEK.cjs');
|
|
95
|
-
var
|
|
96
|
+
var chunkUOG3O3KP_cjs = require('./chunk-UOG3O3KP.cjs');
|
|
96
97
|
var chunkFQZE5N2N_cjs = require('./chunk-FQZE5N2N.cjs');
|
|
97
98
|
var chunk7PK3OUKR_cjs = require('./chunk-7PK3OUKR.cjs');
|
|
98
99
|
var chunkTTZJ2KXK_cjs = require('./chunk-TTZJ2KXK.cjs');
|
|
@@ -492,11 +493,11 @@ Object.defineProperty(exports, "useMobileMenu", {
|
|
|
492
493
|
});
|
|
493
494
|
Object.defineProperty(exports, "Modal", {
|
|
494
495
|
enumerable: true,
|
|
495
|
-
get: function () { return
|
|
496
|
+
get: function () { return chunkGB2EGMVQ_cjs.Modal; }
|
|
496
497
|
});
|
|
497
498
|
Object.defineProperty(exports, "useModal", {
|
|
498
499
|
enumerable: true,
|
|
499
|
-
get: function () { return
|
|
500
|
+
get: function () { return chunkGB2EGMVQ_cjs.useModal; }
|
|
500
501
|
});
|
|
501
502
|
Object.defineProperty(exports, "MoodMeter", {
|
|
502
503
|
enumerable: true,
|
|
@@ -676,11 +677,11 @@ Object.defineProperty(exports, "Grid", {
|
|
|
676
677
|
});
|
|
677
678
|
Object.defineProperty(exports, "Command", {
|
|
678
679
|
enumerable: true,
|
|
679
|
-
get: function () { return
|
|
680
|
+
get: function () { return chunkNFUKNVB7_cjs.Command; }
|
|
680
681
|
});
|
|
681
682
|
Object.defineProperty(exports, "useCommand", {
|
|
682
683
|
enumerable: true,
|
|
683
|
-
get: function () { return
|
|
684
|
+
get: function () { return chunkNFUKNVB7_cjs.useCommand; }
|
|
684
685
|
});
|
|
685
686
|
Object.defineProperty(exports, "Composer", {
|
|
686
687
|
enumerable: true,
|
|
@@ -728,11 +729,11 @@ Object.defineProperty(exports, "useContextMenu", {
|
|
|
728
729
|
});
|
|
729
730
|
Object.defineProperty(exports, "Drawer", {
|
|
730
731
|
enumerable: true,
|
|
731
|
-
get: function () { return
|
|
732
|
+
get: function () { return chunkTXQT6S4D_cjs.Drawer; }
|
|
732
733
|
});
|
|
733
734
|
Object.defineProperty(exports, "useDrawer", {
|
|
734
735
|
enumerable: true,
|
|
735
|
-
get: function () { return
|
|
736
|
+
get: function () { return chunkTXQT6S4D_cjs.useDrawer; }
|
|
736
737
|
});
|
|
737
738
|
Object.defineProperty(exports, "Dropdown", {
|
|
738
739
|
enumerable: true,
|
|
@@ -812,7 +813,7 @@ Object.defineProperty(exports, "useFullScreen", {
|
|
|
812
813
|
});
|
|
813
814
|
Object.defineProperty(exports, "useFocusTrap", {
|
|
814
815
|
enumerable: true,
|
|
815
|
-
get: function () { return
|
|
816
|
+
get: function () { return chunkUOG3O3KP_cjs.useFocusTrap; }
|
|
816
817
|
});
|
|
817
818
|
Object.defineProperty(exports, "useAnimation", {
|
|
818
819
|
enumerable: true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme-tokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/theme-tokens.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Semantic theme tokens — the small set of colours the kit's DOM components\n * read, so a host can repaint the whole kit with its own palette WITHOUT\n * remapping Tailwind's `zinc` or `violet`.\n *\n * Each role is two CSS custom properties, one per mode:\n *\n * --fancy-surface the light value\n * --fancy-surface-dark the dark value\n *\n * Components read them through their var() FALLBACK, which is the colour the\n * component used before these existed:\n *\n * bg-[color:var(--fancy-surface,var(--color-white))]\n * dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\n *\n * So:\n * - **Set nothing and nothing changes.** An unset custom property resolves to\n * its fallback, which is the exact declaration the old `bg-white` produced.\n * - **Set one and every surface follows**, wherever the variable is in scope:\n * `:root`, `body`, or any wrapper element. No selector to match, no layer or\n * specificity to win — a custom property is inherited, not cascaded against.\n * - **Both modes are stated, not derived.** The dark value is a separate\n * variable rather than a flip under `.dark`, so which one applies is decided\n * by the host's own `dark:` variant — the same switch that drives every\n * other `dark:` utility in the kit. (See `dark-variant.css` for a variant\n * that follows `[data-theme=\"dark\"]` as well as `.dark`.)\n *\n * NOT covered, deliberately: colours that ENCODE DATA — chart series,\n * file-type marks, mood and confidence scales, event kinds. Repainting those\n * with a host's neutral palette would erase what they mean. A component's\n * explicit `color` prop (Badge, Button, Callout …) is also untouched: that is\n * the host choosing a hue, not the kit choosing one for it.\n *\n * `light` / `dark` are the defaults exactly as components write them in their\n * fallbacks. `tests/theme-tokens.test.tsx` fails if a component's fallback\n * disagrees with this table, so the table is the contract rather than a\n * description of it.\n */\nexport const THEME_TOKENS = {\n surface: {\n variable: \"--fancy-surface\",\n darkVariable: \"--fancy-surface-dark\",\n light: \"var(--color-white)\",\n dark: \"var(--color-zinc-900)\",\n description: \"Panels, cards, overlays (menus, modals, popovers, toasts), sidebars and navbars.\",\n },\n \"surface-muted\": {\n variable: \"--fancy-surface-muted\",\n darkVariable: \"--fancy-surface-muted-dark\",\n light: \"var(--color-zinc-100)\",\n dark: \"var(--color-zinc-800)\",\n description: \"Hovered and selected rows, chips, inset wells, toolbar buttons.\",\n },\n border: {\n variable: \"--fancy-border\",\n darkVariable: \"--fancy-border-dark\",\n light: \"var(--color-zinc-200)\",\n dark: \"var(--color-zinc-700)\",\n description: \"Outlines, dividers, separators and tracks (skeletons, progress, sliders).\",\n },\n \"border-strong\": {\n variable: \"--fancy-border-strong\",\n darkVariable: \"--fancy-border-strong-dark\",\n light: \"var(--color-zinc-300)\",\n dark: \"var(--color-zinc-700)\",\n description: \"The firmer outline on form controls (inputs, checkboxes, radios) and keycaps.\",\n },\n input: {\n variable: \"--fancy-input\",\n darkVariable: \"--fancy-input-dark\",\n light: \"var(--color-white)\",\n dark: \"#1e1e24\",\n description: \"The field surface of text inputs, checkboxes, radios, OTP cells and pickers.\",\n },\n text: {\n variable: \"--fancy-text\",\n darkVariable: \"--fancy-text-dark\",\n light: \"var(--color-zinc-900)\",\n dark: \"var(--color-zinc-100)\",\n description: \"Strongest foreground: headings, values, field text, active items.\",\n },\n \"text-soft\": {\n variable: \"--fancy-text-soft\",\n darkVariable: \"--fancy-text-soft-dark\",\n light: \"var(--color-zinc-700)\",\n dark: \"var(--color-zinc-300)\",\n description: \"Body copy and menu items: readable, one step back from text.\",\n },\n \"text-muted\": {\n variable: \"--fancy-text-muted\",\n darkVariable: \"--fancy-text-muted-dark\",\n light: \"var(--color-zinc-500)\",\n dark: \"var(--color-zinc-400)\",\n description: \"Descriptions, captions, secondary labels, axis labels.\",\n },\n \"text-faint\": {\n variable: \"--fancy-text-faint\",\n darkVariable: \"--fancy-text-faint-dark\",\n light: \"var(--color-zinc-400)\",\n dark: \"var(--color-zinc-500)\",\n description: \"Placeholders, disabled hints, decorative icons.\",\n },\n \"text-subtle\": {\n variable: \"--fancy-text-subtle\",\n darkVariable: \"--fancy-text-subtle-dark\",\n light: \"var(--color-zinc-600)\",\n dark: \"var(--color-zinc-400)\",\n description: \"Inactive nav labels (Sidebar, Menu, Navbar, MultiSwitch) and secondary prose. Added 5.53.1.\",\n },\n \"surface-hover\": {\n variable: \"--fancy-surface-hover\",\n darkVariable: \"--fancy-surface-hover-dark\",\n light: \"var(--color-zinc-50)\",\n // Tailwind's `bg-zinc-800/50`, written out so a host's value is used as-is.\n dark: \"color-mix(in oklab, var(--color-zinc-800) 50%, transparent)\",\n description: \"The hover fill on nav items, list options and table rows. Added 5.53.1.\",\n },\n focus: {\n variable: \"--fancy-focus\",\n darkVariable: \"--fancy-focus-dark\",\n light: \"var(--color-blue-500)\",\n dark: \"var(--color-blue-400)\",\n description: \"The focus border and ring on form controls.\",\n },\n} as const;\n\nexport type ThemeTokenRole = keyof typeof THEME_TOKENS;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -257,7 +257,18 @@ declare function useControllableState<T>(controlledValue: T | undefined, default
|
|
|
257
257
|
|
|
258
258
|
declare function useOutsideClick(ref: RefObject<HTMLElement | null>, handler: (event: MouseEvent | TouchEvent) => void, enabled?: boolean, ignoreRef?: RefObject<HTMLElement | null>): void;
|
|
259
259
|
|
|
260
|
-
|
|
260
|
+
/**
|
|
261
|
+
* Moves focus into `ref`, keeps Tab inside it, and restores focus on disable.
|
|
262
|
+
*
|
|
263
|
+
* `ref.current` must already be set in the commit where `enabled` turns true:
|
|
264
|
+
* the effect does not run again until `enabled` changes. A panel that mounts
|
|
265
|
+
* later (an animation, a Portal) should key `enabled` on the node — see
|
|
266
|
+
* `useDialogFocusTrap`.
|
|
267
|
+
*
|
|
268
|
+
* `restoreTo`, when it holds an element, is where focus returns on disable
|
|
269
|
+
* instead of whatever was focused when the trap engaged.
|
|
270
|
+
*/
|
|
271
|
+
declare function useFocusTrap(ref: RefObject<HTMLElement | null>, enabled?: boolean, restoreTo?: RefObject<HTMLElement | null>): void;
|
|
261
272
|
|
|
262
273
|
/**
|
|
263
274
|
* Writing direction, read from the DOM rather than passed as a prop.
|
package/dist/index.d.ts
CHANGED
|
@@ -257,7 +257,18 @@ declare function useControllableState<T>(controlledValue: T | undefined, default
|
|
|
257
257
|
|
|
258
258
|
declare function useOutsideClick(ref: RefObject<HTMLElement | null>, handler: (event: MouseEvent | TouchEvent) => void, enabled?: boolean, ignoreRef?: RefObject<HTMLElement | null>): void;
|
|
259
259
|
|
|
260
|
-
|
|
260
|
+
/**
|
|
261
|
+
* Moves focus into `ref`, keeps Tab inside it, and restores focus on disable.
|
|
262
|
+
*
|
|
263
|
+
* `ref.current` must already be set in the commit where `enabled` turns true:
|
|
264
|
+
* the effect does not run again until `enabled` changes. A panel that mounts
|
|
265
|
+
* later (an animation, a Portal) should key `enabled` on the node — see
|
|
266
|
+
* `useDialogFocusTrap`.
|
|
267
|
+
*
|
|
268
|
+
* `restoreTo`, when it holds an element, is where focus returns on disable
|
|
269
|
+
* instead of whatever was focused when the trap engaged.
|
|
270
|
+
*/
|
|
271
|
+
declare function useFocusTrap(ref: RefObject<HTMLElement | null>, enabled?: boolean, restoreTo?: RefObject<HTMLElement | null>): void;
|
|
261
272
|
|
|
262
273
|
/**
|
|
263
274
|
* Writing direction, read from the DOM rather than passed as a prop.
|
package/dist/index.js
CHANGED
|
@@ -49,7 +49,7 @@ export { VideoViewer } from './chunk-VOGI7GX3.js';
|
|
|
49
49
|
export { PdfViewer } from './chunk-UZZJJ3HJ.js';
|
|
50
50
|
export { Menu, useMenu } from './chunk-V64XIPYG.js';
|
|
51
51
|
export { MobileMenu, useMobileMenu } from './chunk-AE6ICNJR.js';
|
|
52
|
-
export { Modal, useModal } from './chunk-
|
|
52
|
+
export { Modal, useModal } from './chunk-26GRLVCQ.js';
|
|
53
53
|
export { MoodMeter } from './chunk-K6Q542VL.js';
|
|
54
54
|
export { Navbar, useNavbar } from './chunk-TKGMH5PA.js';
|
|
55
55
|
import './chunk-CFH6CJQG.js';
|
|
@@ -76,21 +76,22 @@ export { FileBrowser, FileBrowserNewFolder, useFileBrowser, validateFolderName }
|
|
|
76
76
|
export { FileUpload, useFileUpload } from './chunk-ZHTK4IPQ.js';
|
|
77
77
|
export { FullScreen } from './chunk-GZ5Z56QK.js';
|
|
78
78
|
export { Grid } from './chunk-TM3RTWKI.js';
|
|
79
|
-
export { Command, useCommand } from './chunk-
|
|
79
|
+
export { Command, useCommand } from './chunk-LG2O26CG.js';
|
|
80
80
|
export { Composer } from './chunk-J57JSHDC.js';
|
|
81
81
|
import './chunk-J6IQHJET.js';
|
|
82
82
|
export { InlinePasteEditor, PastedFilesInput, pasteMarker, useInlinePaste, usePastePills } from './chunk-FECD3WKN.js';
|
|
83
83
|
export { Popover, usePopover } from './chunk-FNHKZMMI.js';
|
|
84
84
|
export { Container } from './chunk-VKMPVFQK.js';
|
|
85
85
|
export { ContextMenu, useContextMenu } from './chunk-BPTCMI3E.js';
|
|
86
|
-
export { Drawer, useDrawer } from './chunk-
|
|
86
|
+
export { Drawer, useDrawer } from './chunk-JJYMRV62.js';
|
|
87
|
+
import './chunk-HHCVBIMM.js';
|
|
87
88
|
export { Dropdown, useDropdown } from './chunk-H5LJFN7D.js';
|
|
88
89
|
export { Editor, useEditor } from './chunk-PIYQPXLT.js';
|
|
89
90
|
export { THEME_STORAGE_KEY, getThemePreference, initTheme, resolveTheme, setThemePreference, subscribeTheme, useId, useNodeRegistry, useTheme } from './chunk-2BXMMVQS.js';
|
|
90
91
|
export { usePanZoom } from './chunk-CPY7NHXM.js';
|
|
91
92
|
export { FullScreenContext, FullScreenProvider, FullScreenToggle, useFullScreenContext } from './chunk-RP43ZFZP.js';
|
|
92
93
|
export { useFullScreen } from './chunk-ZQ3VXRUY.js';
|
|
93
|
-
export { useFocusTrap } from './chunk-
|
|
94
|
+
export { useFocusTrap } from './chunk-MUV7OK3W.js';
|
|
94
95
|
export { useAnimation } from './chunk-3K2CEAI7.js';
|
|
95
96
|
export { Card } from './chunk-4L3MGQAR.js';
|
|
96
97
|
export { Heading } from './chunk-QPM4CZ4G.js';
|