@refraction-ui/react 0.22.0 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/{chunk-V24GDHUX.js → chunk-4ACSHPCM.js} +2 -2
  2. package/dist/{chunk-SDAJVXD4.js → chunk-5P56PN3J.js} +2 -2
  3. package/dist/chunk-75BKRTPO.js +417 -0
  4. package/dist/{chunk-2Q6HHFAN.js.map → chunk-75BKRTPO.js.map} +1 -1
  5. package/dist/chunk-7P7EJ56S.js +7 -0
  6. package/dist/{chunk-QPCKJ2YR.js → chunk-GG6MZDGV.js} +2 -2
  7. package/dist/{chunk-QDMLIDYN.js → chunk-GU5MI7FX.js} +2 -2
  8. package/dist/{chunk-3Y2T26QD.js → chunk-JZQ5ZL46.js} +6 -4
  9. package/dist/{chunk-3Y2T26QD.js.map → chunk-JZQ5ZL46.js.map} +2 -2
  10. package/dist/{chunk-RSWOLRIC.js → chunk-KIZD73DK.js} +2 -2
  11. package/dist/{chunk-XMFNBOPO.js → chunk-PY2TIFCT.js} +2 -2
  12. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  13. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  14. package/dist/{chunk-3I3DYDHR.js → chunk-WNLYPQOS.js} +2 -2
  15. package/dist/{chunk-63N4PZUJ.js → chunk-X6HEKRWE.js} +2 -2
  16. package/dist/{chunk-WYKPPK3W.js → chunk-XAJDSVZR.js} +2 -2
  17. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  18. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  19. package/dist/index.cjs +736 -274
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +3 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.js +3 -0
  24. package/dist/internal/avatar/index.d.cts +4 -1
  25. package/dist/internal/avatar/index.d.ts +4 -1
  26. package/dist/internal/data-table/index.d.cts +48 -3
  27. package/dist/internal/data-table/index.d.ts +48 -3
  28. package/dist/internal/line-chart/index.d.ts +17 -3
  29. package/dist/internal/native-select/index.d.ts +21 -0
  30. package/dist/internal/react-avatar/index.d.cts +4 -2
  31. package/dist/internal/react-avatar/index.d.ts +4 -2
  32. package/dist/internal/react-command/index.d.cts +13 -2
  33. package/dist/internal/react-command/index.d.ts +13 -2
  34. package/dist/internal/react-data-table/index.d.cts +27 -9
  35. package/dist/internal/react-data-table/index.d.ts +27 -9
  36. package/dist/internal/react-dialog/index.d.cts +5 -0
  37. package/dist/internal/react-dialog/index.d.ts +5 -0
  38. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  39. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  40. package/dist/internal/react-line-chart/index.d.ts +7 -2
  41. package/dist/internal/react-native-select/index.d.ts +19 -0
  42. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  43. package/dist/internal/react-table/index.d.ts +39 -0
  44. package/dist/internal/stat-grid/index.d.ts +49 -7
  45. package/dist/internal/table/index.d.ts +46 -0
  46. package/dist/react-accordion.js +1 -1
  47. package/dist/react-action-list.js +1 -1
  48. package/dist/react-ai.js +1 -1
  49. package/dist/react-analytics.js +16 -4
  50. package/dist/react-analytics.js.map +2 -2
  51. package/dist/react-animated-text.js +1 -1
  52. package/dist/react-app-shell.js +1 -1
  53. package/dist/react-audience-feature-card.js +1 -1
  54. package/dist/react-audio-room.js +1 -1
  55. package/dist/react-auth.js +1 -1
  56. package/dist/react-avatar-group.js +1 -1
  57. package/dist/react-avatar.js +13 -9
  58. package/dist/react-avatar.js.map +2 -2
  59. package/dist/react-badge.js +1 -1
  60. package/dist/react-bottom-nav.js +1 -1
  61. package/dist/react-brand-network-cell.js +1 -1
  62. package/dist/react-breadcrumbs.js +1 -1
  63. package/dist/react-browser-chrome-mock.js +1 -1
  64. package/dist/react-button.js +3 -3
  65. package/dist/react-calendar.js +1 -1
  66. package/dist/react-call-controls.js +1 -1
  67. package/dist/react-callout.js +1 -1
  68. package/dist/react-card-grid.js +1 -1
  69. package/dist/react-card.js +1 -1
  70. package/dist/react-carousel.js +1 -1
  71. package/dist/react-charts.js +1 -1
  72. package/dist/react-checkbox.js +1 -1
  73. package/dist/react-checklist.js +1 -1
  74. package/dist/react-code-block.js +1 -1
  75. package/dist/react-code-editor.js +1 -1
  76. package/dist/react-collapsible.js +1 -1
  77. package/dist/react-combobox.js +1 -1
  78. package/dist/react-command-input.js +1 -1
  79. package/dist/react-command.js +115 -70
  80. package/dist/react-command.js.map +3 -3
  81. package/dist/react-composer.js +3 -3
  82. package/dist/react-content-protection.js +1 -1
  83. package/dist/react-conversation.js +5 -5
  84. package/dist/react-cookie-consent.js +1 -1
  85. package/dist/react-data-table.js +125 -114
  86. package/dist/react-data-table.js.map +2 -2
  87. package/dist/react-date-picker.js +1 -1
  88. package/dist/react-device-frame.js +1 -1
  89. package/dist/react-dialog.js +33 -9
  90. package/dist/react-dialog.js.map +2 -2
  91. package/dist/react-diff-viewer.js +1 -1
  92. package/dist/react-dropdown-menu.js +61 -8
  93. package/dist/react-dropdown-menu.js.map +3 -3
  94. package/dist/react-editor-status-bar.js +1 -1
  95. package/dist/react-editor-tabs.js +1 -1
  96. package/dist/react-emoji-picker.js +2 -2
  97. package/dist/react-empty-state.js +1 -1
  98. package/dist/react-feedback-dialog.js +2 -2
  99. package/dist/react-file-tree.js +1 -1
  100. package/dist/react-file-upload.js +1 -1
  101. package/dist/react-floating-reactions.js +1 -1
  102. package/dist/react-flow-editor.js +2 -2
  103. package/dist/react-footer.js +1 -1
  104. package/dist/react-funnel-chart.js +1 -1
  105. package/dist/react-graph-view.js +2 -2
  106. package/dist/react-infinite-canvas.js +2 -2
  107. package/dist/react-inline-editor.js +1 -1
  108. package/dist/react-input-group.js +1 -1
  109. package/dist/react-input.js +2 -2
  110. package/dist/react-install-prompt.js +1 -1
  111. package/dist/react-kanban-board.js +1 -1
  112. package/dist/react-keyboard-shortcut.js +2 -2
  113. package/dist/react-language-selector.js +1 -1
  114. package/dist/react-line-chart.js +49 -11
  115. package/dist/react-line-chart.js.map +2 -2
  116. package/dist/react-link-card.js +1 -1
  117. package/dist/react-live-captions.js +1 -1
  118. package/dist/react-live-cursors.js +1 -1
  119. package/dist/react-live-transcript.js +1 -1
  120. package/dist/react-location-selector.js +1 -1
  121. package/dist/react-logger.js +3 -3
  122. package/dist/react-markdown-renderer.js +2 -2
  123. package/dist/react-marquee-strip.js +1 -1
  124. package/dist/react-mascot.js +1 -1
  125. package/dist/react-mastery-bar.js +1 -1
  126. package/dist/react-mini-map.js +1 -1
  127. package/dist/react-mobile-nav.js +1 -1
  128. package/dist/react-native-select.js +52 -0
  129. package/dist/react-native-select.js.map +7 -0
  130. package/dist/react-navbar.js +1 -1
  131. package/dist/react-numbered-steps.js +1 -1
  132. package/dist/react-otp-input.js +1 -1
  133. package/dist/react-page-header.js +1 -1
  134. package/dist/react-pagination.js +1 -1
  135. package/dist/react-password-input.js +2 -2
  136. package/dist/react-payment.js +1 -1
  137. package/dist/react-popover.js +1 -1
  138. package/dist/react-pre-call-lobby.js +1 -1
  139. package/dist/react-presence-indicator.js +1 -1
  140. package/dist/react-pricing-card.js +1 -1
  141. package/dist/react-progress-display.js +1 -1
  142. package/dist/react-radial-gauge.js +1 -1
  143. package/dist/react-radio.js +1 -1
  144. package/dist/react-rating-scale.js +1 -1
  145. package/dist/react-reaction-bar.js +1 -1
  146. package/dist/react-resizable-layout.js +1 -1
  147. package/dist/react-search-bar.js +1 -1
  148. package/dist/react-section-head.js +1 -1
  149. package/dist/react-segmented-control.js +1 -1
  150. package/dist/react-select.js +1 -1
  151. package/dist/react-separator.js +1 -1
  152. package/dist/react-sheet.js +1 -1
  153. package/dist/react-sidebar.js +1 -1
  154. package/dist/react-skeleton.js +1 -1
  155. package/dist/react-skip-to-content.js +1 -1
  156. package/dist/react-slide-viewer.js +1 -1
  157. package/dist/react-slider.js +1 -1
  158. package/dist/react-slot-picker.js +1 -1
  159. package/dist/react-social-auth-button.js +3 -3
  160. package/dist/react-sortable-list.js +1 -1
  161. package/dist/react-stat-grid.js +91 -22
  162. package/dist/react-stat-grid.js.map +2 -2
  163. package/dist/react-status-indicator.js +1 -1
  164. package/dist/react-steps.js +1 -1
  165. package/dist/react-sticky-note.js +1 -1
  166. package/dist/react-switch.js +1 -1
  167. package/dist/react-table-of-contents.js +1 -1
  168. package/dist/react-table.js +148 -0
  169. package/dist/react-table.js.map +7 -0
  170. package/dist/react-tabs.js +35 -6
  171. package/dist/react-tabs.js.map +2 -2
  172. package/dist/react-terminal.js +1 -1
  173. package/dist/react-test-results.js +1 -1
  174. package/dist/react-textarea.js +1 -1
  175. package/dist/react-thread-view.js +2 -2
  176. package/dist/react-timeline.js +1 -1
  177. package/dist/react-toast.js +1 -1
  178. package/dist/react-tooltip.js +1 -1
  179. package/dist/react-version-selector.js +1 -1
  180. package/dist/react-video-grid.js +2 -2
  181. package/dist/react-video-player.js +1 -1
  182. package/dist/react-video-tile.js +2 -2
  183. package/dist/react-voice-pill.js +1 -1
  184. package/dist/react-waveform.js +1 -1
  185. package/dist/react-wizard.js +1 -1
  186. package/dist/shared.js +53 -0
  187. package/dist/shared.js.map +7 -0
  188. package/package.json +3 -1
  189. package/dist/chunk-2Q6HHFAN.js +0 -164
  190. package/dist/chunk-SDZ3LROZ.js +0 -7
  191. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  192. /package/dist/{chunk-V24GDHUX.js.map → chunk-4ACSHPCM.js.map} +0 -0
  193. /package/dist/{chunk-SDAJVXD4.js.map → chunk-5P56PN3J.js.map} +0 -0
  194. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
  195. /package/dist/{chunk-QPCKJ2YR.js.map → chunk-GG6MZDGV.js.map} +0 -0
  196. /package/dist/{chunk-QDMLIDYN.js.map → chunk-GU5MI7FX.js.map} +0 -0
  197. /package/dist/{chunk-RSWOLRIC.js.map → chunk-KIZD73DK.js.map} +0 -0
  198. /package/dist/{chunk-XMFNBOPO.js.map → chunk-PY2TIFCT.js.map} +0 -0
  199. /package/dist/{chunk-3I3DYDHR.js.map → chunk-WNLYPQOS.js.map} +0 -0
  200. /package/dist/{chunk-63N4PZUJ.js.map → chunk-X6HEKRWE.js.map} +0 -0
  201. /package/dist/{chunk-WYKPPK3W.js.map → chunk-XAJDSVZR.js.map} +0 -0
