@refraction-ui/react 0.22.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/{chunk-V24GDHUX.js → chunk-4ACSHPCM.js} +2 -2
  2. package/dist/{chunk-SDAJVXD4.js → chunk-5P56PN3J.js} +2 -2
  3. package/dist/chunk-75BKRTPO.js +417 -0
  4. package/dist/{chunk-2Q6HHFAN.js.map → chunk-75BKRTPO.js.map} +1 -1
  5. package/dist/chunk-7P7EJ56S.js +7 -0
  6. package/dist/{chunk-QPCKJ2YR.js → chunk-GG6MZDGV.js} +2 -2
  7. package/dist/{chunk-QDMLIDYN.js → chunk-GU5MI7FX.js} +2 -2
  8. package/dist/{chunk-3Y2T26QD.js → chunk-JZQ5ZL46.js} +6 -4
  9. package/dist/{chunk-3Y2T26QD.js.map → chunk-JZQ5ZL46.js.map} +2 -2
  10. package/dist/{chunk-RSWOLRIC.js → chunk-KIZD73DK.js} +2 -2
  11. package/dist/{chunk-XMFNBOPO.js → chunk-PY2TIFCT.js} +2 -2
  12. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  13. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  14. package/dist/{chunk-3I3DYDHR.js → chunk-WNLYPQOS.js} +2 -2
  15. package/dist/{chunk-63N4PZUJ.js → chunk-X6HEKRWE.js} +2 -2
  16. package/dist/{chunk-WYKPPK3W.js → chunk-XAJDSVZR.js} +2 -2
  17. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  18. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  19. package/dist/index.cjs +736 -274
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +3 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.js +3 -0
  24. package/dist/internal/avatar/index.d.cts +4 -1
  25. package/dist/internal/avatar/index.d.ts +4 -1
  26. package/dist/internal/data-table/index.d.cts +48 -3
  27. package/dist/internal/data-table/index.d.ts +48 -3
  28. package/dist/internal/line-chart/index.d.ts +17 -3
  29. package/dist/internal/native-select/index.d.ts +21 -0
  30. package/dist/internal/react-avatar/index.d.cts +4 -2
  31. package/dist/internal/react-avatar/index.d.ts +4 -2
  32. package/dist/internal/react-command/index.d.cts +13 -2
  33. package/dist/internal/react-command/index.d.ts +13 -2
  34. package/dist/internal/react-data-table/index.d.cts +27 -9
  35. package/dist/internal/react-data-table/index.d.ts +27 -9
  36. package/dist/internal/react-dialog/index.d.cts +5 -0
  37. package/dist/internal/react-dialog/index.d.ts +5 -0
  38. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  39. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  40. package/dist/internal/react-line-chart/index.d.ts +7 -2
  41. package/dist/internal/react-native-select/index.d.ts +19 -0
  42. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  43. package/dist/internal/react-table/index.d.ts +39 -0
  44. package/dist/internal/stat-grid/index.d.ts +49 -7
  45. package/dist/internal/table/index.d.ts +46 -0
  46. package/dist/react-accordion.js +1 -1
  47. package/dist/react-action-list.js +1 -1
  48. package/dist/react-ai.js +1 -1
  49. package/dist/react-analytics.js +16 -4
  50. package/dist/react-analytics.js.map +2 -2
  51. package/dist/react-animated-text.js +1 -1
  52. package/dist/react-app-shell.js +1 -1
  53. package/dist/react-audience-feature-card.js +1 -1
  54. package/dist/react-audio-room.js +1 -1
  55. package/dist/react-auth.js +1 -1
  56. package/dist/react-avatar-group.js +1 -1
  57. package/dist/react-avatar.js +13 -9
  58. package/dist/react-avatar.js.map +2 -2
  59. package/dist/react-badge.js +1 -1
  60. package/dist/react-bottom-nav.js +1 -1
  61. package/dist/react-brand-network-cell.js +1 -1
  62. package/dist/react-breadcrumbs.js +1 -1
  63. package/dist/react-browser-chrome-mock.js +1 -1
  64. package/dist/react-button.js +3 -3
  65. package/dist/react-calendar.js +1 -1
  66. package/dist/react-call-controls.js +1 -1
  67. package/dist/react-callout.js +1 -1
  68. package/dist/react-card-grid.js +1 -1
  69. package/dist/react-card.js +1 -1
  70. package/dist/react-carousel.js +1 -1
  71. package/dist/react-charts.js +1 -1
  72. package/dist/react-checkbox.js +1 -1
  73. package/dist/react-checklist.js +1 -1
  74. package/dist/react-code-block.js +1 -1
  75. package/dist/react-code-editor.js +1 -1
  76. package/dist/react-collapsible.js +1 -1
  77. package/dist/react-combobox.js +1 -1
  78. package/dist/react-command-input.js +1 -1
  79. package/dist/react-command.js +115 -70
  80. package/dist/react-command.js.map +3 -3
  81. package/dist/react-composer.js +3 -3
  82. package/dist/react-content-protection.js +1 -1
  83. package/dist/react-conversation.js +5 -5
  84. package/dist/react-cookie-consent.js +1 -1
  85. package/dist/react-data-table.js +125 -114
  86. package/dist/react-data-table.js.map +2 -2
  87. package/dist/react-date-picker.js +1 -1
  88. package/dist/react-device-frame.js +1 -1
  89. package/dist/react-dialog.js +33 -9
  90. package/dist/react-dialog.js.map +2 -2
  91. package/dist/react-diff-viewer.js +1 -1
  92. package/dist/react-dropdown-menu.js +61 -8
  93. package/dist/react-dropdown-menu.js.map +3 -3
  94. package/dist/react-editor-status-bar.js +1 -1
  95. package/dist/react-editor-tabs.js +1 -1
  96. package/dist/react-emoji-picker.js +2 -2
  97. package/dist/react-empty-state.js +1 -1
  98. package/dist/react-feedback-dialog.js +2 -2
  99. package/dist/react-file-tree.js +1 -1
  100. package/dist/react-file-upload.js +1 -1
  101. package/dist/react-floating-reactions.js +1 -1
  102. package/dist/react-flow-editor.js +2 -2
  103. package/dist/react-footer.js +1 -1
  104. package/dist/react-funnel-chart.js +1 -1
  105. package/dist/react-graph-view.js +2 -2
  106. package/dist/react-infinite-canvas.js +2 -2
  107. package/dist/react-inline-editor.js +1 -1
  108. package/dist/react-input-group.js +1 -1
  109. package/dist/react-input.js +2 -2
  110. package/dist/react-install-prompt.js +1 -1
  111. package/dist/react-kanban-board.js +1 -1
  112. package/dist/react-keyboard-shortcut.js +2 -2
  113. package/dist/react-language-selector.js +1 -1
  114. package/dist/react-line-chart.js +49 -11
  115. package/dist/react-line-chart.js.map +2 -2
  116. package/dist/react-link-card.js +1 -1
  117. package/dist/react-live-captions.js +1 -1
  118. package/dist/react-live-cursors.js +1 -1
  119. package/dist/react-live-transcript.js +1 -1
  120. package/dist/react-location-selector.js +1 -1
  121. package/dist/react-logger.js +3 -3
  122. package/dist/react-markdown-renderer.js +2 -2
  123. package/dist/react-marquee-strip.js +1 -1
  124. package/dist/react-mascot.js +1 -1
  125. package/dist/react-mastery-bar.js +1 -1
  126. package/dist/react-mini-map.js +1 -1
  127. package/dist/react-mobile-nav.js +1 -1
  128. package/dist/react-native-select.js +52 -0
  129. package/dist/react-native-select.js.map +7 -0
  130. package/dist/react-navbar.js +1 -1
  131. package/dist/react-numbered-steps.js +1 -1
  132. package/dist/react-otp-input.js +1 -1
  133. package/dist/react-page-header.js +1 -1
  134. package/dist/react-pagination.js +1 -1
  135. package/dist/react-password-input.js +2 -2
  136. package/dist/react-payment.js +1 -1
  137. package/dist/react-popover.js +1 -1
  138. package/dist/react-pre-call-lobby.js +1 -1
  139. package/dist/react-presence-indicator.js +1 -1
  140. package/dist/react-pricing-card.js +1 -1
  141. package/dist/react-progress-display.js +1 -1
  142. package/dist/react-radial-gauge.js +1 -1
  143. package/dist/react-radio.js +1 -1
  144. package/dist/react-rating-scale.js +1 -1
  145. package/dist/react-reaction-bar.js +1 -1
  146. package/dist/react-resizable-layout.js +1 -1
  147. package/dist/react-search-bar.js +1 -1
  148. package/dist/react-section-head.js +1 -1
  149. package/dist/react-segmented-control.js +1 -1
  150. package/dist/react-select.js +1 -1
  151. package/dist/react-separator.js +1 -1
  152. package/dist/react-sheet.js +1 -1
  153. package/dist/react-sidebar.js +1 -1
  154. package/dist/react-skeleton.js +1 -1
  155. package/dist/react-skip-to-content.js +1 -1
  156. package/dist/react-slide-viewer.js +1 -1
  157. package/dist/react-slider.js +1 -1
  158. package/dist/react-slot-picker.js +1 -1
  159. package/dist/react-social-auth-button.js +3 -3
  160. package/dist/react-sortable-list.js +1 -1
  161. package/dist/react-stat-grid.js +91 -22
  162. package/dist/react-stat-grid.js.map +2 -2
  163. package/dist/react-status-indicator.js +1 -1
  164. package/dist/react-steps.js +1 -1
  165. package/dist/react-sticky-note.js +1 -1
  166. package/dist/react-switch.js +1 -1
  167. package/dist/react-table-of-contents.js +1 -1
  168. package/dist/react-table.js +148 -0
  169. package/dist/react-table.js.map +7 -0
  170. package/dist/react-tabs.js +35 -6
  171. package/dist/react-tabs.js.map +2 -2
  172. package/dist/react-terminal.js +1 -1
  173. package/dist/react-test-results.js +1 -1
  174. package/dist/react-textarea.js +1 -1
  175. package/dist/react-thread-view.js +2 -2
  176. package/dist/react-timeline.js +1 -1
  177. package/dist/react-toast.js +1 -1
  178. package/dist/react-tooltip.js +1 -1
  179. package/dist/react-version-selector.js +1 -1
  180. package/dist/react-video-grid.js +2 -2
  181. package/dist/react-video-player.js +1 -1
  182. package/dist/react-video-tile.js +2 -2
  183. package/dist/react-voice-pill.js +1 -1
  184. package/dist/react-waveform.js +1 -1
  185. package/dist/react-wizard.js +1 -1
  186. package/dist/shared.js +53 -0
  187. package/dist/shared.js.map +7 -0
  188. package/package.json +3 -1
  189. package/dist/chunk-2Q6HHFAN.js +0 -164
  190. package/dist/chunk-SDZ3LROZ.js +0 -7
  191. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  192. /package/dist/{chunk-V24GDHUX.js.map → chunk-4ACSHPCM.js.map} +0 -0
  193. /package/dist/{chunk-SDAJVXD4.js.map → chunk-5P56PN3J.js.map} +0 -0
  194. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
  195. /package/dist/{chunk-QPCKJ2YR.js.map → chunk-GG6MZDGV.js.map} +0 -0
  196. /package/dist/{chunk-QDMLIDYN.js.map → chunk-GU5MI7FX.js.map} +0 -0
  197. /package/dist/{chunk-RSWOLRIC.js.map → chunk-KIZD73DK.js.map} +0 -0
  198. /package/dist/{chunk-XMFNBOPO.js.map → chunk-PY2TIFCT.js.map} +0 -0
  199. /package/dist/{chunk-3I3DYDHR.js.map → chunk-WNLYPQOS.js.map} +0 -0
  200. /package/dist/{chunk-63N4PZUJ.js.map → chunk-X6HEKRWE.js.map} +0 -0
  201. /package/dist/{chunk-WYKPPK3W.js.map → chunk-XAJDSVZR.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-segmented-control/dist/index.js
7
7
  import * as React from "react";
@@ -4,7 +4,7 @@ import {
4
4
  cva,
5
5
  devWarn,
6
6
  generateId
7
- } from "./chunk-2Q6HHFAN.js";
7
+ } from "./chunk-75BKRTPO.js";
8
8
 
