@refraction-ui/react 0.21.0 → 0.23.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-H54FLNAF.js → chunk-63N4PZUJ.js} +2 -2
- package/dist/chunk-7P7EJ56S.js +7 -0
- 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-XWP763SH.js → chunk-V727VZOE.js} +4 -2
- package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
- package/dist/{chunk-AMK4VCBG.js → chunk-WYKPPK3W.js} +2 -2
- package/dist/{chunk-ONACRMG4.js → chunk-XMFNBOPO.js} +2 -2
- package/dist/{chunk-NKCWOPNX.js → chunk-Z5IHYNQD.js} +12 -8
- package/dist/chunk-Z5IHYNQD.js.map +7 -0
- package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
- package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +1 -1
- package/dist/index.cjs +1305 -302
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/internal/action-list/index.d.ts +39 -0
- package/dist/internal/avatar/index.d.cts +4 -1
- package/dist/internal/avatar/index.d.ts +4 -1
- 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/data-table/index.d.cts +48 -3
- package/dist/internal/data-table/index.d.ts +48 -3
- package/dist/internal/funnel-chart/index.d.ts +60 -0
- package/dist/internal/line-chart/index.d.ts +124 -0
- package/dist/internal/native-select/index.d.ts +21 -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-avatar/index.d.cts +4 -2
- package/dist/internal/react-avatar/index.d.ts +4 -2
- package/dist/internal/react-card/index.d.cts +10 -4
- package/dist/internal/react-card/index.d.ts +10 -4
- package/dist/internal/react-command/index.d.cts +13 -2
- package/dist/internal/react-command/index.d.ts +13 -2
- package/dist/internal/react-data-table/index.d.cts +27 -9
- package/dist/internal/react-data-table/index.d.ts +27 -9
- package/dist/internal/react-dialog/index.d.cts +5 -0
- package/dist/internal/react-dialog/index.d.ts +5 -0
- package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
- package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
- package/dist/internal/react-funnel-chart/index.d.ts +28 -0
- package/dist/internal/react-line-chart/index.d.ts +38 -0
- package/dist/internal/react-native-select/index.d.ts +19 -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/react-stat-grid/index.d.ts +22 -11
- package/dist/internal/react-table/index.d.ts +39 -0
- 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/stat-grid/index.d.ts +49 -7
- package/dist/internal/table/index.d.ts +46 -0
- 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 +16 -4
- package/dist/react-analytics.js.map +2 -2
- 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 +13 -9
- package/dist/react-avatar.js.map +2 -2
- 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 +115 -70
- package/dist/react-command.js.map +3 -3
- 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 +125 -114
- package/dist/react-data-table.js.map +2 -2
- package/dist/react-date-picker.js +1 -1
- package/dist/react-device-frame.js +1 -1
- package/dist/react-dialog.js +33 -9
- package/dist/react-dialog.js.map +2 -2
- package/dist/react-diff-viewer.js +1 -1
- package/dist/react-dropdown-menu.js +61 -8
- package/dist/react-dropdown-menu.js.map +3 -3
- 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 +280 -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 +3 -3
- 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-native-select.js +52 -0
- package/dist/react-native-select.js.map +7 -0
- 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 +91 -22
- package/dist/react-stat-grid.js.map +2 -2
- 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-table.js +148 -0
- package/dist/react-table.js.map +7 -0
- package/dist/react-tabs.js +84 -7
- 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 +7 -1
- package/dist/chunk-NKCWOPNX.js.map +0 -7
- package/dist/chunk-SDZ3LROZ.js +0 -7
- package/dist/chunk-Y2FNNAIL.js.map +0 -1
- package/dist/chunk-ZF3OHCGV.js.map +0 -7
- package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
- /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-SDZ3LROZ.js.map → chunk-7P7EJ56S.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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Button
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-Z5IHYNQD.js";
|
|
4
|
+
import "./chunk-QDMLIDYN.js";
|
|
5
5
|
import {
|
|
6
6
|
cn,
|
|
7
7
|
cva
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2Q6HHFAN.js";
|
|
9
9
|
|
|
10
10
|
// ../react-social-auth-button/dist/index.js
|
|
11
11
|
import * as React from "react";
|
package/dist/react-stat-grid.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn,
|
|
3
3
|
cva
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2Q6HHFAN.js";
|
|
5
5
|
|
|
6
6
|
// ../react-stat-grid/dist/index.js
|
|
7
7
|
import * as React from "react";
|
|
8
8
|
|
|
9
9
|
// ../stat-grid/dist/index.js
|
|
10
10
|
function statColumns(count, max = 3) {
|
|
11
|
-
if (count <=
|
|
12
|
-
if (count === 1) return 1;
|
|
11
|
+
if (count <= 1) return 1;
|
|
13
12
|
if (count === 2) return 2;
|
|
14
|
-
return Math.min(count, max);
|
|
13
|
+
return Math.min(count, max, 4);
|
|
14
|
+
}
|
|
15
|
+
function statColumnsKey(columns) {
|
|
16
|
+
if (columns === "auto") return "auto";
|
|
17
|
+
return String(Math.min(Math.max(Math.round(columns), 1), 4));
|
|
15
18
|
}
|
|
16
19
|
function createStatGrid() {
|
|
17
20
|
return {
|
|
@@ -20,44 +23,110 @@ function createStatGrid() {
|
|
|
20
23
|
};
|
|
21
24
|
}
|
|
22
25
|
var statGridVariants = cva({
|
|
23
|
-
base: "grid
|
|
26
|
+
base: "grid",
|
|
24
27
|
variants: {
|
|
25
28
|
columns: {
|
|
26
29
|
"1": "grid-cols-1",
|
|
27
|
-
"2": "grid-cols-2",
|
|
28
|
-
"3": "grid-cols-3"
|
|
30
|
+
"2": "grid-cols-1 sm:grid-cols-2",
|
|
31
|
+
"3": "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
32
|
+
"4": "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",
|
|
33
|
+
auto: "grid-cols-[repeat(auto-fill,minmax(12rem,1fr))]"
|
|
34
|
+
},
|
|
35
|
+
variant: {
|
|
36
|
+
plain: "gap-8",
|
|
37
|
+
card: "gap-3"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
defaultVariants: {
|
|
41
|
+
columns: "3",
|
|
42
|
+
variant: "plain"
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
var statItemVariants = cva({
|
|
46
|
+
base: "flex min-w-0 flex-col",
|
|
47
|
+
variants: {
|
|
48
|
+
variant: {
|
|
49
|
+
plain: "",
|
|
50
|
+
card: "gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
defaultVariants: {
|
|
54
|
+
variant: "plain"
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
var statValueVariants = cva({
|
|
58
|
+
base: "font-bold tabular-nums",
|
|
59
|
+
variants: {
|
|
60
|
+
variant: {
|
|
61
|
+
plain: "text-xl sm:text-2xl",
|
|
62
|
+
card: "text-2xl leading-tight"
|
|
63
|
+
},
|
|
64
|
+
tone: {
|
|
65
|
+
default: "",
|
|
66
|
+
positive: "text-success",
|
|
67
|
+
negative: "text-destructive",
|
|
68
|
+
caution: "text-warning"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
compoundVariants: [
|
|
72
|
+
{ variant: "plain", tone: "default", class: "text-primary" },
|
|
73
|
+
{ variant: "card", tone: "default", class: "text-foreground" }
|
|
74
|
+
],
|
|
75
|
+
defaultVariants: {
|
|
76
|
+
variant: "plain",
|
|
77
|
+
tone: "default"
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
var statLabelVariants = cva({
|
|
81
|
+
base: "text-muted-foreground",
|
|
82
|
+
variants: {
|
|
83
|
+
layout: {
|
|
84
|
+
"value-first": "mt-1 text-sm leading-snug",
|
|
85
|
+
"label-first": "text-xs uppercase tracking-wide"
|
|
29
86
|
}
|
|
30
87
|
},
|
|
31
88
|
defaultVariants: {
|
|
32
|
-
|
|
89
|
+
layout: "value-first"
|
|
33
90
|
}
|
|
34
91
|
});
|
|
35
|
-
var
|
|
36
|
-
var statValueClass = "text-xl sm:text-2xl font-bold text-primary";
|
|
37
|
-
var statLabelClass = "mt-1 text-sm text-muted-foreground leading-snug";
|
|
92
|
+
var statDescriptionClass = "text-xs leading-snug text-muted-foreground";
|
|
38
93
|
|
|
39
94
|
// ../react-stat-grid/dist/index.js
|
|
40
95
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
41
96
|
var StatGrid = React.forwardRef(
|
|
42
|
-
function StatGrid2({ items, columns, className, ...props }, ref) {
|
|
43
|
-
const cols = columns ?? statColumns(items.length);
|
|
97
|
+
function StatGrid2({ items, columns, variant = "plain", layout = "value-first", className, ...props }, ref) {
|
|
98
|
+
const cols = statColumnsKey(columns ?? statColumns(items.length));
|
|
44
99
|
const { ariaProps, dataAttributes } = createStatGrid();
|
|
45
100
|
return /* @__PURE__ */ jsx(
|
|
46
101
|
"div",
|
|
47
102
|
{
|
|
48
103
|
ref,
|
|
49
|
-
className: cn(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
),
|
|
53
|
-
style: { gridTemplateColumns: `repeat(${cols}, 1fr)` },
|
|
104
|
+
className: cn(statGridVariants({ columns: cols, variant }), className),
|
|
105
|
+
"data-variant": variant,
|
|
106
|
+
"data-layout": layout,
|
|
54
107
|
...ariaProps,
|
|
55
108
|
...dataAttributes,
|
|
56
109
|
...props,
|
|
57
|
-
children: items.map((item, index) =>
|
|
58
|
-
|
|
59
|
-
/* @__PURE__ */ jsx("span", { className:
|
|
60
|
-
|
|
110
|
+
children: items.map((item, index) => {
|
|
111
|
+
const { className: itemClassName, ...itemProps } = item.props ?? {};
|
|
112
|
+
const label = /* @__PURE__ */ jsx("span", { className: statLabelVariants({ layout }), children: item.label });
|
|
113
|
+
return /* @__PURE__ */ jsxs(
|
|
114
|
+
"div",
|
|
115
|
+
{
|
|
116
|
+
role: "listitem",
|
|
117
|
+
className: cn(statItemVariants({ variant }), itemClassName),
|
|
118
|
+
"data-tone": item.tone ?? "default",
|
|
119
|
+
...itemProps,
|
|
120
|
+
children: [
|
|
121
|
+
layout === "label-first" && label,
|
|
122
|
+
/* @__PURE__ */ jsx("span", { className: statValueVariants({ variant, tone: item.tone ?? "default" }), children: item.value }),
|
|
123
|
+
layout === "value-first" && label,
|
|
124
|
+
item.description != null && /* @__PURE__ */ jsx("span", { className: statDescriptionClass, children: item.description })
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
item.id ?? index
|
|
128
|
+
);
|
|
129
|
+
})
|
|
61
130
|
}
|
|
62
131
|
);
|
|
63
132
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../stat-grid/src/stat-grid.ts", "../../stat-grid/src/stat-grid.styles.ts", "../../react-stat-grid/src/stat-grid.tsx"],
|
|
4
|
-
"sourcesContent": ["/** A single stat callout displayed in the grid. */\nexport type StatItem = {\n /** The primary value displayed prominently (e.g. \"10k+\", \"$4.2M\"). */\n value: string\n /** The descriptive label
|
|
5
|
-
"mappings": ";;;;;;;;;
|
|
4
|
+
"sourcesContent": ["/** Semantic colour of a stat's value. */\nexport type StatTone = 'default' | 'positive' | 'negative' | 'caution'\n/** `plain` = marketing callouts; `card` = bordered dashboard KPI cards. */\nexport type StatGridVariant = 'plain' | 'card'\n/** Whether the label sits under the value (callout) or above it (KPI). */\nexport type StatGridLayout = 'value-first' | 'label-first'\n/** Column count: a fixed maximum that reflows down on narrow screens, or `auto`. */\nexport type StatGridColumns = 1 | 2 | 3 | 4 | 'auto'\n\n/** A single stat callout displayed in the grid. */\nexport type StatItem = {\n /** The primary value displayed prominently (e.g. \"10k+\", \"$4.2M\"). */\n value: string\n /** The descriptive label. */\n label: string\n /** Stable key; defaults to the index. */\n id?: string\n /** Optional line explaining the figure (how it was computed, a delta). */\n description?: string\n /** Colour of the value. Defaults to `default`. */\n tone?: StatTone\n}\n\nexport interface StatGridAPI {\n /** ARIA attributes to spread on the grid container element (`role=\"list\"`). */\n ariaProps: { role: 'list' }\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Compute the number of grid columns for a stat grid.\n *\n * - 1 item → 1 column\n * - 2 items → 2 columns\n * - 3 or more items → capped at `max` (default 3)\n */\nexport function statColumns(count: number, max = 3): 1 | 2 | 3 | 4 {\n if (count <= 1) return 1\n if (count === 2) return 2\n return Math.min(count, max, 4) as 3 | 4\n}\n\n/** The cva key for a column setting (clamped to the supported 1–4). */\nexport function statColumnsKey(columns: StatGridColumns): '1' | '2' | '3' | '4' | 'auto' {\n if (columns === 'auto') return 'auto'\n return String(Math.min(Math.max(Math.round(columns), 1), 4)) as '1' | '2' | '3' | '4'\n}\n\n/**\n * Build the framework-agnostic container props for a stat grid.\n *\n * Returns `role=\"list\"` and data attributes; adapters spread these onto their\n * container element and render the items themselves.\n */\nexport function createStatGrid(): StatGridAPI {\n return {\n ariaProps: { role: 'list' },\n dataAttributes: {},\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Grid container. Column counts are responsive (one column on a phone, more\n * as the width allows) — never a fixed inline template that cannot reflow.\n * `auto` fits as many ~12rem items per row as the width allows.\n */\nexport const statGridVariants = cva({\n base: 'grid',\n variants: {\n columns: {\n '1': 'grid-cols-1',\n '2': 'grid-cols-1 sm:grid-cols-2',\n '3': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n '4': 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n auto: 'grid-cols-[repeat(auto-fill,minmax(12rem,1fr))]',\n },\n variant: {\n plain: 'gap-8',\n card: 'gap-3',\n },\n },\n defaultVariants: {\n columns: '3',\n variant: 'plain',\n },\n})\n\n/** Individual stat item container (role=\"listitem\"). */\nexport const statItemVariants = cva({\n base: 'flex min-w-0 flex-col',\n variants: {\n variant: {\n plain: '',\n card: 'gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground',\n },\n },\n defaultVariants: {\n variant: 'plain',\n },\n})\n\n/** @deprecated Use `statItemVariants()`; kept for existing imports. */\nexport const statItemClass = 'flex flex-col'\n\n/** The value of a stat, by variant and tone. */\nexport const statValueVariants = cva({\n base: 'font-bold tabular-nums',\n variants: {\n variant: {\n plain: 'text-xl sm:text-2xl',\n card: 'text-2xl leading-tight',\n },\n tone: {\n default: '',\n positive: 'text-success',\n negative: 'text-destructive',\n caution: 'text-warning',\n },\n },\n compoundVariants: [\n { variant: 'plain', tone: 'default', class: 'text-primary' },\n { variant: 'card', tone: 'default', class: 'text-foreground' },\n ],\n defaultVariants: {\n variant: 'plain',\n tone: 'default',\n },\n})\n\n/** @deprecated Use `statValueVariants()`; kept for existing imports. */\nexport const statValueClass = 'text-xl sm:text-2xl font-bold text-primary'\n\n/** The descriptive label. Above the value it reads as a small caption. */\nexport const statLabelVariants = cva({\n base: 'text-muted-foreground',\n variants: {\n layout: {\n 'value-first': 'mt-1 text-sm leading-snug',\n 'label-first': 'text-xs uppercase tracking-wide',\n },\n },\n defaultVariants: {\n layout: 'value-first',\n },\n})\n\n/** @deprecated Use `statLabelVariants()`; kept for existing imports. */\nexport const statLabelClass = 'mt-1 text-sm text-muted-foreground leading-snug'\n\n/** Optional line under a stat explaining how it was computed. */\nexport const statDescriptionClass = 'text-xs leading-snug text-muted-foreground'\n", "import * as React from 'react'\nimport {\n createStatGrid,\n statColumns,\n statColumnsKey,\n statGridVariants,\n statItemVariants,\n statValueVariants,\n statLabelVariants,\n statDescriptionClass,\n type StatTone,\n type StatGridVariant,\n type StatGridLayout,\n type StatGridColumns,\n} from '@refraction-ui/stat-grid'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { StatItem, StatTone, StatGridVariant, StatGridLayout, StatGridColumns } from '@refraction-ui/stat-grid'\n\nexport interface StatGridItem {\n /** The primary value displayed prominently. Allows rich content in React. */\n value: React.ReactNode\n /** The descriptive label. */\n label: React.ReactNode\n /** Stable key; defaults to the index. */\n id?: string\n /** Optional line explaining the figure (how it was computed, a delta). */\n description?: React.ReactNode\n /** Colour of the value. Defaults to `default`. */\n tone?: StatTone\n /** Extra attributes for this item's element (`data-*`, `aria-*`, `title`, className). */\n props?: React.HTMLAttributes<HTMLDivElement>\n}\n\nexport interface StatGridProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'content'> {\n /** The stat items to display in the grid. */\n items: StatGridItem[]\n /**\n * Maximum columns (reflows to fewer on narrow screens), or `auto` to fit as\n * many ~12rem items as the width allows. Defaults to\n * `statColumns(items.length)`: 1 → 1, 2 → 2, 3+ → 3.\n */\n columns?: StatGridColumns\n /** `plain` marketing callouts (default) or bordered `card` KPIs. */\n variant?: StatGridVariant\n /** `value-first` (default) or `label-first` (dashboard KPI order). */\n layout?: StatGridLayout\n}\n\n/**\n * StatGrid — a responsive grid of stats: marketing callouts (`plain`) or\n * dashboard KPI cards (`card`), value- or label-first, with an optional\n * description and a tone per item. Uses `role=\"list\"` / `role=\"listitem\"`.\n */\nexport const StatGrid = React.forwardRef<HTMLDivElement, StatGridProps>(\n function StatGrid(\n { items, columns, variant = 'plain', layout = 'value-first', className, ...props },\n ref,\n ) {\n const cols = statColumnsKey(columns ?? statColumns(items.length))\n const { ariaProps, dataAttributes } = createStatGrid()\n\n return (\n <div\n ref={ref}\n className={cn(statGridVariants({ columns: cols, variant }), className)}\n data-variant={variant}\n data-layout={layout}\n {...ariaProps}\n {...dataAttributes}\n {...props}\n >\n {items.map((item, index) => {\n const { className: itemClassName, ...itemProps } = item.props ?? {}\n const label = <span className={statLabelVariants({ layout })}>{item.label}</span>\n return (\n <div\n key={item.id ?? index}\n role=\"listitem\"\n className={cn(statItemVariants({ variant }), itemClassName)}\n data-tone={item.tone ?? 'default'}\n {...itemProps}\n >\n {layout === 'label-first' && label}\n <span className={statValueVariants({ variant, tone: item.tone ?? 'default' })}>{item.value}</span>\n {layout === 'value-first' && label}\n {item.description != null && <span className={statDescriptionClass}>{item.description}</span>}\n </div>\n )\n })}\n </div>\n )\n },\n)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAqCO,SAAS,YAAY,OAAe,MAAM,GAAkB;AACjE,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,KAAK,IAAI,OAAO,KAAK,CAAC;AAC/B;AAGO,SAAS,eAAe,SAA0D;AACvF,MAAI,YAAY,OAAQ,QAAO;AAC/B,SAAO,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7D;AAQO,SAAS,iBAA8B;AAC5C,SAAO;IACL,WAAW,EAAE,MAAM,OAAA;IACnB,gBAAgB,CAAA;EAAC;AAErB;ACrDO,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,SAAS;MACP,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,MAAM;IAAA;IAER,SAAS;MACP,OAAO;MACP,MAAM;IAAA;EACR;EAEF,iBAAiB;IACf,SAAS;IACT,SAAS;EAAA;AAEb,CAAC;AAGM,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,SAAS;MACP,OAAO;MACP,MAAM;IAAA;EACR;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;AAMM,IAAM,oBAAoB,IAAI;EACnC,MAAM;EACN,UAAU;IACR,SAAS;MACP,OAAO;MACP,MAAM;IAAA;IAER,MAAM;MACJ,SAAS;MACT,UAAU;MACV,UAAU;MACV,SAAS;IAAA;EACX;EAEF,kBAAkB;IAChB,EAAE,SAAS,SAAS,MAAM,WAAW,OAAO,eAAA;IAC5C,EAAE,SAAS,QAAQ,MAAM,WAAW,OAAO,kBAAA;EAAkB;EAE/D,iBAAiB;IACf,SAAS;IACT,MAAM;EAAA;AAEV,CAAC;AAMM,IAAM,oBAAoB,IAAI;EACnC,MAAM;EACN,UAAU;IACR,QAAQ;MACN,eAAe;MACf,eAAe;IAAA;EACjB;EAEF,iBAAiB;IACf,QAAQ;EAAA;AAEZ,CAAC;AAMM,IAAM,uBAAuB;;;;ACpC7B,IAAM,WAAiB;EAC5B,SAASA,UACP,EAAE,OAAO,SAAS,UAAU,SAAS,SAAS,eAAe,WAAW,GAAG,MAAA,GAC3E,KACA;AACA,UAAM,OAAO,eAAe,WAAW,YAAY,MAAM,MAAM,CAAC;AAChE,UAAM,EAAE,WAAW,eAAA,IAAmB,eAAA;AAEtC,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,iBAAiB,EAAE,SAAS,MAAM,QAAA,CAAS,GAAG,SAAS;QACrE,gBAAc;QACd,eAAa;QACZ,GAAG;QACH,GAAG;QACH,GAAG;QAEH,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,gBAAM,EAAE,WAAW,eAAe,GAAG,UAAA,IAAc,KAAK,SAAS,CAAA;AACjE,gBAAM,QAAQ,oBAAC,QAAA,EAAK,WAAW,kBAAkB,EAAE,OAAA,CAAQ,GAAI,UAAA,KAAK,MAAA,CAAM;AAC1E,iBACE;YAAC;YAAA;cAEC,MAAK;cACL,WAAW,GAAG,iBAAiB,EAAE,QAAA,CAAS,GAAG,aAAa;cAC1D,aAAW,KAAK,QAAQ;cACvB,GAAG;cAEH,UAAA;gBAAA,WAAW,iBAAiB;gBAC7B,oBAAC,QAAA,EAAK,WAAW,kBAAkB,EAAE,SAAS,MAAM,KAAK,QAAQ,UAAA,CAAW,GAAI,UAAA,KAAK,MAAA,CAAM;gBAC1F,WAAW,iBAAiB;gBAC5B,KAAK,eAAe,QAAQ,oBAAC,QAAA,EAAK,WAAW,sBAAuB,UAAA,KAAK,YAAA,CAAY;cAAA;YAAA;YATjF,KAAK,MAAM;UAAA;QAYtB,CAAC;MAAA;IAAA;EAGP;AACF;",
|
|
6
6
|
"names": ["StatGrid"]
|
|
7
7
|
}
|
package/dist/react-steps.js
CHANGED
package/dist/react-switch.js
CHANGED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn,
|
|
3
|
+
cva
|
|
4
|
+
} from "./chunk-2Q6HHFAN.js";
|
|
5
|
+
|
|
6
|
+
// ../react-table/dist/index.js
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
|
|
9
|
+
// ../table/dist/index.js
|
|
10
|
+
function createTable(props = {}) {
|
|
11
|
+
return {
|
|
12
|
+
dataAttributes: {
|
|
13
|
+
"data-slot": "table",
|
|
14
|
+
"data-density": props.density ?? "default",
|
|
15
|
+
"data-head-tone": props.headTone ?? "default"
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
var tableContainerClass = "relative w-full overflow-x-auto";
|
|
20
|
+
var tableRootVariants = cva({
|
|
21
|
+
base: "w-full caption-bottom border-collapse text-sm",
|
|
22
|
+
variants: {
|
|
23
|
+
fixed: {
|
|
24
|
+
true: "table-fixed",
|
|
25
|
+
false: ""
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: {
|
|
29
|
+
fixed: "false"
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
var tableCaptionClass = "mt-2 text-xs text-muted-foreground";
|
|
33
|
+
var tableRowClass = "border-b border-border-subtle last:border-b-0";
|
|
34
|
+
var align = {
|
|
35
|
+
start: "text-start",
|
|
36
|
+
center: "text-center",
|
|
37
|
+
end: "text-end"
|
|
38
|
+
};
|
|
39
|
+
var tableHeadVariants = cva({
|
|
40
|
+
base: "border-b border-border-subtle bg-surface-subtle align-middle",
|
|
41
|
+
variants: {
|
|
42
|
+
align,
|
|
43
|
+
tone: {
|
|
44
|
+
default: "text-xs font-medium text-muted-foreground",
|
|
45
|
+
eyebrow: "text-[11px] font-semibold uppercase tracking-wider text-muted-foreground"
|
|
46
|
+
},
|
|
47
|
+
density: {
|
|
48
|
+
compact: "h-8 px-2",
|
|
49
|
+
default: "h-9 px-3"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
defaultVariants: {
|
|
53
|
+
align: "start",
|
|
54
|
+
tone: "default",
|
|
55
|
+
density: "default"
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
var tableCellVariants = cva({
|
|
59
|
+
base: "align-middle",
|
|
60
|
+
variants: {
|
|
61
|
+
align,
|
|
62
|
+
density: {
|
|
63
|
+
compact: "px-2 py-1.5",
|
|
64
|
+
default: "px-3 py-2.5"
|
|
65
|
+
},
|
|
66
|
+
numeric: {
|
|
67
|
+
true: "tabular-nums whitespace-nowrap",
|
|
68
|
+
false: ""
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
defaultVariants: {
|
|
72
|
+
align: "start",
|
|
73
|
+
density: "default",
|
|
74
|
+
numeric: "false"
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// ../react-table/dist/index.js
|
|
79
|
+
import { jsx } from "react/jsx-runtime";
|
|
80
|
+
var TableContext = React.createContext({ density: "default", headTone: "default" });
|
|
81
|
+
var Table = React.forwardRef(function Table2({ density = "default", headTone = "default", fixed = false, containerClassName, className, ...props }, ref) {
|
|
82
|
+
const ctx = React.useMemo(() => ({ density, headTone }), [density, headTone]);
|
|
83
|
+
const { dataAttributes } = createTable({ density, headTone });
|
|
84
|
+
return /* @__PURE__ */ jsx(TableContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx("div", { className: cn(tableContainerClass, containerClassName), "data-slot": "table-container", children: /* @__PURE__ */ jsx(
|
|
85
|
+
"table",
|
|
86
|
+
{
|
|
87
|
+
ref,
|
|
88
|
+
className: cn(tableRootVariants({ fixed: fixed ? "true" : "false" }), className),
|
|
89
|
+
...dataAttributes,
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
) }) });
|
|
93
|
+
});
|
|
94
|
+
var TableHeader = React.forwardRef(
|
|
95
|
+
function TableHeader2(props, ref) {
|
|
96
|
+
return /* @__PURE__ */ jsx("thead", { ref, "data-slot": "table-header", ...props });
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
var TableBody = React.forwardRef(
|
|
100
|
+
function TableBody2(props, ref) {
|
|
101
|
+
return /* @__PURE__ */ jsx("tbody", { ref, "data-slot": "table-body", ...props });
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
var TableRow = React.forwardRef(
|
|
105
|
+
function TableRow2({ className, ...props }, ref) {
|
|
106
|
+
return /* @__PURE__ */ jsx("tr", { ref, className: cn(tableRowClass, className), "data-slot": "table-row", ...props });
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
var TableHead = React.forwardRef(function TableHead2({ align: align2, scope = "col", className, ...props }, ref) {
|
|
110
|
+
const { density, headTone } = React.useContext(TableContext);
|
|
111
|
+
return /* @__PURE__ */ jsx(
|
|
112
|
+
"th",
|
|
113
|
+
{
|
|
114
|
+
ref,
|
|
115
|
+
scope,
|
|
116
|
+
className: cn(tableHeadVariants({ align: align2, density, tone: headTone }), className),
|
|
117
|
+
"data-slot": "table-head",
|
|
118
|
+
...props
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
var TableCell = React.forwardRef(function TableCell2({ align: align2, numeric = false, className, ...props }, ref) {
|
|
123
|
+
const { density } = React.useContext(TableContext);
|
|
124
|
+
return /* @__PURE__ */ jsx(
|
|
125
|
+
"td",
|
|
126
|
+
{
|
|
127
|
+
ref,
|
|
128
|
+
className: cn(tableCellVariants({ align: align2, density, numeric: numeric ? "true" : "false" }), className),
|
|
129
|
+
"data-slot": "table-cell",
|
|
130
|
+
...props
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
var TableCaption = React.forwardRef(
|
|
135
|
+
function TableCaption2({ className, ...props }, ref) {
|
|
136
|
+
return /* @__PURE__ */ jsx("caption", { ref, className: cn(tableCaptionClass, className), "data-slot": "table-caption", ...props });
|
|
137
|
+
}
|
|
138
|
+
);
|
|
139
|
+
export {
|
|
140
|
+
Table,
|
|
141
|
+
TableBody,
|
|
142
|
+
TableCaption,
|
|
143
|
+
TableCell,
|
|
144
|
+
TableHead,
|
|
145
|
+
TableHeader,
|
|
146
|
+
TableRow
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=react-table.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../table/src/table.ts", "../../table/src/table.styles.ts", "../../react-table/src/table.tsx"],
|
|
4
|
+
"sourcesContent": ["/** Cell padding for every cell of a table. */\nexport type TableDensity = 'compact' | 'default'\n/** Horizontal alignment of a header or data cell (logical, RTL-safe). */\nexport type TableAlign = 'start' | 'center' | 'end'\n/** Look of header cells: `eyebrow` is small uppercase tracked text. */\nexport type TableHeadTone = 'default' | 'eyebrow'\n\nexport interface TableAPI {\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/** Framework-agnostic data attributes for the table root. */\nexport function createTable(\n props: { density?: TableDensity; headTone?: TableHeadTone } = {},\n): TableAPI {\n return {\n dataAttributes: {\n 'data-slot': 'table',\n 'data-density': props.density ?? 'default',\n 'data-head-tone': props.headTone ?? 'default',\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Scroll container: a wide table scrolls inside it instead of the page. */\nexport const tableContainerClass = 'relative w-full overflow-x-auto'\n\n/** The `<table>`. `fixed` pins column widths to the header row. */\nexport const tableRootVariants = cva({\n base: 'w-full caption-bottom border-collapse text-sm',\n variants: {\n fixed: {\n true: 'table-fixed',\n false: '',\n },\n },\n defaultVariants: {\n fixed: 'false',\n },\n})\n\n/** Caption under the table. */\nexport const tableCaptionClass = 'mt-2 text-xs text-muted-foreground'\n\n/** Body rows: a hairline between rows, none after the last. */\nexport const tableRowClass = 'border-b border-border-subtle last:border-b-0'\n\nconst align = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n}\n\n/** Header cell: subtle surface, rule under it. */\nexport const tableHeadVariants = cva({\n base: 'border-b border-border-subtle bg-surface-subtle align-middle',\n variants: {\n align,\n tone: {\n default: 'text-xs font-medium text-muted-foreground',\n eyebrow: 'text-[11px] font-semibold uppercase tracking-wider text-muted-foreground',\n },\n density: {\n compact: 'h-8 px-2',\n default: 'h-9 px-3',\n },\n },\n defaultVariants: {\n align: 'start',\n tone: 'default',\n density: 'default',\n },\n})\n\n/** Data cell. */\nexport const tableCellVariants = cva({\n base: 'align-middle',\n variants: {\n align,\n density: {\n compact: 'px-2 py-1.5',\n default: 'px-3 py-2.5',\n },\n numeric: {\n true: 'tabular-nums whitespace-nowrap',\n false: '',\n },\n },\n defaultVariants: {\n align: 'start',\n density: 'default',\n numeric: 'false',\n },\n})\n", "import * as React from 'react'\nimport {\n createTable,\n tableContainerClass,\n tableRootVariants,\n tableCaptionClass,\n tableRowClass,\n tableHeadVariants,\n tableCellVariants,\n type TableAlign,\n type TableDensity,\n type TableHeadTone,\n} from '@refraction-ui/table'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { TableAlign, TableDensity, TableHeadTone }\n\ninterface TableContextValue {\n density: TableDensity\n headTone: TableHeadTone\n}\n\nconst TableContext = React.createContext<TableContextValue>({ density: 'default', headTone: 'default' })\n\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n /** Cell padding for every cell. Defaults to `default`. */\n density?: TableDensity\n /** Look of every header cell. Defaults to `default`. */\n headTone?: TableHeadTone\n /** Fixed layout: column widths come from the header row. */\n fixed?: boolean\n /** Class for the horizontal scroll container around the table. */\n containerClassName?: string\n}\n\n/**\n * Table — composable, semantic table primitives for cells that hold\n * components (badges, buttons, links). The parts map one-to-one to the HTML\n * table elements. For a data-driven table with sorting/filtering use DataTable.\n */\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(function Table(\n { density = 'default', headTone = 'default', fixed = false, containerClassName, className, ...props },\n ref,\n) {\n const ctx = React.useMemo(() => ({ density, headTone }), [density, headTone])\n const { dataAttributes } = createTable({ density, headTone })\n return (\n <TableContext.Provider value={ctx}>\n <div className={cn(tableContainerClass, containerClassName)} data-slot=\"table-container\">\n <table\n ref={ref}\n className={cn(tableRootVariants({ fixed: fixed ? 'true' : 'false' }), className)}\n {...dataAttributes}\n {...props}\n />\n </div>\n </TableContext.Provider>\n )\n})\n\nexport const TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function TableHeader(props, ref) {\n return <thead ref={ref} data-slot=\"table-header\" {...props} />\n },\n)\n\nexport const TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n function TableBody(props, ref) {\n return <tbody ref={ref} data-slot=\"table-body\" {...props} />\n },\n)\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n function TableRow({ className, ...props }, ref) {\n return <tr ref={ref} className={cn(tableRowClass, className)} data-slot=\"table-row\" {...props} />\n },\n)\n\nexport interface TableHeadProps extends Omit<React.ThHTMLAttributes<HTMLTableCellElement>, 'align'> {\n /** Horizontal alignment. Defaults to `start`. */\n align?: TableAlign\n}\n\n/** Header cell. `scope` defaults to `col`. */\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n { align, scope = 'col', className, ...props },\n ref,\n) {\n const { density, headTone } = React.useContext(TableContext)\n return (\n <th\n ref={ref}\n scope={scope}\n className={cn(tableHeadVariants({ align, density, tone: headTone }), className)}\n data-slot=\"table-head\"\n {...props}\n />\n )\n})\n\nexport interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableCellElement>, 'align'> {\n /** Horizontal alignment. Defaults to `start`. */\n align?: TableAlign\n /** Tabular figures, no wrapping — for numbers. */\n numeric?: boolean\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { align, numeric = false, className, ...props },\n ref,\n) {\n const { density } = React.useContext(TableContext)\n return (\n <td\n ref={ref}\n className={cn(tableCellVariants({ align, density, numeric: numeric ? 'true' : 'false' }), className)}\n data-slot=\"table-cell\"\n {...props}\n />\n )\n})\n\nexport const TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n function TableCaption({ className, ...props }, ref) {\n return <caption ref={ref} className={cn(tableCaptionClass, className)} data-slot=\"table-caption\" {...props} />\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Table", "TableHeader", "TableBody", "TableRow", "TableHead", "align", "TableCell", "TableCaption"]
|
|
7
|
+
}
|
package/dist/react-tabs.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
cva,
|
|
5
5
|
devWarn,
|
|
6
6
|
generateId
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2Q6HHFAN.js";
|
|
8
8
|
|
|
9
9
|
// ../react-tabs/dist/index.js
|
|
10
10
|
import * as React from "react";
|
|
@@ -96,6 +96,23 @@ function createTabs(props = {}) {
|
|
|
96
96
|
idPrefix
|
|
97
97
|
};
|
|
98
98
|
}
|
|
99
|
+
function getNextTabIndex(current, key, count, orientation = "horizontal") {
|
|
100
|
+
if (count === 0) return null;
|
|
101
|
+
const prev = orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
102
|
+
const next = orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
103
|
+
switch (key) {
|
|
104
|
+
case next:
|
|
105
|
+
return current < 0 ? 0 : (current + 1) % count;
|
|
106
|
+
case prev:
|
|
107
|
+
return current < 0 ? count - 1 : (current - 1 + count) % count;
|
|
108
|
+
case "Home":
|
|
109
|
+
return 0;
|
|
110
|
+
case "End":
|
|
111
|
+
return count - 1;
|
|
112
|
+
default:
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
99
116
|
var tabsListVariants = cva({
|
|
100
117
|
base: "inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground"
|
|
101
118
|
});
|
|
@@ -135,14 +152,31 @@ var Tabs = React.forwardRef(
|
|
|
135
152
|
apiRef.current = createTabs({ value, orientation });
|
|
136
153
|
}
|
|
137
154
|
const api = apiRef.current;
|
|
155
|
+
const [panels, setPanels] = React.useState(() => /* @__PURE__ */ new Set());
|
|
156
|
+
const registerPanel = React.useCallback((panelValue) => {
|
|
157
|
+
setPanels((prev) => prev.has(panelValue) ? prev : new Set(prev).add(panelValue));
|
|
158
|
+
return () => setPanels((prev) => {
|
|
159
|
+
if (!prev.has(panelValue)) return prev;
|
|
160
|
+
const next = new Set(prev);
|
|
161
|
+
next.delete(panelValue);
|
|
162
|
+
return next;
|
|
163
|
+
});
|
|
164
|
+
}, []);
|
|
165
|
+
const allPanels = React.useMemo(() => {
|
|
166
|
+
const found = new Set(panels);
|
|
167
|
+
collectPanelValues(children, found);
|
|
168
|
+
return found;
|
|
169
|
+
}, [children, panels]);
|
|
138
170
|
const ctx = React.useMemo(
|
|
139
171
|
() => ({
|
|
140
172
|
value,
|
|
141
173
|
onValueChange: handleValueChange,
|
|
142
174
|
orientation,
|
|
143
|
-
idPrefix: api.idPrefix
|
|
175
|
+
idPrefix: api.idPrefix,
|
|
176
|
+
panels: allPanels,
|
|
177
|
+
registerPanel
|
|
144
178
|
}),
|
|
145
|
-
[value, handleValueChange, orientation, api.idPrefix]
|
|
179
|
+
[value, handleValueChange, orientation, api.idPrefix, allPanels, registerPanel]
|
|
146
180
|
);
|
|
147
181
|
return React.createElement(
|
|
148
182
|
"div",
|
|
@@ -151,21 +185,62 @@ var Tabs = React.forwardRef(
|
|
|
151
185
|
);
|
|
152
186
|
}
|
|
153
187
|
);
|
|
188
|
+
function collectPanelValues(node, into) {
|
|
189
|
+
React.Children.forEach(node, (child) => {
|
|
190
|
+
if (!React.isValidElement(child)) return;
|
|
191
|
+
if (child.type === TabsContent && typeof child.props.value === "string") {
|
|
192
|
+
into.add(child.props.value);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
collectPanelValues(child.props.children, into);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
154
198
|
var TabsList = React.forwardRef(
|
|
155
|
-
function TabsList2({ className, ...props },
|
|
199
|
+
function TabsList2({ className, onKeyDown, ...props }, forwardedRef) {
|
|
156
200
|
const { orientation } = useTabsContext();
|
|
201
|
+
const listRef = React.useRef(null);
|
|
202
|
+
const ref = React.useCallback(
|
|
203
|
+
(node) => {
|
|
204
|
+
listRef.current = node;
|
|
205
|
+
if (typeof forwardedRef === "function") forwardedRef(node);
|
|
206
|
+
else if (forwardedRef) forwardedRef.current = node;
|
|
207
|
+
},
|
|
208
|
+
[forwardedRef]
|
|
209
|
+
);
|
|
210
|
+
React.useEffect(() => {
|
|
211
|
+
const tabs = enabledTabs(listRef.current);
|
|
212
|
+
const stop = tabs.find((tab) => tab.getAttribute("aria-selected") === "true") ?? tabs[0];
|
|
213
|
+
for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1;
|
|
214
|
+
});
|
|
215
|
+
const handleKeyDown = (e) => {
|
|
216
|
+
onKeyDown?.(e);
|
|
217
|
+
if (e.defaultPrevented) return;
|
|
218
|
+
const tabs = enabledTabs(listRef.current);
|
|
219
|
+
const current = tabs.indexOf(e.target);
|
|
220
|
+
if (current === -1) return;
|
|
221
|
+
const next = getNextTabIndex(current, e.key, tabs.length, orientation);
|
|
222
|
+
if (next === null) return;
|
|
223
|
+
e.preventDefault();
|
|
224
|
+
tabs[next].focus();
|
|
225
|
+
tabs[next].click();
|
|
226
|
+
};
|
|
157
227
|
return React.createElement("div", {
|
|
158
228
|
ref,
|
|
159
229
|
role: "tablist",
|
|
160
230
|
"aria-orientation": orientation,
|
|
161
231
|
className: cn(tabsListVariants(), className),
|
|
232
|
+
onKeyDown: handleKeyDown,
|
|
162
233
|
...props
|
|
163
234
|
});
|
|
164
235
|
}
|
|
165
236
|
);
|
|
237
|
+
function enabledTabs(list) {
|
|
238
|
+
if (!list) return [];
|
|
239
|
+
return Array.from(list.querySelectorAll('[role="tab"]:not([disabled])'));
|
|
240
|
+
}
|
|
166
241
|
var TabsTrigger = React.forwardRef(
|
|
167
242
|
function TabsTrigger2({ value, className, onClick, onKeyDown, children, ...props }, ref) {
|
|
168
|
-
const { value: activeValue, onValueChange,
|
|
243
|
+
const { value: activeValue, onValueChange, idPrefix, panels } = useTabsContext();
|
|
169
244
|
const isSelected = activeValue === value;
|
|
170
245
|
const tabId = `${idPrefix}-tab-${value}`;
|
|
171
246
|
const panelId = `${idPrefix}-panel-${value}`;
|
|
@@ -183,7 +258,8 @@ var TabsTrigger = React.forwardRef(
|
|
|
183
258
|
type: "button",
|
|
184
259
|
role: "tab",
|
|
185
260
|
"aria-selected": isSelected,
|
|
186
|
-
|
|
261
|
+
// Only the selected panel is rendered; never reference a missing element.
|
|
262
|
+
"aria-controls": isSelected && panels.has(value) ? panelId : void 0,
|
|
187
263
|
tabIndex: isSelected ? 0 : -1,
|
|
188
264
|
id: tabId,
|
|
189
265
|
"data-state": isSelected ? "active" : "inactive",
|
|
@@ -198,7 +274,8 @@ var TabsTrigger = React.forwardRef(
|
|
|
198
274
|
);
|
|
199
275
|
var TabsContent = React.forwardRef(
|
|
200
276
|
function TabsContent2({ value, className, children, ...props }, ref) {
|
|
201
|
-
const { value: activeValue, idPrefix } = useTabsContext();
|
|
277
|
+
const { value: activeValue, idPrefix, registerPanel } = useTabsContext();
|
|
278
|
+
React.useEffect(() => registerPanel(value), [registerPanel, value]);
|
|
202
279
|
const isSelected = activeValue === value;
|
|
203
280
|
const tabId = `${idPrefix}-tab-${value}`;
|
|
204
281
|
const panelId = `${idPrefix}-panel-${value}`;
|