@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.
Files changed (235) hide show
  1. package/dist/{chunk-ZF3OHCGV.js → chunk-2Q6HHFAN.js} +1 -1
  2. package/dist/chunk-2Q6HHFAN.js.map +7 -0
  3. package/dist/{chunk-533MCMSU.js → chunk-3I3DYDHR.js} +2 -2
  4. package/dist/{chunk-H54FLNAF.js → chunk-63N4PZUJ.js} +2 -2
  5. package/dist/chunk-7P7EJ56S.js +7 -0
  6. package/dist/{chunk-Y2FNNAIL.js → chunk-EGVPAMQU.js} +2 -2
  7. package/dist/chunk-EGVPAMQU.js.map +1 -0
  8. package/dist/{chunk-WK2IIUFO.js → chunk-QDMLIDYN.js} +2 -2
  9. package/dist/{chunk-BOLFYVI6.js → chunk-QPCKJ2YR.js} +2 -2
  10. package/dist/{chunk-TOZBR4GL.js → chunk-RSWOLRIC.js} +4 -4
  11. package/dist/{chunk-TOZBR4GL.js.map → chunk-RSWOLRIC.js.map} +1 -1
  12. package/dist/{chunk-UNEM2TRI.js → chunk-SDAJVXD4.js} +2 -2
  13. package/dist/{chunk-VK3EQ34F.js → chunk-V24GDHUX.js} +2 -2
  14. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  15. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  16. package/dist/{chunk-AMK4VCBG.js → chunk-WYKPPK3W.js} +2 -2
  17. package/dist/{chunk-ONACRMG4.js → chunk-XMFNBOPO.js} +2 -2
  18. package/dist/{chunk-NKCWOPNX.js → chunk-Z5IHYNQD.js} +12 -8
  19. package/dist/chunk-Z5IHYNQD.js.map +7 -0
  20. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  21. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  22. package/dist/form.cjs.map +1 -1
  23. package/dist/form.js +1 -1
  24. package/dist/index.cjs +1305 -302
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +7 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.js +7 -0
  29. package/dist/internal/action-list/index.d.ts +39 -0
  30. package/dist/internal/avatar/index.d.cts +4 -1
  31. package/dist/internal/avatar/index.d.ts +4 -1
  32. package/dist/internal/button/index.d.cts +2 -2
  33. package/dist/internal/button/index.d.ts +2 -2
  34. package/dist/internal/card/index.d.cts +5 -1
  35. package/dist/internal/card/index.d.ts +5 -1
  36. package/dist/internal/data-table/index.d.cts +48 -3
  37. package/dist/internal/data-table/index.d.ts +48 -3
  38. package/dist/internal/funnel-chart/index.d.ts +60 -0
  39. package/dist/internal/line-chart/index.d.ts +124 -0
  40. package/dist/internal/native-select/index.d.ts +21 -0
  41. package/dist/internal/page-header/index.d.ts +35 -0
  42. package/dist/internal/react-action-list/index.d.ts +28 -0
  43. package/dist/internal/react-avatar/index.d.cts +4 -2
  44. package/dist/internal/react-avatar/index.d.ts +4 -2
  45. package/dist/internal/react-card/index.d.cts +10 -4
  46. package/dist/internal/react-card/index.d.ts +10 -4
  47. package/dist/internal/react-command/index.d.cts +13 -2
  48. package/dist/internal/react-command/index.d.ts +13 -2
  49. package/dist/internal/react-data-table/index.d.cts +27 -9
  50. package/dist/internal/react-data-table/index.d.ts +27 -9
  51. package/dist/internal/react-dialog/index.d.cts +5 -0
  52. package/dist/internal/react-dialog/index.d.ts +5 -0
  53. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  54. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  55. package/dist/internal/react-funnel-chart/index.d.ts +28 -0
  56. package/dist/internal/react-line-chart/index.d.ts +38 -0
  57. package/dist/internal/react-native-select/index.d.ts +19 -0
  58. package/dist/internal/react-page-header/index.d.ts +23 -0
  59. package/dist/internal/react-select/index.d.cts +21 -3
  60. package/dist/internal/react-select/index.d.ts +21 -3
  61. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  62. package/dist/internal/react-table/index.d.ts +39 -0
  63. package/dist/internal/select/index.d.cts +14 -1
  64. package/dist/internal/select/index.d.ts +14 -1
  65. package/dist/internal/shared/index.d.cts +6 -3
  66. package/dist/internal/shared/index.d.ts +6 -3
  67. package/dist/internal/stat-grid/index.d.ts +49 -7
  68. package/dist/internal/table/index.d.ts +46 -0
  69. package/dist/internal/tabs/index.d.cts +8 -1
  70. package/dist/internal/tabs/index.d.ts +8 -1
  71. package/dist/react-accordion.js +1 -1
  72. package/dist/react-action-list.js +74 -0
  73. package/dist/react-action-list.js.map +7 -0
  74. package/dist/react-ai.js +1 -1
  75. package/dist/react-analytics.js +16 -4
  76. package/dist/react-analytics.js.map +2 -2
  77. package/dist/react-animated-text.js +1 -1
  78. package/dist/react-app-shell.js +1 -1
  79. package/dist/react-audience-feature-card.js +1 -1
  80. package/dist/react-audio-room.js +1 -1
  81. package/dist/react-auth.js +1 -1
  82. package/dist/react-avatar-group.js +1 -1
  83. package/dist/react-avatar.js +13 -9
  84. package/dist/react-avatar.js.map +2 -2
  85. package/dist/react-badge.js +2 -2
  86. package/dist/react-badge.js.map +1 -1
  87. package/dist/react-bottom-nav.js +1 -1
  88. package/dist/react-brand-network-cell.js +1 -1
  89. package/dist/react-breadcrumbs.js +1 -1
  90. package/dist/react-browser-chrome-mock.js +1 -1
  91. package/dist/react-button.js +3 -3
  92. package/dist/react-calendar.js +1 -1
  93. package/dist/react-call-controls.js +1 -1
  94. package/dist/react-callout.js +8 -3
  95. package/dist/react-callout.js.map +2 -2
  96. package/dist/react-card-grid.js +1 -1
  97. package/dist/react-card.js +5 -5
  98. package/dist/react-card.js.map +2 -2
  99. package/dist/react-carousel.js +1 -1
  100. package/dist/react-charts.js +1 -1
  101. package/dist/react-checkbox.js +1 -1
  102. package/dist/react-checklist.js +1 -1
  103. package/dist/react-code-block.js +1 -1
  104. package/dist/react-code-editor.js +1 -1
  105. package/dist/react-collapsible.js +1 -1
  106. package/dist/react-combobox.js +1 -1
  107. package/dist/react-command-input.js +1 -1
  108. package/dist/react-command.js +115 -70
  109. package/dist/react-command.js.map +3 -3
  110. package/dist/react-composer.js +3 -3
  111. package/dist/react-content-protection.js +1 -1
  112. package/dist/react-conversation.js +5 -5
  113. package/dist/react-cookie-consent.js +1 -1
  114. package/dist/react-data-table.js +125 -114
  115. package/dist/react-data-table.js.map +2 -2
  116. package/dist/react-date-picker.js +1 -1
  117. package/dist/react-device-frame.js +1 -1
  118. package/dist/react-dialog.js +33 -9
  119. package/dist/react-dialog.js.map +2 -2
  120. package/dist/react-diff-viewer.js +1 -1
  121. package/dist/react-dropdown-menu.js +61 -8
  122. package/dist/react-dropdown-menu.js.map +3 -3
  123. package/dist/react-editor-status-bar.js +1 -1
  124. package/dist/react-editor-tabs.js +1 -1
  125. package/dist/react-emoji-picker.js +2 -2
  126. package/dist/react-empty-state.js +1 -1
  127. package/dist/react-feedback-dialog.js +2 -2
  128. package/dist/react-file-tree.js +1 -1
  129. package/dist/react-file-upload.js +1 -1
  130. package/dist/react-floating-reactions.js +1 -1
  131. package/dist/react-flow-editor.js +2 -2
  132. package/dist/react-footer.js +1 -1
  133. package/dist/react-funnel-chart.js +105 -0
  134. package/dist/react-funnel-chart.js.map +7 -0
  135. package/dist/react-graph-view.js +2 -2
  136. package/dist/react-infinite-canvas.js +2 -2
  137. package/dist/react-inline-editor.js +1 -1
  138. package/dist/react-input-group.js +1 -1
  139. package/dist/react-input.js +2 -2
  140. package/dist/react-install-prompt.js +1 -1
  141. package/dist/react-kanban-board.js +1 -1
  142. package/dist/react-keyboard-shortcut.js +2 -2
  143. package/dist/react-language-selector.js +1 -1
  144. package/dist/react-line-chart.js +280 -0
  145. package/dist/react-line-chart.js.map +7 -0
  146. package/dist/react-link-card.js +1 -1
  147. package/dist/react-live-captions.js +1 -1
  148. package/dist/react-live-cursors.js +1 -1
  149. package/dist/react-live-transcript.js +1 -1
  150. package/dist/react-location-selector.js +1 -1
  151. package/dist/react-logger.js +3 -3
  152. package/dist/react-markdown-renderer.js +2 -2
  153. package/dist/react-marquee-strip.js +1 -1
  154. package/dist/react-mascot.js +1 -1
  155. package/dist/react-mastery-bar.js +1 -1
  156. package/dist/react-mini-map.js +1 -1
  157. package/dist/react-mobile-nav.js +1 -1
  158. package/dist/react-native-select.js +52 -0
  159. package/dist/react-native-select.js.map +7 -0
  160. package/dist/react-navbar.js +1 -1
  161. package/dist/react-numbered-steps.js +1 -1
  162. package/dist/react-otp-input.js +1 -1
  163. package/dist/react-page-header.js +40 -0
  164. package/dist/react-page-header.js.map +7 -0
  165. package/dist/react-pagination.js +1 -1
  166. package/dist/react-password-input.js +2 -2
  167. package/dist/react-payment.js +1 -1
  168. package/dist/react-popover.js +1 -1
  169. package/dist/react-pre-call-lobby.js +1 -1
  170. package/dist/react-presence-indicator.js +1 -1
  171. package/dist/react-pricing-card.js +1 -1
  172. package/dist/react-progress-display.js +2 -2
  173. package/dist/react-progress-display.js.map +1 -1
  174. package/dist/react-radial-gauge.js +1 -1
  175. package/dist/react-radio.js +1 -1
  176. package/dist/react-rating-scale.js +1 -1
  177. package/dist/react-reaction-bar.js +1 -1
  178. package/dist/react-resizable-layout.js +1 -1
  179. package/dist/react-search-bar.js +1 -1
  180. package/dist/react-section-head.js +1 -1
  181. package/dist/react-segmented-control.js +1 -1
  182. package/dist/react-select.js +94 -20
  183. package/dist/react-select.js.map +3 -3
  184. package/dist/react-separator.js +1 -1
  185. package/dist/react-sheet.js +1 -1
  186. package/dist/react-sidebar.js +1 -1
  187. package/dist/react-skeleton.js +1 -1
  188. package/dist/react-skip-to-content.js +1 -1
  189. package/dist/react-slide-viewer.js +1 -1
  190. package/dist/react-slider.js +1 -1
  191. package/dist/react-slot-picker.js +1 -1
  192. package/dist/react-social-auth-button.js +3 -3
  193. package/dist/react-sortable-list.js +1 -1
  194. package/dist/react-stat-grid.js +91 -22
  195. package/dist/react-stat-grid.js.map +2 -2
  196. package/dist/react-status-indicator.js +1 -1
  197. package/dist/react-steps.js +1 -1
  198. package/dist/react-sticky-note.js +1 -1
  199. package/dist/react-switch.js +1 -1
  200. package/dist/react-table-of-contents.js +1 -1
  201. package/dist/react-table.js +148 -0
  202. package/dist/react-table.js.map +7 -0
  203. package/dist/react-tabs.js +84 -7
  204. package/dist/react-tabs.js.map +2 -2
  205. package/dist/react-terminal.js +1 -1
  206. package/dist/react-test-results.js +1 -1
  207. package/dist/react-textarea.js +3 -3
  208. package/dist/react-textarea.js.map +1 -1
  209. package/dist/react-thread-view.js +2 -2
  210. package/dist/react-timeline.js +1 -1
  211. package/dist/react-toast.js +1 -1
  212. package/dist/react-tooltip.js +1 -1
  213. package/dist/react-version-selector.js +1 -1
  214. package/dist/react-video-grid.js +2 -2
  215. package/dist/react-video-player.js +1 -1
  216. package/dist/react-video-tile.js +2 -2
  217. package/dist/react-voice-pill.js +1 -1
  218. package/dist/react-waveform.js +1 -1
  219. package/dist/react-wizard.js +1 -1
  220. package/dist/theme.js +1 -1
  221. package/package.json +7 -1
  222. package/dist/chunk-NKCWOPNX.js.map +0 -7
  223. package/dist/chunk-SDZ3LROZ.js +0 -7
  224. package/dist/chunk-Y2FNNAIL.js.map +0 -1
  225. package/dist/chunk-ZF3OHCGV.js.map +0 -7
  226. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  227. /package/dist/{chunk-533MCMSU.js.map → chunk-3I3DYDHR.js.map} +0 -0
  228. /package/dist/{chunk-H54FLNAF.js.map → chunk-63N4PZUJ.js.map} +0 -0
  229. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
  230. /package/dist/{chunk-WK2IIUFO.js.map → chunk-QDMLIDYN.js.map} +0 -0
  231. /package/dist/{chunk-BOLFYVI6.js.map → chunk-QPCKJ2YR.js.map} +0 -0
  232. /package/dist/{chunk-UNEM2TRI.js.map → chunk-SDAJVXD4.js.map} +0 -0
  233. /package/dist/{chunk-VK3EQ34F.js.map → chunk-V24GDHUX.js.map} +0 -0
  234. /package/dist/{chunk-AMK4VCBG.js.map → chunk-WYKPPK3W.js.map} +0 -0
  235. /package/dist/{chunk-ONACRMG4.js.map → chunk-XMFNBOPO.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-ZF3OHCGV.js";
4
+ } from "./chunk-2Q6HHFAN.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-NKCWOPNX.js";
4
- import "./chunk-WK2IIUFO.js";
3
+ } from "./chunk-Z5IHYNQD.js";
4
+ import "./chunk-QDMLIDYN.js";
5
5
  import {
6
6
  cn,
7
7
  cva
8
- } from "./chunk-ZF3OHCGV.js";
8
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
4
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
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 <= 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-ZF3OHCGV.js";
4
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
4
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
4
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
5
+ } from "./chunk-2Q6HHFAN.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-ZF3OHCGV.js";
3
+ } from "./chunk-2Q6HHFAN.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-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
+ }
@@ -4,7 +4,7 @@ import {
4
4
  cva,
5
5
  devWarn,
6
6
  generateId
7
- } from "./chunk-ZF3OHCGV.js";
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 }, ref) {
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, orientation, idPrefix } = useTabsContext();
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
- "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,
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}`;