9
9
  // ../react-select/dist/index.js
10
10
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-separator/dist/index.js
7
7
  import * as React from "react";
@@ -4,7 +4,7 @@ import {
4
4
  cva,
5
5
  devWarn,
6
6
  generateId
7
- } from "./chunk-2Q6HHFAN.js";
7
+ } from "./chunk-75BKRTPO.js";
8
8
 
9
9
  // ../react-sheet/dist/index.js
10
10
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-sidebar/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-skeleton/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-skip-to-content/dist/index.js
7
7
  import * as React from "react";
@@ -2,7 +2,7 @@ import {
2
2
  Keys,
3
3
  cn,
4
4
  cva
5
- } from "./chunk-2Q6HHFAN.js";
5
+ } from "./chunk-75BKRTPO.js";
6
6
 
7
7
  // ../react-slide-viewer/dist/index.js
8
8
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-2Q6HHFAN.js";
3
+ } from "./chunk-75BKRTPO.js";
4
4
 
5
5
  // ../react-slider/dist/index.js
6
6
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-slot-picker/dist/index.js
7
7
  import * as React from "react";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  Button
3
- } from "./chunk-3Y2T26QD.js";
4
- import "./chunk-QDMLIDYN.js";
3
+ } from "./chunk-JZQ5ZL46.js";
4
+ import "./chunk-GU5MI7FX.js";
5
5
  import {
6
6
  cn,
7
7
  cva
8
- } from "./chunk-2Q6HHFAN.js";
8
+ } from "./chunk-75BKRTPO.js";
9
9
 
