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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.cjs","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.cjs","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","cn","disclosure","_jsx","HugeiconsIcon","ArrowDown01Icon","iconStroke","motionOrient"],"mappings":"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"}
|
|
@@ -12,7 +12,17 @@ var utils = require('../libs/utils.cjs');
|
|
|
12
12
|
var ui_common = require('./ui.common.cjs');
|
|
13
13
|
var ui_motion = require('./ui.motion.cjs');
|
|
14
14
|
var optionGroups = require('./option-groups.cjs');
|
|
15
|
+
var DismissButton = require('./DismissButton.cjs');
|
|
16
|
+
var Spinner = require('./Spinner.cjs');
|
|
17
|
+
var Field = require('./Field.cjs');
|
|
15
18
|
|
|
19
|
+
const defaultComboboxLabels = {
|
|
20
|
+
removeChip: (label) => `Remove ${label}`,
|
|
21
|
+
clearAll: "Clear all",
|
|
22
|
+
clearSelection: "Clear selection",
|
|
23
|
+
showOptions: "Show options",
|
|
24
|
+
noResults: "No results found.",
|
|
25
|
+
};
|
|
16
26
|
const isCreateItem = (item) => item.create === true;
|
|
17
27
|
const sameText = (a, b) => a.localeCompare(b, undefined, { sensitivity: "accent" }) === 0;
|
|
18
28
|
/* The composite field's own controls are not standalone `IconButton`s: the field owns their
|
|
@@ -24,7 +34,7 @@ const sameText = (a, b) => a.localeCompare(b, undefined, { sensitivity: "accent"
|
|
|
24
34
|
a read-only combobox still opens and browses, only its value is fixed. The clear control is
|
|
25
35
|
handed its own `disabled` for that case because Base itself refuses to clear a read-only
|
|
26
36
|
control; nothing here has to be derived from Sherick's props. */
|
|
27
|
-
const partClassName = `inline-flex shrink-0 items-center justify-center ${ui_common.density.part} ${ui_common.shape.circle} ${ui_common.
|
|
37
|
+
const partClassName = `inline-flex shrink-0 items-center justify-center ${ui_common.density.part} ${ui_common.shape.circle} ${ui_common.state.quietInk} [&>svg]:size-5 ${ui_motion.motionFeedback} ${ui_common.stateLayer.fieldPart} ${ui_common.state.enabled} ${ui_common.state.disabledPart} ${ui_common.state.busy}`;
|
|
28
38
|
/* A chosen value inside the field is a held choice riding in the field's tray, so it is the tray's
|
|
29
39
|
puck: the brightest surface in the view, at `elevation.control`, with its copy at full emphasis. A
|
|
30
40
|
neutral tonal pill is the tray's own tone, and a row of them read as one grey band rather than as
|
|
@@ -33,12 +43,15 @@ const partClassName = `inline-flex shrink-0 items-center justify-center ${ui_com
|
|
|
33
43
|
resting height intact around one line of chips. Base gives a chip real focus while the arrow keys
|
|
34
44
|
walk the row, so the focused chip takes the inset ring — the one this chip is, inside the field's
|
|
35
45
|
own ring, which keeps marking the field as engaged. */
|
|
36
|
-
const valueChipClassName = utils.cn("inline-flex h-7 min-w-0 max-w-full items-center gap-0.5 ps-3 pe-0.5
|
|
46
|
+
const valueChipClassName = utils.cn("inline-flex h-7 min-w-0 max-w-full items-center gap-0.5 ps-3 pe-0.5 [outline-style:none]", ui_common.shape.pill, ui_common.type.label, ui_common.puck, ui_common.elevation.control, ui_common.text.high, ui_common.focusRingInset);
|
|
37
47
|
/* The dismiss target is a part of the chip the pointer is already in: 24px clears the pointer
|
|
38
|
-
minimum, its circle nests in the chip's pill at the chip's own 2px end inset, and the
|
|
39
|
-
it takes the press so the target never moves.
|
|
40
|
-
|
|
41
|
-
const chipRemoveClassName =
|
|
48
|
+
minimum, its circle nests in the chip's pill at the chip's own 2px end inset, and the 16px mark
|
|
49
|
+
inside it takes the press so the target never moves. `DismissButton` supplies the mark and the
|
|
50
|
+
quiet ink; these classes give it the chip's own geometry in place of the standalone 44px floor. */
|
|
51
|
+
const chipRemoveClassName = "size-6 min-h-0 min-w-0 shrink-0";
|
|
52
|
+
/* The clear control is one part of the field, so it keeps the part's 32px cluster and its 32px hover
|
|
53
|
+
circle, with the 16px dismiss mark inside it. */
|
|
54
|
+
const clearClassName = utils.cn(ui_common.density.part, ui_common.stateLayer.fieldPart, ui_common.state.enabled, ui_common.state.disabledPart);
|
|
42
55
|
/**
|
|
43
56
|
* A text field that filters a list of options and selects one of them, or several. It is the
|
|
44
57
|
* searchable sibling of `Select`: the same option shape, the same value contract and the same box,
|
|
@@ -51,7 +64,26 @@ const chipRemoveClassName = utils.cn("group inline-flex size-6 shrink-0 items-ce
|
|
|
51
64
|
*/
|
|
52
65
|
const Combobox = React.forwardRef((props, ref) => {
|
|
53
66
|
var _a, _b, _c;
|
|
54
|
-
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;
|
|
67
|
+
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;
|
|
68
|
+
const copy = { ...defaultComboboxLabels, ...labels };
|
|
69
|
+
/* The field's own box, so a chip that is removed can find the chips and the input that remain. */
|
|
70
|
+
const fieldRef = React.useRef(null);
|
|
71
|
+
/* Set when a chip is removed while it holds focus: focus then moves to the chip that takes its place,
|
|
72
|
+
or to the input when the last chip went. Applied after the new value has rendered. */
|
|
73
|
+
const focusAfterRemoval = React.useRef(null);
|
|
74
|
+
React.useEffect(() => {
|
|
75
|
+
var _a;
|
|
76
|
+
const index = focusAfterRemoval.current;
|
|
77
|
+
if (index === null)
|
|
78
|
+
return;
|
|
79
|
+
focusAfterRemoval.current = null;
|
|
80
|
+
const field = fieldRef.current;
|
|
81
|
+
if (!field)
|
|
82
|
+
return;
|
|
83
|
+
const chips = field.querySelectorAll("[data-sui-value-chip]");
|
|
84
|
+
const target = (_a = chips[index]) !== null && _a !== void 0 ? _a : field.querySelector("input");
|
|
85
|
+
target === null || target === void 0 ? void 0 : target.focus();
|
|
86
|
+
});
|
|
55
87
|
const flatOptions = optionGroups.flattenOptions(options);
|
|
56
88
|
const optionByValue = new Map(flatOptions.map((option) => [option.value, option]));
|
|
57
89
|
/* A value that is not among the options — a created entry — is shown under its own text. */
|
|
@@ -131,8 +163,8 @@ const Combobox = React.forwardRef((props, ref) => {
|
|
|
131
163
|
if (next !== "" && notice.announced !== "")
|
|
132
164
|
setNotice({ visible: "", announced: "" });
|
|
133
165
|
};
|
|
134
|
-
const renderItem = (option) => isCreateItem(option) ? (jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, className: utils.cn(ui_common.list.option, "justify-start gap-3"), children: [jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.PlusSignIcon, "aria-hidden": "true", className: utils.cn("size-4 shrink-0", ui_common.tone.text.primary) }), jsxRuntime.jsx("span", { className: utils.cn("min-w-0 flex-1 truncate"), children: createLabel(option.label) })] }, "sui-create")) : (jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, disabled: option.disabled, className: ({ selected: isSelected }) => utils.cn(ui_common.list.option, isSelected && utils.cn(ui_common.tone.selected.primary, ui_common.elevation.control)), children: [jsxRuntime.jsx("span", { className: utils.cn("min-w-0 flex-1 truncate"), children: option.label }), jsxRuntime.jsx(combobox.Combobox.ItemIndicator, { children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.Tick02Icon, "aria-hidden": "true", className: utils.cn("size-4", ui_motion.motionArrive, ui_common.tone.text.primary) }) })] }, option.value));
|
|
135
|
-
const input = (chosenCount) => (jsxRuntime.jsx(combobox.Combobox.Input, { ref: ref, placeholder: chosenCount > 0 ? undefined : placeholder, onPaste: handlePaste, className: utils.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") }));
|
|
166
|
+
const renderItem = (option) => isCreateItem(option) ? (jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, className: utils.cn(ui_common.list.option, "justify-start gap-3"), children: [jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.PlusSignIcon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-4 shrink-0", ui_common.tone.text.primary) }), jsxRuntime.jsx("span", { className: utils.cn("min-w-0 flex-1 truncate"), children: createLabel(option.label) })] }, "sui-create")) : (jsxRuntime.jsxs(combobox.Combobox.Item, { value: option, disabled: option.disabled, className: ({ selected: isSelected }) => utils.cn(ui_common.list.option, isSelected && utils.cn(ui_common.tone.selected.primary, ui_common.elevation.control)), children: [jsxRuntime.jsx("span", { className: utils.cn("min-w-0 flex-1 truncate"), children: option.label }), jsxRuntime.jsx(combobox.Combobox.ItemIndicator, { children: jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.Tick02Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-4", ui_motion.motionArrive, ui_common.tone.text.primary) }) })] }, option.value));
|
|
167
|
+
const input = (chosenCount) => (jsxRuntime.jsx(combobox.Combobox.Input, { ref: ref, placeholder: chosenCount > 0 ? undefined : placeholder, onPaste: handlePaste, className: utils.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") }));
|
|
136
168
|
const selectedOptions = values.map(toOption);
|
|
137
169
|
/* Base types its single and multiple roots as two different components; the value contract is
|
|
138
170
|
chosen here, once, and the rest of the root is shared. */
|
|
@@ -141,6 +173,7 @@ const Combobox = React.forwardRef((props, ref) => {
|
|
|
141
173
|
multiple: true,
|
|
142
174
|
value: selectedOptions,
|
|
143
175
|
onValueChange: (next, eventDetails) => {
|
|
176
|
+
var _a, _b, _c, _d;
|
|
144
177
|
const created = next.find(isCreateItem);
|
|
145
178
|
const removed = values.filter((chosen) => !next.some((option) => option.value === chosen));
|
|
146
179
|
const added = next.filter((option) => !values.includes(option.value));
|
|
@@ -167,7 +200,15 @@ const Combobox = React.forwardRef((props, ref) => {
|
|
|
167
200
|
flagNotice(0, [trimmedQuery]);
|
|
168
201
|
return;
|
|
169
202
|
}
|
|
203
|
+
/* A chip removed while it holds focus would take focus with it, so the request is recorded here
|
|
204
|
+
and applied once the chip is gone. A chip that was not focused leaves focus where it was. */
|
|
205
|
+
const removedIndex = removed.length === 1 ? values.indexOf(removed[0]) : -1;
|
|
206
|
+
const focusedChip = (_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest("[data-sui-value-chip]")) !== null && _b !== void 0 ? _b : null;
|
|
207
|
+
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 : []);
|
|
170
208
|
const applied = commitValues(next.map((option) => option.value), eventDetails);
|
|
209
|
+
if (applied && removedIndex >= 0 && focusedChip !== null && chipsNow[removedIndex] === focusedChip) {
|
|
210
|
+
focusAfterRemoval.current = removedIndex;
|
|
211
|
+
}
|
|
171
212
|
if (applied && created) {
|
|
172
213
|
/* Base keeps the typed filter while the list stays open, so several matches can be
|
|
173
214
|
chosen from one query. A created entry used the query up, so it starts over. */
|
|
@@ -194,7 +235,7 @@ const Combobox = React.forwardRef((props, ref) => {
|
|
|
194
235
|
the next can be chosen without reopening it. Escape, Tab and a press outside still close. */
|
|
195
236
|
if (multiple && !open && eventDetails.reason === "item-press")
|
|
196
237
|
eventDetails.cancel();
|
|
197
|
-
}, disabled: disabled, readOnly: readOnly, children: [jsxRuntime.jsxs(combobox.Combobox.InputGroup, { className: ({ open, disabled: fieldDisabled }) => utils.cn(
|
|
238
|
+
}, disabled: disabled, readOnly: readOnly, children: [jsxRuntime.jsxs(combobox.Combobox.InputGroup, { ref: fieldRef, className: ({ open, disabled: fieldDisabled }) => utils.cn(
|
|
198
239
|
/* The field's own inline padding is what places the trailing cluster, and it is set on the
|
|
199
240
|
logical ends so the cluster stays at the field's end in either writing direction. The
|
|
200
241
|
20px a mark's box then sits from the edge — 14px of padding plus the 6px each `density.part`
|
|
@@ -202,22 +243,25 @@ const Combobox = React.forwardRef((props, ref) => {
|
|
|
202
243
|
field reads with one inset at both ends. Once chips lead the field, its start inset
|
|
203
244
|
drops to the chips' own block inset, so the first pill sits as far from the field's
|
|
204
245
|
start as from its top. */
|
|
205
|
-
"group/field flex min-w-0 w-full items-center ps-5 pe-3.5", multiple && "has-[[data-sui-value-chip]]:ps-2.5",
|
|
246
|
+
"group/field flex min-w-0 w-full items-center ps-5 pe-3.5", multiple && "has-[[data-sui-value-chip]]:ps-2.5", Field.fieldDensity[size], ui_common.shape.control, ui_common.material.control, ui_common.rim.field, ui_motion.motionTactileField, ui_common.focusRingWithin, !fieldDisabled && !open && ui_common.state.field.hover, !fieldDisabled && ui_common.state.field.focusWithin, open && ui_common.state.field.engaged, ui_common.state.field.invalid, open && ui_common.state.field.invalidEngaged, !fieldDisabled && !open && ui_common.state.field.invalidHover, !fieldDisabled && ui_common.state.field.invalidFocusWithin, fieldDisabled ? ui_common.state.disabled : ui_common.state.text, className), children: [multiple ? (
|
|
206
247
|
/* The chips and the input wrap together, so a long selection grows the field downward
|
|
207
248
|
rather than squeezing the query. Base names the row a toolbar once it holds chips. */
|
|
208
249
|
jsxRuntime.jsxs(combobox.Combobox.Chips, { "aria-label": selectedOptions.length > 0 ? chipsLabel : undefined, className: utils.cn("flex min-w-0 flex-1 flex-wrap items-center gap-1.5 py-2"), children: [selectedOptions.map((option) => (jsxRuntime.jsxs(combobox.Combobox.Chip, { "data-sui-value-chip": "", "aria-readonly": undefined,
|
|
209
250
|
// Without its dismiss target the chip ends on its copy, so it takes its start inset again.
|
|
210
|
-
className: utils.cn(valueChipClassName, (readOnly || disabled) && "pe-3"), children: [jsxRuntime.jsx("span", { className: utils.cn("min-w-0 truncate"), children: option.label }), !readOnly && !disabled && (jsxRuntime.jsx(combobox.Combobox.ChipRemove, {
|
|
251
|
+
className: utils.cn(valueChipClassName, (readOnly || disabled) && "pe-3"), children: [jsxRuntime.jsx("span", { className: utils.cn("min-w-0 truncate"), children: option.label }), !readOnly && !disabled && (jsxRuntime.jsx(combobox.Combobox.ChipRemove, { render: jsxRuntime.jsx(DismissButton.default, { label: copy.removeChip(option.label), size: "compact", inRow: true, className: utils.cn(chipRemoveClassName) }) }))] }, option.value))), input(selectedOptions.length)] })) : (input(0)), jsxRuntime.jsx(combobox.Combobox.Clear
|
|
252
|
+
// Clearing changes the value, so a read-only control cannot offer it — which is Base's own
|
|
253
|
+
// reading of the same state, since its clear control refuses the press.
|
|
254
|
+
, {
|
|
211
255
|
// Clearing changes the value, so a read-only control cannot offer it — which is Base's own
|
|
212
256
|
// reading of the same state, since its clear control refuses the press.
|
|
213
|
-
disabled: disabled || readOnly,
|
|
257
|
+
disabled: disabled || readOnly, render: jsxRuntime.jsx(DismissButton.default, { label: multiple ? copy.clearAll : copy.clearSelection, size: "compact", inRow: true, className: utils.cn(clearClassName) }) }), jsxRuntime.jsx(combobox.Combobox.Trigger, { "aria-label": copy.showOptions, "aria-busy": loading || undefined, className: utils.cn(partClassName, "group"), children: loading ? (jsxRuntime.jsx(Spinner.Spinner, { className: utils.cn("size-5", ui_common.text.high), size: "small" })) : (jsxRuntime.jsx(react.HugeiconsIcon, { icon: coreFreeIcons.ArrowDown01Icon, "aria-hidden": "true", className: utils.cn(ui_common.iconStroke.glyph, "size-5", ui_motion.motionOrient, "group-data-[popup-open]:rotate-180") })) })] }), creatable && (
|
|
214
258
|
/* Mounted from the start so a screen reader is already listening when a paste or a refused
|
|
215
259
|
duplicate reports itself. Only the skipped entries are shown: the chips already show what
|
|
216
260
|
was added. While the list is open Base hides everything outside it from assistive
|
|
217
261
|
technology, so the same report is also made from inside the list (below). */
|
|
218
|
-
jsxRuntime.jsx("div", { role: "status", className: utils.cn(notice.visible !== ""
|
|
262
|
+
jsxRuntime.jsx("div", { role: "status", className: utils.cn(notice.visible !== "" ? ui_common.fieldMessage.description : "absolute"), children: notice.announced === notice.visible ? (notice.visible) : (
|
|
219
263
|
// The spoken report is the fuller one; the visible line is not read a second time.
|
|
220
|
-
jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { "aria-hidden": "true", children: notice.visible }), jsxRuntime.jsx("span", { className: utils.cn("sr-only"), children: notice.announced })] })) })), jsxRuntime.jsx(combobox.Combobox.Portal, { children: jsxRuntime.jsx(combobox.Combobox.Positioner, { side: "bottom", align: "start", sideOffset: 8, className: utils.cn(ui_common.stacking.float), children: jsxRuntime.jsxs(combobox.Combobox.Popup, { className: utils.cn(ui_common.list.sheet, "w-max min-w-[var(--anchor-width)] p-2", ui_common.overlay.popup, ui_motion.motionPresenceAnchored), children: [creatable && (jsxRuntime.jsx(combobox.Combobox.Status, { className: utils.cn("sr-only"), children: notice.announced })), jsxRuntime.jsx(combobox.Combobox.Empty, { children: jsxRuntime.jsx("div", { className: utils.cn("px-
|
|
264
|
+
jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { "aria-hidden": "true", children: notice.visible }), jsxRuntime.jsx("span", { className: utils.cn("sr-only"), children: notice.announced })] })) })), jsxRuntime.jsx(combobox.Combobox.Portal, { children: jsxRuntime.jsx(combobox.Combobox.Positioner, { side: "bottom", align: "start", sideOffset: 8, className: utils.cn(ui_common.stacking.float), children: jsxRuntime.jsxs(combobox.Combobox.Popup, { className: utils.cn(ui_common.list.sheet, "w-max min-w-[var(--anchor-width)] p-2", ui_common.overlay.popup, ui_motion.motionPresenceAnchored, popupClassName), children: [creatable && (jsxRuntime.jsx(combobox.Combobox.Status, { className: utils.cn("sr-only"), children: notice.announced })), jsxRuntime.jsx(combobox.Combobox.Empty, { children: jsxRuntime.jsx("div", { className: utils.cn("px-3 py-3", ui_common.type.body, ui_common.text.medium), children: emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : (creatable ? "Type to add an entry." : copy.noResults) }) }), jsxRuntime.jsx(combobox.Combobox.List, { className: utils.cn("space-y-1"), children: grouped
|
|
221
265
|
? (section) => (
|
|
222
266
|
/* A heading names the group it opens. A run of options outside every group is a
|
|
223
267
|
section without one, because the primitive reads a list as all groups or none. */
|