@refraction-ui/react 0.21.0 → 0.22.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/dist/{chunk-ZF3OHCGV.js → chunk-2Q6HHFAN.js} +1 -1
- package/dist/chunk-2Q6HHFAN.js.map +7 -0
- package/dist/{chunk-533MCMSU.js → chunk-3I3DYDHR.js} +2 -2
- package/dist/{chunk-NKCWOPNX.js → chunk-3Y2T26QD.js} +9 -7
- package/dist/chunk-3Y2T26QD.js.map +7 -0
- package/dist/{chunk-H54FLNAF.js → chunk-63N4PZUJ.js} +2 -2
- package/dist/{chunk-Y2FNNAIL.js → chunk-EGVPAMQU.js} +2 -2
- package/dist/chunk-EGVPAMQU.js.map +1 -0
- package/dist/{chunk-WK2IIUFO.js → chunk-QDMLIDYN.js} +2 -2
- package/dist/{chunk-BOLFYVI6.js → chunk-QPCKJ2YR.js} +2 -2
- package/dist/{chunk-TOZBR4GL.js → chunk-RSWOLRIC.js} +4 -4
- package/dist/{chunk-TOZBR4GL.js.map → chunk-RSWOLRIC.js.map} +1 -1
- package/dist/{chunk-UNEM2TRI.js → chunk-SDAJVXD4.js} +2 -2
- package/dist/{chunk-VK3EQ34F.js → chunk-V24GDHUX.js} +2 -2
- package/dist/{chunk-AMK4VCBG.js → chunk-WYKPPK3W.js} +2 -2
- package/dist/{chunk-ONACRMG4.js → chunk-XMFNBOPO.js} +2 -2
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +1 -1
- package/dist/index.cjs +579 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/internal/action-list/index.d.ts +39 -0
- package/dist/internal/button/index.d.cts +2 -2
- package/dist/internal/button/index.d.ts +2 -2
- package/dist/internal/card/index.d.cts +5 -1
- package/dist/internal/card/index.d.ts +5 -1
- package/dist/internal/funnel-chart/index.d.ts +60 -0
- package/dist/internal/line-chart/index.d.ts +110 -0
- package/dist/internal/page-header/index.d.ts +35 -0
- package/dist/internal/react-action-list/index.d.ts +28 -0
- package/dist/internal/react-card/index.d.cts +10 -4
- package/dist/internal/react-card/index.d.ts +10 -4
- package/dist/internal/react-funnel-chart/index.d.ts +28 -0
- package/dist/internal/react-line-chart/index.d.ts +33 -0
- package/dist/internal/react-page-header/index.d.ts +23 -0
- package/dist/internal/react-select/index.d.cts +21 -3
- package/dist/internal/react-select/index.d.ts +21 -3
- package/dist/internal/select/index.d.cts +14 -1
- package/dist/internal/select/index.d.ts +14 -1
- package/dist/internal/shared/index.d.cts +6 -3
- package/dist/internal/shared/index.d.ts +6 -3
- package/dist/internal/tabs/index.d.cts +8 -1
- package/dist/internal/tabs/index.d.ts +8 -1
- package/dist/react-accordion.js +1 -1
- package/dist/react-action-list.js +74 -0
- package/dist/react-action-list.js.map +7 -0
- package/dist/react-ai.js +1 -1
- package/dist/react-analytics.js +1 -1
- package/dist/react-animated-text.js +1 -1
- package/dist/react-app-shell.js +1 -1
- package/dist/react-audience-feature-card.js +1 -1
- package/dist/react-audio-room.js +1 -1
- package/dist/react-auth.js +1 -1
- package/dist/react-avatar-group.js +1 -1
- package/dist/react-avatar.js +1 -1
- package/dist/react-badge.js +2 -2
- package/dist/react-badge.js.map +1 -1
- package/dist/react-bottom-nav.js +1 -1
- package/dist/react-brand-network-cell.js +1 -1
- package/dist/react-breadcrumbs.js +1 -1
- package/dist/react-browser-chrome-mock.js +1 -1
- package/dist/react-button.js +3 -3
- package/dist/react-calendar.js +1 -1
- package/dist/react-call-controls.js +1 -1
- package/dist/react-callout.js +8 -3
- package/dist/react-callout.js.map +2 -2
- package/dist/react-card-grid.js +1 -1
- package/dist/react-card.js +5 -5
- package/dist/react-card.js.map +2 -2
- package/dist/react-carousel.js +1 -1
- package/dist/react-charts.js +1 -1
- package/dist/react-checkbox.js +1 -1
- package/dist/react-checklist.js +1 -1
- package/dist/react-code-block.js +1 -1
- package/dist/react-code-editor.js +1 -1
- package/dist/react-collapsible.js +1 -1
- package/dist/react-combobox.js +1 -1
- package/dist/react-command-input.js +1 -1
- package/dist/react-command.js +1 -1
- package/dist/react-composer.js +3 -3
- package/dist/react-content-protection.js +1 -1
- package/dist/react-conversation.js +5 -5
- package/dist/react-cookie-consent.js +1 -1
- package/dist/react-data-table.js +1 -1
- package/dist/react-date-picker.js +1 -1
- package/dist/react-device-frame.js +1 -1
- package/dist/react-dialog.js +2 -2
- package/dist/react-diff-viewer.js +1 -1
- package/dist/react-dropdown-menu.js +1 -1
- package/dist/react-editor-status-bar.js +1 -1
- package/dist/react-editor-tabs.js +1 -1
- package/dist/react-emoji-picker.js +2 -2
- package/dist/react-empty-state.js +1 -1
- package/dist/react-feedback-dialog.js +2 -2
- package/dist/react-file-tree.js +1 -1
- package/dist/react-file-upload.js +1 -1
- package/dist/react-floating-reactions.js +1 -1
- package/dist/react-flow-editor.js +2 -2
- package/dist/react-footer.js +1 -1
- package/dist/react-funnel-chart.js +105 -0
- package/dist/react-funnel-chart.js.map +7 -0
- package/dist/react-graph-view.js +2 -2
- package/dist/react-infinite-canvas.js +2 -2
- package/dist/react-inline-editor.js +1 -1
- package/dist/react-input-group.js +1 -1
- package/dist/react-input.js +2 -2
- package/dist/react-install-prompt.js +1 -1
- package/dist/react-kanban-board.js +1 -1
- package/dist/react-keyboard-shortcut.js +2 -2
- package/dist/react-language-selector.js +1 -1
- package/dist/react-line-chart.js +242 -0
- package/dist/react-line-chart.js.map +7 -0
- package/dist/react-link-card.js +1 -1
- package/dist/react-live-captions.js +1 -1
- package/dist/react-live-cursors.js +1 -1
- package/dist/react-live-transcript.js +1 -1
- package/dist/react-location-selector.js +1 -1
- package/dist/react-logger.js +1 -1
- package/dist/react-markdown-renderer.js +2 -2
- package/dist/react-marquee-strip.js +1 -1
- package/dist/react-mascot.js +1 -1
- package/dist/react-mastery-bar.js +1 -1
- package/dist/react-mini-map.js +1 -1
- package/dist/react-mobile-nav.js +1 -1
- package/dist/react-navbar.js +1 -1
- package/dist/react-numbered-steps.js +1 -1
- package/dist/react-otp-input.js +1 -1
- package/dist/react-page-header.js +40 -0
- package/dist/react-page-header.js.map +7 -0
- package/dist/react-pagination.js +1 -1
- package/dist/react-password-input.js +2 -2
- package/dist/react-payment.js +1 -1
- package/dist/react-popover.js +1 -1
- package/dist/react-pre-call-lobby.js +1 -1
- package/dist/react-presence-indicator.js +1 -1
- package/dist/react-pricing-card.js +1 -1
- package/dist/react-progress-display.js +2 -2
- package/dist/react-progress-display.js.map +1 -1
- package/dist/react-radial-gauge.js +1 -1
- package/dist/react-radio.js +1 -1
- package/dist/react-rating-scale.js +1 -1
- package/dist/react-reaction-bar.js +1 -1
- package/dist/react-resizable-layout.js +1 -1
- package/dist/react-search-bar.js +1 -1
- package/dist/react-section-head.js +1 -1
- package/dist/react-segmented-control.js +1 -1
- package/dist/react-select.js +94 -20
- package/dist/react-select.js.map +3 -3
- package/dist/react-separator.js +1 -1
- package/dist/react-sheet.js +1 -1
- package/dist/react-sidebar.js +1 -1
- package/dist/react-skeleton.js +1 -1
- package/dist/react-skip-to-content.js +1 -1
- package/dist/react-slide-viewer.js +1 -1
- package/dist/react-slider.js +1 -1
- package/dist/react-slot-picker.js +1 -1
- package/dist/react-social-auth-button.js +3 -3
- package/dist/react-sortable-list.js +1 -1
- package/dist/react-stat-grid.js +1 -1
- package/dist/react-status-indicator.js +1 -1
- package/dist/react-steps.js +1 -1
- package/dist/react-sticky-note.js +1 -1
- package/dist/react-switch.js +1 -1
- package/dist/react-table-of-contents.js +1 -1
- package/dist/react-tabs.js +50 -2
- package/dist/react-tabs.js.map +2 -2
- package/dist/react-terminal.js +1 -1
- package/dist/react-test-results.js +1 -1
- package/dist/react-textarea.js +3 -3
- package/dist/react-textarea.js.map +1 -1
- package/dist/react-thread-view.js +2 -2
- package/dist/react-timeline.js +1 -1
- package/dist/react-toast.js +1 -1
- package/dist/react-tooltip.js +1 -1
- package/dist/react-version-selector.js +1 -1
- package/dist/react-video-grid.js +2 -2
- package/dist/react-video-player.js +1 -1
- package/dist/react-video-tile.js +2 -2
- package/dist/react-voice-pill.js +1 -1
- package/dist/react-waveform.js +1 -1
- package/dist/react-wizard.js +1 -1
- package/dist/theme.js +1 -1
- package/package.json +5 -1
- package/dist/chunk-NKCWOPNX.js.map +0 -7
- package/dist/chunk-Y2FNNAIL.js.map +0 -1
- package/dist/chunk-ZF3OHCGV.js.map +0 -7
- /package/dist/{chunk-533MCMSU.js.map → chunk-3I3DYDHR.js.map} +0 -0
- /package/dist/{chunk-H54FLNAF.js.map → chunk-63N4PZUJ.js.map} +0 -0
- /package/dist/{chunk-WK2IIUFO.js.map → chunk-QDMLIDYN.js.map} +0 -0
- /package/dist/{chunk-BOLFYVI6.js.map → chunk-QPCKJ2YR.js.map} +0 -0
- /package/dist/{chunk-UNEM2TRI.js.map → chunk-SDAJVXD4.js.map} +0 -0
- /package/dist/{chunk-VK3EQ34F.js.map → chunk-V24GDHUX.js.map} +0 -0
- /package/dist/{chunk-AMK4VCBG.js.map → chunk-WYKPPK3W.js.map} +0 -0
- /package/dist/{chunk-ONACRMG4.js.map → chunk-XMFNBOPO.js.map} +0 -0
package/dist/index.cjs
CHANGED
|
@@ -1773,7 +1773,7 @@ function createBadge(props = {}) {
|
|
|
1773
1773
|
};
|
|
1774
1774
|
}
|
|
1775
1775
|
var badgeVariants = cva({
|
|
1776
|
-
base: "inline-flex items-center rounded-full border
|
|
1776
|
+
base: "inline-flex items-center rounded-full border font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
1777
1777
|
variants: {
|
|
1778
1778
|
variant: {
|
|
1779
1779
|
default: "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
|
|
@@ -2072,7 +2072,7 @@ var buttonTokens = {
|
|
|
2072
2072
|
}
|
|
2073
2073
|
};
|
|
2074
2074
|
var buttonVariants = cva({
|
|
2075
|
-
base: "inline-flex items-center justify-center gap-2 whitespace-nowrap
|
|
2075
|
+
base: "inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
2076
2076
|
variants: {
|
|
2077
2077
|
variant: {
|
|
2078
2078
|
default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
@@ -2093,9 +2093,11 @@ var buttonVariants = cva({
|
|
|
2093
2093
|
size: {
|
|
2094
2094
|
xs: "h-7 rounded px-2 text-xs",
|
|
2095
2095
|
sm: "h-8 rounded-md px-3 text-xs",
|
|
2096
|
-
default: "h-9 px-4 py-2",
|
|
2097
|
-
lg: "h-10 rounded-md px-8",
|
|
2098
|
-
icon: "h-9 w-9"
|
|
2096
|
+
default: "h-9 rounded-md px-4 py-2 text-sm",
|
|
2097
|
+
lg: "h-10 rounded-md px-8 text-sm",
|
|
2098
|
+
icon: "h-9 w-9 rounded-md text-sm",
|
|
2099
|
+
"icon-sm": "h-8 w-8 rounded-md text-xs",
|
|
2100
|
+
"icon-xs": "h-7 w-7 rounded text-xs"
|
|
2099
2101
|
}
|
|
2100
2102
|
},
|
|
2101
2103
|
defaultVariants: {
|
|
@@ -12443,11 +12445,11 @@ function createInput(props = {}) {
|
|
|
12443
12445
|
};
|
|
12444
12446
|
}
|
|
12445
12447
|
var inputVariants = cva({
|
|
12446
|
-
base: "flex
|
|
12448
|
+
base: "flex w-full rounded-md border border-input bg-transparent px-3 py-1 shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
12447
12449
|
variants: {
|
|
12448
12450
|
size: {
|
|
12449
12451
|
sm: "h-8 text-xs",
|
|
12450
|
-
default: "h-9",
|
|
12452
|
+
default: "h-9 text-sm",
|
|
12451
12453
|
lg: "h-10 text-base"
|
|
12452
12454
|
},
|
|
12453
12455
|
validationState: {
|
|
@@ -14594,6 +14596,23 @@ function createTabs(props = {}) {
|
|
|
14594
14596
|
idPrefix
|
|
14595
14597
|
};
|
|
14596
14598
|
}
|
|
14599
|
+
function getNextTabIndex(current, key, count, orientation = "horizontal") {
|
|
14600
|
+
if (count === 0) return null;
|
|
14601
|
+
const prev = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
14602
|
+
const next = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
14603
|
+
switch (key) {
|
|
14604
|
+
case next:
|
|
14605
|
+
return current < 0 ? 0 : (current + 1) % count;
|
|
14606
|
+
case prev:
|
|
14607
|
+
return current < 0 ? count - 1 : (current - 1 + count) % count;
|
|
14608
|
+
case "Home":
|
|
14609
|
+
return 0;
|
|
14610
|
+
case "End":
|
|
14611
|
+
return count - 1;
|
|
14612
|
+
default:
|
|
14613
|
+
return null;
|
|
14614
|
+
}
|
|
14615
|
+
}
|
|
14597
14616
|
var tabsListVariants = cva({
|
|
14598
14617
|
base: "inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground"
|
|
14599
14618
|
});
|
|
@@ -14650,17 +14669,48 @@ var Tabs = React52__namespace.forwardRef(
|
|
|
14650
14669
|
}
|
|
14651
14670
|
);
|
|
14652
14671
|
var TabsList = React52__namespace.forwardRef(
|
|
14653
|
-
function TabsList2({ className, ...props },
|
|
14672
|
+
function TabsList2({ className, onKeyDown, ...props }, forwardedRef) {
|
|
14654
14673
|
const { orientation } = useTabsContext();
|
|
14674
|
+
const listRef = React52__namespace.useRef(null);
|
|
14675
|
+
const ref = React52__namespace.useCallback(
|
|
14676
|
+
(node) => {
|
|
14677
|
+
listRef.current = node;
|
|
14678
|
+
if (typeof forwardedRef === "function") forwardedRef(node);
|
|
14679
|
+
else if (forwardedRef) forwardedRef.current = node;
|
|
14680
|
+
},
|
|
14681
|
+
[forwardedRef]
|
|
14682
|
+
);
|
|
14683
|
+
React52__namespace.useEffect(() => {
|
|
14684
|
+
const tabs = enabledTabs(listRef.current);
|
|
14685
|
+
const stop = tabs.find((tab) => tab.getAttribute("aria-selected") === "true") ?? tabs[0];
|
|
14686
|
+
for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1;
|
|
14687
|
+
});
|
|
14688
|
+
const handleKeyDown = (e) => {
|
|
14689
|
+
onKeyDown?.(e);
|
|
14690
|
+
if (e.defaultPrevented) return;
|
|
14691
|
+
const tabs = enabledTabs(listRef.current);
|
|
14692
|
+
const current = tabs.indexOf(e.target);
|
|
14693
|
+
if (current === -1) return;
|
|
14694
|
+
const next = getNextTabIndex(current, e.key, tabs.length, orientation);
|
|
14695
|
+
if (next === null) return;
|
|
14696
|
+
e.preventDefault();
|
|
14697
|
+
tabs[next].focus();
|
|
14698
|
+
tabs[next].click();
|
|
14699
|
+
};
|
|
14655
14700
|
return React52__namespace.createElement("div", {
|
|
14656
14701
|
ref,
|
|
14657
14702
|
role: "tablist",
|
|
14658
14703
|
"aria-orientation": orientation,
|
|
14659
14704
|
className: cn(tabsListVariants(), className),
|
|
14705
|
+
onKeyDown: handleKeyDown,
|
|
14660
14706
|
...props
|
|
14661
14707
|
});
|
|
14662
14708
|
}
|
|
14663
14709
|
);
|
|
14710
|
+
function enabledTabs(list) {
|
|
14711
|
+
if (!list) return [];
|
|
14712
|
+
return Array.from(list.querySelectorAll('[role="tab"]:not([disabled])'));
|
|
14713
|
+
}
|
|
14664
14714
|
var TabsTrigger = React52__namespace.forwardRef(
|
|
14665
14715
|
function TabsTrigger2({ value, className, onClick, onKeyDown, children, ...props }, ref) {
|
|
14666
14716
|
const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext();
|
|
@@ -14752,11 +14802,11 @@ function createTextarea(props = {}) {
|
|
|
14752
14802
|
};
|
|
14753
14803
|
}
|
|
14754
14804
|
var textareaVariants = cva({
|
|
14755
|
-
base: "flex
|
|
14805
|
+
base: "flex w-full rounded-md border border-input bg-transparent px-3 py-2 shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
14756
14806
|
variants: {
|
|
14757
14807
|
size: {
|
|
14758
14808
|
sm: "min-h-[40px] text-xs",
|
|
14759
|
-
default: "min-h-[60px]",
|
|
14809
|
+
default: "min-h-[60px] text-sm",
|
|
14760
14810
|
lg: "min-h-[80px] text-base"
|
|
14761
14811
|
}
|
|
14762
14812
|
},
|
|
@@ -16293,7 +16343,7 @@ var badgeItemVariants = cva({
|
|
|
16293
16343
|
}
|
|
16294
16344
|
});
|
|
16295
16345
|
var progressBarVariants = cva({
|
|
16296
|
-
base: "
|
|
16346
|
+
base: "w-full overflow-hidden rounded-full bg-secondary",
|
|
16297
16347
|
variants: {
|
|
16298
16348
|
size: {
|
|
16299
16349
|
sm: "h-1",
|
|
@@ -18875,9 +18925,9 @@ var cardFooterVariants = cva({
|
|
|
18875
18925
|
base: "flex items-center p-6 pt-0"
|
|
18876
18926
|
});
|
|
18877
18927
|
var Card = React52__namespace.forwardRef(
|
|
18878
|
-
function Card2({ className, variant, asChild = false, ...props }, ref) {
|
|
18928
|
+
function Card2({ className, variant, padding, asChild = false, ...props }, ref) {
|
|
18879
18929
|
const api = createCard();
|
|
18880
|
-
const classes = cn(cardVariants({ variant }), className);
|
|
18930
|
+
const classes = cn(cardVariants({ variant, padding }), className);
|
|
18881
18931
|
if (asChild) {
|
|
18882
18932
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
18883
18933
|
Slot,
|
|
@@ -18917,10 +18967,10 @@ var CardHeader = React52__namespace.forwardRef(
|
|
|
18917
18967
|
}
|
|
18918
18968
|
);
|
|
18919
18969
|
var CardTitle = React52__namespace.forwardRef(
|
|
18920
|
-
function CardTitle2({ className, ...props }, ref) {
|
|
18970
|
+
function CardTitle2({ className, as: Heading = "h3", ...props }, ref) {
|
|
18921
18971
|
const api = createCardTitle();
|
|
18922
18972
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
18923
|
-
|
|
18973
|
+
Heading,
|
|
18924
18974
|
{
|
|
18925
18975
|
ref,
|
|
18926
18976
|
className: cn(cardTitleVariants(), className),
|
|
@@ -20479,13 +20529,12 @@ function createSelect(props = {}) {
|
|
|
20479
20529
|
} = props;
|
|
20480
20530
|
const isInteractive = !disabled;
|
|
20481
20531
|
const selectedOption = options.find((o) => o.value === value);
|
|
20482
|
-
const triggerId = generateId("select-trigger");
|
|
20483
|
-
const contentId = generateId("select-content");
|
|
20532
|
+
const triggerId = props.ids?.trigger ?? generateId("select-trigger");
|
|
20533
|
+
const contentId = props.ids?.content ?? generateId("select-content");
|
|
20484
20534
|
const triggerAriaProps = {
|
|
20485
20535
|
role: "combobox",
|
|
20486
20536
|
"aria-expanded": open,
|
|
20487
|
-
"aria-controls": contentId
|
|
20488
|
-
"aria-labelledby": triggerId
|
|
20537
|
+
"aria-controls": contentId
|
|
20489
20538
|
};
|
|
20490
20539
|
if (disabled) {
|
|
20491
20540
|
triggerAriaProps["aria-disabled"] = true;
|
|
@@ -20567,7 +20616,7 @@ var selectTokens = {
|
|
|
20567
20616
|
}
|
|
20568
20617
|
};
|
|
20569
20618
|
var selectTriggerVariants = cva({
|
|
20570
|
-
base: "flex
|
|
20619
|
+
base: "flex w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
20571
20620
|
variants: {
|
|
20572
20621
|
size: {
|
|
20573
20622
|
sm: "h-8 text-xs",
|
|
@@ -20580,10 +20629,10 @@ var selectTriggerVariants = cva({
|
|
|
20580
20629
|
}
|
|
20581
20630
|
});
|
|
20582
20631
|
var selectContentVariants = cva({
|
|
20583
|
-
base: "
|
|
20632
|
+
base: "absolute left-0 top-full z-50 mt-1 max-h-96 w-full min-w-[8rem] overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95",
|
|
20584
20633
|
variants: {
|
|
20585
20634
|
position: {
|
|
20586
|
-
popper: "
|
|
20635
|
+
popper: "",
|
|
20587
20636
|
"item-aligned": ""
|
|
20588
20637
|
}
|
|
20589
20638
|
},
|
|
@@ -20603,6 +20652,8 @@ var selectItemVariants = cva({
|
|
|
20603
20652
|
selected: "false"
|
|
20604
20653
|
}
|
|
20605
20654
|
});
|
|
20655
|
+
var selectRootClass = "relative";
|
|
20656
|
+
var selectValueClass = "truncate text-left data-[placeholder]:text-muted-foreground";
|
|
20606
20657
|
var SelectContext = React52__namespace.createContext({
|
|
20607
20658
|
__isDefault: true,
|
|
20608
20659
|
value: void 0,
|
|
@@ -20615,7 +20666,10 @@ var SelectContext = React52__namespace.createContext({
|
|
|
20615
20666
|
disabled: false,
|
|
20616
20667
|
placeholder: "Select an option",
|
|
20617
20668
|
triggerId: "",
|
|
20618
|
-
contentId: ""
|
|
20669
|
+
contentId: "",
|
|
20670
|
+
labels: /* @__PURE__ */ new Map(),
|
|
20671
|
+
registerLabel: () => {
|
|
20672
|
+
}
|
|
20619
20673
|
});
|
|
20620
20674
|
function useSelectContext(part) {
|
|
20621
20675
|
const ctx = React52__namespace.useContext(SelectContext);
|
|
@@ -20627,22 +20681,70 @@ function useSelectContext(part) {
|
|
|
20627
20681
|
}
|
|
20628
20682
|
return ctx;
|
|
20629
20683
|
}
|
|
20684
|
+
function collectItemLabels(node, into) {
|
|
20685
|
+
React52__namespace.Children.forEach(node, (child) => {
|
|
20686
|
+
if (!React52__namespace.isValidElement(child)) return;
|
|
20687
|
+
if (child.type === SelectItem && typeof child.props.value === "string") {
|
|
20688
|
+
into.set(child.props.value, child.props.children);
|
|
20689
|
+
return;
|
|
20690
|
+
}
|
|
20691
|
+
collectItemLabels(child.props.children, into);
|
|
20692
|
+
});
|
|
20693
|
+
return into;
|
|
20694
|
+
}
|
|
20630
20695
|
function Select({
|
|
20631
|
-
value,
|
|
20696
|
+
value: controlledValue,
|
|
20697
|
+
defaultValue,
|
|
20632
20698
|
onValueChange,
|
|
20633
20699
|
disabled = false,
|
|
20634
20700
|
children,
|
|
20635
|
-
placeholder = "Select an option"
|
|
20701
|
+
placeholder = "Select an option",
|
|
20702
|
+
className
|
|
20636
20703
|
}) {
|
|
20637
20704
|
const [open, setOpen] = React52__namespace.useState(false);
|
|
20638
|
-
const
|
|
20705
|
+
const [uncontrolledValue, setUncontrolledValue] = React52__namespace.useState(defaultValue);
|
|
20706
|
+
const isControlled = controlledValue !== void 0;
|
|
20707
|
+
const value = isControlled ? controlledValue : uncontrolledValue;
|
|
20708
|
+
const rootRef = React52__namespace.useRef(null);
|
|
20709
|
+
const baseId = React52__namespace.useId();
|
|
20710
|
+
const triggerId = `${baseId}-trigger`;
|
|
20711
|
+
const contentId = `${baseId}-content`;
|
|
20712
|
+
const [registered, setRegistered] = React52__namespace.useState(
|
|
20713
|
+
() => /* @__PURE__ */ new Map()
|
|
20714
|
+
);
|
|
20715
|
+
const registerLabel = React52__namespace.useCallback((itemValue, label) => {
|
|
20716
|
+
setRegistered((prev) => {
|
|
20717
|
+
if (prev.get(itemValue) === label) return prev;
|
|
20718
|
+
const next = new Map(prev);
|
|
20719
|
+
next.set(itemValue, label);
|
|
20720
|
+
return next;
|
|
20721
|
+
});
|
|
20722
|
+
}, []);
|
|
20723
|
+
const labels = React52__namespace.useMemo(
|
|
20724
|
+
() => collectItemLabels(children, new Map(registered)),
|
|
20725
|
+
[children, registered]
|
|
20726
|
+
);
|
|
20727
|
+
React52__namespace.useEffect(() => {
|
|
20728
|
+
if (!open) return;
|
|
20729
|
+
const onPointerDown = (event) => {
|
|
20730
|
+
if (rootRef.current && !rootRef.current.contains(event.target)) setOpen(false);
|
|
20731
|
+
};
|
|
20732
|
+
document.addEventListener("pointerdown", onPointerDown);
|
|
20733
|
+
return () => document.removeEventListener("pointerdown", onPointerDown);
|
|
20734
|
+
}, [open]);
|
|
20735
|
+
const handleValueChange = React52__namespace.useCallback(
|
|
20736
|
+
(next) => {
|
|
20737
|
+
if (!isControlled) setUncontrolledValue(next);
|
|
20738
|
+
onValueChange?.(next);
|
|
20739
|
+
},
|
|
20740
|
+
[isControlled, onValueChange]
|
|
20741
|
+
);
|
|
20639
20742
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
20640
20743
|
SelectContext.Provider,
|
|
20641
20744
|
{
|
|
20642
20745
|
value: {
|
|
20643
20746
|
value,
|
|
20644
|
-
onValueChange:
|
|
20645
|
-
}),
|
|
20747
|
+
onValueChange: handleValueChange,
|
|
20646
20748
|
open,
|
|
20647
20749
|
setOpen: (v2) => {
|
|
20648
20750
|
if (!disabled) setOpen(v2);
|
|
@@ -20650,17 +20752,19 @@ function Select({
|
|
|
20650
20752
|
options: [],
|
|
20651
20753
|
disabled,
|
|
20652
20754
|
placeholder,
|
|
20653
|
-
triggerId
|
|
20654
|
-
contentId
|
|
20755
|
+
triggerId,
|
|
20756
|
+
contentId,
|
|
20757
|
+
labels,
|
|
20758
|
+
registerLabel
|
|
20655
20759
|
},
|
|
20656
|
-
children
|
|
20760
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: rootRef, className: cn(selectRootClass, className), "data-slot": "select", children })
|
|
20657
20761
|
}
|
|
20658
20762
|
);
|
|
20659
20763
|
}
|
|
20660
20764
|
var SelectTrigger = React52__namespace.forwardRef(
|
|
20661
20765
|
function SelectTrigger2({ className, children, size = "default", ...props }, ref) {
|
|
20662
20766
|
const { open, setOpen, disabled, triggerId, contentId } = useSelectContext("SelectTrigger");
|
|
20663
|
-
const api = createSelect({ disabled, open });
|
|
20767
|
+
const api = createSelect({ disabled, open, ids: { trigger: triggerId, content: contentId } });
|
|
20664
20768
|
const handleClick = () => {
|
|
20665
20769
|
if (!disabled) {
|
|
20666
20770
|
setOpen(!open);
|
|
@@ -20691,7 +20795,6 @@ var SelectTrigger = React52__namespace.forwardRef(
|
|
|
20691
20795
|
disabled,
|
|
20692
20796
|
...api.triggerProps.ariaProps,
|
|
20693
20797
|
...api.triggerProps.dataAttributes,
|
|
20694
|
-
"aria-controls": contentId,
|
|
20695
20798
|
...props,
|
|
20696
20799
|
children: [
|
|
20697
20800
|
children,
|
|
@@ -20777,8 +20880,11 @@ var SelectContent = React52__namespace.forwardRef(
|
|
|
20777
20880
|
);
|
|
20778
20881
|
var SelectItem = React52__namespace.forwardRef(
|
|
20779
20882
|
function SelectItem2({ className, children, value: itemValue, disabled: itemDisabled = false, ...props }, ref) {
|
|
20780
|
-
const { value, onValueChange, setOpen, triggerId } = useSelectContext("SelectItem");
|
|
20883
|
+
const { value, onValueChange, setOpen, triggerId, registerLabel } = useSelectContext("SelectItem");
|
|
20781
20884
|
const isSelected = value === itemValue;
|
|
20885
|
+
React52__namespace.useEffect(() => {
|
|
20886
|
+
registerLabel(itemValue, children);
|
|
20887
|
+
}, [registerLabel, itemValue, children]);
|
|
20782
20888
|
const handleClick = () => {
|
|
20783
20889
|
if (!itemDisabled) {
|
|
20784
20890
|
onValueChange(itemValue);
|
|
@@ -20832,6 +20938,23 @@ var SelectItem = React52__namespace.forwardRef(
|
|
|
20832
20938
|
);
|
|
20833
20939
|
}
|
|
20834
20940
|
);
|
|
20941
|
+
var SelectValue = React52__namespace.forwardRef(
|
|
20942
|
+
function SelectValue2({ placeholder, className, children, ...props }, ref) {
|
|
20943
|
+
const ctx = useSelectContext("SelectValue");
|
|
20944
|
+
const label = ctx.value !== void 0 ? ctx.labels.get(ctx.value) : void 0;
|
|
20945
|
+
const showPlaceholder = children == null && label === void 0;
|
|
20946
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
20947
|
+
"span",
|
|
20948
|
+
{
|
|
20949
|
+
ref,
|
|
20950
|
+
className: cn(selectValueClass, className),
|
|
20951
|
+
"data-placeholder": showPlaceholder ? "" : void 0,
|
|
20952
|
+
...props,
|
|
20953
|
+
children: children ?? (showPlaceholder ? placeholder ?? ctx.placeholder : label)
|
|
20954
|
+
}
|
|
20955
|
+
);
|
|
20956
|
+
}
|
|
20957
|
+
);
|
|
20835
20958
|
|
|
20836
20959
|
// ../status-indicator/dist/index.js
|
|
20837
20960
|
var STATUS_INDICATOR_COLORS = {
|
|
@@ -21613,7 +21736,9 @@ function createCallout(props = {}) {
|
|
|
21613
21736
|
const ariaProps = {};
|
|
21614
21737
|
if (props.role) {
|
|
21615
21738
|
ariaProps.role = props.role;
|
|
21616
|
-
} else {
|
|
21739
|
+
} else if (props.destructive) {
|
|
21740
|
+
ariaProps.role = "alert";
|
|
21741
|
+
} else if (props.labelled) {
|
|
21617
21742
|
ariaProps.role = "region";
|
|
21618
21743
|
}
|
|
21619
21744
|
return {
|
|
@@ -21656,7 +21781,10 @@ var calloutDescriptionVariants = cva({
|
|
|
21656
21781
|
});
|
|
21657
21782
|
var Callout = React52__namespace.forwardRef(
|
|
21658
21783
|
function Callout2({ className, variant, asChild = false, ...props }, ref) {
|
|
21659
|
-
const api = createCallout({
|
|
21784
|
+
const api = createCallout({
|
|
21785
|
+
destructive: variant === "destructive",
|
|
21786
|
+
labelled: Boolean(props["aria-label"] || props["aria-labelledby"])
|
|
21787
|
+
});
|
|
21660
21788
|
const classes = cn(calloutVariants({ variant }), className);
|
|
21661
21789
|
if (asChild) {
|
|
21662
21790
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -25929,7 +26057,7 @@ function createEditorTabs(props = {}) {
|
|
|
25929
26057
|
}
|
|
25930
26058
|
return { ariaProps, dataAttributes };
|
|
25931
26059
|
}
|
|
25932
|
-
function
|
|
26060
|
+
function getNextTabIndex2(currentIndex, key, count) {
|
|
25933
26061
|
if (count <= 0) return currentIndex;
|
|
25934
26062
|
switch (key) {
|
|
25935
26063
|
case "ArrowRight":
|
|
@@ -25987,7 +26115,7 @@ var EditorTabs = React52__namespace.forwardRef(
|
|
|
25987
26115
|
const activeIndex = tabs.findIndex((t) => t.id === activeId);
|
|
25988
26116
|
const tabbableIndex = activeIndex === -1 ? 0 : activeIndex;
|
|
25989
26117
|
const handleKeyDown = (event, index2) => {
|
|
25990
|
-
const next =
|
|
26118
|
+
const next = getNextTabIndex2(index2, event.key, tabs.length);
|
|
25991
26119
|
if (next !== index2) {
|
|
25992
26120
|
event.preventDefault();
|
|
25993
26121
|
onSelect(tabs[next].id);
|
|
@@ -29672,11 +29800,420 @@ var SlotPicker = React52__namespace.forwardRef(
|
|
|
29672
29800
|
}
|
|
29673
29801
|
);
|
|
29674
29802
|
|
|
29803
|
+
// ../action-list/dist/index.js
|
|
29804
|
+
function createActionListItem(props = {}) {
|
|
29805
|
+
const { disabled = false, density = "default" } = props;
|
|
29806
|
+
const dataAttributes = {
|
|
29807
|
+
"data-slot": "action-list-item",
|
|
29808
|
+
"data-density": density
|
|
29809
|
+
};
|
|
29810
|
+
if (disabled) dataAttributes["data-disabled"] = "";
|
|
29811
|
+
const ariaProps = {};
|
|
29812
|
+
if (disabled) ariaProps["aria-disabled"] = true;
|
|
29813
|
+
return { ariaProps, dataAttributes };
|
|
29814
|
+
}
|
|
29815
|
+
var actionListClass = "m-0 flex list-none flex-col divide-y divide-border-subtle p-0";
|
|
29816
|
+
var actionListItemVariants = cva({
|
|
29817
|
+
base: "flex w-full items-center gap-4 bg-transparent text-left text-sm text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
|
|
29818
|
+
variants: {
|
|
29819
|
+
density: {
|
|
29820
|
+
default: "px-4 py-3",
|
|
29821
|
+
compact: "px-3 py-2"
|
|
29822
|
+
}
|
|
29823
|
+
},
|
|
29824
|
+
defaultVariants: {
|
|
29825
|
+
density: "default"
|
|
29826
|
+
}
|
|
29827
|
+
});
|
|
29828
|
+
var actionListItemBodyClass = "flex min-w-0 flex-1 flex-col gap-0.5";
|
|
29829
|
+
var actionListItemTitleClass = "break-words font-semibold text-foreground";
|
|
29830
|
+
var actionListItemDescriptionClass = "break-words text-xs text-muted-foreground";
|
|
29831
|
+
var actionListItemMetaClass = "break-words text-xs text-muted-foreground";
|
|
29832
|
+
var actionListItemTrailingClass = "flex flex-none items-center gap-4 text-xs tabular-nums text-muted-foreground";
|
|
29833
|
+
var ActionList = React52__namespace.forwardRef(function ActionList2({ className, ...props }, ref) {
|
|
29834
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ul", { ref, className: cn(actionListClass, className), "data-slot": "action-list", ...props });
|
|
29835
|
+
});
|
|
29836
|
+
var ActionListItem = React52__namespace.forwardRef(
|
|
29837
|
+
function ActionListItem2({ title, description, meta, trailing, density = "default", disabled, className, ...props }, ref) {
|
|
29838
|
+
const api = createActionListItem({ disabled, density });
|
|
29839
|
+
return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
29840
|
+
"button",
|
|
29841
|
+
{
|
|
29842
|
+
ref,
|
|
29843
|
+
type: "button",
|
|
29844
|
+
disabled,
|
|
29845
|
+
className: cn(actionListItemVariants({ density }), className),
|
|
29846
|
+
...api.ariaProps,
|
|
29847
|
+
...api.dataAttributes,
|
|
29848
|
+
...props,
|
|
29849
|
+
children: [
|
|
29850
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: actionListItemBodyClass, children: [
|
|
29851
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: actionListItemTitleClass, children: title }),
|
|
29852
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: actionListItemDescriptionClass, children: description }),
|
|
29853
|
+
meta != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: actionListItemMetaClass, children: meta })
|
|
29854
|
+
] }),
|
|
29855
|
+
trailing != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: actionListItemTrailingClass, children: trailing })
|
|
29856
|
+
]
|
|
29857
|
+
}
|
|
29858
|
+
) });
|
|
29859
|
+
}
|
|
29860
|
+
);
|
|
29861
|
+
|
|
29862
|
+
// ../funnel-chart/dist/index.js
|
|
29863
|
+
var DEFAULT_FUNNEL_MIN_BAR_PERCENT = 6;
|
|
29864
|
+
var percentOf = (part, whole) => whole ? part / whole * 100 : 0;
|
|
29865
|
+
function computeFunnel(steps, minBarPercent = DEFAULT_FUNNEL_MIN_BAR_PERCENT) {
|
|
29866
|
+
const top = steps.length ? steps[0].value : 0;
|
|
29867
|
+
return steps.map((step, i) => {
|
|
29868
|
+
const shareOfTop = percentOf(step.value, top);
|
|
29869
|
+
const following = steps[i + 1];
|
|
29870
|
+
return {
|
|
29871
|
+
step,
|
|
29872
|
+
shareOfTop,
|
|
29873
|
+
barPercent: Math.min(100, Math.max(shareOfTop, minBarPercent)),
|
|
29874
|
+
next: following ? {
|
|
29875
|
+
conversion: percentOf(following.value, step.value),
|
|
29876
|
+
dropped: step.value - following.value
|
|
29877
|
+
} : void 0
|
|
29878
|
+
};
|
|
29879
|
+
});
|
|
29880
|
+
}
|
|
29881
|
+
var funnelChartDefaults = {
|
|
29882
|
+
formatValue: (value) => value.toLocaleString("en-US"),
|
|
29883
|
+
formatPercent: (percent) => `${percent.toFixed(1)}%`,
|
|
29884
|
+
shareLabel: (share) => `${share} of top`,
|
|
29885
|
+
conversionLabel: (percent) => `${percent} continue`,
|
|
29886
|
+
droppedLabel: (count) => `\u2212${count} dropped`
|
|
29887
|
+
};
|
|
29888
|
+
var funnelChartClasses = {
|
|
29889
|
+
root: "m-0 grid list-none p-0",
|
|
29890
|
+
bar: "relative flex items-center gap-3 overflow-hidden rounded-lg border border-border bg-background px-3.5 py-3",
|
|
29891
|
+
fill: "absolute inset-y-0 left-0 border-r-2 border-primary bg-accent",
|
|
29892
|
+
chevron: "relative shrink-0 text-primary",
|
|
29893
|
+
text: "relative grid min-w-0 flex-1",
|
|
29894
|
+
label: "text-[13px] font-bold text-foreground",
|
|
29895
|
+
description: "text-[11px] text-muted-foreground",
|
|
29896
|
+
figure: "relative grid text-right",
|
|
29897
|
+
value: "text-[15px] font-bold tabular-nums text-foreground",
|
|
29898
|
+
share: "text-[10.5px] text-muted-foreground",
|
|
29899
|
+
transition: "flex items-center gap-2 py-1.5 pl-[18px] text-[11px] text-muted-foreground",
|
|
29900
|
+
conversion: "font-semibold text-success",
|
|
29901
|
+
dropped: "font-semibold text-destructive"
|
|
29902
|
+
};
|
|
29903
|
+
function Chevron() {
|
|
29904
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
29905
|
+
"svg",
|
|
29906
|
+
{
|
|
29907
|
+
className: funnelChartClasses.chevron,
|
|
29908
|
+
width: "15",
|
|
29909
|
+
height: "15",
|
|
29910
|
+
viewBox: "0 0 24 24",
|
|
29911
|
+
fill: "none",
|
|
29912
|
+
stroke: "currentColor",
|
|
29913
|
+
strokeWidth: "2",
|
|
29914
|
+
strokeLinecap: "round",
|
|
29915
|
+
strokeLinejoin: "round",
|
|
29916
|
+
"aria-hidden": "true",
|
|
29917
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 18 6-6-6-6" })
|
|
29918
|
+
}
|
|
29919
|
+
);
|
|
29920
|
+
}
|
|
29921
|
+
var FunnelChart = React52__namespace.forwardRef(function FunnelChart2({
|
|
29922
|
+
steps,
|
|
29923
|
+
formatValue = funnelChartDefaults.formatValue,
|
|
29924
|
+
formatPercent = funnelChartDefaults.formatPercent,
|
|
29925
|
+
minBarPercent = DEFAULT_FUNNEL_MIN_BAR_PERCENT,
|
|
29926
|
+
shareLabel = funnelChartDefaults.shareLabel,
|
|
29927
|
+
conversionLabel = funnelChartDefaults.conversionLabel,
|
|
29928
|
+
droppedLabel = funnelChartDefaults.droppedLabel,
|
|
29929
|
+
className,
|
|
29930
|
+
...rest
|
|
29931
|
+
}, ref) {
|
|
29932
|
+
const rows = React52__namespace.useMemo(() => computeFunnel(steps, minBarPercent), [steps, minBarPercent]);
|
|
29933
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ol", { ref, className: cn(funnelChartClasses.root, className), "data-slot": "funnel-chart", ...rest, children: rows.map((row) => /* @__PURE__ */ jsxRuntime.jsxs("li", { children: [
|
|
29934
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: funnelChartClasses.bar, children: [
|
|
29935
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: funnelChartClasses.fill, style: { width: `${row.barPercent}%` }, "aria-hidden": "true" }),
|
|
29936
|
+
/* @__PURE__ */ jsxRuntime.jsx(Chevron, {}),
|
|
29937
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: funnelChartClasses.text, children: [
|
|
29938
|
+
/* @__PURE__ */ jsxRuntime.jsx("b", { className: funnelChartClasses.label, children: row.step.label }),
|
|
29939
|
+
row.step.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: funnelChartClasses.description, children: row.step.description })
|
|
29940
|
+
] }),
|
|
29941
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: funnelChartClasses.figure, children: [
|
|
29942
|
+
/* @__PURE__ */ jsxRuntime.jsx("b", { className: funnelChartClasses.value, children: formatValue(row.step.value) }),
|
|
29943
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: funnelChartClasses.share, children: shareLabel(formatPercent(row.shareOfTop)) })
|
|
29944
|
+
] })
|
|
29945
|
+
] }),
|
|
29946
|
+
row.next && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: funnelChartClasses.transition, children: [
|
|
29947
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: funnelChartClasses.conversion, children: conversionLabel(formatPercent(row.next.conversion)) }),
|
|
29948
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
29949
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: funnelChartClasses.dropped, children: droppedLabel(formatValue(row.next.dropped)) })
|
|
29950
|
+
] })
|
|
29951
|
+
] }, row.step.id)) });
|
|
29952
|
+
});
|
|
29953
|
+
|
|
29954
|
+
// ../line-chart/dist/index.js
|
|
29955
|
+
var DEFAULT_LINE_CHART_PADDING = {
|
|
29956
|
+
top: 14,
|
|
29957
|
+
right: 14,
|
|
29958
|
+
bottom: 24,
|
|
29959
|
+
left: 40
|
|
29960
|
+
};
|
|
29961
|
+
var DEFAULT_LINE_CHART_WIDTH = 760;
|
|
29962
|
+
var DEFAULT_LINE_CHART_HEIGHT = 230;
|
|
29963
|
+
var DEFAULT_TICK_COUNT = 4;
|
|
29964
|
+
var DEFAULT_HEADROOM = 1.08;
|
|
29965
|
+
var DEFAULT_LABEL_EVERY = 2;
|
|
29966
|
+
var CHART_TOKEN_COUNT = 5;
|
|
29967
|
+
function lineChartColor(index2) {
|
|
29968
|
+
return `hsl(var(--chart-${index2 % CHART_TOKEN_COUNT + 1}))`;
|
|
29969
|
+
}
|
|
29970
|
+
function pathFrom(points) {
|
|
29971
|
+
return points.map(([px, py], i) => (i ? "L" : "M") + px.toFixed(1) + " " + py.toFixed(1)).join(" ");
|
|
29972
|
+
}
|
|
29973
|
+
function computeLineChart(options) {
|
|
29974
|
+
const {
|
|
29975
|
+
series,
|
|
29976
|
+
labels,
|
|
29977
|
+
width,
|
|
29978
|
+
height,
|
|
29979
|
+
tickCount = DEFAULT_TICK_COUNT,
|
|
29980
|
+
headroom = DEFAULT_HEADROOM,
|
|
29981
|
+
labelEvery = DEFAULT_LABEL_EVERY
|
|
29982
|
+
} = options;
|
|
29983
|
+
const padding = { ...DEFAULT_LINE_CHART_PADDING, ...options.padding };
|
|
29984
|
+
const n = labels.length;
|
|
29985
|
+
const values = series.flatMap((s) => s.data);
|
|
29986
|
+
const peak = values.length ? Math.max(...values) : 0;
|
|
29987
|
+
const max = peak > 0 ? peak * headroom : 1;
|
|
29988
|
+
const plotW = width - padding.left - padding.right;
|
|
29989
|
+
const plotTop = padding.top;
|
|
29990
|
+
const plotBottom = height - padding.bottom;
|
|
29991
|
+
const plotH = plotBottom - plotTop;
|
|
29992
|
+
const x = (index2) => padding.left + (n > 1 ? index2 / (n - 1) * plotW : plotW / 2);
|
|
29993
|
+
const y = (value) => plotTop + (1 - value / max) * plotH;
|
|
29994
|
+
const ticks = Array.from({ length: tickCount + 1 }, (_2, t) => {
|
|
29995
|
+
const value = max / tickCount * t;
|
|
29996
|
+
return { value, y: y(value) };
|
|
29997
|
+
});
|
|
29998
|
+
const xLabels = labels.map((label, index2) => ({ index: index2, label, x: x(index2) })).filter(({ index: index2 }) => index2 % labelEvery === 0 || index2 === n - 1);
|
|
29999
|
+
const paths = series.map((s, si) => {
|
|
30000
|
+
const points = s.data.map((v2, i) => [x(i), y(v2)]);
|
|
30001
|
+
const line = pathFrom(points);
|
|
30002
|
+
const first = points.length ? points[0][0] : x(0);
|
|
30003
|
+
const last = points.length ? points[points.length - 1][0] : x(0);
|
|
30004
|
+
const base = y(0).toFixed(1);
|
|
30005
|
+
const area = `${line} L ${last.toFixed(1)} ${base} L ${first.toFixed(1)} ${base} Z`;
|
|
30006
|
+
return { id: s.id, color: s.color ?? lineChartColor(si), line, area };
|
|
30007
|
+
});
|
|
30008
|
+
const colW = n > 1 ? plotW / (n - 1) : plotW;
|
|
30009
|
+
const columns = labels.map((_2, index2) => ({
|
|
30010
|
+
index: index2,
|
|
30011
|
+
x: x(index2) - colW / 2,
|
|
30012
|
+
width: colW
|
|
30013
|
+
}));
|
|
30014
|
+
return { width, height, padding, max, ticks, xLabels, paths, columns, x, y, plotTop, plotBottom };
|
|
30015
|
+
}
|
|
30016
|
+
function tooltipLeftPercent(geometry, index2) {
|
|
30017
|
+
return geometry.x(index2) / geometry.width * 100;
|
|
30018
|
+
}
|
|
30019
|
+
function nextLineChartIndex(current, key, count) {
|
|
30020
|
+
if (count === 0) return null;
|
|
30021
|
+
const last = count - 1;
|
|
30022
|
+
switch (key) {
|
|
30023
|
+
case "ArrowRight":
|
|
30024
|
+
return current == null ? 0 : Math.min(current + 1, last);
|
|
30025
|
+
case "ArrowLeft":
|
|
30026
|
+
return current == null ? last : Math.max(current - 1, 0);
|
|
30027
|
+
case "Home":
|
|
30028
|
+
return 0;
|
|
30029
|
+
case "End":
|
|
30030
|
+
return last;
|
|
30031
|
+
default:
|
|
30032
|
+
return current;
|
|
30033
|
+
}
|
|
30034
|
+
}
|
|
30035
|
+
var lineChartClasses = {
|
|
30036
|
+
root: "relative",
|
|
30037
|
+
svg: "block w-full rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
30038
|
+
gridline: "stroke-border",
|
|
30039
|
+
axis: "fill-muted-foreground text-[9px]",
|
|
30040
|
+
crosshair: "stroke-border",
|
|
30041
|
+
marker: "stroke-card",
|
|
30042
|
+
tooltip: "pointer-events-none absolute z-10 -translate-x-1/2 whitespace-nowrap rounded-md bg-tertiary px-2.5 py-2 text-[11px] text-tertiary-foreground shadow-lg",
|
|
30043
|
+
tooltipLabel: "mb-1 opacity-60",
|
|
30044
|
+
tooltipRow: "flex justify-between gap-2",
|
|
30045
|
+
legend: "mt-2.5 flex flex-wrap gap-3.5",
|
|
30046
|
+
legendItem: "inline-flex items-center gap-1.5 text-[11px] text-muted-foreground",
|
|
30047
|
+
legendSwatch: "h-[3px] w-2.5 rounded-sm"
|
|
30048
|
+
};
|
|
30049
|
+
var defaultFormat = (value) => String(Math.round(value));
|
|
30050
|
+
var MARKER_RADIUS = 3.5;
|
|
30051
|
+
var STROKE_WIDTH = 2.2;
|
|
30052
|
+
var TOOLTIP_TOP_PX = 8;
|
|
30053
|
+
var LineChart = React52__namespace.forwardRef(function LineChart2({
|
|
30054
|
+
series,
|
|
30055
|
+
labels,
|
|
30056
|
+
ariaLabel,
|
|
30057
|
+
height = DEFAULT_LINE_CHART_HEIGHT,
|
|
30058
|
+
width = DEFAULT_LINE_CHART_WIDTH,
|
|
30059
|
+
formatValue = defaultFormat,
|
|
30060
|
+
formatTick: formatTick2,
|
|
30061
|
+
area,
|
|
30062
|
+
showLegend = true,
|
|
30063
|
+
className,
|
|
30064
|
+
...rest
|
|
30065
|
+
}, ref) {
|
|
30066
|
+
const [active, setActive] = React52__namespace.useState(null);
|
|
30067
|
+
const gradientBase = React52__namespace.useId().replace(/:/g, "");
|
|
30068
|
+
const geo = React52__namespace.useMemo(
|
|
30069
|
+
() => computeLineChart({ series, labels, width, height }),
|
|
30070
|
+
[series, labels, width, height]
|
|
30071
|
+
);
|
|
30072
|
+
const fillArea = area ?? series.length === 1;
|
|
30073
|
+
const tick = formatTick2 ?? formatValue;
|
|
30074
|
+
const handleKeyDown = (event) => {
|
|
30075
|
+
const next = nextLineChartIndex(active, event.key, labels.length);
|
|
30076
|
+
if (next === active) return;
|
|
30077
|
+
event.preventDefault();
|
|
30078
|
+
setActive(next);
|
|
30079
|
+
};
|
|
30080
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn(lineChartClasses.root, className), "data-slot": "line-chart", ...rest, children: [
|
|
30081
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
30082
|
+
"svg",
|
|
30083
|
+
{
|
|
30084
|
+
className: lineChartClasses.svg,
|
|
30085
|
+
viewBox: `0 0 ${width} ${height}`,
|
|
30086
|
+
style: { height },
|
|
30087
|
+
role: "img",
|
|
30088
|
+
"aria-label": ariaLabel,
|
|
30089
|
+
tabIndex: 0,
|
|
30090
|
+
onKeyDown: handleKeyDown,
|
|
30091
|
+
onBlur: () => setActive(null),
|
|
30092
|
+
onMouseLeave: () => setActive(null),
|
|
30093
|
+
children: [
|
|
30094
|
+
geo.ticks.map((t, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
30095
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { className: lineChartClasses.gridline, x1: geo.padding.left, y1: t.y, x2: width - geo.padding.right, y2: t.y }),
|
|
30096
|
+
/* @__PURE__ */ jsxRuntime.jsx("text", { className: lineChartClasses.axis, x: geo.padding.left - 8, y: t.y + 3, textAnchor: "end", children: tick(t.value) })
|
|
30097
|
+
] }, i)),
|
|
30098
|
+
geo.xLabels.map((l2) => /* @__PURE__ */ jsxRuntime.jsx("text", { className: lineChartClasses.axis, x: l2.x, y: height - 6, textAnchor: "middle", children: l2.label }, l2.index)),
|
|
30099
|
+
geo.paths.map((p, si) => {
|
|
30100
|
+
const gid = `${gradientBase}-${si}`;
|
|
30101
|
+
const value = active != null ? series[si].data[active] : void 0;
|
|
30102
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
30103
|
+
fillArea && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
30104
|
+
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gid, x1: "0", y1: "0", x2: "0", y2: "1", children: [
|
|
30105
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: p.color, stopOpacity: "0.22" }),
|
|
30106
|
+
/* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: p.color, stopOpacity: "0" })
|
|
30107
|
+
] }) }),
|
|
30108
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: p.area, fill: `url(#${gid})` })
|
|
30109
|
+
] }),
|
|
30110
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
30111
|
+
"path",
|
|
30112
|
+
{
|
|
30113
|
+
d: p.line,
|
|
30114
|
+
fill: "none",
|
|
30115
|
+
stroke: p.color,
|
|
30116
|
+
strokeWidth: STROKE_WIDTH,
|
|
30117
|
+
strokeLinecap: "round",
|
|
30118
|
+
strokeLinejoin: "round"
|
|
30119
|
+
}
|
|
30120
|
+
),
|
|
30121
|
+
active != null && value != null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
30122
|
+
"circle",
|
|
30123
|
+
{
|
|
30124
|
+
className: lineChartClasses.marker,
|
|
30125
|
+
cx: geo.x(active),
|
|
30126
|
+
cy: geo.y(value),
|
|
30127
|
+
r: MARKER_RADIUS,
|
|
30128
|
+
fill: p.color,
|
|
30129
|
+
strokeWidth: "1.5"
|
|
30130
|
+
}
|
|
30131
|
+
)
|
|
30132
|
+
] }, p.id);
|
|
30133
|
+
}),
|
|
30134
|
+
active != null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
30135
|
+
"line",
|
|
30136
|
+
{
|
|
30137
|
+
className: lineChartClasses.crosshair,
|
|
30138
|
+
x1: geo.x(active),
|
|
30139
|
+
y1: geo.plotTop,
|
|
30140
|
+
x2: geo.x(active),
|
|
30141
|
+
y2: geo.plotBottom,
|
|
30142
|
+
strokeDasharray: "3 3"
|
|
30143
|
+
}
|
|
30144
|
+
),
|
|
30145
|
+
geo.columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
30146
|
+
"rect",
|
|
30147
|
+
{
|
|
30148
|
+
"data-index": col.index,
|
|
30149
|
+
x: col.x,
|
|
30150
|
+
y: 0,
|
|
30151
|
+
width: col.width,
|
|
30152
|
+
height,
|
|
30153
|
+
fill: "transparent",
|
|
30154
|
+
onMouseEnter: () => setActive(col.index)
|
|
30155
|
+
},
|
|
30156
|
+
col.index
|
|
30157
|
+
))
|
|
30158
|
+
]
|
|
30159
|
+
}
|
|
30160
|
+
),
|
|
30161
|
+
active != null && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
30162
|
+
"div",
|
|
30163
|
+
{
|
|
30164
|
+
className: lineChartClasses.tooltip,
|
|
30165
|
+
role: "status",
|
|
30166
|
+
style: { left: `${tooltipLeftPercent(geo, active)}%`, top: TOOLTIP_TOP_PX },
|
|
30167
|
+
children: [
|
|
30168
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: lineChartClasses.tooltipLabel, children: labels[active] }),
|
|
30169
|
+
series.map((s, si) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: lineChartClasses.tooltipRow, children: [
|
|
30170
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: geo.paths[si].color }, children: s.name }),
|
|
30171
|
+
/* @__PURE__ */ jsxRuntime.jsx("b", { children: s.data[active] != null ? formatValue(s.data[active]) : "\u2014" })
|
|
30172
|
+
] }, s.id))
|
|
30173
|
+
]
|
|
30174
|
+
}
|
|
30175
|
+
),
|
|
30176
|
+
showLegend && /* @__PURE__ */ jsxRuntime.jsx("div", { className: lineChartClasses.legend, children: series.map((s, si) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: lineChartClasses.legendItem, children: [
|
|
30177
|
+
/* @__PURE__ */ jsxRuntime.jsx("i", { className: lineChartClasses.legendSwatch, style: { background: geo.paths[si].color }, "aria-hidden": "true" }),
|
|
30178
|
+
s.name
|
|
30179
|
+
] }, s.id)) })
|
|
30180
|
+
] });
|
|
30181
|
+
});
|
|
30182
|
+
|
|
30183
|
+
// ../page-header/dist/index.js
|
|
30184
|
+
function createPageHeader(props = {}) {
|
|
30185
|
+
return {
|
|
30186
|
+
dataAttributes: {
|
|
30187
|
+
"data-slot": "page-header",
|
|
30188
|
+
"data-has-actions": props.hasActions ? "true" : "false"
|
|
30189
|
+
}
|
|
30190
|
+
};
|
|
30191
|
+
}
|
|
30192
|
+
var pageHeaderClass = "flex flex-wrap items-start justify-between gap-4";
|
|
30193
|
+
var pageHeaderTextClass = "flex min-w-0 flex-1 flex-col gap-1";
|
|
30194
|
+
var pageHeaderKickerClass = "break-words text-[11px] uppercase tracking-wider text-muted-foreground";
|
|
30195
|
+
var pageHeaderTitleClass = "break-words text-xl font-semibold text-foreground";
|
|
30196
|
+
var pageHeaderDescriptionClass = "max-w-prose text-sm text-muted-foreground";
|
|
30197
|
+
var pageHeaderActionsClass = "flex flex-none flex-wrap items-center gap-2";
|
|
30198
|
+
var PageHeader = React52__namespace.forwardRef(function PageHeader2({ kicker, title, description, actions, as: Title = "h1", className, ...props }, ref) {
|
|
30199
|
+
const { dataAttributes } = createPageHeader({ hasActions: actions != null });
|
|
30200
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("header", { ref, className: cn(pageHeaderClass, className), ...dataAttributes, ...props, children: [
|
|
30201
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: pageHeaderTextClass, children: [
|
|
30202
|
+
kicker != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: pageHeaderKickerClass, children: kicker }),
|
|
30203
|
+
/* @__PURE__ */ jsxRuntime.jsx(Title, { className: pageHeaderTitleClass, children: title }),
|
|
30204
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: pageHeaderDescriptionClass, children: description })
|
|
30205
|
+
] }),
|
|
30206
|
+
actions != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: pageHeaderActionsClass, children: actions })
|
|
30207
|
+
] });
|
|
30208
|
+
});
|
|
30209
|
+
|
|
29675
30210
|
exports.AIProvider = AIProvider;
|
|
29676
30211
|
exports.Accordion = Accordion;
|
|
29677
30212
|
exports.AccordionContent = AccordionContent;
|
|
29678
30213
|
exports.AccordionItem = AccordionItem;
|
|
29679
30214
|
exports.AccordionTrigger = AccordionTrigger;
|
|
30215
|
+
exports.ActionList = ActionList;
|
|
30216
|
+
exports.ActionListItem = ActionListItem;
|
|
29680
30217
|
exports.AltHintState = AltHintState;
|
|
29681
30218
|
exports.AnalyticsProvider = AnalyticsProvider;
|
|
29682
30219
|
exports.AnimatedText = AnimatedText;
|
|
@@ -29794,6 +30331,7 @@ exports.FileUpload = FileUpload;
|
|
|
29794
30331
|
exports.FloatingReactions = FloatingReactions;
|
|
29795
30332
|
exports.FlowEditor = FlowEditor;
|
|
29796
30333
|
exports.Footer = Footer;
|
|
30334
|
+
exports.FunnelChart = FunnelChart;
|
|
29797
30335
|
exports.Gradient = Gradient;
|
|
29798
30336
|
exports.GraphView = GraphView;
|
|
29799
30337
|
exports.Histogram = Histogram;
|
|
@@ -29812,6 +30350,7 @@ exports.KanbanColumn = KanbanColumn;
|
|
|
29812
30350
|
exports.KeyboardShortcut = KeyboardShortcut;
|
|
29813
30351
|
exports.LanguageSelector = LanguageSelector;
|
|
29814
30352
|
exports.Line = Line;
|
|
30353
|
+
exports.LineChart = LineChart;
|
|
29815
30354
|
exports.LinkCard = LinkCard;
|
|
29816
30355
|
exports.LiveCaptions = LiveCaptions;
|
|
29817
30356
|
exports.LiveCursors = LiveCursors;
|
|
@@ -29831,6 +30370,7 @@ exports.NumberedSteps = NumberedSteps;
|
|
|
29831
30370
|
exports.OtpInput = OtpInput;
|
|
29832
30371
|
exports.PRESENCE_STATUS_COLORS = STATUS_COLORS;
|
|
29833
30372
|
exports.PRESENCE_STATUS_LABELS = STATUS_LABELS;
|
|
30373
|
+
exports.PageHeader = PageHeader;
|
|
29834
30374
|
exports.Pagination = Pagination;
|
|
29835
30375
|
exports.PasswordInput = PasswordInput;
|
|
29836
30376
|
exports.Payment = Payment;
|
|
@@ -29870,6 +30410,7 @@ exports.Select = Select;
|
|
|
29870
30410
|
exports.SelectContent = SelectContent;
|
|
29871
30411
|
exports.SelectItem = SelectItem;
|
|
29872
30412
|
exports.SelectTrigger = SelectTrigger;
|
|
30413
|
+
exports.SelectValue = SelectValue;
|
|
29873
30414
|
exports.Separator = Separator;
|
|
29874
30415
|
exports.Sheet = Sheet;
|
|
29875
30416
|
exports.SheetClose = SheetClose;
|