10
10
  // ../react-social-auth-button/dist/index.js
11
11
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-sortable-list/dist/index.js
7
7
  import * as React from "react";
@@ -1,17 +1,20 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.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 <= 0) return 1;
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 gap-8",
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
- columns: "3"
89
+ layout: "value-first"
33
90
  }
34
91
  });
35
- var statItemClass = "flex flex-col";
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
- statGridVariants({ columns: String(cols) }),
51
- className
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) => /* @__PURE__ */ jsxs("div", { role: "listitem", className: statItemClass, children: [
58
- /* @__PURE__ */ jsx("span", { className: statValueClass, children: item.value }),
59
- /* @__PURE__ */ jsx("span", { className: statLabelClass, children: item.label })
60
- ] }, index))
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 shown below the value. */\n label: string\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): number {\n if (count <= 0) return 1\n if (count === 1) return 1\n if (count === 2) return 2\n return Math.min(count, max)\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/** Grid container that lays out stat items. */\nexport const statGridVariants = cva({\n base: 'grid gap-8',\n variants: {\n columns: {\n '1': 'grid-cols-1',\n '2': 'grid-cols-2',\n '3': 'grid-cols-3',\n },\n },\n defaultVariants: {\n columns: '3',\n },\n})\n\n/** Individual stat item container (role=\"listitem\"). */\nexport const statItemClass = 'flex flex-col'\n\n/** The large bold value of the stat. */\nexport const statValueClass = 'text-xl sm:text-2xl font-bold text-primary'\n\n/** The descriptive label below the value. */\nexport const statLabelClass = 'mt-1 text-sm text-muted-foreground leading-snug'\n", "import * as React from 'react'\nimport {\n createStatGrid,\n statColumns,\n statGridVariants,\n statItemClass,\n statValueClass,\n statLabelClass,\n} from '@refraction-ui/stat-grid'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { StatItem } 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 shown below the value. */\n label: React.ReactNode\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 * Number of columns. Defaults to `statColumns(items.length)`:\n * 1 item → 1, 2 items → 2, 3+ items → 3.\n */\n columns?: number\n}\n\n/**\n * StatGrid — a marketing-style grid of stat callouts.\n *\n * Each item shows a large bold value and a small muted label. The grid\n * automatically computes the column count from the number of items, or you can\n * override it with `columns`. Uses `role=\"list\"` / `role=\"listitem\"` for\n * accessible enumeration.\n */\nexport const StatGrid = React.forwardRef<HTMLDivElement, StatGridProps>(\n function StatGrid({ items, columns, className, ...props }, ref) {\n const cols = columns ?? statColumns(items.length)\n const { ariaProps, dataAttributes } = createStatGrid()\n\n return (\n <div\n ref={ref}\n className={cn(\n statGridVariants({ columns: String(cols) as '1' | '2' | '3' }),\n className,\n )}\n style={{ gridTemplateColumns: `repeat(${cols}, 1fr)` }}\n {...ariaProps}\n {...dataAttributes}\n {...props}\n >\n {items.map((item, index) => (\n <div key={index} role=\"listitem\" className={statItemClass}>\n <span className={statValueClass}>{item.value}</span>\n <span className={statLabelClass}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n },\n)\n"],
5
- "mappings": ";;;;;;;;;AAsBO,SAAS,YAAY,OAAe,MAAM,GAAW;AAC1D,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,KAAK,IAAI,OAAO,GAAG;AAC5B;AAQO,SAAS,iBAA8B;AAC5C,SAAO;IACL,WAAW,EAAE,MAAM,OAAA;IACnB,gBAAgB,CAAA;EAAC;AAErB;ACrCO,IAAM,mBAAmB,IAAI;EAClC,MAAM;EACN,UAAU;IACR,SAAS;MACP,KAAK;MACL,KAAK;MACL,KAAK;IAAA;EACP;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;AAGM,IAAM,gBAAgB;AAGtB,IAAM,iBAAiB;AAGvB,IAAM,iBAAiB;;;;ACevB,IAAM,WAAiB;EAC5B,SAASA,UAAS,EAAE,OAAO,SAAS,WAAW,GAAG,MAAA,GAAS,KAAK;AAC9D,UAAM,OAAO,WAAW,YAAY,MAAM,MAAM;AAChD,UAAM,EAAE,WAAW,eAAA,IAAmB,eAAA;AAEtC,WACE;MAAC;MAAA;QACC;QACA,WAAW;UACT,iBAAiB,EAAE,SAAS,OAAO,IAAI,EAAA,CAAsB;UAC7D;QAAA;QAEF,OAAO,EAAE,qBAAqB,UAAU,IAAI,SAAA;QAC3C,GAAG;QACH,GAAG;QACH,GAAG;QAEH,UAAA,MAAM,IAAI,CAAC,MAAM,UAAA,qBACf,OAAA,EAAgB,MAAK,YAAW,WAAW,eAC1C,UAAA;UAAA,oBAAC,QAAA,EAAK,WAAW,gBAAiB,UAAA,KAAK,MAAA,CAAM;UAC7C,oBAAC,QAAA,EAAK,WAAW,gBAAiB,UAAA,KAAK,MAAA,CAAM;QAAA,EAAA,GAFrC,KAGV,CACD;MAAA;IAAA;EAGP;AACF;",
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
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-status-indicator/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-steps/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-sticky-note/dist/index.js
7
7
  import * as React from "react";
@@ -2,7 +2,7 @@ import {
2
2
  Keys,
3
3
  cn,
4
4
  cva
5
- } from "./chunk-2Q6HHFAN.js";
5
+ } from "./chunk-75BKRTPO.js";
6
6
 
7
7
  // ../react-switch/dist/index.js
8
8
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-2Q6HHFAN.js";
3
+ } from "./chunk-75BKRTPO.js";
4
4
 
5
5
  // ../react-table-of-contents/dist/index.js
6
6
  import * as React from "react";
@@ -0,0 +1,148 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-75BKRTPO.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
+ }
@@ -4,7 +4,7 @@ import {
4
4
  cva,
5
5
  devWarn,
6
6
  generateId
7
- } from "./chunk-2Q6HHFAN.js";
7
+ } from "./chunk-75BKRTPO.js";
8
8
 
9
9
  // ../react-tabs/dist/index.js
10
10
  import * as React from "react";
@@ -152,14 +152,31 @@ var Tabs = React.forwardRef(
152
152
  apiRef.current = createTabs({ value, orientation });
153
153
  }
154
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]);
155
170
  const ctx = React.useMemo(
156
171
  () => ({
157
172
  value,
158
173
  onValueChange: handleValueChange,
159
174
  orientation,
160
- idPrefix: api.idPrefix
175
+ idPrefix: api.idPrefix,
176
+ panels: allPanels,
177
+ registerPanel
161
178
  }),
162
- [value, handleValueChange, orientation, api.idPrefix]
179
+ [value, handleValueChange, orientation, api.idPrefix, allPanels, registerPanel]
163
180
  );
