@sixthshift/design-system 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -28
- package/dist/components/Badge/Badge.d.ts +5 -2
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +5 -3
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/BarChart/BarChart.d.ts +8 -2
- package/dist/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/components/BarChart/BarChart.js +5 -3
- package/dist/components/BarChart/BarChart.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts +17 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +80 -225
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/CalendarView.d.ts +15 -0
- package/dist/components/Calendar/CalendarView.d.ts.map +1 -0
- package/dist/components/Calendar/CalendarView.js +255 -0
- package/dist/components/Calendar/CalendarView.js.map +1 -0
- package/dist/components/Calendar/calendar.types.d.ts +78 -27
- package/dist/components/Calendar/calendar.types.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.types.js +10 -3
- package/dist/components/Calendar/calendar.types.js.map +1 -1
- package/dist/components/Calendar/index.d.ts +16 -2
- package/dist/components/Calendar/index.d.ts.map +1 -1
- package/dist/components/Calendar/index.js +15 -1
- package/dist/components/Calendar/index.js.map +1 -1
- package/dist/components/ColorDot/ColorDot.d.ts +9 -3
- package/dist/components/ColorDot/ColorDot.d.ts.map +1 -1
- package/dist/components/ColorDot/ColorDot.js +5 -3
- package/dist/components/ColorDot/ColorDot.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +2 -2
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.js +65 -10
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DatePicker/datepicker.types.d.ts +34 -36
- package/dist/components/DatePicker/datepicker.types.d.ts.map +1 -1
- package/dist/components/DatePicker/datepicker.types.js +5 -3
- package/dist/components/DatePicker/datepicker.types.js.map +1 -1
- package/dist/components/DatePicker/index.d.ts +10 -1
- package/dist/components/DatePicker/index.d.ts.map +1 -1
- package/dist/components/DatePicker/index.js +8 -0
- package/dist/components/DatePicker/index.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +3 -2
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +17 -21
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts +20 -20
- package/dist/components/DateRangePicker/daterangepicker.types.d.ts.map +1 -1
- package/dist/components/DateRangePicker/daterangepicker.types.js +6 -0
- package/dist/components/DateRangePicker/daterangepicker.types.js.map +1 -1
- package/dist/components/DateRangePicker/index.d.ts +8 -1
- package/dist/components/DateRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateRangePicker/index.js +6 -0
- package/dist/components/DateRangePicker/index.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.d.ts +3 -3
- package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js +30 -12
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts +20 -17
- package/dist/components/DateTimePicker/datetimepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimePicker/datetimepicker.types.js +10 -0
- package/dist/components/DateTimePicker/datetimepicker.types.js.map +1 -1
- package/dist/components/DateTimePicker/index.d.ts +8 -1
- package/dist/components/DateTimePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimePicker/index.js +6 -0
- package/dist/components/DateTimePicker/index.js.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts +3 -3
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js +41 -20
- package/dist/components/DateTimeRangePicker/DateTimeRangePicker.js.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts +22 -18
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js +8 -0
- package/dist/components/DateTimeRangePicker/datetimerangepicker.types.js.map +1 -1
- package/dist/components/DateTimeRangePicker/index.d.ts +8 -0
- package/dist/components/DateTimeRangePicker/index.d.ts.map +1 -1
- package/dist/components/DateTimeRangePicker/index.js +7 -0
- package/dist/components/DateTimeRangePicker/index.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.d.ts +16 -5
- package/dist/components/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/components/EmptyState/EmptyState.js +5 -3
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/Field/Field.d.ts +3 -3
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/Field.js +6 -4
- package/dist/components/Field/Field.js.map +1 -1
- package/dist/components/LineChart/LineChart.d.ts +18 -2
- package/dist/components/LineChart/LineChart.d.ts.map +1 -1
- package/dist/components/LineChart/LineChart.js +5 -3
- package/dist/components/LineChart/LineChart.js.map +1 -1
- package/dist/components/Markdown/Markdown.d.ts +2 -4
- package/dist/components/Markdown/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown/Markdown.js +3 -2
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Message/Message.d.ts.map +1 -1
- package/dist/components/Message/Message.js +16 -1
- package/dist/components/Message/Message.js.map +1 -1
- package/dist/components/MetricList/MetricList.d.ts +3 -3
- package/dist/components/MetricList/MetricList.d.ts.map +1 -1
- package/dist/components/MetricList/MetricList.js +5 -3
- package/dist/components/MetricList/MetricList.js.map +1 -1
- package/dist/components/Modal/Modal.d.ts +24 -5
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +16 -6
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/components/ModalContext.d.ts +14 -0
- package/dist/components/Modal/components/ModalContext.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalContext.js.map +1 -1
- package/dist/components/Modal/components/ModalHeader.d.ts.map +1 -1
- package/dist/components/Modal/components/ModalHeader.js +13 -2
- package/dist/components/Modal/components/ModalHeader.js.map +1 -1
- package/dist/components/NavBottom/NavBottom.d.ts +2 -1
- package/dist/components/NavBottom/NavBottom.d.ts.map +1 -1
- package/dist/components/NavBottom/NavBottom.js +6 -4
- package/dist/components/NavBottom/NavBottom.js.map +1 -1
- package/dist/components/NavSide/NavItem.js +1 -1
- package/dist/components/NavSide/NavItem.js.map +1 -1
- package/dist/components/NavSide/NavSide.d.ts +2 -1
- package/dist/components/NavSide/NavSide.d.ts.map +1 -1
- package/dist/components/NavSide/NavSide.js +5 -3
- package/dist/components/NavSide/NavSide.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js +7 -0
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/components/PopoverBody.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverBody.js +5 -2
- package/dist/components/Popover/components/PopoverBody.js.map +1 -1
- package/dist/components/Popover/components/PopoverContext.d.ts +1 -0
- package/dist/components/Popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverContext.js.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.d.ts.map +1 -1
- package/dist/components/Popover/components/PopoverTrigger.js +2 -2
- package/dist/components/Popover/components/PopoverTrigger.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts +2 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +5 -3
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/Select/Select.d.ts +11 -2
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +64 -18
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/SelectDropdown.d.ts +14 -2
- package/dist/components/Select/SelectDropdown.d.ts.map +1 -1
- package/dist/components/Select/SelectDropdown.js +19 -4
- package/dist/components/Select/SelectDropdown.js.map +1 -1
- package/dist/components/Select/SelectTrigger.d.ts +10 -3
- package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
- package/dist/components/Select/SelectTrigger.js +12 -3
- package/dist/components/Select/SelectTrigger.js.map +1 -1
- package/dist/components/Select/useSelectKeyboard.d.ts +15 -1
- package/dist/components/Select/useSelectKeyboard.d.ts.map +1 -1
- package/dist/components/Select/useSelectKeyboard.js +73 -65
- package/dist/components/Select/useSelectKeyboard.js.map +1 -1
- package/dist/components/Sheet/Sheet.d.ts +19 -5
- package/dist/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/components/Sheet/Sheet.js +18 -6
- package/dist/components/Sheet/Sheet.js.map +1 -1
- package/dist/components/Sheet/components/SheetContext.d.ts +10 -0
- package/dist/components/Sheet/components/SheetContext.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetContext.js.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.d.ts.map +1 -1
- package/dist/components/Sheet/components/SheetHeader.js +11 -2
- package/dist/components/Sheet/components/SheetHeader.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts +2 -1
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +5 -3
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.d.ts +10 -2
- package/dist/components/Sparkline/Sparkline.d.ts.map +1 -1
- package/dist/components/Sparkline/Sparkline.js +5 -3
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/StatsCard/StatsCard.d.ts +4 -4
- package/dist/components/StatsCard/StatsCard.d.ts.map +1 -1
- package/dist/components/StatsCard/StatsCard.js +5 -3
- package/dist/components/StatsCard/StatsCard.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +2 -2
- package/dist/components/Tabs/components/TabsList.d.ts +1 -1
- package/dist/components/Tabs/components/TabsList.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsList.js +5 -4
- package/dist/components/Tabs/components/TabsList.js.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts +1 -1
- package/dist/components/Tabs/components/TabsPanels.d.ts.map +1 -1
- package/dist/components/Tabs/components/TabsPanels.js +5 -3
- package/dist/components/Tabs/components/TabsPanels.js.map +1 -1
- package/dist/components/TagChip/TagChip.d.ts +2 -1
- package/dist/components/TagChip/TagChip.d.ts.map +1 -1
- package/dist/components/TagChip/TagChip.js +5 -3
- package/dist/components/TagChip/TagChip.js.map +1 -1
- package/dist/components/TagInput/TagInput.d.ts +1 -1
- package/dist/components/TagInput/TagInput.d.ts.map +1 -1
- package/dist/components/TagInput/TagInput.js +5 -4
- package/dist/components/TagInput/TagInput.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.d.ts +2 -2
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -1
- package/dist/components/TimePicker/TimePicker.js +27 -11
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/timepicker.types.d.ts +14 -13
- package/dist/components/TimePicker/timepicker.types.d.ts.map +1 -1
- package/dist/components/TimePicker/timepicker.types.js +4 -3
- package/dist/components/TimePicker/timepicker.types.js.map +1 -1
- package/dist/date-time/index.d.ts +2 -0
- package/dist/date-time/index.d.ts.map +1 -1
- package/dist/date-time/index.js +9 -0
- package/dist/date-time/index.js.map +1 -1
- package/dist/date-time/iso.d.ts +261 -0
- package/dist/date-time/iso.d.ts.map +1 -0
- package/dist/date-time/iso.js +358 -0
- package/dist/date-time/iso.js.map +1 -0
- package/dist/date-time/now.d.ts +7 -6
- package/dist/date-time/now.d.ts.map +1 -1
- package/dist/date-time/now.js +3 -3
- package/dist/date-time/now.js.map +1 -1
- package/dist/theme/index.d.ts +4 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +3 -2
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/schema.d.ts +70 -32
- package/dist/theme/schema.d.ts.map +1 -1
- package/dist/theme/schema.js +36 -18
- package/dist/theme/schema.js.map +1 -1
- package/package.json +9 -15
- package/src/components/Badge/Badge.tsx +5 -4
- package/src/components/BarChart/BarChart.tsx +25 -30
- package/src/components/Calendar/Calendar.tsx +91 -401
- package/src/components/Calendar/CalendarView.tsx +445 -0
- package/src/components/Calendar/calendar.types.ts +94 -29
- package/src/components/Calendar/index.ts +16 -17
- package/src/components/ColorDot/ColorDot.tsx +6 -4
- package/src/components/DatePicker/DatePicker.tsx +92 -16
- package/src/components/DatePicker/datepicker.types.ts +38 -39
- package/src/components/DatePicker/index.ts +11 -10
- package/src/components/DateRangePicker/DateRangePicker.tsx +17 -21
- package/src/components/DateRangePicker/daterangepicker.types.ts +22 -22
- package/src/components/DateRangePicker/index.ts +9 -1
- package/src/components/DateTimePicker/DateTimePicker.tsx +46 -18
- package/src/components/DateTimePicker/datetimepicker.types.ts +22 -18
- package/src/components/DateTimePicker/index.ts +9 -1
- package/src/components/DateTimeRangePicker/DateTimeRangePicker.tsx +62 -28
- package/src/components/DateTimeRangePicker/datetimerangepicker.types.ts +24 -19
- package/src/components/DateTimeRangePicker/index.ts +9 -0
- package/src/components/EmptyState/EmptyState.tsx +8 -7
- package/src/components/Field/Field.tsx +7 -6
- package/src/components/LineChart/LineChart.tsx +147 -141
- package/src/components/Markdown/Markdown.tsx +4 -3
- package/src/components/Message/Message.tsx +17 -1
- package/src/components/MetricList/MetricList.tsx +10 -5
- package/src/components/Modal/Modal.tsx +119 -87
- package/src/components/Modal/components/ModalContext.tsx +14 -0
- package/src/components/Modal/components/ModalHeader.tsx +14 -2
- package/src/components/NavBottom/NavBottom.tsx +6 -4
- package/src/components/NavSide/NavItem.tsx +1 -1
- package/src/components/NavSide/NavSide.tsx +5 -3
- package/src/components/Popover/Popover.tsx +7 -0
- package/src/components/Popover/components/PopoverBody.tsx +6 -1
- package/src/components/Popover/components/PopoverContext.tsx +1 -0
- package/src/components/Popover/components/PopoverTrigger.tsx +2 -1
- package/src/components/ProgressBar/ProgressBar.tsx +32 -28
- package/src/components/Select/Select.tsx +76 -19
- package/src/components/Select/SelectDropdown.tsx +32 -3
- package/src/components/Select/SelectTrigger.tsx +26 -3
- package/src/components/Select/useSelectKeyboard.ts +20 -10
- package/src/components/Sheet/Sheet.tsx +108 -83
- package/src/components/Sheet/components/SheetContext.tsx +10 -0
- package/src/components/Sheet/components/SheetHeader.tsx +17 -2
- package/src/components/Skeleton/Skeleton.tsx +5 -3
- package/src/components/Sparkline/Sparkline.tsx +29 -36
- package/src/components/StatsCard/StatsCard.tsx +7 -6
- package/src/components/Tabs/components/TabsList.tsx +5 -3
- package/src/components/Tabs/components/TabsPanels.tsx +5 -3
- package/src/components/TagChip/TagChip.tsx +10 -3
- package/src/components/TagInput/TagInput.tsx +5 -3
- package/src/components/TimePicker/TimePicker.tsx +31 -13
- package/src/components/TimePicker/timepicker.types.ts +14 -13
- package/src/date-time/index.ts +61 -0
- package/src/date-time/iso.ts +511 -0
- package/src/date-time/now.ts +10 -9
- package/src/theme/index.ts +11 -3
- package/src/theme/schema.ts +82 -54
- package/src/theme/tokens.css +807 -0
- package/dist/styles.css +0 -2
- package/dist/theme.generated.css +0 -438
- package/src/styles/base.css +0 -41
- package/src/theme/palette.json +0 -100
- package/src/theme/palette.schema.json +0 -40
- package/src/theme/theme.json +0 -349
- package/src/theme/theme.schema.json +0 -876
- package/src/theme/typography.json +0 -7
- package/src/theme/typography.schema.json +0 -36
- package/tailwind.config.ts +0 -261
|
@@ -4,7 +4,10 @@ import { cn } from "@sixthshift/design-system/utils";
|
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { usePopoverContext } from "./PopoverContext.js";
|
|
6
6
|
export const PopoverBody = React.forwardRef(({ className, children, ...props }, forwardedRef) => {
|
|
7
|
-
const { open, refs, floatingStyles, getFloatingProps, contentId } = usePopoverContext();
|
|
7
|
+
const { open, refs, floatingStyles, getFloatingProps, contentId, triggerId } = usePopoverContext();
|
|
8
|
+
// `aria-labelledby` outranks `aria-label` in the name computation, so the
|
|
9
|
+
// trigger only names the dialog when the caller hasn't named it themselves.
|
|
10
|
+
const hasOwnLabel = props["aria-label"] !== undefined || props["aria-labelledby"] !== undefined;
|
|
8
11
|
if (!open)
|
|
9
12
|
return null;
|
|
10
13
|
return (_jsx(FloatingPortal, { children: _jsx("div", { ref: (node) => {
|
|
@@ -13,7 +16,7 @@ export const PopoverBody = React.forwardRef(({ className, children, ...props },
|
|
|
13
16
|
forwardedRef(node);
|
|
14
17
|
else if (forwardedRef)
|
|
15
18
|
forwardedRef.current = node;
|
|
16
|
-
}, id: contentId, role: "dialog", style: floatingStyles, className: cn("z-popover rounded-lg border border-border-normal bg-bg-normal p-4 shadow-lg", className), ...getFloatingProps(props), children: children }) }));
|
|
19
|
+
}, id: contentId, role: "dialog", "aria-labelledby": hasOwnLabel ? undefined : triggerId, style: floatingStyles, className: cn("z-popover rounded-lg border border-border-normal bg-bg-normal p-4 shadow-lg", className), ...getFloatingProps(props), children: children }) }));
|
|
17
20
|
});
|
|
18
21
|
PopoverBody.displayName = "PopoverBody";
|
|
19
22
|
//# sourceMappingURL=PopoverBody.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverBody.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverBody.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAmC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE;IAChI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PopoverBody.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverBody.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAmC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE;IAChI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAEnG,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,SAAS,CAAC;IAEhG,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,OAAO,CACL,KAAC,cAAc,cACb,cACE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,OAAO,YAAY,KAAK,UAAU;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAC;qBACtD,IAAI,YAAY;oBAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;YACrD,CAAC,EACD,EAAE,EAAE,SAAS,EACb,IAAI,EAAC,QAAQ,qBACI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACpD,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,EAAE,CAAC,6EAA6E,EAAE,SAAS,CAAC,KACnG,gBAAgB,CAAC,KAAK,CAAC,YAE1B,QAAQ,GACL,GACS,CAClB,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
|
|
@@ -9,6 +9,7 @@ export type PopoverContextValue = {
|
|
|
9
9
|
getReferenceProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
10
10
|
getFloatingProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
|
|
11
11
|
contentId: string;
|
|
12
|
+
triggerId: string;
|
|
12
13
|
};
|
|
13
14
|
export declare const PopoverContext: import("react").Context<PopoverContextValue | null>;
|
|
14
15
|
export declare function usePopoverContext(): PopoverContextValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverContext.d.ts","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverContext.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;QACjD,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;KACjD,CAAC;IACF,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IACpC,iBAAiB,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrF,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpF,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc,qDAAkD,CAAC;AAE9E,wBAAgB,iBAAiB,wBAMhC"}
|
|
1
|
+
{"version":3,"file":"PopoverContext.d.ts","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverContext.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;QACjD,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;KACjD,CAAC;IACF,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IACpC,iBAAiB,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrF,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc,qDAAkD,CAAC;AAE9E,wBAAgB,iBAAiB,wBAMhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverContext.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PopoverContext.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAgBlD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAE9E,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverTrigger.d.ts","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverTrigger.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChF,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc;IAJzB,8BAA8B;cACpB,OAAO;
|
|
1
|
+
{"version":3,"file":"PopoverTrigger.d.ts","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverTrigger.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAChF,8BAA8B;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc;IAJzB,8BAA8B;cACpB,OAAO;2CAwBjB,CAAC"}
|
|
@@ -3,7 +3,7 @@ import * as React from "react";
|
|
|
3
3
|
import { Slot } from "../../../internal/Slot.js";
|
|
4
4
|
import { usePopoverContext } from "./PopoverContext.js";
|
|
5
5
|
export const PopoverTrigger = React.forwardRef(({ asChild = false, children, ...props }, forwardedRef) => {
|
|
6
|
-
const { refs, getReferenceProps, contentId, open } = usePopoverContext();
|
|
6
|
+
const { refs, getReferenceProps, contentId, triggerId, open } = usePopoverContext();
|
|
7
7
|
const Comp = asChild ? Slot : "button";
|
|
8
8
|
return (_jsx(Comp, { ref: (node) => {
|
|
9
9
|
refs.setReference(node);
|
|
@@ -11,7 +11,7 @@ export const PopoverTrigger = React.forwardRef(({ asChild = false, children, ...
|
|
|
11
11
|
forwardedRef(node);
|
|
12
12
|
else if (forwardedRef)
|
|
13
13
|
forwardedRef.current = node;
|
|
14
|
-
}, type: asChild ? undefined : "button", "aria-haspopup": "dialog", "aria-expanded": open, "aria-controls": open ? contentId : undefined, ...getReferenceProps(props), children: children }));
|
|
14
|
+
}, type: asChild ? undefined : "button", id: triggerId, "aria-haspopup": "dialog", "aria-expanded": open, "aria-controls": open ? contentId : undefined, ...getReferenceProps(props), children: children }));
|
|
15
15
|
});
|
|
16
16
|
PopoverTrigger.displayName = "PopoverTrigger";
|
|
17
17
|
//# sourceMappingURL=PopoverTrigger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverTrigger.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverTrigger.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAyC,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE;IAC/I,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PopoverTrigger.js","sourceRoot":"","sources":["../../../../src/components/Popover/components/PopoverTrigger.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAyC,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE;IAC/I,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEvC,OAAO,CACL,KAAC,IAAI,IACH,GAAG,EAAE,CAAC,IAA8B,EAAE,EAAE;YACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,OAAO,YAAY,KAAK,UAAU;gBAAE,YAAY,CAAC,IAAI,CAAC,CAAC;iBACtD,IAAI,YAAY;gBAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QACrD,CAAC,EACD,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EACpC,EAAE,EAAE,SAAS,mBACC,QAAQ,mBACP,IAAI,mBACJ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KACvC,iBAAiB,CAAC,KAAK,CAAC,YAE3B,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as React from "react";
|
|
1
2
|
export type ProgressBarProps = {
|
|
2
3
|
completed: number;
|
|
3
4
|
total: number;
|
|
@@ -6,5 +7,5 @@ export type ProgressBarProps = {
|
|
|
6
7
|
label?: string;
|
|
7
8
|
className?: string;
|
|
8
9
|
};
|
|
9
|
-
export declare const ProgressBar:
|
|
10
|
+
export declare const ProgressBar: React.ForwardRefExoticComponent<ProgressBarProps & React.RefAttributes<HTMLDivElement>>;
|
|
10
11
|
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,WAAW,yFA+BvB,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Caption } from "@sixthshift/design-system/caption";
|
|
3
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
|
-
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
export const ProgressBar = React.forwardRef(({ completed, total, showFraction = true, label = "Progress", className }, ref) => {
|
|
5
6
|
// A caller can hand us anything; the bar must not render an out-of-range
|
|
6
7
|
// width (a negative `width` is invalid CSS) or report impossible progress.
|
|
7
8
|
const isMeasurable = total > 0;
|
|
8
9
|
const clamped = isMeasurable ? Math.min(Math.max(completed, 0), total) : 0;
|
|
9
10
|
const percentage = isMeasurable ? (clamped / total) * 100 : 0;
|
|
10
|
-
return (_jsxs("div", { className: cn("flex items-center gap-3", className), children: [_jsx("div", { role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": isMeasurable ? total : undefined, "aria-valuenow": isMeasurable ? clamped : undefined, "aria-valuetext": isMeasurable ? `${clamped} of ${total}` : undefined, className: "h-2 flex-1 overflow-hidden rounded-full bg-bg-strong", children: _jsx("div", { className: "h-full rounded-full bg-fg-success transition-all", style: { width: `${percentage}%` } }) }), showFraction && (_jsxs(Caption, { className: "shrink-0", children: [completed, "/", total] }))] }));
|
|
11
|
-
};
|
|
11
|
+
return (_jsxs("div", { ref: ref, className: cn("flex items-center gap-3", className), children: [_jsx("div", { role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": isMeasurable ? total : undefined, "aria-valuenow": isMeasurable ? clamped : undefined, "aria-valuetext": isMeasurable ? `${clamped} of ${total}` : undefined, className: "h-2 flex-1 overflow-hidden rounded-full bg-bg-strong", children: _jsx("div", { className: "h-full rounded-full bg-fg-success transition-all", style: { width: `${percentage}%` } }) }), showFraction && (_jsxs(Caption, { className: "shrink-0", children: [completed, "/", total] }))] }));
|
|
12
|
+
});
|
|
13
|
+
ProgressBar.displayName = "ProgressBar";
|
|
12
14
|
//# sourceMappingURL=ProgressBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"ProgressBar.js","sourceRoot":"","sources":["../../../src/components/ProgressBar/ProgressBar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CACzC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,KAAK,GAAG,UAAU,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE;IAChF,yEAAyE;IACzE,2EAA2E;IAC3E,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,eAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,aAChE,cACE,IAAI,EAAC,aAAa,gBACN,KAAK,mBACF,CAAC,mBACD,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,mBAGhC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,oBACjC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,EACnE,SAAS,EAAC,sDAAsD,YAEhE,cAAK,SAAS,EAAC,kDAAkD,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,EAAE,GAAI,GACpG,EACL,YAAY,IAAI,CACf,MAAC,OAAO,IAAC,SAAS,EAAC,UAAU,aAC1B,SAAS,OAAG,KAAK,IACV,CACX,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AACF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type HTMLAttributes } from "react";
|
|
1
|
+
import { type HTMLAttributes, type ReactElement, type Ref } from "react";
|
|
2
2
|
export type SelectOption<T extends string = string> = {
|
|
3
3
|
value: T;
|
|
4
4
|
label: string;
|
|
@@ -26,6 +26,15 @@ type SelectMultipleProps<T extends string = string> = SelectBaseProps<T> & {
|
|
|
26
26
|
onValueChange?: (value: T[]) => void;
|
|
27
27
|
};
|
|
28
28
|
export type SelectProps<T extends string = string> = SelectSingleProps<T> | SelectMultipleProps<T>;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* The trigger is the ref target: `register` from a form library and
|
|
31
|
+
* scroll-into-view both want it, and it is a `<div>` in both the button and the
|
|
32
|
+
* searchable variants. It does swap nodes when the searchable trigger replaces
|
|
33
|
+
* the button one, so a callback ref sees null and then the new element — normal
|
|
34
|
+
* for conditional rendering, but worth knowing if you cache the node.
|
|
35
|
+
*/
|
|
36
|
+
export declare const Select: <T extends string = string>(props: SelectProps<T> & {
|
|
37
|
+
ref?: Ref<HTMLDivElement>;
|
|
38
|
+
}) => ReactElement;
|
|
30
39
|
export {};
|
|
31
40
|
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,GAAG,EAA4D,MAAM,OAAO,CAAC;AAK/I,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC,GAAG;IAC3H,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG;IACvE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,KAAK,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG;IACzE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACZ,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AA6SnG;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,KAAK,YAAY,CAAC"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { autoUpdate, flip, offset, shift, size, useFloating } from "@floating-ui/react";
|
|
3
3
|
import { useControllableState } from "@sixthshift/design-system/hooks";
|
|
4
|
-
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
5
|
-
import { SelectDropdown } from "./SelectDropdown.js";
|
|
4
|
+
import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { SelectDropdown, selectOptionId } from "./SelectDropdown.js";
|
|
6
6
|
import { SelectTriggerButton, SelectTriggerSearch } from "./SelectTrigger.js";
|
|
7
7
|
import { useSelectKeyboard } from "./useSelectKeyboard.js";
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* `forwardRef` erases the generic, so the implementation takes the ref as an
|
|
10
|
+
* ordinary second argument and the exported `Select` re-declares the generic
|
|
11
|
+
* signature over it. Consumers keep `Select<"a" | "b">` inference *and* get a
|
|
12
|
+
* ref; without the cast they would have to choose.
|
|
13
|
+
*/
|
|
14
|
+
const SelectRoot = forwardRef(function SelectRoot(props, rootRef) {
|
|
9
15
|
const { options, onBlur, onFocus, collapsed = false, className, disabled = false, placeholder = "Select...", searchable = false, clearable = false, ...restProps } = props;
|
|
10
16
|
const isMultiple = props.mode === "multiple";
|
|
11
17
|
// Single-mode state
|
|
@@ -24,6 +30,11 @@ export const Select = (props) => {
|
|
|
24
30
|
const [highlightedIndex, setHighlightedIndex] = useState(-1);
|
|
25
31
|
const [searchValue, setSearchValue] = useState("");
|
|
26
32
|
const listboxRef = useRef(null);
|
|
33
|
+
// Also held in state: the listbox is portalled, and FloatingPortal creates its
|
|
34
|
+
// container in an effect, so the node lands a commit after `open` flips. A ref
|
|
35
|
+
// alone is still null when the open effect runs — state re-renders us when the
|
|
36
|
+
// node actually arrives.
|
|
37
|
+
const [listboxNode, setListboxNode] = useState(null);
|
|
27
38
|
const inputRef = useRef(null);
|
|
28
39
|
const optionRefs = useRef(new Map());
|
|
29
40
|
const wasOpenRef = useRef(false);
|
|
@@ -58,6 +69,10 @@ export const Select = (props) => {
|
|
|
58
69
|
],
|
|
59
70
|
whileElementsMounted: autoUpdate,
|
|
60
71
|
});
|
|
72
|
+
const setListbox = useCallback((node) => {
|
|
73
|
+
listboxRef.current = node;
|
|
74
|
+
setListboxNode(node);
|
|
75
|
+
}, []);
|
|
61
76
|
const focusTrigger = useCallback(() => {
|
|
62
77
|
refs.reference.current?.focus();
|
|
63
78
|
}, [refs.reference]);
|
|
@@ -82,17 +97,36 @@ export const Select = (props) => {
|
|
|
82
97
|
setSingleValue("");
|
|
83
98
|
}
|
|
84
99
|
}, [isMultiple, setMultiValue, setSingleValue]);
|
|
100
|
+
const handleListKeyDown = useSelectKeyboard({
|
|
101
|
+
open,
|
|
102
|
+
searchable,
|
|
103
|
+
searchValue,
|
|
104
|
+
highlightedIndex,
|
|
105
|
+
displayOptions: filteredOptions,
|
|
106
|
+
setOpen,
|
|
107
|
+
setHighlightedIndex,
|
|
108
|
+
setSearchValue,
|
|
109
|
+
handleSelect,
|
|
110
|
+
focusTrigger,
|
|
111
|
+
});
|
|
85
112
|
const handleTriggerKeyDown = useCallback((event) => {
|
|
86
113
|
if (disabled || collapsed)
|
|
87
114
|
return;
|
|
88
115
|
if (!open && (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "Enter" || event.key === " ")) {
|
|
89
116
|
event.preventDefault();
|
|
90
117
|
setOpen(true);
|
|
118
|
+
return;
|
|
91
119
|
}
|
|
92
120
|
if (searchable && !open && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
|
|
93
121
|
setOpen(true);
|
|
122
|
+
return;
|
|
94
123
|
}
|
|
95
|
-
|
|
124
|
+
// Focus normally moves into the listbox as it opens, but it can still be
|
|
125
|
+
// on the trigger — the frame the dropdown mounts in, or after the user
|
|
126
|
+
// shift-tabs back to it. Handle navigation here too rather than dropping
|
|
127
|
+
// the keystroke.
|
|
128
|
+
handleListKeyDown(event);
|
|
129
|
+
}, [disabled, collapsed, open, setOpen, searchable, handleListKeyDown]);
|
|
96
130
|
const handleSearchChange = useCallback((val) => {
|
|
97
131
|
setSearchValue(val);
|
|
98
132
|
setHighlightedIndex(0);
|
|
@@ -124,6 +158,14 @@ export const Select = (props) => {
|
|
|
124
158
|
}
|
|
125
159
|
wasOpenRef.current = open;
|
|
126
160
|
}, [open, filteredOptions, searchable, selectedValues]);
|
|
161
|
+
// Non-searchable: focus the listbox itself, so arrow keys reach the scoped
|
|
162
|
+
// keydown handler and a screen reader follows aria-activedescendant. The
|
|
163
|
+
// searchable variant keeps focus in its input instead.
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
if (!open || searchable)
|
|
166
|
+
return;
|
|
167
|
+
listboxNode?.focus();
|
|
168
|
+
}, [open, searchable, listboxNode]);
|
|
127
169
|
// Scroll highlighted option into view
|
|
128
170
|
useEffect(() => {
|
|
129
171
|
if (open && highlightedIndex >= 0) {
|
|
@@ -154,24 +196,28 @@ export const Select = (props) => {
|
|
|
154
196
|
document.addEventListener("mousedown", handler);
|
|
155
197
|
return () => document.removeEventListener("mousedown", handler);
|
|
156
198
|
}, [open, setOpen, refs]);
|
|
157
|
-
useSelectKeyboard({
|
|
158
|
-
open,
|
|
159
|
-
searchable,
|
|
160
|
-
searchValue,
|
|
161
|
-
highlightedIndex,
|
|
162
|
-
displayOptions: filteredOptions,
|
|
163
|
-
setOpen,
|
|
164
|
-
setHighlightedIndex,
|
|
165
|
-
setSearchValue,
|
|
166
|
-
handleSelect,
|
|
167
|
-
focusTrigger,
|
|
168
|
-
});
|
|
169
199
|
// The listbox id must be unique per instance: it is referenced by
|
|
170
200
|
// aria-controls, and a hardcoded value meant two Selects on one page
|
|
171
201
|
// produced duplicate ids and cross-wired ARIA.
|
|
172
202
|
const listboxId = useId();
|
|
203
|
+
const activeOptionId = open && highlightedIndex >= 0 && highlightedIndex < filteredOptions.length ? selectOptionId(listboxId, highlightedIndex) : undefined;
|
|
173
204
|
// Strip mode from DOM props
|
|
174
205
|
const { mode: _, value: _v, defaultValue: _dv, onValueChange: _oc, ...htmlProps } = restProps;
|
|
175
|
-
|
|
176
|
-
|
|
206
|
+
// `role="listbox"` requires an accessible name of its own, and the trigger
|
|
207
|
+
// can't supply one: its label is the current *value*, and in searchable mode
|
|
208
|
+
// it is an input whose name would resolve to whatever has been typed. Use the
|
|
209
|
+
// caller's `aria-label` when there is one, else the placeholder — the closest
|
|
210
|
+
// thing this component has to a field label.
|
|
211
|
+
const listboxLabel = typeof htmlProps["aria-label"] === "string" ? htmlProps["aria-label"] : placeholder;
|
|
212
|
+
return (_jsxs(_Fragment, { children: [searchable && open && !collapsed ? (_jsx(SelectTriggerSearch, { setReference: refs.setReference, rootRef: rootRef, inputRef: inputRef, searchValue: searchValue, disabled: disabled, displayLabel: displayLabel, open: open, className: className, onSearchChange: handleSearchChange, onKeyDown: handleListKeyDown, listboxId: listboxId, activeOptionId: activeOptionId, props: htmlProps })) : (_jsx(SelectTriggerButton, { setReference: refs.setReference, rootRef: rootRef, open: open, disabled: disabled, collapsed: collapsed, displayLabel: displayLabel, showClearButton: Boolean(showClearButton), className: className, onToggle: () => !disabled && !collapsed && setOpen(!open), onKeyDown: handleTriggerKeyDown, onClear: handleClear, listboxId: listboxId, props: htmlProps })), open && !collapsed && (_jsx(SelectDropdown, { setFloating: refs.setFloating, listboxId: listboxId, setListbox: setListbox, label: listboxLabel, activeOptionId: activeOptionId, floatingStyles: floatingStyles, displayOptions: filteredOptions, highlightedIndex: highlightedIndex, selectedValues: selectedValues, searchValue: searchValue, optionRefs: optionRefs, multiple: isMultiple, onSelect: handleSelect, onHighlight: setHighlightedIndex, onKeyDown: handleListKeyDown }))] }));
|
|
213
|
+
});
|
|
214
|
+
SelectRoot.displayName = "Select";
|
|
215
|
+
/**
|
|
216
|
+
* The trigger is the ref target: `register` from a form library and
|
|
217
|
+
* scroll-into-view both want it, and it is a `<div>` in both the button and the
|
|
218
|
+
* searchable variants. It does swap nodes when the searchable trigger replaces
|
|
219
|
+
* the button one, so a callback ref sees null and then the new element — normal
|
|
220
|
+
* for conditional rendering, but worth knowing if you cache the node.
|
|
221
|
+
*/
|
|
222
|
+
export const Select = SelectRoot;
|
|
177
223
|
//# sourceMappingURL=Select.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../../src/components/Select/Select.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
2
|
import type { WritableRefObject } from "../../internal/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Options are addressed by id, not by focus: the listbox (or the search input)
|
|
5
|
+
* keeps focus and points `aria-activedescendant` at the highlighted option, so
|
|
6
|
+
* both sides need to agree on the id.
|
|
7
|
+
*/
|
|
8
|
+
export declare const selectOptionId: (listboxId: string, index: number) => string;
|
|
3
9
|
interface SelectDropdownProps<T extends string> {
|
|
4
10
|
setFloating: (node: HTMLElement | null) => void;
|
|
5
11
|
listboxId: string;
|
|
6
|
-
|
|
12
|
+
/** Publishes the listbox node upward — Select focuses it and scrolls it. */
|
|
13
|
+
setListbox: (node: HTMLDivElement | null) => void;
|
|
14
|
+
/** Names the listbox — a bare `role="listbox"` has no accessible name. */
|
|
15
|
+
label: string;
|
|
16
|
+
/** The highlighted option's id, or undefined when nothing is highlighted. */
|
|
17
|
+
activeOptionId: string | undefined;
|
|
7
18
|
floatingStyles: React.CSSProperties;
|
|
8
19
|
displayOptions: readonly {
|
|
9
20
|
value: T;
|
|
@@ -16,7 +27,8 @@ interface SelectDropdownProps<T extends string> {
|
|
|
16
27
|
multiple: boolean;
|
|
17
28
|
onSelect: (value: T) => void;
|
|
18
29
|
onHighlight: (index: number) => void;
|
|
30
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
19
31
|
}
|
|
20
|
-
export declare const SelectDropdown: <T extends string>({ setFloating, listboxId,
|
|
32
|
+
export declare const SelectDropdown: <T extends string>({ setFloating, listboxId, setListbox, label, activeOptionId, floatingStyles, displayOptions, highlightedIndex, selectedValues, searchValue, optionRefs, multiple, onSelect, onHighlight, onKeyDown, }: SelectDropdownProps<T>) => React.JSX.Element;
|
|
21
33
|
export {};
|
|
22
34
|
//# sourceMappingURL=SelectDropdown.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/Select/SelectDropdown.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"SelectDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/Select/SelectDropdown.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,cAAc,cAAe,MAAM,SAAS,MAAM,WAAmC,CAAC;AAEnG,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;IACpC,cAAc,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAC9D;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,MAAM,yMAgB5C,mBAAmB,CAAC,CAAC,CAAC,sBAoExB,CAAC"}
|
|
@@ -2,16 +2,31 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { FloatingPortal } from "@floating-ui/react";
|
|
3
3
|
import { cn } from "@sixthshift/design-system/utils";
|
|
4
4
|
import { Check } from "lucide-react";
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Options are addressed by id, not by focus: the listbox (or the search input)
|
|
7
|
+
* keeps focus and points `aria-activedescendant` at the highlighted option, so
|
|
8
|
+
* both sides need to agree on the id.
|
|
9
|
+
*/
|
|
10
|
+
export const selectOptionId = (listboxId, index) => `${listboxId}-option-${index}`;
|
|
11
|
+
export const SelectDropdown = ({ setFloating, listboxId, setListbox, label, activeOptionId, floatingStyles, displayOptions, highlightedIndex, selectedValues, searchValue, optionRefs, multiple, onSelect, onHighlight, onKeyDown, }) => (_jsx(FloatingPortal, { children: _jsx("div", { ref: (node) => {
|
|
6
12
|
setFloating(node);
|
|
7
|
-
|
|
8
|
-
}, id: listboxId, role: "listbox", "aria-
|
|
13
|
+
setListbox(node);
|
|
14
|
+
}, id: listboxId, role: "listbox", "aria-label": label, "aria-multiselectable": multiple || undefined, "aria-activedescendant": activeOptionId,
|
|
15
|
+
// Focus lands here when the dropdown opens (the searchable variant keeps
|
|
16
|
+
// it in the input instead), which is what makes `aria-activedescendant`
|
|
17
|
+
// and the scoped keydown handler work.
|
|
18
|
+
tabIndex: -1, onKeyDown: onKeyDown, style: floatingStyles, className: "z-popover max-h-60 overflow-y-auto rounded-md border border-border-normal bg-bg-normal shadow-lg", children: displayOptions.length === 0 ? (_jsx("div", { className: "px-3 py-2 text-center text-fg-subtle text-sm", children: searchValue ? `No results for "${searchValue}"` : "No options available" })) : (displayOptions.map((option, index) => {
|
|
9
19
|
const isSelected = selectedValues.has(option.value);
|
|
10
20
|
return (_jsxs("button", { ref: (el) => {
|
|
11
21
|
if (el)
|
|
12
22
|
optionRefs.current.set(index, el);
|
|
13
23
|
else
|
|
14
24
|
optionRefs.current.delete(index);
|
|
15
|
-
}, type: "button",
|
|
25
|
+
}, type: "button", id: selectOptionId(listboxId, index), role: "option", "aria-selected": isSelected,
|
|
26
|
+
// The options are not tab stops and must not steal focus: the
|
|
27
|
+
// listbox holds it and delegates via aria-activedescendant, so a
|
|
28
|
+
// click that moved focus onto the option would strand the keyboard
|
|
29
|
+
// handler with nothing listening.
|
|
30
|
+
tabIndex: -1, onMouseDown: (event) => event.preventDefault(), onClick: () => onSelect(option.value), onMouseEnter: () => onHighlight(index), className: cn(`flex w-full cursor-pointer items-center px-3 py-2 text-fg-normal text-sm transition-colors`, multiple && "gap-2", highlightedIndex === index && "bg-bg-subtle", isSelected ? "font-medium text-fg-normal" : "text-fg-subtle"), children: [multiple && (_jsx("span", { className: cn("flex h-4 w-4 shrink-0 items-center justify-center rounded-xs border", isSelected ? "border-border-brand bg-bg-brand text-fg-on-brand" : "border-border-normal"), children: isSelected && _jsx(Check, { className: "h-3 w-3" }) })), option.label] }, option.value));
|
|
16
31
|
})) }) }));
|
|
17
32
|
//# sourceMappingURL=SelectDropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectDropdown.js","sourceRoot":"","sources":["../../../src/components/Select/SelectDropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectDropdown.js","sourceRoot":"","sources":["../../../src/components/Select/SelectDropdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import type { HTMLAttributes } from "react";
|
|
1
|
+
import type { HTMLAttributes, Ref } from "react";
|
|
2
2
|
interface SelectTriggerButtonProps {
|
|
3
3
|
setReference: (node: HTMLElement | null) => void;
|
|
4
|
+
/** Consumer ref from Select, attached to this trigger's root element. */
|
|
5
|
+
rootRef?: Ref<HTMLDivElement>;
|
|
4
6
|
listboxId: string;
|
|
5
7
|
open: boolean;
|
|
6
8
|
disabled: boolean;
|
|
@@ -13,10 +15,14 @@ interface SelectTriggerButtonProps {
|
|
|
13
15
|
onClear: (e: React.MouseEvent) => void;
|
|
14
16
|
props: HTMLAttributes<HTMLElement>;
|
|
15
17
|
}
|
|
16
|
-
export declare const SelectTriggerButton: ({ setReference, listboxId, open, disabled, collapsed, displayLabel, showClearButton, className, onToggle, onKeyDown, onClear, props, }: SelectTriggerButtonProps) => import("react").JSX.Element;
|
|
18
|
+
export declare const SelectTriggerButton: ({ setReference, rootRef, listboxId, open, disabled, collapsed, displayLabel, showClearButton, className, onToggle, onKeyDown, onClear, props, }: SelectTriggerButtonProps) => import("react").JSX.Element;
|
|
17
19
|
interface SelectTriggerSearchProps {
|
|
18
20
|
setReference: (node: HTMLElement | null) => void;
|
|
21
|
+
/** Consumer ref from Select, attached to this trigger's root element. */
|
|
22
|
+
rootRef?: Ref<HTMLDivElement>;
|
|
19
23
|
listboxId: string;
|
|
24
|
+
/** Id of the highlighted option — the input keeps focus and delegates to it. */
|
|
25
|
+
activeOptionId: string | undefined;
|
|
20
26
|
inputRef: React.RefObject<HTMLInputElement | null>;
|
|
21
27
|
searchValue: string;
|
|
22
28
|
disabled: boolean;
|
|
@@ -24,8 +30,9 @@ interface SelectTriggerSearchProps {
|
|
|
24
30
|
open: boolean;
|
|
25
31
|
className: string | undefined;
|
|
26
32
|
onSearchChange: (value: string) => void;
|
|
33
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
27
34
|
props: React.InputHTMLAttributes<HTMLInputElement>;
|
|
28
35
|
}
|
|
29
|
-
export declare const SelectTriggerSearch: ({ setReference, listboxId, inputRef, searchValue, disabled, displayLabel, open, className, onSearchChange, props, }: SelectTriggerSearchProps) => import("react").JSX.Element;
|
|
36
|
+
export declare const SelectTriggerSearch: ({ setReference, rootRef, listboxId, activeOptionId, inputRef, searchValue, disabled, displayLabel, open, className, onSearchChange, onKeyDown, props, }: SelectTriggerSearchProps) => import("react").JSX.Element;
|
|
30
37
|
export {};
|
|
31
38
|
//# sourceMappingURL=SelectTrigger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/Select/SelectTrigger.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/Select/SelectTrigger.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjD,UAAU,wBAAwB;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,yEAAyE;IACzE,OAAO,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,mBAAmB,oJAc7B,wBAAwB,gCAmD1B,CAAC;AAEF,UAAU,wBAAwB;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,yEAAyE;IACzE,OAAO,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,mBAAmB,4JAc7B,wBAAwB,gCA+B1B,CAAC"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "@sixthshift/design-system/utils";
|
|
3
3
|
import { ChevronDown, X } from "lucide-react";
|
|
4
|
-
export const SelectTriggerButton = ({ setReference, listboxId, open, disabled, collapsed, displayLabel, showClearButton, className, onToggle, onKeyDown, onClear, props, }) => {
|
|
4
|
+
export const SelectTriggerButton = ({ setReference, rootRef, listboxId, open, disabled, collapsed, displayLabel, showClearButton, className, onToggle, onKeyDown, onClear, props, }) => {
|
|
5
5
|
// The clear button must be a sibling of the trigger, not a descendant: nesting
|
|
6
6
|
// one interactive control inside another is invalid HTML and leaves assistive
|
|
7
7
|
// tech unable to reach the inner control (axe: nested-interactive).
|
|
8
8
|
const showClear = showClearButton && !collapsed;
|
|
9
|
-
return (_jsxs("div", { className: "relative w-full", children: [_jsx("button", { ref: setReference, type: "button", onClick: onToggle, onKeyDown: onKeyDown, disabled: disabled, className: cn(`flex w-full cursor-pointer items-center gap-2 rounded-md border border-border-normal bg-bg-normal px-3 py-2 font-medium text-fg-normal text-sm transition-colors hover:bg-bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`, collapsed ? "justify-center" : "justify-between", showClear && "pr-9", className), title: collapsed ? displayLabel : undefined, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listboxId : undefined, ...props, children: collapsed ? (_jsx("span", { className: "font-bold text-xs", children: displayLabel.charAt(0) })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate", children: displayLabel }), _jsx("span", { className: "flex shrink-0 items-center gap-1", children: _jsx(ChevronDown, { className: cn("h-4 w-4 text-fg-subtle transition-transform", open && "rotate-180") }) })] })) }), showClear && (_jsx("button", { type: "button", onClick: onClear, disabled: disabled, className: "absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Clear selection", children: _jsx(X, { className: "h-3.5 w-3.5" }) }))] }));
|
|
9
|
+
return (_jsxs("div", { ref: rootRef, className: "relative w-full", children: [_jsx("button", { ref: setReference, type: "button", onClick: onToggle, onKeyDown: onKeyDown, disabled: disabled, className: cn(`flex w-full cursor-pointer items-center gap-2 rounded-md border border-border-normal bg-bg-normal px-3 py-2 font-medium text-fg-normal text-sm transition-colors hover:bg-bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`, collapsed ? "justify-center" : "justify-between", showClear && "pr-9", className), title: collapsed ? displayLabel : undefined, "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listboxId : undefined, ...props, children: collapsed ? (_jsx("span", { className: "font-bold text-xs", children: displayLabel.charAt(0) })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate", children: displayLabel }), _jsx("span", { className: "flex shrink-0 items-center gap-1", children: _jsx(ChevronDown, { className: cn("h-4 w-4 text-fg-subtle transition-transform", open && "rotate-180") }) })] })) }), showClear && (_jsx("button", { type: "button", onClick: onClear, disabled: disabled, className: "absolute top-1/2 right-8 -translate-y-1/2 rounded-sm p-0.5 text-fg-subtle hover:bg-bg-subtle hover:text-fg-normal focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring", "aria-label": "Clear selection", children: _jsx(X, { className: "h-3.5 w-3.5" }) }))] }));
|
|
10
10
|
};
|
|
11
|
-
export const SelectTriggerSearch = ({ setReference, listboxId, inputRef, searchValue, disabled, displayLabel, open, className, onSearchChange, props, }) => (
|
|
11
|
+
export const SelectTriggerSearch = ({ setReference, rootRef, listboxId, activeOptionId, inputRef, searchValue, disabled, displayLabel, open, className, onSearchChange, onKeyDown, props, }) => (
|
|
12
|
+
// floating-ui anchors to this element and the consumer may also want it, so
|
|
13
|
+
// both refs run off one callback rather than one silently winning.
|
|
14
|
+
_jsxs("div", { ref: (node) => {
|
|
15
|
+
setReference(node);
|
|
16
|
+
if (typeof rootRef === "function")
|
|
17
|
+
rootRef(node);
|
|
18
|
+
else if (rootRef)
|
|
19
|
+
rootRef.current = node;
|
|
20
|
+
}, className: cn("relative flex w-full items-center", className), children: [_jsx("input", { ref: inputRef, type: "text", value: searchValue, onChange: (e) => onSearchChange(e.target.value), onKeyDown: onKeyDown, placeholder: displayLabel, disabled: disabled, className: cn(`flex-1 rounded-md border border-border-normal bg-bg-normal px-3 py-2 font-medium text-fg-normal text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:cursor-not-allowed disabled:opacity-50`), role: "combobox", "aria-expanded": open, "aria-controls": listboxId, "aria-activedescendant": activeOptionId, "aria-autocomplete": "list", ...props }), _jsx(ChevronDown, { className: "pointer-events-none absolute right-3 h-4 w-4 text-fg-subtle" })] }));
|
|
12
21
|
//# sourceMappingURL=SelectTrigger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectTrigger.js","sourceRoot":"","sources":["../../../src/components/Select/SelectTrigger.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iCAAiC,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectTrigger.js","sourceRoot":"","sources":["../../../src/components/Select/SelectTrigger.tsx"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,20 @@ interface UseSelectKeyboardOptions<T extends string> {
|
|
|
11
11
|
handleSelect: (value: T) => void;
|
|
12
12
|
focusTrigger: () => void;
|
|
13
13
|
}
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Returns the keydown handler for an open Select. It is attached to the element
|
|
16
|
+
* that actually holds focus — the listbox, or the search input in searchable
|
|
17
|
+
* mode — rather than to `document`.
|
|
18
|
+
*
|
|
19
|
+
* A document-level listener fired for every keystroke on the page while any
|
|
20
|
+
* Select was open, which meant a Select could swallow Escape or an arrow key
|
|
21
|
+
* from an overlay stacked above it, and two open Selects raced each other. It
|
|
22
|
+
* also decoupled key handling from focus, so nothing guaranteed the element the
|
|
23
|
+
* user was typing into was the one being navigated. Scoping the handler to the
|
|
24
|
+
* focused element makes both problems structurally impossible and is what lets
|
|
25
|
+
* `aria-activedescendant` mean something: the focused element owns the active
|
|
26
|
+
* option.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useSelectKeyboard<T extends string>({ open, searchable, searchValue, highlightedIndex, displayOptions, setOpen, setHighlightedIndex, setSearchValue, handleSelect, focusTrigger, }: UseSelectKeyboardOptions<T>): (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
15
29
|
export {};
|
|
16
30
|
//# sourceMappingURL=useSelectKeyboard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelectKeyboard.d.ts","sourceRoot":"","sources":["../../../src/components/Select/useSelectKeyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,UAAU,wBAAwB,CAAC,CAAC,SAAS,MAAM;IACjD,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,EAClD,IAAI,EACJ,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,YAAY,GACb,EAAE,wBAAwB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"useSelectKeyboard.d.ts","sourceRoot":"","sources":["../../../src/components/Select/useSelectKeyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,UAAU,wBAAwB,CAAC,CAAC,SAAS,MAAM;IACjD,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,mBAAmB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,EAClD,IAAI,EACJ,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,YAAY,GACb,EAAE,wBAAwB,CAAC,CAAC,CAAC,WAElB,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,UA6E3C"}
|