@refraction-ui/react 0.22.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 (63) hide show
  1. package/dist/chunk-7P7EJ56S.js +7 -0
  2. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  3. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  4. package/dist/{chunk-3Y2T26QD.js → chunk-Z5IHYNQD.js} +4 -2
  5. package/dist/{chunk-3Y2T26QD.js.map → chunk-Z5IHYNQD.js.map} +2 -2
  6. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  7. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  8. package/dist/index.cjs +736 -274
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +3 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.js +3 -0
  13. package/dist/internal/avatar/index.d.cts +4 -1
  14. package/dist/internal/avatar/index.d.ts +4 -1
  15. package/dist/internal/data-table/index.d.cts +48 -3
  16. package/dist/internal/data-table/index.d.ts +48 -3
  17. package/dist/internal/line-chart/index.d.ts +17 -3
  18. package/dist/internal/native-select/index.d.ts +21 -0
  19. package/dist/internal/react-avatar/index.d.cts +4 -2
  20. package/dist/internal/react-avatar/index.d.ts +4 -2
  21. package/dist/internal/react-command/index.d.cts +13 -2
  22. package/dist/internal/react-command/index.d.ts +13 -2
  23. package/dist/internal/react-data-table/index.d.cts +27 -9
  24. package/dist/internal/react-data-table/index.d.ts +27 -9
  25. package/dist/internal/react-dialog/index.d.cts +5 -0
  26. package/dist/internal/react-dialog/index.d.ts +5 -0
  27. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  28. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  29. package/dist/internal/react-line-chart/index.d.ts +7 -2
  30. package/dist/internal/react-native-select/index.d.ts +19 -0
  31. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  32. package/dist/internal/react-table/index.d.ts +39 -0
  33. package/dist/internal/stat-grid/index.d.ts +49 -7
  34. package/dist/internal/table/index.d.ts +46 -0
  35. package/dist/react-analytics.js +15 -3
  36. package/dist/react-analytics.js.map +2 -2
  37. package/dist/react-avatar.js +12 -8
  38. package/dist/react-avatar.js.map +2 -2
  39. package/dist/react-button.js +1 -1
  40. package/dist/react-command.js +114 -69
  41. package/dist/react-command.js.map +3 -3
  42. package/dist/react-data-table.js +124 -113
  43. package/dist/react-data-table.js.map +2 -2
  44. package/dist/react-dialog.js +31 -7
  45. package/dist/react-dialog.js.map +2 -2
  46. package/dist/react-dropdown-menu.js +60 -7
  47. package/dist/react-dropdown-menu.js.map +3 -3
  48. package/dist/react-line-chart.js +48 -10
  49. package/dist/react-line-chart.js.map +2 -2
  50. package/dist/react-logger.js +2 -2
  51. package/dist/react-native-select.js +52 -0
  52. package/dist/react-native-select.js.map +7 -0
  53. package/dist/react-social-auth-button.js +1 -1
  54. package/dist/react-stat-grid.js +90 -21
  55. package/dist/react-stat-grid.js.map +2 -2
  56. package/dist/react-table.js +148 -0
  57. package/dist/react-table.js.map +7 -0
  58. package/dist/react-tabs.js +34 -5
  59. package/dist/react-tabs.js.map +2 -2
  60. package/package.json +3 -1
  61. package/dist/chunk-SDZ3LROZ.js +0 -7
  62. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  63. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
@@ -8,10 +8,13 @@ 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
  }