164
181
  return React.createElement(
165
182
  "div",
@@ -168,6 +185,16 @@ var Tabs = React.forwardRef(
168
185
  );
169
186
  }
170
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
+ }
171
198
  var TabsList = React.forwardRef(
172
199
  function TabsList2({ className, onKeyDown, ...props }, forwardedRef) {
173
200
  const { orientation } = useTabsContext();
@@ -213,7 +240,7 @@ function enabledTabs(list) {
213
240
  }
214
241
  var TabsTrigger = React.forwardRef(
215
242
  function TabsTrigger2({ value, className, onClick, onKeyDown, children, ...props }, ref) {
216
- const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext();
243
+ const { value: activeValue, onValueChange, idPrefix, panels } = useTabsContext();
217
244
  const isSelected = activeValue === value;
218
245
  const tabId = `${idPrefix}-tab-${value}`;
219
246
  const panelId = `${idPrefix}-panel-${value}`;
@@ -231,7 +258,8 @@ var TabsTrigger = React.forwardRef(
231
258
  type: "button",
232
259
  role: "tab",
233
260
  "aria-selected": isSelected,
234
- "aria-controls": panelId,
261
+ // Only the selected panel is rendered; never reference a missing element.
262
+ "aria-controls": isSelected && panels.has(value) ? panelId : void 0,
235
263
  tabIndex: isSelected ? 0 : -1,
236
264
  id: tabId,
237
265
  "data-state": isSelected ? "active" : "inactive",
@@ -246,7 +274,8 @@ var TabsTrigger = React.forwardRef(
246
274
  );
247
275
  var TabsContent = React.forwardRef(
248
276
  function TabsContent2({ value, className, children, ...props }, ref) {
249
- const { value: activeValue, idPrefix } = useTabsContext();
277
+ const { value: activeValue, idPrefix, registerPanel } = useTabsContext();
278
+ React.useEffect(() => registerPanel(value), [registerPanel, value]);
250
279
  const isSelected = activeValue === value;
251
280
  const tabId = `${idPrefix}-tab-${value}`;
252
281
  const panelId = `${idPrefix}-panel-${value}`;