sherick-ui 2.8.0 → 2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/cjs/components/Accordion.cjs +14 -26
- package/dist/cjs/components/Accordion.cjs.map +1 -1
- package/dist/cjs/components/Alert.cjs +64 -19
- package/dist/cjs/components/Alert.cjs.map +1 -1
- package/dist/cjs/components/AlertDialog.cjs +5 -3
- package/dist/cjs/components/AlertDialog.cjs.map +1 -1
- package/dist/cjs/components/Avatar.cjs +12 -3
- package/dist/cjs/components/Avatar.cjs.map +1 -1
- package/dist/cjs/components/Badge.cjs +5 -3
- package/dist/cjs/components/Badge.cjs.map +1 -1
- package/dist/cjs/components/Breadcrumb.cjs +8 -4
- package/dist/cjs/components/Breadcrumb.cjs.map +1 -1
- package/dist/cjs/components/Button.cjs +11 -4
- package/dist/cjs/components/Button.cjs.map +1 -1
- package/dist/cjs/components/Calendar.cjs +39 -4
- package/dist/cjs/components/Calendar.cjs.map +1 -1
- package/dist/cjs/components/Card.cjs +16 -4
- package/dist/cjs/components/Card.cjs.map +1 -1
- package/dist/cjs/components/Checkbox.cjs +15 -3
- package/dist/cjs/components/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/CheckboxGroup.cjs +3 -2
- package/dist/cjs/components/CheckboxGroup.cjs.map +1 -1
- package/dist/cjs/components/Chip.cjs +53 -43
- package/dist/cjs/components/Chip.cjs.map +1 -1
- package/dist/cjs/components/ChipGroup.cjs +17 -0
- package/dist/cjs/components/ChipGroup.cjs.map +1 -1
- package/dist/cjs/components/Collapsible.cjs +1 -1
- package/dist/cjs/components/Collapsible.cjs.map +1 -1
- package/dist/cjs/components/Combobox.cjs +59 -15
- package/dist/cjs/components/Combobox.cjs.map +1 -1
- package/dist/cjs/components/Command.cjs +11 -5
- package/dist/cjs/components/Command.cjs.map +1 -1
- package/dist/cjs/components/CommandPalette.cjs +5 -2
- package/dist/cjs/components/CommandPalette.cjs.map +1 -1
- package/dist/cjs/components/DatePicker.cjs +6 -3
- package/dist/cjs/components/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/DateRangePicker.cjs +3 -2
- package/dist/cjs/components/DateRangePicker.cjs.map +1 -1
- package/dist/cjs/components/DateTimePicker.cjs +1 -1
- package/dist/cjs/components/DateTimePicker.cjs.map +1 -1
- package/dist/cjs/components/Dialog.cjs +10 -3
- package/dist/cjs/components/Dialog.cjs.map +1 -1
- package/dist/cjs/components/DialogContent.cjs +5 -3
- package/dist/cjs/components/DialogContent.cjs.map +1 -1
- package/dist/cjs/components/DialogDescription.cjs +5 -3
- package/dist/cjs/components/DialogDescription.cjs.map +1 -1
- package/dist/cjs/components/DialogFooter.cjs +3 -3
- package/dist/cjs/components/DialogFooter.cjs.map +1 -1
- package/dist/cjs/components/DialogHeader.cjs +5 -3
- package/dist/cjs/components/DialogHeader.cjs.map +1 -1
- package/dist/cjs/components/DialogSurface.cjs +37 -15
- package/dist/cjs/components/DialogSurface.cjs.map +1 -1
- package/dist/cjs/components/DismissButton.cjs +24 -0
- package/dist/cjs/components/DismissButton.cjs.map +1 -0
- package/dist/cjs/components/Divider.cjs +3 -1
- package/dist/cjs/components/Divider.cjs.map +1 -1
- package/dist/cjs/components/Drawer.cjs +28 -15
- package/dist/cjs/components/Drawer.cjs.map +1 -1
- package/dist/cjs/components/Field.cjs +47 -2
- package/dist/cjs/components/Field.cjs.map +1 -1
- package/dist/cjs/components/FieldLabel.cjs +20 -0
- package/dist/cjs/components/FieldLabel.cjs.map +1 -0
- package/dist/cjs/components/FileUpload.cjs +19 -9
- package/dist/cjs/components/FileUpload.cjs.map +1 -1
- package/dist/cjs/components/IconButton.cjs +28 -3
- package/dist/cjs/components/IconButton.cjs.map +1 -1
- package/dist/cjs/components/Input.cjs +14 -5
- package/dist/cjs/components/Input.cjs.map +1 -1
- package/dist/cjs/components/Menu.cjs +18 -4
- package/dist/cjs/components/Menu.cjs.map +1 -1
- package/dist/cjs/components/NavGroup.cjs +7 -1
- package/dist/cjs/components/NavGroup.cjs.map +1 -1
- package/dist/cjs/components/NavItem.cjs +28 -3
- package/dist/cjs/components/NavItem.cjs.map +1 -1
- package/dist/cjs/components/NumberField.cjs +7 -6
- package/dist/cjs/components/NumberField.cjs.map +1 -1
- package/dist/cjs/components/Pagination.cjs +45 -10
- package/dist/cjs/components/Pagination.cjs.map +1 -1
- package/dist/cjs/components/Popover.cjs +17 -3
- package/dist/cjs/components/Popover.cjs.map +1 -1
- package/dist/cjs/components/Progress.cjs +5 -3
- package/dist/cjs/components/Progress.cjs.map +1 -1
- package/dist/cjs/components/RadioGroup.cjs +3 -2
- package/dist/cjs/components/RadioGroup.cjs.map +1 -1
- package/dist/cjs/components/Search.cjs +35 -14
- package/dist/cjs/components/Search.cjs.map +1 -1
- package/dist/cjs/components/SegmentedControl.cjs +2 -1
- package/dist/cjs/components/SegmentedControl.cjs.map +1 -1
- package/dist/cjs/components/Select.cjs +14 -4
- package/dist/cjs/components/Select.cjs.map +1 -1
- package/dist/cjs/components/Skeleton.cjs +5 -3
- package/dist/cjs/components/Skeleton.cjs.map +1 -1
- package/dist/cjs/components/Slider.cjs +1 -1
- package/dist/cjs/components/Slider.cjs.map +1 -1
- package/dist/cjs/components/Spinner.cjs +25 -14
- package/dist/cjs/components/Spinner.cjs.map +1 -1
- package/dist/cjs/components/StatusMark.cjs +43 -0
- package/dist/cjs/components/StatusMark.cjs.map +1 -0
- package/dist/cjs/components/Stepper.cjs +9 -6
- package/dist/cjs/components/Stepper.cjs.map +1 -1
- package/dist/cjs/components/Switch.cjs +20 -1
- package/dist/cjs/components/Switch.cjs.map +1 -1
- package/dist/cjs/components/Table.cjs +15 -7
- package/dist/cjs/components/Table.cjs.map +1 -1
- package/dist/cjs/components/Tabs.cjs +10 -3
- package/dist/cjs/components/Tabs.cjs.map +1 -1
- package/dist/cjs/components/Textarea.cjs +8 -4
- package/dist/cjs/components/Textarea.cjs.map +1 -1
- package/dist/cjs/components/Toast.cjs +47 -34
- package/dist/cjs/components/Toast.cjs.map +1 -1
- package/dist/cjs/components/ToggleGroup.cjs +14 -3
- package/dist/cjs/components/ToggleGroup.cjs.map +1 -1
- package/dist/cjs/components/Tooltip.cjs +16 -2
- package/dist/cjs/components/Tooltip.cjs.map +1 -1
- package/dist/cjs/components/TreeView.cjs +8 -4
- package/dist/cjs/components/TreeView.cjs.map +1 -1
- package/dist/cjs/components/choice-row.cjs +1 -1
- package/dist/cjs/components/choice-row.cjs.map +1 -1
- package/dist/cjs/components/date-family.cjs +16 -2
- package/dist/cjs/components/date-family.cjs.map +1 -1
- package/dist/cjs/components/date-field.cjs +5 -3
- package/dist/cjs/components/date-field.cjs.map +1 -1
- package/dist/cjs/components/edge-fade.cjs +80 -0
- package/dist/cjs/components/edge-fade.cjs.map +1 -0
- package/dist/cjs/components/scroll-region.cjs +56 -0
- package/dist/cjs/components/scroll-region.cjs.map +1 -0
- package/dist/cjs/components/time-panel.cjs +2 -2
- package/dist/cjs/components/time-panel.cjs.map +1 -1
- package/dist/cjs/components/ui.common.cjs +179 -71
- package/dist/cjs/components/ui.common.cjs.map +1 -1
- package/dist/cjs/components/ui.motion.cjs +46 -15
- package/dist/cjs/components/ui.motion.cjs.map +1 -1
- package/dist/cjs/dev.cjs +9 -0
- package/dist/cjs/dev.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/components/Accordion.js +16 -28
- package/dist/esm/components/Accordion.js.map +1 -1
- package/dist/esm/components/Alert.js +66 -22
- package/dist/esm/components/Alert.js.map +1 -1
- package/dist/esm/components/AlertDialog.js +6 -4
- package/dist/esm/components/AlertDialog.js.map +1 -1
- package/dist/esm/components/Avatar.js +14 -5
- package/dist/esm/components/Avatar.js.map +1 -1
- package/dist/esm/components/Badge.js +6 -4
- package/dist/esm/components/Badge.js.map +1 -1
- package/dist/esm/components/Breadcrumb.js +9 -5
- package/dist/esm/components/Breadcrumb.js.map +1 -1
- package/dist/esm/components/Button.js +11 -4
- package/dist/esm/components/Button.js.map +1 -1
- package/dist/esm/components/Calendar.js +43 -8
- package/dist/esm/components/Calendar.js.map +1 -1
- package/dist/esm/components/Card.js +17 -5
- package/dist/esm/components/Card.js.map +1 -1
- package/dist/esm/components/Checkbox.js +17 -5
- package/dist/esm/components/Checkbox.js.map +1 -1
- package/dist/esm/components/CheckboxGroup.js +4 -3
- package/dist/esm/components/CheckboxGroup.js.map +1 -1
- package/dist/esm/components/Chip.js +56 -46
- package/dist/esm/components/Chip.js.map +1 -1
- package/dist/esm/components/ChipGroup.js +18 -1
- package/dist/esm/components/ChipGroup.js.map +1 -1
- package/dist/esm/components/CodeBlock.js +58 -28
- package/dist/esm/components/CodeBlock.js.map +1 -1
- package/dist/esm/components/Collapsible.js +2 -2
- package/dist/esm/components/Collapsible.js.map +1 -1
- package/dist/esm/components/Combobox.js +63 -19
- package/dist/esm/components/Combobox.js.map +1 -1
- package/dist/esm/components/Command.js +12 -6
- package/dist/esm/components/Command.js.map +1 -1
- package/dist/esm/components/CommandPalette.js +7 -4
- package/dist/esm/components/CommandPalette.js.map +1 -1
- package/dist/esm/components/DatePicker.js +7 -4
- package/dist/esm/components/DatePicker.js.map +1 -1
- package/dist/esm/components/DateRangePicker.js +4 -3
- package/dist/esm/components/DateRangePicker.js.map +1 -1
- package/dist/esm/components/DateTimePicker.js +2 -2
- package/dist/esm/components/DateTimePicker.js.map +1 -1
- package/dist/esm/components/Dialog.js +12 -6
- package/dist/esm/components/Dialog.js.map +1 -1
- package/dist/esm/components/DialogContent.js +6 -4
- package/dist/esm/components/DialogContent.js.map +1 -1
- package/dist/esm/components/DialogDescription.js +6 -4
- package/dist/esm/components/DialogDescription.js.map +1 -1
- package/dist/esm/components/DialogFooter.js +3 -3
- package/dist/esm/components/DialogFooter.js.map +1 -1
- package/dist/esm/components/DialogHeader.js +5 -3
- package/dist/esm/components/DialogHeader.js.map +1 -1
- package/dist/esm/components/DialogSurface.js +38 -17
- package/dist/esm/components/DialogSurface.js.map +1 -1
- package/dist/esm/components/DismissButton.js +20 -0
- package/dist/esm/components/DismissButton.js.map +1 -0
- package/dist/esm/components/Divider.js +3 -1
- package/dist/esm/components/Divider.js.map +1 -1
- package/dist/esm/components/Drawer.js +31 -18
- package/dist/esm/components/Drawer.js.map +1 -1
- package/dist/esm/components/Field.js +49 -6
- package/dist/esm/components/Field.js.map +1 -1
- package/dist/esm/components/FieldLabel.js +15 -0
- package/dist/esm/components/FieldLabel.js.map +1 -0
- package/dist/esm/components/FileUpload.js +23 -13
- package/dist/esm/components/FileUpload.js.map +1 -1
- package/dist/esm/components/IconButton.js +31 -6
- package/dist/esm/components/IconButton.js.map +1 -1
- package/dist/esm/components/Input.js +15 -6
- package/dist/esm/components/Input.js.map +1 -1
- package/dist/esm/components/Markdown.js +10 -7
- package/dist/esm/components/Markdown.js.map +1 -1
- package/dist/esm/components/Menu.js +20 -6
- package/dist/esm/components/Menu.js.map +1 -1
- package/dist/esm/components/NavGroup.js +9 -3
- package/dist/esm/components/NavGroup.js.map +1 -1
- package/dist/esm/components/NavItem.js +30 -6
- package/dist/esm/components/NavItem.js.map +1 -1
- package/dist/esm/components/NumberField.js +8 -7
- package/dist/esm/components/NumberField.js.map +1 -1
- package/dist/esm/components/Pagination.js +47 -12
- package/dist/esm/components/Pagination.js.map +1 -1
- package/dist/esm/components/Popover.js +18 -4
- package/dist/esm/components/Popover.js.map +1 -1
- package/dist/esm/components/Progress.js +6 -4
- package/dist/esm/components/Progress.js.map +1 -1
- package/dist/esm/components/RadioGroup.js +4 -3
- package/dist/esm/components/RadioGroup.js.map +1 -1
- package/dist/esm/components/Search.js +36 -15
- package/dist/esm/components/Search.js.map +1 -1
- package/dist/esm/components/SegmentedControl.js +2 -1
- package/dist/esm/components/SegmentedControl.js.map +1 -1
- package/dist/esm/components/Select.js +16 -6
- package/dist/esm/components/Select.js.map +1 -1
- package/dist/esm/components/Skeleton.js +5 -3
- package/dist/esm/components/Skeleton.js.map +1 -1
- package/dist/esm/components/Slider.js +2 -2
- package/dist/esm/components/Slider.js.map +1 -1
- package/dist/esm/components/Spinner.js +25 -14
- package/dist/esm/components/Spinner.js.map +1 -1
- package/dist/esm/components/StatusMark.js +38 -0
- package/dist/esm/components/StatusMark.js.map +1 -0
- package/dist/esm/components/Stepper.js +10 -7
- package/dist/esm/components/Stepper.js.map +1 -1
- package/dist/esm/components/Switch.js +21 -2
- package/dist/esm/components/Switch.js.map +1 -1
- package/dist/esm/components/Table.js +16 -8
- package/dist/esm/components/Table.js.map +1 -1
- package/dist/esm/components/Tabs.js +11 -4
- package/dist/esm/components/Tabs.js.map +1 -1
- package/dist/esm/components/Textarea.js +9 -5
- package/dist/esm/components/Textarea.js.map +1 -1
- package/dist/esm/components/Toast.js +49 -36
- package/dist/esm/components/Toast.js.map +1 -1
- package/dist/esm/components/ToggleGroup.js +16 -5
- package/dist/esm/components/ToggleGroup.js.map +1 -1
- package/dist/esm/components/Tooltip.js +17 -4
- package/dist/esm/components/Tooltip.js.map +1 -1
- package/dist/esm/components/TreeView.js +9 -5
- package/dist/esm/components/TreeView.js.map +1 -1
- package/dist/esm/components/choice-row.js +1 -1
- package/dist/esm/components/choice-row.js.map +1 -1
- package/dist/esm/components/date-family.js +15 -3
- package/dist/esm/components/date-family.js.map +1 -1
- package/dist/esm/components/date-field.js +6 -4
- package/dist/esm/components/date-field.js.map +1 -1
- package/dist/esm/components/edge-fade.js +77 -0
- package/dist/esm/components/edge-fade.js.map +1 -0
- package/dist/esm/components/scroll-region.js +52 -0
- package/dist/esm/components/scroll-region.js.map +1 -0
- package/dist/esm/components/time-panel.js +2 -2
- package/dist/esm/components/time-panel.js.map +1 -1
- package/dist/esm/components/ui.common.js +175 -73
- package/dist/esm/components/ui.common.js.map +1 -1
- package/dist/esm/components/ui.motion.js +44 -16
- package/dist/esm/components/ui.motion.js.map +1 -1
- package/dist/esm/content.js +1 -1
- package/dist/esm/dev.js +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/styles.css +341 -209
- package/dist/theme.css +15 -12
- package/dist/types/content.d.ts +13 -3
- package/dist/types/dev.d.cts +79 -29
- package/dist/types/dev.d.ts +79 -29
- package/dist/types/index.d.cts +512 -154
- package/dist/types/index.d.ts +512 -154
- package/package.json +1 -1
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import { Button } from '@base-ui/react/button';
|
|
4
3
|
import { useState, useRef, useEffect } from 'react';
|
|
5
4
|
import { HugeiconsIcon } from '@hugeicons/react';
|
|
6
|
-
import {
|
|
5
|
+
import { Copy01Icon, Tick02Icon } from '@hugeicons/core-free-icons';
|
|
7
6
|
import { Highlight } from 'prism-react-renderer';
|
|
8
7
|
import Prism from 'prismjs';
|
|
9
8
|
import 'prismjs/components/prism-jsx.js';
|
|
@@ -24,15 +23,21 @@ import 'prismjs/components/prism-python.js';
|
|
|
24
23
|
import 'prismjs/components/prism-sql.js';
|
|
25
24
|
import 'prismjs/components/prism-yaml.js';
|
|
26
25
|
import { cn } from '../libs/utils.js';
|
|
27
|
-
import
|
|
28
|
-
import
|
|
26
|
+
import Button from './Button.js';
|
|
27
|
+
import ScrollRegion from './scroll-region.js';
|
|
28
|
+
import { iconStroke, iconSlot, text, type, tone, state, codeWell, edge, recessedTop, material, shape } from './ui.common.js';
|
|
29
|
+
import { motionArrive } from './ui.motion.js';
|
|
29
30
|
import theme from './prism-theme.js';
|
|
30
31
|
|
|
31
32
|
// React owns the markup. Prism's automatic document scan otherwise rewrites it
|
|
32
33
|
// before hydration (and also highlights unrelated consumer code blocks).
|
|
33
34
|
Prism.manual = true;
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
/* Code inside a sentence: a chip of the matte step in the monospace stack. It is a plain `code` element
|
|
36
|
+
with no copy action, because a phrase is read where it sits and is not lifted out of the text. */
|
|
37
|
+
const InlineCode = ({ className, children }) => (jsx("code", { className: cn("px-1.5 py-0.5 font-sherick-mono text-[0.9em]", material.matteHigh, shape.row, text.high, className), children: children }));
|
|
38
|
+
const failedLabel = "Copy failed";
|
|
39
|
+
const CodeBlock = ({ inline = false, className, language = "text", copyLabel = "Copy", copiedLabel = "Copied", children, }) => {
|
|
40
|
+
const [copy, setCopy] = useState("idle");
|
|
36
41
|
const resetTimer = useRef(null);
|
|
37
42
|
const code = String(children !== null && children !== void 0 ? children : "").trim();
|
|
38
43
|
useEffect(() => () => {
|
|
@@ -40,31 +45,56 @@ const CodeBlock = ({ inline = false, className, language = "text", children }) =
|
|
|
40
45
|
clearTimeout(resetTimer.current);
|
|
41
46
|
}, []);
|
|
42
47
|
const onCopy = async () => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
try {
|
|
49
|
+
if (!navigator.clipboard)
|
|
50
|
+
throw new Error("The clipboard is not available here.");
|
|
51
|
+
await navigator.clipboard.writeText(code);
|
|
52
|
+
setCopy("copied");
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
/* A refused or missing clipboard is a state the reader can see, not an unhandled rejection. */
|
|
56
|
+
setCopy("failed");
|
|
57
|
+
}
|
|
47
58
|
if (resetTimer.current)
|
|
48
59
|
clearTimeout(resetTimer.current);
|
|
49
|
-
resetTimer.current = setTimeout(() =>
|
|
60
|
+
resetTimer.current = setTimeout(() => setCopy("idle"), 2000);
|
|
50
61
|
};
|
|
51
|
-
if (inline)
|
|
52
|
-
return
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
if (inline)
|
|
63
|
+
return jsx(InlineCode, { className: cn(className), children: children });
|
|
64
|
+
/* The copy mark: two glyphs in one grid cell, so one is always there and the swap is a cross-fade rather
|
|
65
|
+
than a change of box. */
|
|
66
|
+
const copyMark = (jsxs("span", { className: cn(iconSlot.compact, "grid"), children: [jsx(HugeiconsIcon, { icon: Copy01Icon, "aria-hidden": "true", className: cn(iconStroke.glyph, "col-start-1 row-start-1", motionArrive, copy === "copied" ? "opacity-0" : "opacity-100") }), jsx(HugeiconsIcon, { icon: Tick02Icon, "aria-hidden": "true", className: cn(iconStroke.glyph, "col-start-1 row-start-1", motionArrive, copy === "copied" ? "opacity-100" : "opacity-0") })] }));
|
|
67
|
+
/* Every label sits in the same grid cell, and only the current one is visible. The cell is as wide as the
|
|
68
|
+
widest label, so the action keeps one width whatever it says. */
|
|
69
|
+
const labels = [
|
|
70
|
+
["idle", copyLabel],
|
|
71
|
+
["copied", copiedLabel],
|
|
72
|
+
["failed", failedLabel],
|
|
73
|
+
];
|
|
74
|
+
/* What a screen reader hears. It is an empty live region until a copy settles, so each result is news. */
|
|
75
|
+
const announcement = copy === "copied" ? copiedLabel : copy === "failed" ? failedLabel : "";
|
|
76
|
+
return (
|
|
77
|
+
/* A wide well shows only its shaded upper wall: the full recessed pair is calibrated for narrow
|
|
78
|
+
tracks, and drawn around a wide panel it reads as an outline. */
|
|
79
|
+
jsxs("div", { className: cn("mt-4 overflow-hidden", shape.prominent, material.matte, recessedTop, className), children: [jsxs("div", { className: cn("flex min-h-11 items-center justify-between gap-4 px-4 py-2"), children: [jsx("span", { className: cn("font-sherick-mono", type.caption, text.medium), children: language }), jsx(Button, { appearance: "text", size: "sm", variant: "secondary", icon: copyMark, onClick: () => void onCopy(), className: cn("-me-4 -my-2", state.quietInk), children: jsx("span", { className: cn("grid"), children: labels.map(([name, label]) => (jsx("span", { className: cn("col-start-1 row-start-1", copy !== name && "invisible", name === "failed" && tone.text.danger), children: label }, name))) }) }), jsx("span", { role: "status", "aria-live": "polite", className: cn("sr-only"), children: announcement })] }), jsx(Highlight, { code: code, language: language === "tsx" ? "jsx" : language, theme: theme, prism: Prism, children: ({ className: highlightClassName, style, tokens, getLineProps, getTokenProps }) => {
|
|
80
|
+
/* The gutter is as wide as the largest line number, in the font's own unit, so three-digit numbers
|
|
81
|
+
never reach the code beside them. */
|
|
82
|
+
const digits = String(tokens.length).length;
|
|
83
|
+
return (
|
|
84
|
+
/* A code well is the one surface in the library that is **not** a writing-direction
|
|
85
|
+
surface: source code is read left to right whatever the document says, so the well
|
|
86
|
+
declares its own direction and its gutter is physical *inside* it. Everything else
|
|
87
|
+
asymmetric in this library is logical (§17). The theme's own background is removed here,
|
|
88
|
+
because it would paint over the well's fill and leave the well transparent. */
|
|
89
|
+
jsx(ScrollRegion, { as: "pre", dir: "ltr", label: language === "text" ? "Code" : `${language} code`, className: cn("border-t px-4 py-4 m-0 font-sherick-mono text-sm leading-6", edge.rule, codeWell, highlightClassName), style: { ...style, backgroundColor: undefined }, children: jsx("code", { className: cn("inline-block min-w-full"), children: tokens.map((line, i) => {
|
|
90
|
+
const lineProps = getLineProps({ line });
|
|
91
|
+
return (jsxs("span", { ...lineProps, className: cn("block", lineProps.className), children: [jsx("span", { "aria-hidden": "true", className: cn("mr-4 inline-block select-none text-right", text.medium), style: { width: `${digits}ch` }, children: i + 1 }), line.map((token, key) => {
|
|
92
|
+
const tokenProps = getTokenProps({ token });
|
|
93
|
+
return jsx("span", { ...tokenProps, className: cn(tokenProps.className) }, key);
|
|
94
|
+
})] }, i));
|
|
95
|
+
}) }) }));
|
|
96
|
+
} })] }));
|
|
67
97
|
};
|
|
68
98
|
|
|
69
|
-
export { CodeBlock as default };
|
|
99
|
+
export { InlineCode, CodeBlock as default };
|
|
70
100
|
//# sourceMappingURL=CodeBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeBlock.js","sources":["../../../src/components/CodeBlock.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button } from \"@base-ui/react/button\";\nimport React, { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { Copy01Icon, Tick02Icon } from \"@hugeicons/core-free-icons\";\nimport { Highlight } from \"prism-react-renderer\";\nimport Prism from \"prismjs\";\nimport \"prismjs/components/prism-jsx.js\";\nimport \"prismjs/components/prism-typescript.js\";\nimport \"prismjs/components/prism-bash.js\";\nimport \"prismjs/components/prism-css.js\";\nimport \"prismjs/components/prism-diff.js\";\nimport \"prismjs/components/prism-docker.js\";\nimport \"prismjs/components/prism-git.js\";\nimport \"prismjs/components/prism-go.js\";\nimport \"prismjs/components/prism-graphql.js\";\nimport \"prismjs/components/prism-java.js\";\nimport \"prismjs/components/prism-json.js\";\nimport \"prismjs/components/prism-kotlin.js\";\nimport \"prismjs/components/prism-markdown.js\";\nimport \"prismjs/components/prism-markup.js\";\nimport \"prismjs/components/prism-python.js\";\nimport \"prismjs/components/prism-sql.js\";\nimport \"prismjs/components/prism-yaml.js\";\nimport { cn, type TimerHandle } from \"@/libs/utils\";\nimport {\n edge,\n focusRing,\n material,\n recessedTop,\n shape,\n state,\n stateLayer,\n text,\n type,\n} from \"./ui.common\";\nimport { motionTactile } from \"./ui.motion\";\nimport theme from \"./prism-theme\";\n\n// React owns the markup. Prism's automatic document scan otherwise rewrites it\n// before hydration (and also highlights unrelated consumer code blocks).\nPrism.manual = true;\n\nexport interface CodeBlockProps {\n inline?: boolean;\n className?: string;\n children?: ReactNode;\n language?: string;\n}\n\nconst CodeBlock = ({ inline = false, className, language = \"text\", children }: CodeBlockProps) => {\n const [copied, setCopied] = useState(false);\n const resetTimer = useRef<TimerHandle | null>(null);\n const code = String(children ?? \"\").trim();\n\n useEffect(() => () => {\n if (resetTimer.current) clearTimeout(resetTimer.current);\n }, []);\n\n const onCopy = async () => {\n if (!navigator.clipboard) return;\n await navigator.clipboard.writeText(code);\n setCopied(true);\n if (resetTimer.current) clearTimeout(resetTimer.current);\n resetTimer.current = setTimeout(() => setCopied(false), 2000);\n };\n\n if (inline) {\n return (\n <code className={cn(\"px-1.5 py-0.5 font-sherick-mono text-[0.9em]\", material.matteHigh, shape.row, text.high, className)}>\n {children}\n </code>\n );\n }\n\n return (\n <div className={/* A wide well shows only its shaded upper wall: the full recessed pair is calibrated for narrow\n tracks, and drawn around a wide panel it reads as an outline. */\n cn(\"mt-4 overflow-hidden\", shape.prominent, material.matte, recessedTop)}>\n <div className={cn(\"flex min-h-11 items-center justify-between gap-4 px-4 py-2\")}>\n <span className={cn(\"font-sherick-mono\", type.caption, text.medium)}>\n {language}\n </span>\n <Button\n type=\"button\"\n onClick={() => void onCopy()}\n className={cn(\n \"inline-flex items-center gap-1.5 px-2.5 py-1.5 text-xs\",\n shape.control,\n motionTactile,\n focusRing,\n text.medium,\n \"hover:text-sherick-ink\",\n stateLayer.quiet,\n state.enabled\n )}\n >\n {copied ? <HugeiconsIcon icon={Tick02Icon} className={cn(\"size-3.5\")} aria-hidden=\"true\" /> : <HugeiconsIcon icon={Copy01Icon} className={cn(\"size-3.5\")} aria-hidden=\"true\" />}\n <span>{copied ? \"Copied\" : \"Copy\"}</span>\n </Button>\n </div>\n\n <Highlight\n code={code}\n language={language === \"tsx\" ? \"jsx\" : language}\n theme={theme}\n prism={Prism as typeof Prism}\n >\n {({ className: highlightClassName, style, tokens, getLineProps, getTokenProps }) => (\n /* A code well is the one surface in the library that is **not** a writing-direction\n surface: source code is read left to right whatever the document says, so the well\n declares its own direction and its gutter is physical *inside* it. Everything else\n asymmetric in this library is logical (§17). */\n <pre\n dir=\"ltr\"\n className={cn(\n \"overflow-x-auto border-t px-4 py-4 font-sherick-mono text-sm leading-6\",\n edge.rule,\n \"bg-sherick-canvas/[0.28]\",\n highlightClassName\n )}\n style={style}\n >\n <code className={cn(\"inline-block min-w-full\")}>\n {tokens.map((line, i) => {\n const lineProps = getLineProps({ line });\n return (\n <span key={i} {...lineProps} className={cn(\"block\", lineProps.className)}>\n {/* Line numbers are text, so they take a text role: the dimmest tone in the\n library is furniture, not a readable step. */}\n <span className={cn(\"mr-4 inline-block w-4 select-none text-right\", text.medium)}>\n {i + 1}\n </span>\n {line.map((token, key) => {\n const tokenProps = getTokenProps({ token });\n return <span key={key} {...tokenProps} className={cn(tokenProps.className)} />;\n })}\n </span>\n );\n })}\n </code>\n </pre>\n )}\n </Highlight>\n </div>\n );\n};\n\nexport default CodeBlock;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeBlock.js","sources":["../../../src/components/CodeBlock.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { Copy01Icon, Tick02Icon } from \"@hugeicons/core-free-icons\";\nimport { Highlight } from \"prism-react-renderer\";\nimport Prism from \"prismjs\";\nimport \"prismjs/components/prism-jsx.js\";\nimport \"prismjs/components/prism-typescript.js\";\nimport \"prismjs/components/prism-bash.js\";\nimport \"prismjs/components/prism-css.js\";\nimport \"prismjs/components/prism-diff.js\";\nimport \"prismjs/components/prism-docker.js\";\nimport \"prismjs/components/prism-git.js\";\nimport \"prismjs/components/prism-go.js\";\nimport \"prismjs/components/prism-graphql.js\";\nimport \"prismjs/components/prism-java.js\";\nimport \"prismjs/components/prism-json.js\";\nimport \"prismjs/components/prism-kotlin.js\";\nimport \"prismjs/components/prism-markdown.js\";\nimport \"prismjs/components/prism-markup.js\";\nimport \"prismjs/components/prism-python.js\";\nimport \"prismjs/components/prism-sql.js\";\nimport \"prismjs/components/prism-yaml.js\";\nimport { cn, type TimerHandle } from \"@/libs/utils\";\nimport Button from \"./Button\";\nimport ScrollRegion from \"./scroll-region\";\nimport {\n codeWell,\n edge,\n iconSlot,\n iconStroke,\n material,\n recessedTop,\n shape,\n state,\n text,\n tone,\n type,\n} from \"./ui.common\";\nimport { motionArrive } from \"./ui.motion\";\nimport theme from \"./prism-theme\";\n\n// React owns the markup. Prism's automatic document scan otherwise rewrites it\n// before hydration (and also highlights unrelated consumer code blocks).\nPrism.manual = true;\n\nexport interface InlineCodeProps {\n className?: string;\n children?: ReactNode;\n}\n\n/* Code inside a sentence: a chip of the matte step in the monospace stack. It is a plain `code` element\n with no copy action, because a phrase is read where it sits and is not lifted out of the text. */\nexport const InlineCode = ({ className, children }: InlineCodeProps) => (\n <code className={cn(\"px-1.5 py-0.5 font-sherick-mono text-[0.9em]\", material.matteHigh, shape.row, text.high, className)}>\n {children}\n </code>\n);\n\nexport interface CodeBlockProps {\n /** @deprecated Render `InlineCode` for code inside a sentence. This is kept for one minor and maps to it. */\n inline?: boolean;\n className?: string;\n children?: ReactNode;\n language?: string;\n /** The copy action's label. */\n copyLabel?: string;\n /** The copy action's label once the code is on the clipboard. */\n copiedLabel?: string;\n}\n\ntype CopyState = \"idle\" | \"copied\" | \"failed\";\n\nconst failedLabel = \"Copy failed\";\n\nconst CodeBlock = ({\n inline = false,\n className,\n language = \"text\",\n copyLabel = \"Copy\",\n copiedLabel = \"Copied\",\n children,\n}: CodeBlockProps) => {\n const [copy, setCopy] = useState<CopyState>(\"idle\");\n const resetTimer = useRef<TimerHandle | null>(null);\n const code = String(children ?? \"\").trim();\n\n useEffect(() => () => {\n if (resetTimer.current) clearTimeout(resetTimer.current);\n }, []);\n\n const onCopy = async () => {\n try {\n if (!navigator.clipboard) throw new Error(\"The clipboard is not available here.\");\n await navigator.clipboard.writeText(code);\n setCopy(\"copied\");\n } catch {\n /* A refused or missing clipboard is a state the reader can see, not an unhandled rejection. */\n setCopy(\"failed\");\n }\n if (resetTimer.current) clearTimeout(resetTimer.current);\n resetTimer.current = setTimeout(() => setCopy(\"idle\"), 2000);\n };\n\n if (inline) return <InlineCode className={cn(className)}>{children}</InlineCode>;\n\n /* The copy mark: two glyphs in one grid cell, so one is always there and the swap is a cross-fade rather\n than a change of box. */\n const copyMark = (\n <span className={cn(iconSlot.compact, \"grid\")}>\n <HugeiconsIcon\n icon={Copy01Icon}\n aria-hidden=\"true\"\n className={cn(iconStroke.glyph, \"col-start-1 row-start-1\", motionArrive, copy === \"copied\" ? \"opacity-0\" : \"opacity-100\")}\n />\n <HugeiconsIcon\n icon={Tick02Icon}\n aria-hidden=\"true\"\n className={cn(iconStroke.glyph, \"col-start-1 row-start-1\", motionArrive, copy === \"copied\" ? \"opacity-100\" : \"opacity-0\")}\n />\n </span>\n );\n\n /* Every label sits in the same grid cell, and only the current one is visible. The cell is as wide as the\n widest label, so the action keeps one width whatever it says. */\n const labels: Array<[CopyState, string]> = [\n [\"idle\", copyLabel],\n [\"copied\", copiedLabel],\n [\"failed\", failedLabel],\n ];\n\n /* What a screen reader hears. It is an empty live region until a copy settles, so each result is news. */\n const announcement = copy === \"copied\" ? copiedLabel : copy === \"failed\" ? failedLabel : \"\";\n\n return (\n /* A wide well shows only its shaded upper wall: the full recessed pair is calibrated for narrow\n tracks, and drawn around a wide panel it reads as an outline. */\n <div className={cn(\"mt-4 overflow-hidden\", shape.prominent, material.matte, recessedTop, className)}>\n <div className={cn(\"flex min-h-11 items-center justify-between gap-4 px-4 py-2\")}>\n <span className={cn(\"font-sherick-mono\", type.caption, text.medium)}>\n {language}\n </span>\n {/* The copy action is a text action at the block's end edge, so its end padding hangs past the header\n and its label sits on the edge (§17). The vertical margin keeps the header at its own height. */}\n <Button\n appearance=\"text\"\n size=\"sm\"\n variant=\"secondary\"\n icon={copyMark}\n onClick={() => void onCopy()}\n className={cn(\"-me-4 -my-2\", state.quietInk)}\n >\n <span className={cn(\"grid\")}>\n {labels.map(([name, label]) => (\n <span\n key={name}\n className={cn(\"col-start-1 row-start-1\", copy !== name && \"invisible\", name === \"failed\" && tone.text.danger)}\n >\n {label}\n </span>\n ))}\n </span>\n </Button>\n <span role=\"status\" aria-live=\"polite\" className={cn(\"sr-only\")}>\n {announcement}\n </span>\n </div>\n\n <Highlight\n code={code}\n language={language === \"tsx\" ? \"jsx\" : language}\n theme={theme}\n prism={Prism as typeof Prism}\n >\n {({ className: highlightClassName, style, tokens, getLineProps, getTokenProps }) => {\n /* The gutter is as wide as the largest line number, in the font's own unit, so three-digit numbers\n never reach the code beside them. */\n const digits = String(tokens.length).length;\n\n return (\n /* A code well is the one surface in the library that is **not** a writing-direction\n surface: source code is read left to right whatever the document says, so the well\n declares its own direction and its gutter is physical *inside* it. Everything else\n asymmetric in this library is logical (§17). The theme's own background is removed here,\n because it would paint over the well's fill and leave the well transparent. */\n <ScrollRegion\n as=\"pre\"\n dir=\"ltr\"\n label={language === \"text\" ? \"Code\" : `${language} code`}\n className={cn(\n \"border-t px-4 py-4 m-0 font-sherick-mono text-sm leading-6\",\n edge.rule,\n codeWell,\n highlightClassName\n )}\n style={{ ...style, backgroundColor: undefined }}\n >\n <code className={cn(\"inline-block min-w-full\")}>\n {tokens.map((line, i) => {\n const lineProps = getLineProps({ line });\n return (\n <span key={i} {...lineProps} className={cn(\"block\", lineProps.className)}>\n {/* Line numbers are text, so they take a text role: the dimmest tone in the\n library is furniture, not a readable step. They are decoration to a reader of\n the code, so they are hidden from assistive technology. */}\n <span\n aria-hidden=\"true\"\n className={cn(\"mr-4 inline-block select-none text-right\", text.medium)}\n style={{ width: `${digits}ch` }}\n >\n {i + 1}\n </span>\n {line.map((token, key) => {\n const tokenProps = getTokenProps({ token });\n return <span key={key} {...tokenProps} className={cn(tokenProps.className)} />;\n })}\n </span>\n );\n })}\n </code>\n </ScrollRegion>\n );\n }}\n </Highlight>\n </div>\n );\n};\n\nexport default CodeBlock;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAI;AAOnB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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AAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACmE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IACnEC,CAAAA,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAA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A,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACuC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;oBACvC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,MAAM,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM;oBAE3C,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAA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"}
|
|
@@ -4,10 +4,10 @@ import { Collapsible as Collapsible$1 } from '@base-ui/react/collapsible';
|
|
|
4
4
|
import { HugeiconsIcon } from '@hugeicons/react';
|
|
5
5
|
import { ArrowDown01Icon } from '@hugeicons/core-free-icons';
|
|
6
6
|
import { cn } from '../libs/utils.js';
|
|
7
|
-
import { disclosure } from './ui.common.js';
|
|
7
|
+
import { iconStroke, disclosure } from './ui.common.js';
|
|
8
8
|
import { motionOrient } from './ui.motion.js';
|
|
9
9
|
|
|
10
|
-
const CollapsibleTrigger = ({ children, className }) => (jsxs(Collapsible$1.Trigger, { className: cn(disclosure.trigger, className), children: [jsx("span", { className: cn("min-w-0 flex-1"), children: children }), jsx(HugeiconsIcon, { icon: ArrowDown01Icon, "aria-hidden": "true", className: cn(
|
|
10
|
+
const CollapsibleTrigger = ({ children, className }) => (jsxs(Collapsible$1.Trigger, { className: cn(disclosure.trigger, className), children: [jsx("span", { className: cn("min-w-0 flex-1"), children: children }), jsx("span", { className: cn(disclosure.chevron), "aria-hidden": "true", children: jsx(HugeiconsIcon, { icon: ArrowDown01Icon, "aria-hidden": "true", className: cn(iconStroke.glyph, motionOrient, "group-data-[panel-open]:rotate-180") }) })] }));
|
|
11
11
|
const CollapsiblePanel = ({ children, className }) => (jsx(Collapsible$1.Panel, { className: cn("[--sui-disclose-height:var(--collapsible-panel-height)]", disclosure.panel, className), children: jsx("div", { className: cn("px-4 pb-4 pt-1"), children: children }) }));
|
|
12
12
|
/**
|
|
13
13
|
* One region that expands where it sits, without belonging to a group. Base UI owns the expanded
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.js","sources":["../../../src/components/Collapsible.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\";\nimport React, { type ReactNode } from \"react\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { ArrowDown01Icon } from \"@hugeicons/core-free-icons\";\nimport { cn } from \"@/libs/utils\";\nimport { disclosure } from \"./ui.common\";\nimport { motionOrient } from \"./ui.motion\";\n\nexport interface CollapsibleProps {\n children: ReactNode;\n /** Whether the region is expanded, when the application owns the state. */\n open?: boolean;\n /** Whether the region starts expanded, for a collapsible that owns its own state. */\n defaultOpen?: boolean;\n /** Base's own open-change callback, event details included. */\n onOpenChange?: BaseCollapsible.Root.Props[\"onOpenChange\"];\n /** Whether the disclosure is inert. */\n disabled?: boolean;\n /** Adds to the disclosure's own column. The row and the panel style themselves. */\n className?: string;\n}\n\nexport interface CollapsibleTriggerProps {\n children: ReactNode;\n /** Adds to the row. The row's shape, tone and states are the disclosure recipe's. */\n className?: string;\n}\n\nexport interface CollapsiblePanelProps {\n children: ReactNode;\n /** Adds to the measured region. The region's height and clipping are the recipe's. */\n className?: string;\n}\n\ntype CollapsibleComponent = ((props: CollapsibleProps) => React.JSX.Element) & {\n Trigger: typeof CollapsibleTrigger;\n Panel: typeof CollapsiblePanel;\n};\n\nconst CollapsibleTrigger = ({ children, className }: CollapsibleTriggerProps) => (\n <BaseCollapsible.Trigger className={cn(disclosure.trigger, className)}>\n <span className={cn(\"min-w-0 flex-1\")}>{children}</span>\n {/* The same affordance, and the same in-place turn, as an `Accordion` row
|
|
1
|
+
{"version":3,"file":"Collapsible.js","sources":["../../../src/components/Collapsible.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\";\nimport React, { type ReactNode } from \"react\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { ArrowDown01Icon } from \"@hugeicons/core-free-icons\";\nimport { cn } from \"@/libs/utils\";\nimport { disclosure, iconStroke } from \"./ui.common\";\nimport { motionOrient } from \"./ui.motion\";\n\nexport interface CollapsibleProps {\n children: ReactNode;\n /** Whether the region is expanded, when the application owns the state. */\n open?: boolean;\n /** Whether the region starts expanded, for a collapsible that owns its own state. */\n defaultOpen?: boolean;\n /** Base's own open-change callback, event details included. */\n onOpenChange?: BaseCollapsible.Root.Props[\"onOpenChange\"];\n /** Whether the disclosure is inert. */\n disabled?: boolean;\n /** Adds to the disclosure's own column. The row and the panel style themselves. */\n className?: string;\n}\n\nexport interface CollapsibleTriggerProps {\n children: ReactNode;\n /** Adds to the row. The row's shape, tone and states are the disclosure recipe's. */\n className?: string;\n}\n\nexport interface CollapsiblePanelProps {\n children: ReactNode;\n /** Adds to the measured region. The region's height and clipping are the recipe's. */\n className?: string;\n}\n\ntype CollapsibleComponent = ((props: CollapsibleProps) => React.JSX.Element) & {\n Trigger: typeof CollapsibleTrigger;\n Panel: typeof CollapsiblePanel;\n};\n\nconst CollapsibleTrigger = ({ children, className }: CollapsibleTriggerProps) => (\n <BaseCollapsible.Trigger className={cn(disclosure.trigger, className)}>\n <span className={cn(\"min-w-0 flex-1\")}>{children}</span>\n {/* The same affordance, at the same slot size and with the same in-place turn, as an `Accordion` row:\n the two are one object at two scopes. */}\n <span className={cn(disclosure.chevron)} aria-hidden=\"true\">\n <HugeiconsIcon\n icon={ArrowDown01Icon}\n aria-hidden=\"true\"\n className={cn(iconStroke.glyph, motionOrient, \"group-data-[panel-open]:rotate-180\")}\n />\n </span>\n </BaseCollapsible.Trigger>\n);\n\nconst CollapsiblePanel = ({ children, className }: CollapsiblePanelProps) => (\n <BaseCollapsible.Panel\n className={cn(\n \"[--sui-disclose-height:var(--collapsible-panel-height)]\",\n disclosure.panel,\n className\n )}\n >\n <div className={cn(\"px-4 pb-4 pt-1\")}>{children}</div>\n </BaseCollapsible.Panel>\n);\n\n/**\n * One region that expands where it sits, without belonging to a group. Base UI owns the expanded\n * state and the trigger's `aria-expanded`/`aria-controls` plumbing — including making the\n * trigger's own state reachable, since nothing else in the page holds it; Sherick UI owns the\n * row, the panel's clipping and how the height moves.\n *\n * It is the same object an `Accordion` item is, at the scope of a single disclosure: use a\n * `Collapsible` for one region on its own, and an `Accordion` when several sections belong to\n * one group.\n */\nconst Collapsible = (({ children, className, ...props }: CollapsibleProps) => {\n return (\n <BaseCollapsible.Root {...props} className={cn(\"flex min-w-0 flex-col\", className)}>\n {children}\n </BaseCollapsible.Root>\n );\n}) as CollapsibleComponent;\n\nCollapsible.Trigger = CollapsibleTrigger;\nCollapsible.Panel = CollapsiblePanel;\n\nexport default Collapsible;\n"],"names":["_jsxs","BaseCollapsible","_jsx"],"mappings":";;;;;;;;;AAyCA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,GAAG,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAA2B,CAAA,CAAA,CAAA,CAAA,CAAA,CAC1EA,CAAAA,CAAAA,CAAAA,CAAA,CAACC,aAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA,QAAA,CAAA,CAAA,CACnEC,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAA,WAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAQ,CAAA,CAGxDA,CAAAA,CAAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAM,SAAS,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,WACzDA,CAAAA,CAAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CACZ,CAAA,CAAA,CAAA,CAAI,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACT,MAAM,CAAA,CAClB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoC,CAAC,CAAA,CAAA,CACnF,EAAA,CACG,CAAA,CAAA,CAAA,CACiB,CAC3B;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,GAAG,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAyB,CAAA,CAAA,CAAA,CAAA,CAAA,CACtEA,CAAAA,CAAAA,EAACD,aAAe,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,EAAE,CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyD,CAAA,CACzD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,EAChB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CACV,YAEDC,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAA,CAAA,CAAO,CAAA,CAAA,CAChC,CACzB;AAED,CAAA,CAAA;;;;;;;;;AASG,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAI,CAAC,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAA,CAAE,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAoB,CAAA,CAAA,CAAA,CAAA,CAAI;IAC3E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACEA,CAAAA,CAAAA,EAACD,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAe,CAAC,IAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,EAAE,CAAA,CAAE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,YAC/E,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CACY,CAAA;AAE3B,CAAC,CAAA;AAED,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB;AACxC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB;;"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
3
3
|
import { Combobox as Combobox$1 } from '@base-ui/react/combobox';
|
|
4
|
-
import { forwardRef, useState } from 'react';
|
|
4
|
+
import { forwardRef, useRef, useEffect, useState } from 'react';
|
|
5
5
|
import { HugeiconsIcon } from '@hugeicons/react';
|
|
6
|
-
import {
|
|
6
|
+
import { ArrowDown01Icon, PlusSignIcon, Tick02Icon } from '@hugeicons/core-free-icons';
|
|
7
7
|
import { cn } from '../libs/utils.js';
|
|
8
|
-
import { focusRingInset, text, elevation, puck, shape, state, stateLayer, density, focusRingWithin, rim, material, fieldMessage, list, overlay, stacking, tone } from './ui.common.js';
|
|
9
|
-
import {
|
|
8
|
+
import { focusRingInset, text, elevation, puck, type, shape, state, stateLayer, density, iconStroke, focusRingWithin, rim, material, fieldMessage, list, overlay, stacking, tone } from './ui.common.js';
|
|
9
|
+
import { motionOrient, motionFeedback, motionTactileField, motionPresenceAnchored, motionArrive } from './ui.motion.js';
|
|
10
10
|
import { flattenOptions, hasOptionGroups, toOptionSections } from './option-groups.js';
|
|
11
|
+
import DismissButton from './DismissButton.js';
|
|
12
|
+
import { Spinner } from './Spinner.js';
|
|
13
|
+
import { fieldDensity } from './Field.js';
|
|
11
14
|
|
|
15
|
+
const defaultComboboxLabels = {
|
|
16
|
+
removeChip: (label) => `Remove ${label}`,
|
|
17
|
+
clearAll: "Clear all",
|
|
18
|
+
clearSelection: "Clear selection",
|
|
19
|
+
showOptions: "Show options",
|
|
20
|
+
noResults: "No results found.",
|
|
21
|
+
};
|
|
12
22
|
const isCreateItem = (item) => item.create === true;
|
|
13
23
|
const sameText = (a, b) => a.localeCompare(b, undefined, { sensitivity: "accent" }) === 0;
|
|
14
24
|
/* The composite field's own controls are not standalone `IconButton`s: the field owns their
|
|
@@ -20,7 +30,7 @@ const sameText = (a, b) => a.localeCompare(b, undefined, { sensitivity: "accent"
|
|
|
20
30
|
a read-only combobox still opens and browses, only its value is fixed. The clear control is
|
|
21
31
|
handed its own `disabled` for that case because Base itself refuses to clear a read-only
|
|
22
32
|
control; nothing here has to be derived from Sherick's props. */
|
|
23
|
-
const partClassName = `inline-flex shrink-0 items-center justify-center ${density.part} ${shape.circle} ${
|
|
33
|
+
const partClassName = `inline-flex shrink-0 items-center justify-center ${density.part} ${shape.circle} ${state.quietInk} [&>svg]:size-5 ${motionFeedback} ${stateLayer.fieldPart} ${state.enabled} ${state.disabledPart} ${state.busy}`;
|
|
24
34
|
/* A chosen value inside the field is a held choice riding in the field's tray, so it is the tray's
|
|
25
35
|
puck: the brightest surface in the view, at `elevation.control`, with its copy at full emphasis. A
|
|
26
36
|
neutral tonal pill is the tray's own tone, and a row of them read as one grey band rather than as
|
|
@@ -29,12 +39,15 @@ const partClassName = `inline-flex shrink-0 items-center justify-center ${densit
|
|
|
29
39
|
resting height intact around one line of chips. Base gives a chip real focus while the arrow keys
|
|
30
40
|
walk the row, so the focused chip takes the inset ring — the one this chip is, inside the field's
|
|
31
41
|
own ring, which keeps marking the field as engaged. */
|
|
32
|
-
const valueChipClassName = cn("inline-flex h-7 min-w-0 max-w-full items-center gap-0.5 ps-3 pe-0.5
|
|
42
|
+
const valueChipClassName = cn("inline-flex h-7 min-w-0 max-w-full items-center gap-0.5 ps-3 pe-0.5 [outline-style:none]", shape.pill, type.label, puck, elevation.control, text.high, focusRingInset);
|
|
33
43
|
/* The dismiss target is a part of the chip the pointer is already in: 24px clears the pointer
|
|
34
|
-
minimum, its circle nests in the chip's pill at the chip's own 2px end inset, and the
|
|
35
|
-
it takes the press so the target never moves.
|
|
36
|
-
|
|
37
|
-
const chipRemoveClassName =
|
|
44
|
+
minimum, its circle nests in the chip's pill at the chip's own 2px end inset, and the 16px mark
|
|
45
|
+
inside it takes the press so the target never moves. `DismissButton` supplies the mark and the
|
|
46
|
+
quiet ink; these classes give it the chip's own geometry in place of the standalone 44px floor. */
|
|
47
|
+
const chipRemoveClassName = "size-6 min-h-0 min-w-0 shrink-0";
|
|
48
|
+
/* The clear control is one part of the field, so it keeps the part's 32px cluster and its 32px hover
|
|
49
|
+
circle, with the 16px dismiss mark inside it. */
|
|
50
|
+
const clearClassName = cn(density.part, stateLayer.fieldPart, state.enabled, state.disabledPart);
|
|
38
51
|
/**
|
|
39
52
|
* A text field that filters a list of options and selects one of them, or several. It is the
|
|
40
53
|
* searchable sibling of `Select`: the same option shape, the same value contract and the same box,
|
|
@@ -47,7 +60,26 @@ const chipRemoveClassName = cn("group inline-flex size-6 shrink-0 items-center j
|
|
|
47
60
|
*/
|
|
48
61
|
const Combobox = forwardRef((props, ref) => {
|
|
49
62
|
var _a, _b, _c;
|
|
50
|
-
const { options, multiple, value, defaultValue, onValueChange, creatable, createLabel = (query) => `Add “${query}”`, chipsLabel = "Selected", placeholder = "Select an option", emptyMessage, className, disabled, readOnly, filter, autoHighlight, inputValue, defaultInputValue, onInputValueChange, onOpenChange, ...rootProps } = props;
|
|
63
|
+
const { options, multiple, value, defaultValue, onValueChange, creatable, createLabel = (query) => `Add “${query}”`, chipsLabel = "Selected", placeholder = "Select an option", emptyMessage, loading = false, size = "md", labels, className, popupClassName, disabled, readOnly, filter, autoHighlight, inputValue, defaultInputValue, onInputValueChange, onOpenChange, ...rootProps } = props;
|
|
64
|
+
const copy = { ...defaultComboboxLabels, ...labels };
|
|
65
|
+
/* The field's own box, so a chip that is removed can find the chips and the input that remain. */
|
|
66
|
+
const fieldRef = useRef(null);
|
|
67
|
+
/* Set when a chip is removed while it holds focus: focus then moves to the chip that takes its place,
|
|
68
|
+
or to the input when the last chip went. Applied after the new value has rendered. */
|
|
69
|
+
const focusAfterRemoval = useRef(null);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
var _a;
|
|
72
|
+
const index = focusAfterRemoval.current;
|
|
73
|
+
if (index === null)
|
|
74
|
+
return;
|
|
75
|
+
focusAfterRemoval.current = null;
|
|
76
|
+
const field = fieldRef.current;
|
|
77
|
+
if (!field)
|
|
78
|
+
return;
|
|
79
|
+
const chips = field.querySelectorAll("[data-sui-value-chip]");
|
|
80
|
+
const target = (_a = chips[index]) !== null && _a !== void 0 ? _a : field.querySelector("input");
|
|
81
|
+
target === null || target === void 0 ? void 0 : target.focus();
|
|
82
|
+
});
|
|
51
83
|
const flatOptions = flattenOptions(options);
|
|
52
84
|
const optionByValue = new Map(flatOptions.map((option) => [option.value, option]));
|
|
53
85
|
/* A value that is not among the options — a created entry — is shown under its own text. */
|
|
@@ -127,8 +159,8 @@ const Combobox = forwardRef((props, ref) => {
|
|
|
127
159
|
if (next !== "" && notice.announced !== "")
|
|
128
160
|
setNotice({ visible: "", announced: "" });
|
|
129
161
|
};
|
|
130
|
-
const renderItem = (option) => isCreateItem(option) ? (jsxs(Combobox$1.Item, { value: option, className: cn(list.option, "justify-start gap-3"), children: [jsx(HugeiconsIcon, { icon: PlusSignIcon, "aria-hidden": "true", className: cn("size-4 shrink-0", tone.text.primary) }), jsx("span", { className: cn("min-w-0 flex-1 truncate"), children: createLabel(option.label) })] }, "sui-create")) : (jsxs(Combobox$1.Item, { value: option, disabled: option.disabled, className: ({ selected: isSelected }) => cn(list.option, isSelected && cn(tone.selected.primary, elevation.control)), children: [jsx("span", { className: cn("min-w-0 flex-1 truncate"), children: option.label }), jsx(Combobox$1.ItemIndicator, { children: jsx(HugeiconsIcon, { icon: Tick02Icon, "aria-hidden": "true", className: cn("size-4", motionArrive, tone.text.primary) }) })] }, option.value));
|
|
131
|
-
const input = (chosenCount) => (jsx(Combobox$1.Input, { ref: ref, placeholder: chosenCount > 0 ? undefined : placeholder, onPaste: handlePaste, className: cn("min-w-0 flex-1 bg-transparent outline-none placeholder:text-sherick-ink-muted disabled:cursor-not-allowed", multiple && "h-7 min-w-16") }));
|
|
162
|
+
const renderItem = (option) => isCreateItem(option) ? (jsxs(Combobox$1.Item, { value: option, className: cn(list.option, "justify-start gap-3"), children: [jsx(HugeiconsIcon, { icon: PlusSignIcon, "aria-hidden": "true", className: cn(iconStroke.glyph, "size-4 shrink-0", tone.text.primary) }), jsx("span", { className: cn("min-w-0 flex-1 truncate"), children: createLabel(option.label) })] }, "sui-create")) : (jsxs(Combobox$1.Item, { value: option, disabled: option.disabled, className: ({ selected: isSelected }) => cn(list.option, isSelected && cn(tone.selected.primary, elevation.control)), children: [jsx("span", { className: cn("min-w-0 flex-1 truncate"), children: option.label }), jsx(Combobox$1.ItemIndicator, { children: jsx(HugeiconsIcon, { icon: Tick02Icon, "aria-hidden": "true", className: cn(iconStroke.glyph, "size-4", motionArrive, tone.text.primary) }) })] }, option.value));
|
|
163
|
+
const input = (chosenCount) => (jsx(Combobox$1.Input, { ref: ref, placeholder: chosenCount > 0 ? undefined : placeholder, onPaste: handlePaste, className: cn("min-w-0 flex-1 bg-transparent [outline-style:none] placeholder:text-sherick-ink-muted disabled:cursor-not-allowed", multiple && "h-7 min-w-16") }));
|
|
132
164
|
const selectedOptions = values.map(toOption);
|
|
133
165
|
/* Base types its single and multiple roots as two different components; the value contract is
|
|
134
166
|
chosen here, once, and the rest of the root is shared. */
|
|
@@ -137,6 +169,7 @@ const Combobox = forwardRef((props, ref) => {
|
|
|
137
169
|
multiple: true,
|
|
138
170
|
value: selectedOptions,
|
|
139
171
|
onValueChange: (next, eventDetails) => {
|
|
172
|
+
var _a, _b, _c, _d;
|
|
140
173
|
const created = next.find(isCreateItem);
|
|
141
174
|
const removed = values.filter((chosen) => !next.some((option) => option.value === chosen));
|
|
142
175
|
const added = next.filter((option) => !values.includes(option.value));
|
|
@@ -163,7 +196,15 @@ const Combobox = forwardRef((props, ref) => {
|
|
|
163
196
|
flagNotice(0, [trimmedQuery]);
|
|
164
197
|
return;
|
|
165
198
|
}
|
|
199
|
+
/* A chip removed while it holds focus would take focus with it, so the request is recorded here
|
|
200
|
+
and applied once the chip is gone. A chip that was not focused leaves focus where it was. */
|
|
201
|
+
const removedIndex = removed.length === 1 ? values.indexOf(removed[0]) : -1;
|
|
202
|
+
const focusedChip = (_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest("[data-sui-value-chip]")) !== null && _b !== void 0 ? _b : null;
|
|
203
|
+
const chipsNow = Array.from((_d = (_c = fieldRef.current) === null || _c === void 0 ? void 0 : _c.querySelectorAll("[data-sui-value-chip]")) !== null && _d !== void 0 ? _d : []);
|
|
166
204
|
const applied = commitValues(next.map((option) => option.value), eventDetails);
|
|
205
|
+
if (applied && removedIndex >= 0 && focusedChip !== null && chipsNow[removedIndex] === focusedChip) {
|
|
206
|
+
focusAfterRemoval.current = removedIndex;
|
|
207
|
+
}
|
|
167
208
|
if (applied && created) {
|
|
168
209
|
/* Base keeps the typed filter while the list stays open, so several matches can be
|
|
169
210
|
chosen from one query. A created entry used the query up, so it starts over. */
|
|
@@ -190,7 +231,7 @@ const Combobox = forwardRef((props, ref) => {
|
|
|
190
231
|
the next can be chosen without reopening it. Escape, Tab and a press outside still close. */
|
|
191
232
|
if (multiple && !open && eventDetails.reason === "item-press")
|
|
192
233
|
eventDetails.cancel();
|
|
193
|
-
}, disabled: disabled, readOnly: readOnly, children: [jsxs(Combobox$1.InputGroup, { className: ({ open, disabled: fieldDisabled }) => cn(
|
|
234
|
+
}, disabled: disabled, readOnly: readOnly, children: [jsxs(Combobox$1.InputGroup, { ref: fieldRef, className: ({ open, disabled: fieldDisabled }) => cn(
|
|
194
235
|
/* The field's own inline padding is what places the trailing cluster, and it is set on the
|
|
195
236
|
logical ends so the cluster stays at the field's end in either writing direction. The
|
|
196
237
|
20px a mark's box then sits from the edge — 14px of padding plus the 6px each `density.part`
|
|
@@ -198,22 +239,25 @@ const Combobox = forwardRef((props, ref) => {
|
|
|
198
239
|
field reads with one inset at both ends. Once chips lead the field, its start inset
|
|
199
240
|
drops to the chips' own block inset, so the first pill sits as far from the field's
|
|
200
241
|
start as from its top. */
|
|
201
|
-
"group/field flex min-w-0 w-full items-center ps-5 pe-3.5", multiple && "has-[[data-sui-value-chip]]:ps-2.5",
|
|
242
|
+
"group/field flex min-w-0 w-full items-center ps-5 pe-3.5", multiple && "has-[[data-sui-value-chip]]:ps-2.5", fieldDensity[size], shape.control, material.control, rim.field, motionTactileField, focusRingWithin, !fieldDisabled && !open && state.field.hover, !fieldDisabled && state.field.focusWithin, open && state.field.engaged, state.field.invalid, open && state.field.invalidEngaged, !fieldDisabled && !open && state.field.invalidHover, !fieldDisabled && state.field.invalidFocusWithin, fieldDisabled ? state.disabled : state.text, className), children: [multiple ? (
|
|
202
243
|
/* The chips and the input wrap together, so a long selection grows the field downward
|
|
203
244
|
rather than squeezing the query. Base names the row a toolbar once it holds chips. */
|
|
204
245
|
jsxs(Combobox$1.Chips, { "aria-label": selectedOptions.length > 0 ? chipsLabel : undefined, className: cn("flex min-w-0 flex-1 flex-wrap items-center gap-1.5 py-2"), children: [selectedOptions.map((option) => (jsxs(Combobox$1.Chip, { "data-sui-value-chip": "", "aria-readonly": undefined,
|
|
205
246
|
// Without its dismiss target the chip ends on its copy, so it takes its start inset again.
|
|
206
|
-
className: cn(valueChipClassName, (readOnly || disabled) && "pe-3"), children: [jsx("span", { className: cn("min-w-0 truncate"), children: option.label }), !readOnly && !disabled && (jsx(Combobox$1.ChipRemove, {
|
|
247
|
+
className: cn(valueChipClassName, (readOnly || disabled) && "pe-3"), children: [jsx("span", { className: cn("min-w-0 truncate"), children: option.label }), !readOnly && !disabled && (jsx(Combobox$1.ChipRemove, { render: jsx(DismissButton, { label: copy.removeChip(option.label), size: "compact", inRow: true, className: cn(chipRemoveClassName) }) }))] }, option.value))), input(selectedOptions.length)] })) : (input(0)), jsx(Combobox$1.Clear
|
|
248
|
+
// Clearing changes the value, so a read-only control cannot offer it — which is Base's own
|
|
249
|
+
// reading of the same state, since its clear control refuses the press.
|
|
250
|
+
, {
|
|
207
251
|
// Clearing changes the value, so a read-only control cannot offer it — which is Base's own
|
|
208
252
|
// reading of the same state, since its clear control refuses the press.
|
|
209
|
-
disabled: disabled || readOnly,
|
|
253
|
+
disabled: disabled || readOnly, render: jsx(DismissButton, { label: multiple ? copy.clearAll : copy.clearSelection, size: "compact", inRow: true, className: cn(clearClassName) }) }), jsx(Combobox$1.Trigger, { "aria-label": copy.showOptions, "aria-busy": loading || undefined, className: cn(partClassName, "group"), children: loading ? (jsx(Spinner, { className: cn("size-5", text.high), size: "small" })) : (jsx(HugeiconsIcon, { icon: ArrowDown01Icon, "aria-hidden": "true", className: cn(iconStroke.glyph, "size-5", motionOrient, "group-data-[popup-open]:rotate-180") })) })] }), creatable && (
|
|
210
254
|
/* Mounted from the start so a screen reader is already listening when a paste or a refused
|
|
211
255
|
duplicate reports itself. Only the skipped entries are shown: the chips already show what
|
|
212
256
|
was added. While the list is open Base hides everything outside it from assistive
|
|
213
257
|
technology, so the same report is also made from inside the list (below). */
|
|
214
|
-
jsx("div", { role: "status", className: cn(notice.visible !== ""
|
|
258
|
+
jsx("div", { role: "status", className: cn(notice.visible !== "" ? fieldMessage.description : "absolute"), children: notice.announced === notice.visible ? (notice.visible) : (
|
|
215
259
|
// The spoken report is the fuller one; the visible line is not read a second time.
|
|
216
|
-
jsxs(Fragment, { children: [jsx("span", { "aria-hidden": "true", children: notice.visible }), jsx("span", { className: cn("sr-only"), children: notice.announced })] })) })), jsx(Combobox$1.Portal, { children: jsx(Combobox$1.Positioner, { side: "bottom", align: "start", sideOffset: 8, className: cn(stacking.float), children: jsxs(Combobox$1.Popup, { className: cn(list.sheet, "w-max min-w-[var(--anchor-width)] p-2", overlay.popup, motionPresenceAnchored), children: [creatable && (jsx(Combobox$1.Status, { className: cn("sr-only"), children: notice.announced })), jsx(Combobox$1.Empty, { children: jsx("div", { className: cn("px-
|
|
260
|
+
jsxs(Fragment, { children: [jsx("span", { "aria-hidden": "true", children: notice.visible }), jsx("span", { className: cn("sr-only"), children: notice.announced })] })) })), jsx(Combobox$1.Portal, { children: jsx(Combobox$1.Positioner, { side: "bottom", align: "start", sideOffset: 8, className: cn(stacking.float), children: jsxs(Combobox$1.Popup, { className: cn(list.sheet, "w-max min-w-[var(--anchor-width)] p-2", overlay.popup, motionPresenceAnchored, popupClassName), children: [creatable && (jsx(Combobox$1.Status, { className: cn("sr-only"), children: notice.announced })), jsx(Combobox$1.Empty, { children: jsx("div", { className: cn("px-3 py-3", type.body, text.medium), children: emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : (creatable ? "Type to add an entry." : copy.noResults) }) }), jsx(Combobox$1.List, { className: cn("space-y-1"), children: grouped
|
|
217
261
|
? (section) => (
|
|
218
262
|
/* A heading names the group it opens. A run of options outside every group is a
|
|
219
263
|
section without one, because the primitive reads a list as all groups or none. */
|