package/dist/index.cjs CHANGED
@@ -767,7 +767,7 @@ var init_dist = __esm({
767
767
  }
768
768
  });
769
769
 
770
- // ../logger/dist/chunk-57LG5ZUS.js
770
+ // ../logger/dist/chunk-OEINJBSK.js
771
771
  async function createFaroSink(opts) {
772
772
  const transport = opts.transport ?? await loadFaroTransport(opts);
773
773
  if (!transport) return null;
@@ -788,10 +788,12 @@ async function loadFaroTransport(opts) {
788
788
  const sdkName = "@grafana/faro-web-sdk";
789
789
  const tracingName = "@grafana/faro-web-tracing";
790
790
  const sdk = await import(
791
+ /* webpackIgnore: true */
791
792
  /* @vite-ignore */
792
793
  sdkName
793
794
  );
794
795
  const tracing = await import(
796
+ /* webpackIgnore: true */
795
797
  /* @vite-ignore */
796
798
  tracingName
797
799
  );
@@ -833,8 +835,8 @@ function flatten(ctx) {
833
835
  return out;
834
836
  }
835
837
  var FARO_LEVEL;
836
- var init_chunk_57LG5ZUS = __esm({
837
- "../logger/dist/chunk-57LG5ZUS.js"() {
838
+ var init_chunk_OEINJBSK = __esm({
839
+ "../logger/dist/chunk-OEINJBSK.js"() {
838
840
  FARO_LEVEL = {
839
841
  debug: "debug",
840
842
  info: "info",
@@ -845,14 +847,14 @@ var init_chunk_57LG5ZUS = __esm({
845
847
  }
846
848
  });
847
849
 
848
- // ../logger/dist/faro-engine-47HGRAQH.js
849
- var faro_engine_47HGRAQH_exports = {};
850
- __export(faro_engine_47HGRAQH_exports, {
850
+ // ../logger/dist/faro-engine-VIUXJAPH.js
851
+ var faro_engine_VIUXJAPH_exports = {};
852
+ __export(faro_engine_VIUXJAPH_exports, {
851
853
  createFaroSink: () => createFaroSink
852
854
  });
853
- var init_faro_engine_47HGRAQH = __esm({
854
- "../logger/dist/faro-engine-47HGRAQH.js"() {
855
- init_chunk_57LG5ZUS();
855
+ var init_faro_engine_VIUXJAPH = __esm({
856
+ "../logger/dist/faro-engine-VIUXJAPH.js"() {
857
+ init_chunk_OEINJBSK();
856
858
  }
857
859
  });
858
860
 
@@ -2419,7 +2421,9 @@ var Button = React52__namespace.forwardRef(
2419
2421
  return React52__namespace.cloneElement(children, {
2420
2422
  ref: mergedRef,
2421
2423
  className: cn(classes, children.props.className, "relative"),
2422
- type: getButtonType({ type: props.type }),
2424
+ // `type` is only meaningful on a <button>; forcing type="button" onto
2425
+ // an <a> changes its semantics (it becomes a MIME-type hint).
2426
+ ...children.type === "button" || props.type ? { type: getButtonType({ type: props.type }) } : {},
2423
2427
  ...api.ariaProps,
2424
2428
  ...api.dataAttributes,
2425
2429
  ...props,
@@ -4307,26 +4311,49 @@ function useCommandContext() {
4307
4311
  }
4308
4312
  return ctx;
4309
4313
  }
4314
+ function itemValueOf(value, children) {
4315
+ if (value !== void 0) return value;
4316
+ if (typeof children === "string" || typeof children === "number") return String(children);
4317
+ return "";
4318
+ }
4319
+ function collectItems(node, into) {
4320
+ React52__namespace.Children.forEach(node, (child) => {
4321
+ if (!React52__namespace.isValidElement(child)) return;
4322
+ if (child.type === CommandItem) {
4323
+ const value = itemValueOf(child.props.value, child.props.children);
4324
+ into.push({ id: value, value, label: value, disabled: child.props.disabled });
4325
+ return;
4326
+ }
4327
+ collectItems(child.props.children, into);
4328
+ });
4329
+ return into;
4330
+ }
4331
+ var defaultFilter3 = (value, search) => value.toLowerCase().includes(search.toLowerCase());
4310
4332
  function Command({
4311
4333
  open,
4312
4334
  onOpenChange,
4313
- filter,
4335
+ filter = defaultFilter3,
4314
4336
  className,
4315
4337
  children
4316
4338
  }) {
4317
- const [items, setItems] = React52__namespace.useState([]);
4339
+ const [registered, setRegistered] = React52__namespace.useState(() => /* @__PURE__ */ new Map());
4318
4340
  const [search, setSearch] = React52__namespace.useState("");
4319
4341
  const [selectedIndex, setSelectedIndex] = React52__namespace.useState(0);
4320
- const apiRef = React52__namespace.useRef(null);
4321
- const api = React52__namespace.useMemo(() => {
4322
- const instance = createCommand({ open, onOpenChange, filter }, items);
4323
- if (search) {
4324
- instance.search(search);
4325
- }
4326
- apiRef.current = instance;
4327
- return instance;
4328
- }, [open, onOpenChange, filter, items, search]);
4329
- const filteredItems = api.state.filteredItems;
4342
+ const uid = React52__namespace.useId().replace(/:/g, "");
4343
+ const listId = `rfr-cmd-list-${uid}`;
4344
+ const inputId = `rfr-cmd-input-${uid}`;
4345
+ const api = React52__namespace.useMemo(() => createCommand({ open, onOpenChange, filter }), [open, onOpenChange, filter]);
4346
+ const items = React52__namespace.useMemo(() => {
4347
+ const all = collectItems(children, []);
4348
+ const known = new Set(all.map((i) => i.value));
4349
+ for (const [value, item] of registered) {
4350
+ if (!known.has(value)) all.push({ id: value, value, label: value, disabled: item.disabled });
4351
+ }
4352
+ return all;
4353
+ }, [children, registered]);
4354
+ const matches = React52__namespace.useCallback((value) => !search || filter(value, search), [filter, search]);
4355
+ const filteredItems = React52__namespace.useMemo(() => items.filter((i) => matches(i.value)), [items, matches]);
4356
+ const highlighted = filteredItems[selectedIndex];
4330
4357
  const handleSearch = React52__namespace.useCallback((query) => {
4331
4358
  setSearch(query);
4332
4359
  setSelectedIndex(0);
@@ -4334,57 +4361,59 @@ function Command({
4334
4361
  const handleSelect = React52__namespace.useCallback((index2) => {
4335
4362
  setSelectedIndex(index2);
4336
4363
  }, []);
4337
- const registerItem = React52__namespace.useCallback((item) => {
4338
- setItems((prev) => {
4339
- if (prev.some((i) => i.id === item.id)) return prev;
4340
- return [...prev, item];
4364
+ const registerItem = React52__namespace.useCallback((value, item) => {
4365
+ setRegistered((prev) => {
4366
+ const current = prev.get(value);
4367
+ if (current && current.domId === item.domId && current.disabled === item.disabled) return prev;
4368
+ const next = new Map(prev);
4369
+ next.set(value, item);
4370
+ return next;
4341
4371
  });
4342
4372
  }, []);
4343
- const unregisterItem = React52__namespace.useCallback((id) => {
4344
- setItems((prev) => prev.filter((i) => i.id !== id));
4373
+ const unregisterItem = React52__namespace.useCallback((value) => {
4374
+ setRegistered((prev) => {
4375
+ if (!prev.has(value)) return prev;
4376
+ const next = new Map(prev);
4377
+ next.delete(value);
4378
+ return next;
4379
+ });
4345
4380
  }, []);
4346
- const handleKeyDown = React52__namespace.useCallback(
4347
- (e) => {
4348
- const handler = createKeyboardHandler({
4349
- [Keys.ArrowDown]: (ev) => {
4350
- ev.preventDefault();
4351
- if (filteredItems.length > 0) {
4352
- setSelectedIndex((prev) => (prev + 1) % filteredItems.length);
4353
- }
4354
- },
4355
- [Keys.ArrowUp]: (ev) => {
4356
- ev.preventDefault();
4357
- if (filteredItems.length > 0) {
4358
- setSelectedIndex((prev) => (prev - 1 + filteredItems.length) % filteredItems.length);
4359
- }
4360
- },
4361
- [Keys.Enter]: (ev) => {
4362
- ev.preventDefault();
4363
- },
4364
- [Keys.Escape]: (ev) => {
4365
- ev.preventDefault();
4366
- onOpenChange?.(false);
4367
- }
4368
- });
4369
- handler(e.nativeEvent);
4370
- },
4371
- [filteredItems.length, onOpenChange]
4372
- );
4373
- const ctx = React52__namespace.useMemo(
4374
- () => ({
4375
- search,
4376
- onSearch: handleSearch,
4377
- selectedIndex,
4378
- onSelect: handleSelect,
4379
- items,
4380
- filteredItems,
4381
- registerItem,
4382
- unregisterItem,
4383
- listId: api.ids.list,
4384
- inputId: api.ids.input
4385
- }),
4386
- [search, handleSearch, selectedIndex, handleSelect, items, filteredItems, registerItem, unregisterItem, api.ids.list, api.ids.input]
4387
- );
4381
+ const handleKeyDown = (e) => {
4382
+ const count = filteredItems.length;
4383
+ const handler = createKeyboardHandler({
4384
+ [Keys.ArrowDown]: (ev) => {
4385
+ ev.preventDefault();
4386
+ if (count > 0) setSelectedIndex((prev) => (prev + 1) % count);
4387
+ },
4388
+ [Keys.ArrowUp]: (ev) => {
4389
+ ev.preventDefault();
4390
+ if (count > 0) setSelectedIndex((prev) => (prev - 1 + count) % count);
4391
+ },
4392
+ [Keys.Enter]: (ev) => {
4393
+ ev.preventDefault();
4394
+ if (highlighted && !highlighted.disabled) registered.get(highlighted.value)?.select();
4395
+ },
4396
+ [Keys.Escape]: (ev) => {
4397
+ ev.preventDefault();
4398
+ onOpenChange?.(false);
4399
+ }
4400
+ });
4401
+ handler(e.nativeEvent);
4402
+ };
4403
+ const ctx = {
4404
+ search,
4405
+ onSearch: handleSearch,
4406
+ selectedIndex,
4407
+ onSelect: handleSelect,
4408
+ items,
4409
+ filteredItems,
4410
+ matches,
4411
+ registerItem,
4412
+ unregisterItem,
4413
+ activeDescendant: highlighted ? registered.get(highlighted.value)?.domId : void 0,
4414
+ listId,
4415
+ inputId
4416
+ };
4388
4417
  return React52__namespace.createElement(
4389
4418
  CommandContext.Provider,
4390
4419
  { value: ctx },
@@ -4393,6 +4422,8 @@ function Command({
4393
4422
  {
4394
4423
  className: cn(commandVariants(), className),
4395
4424
  ...api.ariaProps,
4425
+ "aria-owns": listId,
4426
+ id: `rfr-cmd-${uid}`,
4396
4427
  onKeyDown: handleKeyDown
4397
4428
  },
4398
4429
  children
@@ -4401,7 +4432,7 @@ function Command({
4401
4432
  }
4402
4433
  var CommandInput = React52__namespace.forwardRef(
4403
4434
  function CommandInput2({ className, onChange, ...props }, ref) {
4404
- const { search, onSearch, inputId, listId } = useCommandContext();
4435
+ const { search, onSearch, inputId, listId, activeDescendant } = useCommandContext();
4405
4436
  const handleChange = (e) => {
4406
4437
  onSearch(e.target.value);
4407
4438
  onChange?.(e);
@@ -4413,6 +4444,7 @@ var CommandInput = React52__namespace.forwardRef(
4413
4444
  role: "searchbox",
4414
4445
  "aria-autocomplete": "list",
4415
4446
  "aria-controls": listId,
4447
+ "aria-activedescendant": activeDescendant,
4416
4448
  value: search,
4417
4449
  onChange: handleChange,
4418
4450
  className: cn(commandInputVariants(), className),
@@ -4474,21 +4506,38 @@ var CommandGroup = React52__namespace.forwardRef(
4474
4506
  }
4475
4507
  );
4476
4508
  var CommandItem = React52__namespace.forwardRef(
4477
- function CommandItem2({ className, value, disabled, onSelect: onItemSelect, children, ...props }, ref) {
4478
- const state = disabled ? "disabled" : "default";
4509
+ function CommandItem2({ className, value, disabled = false, onSelect: onItemSelect, onClick, onMouseMove, children, ...props }, ref) {
4510
+ const { matches, filteredItems, selectedIndex, onSelect, registerItem, unregisterItem } = useCommandContext();
4511
+ const itemValue = itemValueOf(value, children);
4512
+ const domId = `rfr-cmd-item-${React52__namespace.useId().replace(/:/g, "")}`;
4513
+ const onSelectRef = React52__namespace.useRef(onItemSelect);
4514
+ onSelectRef.current = onItemSelect;
4515
+ React52__namespace.useEffect(() => {
4516
+ registerItem(itemValue, { domId, disabled, select: () => onSelectRef.current?.() });
4517
+ }, [registerItem, itemValue, domId, disabled]);
4518
+ React52__namespace.useEffect(() => () => unregisterItem(itemValue), [unregisterItem, itemValue]);
4519
+ if (!matches(itemValue)) return null;
4520
+ const index2 = filteredItems.findIndex((i) => i.value === itemValue);
4521
+ const isSelected = index2 !== -1 && index2 === selectedIndex;
4522
+ const state = disabled ? "disabled" : isSelected ? "selected" : "default";
4479
4523
  return React52__namespace.createElement(
4480
4524
  "div",
4481
4525
  {
4482
4526
  ref,
4527
+ id: domId,
4483
4528
  role: "option",
4484
- "aria-selected": false,
4485
- "aria-disabled": disabled ?? false,
4486
- "data-value": value,
4529
+ "aria-selected": isSelected,
4530
+ "aria-disabled": disabled,
4531
+ "data-value": itemValue,
4532
+ "data-selected": isSelected ? "" : void 0,
4487
4533
  className: cn(commandItemVariants({ state }), className),
4488
- onClick: () => {
4489
- if (!disabled) {
4490
- onItemSelect?.();
4491
- }
4534
+ onClick: (e) => {
4535
+ onClick?.(e);
4536
+ if (!disabled && !e.defaultPrevented) onItemSelect?.();
4537
+ },
4538
+ onMouseMove: (e) => {
4539
+ onMouseMove?.(e);
4540
+ if (index2 !== -1 && index2 !== selectedIndex) onSelect(index2);
4492
4541
  },
4493
4542
  ...props
4494
4543
  },
@@ -10205,11 +10254,11 @@ function MessageBody({ message }) {
10205
10254
  message.status === "error" ? h2("div", { className: "mt-1 text-xs text-destructive", role: "alert" }, message.error ?? "Failed to send.") : null
10206
10255
  );
10207
10256
  }
10208
- function Reactions({ message, onReact, align }) {
10257
+ function Reactions({ message, onReact, align: align2 }) {
10209
10258
  if (!message.reactions || message.reactions.length === 0) return null;
10210
10259
  return h2(
10211
10260
  "div",
10212
- { className: cn("mt-1 flex flex-wrap gap-1", align === "end" && "justify-end") },
10261
+ { className: cn("mt-1 flex flex-wrap gap-1", align2 === "end" && "justify-end") },
10213
10262
  ...message.reactions.map(
10214
10263
  (r) => h2(
10215
10264
  "button",
@@ -10246,7 +10295,7 @@ function HoverActions({
10246
10295
  isOwn,
10247
10296
  onEdit,
10248
10297
  onToggleEmojis,
10249
- align
10298
+ align: align2
10250
10299
  }) {
10251
10300
  const { replyTo, deleteMessage } = conversation;
10252
10301
  return h2(
@@ -10254,7 +10303,7 @@ function HoverActions({
10254
10303
  {
10255
10304
  className: cn(
10256
10305
  "mt-1 flex items-center gap-3 text-xs text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100",
10257
- align === "end" && "justify-end"
10306
+ align2 === "end" && "justify-end"
10258
10307
  )
10259
10308
  },
10260
10309
  // Reply targets this specific message but groups under the originating root.
@@ -10264,10 +10313,10 @@ function HoverActions({
10264
10313
  isOwn ? h2("button", { type: "button", className: "hover:text-destructive", onClick: () => deleteMessage(message.id) }, "Delete") : null
10265
10314
  );
10266
10315
  }
10267
- function EmojiRow({ onPick, align }) {
10316
+ function EmojiRow({ onPick, align: align2 }) {
10268
10317
  return h2(
10269
10318
  "div",
10270
- { className: cn("mt-1 flex gap-1", align === "end" && "justify-end") },
10319
+ { className: cn("mt-1 flex gap-1", align2 === "end" && "justify-end") },
10271
10320
  ...QUICK_EMOJIS.map(
10272
10321
  (emoji) => h2("button", { key: emoji, type: "button", className: "rounded px-1 text-base hover:bg-accent", onClick: () => onPick(emoji) }, emoji)
10273
10322
  )
@@ -10316,25 +10365,25 @@ function MessageRow({
10316
10365
  const [editing, setEditing] = React52__namespace.useState(false);
10317
10366
  const isUser = currentUserId ? message.author.id === currentUserId : message.role === "user";
10318
10367
  const replyCount = getReplyCount(state.messages, message.id);
10319
- const align = isUser ? "end" : "start";
10368
+ const align2 = isUser ? "end" : "start";
10320
10369
  const inner = h2(
10321
10370
  React52__namespace.Fragment,
10322
10371
  null,
10323
10372
  quotedParent ? h2(QuotedParent, { parent: quotedParent, onClick: () => openThread(rootIdOf(state.messages, quotedParent.id)) }) : null,
10324
10373
  editing ? h2(EditField, { message, conversation, onDone: () => setEditing(false) }) : isUser ? h2("div", { className: "inline-block rounded-2xl rounded-br-sm bg-primary/10 px-3 py-2 text-left" }, h2(MessageBody, { message })) : h2(MessageBody, { message }),
10325
- h2(Reactions, { message, onReact: (e) => react(message.id, e), align }),
10374
+ h2(Reactions, { message, onReact: (e) => react(message.id, e), align: align2 }),
10326
10375
  showThreadAffordance && replyCount > 0 ? h2(
10327
10376
  "button",
10328
- { type: "button", className: cn("mt-1 text-xs font-medium text-primary hover:underline", align === "end" && "self-end"), onClick: () => openThread(message.id) },
10377
+ { type: "button", className: cn("mt-1 text-xs font-medium text-primary hover:underline", align2 === "end" && "self-end"), onClick: () => openThread(message.id) },
10329
10378
  `\u{1F4AC} ${replyCount} ${replyCount === 1 ? "reply" : "replies"}`
10330
10379
  ) : null,
10331
- h2(HoverActions, { message, conversation, isOwn: isUser, onEdit: () => setEditing(true), onToggleEmojis: () => setShowEmojis((v2) => !v2), align }),
10380
+ h2(HoverActions, { message, conversation, isOwn: isUser, onEdit: () => setEditing(true), onToggleEmojis: () => setShowEmojis((v2) => !v2), align: align2 }),
10332
10381
  showEmojis ? h2(EmojiRow, {
10333
10382
  onPick: (e) => {
10334
10383
  react(message.id, e);
10335
10384
  setShowEmojis(false);
10336
10385
  },
10337
- align
10386
+ align: align2
10338
10387
  }) : null
10339
10388
  );
10340
10389
  if (!isUser) {
@@ -10927,6 +10976,15 @@ var CookieConsent = React52__namespace.forwardRef(
10927
10976
  );
10928
10977
 
10929
10978
  // ../data-table/dist/index.js
10979
+ function resolveColumnAlign(col) {
10980
+ return col.align ?? (col.numeric ? "end" : "start");
10981
+ }
10982
+ function getColumnValue(col, row) {
10983
+ return col.accessor ? col.accessor(row) : void 0;
10984
+ }
10985
+ function resolveRowKey(row, index2, getRowKey) {
10986
+ return getRowKey ? getRowKey(row, index2) : index2;
10987
+ }
10930
10988
  function createDataTable(props) {
10931
10989
  const {
10932
10990
  columns,
@@ -10944,10 +11002,10 @@ function createDataTable(props) {
10944
11002
  for (const [columnId, filterValue] of Object.entries(filters)) {
10945
11003
  if (!filterValue) continue;
10946
11004
  const col = columns.find((c) => c.id === columnId);
10947
- if (!col) continue;
11005
+ if (!col?.accessor) continue;
10948
11006
  const lowerFilter = filterValue.toLowerCase();
10949
11007
  result = result.filter((row) => {
10950
- const cellValue = col.accessor(row);
11008
+ const cellValue = getColumnValue(col, row);
10951
11009
  return String(cellValue ?? "").toLowerCase().includes(lowerFilter);
10952
11010
  });
10953
11011
  }
@@ -10957,10 +11015,10 @@ function createDataTable(props) {
10957
11015
  const filtered = getFilteredData();
10958
11016
  if (!sortBy) return filtered;
10959
11017
  const col = columns.find((c) => c.id === sortBy);
10960
- if (!col) return filtered;
11018
+ if (!col?.accessor) return filtered;
10961
11019
  return [...filtered].sort((a, b) => {
10962
- const aVal = col.accessor(a);
10963
- const bVal = col.accessor(b);
11020
+ const aVal = getColumnValue(col, a);
11021
+ const bVal = getColumnValue(col, b);
10964
11022
  const aStr = String(aVal ?? "");
10965
11023
  const bStr = String(bVal ?? "");
10966
11024
  const cmp = aStr.localeCompare(bStr, void 0, { numeric: true });
@@ -11080,8 +11138,18 @@ var rowVariants = cva({
11080
11138
  selected: "false"
11081
11139
  }
11082
11140
  });
11083
-
11084
- // ../react-data-table/dist/index.js
11141
+ var dataTableAlignClass = {
11142
+ start: "text-start",
11143
+ center: "text-center",
11144
+ end: "text-end"
11145
+ };
11146
+ var dataTableNumericClass = "tabular-nums whitespace-nowrap";
11147
+ var dataTableSortButtonClass = "inline-flex items-center gap-1 rounded-sm font-inherit text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
11148
+ var dataTableActionRowClass = "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring";
11149
+ var ACTIVATION_KEYS = /* @__PURE__ */ new Set(["Enter", " "]);
11150
+ function filterLabel(header, id) {
11151
+ return typeof header === "string" || typeof header === "number" ? String(header) : id;
11152
+ }
11085
11153
  function DataTable({
11086
11154
  columns,
11087
11155
  data,
@@ -11090,13 +11158,21 @@ function DataTable({
11090
11158
  onSort,
11091
11159
  filters: controlledFilters,
11092
11160
  className,
11093
- emptyMessage = "No data available"
11161
+ emptyMessage = "No data available",
11162
+ getRowKey,
11163
+ getRowProps,
11164
+ onRowClick,
11165
+ caption,
11166
+ wrapperClassName,
11167
+ ...tableProps
11094
11168
  }) {
11095
11169
  const [sortBy, setSortBy] = React52__namespace.useState(controlledSortBy ?? null);
11096
11170
  const [sortDir, setSortDir] = React52__namespace.useState(controlledSortDir);
11097
11171
  const [filters, setFilters] = React52__namespace.useState(controlledFilters ?? {});
11098
11172
  const api = React52__namespace.useMemo(
11099
11173
  () => createDataTable({
11174
+ // The core only reads id/accessor/sortable/filterable; header and cell
11175
+ // are rendered here.
11100
11176
  columns,
11101
11177
  data,
11102
11178
  sortBy: sortBy ?? void 0,
@@ -11106,119 +11182,100 @@ function DataTable({
11106
11182
  }),
11107
11183
  [columns, data, sortBy, sortDir, onSort, filters]
11108
11184
  );
11109
- const handleSort = React52__namespace.useCallback(
11110
- (columnId) => {
11111
- const col = columns.find((c) => c.id === columnId);
11112
- if (!col?.sortable) return;
11113
- let newDir = "asc";
11114
- if (sortBy === columnId) {
11115
- newDir = sortDir === "asc" ? "desc" : "asc";
11116
- }
11117
- setSortBy(columnId);
11118
- setSortDir(newDir);
11119
- onSort?.(columnId, newDir);
11120
- },
11121
- [columns, sortBy, sortDir, onSort]
11122
- );
11123
- const handleFilter = React52__namespace.useCallback(
11124
- (columnId, value) => {
11125
- setFilters((prev) => ({ ...prev, [columnId]: value }));
11126
- },
11127
- []
11128
- );
11129
- const sortedData = api.state.sortedData;
11185
+ const handleSort = (columnId) => {
11186
+ const col = columns.find((c) => c.id === columnId);
11187
+ if (!col?.sortable) return;
11188
+ const newDir = sortBy === columnId && sortDir === "asc" ? "desc" : "asc";
11189
+ setSortBy(columnId);
11190
+ setSortDir(newDir);
11191
+ onSort?.(columnId, newDir);
11192
+ };
11193
+ const handleFilter = (columnId, value) => {
11194
+ setFilters((prev) => ({ ...prev, [columnId]: value }));
11195
+ };
11196
+ const rows = api.state.sortedData;
11130
11197
  const hasFilterable = columns.some((c) => c.filterable);
11131
- return React52__namespace.createElement(
11132
- "div",
11133
- { className: "relative w-full overflow-auto" },
11134
- React52__namespace.createElement(
11135
- "table",
11136
- {
11137
- className: cn(tableVariants(), className),
11138
- role: "table"
11198
+ const rowElementProps = (row, index2) => {
11199
+ const extra = getRowProps?.(row, index2) ?? {};
11200
+ if (!onRowClick) return extra;
11201
+ return {
11202
+ tabIndex: 0,
11203
+ ...extra,
11204
+ className: cn(dataTableActionRowClass, extra.className),
11205
+ onClick: (e) => {
11206
+ extra.onClick?.(e);
11207
+ if (!e.defaultPrevented) onRowClick(row, index2);
11139
11208
  },
11140
- // thead
11141
- React52__namespace.createElement(
11142
- "thead",
11143
- null,
11144
- // Header row
11145
- React52__namespace.createElement(
11146
- "tr",
11147
- { role: "row" },
11148
- ...columns.map((col) => {
11149
- const headerProps = api.getHeaderProps(col);
11150
- return React52__namespace.createElement(
11151
- "th",
11152
- {
11153
- key: col.id,
11154
- ...headerProps,
11155
- className: headerVariants({ sortable: col.sortable ? "true" : "false" }),
11156
- onClick: col.sortable ? () => handleSort(col.id) : void 0
11157
- },
11209
+ onKeyDown: (e) => {
11210
+ extra.onKeyDown?.(e);
11211
+ if (e.defaultPrevented || e.target !== e.currentTarget || !ACTIVATION_KEYS.has(e.key)) return;
11212
+ e.preventDefault();
11213
+ onRowClick(row, index2);
11214
+ }
11215
+ };
11216
+ };
11217
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative w-full overflow-auto", wrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: cn(tableVariants(), className), role: "table", ...tableProps, children: [
11218
+ caption != null && /* @__PURE__ */ jsxRuntime.jsx("caption", { className: "mt-2 caption-bottom text-xs text-muted-foreground", children: caption }),
11219
+ /* @__PURE__ */ jsxRuntime.jsxs("thead", { children: [
11220
+ /* @__PURE__ */ jsxRuntime.jsx("tr", { role: "row", children: columns.map((col) => {
11221
+ const headerProps = api.getHeaderProps(col);
11222
+ const align2 = resolveColumnAlign(col);
11223
+ const indicator = col.sortable && sortBy === col.id ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: sortDir === "asc" ? "\u2191" : "\u2193" }) : null;
11224
+ return /* @__PURE__ */ jsxRuntime.jsx(
11225
+ "th",
11226
+ {
11227
+ ...headerProps,
11228
+ className: cn(
11229
+ headerVariants({ sortable: col.sortable ? "true" : "false" }),
11230
+ dataTableAlignClass[align2],
11231
+ col.headerClassName
11232
+ ),
11233
+ children: col.sortable ? /* @__PURE__ */ jsxRuntime.jsxs("button", { type: "button", className: dataTableSortButtonClass, onClick: () => handleSort(col.id), children: [
11158
11234
  col.header,
11159
- col.sortable && sortBy === col.id ? React52__namespace.createElement("span", { "aria-hidden": true }, sortDir === "asc" ? " \u2191" : " \u2193") : null
11160
- );
11161
- })
11162
- ),
11163
- // Filter row
11164
- hasFilterable ? React52__namespace.createElement(
11165
- "tr",
11166
- { role: "row", "data-filter-row": "true" },
11167
- ...columns.map(
11168
- (col) => React52__namespace.createElement(
11169
- "th",
11170
- { key: `filter-${col.id}` },
11171
- col.filterable ? React52__namespace.createElement("input", {
11172
- type: "text",
11173
- "aria-label": `Filter ${col.header}`,
11174
- value: filters[col.id] ?? "",
11175
- onChange: (e) => handleFilter(col.id, e.target.value),
11176
- placeholder: `Filter...`
11177
- }) : null
11178
- )
11179
- )
11180
- ) : null
11181
- ),
11182
- // tbody
11183
- React52__namespace.createElement(
11184
- "tbody",
11185
- null,
11186
- sortedData.length === 0 ? React52__namespace.createElement(
11187
- "tr",
11188
- { role: "row" },
11189
- React52__namespace.createElement(
11235
+ indicator
11236
+ ] }) : col.header
11237
+ },
11238
+ col.id
11239
+ );
11240
+ }) }),
11241
+ hasFilterable && /* @__PURE__ */ jsxRuntime.jsx("tr", { role: "row", "data-filter-row": "true", children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx("th", { children: col.filterable ? /* @__PURE__ */ jsxRuntime.jsx(
11242
+ "input",
11243
+ {
11244
+ type: "text",
11245
+ "aria-label": `Filter ${filterLabel(col.header, col.id)}`,
11246
+ value: filters[col.id] ?? "",
11247
+ onChange: (e) => handleFilter(col.id, e.target.value),
11248
+ placeholder: "Filter..."
11249
+ }
11250
+ ) : null }, `filter-${col.id}`)) })
11251
+ ] }),
11252
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("tr", { role: "row", children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: columns.length, className: "text-center p-4 text-muted-foreground", role: "cell", children: emptyMessage }) }) : rows.map((row, rowIndex) => {
11253
+ const rowProps = rowElementProps(row, rowIndex);
11254
+ return /* @__PURE__ */ jsxRuntime.jsx(
11255
+ "tr",
11256
+ {
11257
+ ...api.getRowProps(row, rowIndex),
11258
+ ...rowProps,
11259
+ className: cn(rowVariants(), rowProps.className),
11260
+ children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
11190
11261
  "td",
11191
11262
  {
11192
- colSpan: columns.length,
11193
- className: "text-center p-4 text-muted-foreground",
11194
- role: "cell"
11195
- },
11196
- emptyMessage
11197
- )
11198
- ) : sortedData.map(
11199
- (row, rowIndex) => React52__namespace.createElement(
11200
- "tr",
11201
- {
11202
- key: rowIndex,
11203
- ...api.getRowProps(row, rowIndex),
11204
- className: rowVariants()
11263
+ ...api.getCellProps(col, row),
11264
+ className: cn(
11265
+ cellVariants(),
11266
+ dataTableAlignClass[resolveColumnAlign(col)],
11267
+ col.numeric && dataTableNumericClass,
11268
+ col.className
11269
+ ),
11270
+ children: col.cell ? col.cell(row, rowIndex) : String(getColumnValue(col, row) ?? "")
11205
11271
  },
11206
- ...columns.map(
11207
- (col) => React52__namespace.createElement(
11208
- "td",
11209
- {
11210
- key: col.id,
11211
- ...api.getCellProps(col, row),
11212
- className: cellVariants()
11213
- },
11214
- String(col.accessor(row) ?? "")
11215
- )
11216
- )
11217
- )
11218
- )
11219
- )
11220
- )
11221
- );
11272
+ col.id
11273
+ ))
11274
+ },
11275
+ resolveRowKey(row, rowIndex, getRowKey)
11276
+ );
11277
+ }) })
11278
+ ] }) });
11222
11279
  }
11223
11280
 
11224
11281
  // ../device-frame/dist/index.js
@@ -11462,6 +11519,8 @@ function Dialog({
11462
11519
  apiRef.current = createDialog({ open, modal });
11463
11520
  }
11464
11521
  const api = apiRef.current;
11522
+ const [hasTitle, setHasTitle] = React52__namespace.useState(false);
11523
+ const [hasDescription, setHasDescription] = React52__namespace.useState(false);
11465
11524
  const ctx = React52__namespace.useMemo(
11466
11525
  () => ({
11467
11526
  open,
@@ -11469,9 +11528,13 @@ function Dialog({
11469
11528
  modal,
11470
11529
  contentId: api.ids.content,
11471
11530
  titleId: api.ids.title,
11472
- descriptionId: api.ids.description
11531
+ descriptionId: api.ids.description,
11532
+ hasTitle,
11533
+ hasDescription,
11534
+ setHasTitle,
11535
+ setHasDescription
11473
11536
  }),
11474
- [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description]
11537
+ [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description, hasTitle, hasDescription]
11475
11538
  );
11476
11539
  return React52__namespace.createElement(DialogContext.Provider, { value: ctx }, children);
11477
11540
  }
@@ -11516,9 +11579,17 @@ var DialogOverlay = React52__namespace.forwardRef(
11516
11579
  });
11517
11580
  }
11518
11581
  );
11582
+ function containsElement(node, type) {
11583
+ let found = false;
11584
+ React52__namespace.Children.forEach(node, (child) => {
11585
+ if (found || !React52__namespace.isValidElement(child)) return;
11586
+ found = child.type === type || containsElement(child.props.children, type);
11587
+ });
11588
+ return found;
11589
+ }
11519
11590
  var DialogContent = React52__namespace.forwardRef(
11520
11591
  function DialogContent2({ className, children, onKeyDown, ...props }, ref) {
11521
- const { open, onOpenChange, modal, contentId, titleId, descriptionId } = useDialogContext();
11592
+ const { open, onOpenChange, modal, contentId, titleId, descriptionId, hasTitle, hasDescription } = useDialogContext();
11522
11593
  React52__namespace.useMemo(
11523
11594
  () => createDialog({ open, modal }),
11524
11595
  [open, modal]
@@ -11540,8 +11611,10 @@ var DialogContent = React52__namespace.forwardRef(
11540
11611
  ref,
11541
11612
  role: "dialog",
11542
11613
  "aria-modal": modal,
11543
- "aria-labelledby": titleId,
11544
- "aria-describedby": descriptionId,
11614
+ // Reference only parts that exist: an id pointing at nothing leaves the
11615
+ // dialog unnamed while looking labelled.
11616
+ "aria-labelledby": hasTitle || containsElement(children, DialogTitle) ? titleId : void 0,
11617
+ "aria-describedby": hasDescription || containsElement(children, DialogDescription) ? descriptionId : void 0,
11545
11618
  id: contentId,
11546
11619
  className: cn(dialogContentVariants(), className),
11547
11620
  onKeyDown: handleKeyDown,
@@ -11579,7 +11652,11 @@ var DialogFooter = React52__namespace.forwardRef(
11579
11652
  );
11580
11653
  var DialogTitle = React52__namespace.forwardRef(
11581
11654
  function DialogTitle2({ className, ...props }, ref) {
11582
- const { titleId } = useDialogContext();
11655
+ const { titleId, setHasTitle } = useDialogContext();
11656
+ React52__namespace.useEffect(() => {
11657
+ setHasTitle(true);
11658
+ return () => setHasTitle(false);
11659
+ }, [setHasTitle]);
11583
11660
  return React52__namespace.createElement("h2", {
11584
11661
  ref,
11585
11662
  id: titleId,
@@ -11589,7 +11666,11 @@ var DialogTitle = React52__namespace.forwardRef(
11589
11666
  }
11590
11667
  );
11591
11668
  var DialogDescription = React52__namespace.forwardRef(function DialogDescription2({ className, ...props }, ref) {
11592
- const { descriptionId } = useDialogContext();
11669
+ const { descriptionId, setHasDescription } = useDialogContext();
11670
+ React52__namespace.useEffect(() => {
11671
+ setHasDescription(true);
11672
+ return () => setHasDescription(false);
11673
+ }, [setHasDescription]);
11593
11674
  return React52__namespace.createElement("p", {
11594
11675
  ref,
11595
11676
  id: descriptionId,
@@ -11743,11 +11824,13 @@ function DropdownMenu({
11743
11824
  apiRef.current = createDropdownMenu({ open });
11744
11825
  }
11745
11826
  const api = apiRef.current;
11827
+ const triggerRef = React52__namespace.useRef(null);
11746
11828
  const ctx = React52__namespace.useMemo(
11747
11829
  () => ({
11748
11830
  open,
11749
11831
  onOpenChange: handleOpenChange,
11750
- contentId: api.ids.content
11832
+ contentId: api.ids.content,
11833
+ triggerRef
11751
11834
  }),
11752
11835
  [open, handleOpenChange, api.ids.content]
11753
11836
  );
@@ -11755,7 +11838,12 @@ function DropdownMenu({
11755
11838
  }
11756
11839
  var DropdownMenuTrigger = React52__namespace.forwardRef(
11757
11840
  function DropdownMenuTrigger2({ asChild = false, onClick, children, ...props }, ref) {
11758
- const { open, onOpenChange, contentId } = useDropdownMenuContext();
11841
+ const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext();
11842
+ const setRefs = (node) => {
11843
+ triggerRef.current = node;
11844
+ if (typeof ref === "function") ref(node);
11845
+ else if (ref) ref.current = node;
11846
+ };
11759
11847
  const handleClick = (e) => {
11760
11848
  onOpenChange(!open);
11761
11849
  onClick?.(e);
@@ -11786,20 +11874,63 @@ var DropdownMenuTrigger = React52__namespace.forwardRef(
11786
11874
  if (!e.defaultPrevented) handleClick(e);
11787
11875
  },
11788
11876
  ref: (node) => {
11789
- if (typeof ref === "function") ref(node);
11790
- else if (ref) ref.current = node;
11877
+ setRefs(node);
11791
11878
  if (typeof childRef === "function") childRef(node);
11792
11879
  else if (childRef) childRef.current = node;
11793
11880
  }
11794
11881
  };
11795
11882
  return React52__namespace.cloneElement(child, mergedProps);
11796
11883
  }
11797
- return React52__namespace.createElement("button", { ref, ...triggerProps }, children);
11884
+ return React52__namespace.createElement("button", { ref: setRefs, ...triggerProps }, children);
11798
11885
  }
11799
11886
  );
11887
+ var DEFAULT_SIDE_OFFSET = 4;
11888
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? React52__namespace.useLayoutEffect : React52__namespace.useEffect;
11889
+ function computeMenuPosition(trigger, contentWidth, align2, sideOffset) {
11890
+ const left = align2 === "end" ? trigger.right - contentWidth : align2 === "center" ? trigger.left + trigger.width / 2 - contentWidth / 2 : trigger.left;
11891
+ return { position: "fixed", top: trigger.bottom + sideOffset, left: Math.max(0, left), minWidth: trigger.width };
11892
+ }
11800
11893
  var DropdownMenuContent = React52__namespace.forwardRef(
11801
- function DropdownMenuContent2({ className, children, onKeyDown, ...props }, ref) {
11802
- const { open, onOpenChange, contentId } = useDropdownMenuContext();
11894
+ function DropdownMenuContent2({ className, children, onKeyDown, align: align2 = "start", sideOffset = DEFAULT_SIDE_OFFSET, style, ...props }, forwardedRef) {
11895
+ const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext();
11896
+ const contentRef = React52__namespace.useRef(null);
11897
+ const ref = React52__namespace.useCallback(
11898
+ (node) => {
11899
+ contentRef.current = node;
11900
+ if (typeof forwardedRef === "function") forwardedRef(node);
11901
+ else if (forwardedRef) forwardedRef.current = node;
11902
+ },
11903
+ [forwardedRef]
11904
+ );
11905
+ const [position, setPosition] = React52__namespace.useState(null);
11906
+ useIsomorphicLayoutEffect(() => {
11907
+ if (!open) return;
11908
+ const update = () => {
11909
+ const trigger = triggerRef.current;
11910
+ const content2 = contentRef.current;
11911
+ if (!trigger) return;
11912
+ setPosition(
11913
+ computeMenuPosition(trigger.getBoundingClientRect(), content2?.offsetWidth ?? 0, align2, sideOffset)
11914
+ );
11915
+ };
11916
+ update();
11917
+ window.addEventListener("resize", update);
11918
+ window.addEventListener("scroll", update, true);
11919
+ return () => {
11920
+ window.removeEventListener("resize", update);
11921
+ window.removeEventListener("scroll", update, true);
11922
+ };
11923
+ }, [open, align2, sideOffset, triggerRef]);
11924
+ React52__namespace.useEffect(() => {
11925
+ if (!open) return;
11926
+ const onPointerDown = (event) => {
11927
+ const target = event.target;
11928
+ if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;
11929
+ onOpenChange(false);
11930
+ };
11931
+ document.addEventListener("pointerdown", onPointerDown);
11932
+ return () => document.removeEventListener("pointerdown", onPointerDown);
11933
+ }, [open, onOpenChange, triggerRef]);
11803
11934
  const handleKeyDown = (e) => {
11804
11935
  const handler = createKeyboardHandler({
11805
11936
  Escape: (ev) => {
@@ -11819,6 +11950,8 @@ var DropdownMenuContent = React52__namespace.forwardRef(
11819
11950
  id: contentId,
11820
11951
  "data-state": open ? "open" : "closed",
11821
11952
  className: cn(menuContentVariants(), className),
11953
+ style: position ? { ...position, ...style } : style,
11954
+ "data-align": align2,
11822
11955
  onKeyDown: handleKeyDown,
11823
11956
  tabIndex: -1,
11824
11957
  ...props
@@ -14652,14 +14785,31 @@ var Tabs = React52__namespace.forwardRef(
14652
14785
  apiRef.current = createTabs({ value, orientation });
14653
14786
  }
14654
14787
  const api = apiRef.current;
14788
+ const [panels, setPanels] = React52__namespace.useState(() => /* @__PURE__ */ new Set());
14789
+ const registerPanel = React52__namespace.useCallback((panelValue) => {
14790
+ setPanels((prev) => prev.has(panelValue) ? prev : new Set(prev).add(panelValue));
14791
+ return () => setPanels((prev) => {
14792
+ if (!prev.has(panelValue)) return prev;
14793
+ const next = new Set(prev);
14794
+ next.delete(panelValue);
14795
+ return next;
14796
+ });
14797
+ }, []);
14798
+ const allPanels = React52__namespace.useMemo(() => {
14799
+ const found = new Set(panels);
14800
+ collectPanelValues(children, found);
14801
+ return found;
14802
+ }, [children, panels]);
14655
14803
  const ctx = React52__namespace.useMemo(
14656
14804
  () => ({
14657
14805
  value,
14658
14806
  onValueChange: handleValueChange,
14659
14807
  orientation,
14660
- idPrefix: api.idPrefix
14808
+ idPrefix: api.idPrefix,
14809
+ panels: allPanels,
14810
+ registerPanel
14661
14811
  }),
14662
- [value, handleValueChange, orientation, api.idPrefix]
14812
+ [value, handleValueChange, orientation, api.idPrefix, allPanels, registerPanel]
14663
14813
  );
14664
14814
  return React52__namespace.createElement(
14665
14815
  "div",
@@ -14668,6 +14818,16 @@ var Tabs = React52__namespace.forwardRef(
14668
14818
  );
14669
14819
  }
14670
14820
  );
14821
+ function collectPanelValues(node, into) {
14822
+ React52__namespace.Children.forEach(node, (child) => {
14823
+ if (!React52__namespace.isValidElement(child)) return;
14824
+ if (child.type === TabsContent && typeof child.props.value === "string") {
14825
+ into.add(child.props.value);
14826
+ return;
14827
+ }
14828
+ collectPanelValues(child.props.children, into);
14829
+ });
14830
+ }
14671
14831
  var TabsList = React52__namespace.forwardRef(
14672
14832
  function TabsList2({ className, onKeyDown, ...props }, forwardedRef) {
14673
14833
  const { orientation } = useTabsContext();
@@ -14713,7 +14873,7 @@ function enabledTabs(list) {
14713
14873
  }
14714
14874
  var TabsTrigger = React52__namespace.forwardRef(
14715
14875
  function TabsTrigger2({ value, className, onClick, onKeyDown, children, ...props }, ref) {
14716
- const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext();
14876
+ const { value: activeValue, onValueChange, idPrefix, panels } = useTabsContext();
14717
14877
  const isSelected = activeValue === value;
14718
14878
  const tabId = `${idPrefix}-tab-${value}`;
14719
14879
  const panelId = `${idPrefix}-panel-${value}`;
@@ -14731,7 +14891,8 @@ var TabsTrigger = React52__namespace.forwardRef(
14731
14891
  type: "button",
14732
14892
  role: "tab",
14733
14893
  "aria-selected": isSelected,
14734
- "aria-controls": panelId,
14894
+ // Only the selected panel is rendered; never reference a missing element.
14895
+ "aria-controls": isSelected && panels.has(value) ? panelId : void 0,
14735
14896
  tabIndex: isSelected ? 0 : -1,
14736
14897
  id: tabId,
14737
14898
  "data-state": isSelected ? "active" : "inactive",
@@ -14746,7 +14907,8 @@ var TabsTrigger = React52__namespace.forwardRef(
14746
14907
  );
14747
14908
  var TabsContent = React52__namespace.forwardRef(
14748
14909
  function TabsContent2({ value, className, children, ...props }, ref) {
14749
- const { value: activeValue, idPrefix } = useTabsContext();
14910
+ const { value: activeValue, idPrefix, registerPanel } = useTabsContext();
14911
+ React52__namespace.useEffect(() => registerPanel(value), [registerPanel, value]);
14750
14912
  const isSelected = activeValue === value;
14751
14913
  const tabId = `${idPrefix}-tab-${value}`;
14752
14914
  const panelId = `${idPrefix}-panel-${value}`;
@@ -18568,10 +18730,9 @@ function getInitials(name) {
18568
18730
  }
18569
18731
  function createAvatar(props = {}) {
18570
18732
  const { src, alt = "", fallback = "", size = "md" } = props;
18571
- const ariaProps = {
18572
- role: "img"
18573
- };
18733
+ const ariaProps = {};
18574
18734
  if (alt) {
18735
+ ariaProps.role = "img";
18575
18736
  ariaProps["aria-label"] = alt;
18576
18737
  }
18577
18738
  const fallbackText = fallback ? getInitials(fallback) : alt ? getInitials(alt) : "";
@@ -18601,8 +18762,12 @@ var avatarTokens = {
18601
18762
  }
18602
18763
  };
18603
18764
  var avatarVariants = cva({
18604
- base: "relative flex shrink-0 overflow-hidden rounded-full",
18765
+ base: "relative flex shrink-0 overflow-hidden",
18605
18766
  variants: {
18767
+ shape: {
18768
+ circle: "rounded-full",
18769
+ square: "rounded-md"
18770
+ },
18606
18771
  size: {
18607
18772
  xs: "h-6 w-6",
18608
18773
  sm: "h-8 w-8",
@@ -18612,6 +18777,7 @@ var avatarVariants = cva({
18612
18777
  }
18613
18778
  },
18614
18779
  defaultVariants: {
18780
+ shape: "circle",
18615
18781
  size: "md"
18616
18782
  }
18617
18783
  });
@@ -18619,7 +18785,7 @@ var avatarImageVariants = cva({
18619
18785
  base: "aspect-square h-full w-full object-cover"
18620
18786
  });
18621
18787
  var avatarFallbackVariants = cva({
18622
- base: "flex h-full w-full items-center justify-center rounded-full bg-muted text-muted-foreground",
18788
+ base: "flex h-full w-full items-center justify-center rounded-[inherit] bg-muted text-muted-foreground",
18623
18789
  variants: {
18624
18790
  size: {
18625
18791
  xs: "text-xs",
@@ -18643,15 +18809,15 @@ var AvatarContext = React52__namespace.createContext({
18643
18809
  }
18644
18810
  });
18645
18811
  var Avatar2 = React52__namespace.forwardRef(
18646
- function Avatar22({ size = "md", className, children, ...props }, ref) {
18812
+ function Avatar22({ size = "md", shape = "circle", className, children, ...props }, ref) {
18647
18813
  const [imageLoaded, setImageLoaded] = React52__namespace.useState(false);
18648
18814
  const [imageError, setImageError] = React52__namespace.useState(false);
18649
- const api = createAvatar({ size });
18815
+ const api = createAvatar({ size, alt: props["aria-label"] });
18650
18816
  return /* @__PURE__ */ jsxRuntime.jsx(AvatarContext.Provider, { value: { size, imageLoaded, imageError, setImageLoaded, setImageError }, children: /* @__PURE__ */ jsxRuntime.jsx(
18651
18817
  "span",
18652
18818
  {
18653
18819
  ref,
18654
- className: cn(avatarVariants({ size }), className),
18820
+ className: cn(avatarVariants({ size, shape }), className),
18655
18821
  ...api.ariaProps,
18656
18822
  ...api.dataAttributes,
18657
18823
  ...props,
@@ -22588,7 +22754,7 @@ React52__namespace.forwardRef(
22588
22754
  );
22589
22755
 
22590
22756
  // ../logger/dist/index.js
22591
- init_chunk_57LG5ZUS();
22757
+ init_chunk_OEINJBSK();
22592
22758
  var LEVEL_ORDER = {
22593
22759
  debug: 10,
22594
22760
  info: 20,
@@ -22739,7 +22905,7 @@ function createTelemetry(config3) {
22739
22905
  addSinkInternal(createConsoleSink({ pretty: preset.pretty }));
22740
22906
  if (config3.endpoint) {
22741
22907
  const endpoint = config3.endpoint;
22742
- void Promise.resolve().then(() => (init_faro_engine_47HGRAQH(), faro_engine_47HGRAQH_exports)).then(({ createFaroSink: createFaroSink2 }) => createFaroSink2({ app: config3.app, endpoint })).then((faro) => {
22908
+ void Promise.resolve().then(() => (init_faro_engine_VIUXJAPH(), faro_engine_VIUXJAPH_exports)).then(({ createFaroSink: createFaroSink2 }) => createFaroSink2({ app: config3.app, endpoint })).then((faro) => {
22743
22909
  if (faro) addSinkInternal(faro);
22744
22910
  }).catch(() => {
22745
22911
  });
@@ -24122,7 +24288,11 @@ function createClientSdkSink(opts) {
24122
24288
  });
24123
24289
  return instance;
24124
24290
  }
24125
- const mod = await import(appInsightsWebSpecifier);
24291
+ const mod = await import(
24292
+ /* webpackIgnore: true */
24293
+ /* @vite-ignore */
24294
+ appInsightsWebSpecifier
24295
+ );
24126
24296
  const ai = new mod.ApplicationInsights({
24127
24297
  config: {
24128
24298
  connectionString: opts.connectionString,
@@ -24473,7 +24643,11 @@ function createPostHogHttpSink(options) {
24473
24643
  }
24474
24644
  var posthogJsSpecifier = "posthog-js";
24475
24645
  async function defaultLoad() {
24476
- const mod = await import(posthogJsSpecifier);
24646
+ const mod = await import(
24647
+ /* webpackIgnore: true */
24648
+ /* @vite-ignore */
24649
+ posthogJsSpecifier
24650
+ );
24477
24651
  return "default" in mod ? mod.default : mod;
24478
24652
  }
24479
24653
  function createPostHogClientSdkSink(options) {
@@ -24565,7 +24739,11 @@ function createPostHogSink(options) {
24565
24739
  // ../analytics-sink-posthog/dist/replay.js
24566
24740
  var posthogJsSpecifier2 = "posthog-js";
24567
24741
  async function defaultLoad2() {
24568
- const mod = await import(posthogJsSpecifier2);
24742
+ const mod = await import(
24743
+ /* webpackIgnore: true */
24744
+ /* @vite-ignore */
24745
+ posthogJsSpecifier2
24746
+ );
24569
24747
  return "default" in mod ? mod.default : mod;
24570
24748
  }
24571
24749
  async function startSessionReplay(options) {
@@ -28651,9 +28829,9 @@ var MiniMap = React52__namespace.forwardRef(
28651
28829
 
28652
28830
  // ../section-head/dist/index.js
28653
28831
  function createSectionHead(props = {}) {
28654
- const { align = "center" } = props;
28832
+ const { align: align2 = "center" } = props;
28655
28833
  const dataAttributes = {
28656
- "data-align": align
28834
+ "data-align": align2
28657
28835
  };
28658
28836
  return { dataAttributes };
28659
28837
  }
@@ -28677,17 +28855,17 @@ var SectionHead = React52__namespace.forwardRef(
28677
28855
  kicker,
28678
28856
  title,
28679
28857
  lede,
28680
- align = "center",
28858
+ align: align2 = "center",
28681
28859
  as: Tag = "h2",
28682
28860
  className,
28683
28861
  ...props
28684
28862
  }, ref) {
28685
- const { dataAttributes } = createSectionHead({ align });
28863
+ const { dataAttributes } = createSectionHead({ align: align2 });
28686
28864
  return /* @__PURE__ */ jsxRuntime.jsxs(
28687
28865
  "div",
28688
28866
  {
28689
28867
  ref,
28690
- className: cn(sectionHeadVariants({ align }), className),
28868
+ className: cn(sectionHeadVariants({ align: align2 }), className),
28691
28869
  ...dataAttributes,
28692
28870
  ...props,
28693
28871
  children: [
@@ -28702,10 +28880,13 @@ var SectionHead = React52__namespace.forwardRef(
28702
28880
 
28703
28881
  // ../stat-grid/dist/index.js
28704
28882
  function statColumns(count, max = 3) {
28705
- if (count <= 0) return 1;
28706
- if (count === 1) return 1;
28883
+ if (count <= 1) return 1;
28707
28884
  if (count === 2) return 2;
28708
- return Math.min(count, max);
28885
+ return Math.min(count, max, 4);
28886
+ }
28887
+ function statColumnsKey(columns) {
28888
+ if (columns === "auto") return "auto";
28889
+ return String(Math.min(Math.max(Math.round(columns), 1), 4));
28709
28890
  }
28710
28891
  function createStatGrid() {
28711
28892
  return {
@@ -28714,41 +28895,107 @@ function createStatGrid() {
28714
28895
  };
28715
28896
  }
28716
28897
  var statGridVariants = cva({
28717
- base: "grid gap-8",
28898
+ base: "grid",
28718
28899
  variants: {
28719
28900
  columns: {
28720
28901
  "1": "grid-cols-1",
28721
- "2": "grid-cols-2",
28722
- "3": "grid-cols-3"
28902
+ "2": "grid-cols-1 sm:grid-cols-2",
28903
+ "3": "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
28904
+ "4": "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",
28905
+ auto: "grid-cols-[repeat(auto-fill,minmax(12rem,1fr))]"
28906
+ },
28907
+ variant: {
28908
+ plain: "gap-8",
28909
+ card: "gap-3"
28723
28910
  }
28724
28911
  },
28725
28912
  defaultVariants: {
28726
- columns: "3"
28913
+ columns: "3",
28914
+ variant: "plain"
28915
+ }
28916
+ });
28917
+ var statItemVariants = cva({
28918
+ base: "flex min-w-0 flex-col",
28919
+ variants: {
28920
+ variant: {
28921
+ plain: "",
28922
+ card: "gap-1 rounded-lg border border-border bg-card p-4 text-card-foreground"
28923
+ }
28924
+ },
28925
+ defaultVariants: {
28926
+ variant: "plain"
28927
+ }
28928
+ });
28929
+ var statValueVariants = cva({
28930
+ base: "font-bold tabular-nums",
28931
+ variants: {
28932
+ variant: {
28933
+ plain: "text-xl sm:text-2xl",
28934
+ card: "text-2xl leading-tight"
28935
+ },
28936
+ tone: {
28937
+ default: "",
28938
+ positive: "text-success",
28939
+ negative: "text-destructive",
28940
+ caution: "text-warning"
28941
+ }
28942
+ },
28943
+ compoundVariants: [
28944
+ { variant: "plain", tone: "default", class: "text-primary" },
28945
+ { variant: "card", tone: "default", class: "text-foreground" }
28946
+ ],
28947
+ defaultVariants: {
28948
+ variant: "plain",
28949
+ tone: "default"
28727
28950
  }
28728
28951
  });
28729
- var statItemClass = "flex flex-col";
28730
- var statValueClass = "text-xl sm:text-2xl font-bold text-primary";
28731
- var statLabelClass = "mt-1 text-sm text-muted-foreground leading-snug";
28952
+ var statLabelVariants = cva({
28953
+ base: "text-muted-foreground",
28954
+ variants: {
28955
+ layout: {
28956
+ "value-first": "mt-1 text-sm leading-snug",
28957
+ "label-first": "text-xs uppercase tracking-wide"
28958
+ }
28959
+ },
28960
+ defaultVariants: {
28961
+ layout: "value-first"
28962
+ }
28963
+ });
28964
+ var statDescriptionClass = "text-xs leading-snug text-muted-foreground";
28732
28965
  var StatGrid = React52__namespace.forwardRef(
28733
- function StatGrid2({ items, columns, className, ...props }, ref) {
28734
- const cols = columns ?? statColumns(items.length);
28966
+ function StatGrid2({ items, columns, variant = "plain", layout = "value-first", className, ...props }, ref) {
28967
+ const cols = statColumnsKey(columns ?? statColumns(items.length));
28735
28968
  const { ariaProps, dataAttributes } = createStatGrid();
28736
28969
  return /* @__PURE__ */ jsxRuntime.jsx(
28737
28970
  "div",
28738
28971
  {
28739
28972
  ref,
28740
- className: cn(
28741
- statGridVariants({ columns: String(cols) }),
28742
- className
28743
- ),
28744
- style: { gridTemplateColumns: `repeat(${cols}, 1fr)` },
28973
+ className: cn(statGridVariants({ columns: cols, variant }), className),
28974
+ "data-variant": variant,
28975
+ "data-layout": layout,
28745
28976
  ...ariaProps,
28746
28977
  ...dataAttributes,
28747
28978
  ...props,
28748
- children: items.map((item, index2) => /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "listitem", className: statItemClass, children: [
28749
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: statValueClass, children: item.value }),
28750
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: statLabelClass, children: item.label })
28751
- ] }, index2))
28979
+ children: items.map((item, index2) => {
28980
+ const { className: itemClassName, ...itemProps } = item.props ?? {};
28981
+ const label = /* @__PURE__ */ jsxRuntime.jsx("span", { className: statLabelVariants({ layout }), children: item.label });
28982
+ return /* @__PURE__ */ jsxRuntime.jsxs(
28983
+ "div",
28984
+ {
28985
+ role: "listitem",
28986
+ className: cn(statItemVariants({ variant }), itemClassName),
28987
+ "data-tone": item.tone ?? "default",
28988
+ ...itemProps,
28989
+ children: [
28990
+ layout === "label-first" && label,
28991
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: statValueVariants({ variant, tone: item.tone ?? "default" }), children: item.value }),
28992
+ layout === "value-first" && label,
28993
+ item.description != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: statDescriptionClass, children: item.description })
28994
+ ]
28995
+ },
28996
+ item.id ?? index2
28997
+ );
28998
+ })
28752
28999
  }
28753
29000
  );
28754
29001
  }
@@ -29962,11 +30209,24 @@ var DEFAULT_LINE_CHART_WIDTH = 760;
29962
30209
  var DEFAULT_LINE_CHART_HEIGHT = 230;
29963
30210
  var DEFAULT_TICK_COUNT = 4;
29964
30211
  var DEFAULT_HEADROOM = 1.08;
29965
- var DEFAULT_LABEL_EVERY = 2;
30212
+ var MIN_LABEL_SPACING = 48;
29966
30213
  var CHART_TOKEN_COUNT = 5;
29967
30214
  function lineChartColor(index2) {
29968
30215
  return `hsl(var(--chart-${index2 % CHART_TOKEN_COUNT + 1}))`;
29969
30216
  }
30217
+ var NICE_STEPS = [1, 2, 5, 10];
30218
+ function niceScale(rawMax, tickCount) {
30219
+ const intervals = Math.max(1, Math.floor(tickCount));
30220
+ if (!(rawMax > 0)) return { max: 1, step: 1 / intervals, ticks: Array.from({ length: intervals + 1 }, (_2, i) => i / intervals) };
30221
+ const target = rawMax / intervals;
30222
+ const magnitude = 10 ** Math.floor(Math.log10(target));
30223
+ const step = NICE_STEPS.map((m) => m * magnitude).find((candidate) => candidate >= target) ?? 10 * magnitude;
30224
+ const count = Math.ceil(rawMax / step - 1e-9);
30225
+ const decimals = Math.max(0, -Math.floor(Math.log10(step)));
30226
+ const clean = (value) => Number(value.toFixed(decimals));
30227
+ const ticks = Array.from({ length: count + 1 }, (_2, i) => clean(i * step));
30228
+ return { max: ticks[ticks.length - 1], step: clean(step), ticks };
30229
+ }
29970
30230
  function pathFrom(points) {
29971
30231
  return points.map(([px, py], i) => (i ? "L" : "M") + px.toFixed(1) + " " + py.toFixed(1)).join(" ");
29972
30232
  }
@@ -29977,24 +30237,22 @@ function computeLineChart(options) {
29977
30237
  width,
29978
30238
  height,
29979
30239
  tickCount = DEFAULT_TICK_COUNT,
29980
- headroom = DEFAULT_HEADROOM,
29981
- labelEvery = DEFAULT_LABEL_EVERY
30240
+ headroom = DEFAULT_HEADROOM
29982
30241
  } = options;
29983
30242
  const padding = { ...DEFAULT_LINE_CHART_PADDING, ...options.padding };
29984
30243
  const n = labels.length;
29985
30244
  const values = series.flatMap((s) => s.data);
29986
30245
  const peak = values.length ? Math.max(...values) : 0;
29987
- const max = peak > 0 ? peak * headroom : 1;
30246
+ const scale = niceScale(peak > 0 ? peak * headroom : 0, tickCount);
30247
+ const max = scale.max;
29988
30248
  const plotW = width - padding.left - padding.right;
29989
30249
  const plotTop = padding.top;
29990
30250
  const plotBottom = height - padding.bottom;
29991
30251
  const plotH = plotBottom - plotTop;
30252
+ const labelEvery = options.labelEvery ?? Math.max(1, Math.ceil(n / Math.max(1, Math.floor(plotW / MIN_LABEL_SPACING))));
29992
30253
  const x = (index2) => padding.left + (n > 1 ? index2 / (n - 1) * plotW : plotW / 2);
29993
30254
  const y = (value) => plotTop + (1 - value / max) * plotH;
29994
- const ticks = Array.from({ length: tickCount + 1 }, (_2, t) => {
29995
- const value = max / tickCount * t;
29996
- return { value, y: y(value) };
29997
- });
30255
+ const ticks = scale.ticks.map((value) => ({ value, y: y(value) }));
29998
30256
  const xLabels = labels.map((label, index2) => ({ index: index2, label, x: x(index2) })).filter(({ index: index2 }) => index2 % labelEvery === 0 || index2 === n - 1);
29999
30257
  const paths = series.map((s, si) => {
30000
30258
  const points = s.data.map((v2, i) => [x(i), y(v2)]);
@@ -30050,19 +30308,46 @@ var defaultFormat = (value) => String(Math.round(value));
30050
30308
  var MARKER_RADIUS = 3.5;
30051
30309
  var STROKE_WIDTH = 2.2;
30052
30310
  var TOOLTIP_TOP_PX = 8;
30311
+ var useIsomorphicLayoutEffect2 = typeof window !== "undefined" ? React52__namespace.useLayoutEffect : React52__namespace.useEffect;
30312
+ function useMeasuredWidth(ref) {
30313
+ const [measured, setMeasured] = React52__namespace.useState(null);
30314
+ useIsomorphicLayoutEffect2(() => {
30315
+ const node = ref.current;
30316
+ if (!node || typeof ResizeObserver === "undefined") return;
30317
+ const apply = (w) => {
30318
+ const rounded = Math.round(w);
30319
+ if (rounded > 0) setMeasured((prev) => prev === rounded ? prev : rounded);
30320
+ };
30321
+ apply(node.getBoundingClientRect().width);
30322
+ const observer = new ResizeObserver((entries) => apply(entries[0]?.contentRect.width ?? 0));
30323
+ observer.observe(node);
30324
+ return () => observer.disconnect();
30325
+ }, [ref]);
30326
+ return measured;
30327
+ }
30053
30328
  var LineChart = React52__namespace.forwardRef(function LineChart2({
30054
30329
  series,
30055
30330
  labels,
30056
30331
  ariaLabel,
30057
30332
  height = DEFAULT_LINE_CHART_HEIGHT,
30058
- width = DEFAULT_LINE_CHART_WIDTH,
30333
+ width: fallbackWidth = DEFAULT_LINE_CHART_WIDTH,
30059
30334
  formatValue = defaultFormat,
30060
30335
  formatTick: formatTick2,
30061
30336
  area,
30062
30337
  showLegend = true,
30063
30338
  className,
30064
30339
  ...rest
30065
- }, ref) {
30340
+ }, forwardedRef) {
30341
+ const rootRef = React52__namespace.useRef(null);
30342
+ const ref = React52__namespace.useCallback(
30343
+ (node) => {
30344
+ rootRef.current = node;
30345
+ if (typeof forwardedRef === "function") forwardedRef(node);
30346
+ else if (forwardedRef) forwardedRef.current = node;
30347
+ },
30348
+ [forwardedRef]
30349
+ );
30350
+ const width = useMeasuredWidth(rootRef) ?? fallbackWidth;
30066
30351
  const [active, setActive] = React52__namespace.useState(null);
30067
30352
  const gradientBase = React52__namespace.useId().replace(/:/g, "");
30068
30353
  const geo = React52__namespace.useMemo(
@@ -30207,6 +30492,172 @@ var PageHeader = React52__namespace.forwardRef(function PageHeader2({ kicker, ti
30207
30492
  ] });
30208
30493
  });
30209
30494
 
30495
+ // ../table/dist/index.js
30496
+ function createTable(props = {}) {
30497
+ return {
30498
+ dataAttributes: {
30499
+ "data-slot": "table",
30500
+ "data-density": props.density ?? "default",
30501
+ "data-head-tone": props.headTone ?? "default"
30502
+ }
30503
+ };
30504
+ }
30505
+ var tableContainerClass = "relative w-full overflow-x-auto";
30506
+ var tableRootVariants = cva({
30507
+ base: "w-full caption-bottom border-collapse text-sm",
30508
+ variants: {
30509
+ fixed: {
30510
+ true: "table-fixed",
30511
+ false: ""
30512
+ }
30513
+ },
30514
+ defaultVariants: {
30515
+ fixed: "false"
30516
+ }
30517
+ });
30518
+ var tableCaptionClass = "mt-2 text-xs text-muted-foreground";
30519
+ var tableRowClass = "border-b border-border-subtle last:border-b-0";
30520
+ var align = {
30521
+ start: "text-start",
30522
+ center: "text-center",
30523
+ end: "text-end"
30524
+ };
30525
+ var tableHeadVariants = cva({
30526
+ base: "border-b border-border-subtle bg-surface-subtle align-middle",
30527
+ variants: {
30528
+ align,
30529
+ tone: {
30530
+ default: "text-xs font-medium text-muted-foreground",
30531
+ eyebrow: "text-[11px] font-semibold uppercase tracking-wider text-muted-foreground"
30532
+ },
30533
+ density: {
30534
+ compact: "h-8 px-2",
30535
+ default: "h-9 px-3"
30536
+ }
30537
+ },
30538
+ defaultVariants: {
30539
+ align: "start",
30540
+ tone: "default",
30541
+ density: "default"
30542
+ }
30543
+ });
30544
+ var tableCellVariants = cva({
30545
+ base: "align-middle",
30546
+ variants: {
30547
+ align,
30548
+ density: {
30549
+ compact: "px-2 py-1.5",
30550
+ default: "px-3 py-2.5"
30551
+ },
30552
+ numeric: {
30553
+ true: "tabular-nums whitespace-nowrap",
30554
+ false: ""
30555
+ }
30556
+ },
30557
+ defaultVariants: {
30558
+ align: "start",
30559
+ density: "default",
30560
+ numeric: "false"
30561
+ }
30562
+ });
30563
+ var TableContext = React52__namespace.createContext({ density: "default", headTone: "default" });
30564
+ var Table = React52__namespace.forwardRef(function Table2({ density = "default", headTone = "default", fixed = false, containerClassName, className, ...props }, ref) {
30565
+ const ctx = React52__namespace.useMemo(() => ({ density, headTone }), [density, headTone]);
30566
+ const { dataAttributes } = createTable({ density, headTone });
30567
+ return /* @__PURE__ */ jsxRuntime.jsx(TableContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(tableContainerClass, containerClassName), "data-slot": "table-container", children: /* @__PURE__ */ jsxRuntime.jsx(
30568
+ "table",
30569
+ {
30570
+ ref,
30571
+ className: cn(tableRootVariants({ fixed: fixed ? "true" : "false" }), className),
30572
+ ...dataAttributes,
30573
+ ...props
30574
+ }
30575
+ ) }) });
30576
+ });
30577
+ var TableHeader = React52__namespace.forwardRef(
30578
+ function TableHeader2(props, ref) {
30579
+ return /* @__PURE__ */ jsxRuntime.jsx("thead", { ref, "data-slot": "table-header", ...props });
30580
+ }
30581
+ );
30582
+ var TableBody = React52__namespace.forwardRef(
30583
+ function TableBody2(props, ref) {
30584
+ return /* @__PURE__ */ jsxRuntime.jsx("tbody", { ref, "data-slot": "table-body", ...props });
30585
+ }
30586
+ );
30587
+ var TableRow = React52__namespace.forwardRef(
30588
+ function TableRow2({ className, ...props }, ref) {
30589
+ return /* @__PURE__ */ jsxRuntime.jsx("tr", { ref, className: cn(tableRowClass, className), "data-slot": "table-row", ...props });
30590
+ }
30591
+ );
30592
+ var TableHead = React52__namespace.forwardRef(function TableHead2({ align: align2, scope = "col", className, ...props }, ref) {
30593
+ const { density, headTone } = React52__namespace.useContext(TableContext);
30594
+ return /* @__PURE__ */ jsxRuntime.jsx(
30595
+ "th",
30596
+ {
30597
+ ref,
30598
+ scope,
30599
+ className: cn(tableHeadVariants({ align: align2, density, tone: headTone }), className),
30600
+ "data-slot": "table-head",
30601
+ ...props
30602
+ }
30603
+ );
30604
+ });
30605
+ var TableCell = React52__namespace.forwardRef(function TableCell2({ align: align2, numeric = false, className, ...props }, ref) {
30606
+ const { density } = React52__namespace.useContext(TableContext);
30607
+ return /* @__PURE__ */ jsxRuntime.jsx(
30608
+ "td",
30609
+ {
30610
+ ref,
30611
+ className: cn(tableCellVariants({ align: align2, density, numeric: numeric ? "true" : "false" }), className),
30612
+ "data-slot": "table-cell",
30613
+ ...props
30614
+ }
30615
+ );
30616
+ });
30617
+ var TableCaption = React52__namespace.forwardRef(
30618
+ function TableCaption2({ className, ...props }, ref) {
30619
+ return /* @__PURE__ */ jsxRuntime.jsx("caption", { ref, className: cn(tableCaptionClass, className), "data-slot": "table-caption", ...props });
30620
+ }
30621
+ );
30622
+
30623
+ // ../native-select/dist/index.js
30624
+ var nativeSelectChevronPath = "m6 9 6 6 6-6";
30625
+ var nativeSelectWrapperClass = "relative inline-flex min-w-0 items-center";
30626
+ var nativeSelectVariants = cva({
30627
+ base: "w-full cursor-pointer appearance-none rounded-md border border-input bg-background text-foreground shadow-sm ring-offset-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
30628
+ variants: {
30629
+ size: {
30630
+ sm: "h-8 pl-2.5 pr-8 text-xs",
30631
+ default: "h-9 pl-3 pr-9 text-sm",
30632
+ lg: "h-10 pl-3 pr-10 text-base"
30633
+ }
30634
+ },
30635
+ defaultVariants: {
30636
+ size: "default"
30637
+ }
30638
+ });
30639
+ var nativeSelectIconClass = "pointer-events-none absolute right-2.5 h-4 w-4 shrink-0 text-muted-foreground";
30640
+ var NativeSelect = React52__namespace.forwardRef(function NativeSelect2({ size = "default", className, containerClassName, children, ...props }, ref) {
30641
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn(nativeSelectWrapperClass, containerClassName), "data-slot": "native-select", children: [
30642
+ /* @__PURE__ */ jsxRuntime.jsx("select", { ref, className: cn(nativeSelectVariants({ size }), className), ...props, children }),
30643
+ /* @__PURE__ */ jsxRuntime.jsx(
30644
+ "svg",
30645
+ {
30646
+ className: nativeSelectIconClass,
30647
+ xmlns: "http://www.w3.org/2000/svg",
30648
+ viewBox: "0 0 24 24",
30649
+ fill: "none",
30650
+ stroke: "currentColor",
30651
+ strokeWidth: "2",
30652
+ strokeLinecap: "round",
30653
+ strokeLinejoin: "round",
30654
+ "aria-hidden": "true",
30655
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: nativeSelectChevronPath })
30656
+ }
30657
+ )
30658
+ ] });
30659
+ });
30660
+
30210
30661
  exports.AIProvider = AIProvider;
30211
30662
  exports.Accordion = Accordion;
30212
30663
  exports.AccordionContent = AccordionContent;
@@ -30365,6 +30816,7 @@ exports.MobileNav = MobileNav;
30365
30816
  exports.MobileNavContent = MobileNavContent;
30366
30817
  exports.MobileNavLink = MobileNavLink;
30367
30818
  exports.MobileNavTrigger = MobileNavTrigger;
30819
+ exports.NativeSelect = NativeSelect;
30368
30820
  exports.Navbar = Navbar;
30369
30821
  exports.NumberedSteps = NumberedSteps;
30370
30822
  exports.OtpInput = OtpInput;
@@ -30451,7 +30903,14 @@ exports.Steps = Steps;
30451
30903
  exports.StickyNote = StickyNote;
30452
30904
  exports.Switch = Switch;
30453
30905
  exports.TTSProvider = TTSProvider;
30906
+ exports.Table = Table;
30907
+ exports.TableBody = TableBody;
30908
+ exports.TableCaption = TableCaption;
30909
+ exports.TableCell = TableCell;
30910
+ exports.TableHead = TableHead;
30911
+ exports.TableHeader = TableHeader;
30454
30912
  exports.TableOfContents = TableOfContents;
30913
+ exports.TableRow = TableRow;
30455
30914
  exports.Tabs = Tabs;
30456
30915
  exports.TabsContent = TabsContent;
30457
30916
  exports.TabsList = TabsList;
@@ -30513,6 +30972,7 @@ exports.checkIconPath = checkIconPath;
30513
30972
  exports.checkboxTokens = checkboxTokens;
30514
30973
  exports.checkboxVariants = checkboxVariants;
30515
30974
  exports.clampVoicePillIntensity = clampVoicePillIntensity;
30975
+ exports.cn = cn;
30516
30976
  exports.codeEditorTokens = codeEditorTokens;
30517
30977
  exports.codeEditorVariants = codeEditorVariants;
30518
30978
  exports.collapsibleContentVariants = collapsibleContentVariants;
@@ -30537,6 +30997,7 @@ exports.composerPrimaryActionVariants = composerPrimaryActionVariants;
30537
30997
  exports.composerSurfaceVariants = composerSurfaceVariants;
30538
30998
  exports.composerTokenPillClass = composerTokenPillClass;
30539
30999
  exports.composerTrayClass = composerTrayClass;
31000
+ exports.computeMenuPosition = computeMenuPosition;
30540
31001
  exports.contentProtectionVariants = contentProtectionVariants;
30541
31002
  exports.controlsVariants = controlsVariants;
30542
31003
  exports.createAnalytics = createAnalytics;
@@ -30562,6 +31023,7 @@ exports.createTelemetry = createTelemetry;
30562
31023
  exports.createTwemojiRenderer = createTwemojiRenderer;
30563
31024
  exports.createVoicePill = createVoicePill;
30564
31025
  exports.createWaveform = createWaveform;
31026
+ exports.cva = cva;
30565
31027
  exports.dayVariants = dayVariants;
30566
31028
  exports.defaultStickerRenderer = defaultStickerRenderer;
30567
31029
  exports.deviceFrameVariants = deviceFrameVariants;