@@ -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
+ }
@@ -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}`;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../tabs/src/tabs.ts", "../../tabs/src/tabs.styles.ts", "../../react-tabs/src/tabs.tsx"],
4
- "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface TabsProps {\n /** The active tab value (controlled) */\n value?: string\n /** The default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Orientation of the tab list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface TabsState {\n activeValue: string\n}\n\nexport interface TabsAPI {\n /** Current tabs state */\n state: TabsState\n /** ARIA attributes for the tab list */\n listProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab trigger props */\n getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab panel props */\n getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Select a tab by value */\n select(value: string): void\n /** Keyboard handlers for the tab list */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated ID prefix for aria linking */\n idPrefix: string\n}\n\nexport function createTabs(props: TabsProps = {}): TabsAPI {\n const {\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n orientation = 'horizontal',\n } = props\n\n let uncontrolledValue = controlledValue ?? defaultValue\n const idPrefix = generateId('rfr-tabs')\n\n function getActiveValue(): string {\n if (controlledValue !== undefined) return controlledValue\n return uncontrolledValue\n }\n\n function select(value: string): void {\n uncontrolledValue = value\n onValueChange?.(value)\n }\n\n function getTabId(value: string): string {\n return `${idPrefix}-tab-${value}`\n }\n\n function getPanelId(value: string): string {\n return `${idPrefix}-panel-${value}`\n }\n\n function getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': getPanelId(value),\n tabIndex: isSelected ? 0 : -1,\n id: getTabId(value),\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n function getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tabpanel',\n 'aria-labelledby': getTabId(value),\n id: getPanelId(value),\n hidden: !isSelected || undefined,\n tabIndex: 0,\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n const listProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'tablist',\n 'aria-orientation': orientation,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = orientation === 'horizontal'\n ? {\n [Keys.ArrowLeft]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowRight]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n : {\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n\n return {\n state: { activeValue: getActiveValue() },\n listProps,\n getTabProps,\n getPanelProps,\n select,\n keyboardHandlers,\n idPrefix,\n }\n}\n\n/**\n * Roving-focus target for a key press inside a tab list (WAI-ARIA Tabs\n * pattern). Given the index of the focused tab among the ENABLED tabs, returns\n * the index to move to, or `null` when the key is not a navigation key for this\n * orientation. Arrow keys wrap; Home/End jump to the ends.\n */\nexport function getNextTabIndex(\n current: number,\n key: string,\n count: number,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | null {\n if (count === 0) return null\n const prev = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const next = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n switch (key) {\n case next:\n return current < 0 ? 0 : (current + 1) % count\n case prev:\n return current < 0 ? count - 1 : (current - 1 + count) % count\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return null\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tabsListVariants = cva({\n base: 'inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n})\n\nexport const tabsTriggerVariants = cva({\n base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n})\n", "import * as React from 'react'\nimport {\n createTabs,\n getNextTabIndex,\n tabsListVariants,\n tabsTriggerVariants,\n type TabsProps as CoreTabsProps,\n} from '@refraction-ui/tabs'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n orientation: 'horizontal' | 'vertical'\n idPrefix: string\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(): TabsContextValue {\n const ctx = React.useContext(TabsContext)\n if (!ctx) {\n devWarn(\n 'react-tabs/context-outside-provider',\n 'Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw.',\n )\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n children?: React.ReactNode\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n function Tabs({ value: controlledValue, defaultValue = '', onValueChange, orientation = 'horizontal', className, children, ...props }: TabsProps, ref) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isControlled) {\n setUncontrolledValue(next)\n }\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createTabs> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createTabs({ value, orientation })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n orientation,\n idPrefix: api.idPrefix,\n }),\n [value, handleValueChange, orientation, api.idPrefix],\n )\n\n return React.createElement(\n 'div',\n { ref, className, 'data-orientation': orientation, ...props },\n React.createElement(TabsContext.Provider, { value: ctx }, children),\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsList\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n function TabsList({ className, onKeyDown, ...props }, forwardedRef) {\n const { orientation } = useTabsContext()\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n listRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n // Roving tabindex needs exactly one tab stop. A trigger only knows whether\n // IT is selected, so when no enabled trigger matches the value (no\n // defaultValue, or the selected tab is disabled) nothing would be\n // tabbable; make the first enabled tab the stop in that case.\n // This effect owns the final tabindex of every trigger (React leaves a\n // DOM value alone while its prop is unchanged, so patching only the\n // fallback would leave two tab stops after the next selection).\n React.useEffect(() => {\n const tabs = enabledTabs(listRef.current)\n const stop = tabs.find((tab) => tab.getAttribute('aria-selected') === 'true') ?? tabs[0]\n for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1\n })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (e.defaultPrevented) return\n const tabs = enabledTabs(listRef.current)\n const current = tabs.indexOf(e.target as HTMLButtonElement)\n if (current === -1) return\n const next = getNextTabIndex(current, e.key, tabs.length, orientation)\n if (next === null) return\n e.preventDefault()\n tabs[next].focus()\n // Automatic activation: moving focus selects the tab.\n tabs[next].click()\n }\n\n return React.createElement('div', {\n ref,\n role: 'tablist',\n 'aria-orientation': orientation,\n className: cn(tabsListVariants(), className),\n onKeyDown: handleKeyDown,\n ...props,\n })\n },\n)\n\nfunction enabledTabs(list: HTMLElement | null): HTMLButtonElement[] {\n if (!list) return []\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])'))\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n function TabsTrigger({ value, className, onClick, onKeyDown, children, ...props }, ref) {\n const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onValueChange(value)\n onClick?.(e)\n }\n\n // Arrow / Home / End navigation is handled by TabsList (roving focus);\n // a consumer onKeyDown runs first and can preventDefault to opt out.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': panelId,\n tabIndex: isSelected ? 0 : -1,\n id: tabId,\n 'data-state': isSelected ? 'active' : 'inactive',\n className: cn(tabsTriggerVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n function TabsContent({ value, className, children, ...props }, ref) {\n const { value: activeValue, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n if (!isSelected) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'tabpanel',\n 'aria-labelledby': tabId,\n id: panelId,\n tabIndex: 0,\n 'data-state': 'active',\n className,\n ...props,\n },\n children,\n )\n },\n)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface TabsProps {\n /** The active tab value (controlled) */\n value?: string\n /** The default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Orientation of the tab list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface TabsState {\n activeValue: string\n}\n\nexport interface TabsAPI {\n /** Current tabs state */\n state: TabsState\n /** ARIA attributes for the tab list */\n listProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab trigger props */\n getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab panel props */\n getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Select a tab by value */\n select(value: string): void\n /** Keyboard handlers for the tab list */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated ID prefix for aria linking */\n idPrefix: string\n}\n\nexport function createTabs(props: TabsProps = {}): TabsAPI {\n const {\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n orientation = 'horizontal',\n } = props\n\n let uncontrolledValue = controlledValue ?? defaultValue\n const idPrefix = generateId('rfr-tabs')\n\n function getActiveValue(): string {\n if (controlledValue !== undefined) return controlledValue\n return uncontrolledValue\n }\n\n function select(value: string): void {\n uncontrolledValue = value\n onValueChange?.(value)\n }\n\n function getTabId(value: string): string {\n return `${idPrefix}-tab-${value}`\n }\n\n function getPanelId(value: string): string {\n return `${idPrefix}-panel-${value}`\n }\n\n function getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': getPanelId(value),\n tabIndex: isSelected ? 0 : -1,\n id: getTabId(value),\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n function getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tabpanel',\n 'aria-labelledby': getTabId(value),\n id: getPanelId(value),\n hidden: !isSelected || undefined,\n tabIndex: 0,\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n const listProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'tablist',\n 'aria-orientation': orientation,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = orientation === 'horizontal'\n ? {\n [Keys.ArrowLeft]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowRight]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n : {\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n\n return {\n state: { activeValue: getActiveValue() },\n listProps,\n getTabProps,\n getPanelProps,\n select,\n keyboardHandlers,\n idPrefix,\n }\n}\n\n/**\n * Roving-focus target for a key press inside a tab list (WAI-ARIA Tabs\n * pattern). Given the index of the focused tab among the ENABLED tabs, returns\n * the index to move to, or `null` when the key is not a navigation key for this\n * orientation. Arrow keys wrap; Home/End jump to the ends.\n */\nexport function getNextTabIndex(\n current: number,\n key: string,\n count: number,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | null {\n if (count === 0) return null\n const prev = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const next = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n switch (key) {\n case next:\n return current < 0 ? 0 : (current + 1) % count\n case prev:\n return current < 0 ? count - 1 : (current - 1 + count) % count\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return null\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tabsListVariants = cva({\n base: 'inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n})\n\nexport const tabsTriggerVariants = cva({\n base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n})\n", "import * as React from 'react'\nimport {\n createTabs,\n getNextTabIndex,\n tabsListVariants,\n tabsTriggerVariants,\n type TabsProps as CoreTabsProps,\n} from '@refraction-ui/tabs'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n orientation: 'horizontal' | 'vertical'\n idPrefix: string\n /** Values that have a TabsContent, so triggers only reference real panels. */\n panels: ReadonlySet<string>\n registerPanel: (value: string) => () => void\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(): TabsContextValue {\n const ctx = React.useContext(TabsContext)\n if (!ctx) {\n devWarn(\n 'react-tabs/context-outside-provider',\n 'Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw.',\n )\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n children?: React.ReactNode\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n function Tabs({ value: controlledValue, defaultValue = '', onValueChange, orientation = 'horizontal', className, children, ...props }: TabsProps, ref) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isControlled) {\n setUncontrolledValue(next)\n }\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createTabs> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createTabs({ value, orientation })\n }\n const api = apiRef.current\n\n const [panels, setPanels] = React.useState<ReadonlySet<string>>(() => new Set())\n const registerPanel = React.useCallback((panelValue: string) => {\n setPanels((prev) => (prev.has(panelValue) ? prev : new Set(prev).add(panelValue)))\n return () =>\n setPanels((prev) => {\n if (!prev.has(panelValue)) return prev\n const next = new Set(prev)\n next.delete(panelValue)\n return next\n })\n }, [])\n\n // Panels found in the element tree cover the first/server render; mounted\n // panels (possibly nested in custom components) register themselves.\n const allPanels = React.useMemo(() => {\n const found = new Set(panels)\n collectPanelValues(children, found)\n return found\n }, [children, panels])\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n orientation,\n idPrefix: api.idPrefix,\n panels: allPanels,\n registerPanel,\n }),\n [value, handleValueChange, orientation, api.idPrefix, allPanels, registerPanel],\n )\n\n return React.createElement(\n 'div',\n { ref, className, 'data-orientation': orientation, ...props },\n React.createElement(TabsContext.Provider, { value: ctx }, children),\n )\n },\n)\n\nfunction collectPanelValues(node: React.ReactNode, into: Set<string>): void {\n React.Children.forEach(node, (child) => {\n if (!React.isValidElement<{ value?: unknown; children?: React.ReactNode }>(child)) return\n if (child.type === TabsContent && typeof child.props.value === 'string') {\n into.add(child.props.value)\n return\n }\n collectPanelValues(child.props.children, into)\n })\n}\n\n// ---------------------------------------------------------------------------\n// TabsList\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n function TabsList({ className, onKeyDown, ...props }, forwardedRef) {\n const { orientation } = useTabsContext()\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n listRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n // Roving tabindex needs exactly one tab stop. A trigger only knows whether\n // IT is selected, so when no enabled trigger matches the value (no\n // defaultValue, or the selected tab is disabled) nothing would be\n // tabbable; make the first enabled tab the stop in that case.\n // This effect owns the final tabindex of every trigger (React leaves a\n // DOM value alone while its prop is unchanged, so patching only the\n // fallback would leave two tab stops after the next selection).\n React.useEffect(() => {\n const tabs = enabledTabs(listRef.current)\n const stop = tabs.find((tab) => tab.getAttribute('aria-selected') === 'true') ?? tabs[0]\n for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1\n })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (e.defaultPrevented) return\n const tabs = enabledTabs(listRef.current)\n const current = tabs.indexOf(e.target as HTMLButtonElement)\n if (current === -1) return\n const next = getNextTabIndex(current, e.key, tabs.length, orientation)\n if (next === null) return\n e.preventDefault()\n tabs[next].focus()\n // Automatic activation: moving focus selects the tab.\n tabs[next].click()\n }\n\n return React.createElement('div', {\n ref,\n role: 'tablist',\n 'aria-orientation': orientation,\n className: cn(tabsListVariants(), className),\n onKeyDown: handleKeyDown,\n ...props,\n })\n },\n)\n\nfunction enabledTabs(list: HTMLElement | null): HTMLButtonElement[] {\n if (!list) return []\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])'))\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n function TabsTrigger({ value, className, onClick, onKeyDown, children, ...props }, ref) {\n const { value: activeValue, onValueChange, idPrefix, panels } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onValueChange(value)\n onClick?.(e)\n }\n\n // Arrow / Home / End navigation is handled by TabsList (roving focus);\n // a consumer onKeyDown runs first and can preventDefault to opt out.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n role: 'tab',\n 'aria-selected': isSelected,\n // Only the selected panel is rendered; never reference a missing element.\n 'aria-controls': isSelected && panels.has(value) ? panelId : undefined,\n tabIndex: isSelected ? 0 : -1,\n id: tabId,\n 'data-state': isSelected ? 'active' : 'inactive',\n className: cn(tabsTriggerVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n function TabsContent({ value, className, children, ...props }, ref) {\n const { value: activeValue, idPrefix, registerPanel } = useTabsContext()\n React.useEffect(() => registerPanel(value), [registerPanel, value])\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n if (!isSelected) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'tabpanel',\n 'aria-labelledby': tabId,\n id: panelId,\n tabIndex: 0,\n 'data-state': 'active',\n className,\n ...props,\n },\n children,\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;;;;AAmCO,SAAS,WAAW,QAAmB,CAAA,GAAa;AACzD,QAAM;IACJ,OAAO;IACP,eAAe;IACf;IACA,cAAc;EAAA,IACZ;AAEJ,MAAI,oBAAoB,mBAAmB;AAC3C,QAAM,WAAW,WAAW,UAAU;AAEtC,WAAS,iBAAyB;AAChC,QAAI,oBAAoB,OAAW,QAAO;AAC1C,WAAO;EACT;AAEA,WAAS,OAAO,OAAqB;AACnC,wBAAoB;AACpB,oBAAgB,KAAK;EACvB;AAEA,WAAS,SAAS,OAAuB;AACvC,WAAO,GAAG,QAAQ,QAAQ,KAAK;EACjC;AAEA,WAAS,WAAW,OAAuB;AACzC,WAAO,GAAG,QAAQ,UAAU,KAAK;EACnC;AAEA,WAAS,YAAY,OAAsE;AACzF,UAAM,aAAa,eAAA,MAAqB;AACxC,WAAO;MACL,MAAM;MACN,iBAAiB;MACjB,iBAAiB,WAAW,KAAK;MACjC,UAAU,aAAa,IAAI;MAC3B,IAAI,SAAS,KAAK;MAClB,cAAc,aAAa,WAAW;IAAA;EAE1C;AAEA,WAAS,cAAc,OAAsE;AAC3F,UAAM,aAAa,eAAA,MAAqB;AACxC,WAAO;MACL,MAAM;MACN,mBAAmB,SAAS,KAAK;MACjC,IAAI,WAAW,KAAK;MACpB,QAAQ,CAAC,cAAc;MACvB,UAAU;MACV,cAAc,aAAa,WAAW;IAAA;EAE1C;AAEA,QAAM,YAAmE;IACvE,MAAM;IACN,oBAAoB;EAAA;AAGtB,QAAM,mBAAuC,gBAAgB,eACzD;IACE,CAAC,KAAK,SAAS,GAAG,CAAC,MAAM;AACvB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,UAAU,GAAG,CAAC,MAAM;AACxB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;AAClB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM;AACjB,QAAE,eAAA;IACJ;EAAA,IAEF;IACE,CAAC,KAAK,OAAO,GAAG,CAAC,MAAM;AACrB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,SAAS,GAAG,CAAC,MAAM;AACvB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;AAClB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM;AACjB,QAAE,eAAA;IACJ;EAAA;AAGN,SAAO;IACL,OAAO,EAAE,aAAa,eAAA,EAAe;IACrC;IACA;IACA;IACA;IACA;IACA;EAAA;AAEJ;AAQO,SAAS,gBACd,SACA,KACA,OACA,cAAyC,cAC1B;AACf,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,OAAO,gBAAgB,eAAe,cAAc;AAC1D,QAAM,OAAO,gBAAgB,eAAe,eAAe;AAC3D,UAAQ,KAAA;IACN,KAAK;AACH,aAAO,UAAU,IAAI,KAAK,UAAU,KAAK;IAC3C,KAAK;AACH,aAAO,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,SAAS;IAC3D,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO,QAAQ;IACjB;AACE,aAAO;EAAA;AAEb;AC/JO,IAAM,mBAAmB,IAAI;EAClC,MAAM;AACR,CAAC;AAEM,IAAM,sBAAsB,IAAI;EACrC,MAAM;AACR,CAAC;;;ACgBD,IAAM,cAAoB,oBAAuC,IAAI;AAErE,SAAS,iBAAmC;AAC1C,QAAM,MAAY,iBAAW,WAAW;AACxC,MAAI,CAAC,KAAK;AACR;MACE;MACA;IAAA;AAEF,UAAM,IAAI,MAAM,qDAAqD;EACvE;AACA,SAAO;AACT;AAeO,IAAM,OAAa;EACxB,SAASA,MAAK,EAAE,OAAO,iBAAiB,eAAe,IAAI,eAAe,cAAc,cAAc,WAAW,UAAU,GAAG,MAAA,GAAoB,KAAK;AACvJ,UAAM,CAAC,mBAAmB,oBAAoB,IAAU,eAAS,YAAY;AAC7E,UAAM,eAAe,oBAAoB;AACzC,UAAM,QAAQ,eAAe,kBAAkB;AAE/C,UAAM,oBAA0B;MAC9B,CAAC,SAAiB;AAChB,YAAI,CAAC,cAAc;AACjB,+BAAqB,IAAI;QAC3B;AACA,wBAAgB,IAAI;MACtB;MACA,CAAC,cAAc,aAAa;IAAA;AAI9B,UAAM,SAAe,aAA6C,IAAI;AACtE,QAAI,OAAO,YAAY,MAAM;AAC3B,aAAO,UAAU,WAAW,EAAE,OAAO,YAAA,CAAa;IACpD;AACA,UAAM,MAAM,OAAO;AAEnB,UAAM,CAAC,QAAQ,SAAS,IAAU,eAA8B,MAAM,oBAAI,IAAA,CAAK;AAC/E,UAAM,gBAAsB,kBAAY,CAAC,eAAuB;AAC9D,gBAAU,CAAC,SAAU,KAAK,IAAI,UAAU,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE,IAAI,UAAU,CAAE;AACjF,aAAO,MACL,UAAU,CAAC,SAAS;AAClB,YAAI,CAAC,KAAK,IAAI,UAAU,EAAG,QAAO;AAClC,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,OAAO,UAAU;AACtB,eAAO;MACT,CAAC;IACL,GAAG,CAAA,CAAE;AAIL,UAAM,YAAkB,cAAQ,MAAM;AACpC,YAAM,QAAQ,IAAI,IAAI,MAAM;AAC5B,yBAAmB,UAAU,KAAK;AAClC,aAAO;IACT,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,UAAM,MAAY;MAChB,OAAO;QACL;QACA,eAAe;QACf;QACA,UAAU,IAAI;QACd,QAAQ;QACR;MAAA;MAEF,CAAC,OAAO,mBAAmB,aAAa,IAAI,UAAU,WAAW,aAAa;IAAA;AAGhF,WAAa;MACX;MACA,EAAE,KAAK,WAAW,oBAAoB,aAAa,GAAG,MAAA;MAChD,oBAAc,YAAY,UAAU,EAAE,OAAO,IAAA,GAAO,QAAQ;IAAA;EAEpE;AACF;AAEA,SAAS,mBAAmB,MAAuB,MAAyB;AACpE,EAAA,eAAS,QAAQ,MAAM,CAAC,UAAU;AACtC,QAAI,CAAO,qBAAgE,KAAK,EAAG;AACnF,QAAI,MAAM,SAAS,eAAe,OAAO,MAAM,MAAM,UAAU,UAAU;AACvE,WAAK,IAAI,MAAM,MAAM,KAAK;AAC1B;IACF;AACA,uBAAmB,MAAM,MAAM,UAAU,IAAI;EAC/C,CAAC;AACH;AAQO,IAAM,WAAiB;EAC5B,SAASC,UAAS,EAAE,WAAW,WAAW,GAAG,MAAA,GAAS,cAAc;AAClE,UAAM,EAAE,YAAA,IAAgB,eAAA;AACxB,UAAM,UAAgB,aAA8B,IAAI;AACxD,UAAM,MAAY;MAChB,CAAC,SAAgC;AAC/B,gBAAQ,UAAU;AAClB,YAAI,OAAO,iBAAiB,WAAY,cAAa,IAAI;iBAChD,aAAA,cAA2B,UAAU;MAChD;MACA,CAAC,YAAY;IAAA;AAUT,IAAA,gBAAU,MAAM;AACpB,YAAM,OAAO,YAAY,QAAQ,OAAO;AACxC,YAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,aAAa,eAAe,MAAM,MAAM,KAAK,KAAK,CAAC;AACvF,iBAAW,OAAO,KAAM,KAAI,WAAW,QAAQ,OAAO,IAAI;IAC5D,CAAC;AAED,UAAM,gBAAgB,CAAC,MAA2C;AAChE,kBAAY,CAAC;AACb,UAAI,EAAE,iBAAkB;AACxB,YAAM,OAAO,YAAY,QAAQ,OAAO;AACxC,YAAM,UAAU,KAAK,QAAQ,EAAE,MAA2B;AAC1D,UAAI,YAAY,GAAI;AACpB,YAAM,OAAO,gBAAgB,SAAS,EAAE,KAAK,KAAK,QAAQ,WAAW;AACrE,UAAI,SAAS,KAAM;AACnB,QAAE,eAAA;AACF,WAAK,IAAI,EAAE,MAAA;AAEX,WAAK,IAAI,EAAE,MAAA;IACb;AAEA,WAAa,oBAAc,OAAO;MAChC;MACA,MAAM;MACN,oBAAoB;MACpB,WAAW,GAAG,iBAAA,GAAoB,SAAS;MAC3C,WAAW;MACX,GAAG;IAAA,CACJ;EACH;AACF;AAEA,SAAS,YAAY,MAA+C;AAClE,MAAI,CAAC,KAAM,QAAO,CAAA;AAClB,SAAO,MAAM,KAAK,KAAK,iBAAoC,8BAA8B,CAAC;AAC5F;AAUO,IAAM,cAAoB;EAC/B,SAASC,aAAY,EAAE,OAAO,WAAW,SAAS,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AACtF,UAAM,EAAE,OAAO,aAAa,eAAe,UAAU,OAAA,IAAW,eAAA;AAEhE,UAAM,aAAa,gBAAgB;AACnC,UAAM,QAAQ,GAAG,QAAQ,QAAQ,KAAK;AACtC,UAAM,UAAU,GAAG,QAAQ,UAAU,KAAK;AAE1C,UAAM,cAAc,CAAC,MAA2C;AAC9D,oBAAc,KAAK;AACnB,gBAAU,CAAC;IACb;AAIA,UAAM,gBAAgB,CAAC,MAA8C;AACnE,kBAAY,CAAC;IACf;AAEA,WAAa;MACX;MACA;QACE;QACA,MAAM;QACN,MAAM;QACN,iBAAiB;;QAEjB,iBAAiB,cAAc,OAAO,IAAI,KAAK,IAAI,UAAU;QAC7D,UAAU,aAAa,IAAI;QAC3B,IAAI;QACJ,cAAc,aAAa,WAAW;QACtC,WAAW,GAAG,oBAAA,GAAuB,SAAS;QAC9C,SAAS;QACT,WAAW;QACX,GAAG;MAAA;MAEL;IAAA;EAEJ;AACF;AAUO,IAAM,cAAoB;EAC/B,SAASC,aAAY,EAAE,OAAO,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAClE,UAAM,EAAE,OAAO,aAAa,UAAU,cAAA,IAAkB,eAAA;AAClD,IAAA,gBAAU,MAAM,cAAc,KAAK,GAAG,CAAC,eAAe,KAAK,CAAC;AAElE,UAAM,aAAa,gBAAgB;AACnC,UAAM,QAAQ,GAAG,QAAQ,QAAQ,KAAK;AACtC,UAAM,UAAU,GAAG,QAAQ,UAAU,KAAK;AAE1C,QAAI,CAAC,WAAY,QAAO;AAExB,WAAa;MACX;MACA;QACE;QACA,MAAM;QACN,mBAAmB;QACnB,IAAI;QACJ,UAAU;QACV,cAAc;QACd;QACA,GAAG;MAAA;MAEL;IAAA;EAEJ;AACF;",
6
6
  "names": ["Tabs", "TabsList", "TabsTrigger", "TabsContent"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refraction-ui/react",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "All Refraction UI React components in one package — headless, accessible, zero-dependency",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -126,6 +126,7 @@
126
126
  "@refraction-ui/react-mastery-bar": "workspace:*",
127
127
  "@refraction-ui/react-mini-map": "workspace:*",
128
128
  "@refraction-ui/react-mobile-nav": "workspace:*",
129
+ "@refraction-ui/react-native-select": "workspace:*",
129
130
  "@refraction-ui/react-navbar": "workspace:*",
130
131
  "@refraction-ui/react-numbered-steps": "workspace:*",
131
132
  "@refraction-ui/react-otp-input": "workspace:*",
@@ -164,6 +165,7 @@
164
165
  "@refraction-ui/react-steps": "workspace:*",
165
166
  "@refraction-ui/react-sticky-note": "workspace:*",
166
167
  "@refraction-ui/react-switch": "workspace:*",
168
+ "@refraction-ui/react-table": "workspace:*",
167
169
  "@refraction-ui/react-table-of-contents": "workspace:*",
168
170
  "@refraction-ui/react-tabs": "workspace:*",
169
171
  "@refraction-ui/react-terminal": "workspace:*",
@@ -1,7 +0,0 @@
1
- import {
2
- createFaroSink
3
- } from "./chunk-XWP763SH.js";
4
- export {
5
- createFaroSink
6
- };
7
- //# sourceMappingURL=chunk-SDZ3LROZ.js.map
@@ -1,3 +0,0 @@
1
- export { createFaroSink } from './chunk-XWP763SH.js';
2
- //# sourceMappingURL=faro-engine-47HGRAQH-JKINJPMH.js.map
3
- //# sourceMappingURL=faro-engine-47HGRAQH-JKINJPMH.js.map