@refraction-ui/react 0.19.1 → 0.20.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 (342) hide show
  1. package/dist/chunk-533MCMSU.js +2355 -0
  2. package/dist/chunk-533MCMSU.js.map +7 -0
  3. package/dist/chunk-AMK4VCBG.js +250 -0
  4. package/dist/chunk-AMK4VCBG.js.map +7 -0
  5. package/dist/chunk-BOLFYVI6.js +90 -0
  6. package/dist/chunk-BOLFYVI6.js.map +7 -0
  7. package/dist/chunk-F7B64KT3.js +187 -0
  8. package/dist/chunk-F7B64KT3.js.map +7 -0
  9. package/dist/chunk-FD37DFCC.js +77 -0
  10. package/dist/chunk-FD37DFCC.js.map +7 -0
  11. package/dist/chunk-H54FLNAF.js +132 -0
  12. package/dist/chunk-H54FLNAF.js.map +7 -0
  13. package/dist/chunk-INP46354.js +664 -0
  14. package/dist/chunk-INP46354.js.map +7 -0
  15. package/dist/chunk-ONACRMG4.js +116 -0
  16. package/dist/chunk-ONACRMG4.js.map +7 -0
  17. package/dist/chunk-SDZ3LROZ.js +7 -0
  18. package/dist/chunk-SDZ3LROZ.js.map +7 -0
  19. package/dist/chunk-TOZBR4GL.js +154 -0
  20. package/dist/chunk-TOZBR4GL.js.map +7 -0
  21. package/dist/chunk-UNEM2TRI.js +225 -0
  22. package/dist/chunk-UNEM2TRI.js.map +7 -0
  23. package/dist/chunk-VK3EQ34F.js +92 -0
  24. package/dist/chunk-VK3EQ34F.js.map +7 -0
  25. package/dist/chunk-WK2IIUFO.js +316 -0
  26. package/dist/chunk-WK2IIUFO.js.map +7 -0
  27. package/dist/chunk-WSPJTQAV.js +59 -0
  28. package/dist/chunk-WSPJTQAV.js.map +7 -0
  29. package/dist/chunk-XWP763SH.js +3 -2
  30. package/dist/chunk-XWP763SH.js.map +7 -1
  31. package/dist/chunk-Y2FNNAIL.js +80 -0
  32. package/dist/chunk-Y2FNNAIL.js.map +1 -0
  33. package/dist/{chunk-4A4BW3GR.js → chunk-ZF3OHCGV.js} +28 -5
  34. package/dist/chunk-ZF3OHCGV.js.map +7 -0
  35. package/dist/form.cjs +5 -11
  36. package/dist/form.cjs.map +1 -1
  37. package/dist/form.js +6 -12
  38. package/dist/form.js.map +1 -1
  39. package/dist/index.cjs +2879 -33936
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +126 -28780
  44. package/dist/internal/react-app-shell/index.d.cts +2 -22
  45. package/dist/internal/react-app-shell/index.d.ts +2 -22
  46. package/dist/internal/react-badge/index.d.cts +5 -0
  47. package/dist/internal/react-badge/index.d.ts +5 -0
  48. package/dist/internal/react-callout/index.d.cts +4 -0
  49. package/dist/internal/react-callout/index.d.ts +4 -0
  50. package/dist/internal/react-card/index.d.cts +8 -1
  51. package/dist/internal/react-card/index.d.ts +8 -1
  52. package/dist/internal/react-collapsible/index.d.cts +0 -3
  53. package/dist/internal/react-collapsible/index.d.ts +0 -3
  54. package/dist/internal/react-combobox/index.d.cts +0 -3
  55. package/dist/internal/react-combobox/index.d.ts +0 -3
  56. package/dist/internal/react-command/index.d.cts +0 -3
  57. package/dist/internal/react-command/index.d.ts +0 -3
  58. package/dist/internal/react-data-table/index.d.cts +0 -3
  59. package/dist/internal/react-data-table/index.d.ts +0 -3
  60. package/dist/internal/react-dialog/index.d.cts +0 -3
  61. package/dist/internal/react-dialog/index.d.ts +0 -3
  62. package/dist/internal/react-dropdown-menu/index.d.cts +0 -3
  63. package/dist/internal/react-dropdown-menu/index.d.ts +0 -3
  64. package/dist/internal/react-feedback-dialog/index.d.cts +0 -3
  65. package/dist/internal/react-feedback-dialog/index.d.ts +0 -3
  66. package/dist/internal/react-form/index.d.cts +2 -21
  67. package/dist/internal/react-form/index.d.ts +2 -21
  68. package/dist/internal/react-keyboard-shortcut/index.d.cts +0 -6
  69. package/dist/internal/react-keyboard-shortcut/index.d.ts +0 -6
  70. package/dist/internal/react-link-card/index.d.cts +8 -2
  71. package/dist/internal/react-link-card/index.d.ts +8 -2
  72. package/dist/internal/react-popover/index.d.cts +0 -3
  73. package/dist/internal/react-popover/index.d.ts +0 -3
  74. package/dist/internal/react-sheet/index.d.cts +0 -3
  75. package/dist/internal/react-sheet/index.d.ts +0 -3
  76. package/dist/internal/react-slot/index.d.cts +23 -0
  77. package/dist/internal/react-slot/index.d.ts +23 -0
  78. package/dist/internal/react-toast/index.d.cts +0 -3
  79. package/dist/internal/react-toast/index.d.ts +0 -3
  80. package/dist/internal/react-tooltip/index.d.cts +0 -3
  81. package/dist/internal/react-tooltip/index.d.ts +0 -3
  82. package/dist/react-accordion.js +125 -0
  83. package/dist/react-accordion.js.map +7 -0
  84. package/dist/react-ai.js +257 -0
  85. package/dist/react-ai.js.map +7 -0
  86. package/dist/react-analytics.js +1698 -0
  87. package/dist/react-analytics.js.map +7 -0
  88. package/dist/react-animated-text.js +164 -0
  89. package/dist/react-animated-text.js.map +7 -0
  90. package/dist/react-app-shell.js +631 -0
  91. package/dist/react-app-shell.js.map +7 -0
  92. package/dist/react-audience-feature-card.js +53 -0
  93. package/dist/react-audience-feature-card.js.map +7 -0
  94. package/dist/react-audio-room.js +166 -0
  95. package/dist/react-audio-room.js.map +7 -0
  96. package/dist/react-auth.js +211 -0
  97. package/dist/react-auth.js.map +7 -0
  98. package/dist/react-avatar-group.js +154 -0
  99. package/dist/react-avatar-group.js.map +7 -0
  100. package/dist/react-avatar.js +168 -0
  101. package/dist/react-avatar.js.map +7 -0
  102. package/dist/react-badge.js +86 -0
  103. package/dist/react-badge.js.map +7 -0
  104. package/dist/react-bottom-nav.js +67 -0
  105. package/dist/react-bottom-nav.js.map +7 -0
  106. package/dist/react-brand-network-cell.js +92 -0
  107. package/dist/react-brand-network-cell.js.map +7 -0
  108. package/dist/react-breadcrumbs.js +104 -0
  109. package/dist/react-breadcrumbs.js.map +7 -0
  110. package/dist/react-browser-chrome-mock.js +89 -0
  111. package/dist/react-browser-chrome-mock.js.map +7 -0
  112. package/dist/react-button.js +13 -0
  113. package/dist/react-button.js.map +7 -0
  114. package/dist/react-calendar.js +301 -0
  115. package/dist/react-calendar.js.map +7 -0
  116. package/dist/react-call-controls.js +113 -0
  117. package/dist/react-call-controls.js.map +7 -0
  118. package/dist/react-callout.js +152 -0
  119. package/dist/react-callout.js.map +7 -0
  120. package/dist/react-card-grid.js +34 -0
  121. package/dist/react-card-grid.js.map +7 -0
  122. package/dist/react-card.js +200 -0
  123. package/dist/react-card.js.map +7 -0
  124. package/dist/react-carousel.js +132 -0
  125. package/dist/react-carousel.js.map +7 -0
  126. package/dist/react-charts.js +509 -0
  127. package/dist/react-charts.js.map +7 -0
  128. package/dist/react-checkbox.js +156 -0
  129. package/dist/react-checkbox.js.map +7 -0
  130. package/dist/react-checklist.js +168 -0
  131. package/dist/react-checklist.js.map +7 -0
  132. package/dist/react-code-block.js +78 -0
  133. package/dist/react-code-block.js.map +7 -0
  134. package/dist/react-code-editor.js +184 -0
  135. package/dist/react-code-editor.js.map +7 -0
  136. package/dist/react-collapsible.js +192 -0
  137. package/dist/react-collapsible.js.map +7 -0
  138. package/dist/react-combobox.js +609 -0
  139. package/dist/react-combobox.js.map +7 -0
  140. package/dist/react-command-input.js +202 -0
  141. package/dist/react-command-input.js.map +7 -0
  142. package/dist/react-command.js +364 -0
  143. package/dist/react-command.js.map +7 -0
  144. package/dist/react-composer.js +2036 -0
  145. package/dist/react-composer.js.map +7 -0
  146. package/dist/react-content-protection.js +133 -0
  147. package/dist/react-content-protection.js.map +7 -0
  148. package/dist/react-conversation.js +1226 -0
  149. package/dist/react-conversation.js.map +7 -0
  150. package/dist/react-cookie-consent.js +291 -0
  151. package/dist/react-cookie-consent.js.map +7 -0
  152. package/dist/react-data-table.js +310 -0
  153. package/dist/react-data-table.js.map +7 -0
  154. package/dist/react-date-picker.js +95 -0
  155. package/dist/react-date-picker.js.map +7 -0
  156. package/dist/react-device-frame.js +137 -0
  157. package/dist/react-device-frame.js.map +7 -0
  158. package/dist/react-dialog.js +218 -0
  159. package/dist/react-dialog.js.map +7 -0
  160. package/dist/react-diff-viewer.js +460 -0
  161. package/dist/react-diff-viewer.js.map +7 -0
  162. package/dist/react-dropdown-menu.js +292 -0
  163. package/dist/react-dropdown-menu.js.map +7 -0
  164. package/dist/react-editor-status-bar.js +148 -0
  165. package/dist/react-editor-status-bar.js.map +7 -0
  166. package/dist/react-editor-tabs.js +159 -0
  167. package/dist/react-editor-tabs.js.map +7 -0
  168. package/dist/react-emoji-picker.js +238 -0
  169. package/dist/react-emoji-picker.js.map +7 -0
  170. package/dist/react-empty-state.js +90 -0
  171. package/dist/react-empty-state.js.map +7 -0
  172. package/dist/react-feedback-dialog.js +275 -0
  173. package/dist/react-feedback-dialog.js.map +7 -0
  174. package/dist/react-file-tree.js +376 -0
  175. package/dist/react-file-tree.js.map +7 -0
  176. package/dist/react-file-upload.js +360 -0
  177. package/dist/react-file-upload.js.map +7 -0
  178. package/dist/react-floating-reactions.js +124 -0
  179. package/dist/react-floating-reactions.js.map +7 -0
  180. package/dist/react-flow-editor.js +198 -0
  181. package/dist/react-flow-editor.js.map +7 -0
  182. package/dist/react-footer.js +67 -0
  183. package/dist/react-footer.js.map +7 -0
  184. package/dist/react-graph-view.js +197 -0
  185. package/dist/react-graph-view.js.map +7 -0
  186. package/dist/react-icon-system.js +9 -0
  187. package/dist/react-icon-system.js.map +7 -0
  188. package/dist/react-infinite-canvas.js +8 -0
  189. package/dist/react-infinite-canvas.js.map +7 -0
  190. package/dist/react-inline-editor.js +216 -0
  191. package/dist/react-inline-editor.js.map +7 -0
  192. package/dist/react-input-group.js +150 -0
  193. package/dist/react-input-group.js.map +7 -0
  194. package/dist/react-input.js +10 -0
  195. package/dist/react-input.js.map +7 -0
  196. package/dist/react-install-prompt.js +132 -0
  197. package/dist/react-install-prompt.js.map +7 -0
  198. package/dist/react-kanban-board.js +198 -0
  199. package/dist/react-kanban-board.js.map +7 -0
  200. package/dist/react-keyboard-shortcut.js +36 -0
  201. package/dist/react-keyboard-shortcut.js.map +7 -0
  202. package/dist/react-language-selector.js +311 -0
  203. package/dist/react-language-selector.js.map +7 -0
  204. package/dist/react-link-card.js +48 -0
  205. package/dist/react-link-card.js.map +7 -0
  206. package/dist/react-live-captions.js +92 -0
  207. package/dist/react-live-captions.js.map +7 -0
  208. package/dist/react-live-cursors.js +145 -0
  209. package/dist/react-live-cursors.js.map +7 -0
  210. package/dist/react-live-transcript.js +117 -0
  211. package/dist/react-live-transcript.js.map +7 -0
  212. package/dist/react-location-selector.js +252 -0
  213. package/dist/react-location-selector.js.map +7 -0
  214. package/dist/react-logger.js +415 -0
  215. package/dist/react-logger.js.map +7 -0
  216. package/dist/react-markdown-renderer.js +12 -0
  217. package/dist/react-markdown-renderer.js.map +7 -0
  218. package/dist/react-marquee-strip.js +62 -0
  219. package/dist/react-marquee-strip.js.map +7 -0
  220. package/dist/react-mascot.js +367 -0
  221. package/dist/react-mascot.js.map +7 -0
  222. package/dist/react-mastery-bar.js +97 -0
  223. package/dist/react-mastery-bar.js.map +7 -0
  224. package/dist/react-mini-map.js +207 -0
  225. package/dist/react-mini-map.js.map +7 -0
  226. package/dist/react-mobile-nav.js +216 -0
  227. package/dist/react-mobile-nav.js.map +7 -0
  228. package/dist/react-navbar.js +96 -0
  229. package/dist/react-navbar.js.map +7 -0
  230. package/dist/react-numbered-steps.js +67 -0
  231. package/dist/react-numbered-steps.js.map +7 -0
  232. package/dist/react-otp-input.js +318 -0
  233. package/dist/react-otp-input.js.map +7 -0
  234. package/dist/react-pagination.js +199 -0
  235. package/dist/react-pagination.js.map +7 -0
  236. package/dist/react-password-input.js +104 -0
  237. package/dist/react-password-input.js.map +7 -0
  238. package/dist/react-payment.js +81 -0
  239. package/dist/react-payment.js.map +7 -0
  240. package/dist/react-popover.js +176 -0
  241. package/dist/react-popover.js.map +7 -0
  242. package/dist/react-pre-call-lobby.js +309 -0
  243. package/dist/react-pre-call-lobby.js.map +7 -0
  244. package/dist/react-presence-indicator.js +86 -0
  245. package/dist/react-presence-indicator.js.map +7 -0
  246. package/dist/react-pricing-card.js +142 -0
  247. package/dist/react-pricing-card.js.map +7 -0
  248. package/dist/react-progress-display.js +188 -0
  249. package/dist/react-progress-display.js.map +7 -0
  250. package/dist/react-radial-gauge.js +193 -0
  251. package/dist/react-radial-gauge.js.map +7 -0
  252. package/dist/react-radio.js +169 -0
  253. package/dist/react-radio.js.map +7 -0
  254. package/dist/react-rating-scale.js +171 -0
  255. package/dist/react-rating-scale.js.map +7 -0
  256. package/dist/react-reaction-bar.js +111 -0
  257. package/dist/react-reaction-bar.js.map +7 -0
  258. package/dist/react-resizable-layout.js +298 -0
  259. package/dist/react-resizable-layout.js.map +7 -0
  260. package/dist/react-rich-editor.js +1 -0
  261. package/dist/react-rich-editor.js.map +7 -0
  262. package/dist/react-search-bar.js +285 -0
  263. package/dist/react-search-bar.js.map +7 -0
  264. package/dist/react-section-head.js +65 -0
  265. package/dist/react-section-head.js.map +7 -0
  266. package/dist/react-segmented-control.js +215 -0
  267. package/dist/react-segmented-control.js.map +7 -0
  268. package/dist/react-select.js +389 -0
  269. package/dist/react-select.js.map +7 -0
  270. package/dist/react-separator.js +86 -0
  271. package/dist/react-separator.js.map +7 -0
  272. package/dist/react-sheet.js +310 -0
  273. package/dist/react-sheet.js.map +7 -0
  274. package/dist/react-sidebar.js +100 -0
  275. package/dist/react-sidebar.js.map +7 -0
  276. package/dist/react-skeleton.js +91 -0
  277. package/dist/react-skeleton.js.map +7 -0
  278. package/dist/react-skip-to-content.js +38 -0
  279. package/dist/react-skip-to-content.js.map +7 -0
  280. package/dist/react-slide-viewer.js +264 -0
  281. package/dist/react-slide-viewer.js.map +7 -0
  282. package/dist/react-slider.js +105 -0
  283. package/dist/react-slider.js.map +7 -0
  284. package/dist/react-slot-picker.js +184 -0
  285. package/dist/react-slot-picker.js.map +7 -0
  286. package/dist/react-slot.js +7 -0
  287. package/dist/react-slot.js.map +7 -0
  288. package/dist/react-social-auth-button.js +169 -0
  289. package/dist/react-social-auth-button.js.map +7 -0
  290. package/dist/react-sortable-list.js +204 -0
  291. package/dist/react-sortable-list.js.map +7 -0
  292. package/dist/react-stat-grid.js +69 -0
  293. package/dist/react-stat-grid.js.map +7 -0
  294. package/dist/react-status-indicator.js +117 -0
  295. package/dist/react-status-indicator.js.map +7 -0
  296. package/dist/react-steps.js +167 -0
  297. package/dist/react-steps.js.map +7 -0
  298. package/dist/react-sticky-note.js +131 -0
  299. package/dist/react-sticky-note.js.map +7 -0
  300. package/dist/react-switch.js +139 -0
  301. package/dist/react-switch.js.map +7 -0
  302. package/dist/react-table-of-contents.js +80 -0
  303. package/dist/react-table-of-contents.js.map +7 -0
  304. package/dist/react-tabs.js +230 -0
  305. package/dist/react-tabs.js.map +7 -0
  306. package/dist/react-terminal.js +101 -0
  307. package/dist/react-terminal.js.map +7 -0
  308. package/dist/react-test-results.js +158 -0
  309. package/dist/react-test-results.js.map +7 -0
  310. package/dist/react-textarea.js +89 -0
  311. package/dist/react-textarea.js.map +7 -0
  312. package/dist/react-thread-view.js +139 -0
  313. package/dist/react-thread-view.js.map +7 -0
  314. package/dist/react-timeline.js +153 -0
  315. package/dist/react-timeline.js.map +7 -0
  316. package/dist/react-toast.js +253 -0
  317. package/dist/react-toast.js.map +7 -0
  318. package/dist/react-tooltip.js +221 -0
  319. package/dist/react-tooltip.js.map +7 -0
  320. package/dist/react-version-selector.js +270 -0
  321. package/dist/react-version-selector.js.map +7 -0
  322. package/dist/react-video-grid.js +129 -0
  323. package/dist/react-video-grid.js.map +7 -0
  324. package/dist/react-video-player.js +206 -0
  325. package/dist/react-video-player.js.map +7 -0
  326. package/dist/react-video-tile.js +8 -0
  327. package/dist/react-video-tile.js.map +7 -0
  328. package/dist/react-voice-pill.js +314 -0
  329. package/dist/react-voice-pill.js.map +7 -0
  330. package/dist/react-waveform.js +558 -0
  331. package/dist/react-waveform.js.map +7 -0
  332. package/dist/react-wizard.js +337 -0
  333. package/dist/react-wizard.js.map +7 -0
  334. package/dist/styles.css +7 -0
  335. package/dist/theme.js +1 -1
  336. package/package.json +3 -2
  337. package/dist/applicationinsights-web-H7OBLIVJ.js +0 -23393
  338. package/dist/applicationinsights-web-H7OBLIVJ.js.map +0 -1
  339. package/dist/chunk-4A4BW3GR.js.map +0 -1
  340. package/dist/index.js.map +0 -1
  341. package/dist/module-X3HTTRQK.js +0 -6438
  342. package/dist/module-X3HTTRQK.js.map +0 -1
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=react-rich-editor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,285 @@
1
+ import {
2
+ Keys,
3
+ cn,
4
+ createKeyboardHandler,
5
+ cva,
6
+ devWarn,
7
+ generateId
8
+ } from "./chunk-ZF3OHCGV.js";
9
+
10
+ // ../react-search-bar/dist/index.js
11
+ import * as React from "react";
12
+
13
+ // ../search-bar/dist/index.js
14
+ function createSearchBar(props = {}) {
15
+ const {
16
+ value: initialValue = "",
17
+ onValueChange,
18
+ onSearch,
19
+ debounceMs = 300,
20
+ placeholder: _placeholder,
21
+ loading = false
22
+ } = props;
23
+ const listId = generateId("rfr-search-list");
24
+ let currentValue = initialValue;
25
+ let isSearching = loading;
26
+ let debounceTimer;
27
+ const state = { value: currentValue, isSearching };
28
+ function setValue(value) {
29
+ currentValue = value;
30
+ state.value = value;
31
+ onValueChange?.(value);
32
+ if (debounceTimer !== void 0) {
33
+ clearTimeout(debounceTimer);
34
+ }
35
+ if (value.length > 0) {
36
+ isSearching = true;
37
+ state.isSearching = true;
38
+ debounceTimer = setTimeout(() => {
39
+ onSearch?.(value);
40
+ isSearching = false;
41
+ state.isSearching = false;
42
+ }, debounceMs);
43
+ } else {
44
+ isSearching = false;
45
+ state.isSearching = false;
46
+ }
47
+ }
48
+ function clear() {
49
+ if (debounceTimer !== void 0) {
50
+ clearTimeout(debounceTimer);
51
+ }
52
+ currentValue = "";
53
+ state.value = "";
54
+ isSearching = false;
55
+ state.isSearching = false;
56
+ onValueChange?.("");
57
+ }
58
+ const inputProps = {
59
+ role: "combobox",
60
+ "aria-expanded": currentValue.length > 0,
61
+ "aria-controls": listId,
62
+ "aria-autocomplete": "list"
63
+ };
64
+ const listProps = {
65
+ role: "listbox",
66
+ id: listId
67
+ };
68
+ const keyboardHandlers = {
69
+ [Keys.ArrowDown]: () => {
70
+ },
71
+ [Keys.Escape]: () => {
72
+ clear();
73
+ },
74
+ [Keys.Enter]: () => {
75
+ if (debounceTimer !== void 0) {
76
+ clearTimeout(debounceTimer);
77
+ }
78
+ onSearch?.(currentValue);
79
+ isSearching = false;
80
+ state.isSearching = false;
81
+ }
82
+ };
83
+ const handleKeyDown = createKeyboardHandler(keyboardHandlers);
84
+ return {
85
+ state,
86
+ inputProps,
87
+ listProps,
88
+ setValue,
89
+ clear,
90
+ keyboardHandlers,
91
+ handleKeyDown
92
+ };
93
+ }
94
+ var searchBarVariants = cva({
95
+ base: "relative flex items-center w-full rounded-md border bg-background text-foreground",
96
+ variants: {
97
+ size: {
98
+ sm: "h-8 text-sm px-2",
99
+ md: "h-10 text-base px-3",
100
+ lg: "h-12 text-lg px-4"
101
+ }
102
+ },
103
+ defaultVariants: {
104
+ size: "md"
105
+ }
106
+ });
107
+ var searchResultVariants = cva({
108
+ base: "absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-hidden",
109
+ variants: {
110
+ size: {
111
+ sm: "text-sm",
112
+ md: "text-base",
113
+ lg: "text-lg"
114
+ }
115
+ },
116
+ defaultVariants: {
117
+ size: "md"
118
+ }
119
+ });
120
+
121
+ // ../react-search-bar/dist/index.js
122
+ var SearchBarContext = React.createContext(null);
123
+ function useSearchBarContext() {
124
+ const ctx = React.useContext(SearchBarContext);
125
+ if (!ctx) {
126
+ devWarn(
127
+ "react-search-bar/compound-outside-provider",
128
+ "A SearchBar compound component was rendered outside of <SearchBar>. Wrap it in <SearchBar>."
129
+ );
130
+ throw new Error("SearchBar compound components must be used within <SearchBar>");
131
+ }
132
+ return ctx;
133
+ }
134
+ var SearchBar = React.forwardRef(
135
+ function SearchBar2({ value: controlledValue, defaultValue = "", onValueChange, onSearch, debounceMs = 300, loading = false, placeholder, className, children, ...inputProps }, ref) {
136
+ const [internalValue, setInternalValue] = React.useState(controlledValue ?? defaultValue);
137
+ const isControlled = controlledValue !== void 0;
138
+ const currentValue = isControlled ? controlledValue : internalValue;
139
+ const debounceRef = React.useRef(void 0);
140
+ const handleValueChange = React.useCallback(
141
+ (val) => {
142
+ if (!isControlled) {
143
+ setInternalValue(val);
144
+ }
145
+ onValueChange?.(val);
146
+ },
147
+ [isControlled, onValueChange]
148
+ );
149
+ const [isSearching, setIsSearching] = React.useState(loading);
150
+ const handleSearch = React.useCallback(
151
+ (val) => {
152
+ if (debounceRef.current !== void 0) {
153
+ clearTimeout(debounceRef.current);
154
+ }
155
+ if (val.length > 0) {
156
+ setIsSearching(true);
157
+ debounceRef.current = setTimeout(() => {
158
+ onSearch?.(val);
159
+ setIsSearching(false);
160
+ }, debounceMs);
161
+ } else {
162
+ setIsSearching(false);
163
+ }
164
+ },
165
+ [onSearch, debounceMs]
166
+ );
167
+ const handleChange = React.useCallback(
168
+ (e) => {
169
+ const val = e.target.value;
170
+ handleValueChange(val);
171
+ handleSearch(val);
172
+ },
173
+ [handleValueChange, handleSearch]
174
+ );
175
+ const clear = React.useCallback(() => {
176
+ if (debounceRef.current !== void 0) {
177
+ clearTimeout(debounceRef.current);
178
+ }
179
+ handleValueChange("");
180
+ setIsSearching(false);
181
+ }, [handleValueChange]);
182
+ const api = React.useMemo(
183
+ () => createSearchBar({
184
+ value: currentValue,
185
+ onValueChange: handleValueChange,
186
+ onSearch,
187
+ debounceMs,
188
+ placeholder,
189
+ loading
190
+ }),
191
+ [currentValue, handleValueChange, onSearch, debounceMs, placeholder, loading]
192
+ );
193
+ const handleKeyDown = React.useCallback(
194
+ (e) => {
195
+ if (e.key === "Escape") {
196
+ clear();
197
+ } else if (e.key === "Enter") {
198
+ if (debounceRef.current !== void 0) {
199
+ clearTimeout(debounceRef.current);
200
+ }
201
+ onSearch?.(currentValue);
202
+ setIsSearching(false);
203
+ }
204
+ },
205
+ [clear, onSearch, currentValue]
206
+ );
207
+ const ctx = React.useMemo(
208
+ () => ({ api, value: currentValue, isSearching, setValue: handleValueChange, clear }),
209
+ [api, currentValue, isSearching, handleValueChange, clear]
210
+ );
211
+ return React.createElement(
212
+ SearchBarContext.Provider,
213
+ { value: ctx },
214
+ React.createElement(
215
+ "div",
216
+ { className: cn(searchBarVariants(), className) },
217
+ React.createElement("span", { className: "rfr-search-icon", "aria-hidden": "true" }, "\u{1F50D}"),
218
+ React.createElement("input", {
219
+ ref,
220
+ ...inputProps,
221
+ role: api.inputProps.role,
222
+ "aria-expanded": api.inputProps["aria-expanded"],
223
+ "aria-controls": api.inputProps["aria-controls"],
224
+ "aria-autocomplete": api.inputProps["aria-autocomplete"],
225
+ value: currentValue,
226
+ placeholder,
227
+ onChange: handleChange,
228
+ onKeyDown: handleKeyDown,
229
+ className: "rfr-search-input flex-1 bg-transparent outline-none"
230
+ }),
231
+ isSearching && React.createElement("span", { className: "rfr-search-spinner", "aria-label": "Loading" }, "\u23F3"),
232
+ currentValue.length > 0 && !isSearching && React.createElement(
233
+ "button",
234
+ {
235
+ type: "button",
236
+ className: "rfr-search-clear",
237
+ onClick: clear,
238
+ "aria-label": "Clear search"
239
+ },
240
+ "\u2715"
241
+ )
242
+ ),
243
+ children
244
+ );
245
+ }
246
+ );
247
+ var SearchResults = React.forwardRef(
248
+ function SearchResults2({ className, children, ...props }, ref) {
249
+ const { api, value } = useSearchBarContext();
250
+ if (value.length === 0) return null;
251
+ return React.createElement(
252
+ "ul",
253
+ {
254
+ ref,
255
+ role: api.listProps.role,
256
+ id: api.listProps.id,
257
+ className: cn(searchResultVariants(), className),
258
+ ...props
259
+ },
260
+ children
261
+ );
262
+ }
263
+ );
264
+ var SearchResultItem = React.forwardRef(
265
+ function SearchResultItem2({ className, children, ...props }, ref) {
266
+ return React.createElement(
267
+ "li",
268
+ {
269
+ ref,
270
+ role: "option",
271
+ className: cn("px-3 py-2 cursor-pointer hover:bg-accent", className),
272
+ ...props
273
+ },
274
+ children
275
+ );
276
+ }
277
+ );
278
+ export {
279
+ SearchBar,
280
+ SearchResultItem,
281
+ SearchResults,
282
+ searchBarVariants,
283
+ searchResultVariants
284
+ };
285
+ //# sourceMappingURL=react-search-bar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../search-bar/src/search-bar.ts", "../../search-bar/src/search-bar.styles.ts", "../../react-search-bar/src/search-bar.tsx"],
4
+ "sourcesContent": ["import type { KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { generateId, Keys, createKeyboardHandler } from '@refraction-ui/shared'\n\nexport interface SearchBarProps {\n value?: string\n onValueChange?: (value: string) => void\n onSearch?: (value: string) => void\n debounceMs?: number\n placeholder?: string\n loading?: boolean\n}\n\nexport interface SearchBarAPI {\n /** Current state */\n state: { value: string; isSearching: boolean }\n /** Props to spread on the input element */\n inputProps: {\n role: 'combobox'\n 'aria-expanded': boolean\n 'aria-controls': string\n 'aria-autocomplete': 'list'\n }\n /** Props to spread on the results list element */\n listProps: {\n role: 'listbox'\n id: string\n }\n /** Set the search value */\n setValue: (value: string) => void\n /** Clear the search value */\n clear: () => void\n /** Keyboard handler map */\n keyboardHandlers: KeyboardHandlerMap\n /** Pre-built keyboard event handler */\n handleKeyDown: (event: KeyboardEvent) => void\n}\n\nexport function createSearchBar(props: SearchBarProps = {}): SearchBarAPI {\n const {\n value: initialValue = '',\n onValueChange,\n onSearch,\n debounceMs = 300,\n placeholder: _placeholder,\n loading = false,\n } = props\n\n const listId = generateId('rfr-search-list')\n\n let currentValue = initialValue\n let isSearching = loading\n let debounceTimer: ReturnType<typeof setTimeout> | undefined\n\n const state = { value: currentValue, isSearching }\n\n function setValue(value: string) {\n currentValue = value\n state.value = value\n onValueChange?.(value)\n\n if (debounceTimer !== undefined) {\n clearTimeout(debounceTimer)\n }\n\n if (value.length > 0) {\n isSearching = true\n state.isSearching = true\n debounceTimer = setTimeout(() => {\n onSearch?.(value)\n isSearching = false\n state.isSearching = false\n }, debounceMs)\n } else {\n isSearching = false\n state.isSearching = false\n }\n }\n\n function clear() {\n if (debounceTimer !== undefined) {\n clearTimeout(debounceTimer)\n }\n currentValue = ''\n state.value = ''\n isSearching = false\n state.isSearching = false\n onValueChange?.('')\n }\n\n const inputProps = {\n role: 'combobox' as const,\n 'aria-expanded': currentValue.length > 0,\n 'aria-controls': listId,\n 'aria-autocomplete': 'list' as const,\n }\n\n const listProps = {\n role: 'listbox' as const,\n id: listId,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.ArrowDown]: () => {\n // Focus first result - signaled via handler\n },\n [Keys.Escape]: () => {\n clear()\n },\n [Keys.Enter]: () => {\n if (debounceTimer !== undefined) {\n clearTimeout(debounceTimer)\n }\n onSearch?.(currentValue)\n isSearching = false\n state.isSearching = false\n },\n }\n\n const handleKeyDown = createKeyboardHandler(keyboardHandlers)\n\n return {\n state,\n inputProps,\n listProps,\n setValue,\n clear,\n keyboardHandlers,\n handleKeyDown,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const searchBarVariants = cva({\n base: 'relative flex items-center w-full rounded-md border bg-background text-foreground',\n variants: {\n size: {\n sm: 'h-8 text-sm px-2',\n md: 'h-10 text-base px-3',\n lg: 'h-12 text-lg px-4',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const searchResultVariants = cva({\n base: 'absolute top-full left-0 w-full mt-1 rounded-md border bg-popover text-popover-foreground shadow-md z-50 overflow-hidden',\n variants: {\n size: {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n", "import * as React from 'react'\nimport {\n createSearchBar,\n searchBarVariants,\n searchResultVariants,\n type SearchBarAPI,\n} from '@refraction-ui/search-bar'\nimport { cn, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface SearchBarContextValue {\n api: SearchBarAPI\n value: string\n isSearching: boolean\n setValue: (value: string) => void\n clear: () => void\n}\n\nconst SearchBarContext = React.createContext<SearchBarContextValue | null>(null)\n\nfunction useSearchBarContext(): SearchBarContextValue {\n const ctx = React.useContext(SearchBarContext)\n if (!ctx) {\n devWarn(\n 'react-search-bar/compound-outside-provider',\n 'A SearchBar compound component was rendered outside of <SearchBar>. Wrap it in <SearchBar>.',\n )\n throw new Error('SearchBar compound components must be used within <SearchBar>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* SearchBar (root provider + input) */\n/* ------------------------------------------------------------------ */\n\nexport interface SearchBarProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n onSearch?: (value: string) => void\n debounceMs?: number\n loading?: boolean\n children?: React.ReactNode\n}\n\nexport const SearchBar = React.forwardRef<HTMLInputElement, SearchBarProps>(\n function SearchBar({ value: controlledValue, defaultValue = '', onValueChange, onSearch, debounceMs = 300, loading = false, placeholder, className, children, ...inputProps }, ref) {\n const [internalValue, setInternalValue] = React.useState(controlledValue ?? defaultValue)\n const isControlled = controlledValue !== undefined\n const currentValue = isControlled ? controlledValue : internalValue\n\n const debounceRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const handleValueChange = React.useCallback(\n (val: string) => {\n if (!isControlled) {\n setInternalValue(val)\n }\n onValueChange?.(val)\n },\n [isControlled, onValueChange],\n )\n\n const [isSearching, setIsSearching] = React.useState(loading)\n\n const handleSearch = React.useCallback(\n (val: string) => {\n if (debounceRef.current !== undefined) {\n clearTimeout(debounceRef.current)\n }\n if (val.length > 0) {\n setIsSearching(true)\n debounceRef.current = setTimeout(() => {\n onSearch?.(val)\n setIsSearching(false)\n }, debounceMs)\n } else {\n setIsSearching(false)\n }\n },\n [onSearch, debounceMs],\n )\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n handleValueChange(val)\n handleSearch(val)\n },\n [handleValueChange, handleSearch],\n )\n\n const clear = React.useCallback(() => {\n if (debounceRef.current !== undefined) {\n clearTimeout(debounceRef.current)\n }\n handleValueChange('')\n setIsSearching(false)\n }, [handleValueChange])\n\n const api = React.useMemo(\n () =>\n createSearchBar({\n value: currentValue,\n onValueChange: handleValueChange,\n onSearch,\n debounceMs,\n placeholder,\n loading,\n }),\n [currentValue, handleValueChange, onSearch, debounceMs, placeholder, loading],\n )\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n clear()\n } else if (e.key === 'Enter') {\n if (debounceRef.current !== undefined) {\n clearTimeout(debounceRef.current)\n }\n onSearch?.(currentValue)\n setIsSearching(false)\n }\n },\n [clear, onSearch, currentValue],\n )\n\n const ctx = React.useMemo<SearchBarContextValue>(\n () => ({ api, value: currentValue, isSearching, setValue: handleValueChange, clear }),\n [api, currentValue, isSearching, handleValueChange, clear],\n )\n\n return React.createElement(\n SearchBarContext.Provider,\n { value: ctx },\n React.createElement(\n 'div',\n { className: cn(searchBarVariants(), className) },\n React.createElement('span', { className: 'rfr-search-icon', 'aria-hidden': 'true' }, '\\u{1F50D}'),\n React.createElement('input', {\n ref,\n ...inputProps,\n role: api.inputProps.role,\n 'aria-expanded': api.inputProps['aria-expanded'],\n 'aria-controls': api.inputProps['aria-controls'],\n 'aria-autocomplete': api.inputProps['aria-autocomplete'],\n value: currentValue,\n placeholder,\n onChange: handleChange,\n onKeyDown: handleKeyDown,\n className: 'rfr-search-input flex-1 bg-transparent outline-none',\n }),\n isSearching &&\n React.createElement('span', { className: 'rfr-search-spinner', 'aria-label': 'Loading' }, '\\u{23F3}'),\n currentValue.length > 0 &&\n !isSearching &&\n React.createElement(\n 'button',\n {\n type: 'button',\n className: 'rfr-search-clear',\n onClick: clear,\n 'aria-label': 'Clear search',\n },\n '\\u{2715}',\n ),\n ),\n children,\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* SearchResults (dropdown list) */\n/* ------------------------------------------------------------------ */\n\nexport interface SearchResultsProps extends React.HTMLAttributes<HTMLUListElement> {}\n\nexport const SearchResults = React.forwardRef<HTMLUListElement, SearchResultsProps>(\n function SearchResults({ className, children, ...props }, ref) {\n const { api, value } = useSearchBarContext()\n\n if (value.length === 0) return null\n\n return React.createElement(\n 'ul',\n {\n ref,\n role: api.listProps.role,\n id: api.listProps.id,\n className: cn(searchResultVariants(), className),\n ...props,\n },\n children,\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* SearchResultItem */\n/* ------------------------------------------------------------------ */\n\nexport interface SearchResultItemProps extends React.LiHTMLAttributes<HTMLLIElement> {}\n\nexport const SearchResultItem = React.forwardRef<HTMLLIElement, SearchResultItemProps>(\n function SearchResultItem({ className, children, ...props }, ref) {\n return React.createElement(\n 'li',\n {\n ref,\n role: 'option',\n className: cn('px-3 py-2 cursor-pointer hover:bg-accent', className),\n ...props,\n },\n children,\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["SearchBar", "SearchResults", "SearchResultItem"]
7
+ }
@@ -0,0 +1,65 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-section-head/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../section-head/dist/index.js
10
+ function createSectionHead(props = {}) {
11
+ const { align = "center" } = props;
12
+ const dataAttributes = {
13
+ "data-align": align
14
+ };
15
+ return { dataAttributes };
16
+ }
17
+ var sectionHeadVariants = cva({
18
+ base: "flex flex-col",
19
+ variants: {
20
+ align: {
21
+ center: "mx-auto text-center max-w-2xl",
22
+ left: "text-left"
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ align: "center"
27
+ }
28
+ });
29
+ var sectionHeadKickerClass = "text-[11px] uppercase tracking-widest text-primary font-semibold";
30
+ var sectionHeadTitleClass = "text-3xl sm:text-4xl font-bold tracking-tight text-foreground";
31
+ var sectionHeadLedeClass = "mt-3 text-muted-foreground leading-relaxed";
32
+
33
+ // ../react-section-head/dist/index.js
34
+ import { jsxs, jsx } from "react/jsx-runtime";
35
+ var SectionHead = React.forwardRef(
36
+ function SectionHead2({
37
+ kicker,
38
+ title,
39
+ lede,
40
+ align = "center",
41
+ as: Tag = "h2",
42
+ className,
43
+ ...props
44
+ }, ref) {
45
+ const { dataAttributes } = createSectionHead({ align });
46
+ return /* @__PURE__ */ jsxs(
47
+ "div",
48
+ {
49
+ ref,
50
+ className: cn(sectionHeadVariants({ align }), className),
51
+ ...dataAttributes,
52
+ ...props,
53
+ children: [
54
+ kicker != null && /* @__PURE__ */ jsx("p", { className: sectionHeadKickerClass, children: kicker }),
55
+ /* @__PURE__ */ jsx(Tag, { className: sectionHeadTitleClass, children: title }),
56
+ lede != null && /* @__PURE__ */ jsx("p", { className: sectionHeadLedeClass, children: lede })
57
+ ]
58
+ }
59
+ );
60
+ }
61
+ );
62
+ export {
63
+ SectionHead
64
+ };
65
+ //# sourceMappingURL=react-section-head.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../section-head/src/section-head.ts", "../../section-head/src/section-head.styles.ts", "../../react-section-head/src/section-head.tsx"],
4
+ "sourcesContent": ["/** Horizontal alignment of the section head cluster. */\nexport type SectionHeadAlign = 'center' | 'left'\n\nexport interface SectionHeadProps {\n /** Alignment of the kicker, title, and lede. */\n align?: SectionHeadAlign\n}\n\nexport interface SectionHeadAPI {\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the framework-agnostic data attributes for a SectionHead.\n *\n * Returns data-align so adapters can apply styles via CSS or Tailwind\n * variants. All visual logic (classes, cva) lives in `section-head.styles.ts`.\n */\nexport function createSectionHead(props: SectionHeadProps = {}): SectionHeadAPI {\n const { align = 'center' } = props\n\n const dataAttributes: Record<string, string> = {\n 'data-align': align,\n }\n\n return { dataAttributes }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * Container variant that controls the alignment of the whole cluster.\n * Center: auto-margins + text-center + constrained max-width for comfortable\n * line length. Left: no margin constraint, flush left.\n */\nexport const sectionHeadVariants = cva({\n base: 'flex flex-col',\n variants: {\n align: {\n center: 'mx-auto text-center max-w-2xl',\n left: 'text-left',\n },\n },\n defaultVariants: {\n align: 'center',\n },\n})\n\n/** Small-caps eyebrow label above the title. */\nexport const sectionHeadKickerClass =\n 'text-[11px] uppercase tracking-widest text-primary font-semibold'\n\n/** Primary h2 heading. */\nexport const sectionHeadTitleClass =\n 'text-3xl sm:text-4xl font-bold tracking-tight text-foreground'\n\n/** Optional lede paragraph below the title. */\nexport const sectionHeadLedeClass = 'mt-3 text-muted-foreground leading-relaxed'\n", "import * as React from 'react'\nimport {\n createSectionHead,\n sectionHeadVariants,\n sectionHeadKickerClass,\n sectionHeadTitleClass,\n sectionHeadLedeClass,\n type SectionHeadAlign,\n} from '@refraction-ui/section-head'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { SectionHeadAlign }\n\nexport interface SectionHeadProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Optional eyebrow / kicker rendered above the title. */\n kicker?: React.ReactNode\n /** Primary heading content (required). */\n title: React.ReactNode\n /** Optional lede paragraph rendered below the title. */\n lede?: React.ReactNode\n /** Horizontal alignment of the cluster. */\n align?: SectionHeadAlign\n /** Override the heading element rendered for the title. Defaults to `h2`. */\n as?: 'h1' | 'h2' | 'h3'\n}\n\n/**\n * SectionHead — marketing section heading cluster.\n *\n * Renders an optional small-caps kicker above an `<h2>` title (configurable\n * via `as`) with an optional lede paragraph below. Alignment is controlled via\n * the `align` prop; layout classes come from the headless\n * `@refraction-ui/section-head` core.\n */\nexport const SectionHead = React.forwardRef<HTMLDivElement, SectionHeadProps>(\n function SectionHead(\n {\n kicker,\n title,\n lede,\n align = 'center',\n as: Tag = 'h2',\n className,\n ...props\n },\n ref,\n ) {\n const { dataAttributes } = createSectionHead({ align })\n\n return (\n <div\n ref={ref}\n className={cn(sectionHeadVariants({ align }), className)}\n {...dataAttributes}\n {...props}\n >\n {kicker != null && (\n <p className={sectionHeadKickerClass}>{kicker}</p>\n )}\n <Tag className={sectionHeadTitleClass}>{title}</Tag>\n {lede != null && (\n <p className={sectionHeadLedeClass}>{lede}</p>\n )}\n </div>\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;AAmBO,SAAS,kBAAkB,QAA0B,CAAA,GAAoB;AAC9E,QAAM,EAAE,QAAQ,SAAA,IAAa;AAE7B,QAAM,iBAAyC;IAC7C,cAAc;EAAA;AAGhB,SAAO,EAAE,eAAA;AACX;ACpBO,IAAM,sBAAsB,IAAI;EACrC,MAAM;EACN,UAAU;IACR,OAAO;MACL,QAAQ;MACR,MAAM;IAAA;EACR;EAEF,iBAAiB;IACf,OAAO;EAAA;AAEX,CAAC;AAGM,IAAM,yBACX;AAGK,IAAM,wBACX;AAGK,IAAM,uBAAuB;;;;ACM7B,IAAM,cAAoB;EAC/B,SAASA,aACP;IACE;IACA;IACA;IACA,QAAQ;IACR,IAAI,MAAM;IACV;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,EAAE,eAAA,IAAmB,kBAAkB,EAAE,MAAA,CAAO;AAEtD,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,oBAAoB,EAAE,MAAA,CAAO,GAAG,SAAS;QACtD,GAAG;QACH,GAAG;QAEH,UAAA;UAAA,UAAU,QACT,oBAAC,KAAA,EAAE,WAAW,wBAAyB,UAAA,OAAA,CAAO;UAEhD,oBAAC,KAAA,EAAI,WAAW,uBAAwB,UAAA,MAAA,CAAM;UAC7C,QAAQ,QACP,oBAAC,KAAA,EAAE,WAAW,sBAAuB,UAAA,KAAA,CAAK;QAAA;MAAA;IAAA;EAIlD;AACF;",
6
+ "names": ["SectionHead"]
7
+ }
@@ -0,0 +1,215 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-segmented-control/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../segmented-control/dist/index.js
10
+ function createSegmentedControl(props = {}) {
11
+ const { value, size = "md" } = props;
12
+ const ariaProps = {
13
+ role: "radiogroup"
14
+ };
15
+ const dataAttributes = {
16
+ "data-size": size
17
+ };
18
+ if (value !== void 0) {
19
+ dataAttributes["data-value"] = value;
20
+ }
21
+ return { ariaProps, dataAttributes };
22
+ }
23
+ function getNextSegmentIndex(current, key, count) {
24
+ if (count <= 0) return current;
25
+ switch (key) {
26
+ case "ArrowRight":
27
+ case "ArrowDown":
28
+ return (current + 1) % count;
29
+ case "ArrowLeft":
30
+ case "ArrowUp":
31
+ return (current - 1 + count) % count;
32
+ case "Home":
33
+ return 0;
34
+ case "End":
35
+ return count - 1;
36
+ default:
37
+ return current;
38
+ }
39
+ }
40
+ var segmentedControlVariants = cva({
41
+ base: "inline-flex items-center gap-1 rounded-lg bg-muted p-1",
42
+ variants: {
43
+ size: {
44
+ sm: "",
45
+ md: ""
46
+ }
47
+ },
48
+ defaultVariants: {
49
+ size: "md"
50
+ }
51
+ });
52
+ var segmentedControlItemVariants = cva({
53
+ base: [
54
+ "inline-flex items-center justify-center gap-1.5 rounded-md font-medium",
55
+ "whitespace-nowrap transition-colors",
56
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
57
+ "focus-visible:ring-offset-2 focus-visible:ring-offset-muted"
58
+ ].join(" "),
59
+ variants: {
60
+ size: {
61
+ sm: "px-2.5 py-1 text-xs",
62
+ md: "px-3 py-1.5 text-sm"
63
+ },
64
+ state: {
65
+ checked: "bg-background text-foreground shadow-sm",
66
+ unchecked: "text-muted-foreground hover:text-foreground"
67
+ }
68
+ },
69
+ defaultVariants: {
70
+ size: "md",
71
+ state: "unchecked"
72
+ }
73
+ });
74
+
75
+ // ../react-segmented-control/dist/index.js
76
+ import { jsx } from "react/jsx-runtime";
77
+ var SegmentedControlContext = React.createContext(null);
78
+ function useSegmentedControlContext(component) {
79
+ const ctx = React.useContext(SegmentedControlContext);
80
+ if (!ctx) {
81
+ throw new Error(`<${component}> must be used within <SegmentedControl>`);
82
+ }
83
+ return ctx;
84
+ }
85
+ var SegmentedControl = React.forwardRef(
86
+ function SegmentedControl2({
87
+ value: valueProp,
88
+ defaultValue,
89
+ onValueChange,
90
+ size = "md",
91
+ className,
92
+ children,
93
+ ...props
94
+ }, ref) {
95
+ const isControlled = valueProp !== void 0;
96
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
97
+ const value = isControlled ? valueProp : internalValue;
98
+ const itemsRef = React.useRef([]);
99
+ const select = React.useCallback(
100
+ (next) => {
101
+ if (!isControlled) setInternalValue(next);
102
+ onValueChange?.(next);
103
+ },
104
+ [isControlled, onValueChange]
105
+ );
106
+ const register = React.useCallback((itemValue, focus) => {
107
+ const entry = { value: itemValue, focus };
108
+ itemsRef.current.push(entry);
109
+ return () => {
110
+ itemsRef.current = itemsRef.current.filter((e) => e !== entry);
111
+ };
112
+ }, []);
113
+ const move = React.useCallback(
114
+ (from, key) => {
115
+ const items = itemsRef.current;
116
+ const currentIndex = items.findIndex((e) => e.value === from);
117
+ if (currentIndex === -1) return;
118
+ const targetIndex = getNextSegmentIndex(currentIndex, key, items.length);
119
+ if (targetIndex === currentIndex) return;
120
+ const target = items[targetIndex];
121
+ select(target.value);
122
+ target.focus();
123
+ },
124
+ [select]
125
+ );
126
+ const ctx = React.useMemo(
127
+ () => ({ value, size, select, register, move }),
128
+ [value, size, select, register, move]
129
+ );
130
+ const api = createSegmentedControl({ value, size });
131
+ return /* @__PURE__ */ jsx(SegmentedControlContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
132
+ "div",
133
+ {
134
+ ref,
135
+ className: cn(segmentedControlVariants({ size }), className),
136
+ ...api.ariaProps,
137
+ ...api.dataAttributes,
138
+ ...props,
139
+ children
140
+ }
141
+ ) });
142
+ }
143
+ );
144
+ var SegmentedControlItem = React.forwardRef(function SegmentedControlItem2({ value, className, children, onKeyDown, onClick, ...props }, ref) {
145
+ const ctx = useSegmentedControlContext("SegmentedControlItem");
146
+ const selected = ctx.value === value;
147
+ const internalRef = React.useRef(null);
148
+ const mergedRef = React.useCallback(
149
+ (node) => {
150
+ internalRef.current = node;
151
+ if (typeof ref === "function") ref(node);
152
+ else if (ref) ref.current = node;
153
+ },
154
+ [ref]
155
+ );
156
+ React.useEffect(() => {
157
+ return ctx.register(value, () => internalRef.current?.focus());
158
+ }, [ctx, value]);
159
+ const handleKeyDown = (event) => {
160
+ onKeyDown?.(event);
161
+ if (event.defaultPrevented) return;
162
+ switch (event.key) {
163
+ case "ArrowRight":
164
+ case "ArrowDown":
165
+ case "ArrowLeft":
166
+ case "ArrowUp":
167
+ case "Home":
168
+ case "End":
169
+ event.preventDefault();
170
+ ctx.move(value, event.key);
171
+ break;
172
+ case " ":
173
+ case "Enter":
174
+ event.preventDefault();
175
+ ctx.select(value);
176
+ break;
177
+ }
178
+ };
179
+ const handleClick = (event) => {
180
+ onClick?.(event);
181
+ if (event.defaultPrevented) return;
182
+ ctx.select(value);
183
+ };
184
+ return /* @__PURE__ */ jsx(
185
+ "button",
186
+ {
187
+ ref: mergedRef,
188
+ type: "button",
189
+ role: "radio",
190
+ "aria-checked": selected,
191
+ tabIndex: selected ? 0 : -1,
192
+ "data-state": selected ? "checked" : "unchecked",
193
+ className: cn(
194
+ segmentedControlItemVariants({
195
+ size: ctx.size,
196
+ state: selected ? "checked" : "unchecked"
197
+ }),
198
+ className
199
+ ),
200
+ onKeyDown: handleKeyDown,
201
+ onClick: handleClick,
202
+ ...props,
203
+ children
204
+ }
205
+ );
206
+ });
207
+ export {
208
+ SegmentedControl,
209
+ SegmentedControlItem,
210
+ createSegmentedControl,
211
+ getNextSegmentIndex,
212
+ segmentedControlItemVariants,
213
+ segmentedControlVariants
214
+ };
215
+ //# sourceMappingURL=react-segmented-control.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../segmented-control/src/segmented-control.ts", "../../segmented-control/src/segmented-control.styles.ts", "../../react-segmented-control/src/segmented-control.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\n\nexport type SegmentedControlSize = 'sm' | 'md'\n\n/** Value identifying a single segment. */\nexport type SegmentedControlValue = string\n\nexport interface SegmentedControlProps {\n /** Currently selected segment value (controlled). */\n value?: SegmentedControlValue\n /** Visual size of the control. */\n size?: SegmentedControlSize\n}\n\nexport interface SegmentedControlAPI {\n /** ARIA attributes to spread on the group element. */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for CSS styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Build the framework-agnostic group props for a segmented control.\n *\n * Returns `role=\"radiogroup\"` plus data attributes; adapters spread these\n * onto their group element and handle their own rendering/state.\n */\nexport function createSegmentedControl(\n props: SegmentedControlProps = {},\n): SegmentedControlAPI {\n const { value, size = 'md' } = props\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'radiogroup',\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-size': size,\n }\n if (value !== undefined) {\n dataAttributes['data-value'] = value\n }\n\n return { ariaProps, dataAttributes }\n}\n\n/**\n * Pure keyboard-navigation rule shared by every adapter.\n *\n * Given the current index, the pressed key, and the item count, returns the\n * index that focus/selection should move to. Arrow keys wrap; Home/End jump\n * to the ends. Unhandled keys (or an empty group) return `current` unchanged.\n *\n * - ArrowRight / ArrowDown → next (wraps to 0 past the end)\n * - ArrowLeft / ArrowUp → previous (wraps to last before 0)\n * - Home → first\n * - End → last\n */\nexport function getNextSegmentIndex(\n current: number,\n key: string,\n count: number,\n): number {\n if (count <= 0) return current\n\n switch (key) {\n case 'ArrowRight':\n case 'ArrowDown':\n return (current + 1) % count\n case 'ArrowLeft':\n case 'ArrowUp':\n return (current - 1 + count) % count\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return current\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/** Pill-shaped container that holds the segments (`role=\"radiogroup\"`). */\nexport const segmentedControlVariants = cva({\n base: 'inline-flex items-center gap-1 rounded-lg bg-muted p-1',\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\n/**\n * A single segment (`role=\"radio\"`). The `state` variant carries the\n * active vs inactive visual treatment so adapters never inline these classes.\n */\nexport const segmentedControlItemVariants = cva({\n base: [\n 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium',\n 'whitespace-nowrap transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'focus-visible:ring-offset-2 focus-visible:ring-offset-muted',\n ].join(' '),\n variants: {\n size: {\n sm: 'px-2.5 py-1 text-xs',\n md: 'px-3 py-1.5 text-sm',\n },\n state: {\n checked: 'bg-background text-foreground shadow-sm',\n unchecked: 'text-muted-foreground hover:text-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n state: 'unchecked',\n },\n})\n", "import * as React from 'react'\nimport {\n createSegmentedControl,\n getNextSegmentIndex,\n segmentedControlVariants,\n segmentedControlItemVariants,\n type SegmentedControlSize,\n} from '@refraction-ui/segmented-control'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { SegmentedControlSize }\n\ninterface SegmentedControlContextValue {\n value: string | undefined\n size: SegmentedControlSize\n select: (value: string) => void\n /** Register an item's value + focus handler; returns an unregister fn. */\n register: (value: string, focus: () => void) => () => void\n /** Move selection/focus relative to the given item value via a keyboard key. */\n move: (from: string, key: string) => void\n}\n\nconst SegmentedControlContext =\n React.createContext<SegmentedControlContextValue | null>(null)\n\nfunction useSegmentedControlContext(component: string) {\n const ctx = React.useContext(SegmentedControlContext)\n if (!ctx) {\n throw new Error(`<${component}> must be used within <SegmentedControl>`)\n }\n return ctx\n}\n\nexport interface SegmentedControlProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onChange' | 'defaultValue'\n > {\n /** Controlled selected item value. */\n value?: string\n /** Initial selected value for uncontrolled usage. */\n defaultValue?: string\n /** Called with the newly selected item value. */\n onValueChange?: (value: string) => void\n /** Visual size of the control. */\n size?: SegmentedControlSize\n}\n\ninterface ItemRegistration {\n value: string\n focus: () => void\n}\n\n/**\n * SegmentedControl — a pill-shaped single-select control with radio semantics.\n *\n * Renders `role=\"radiogroup\"`; each {@link SegmentedControlItem} is a\n * `role=\"radio\"`. Supports controlled (`value`/`onValueChange`) and\n * uncontrolled (`defaultValue`) usage, roving tabindex, arrow-key navigation\n * with wrap, and Home/End jumps. Logic/styles come from the headless\n * `@refraction-ui/segmented-control` core; styling via Tailwind utilities only.\n */\nexport const SegmentedControl = React.forwardRef<\n HTMLDivElement,\n SegmentedControlProps\n>(\n function SegmentedControl(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n size = 'md',\n className,\n children,\n ...props\n },\n ref,\n ) {\n const isControlled = valueProp !== undefined\n const [internalValue, setInternalValue] = React.useState<\n string | undefined\n >(defaultValue)\n const value = isControlled ? valueProp : internalValue\n\n // Ordered registry of items, used for arrow-key navigation.\n const itemsRef = React.useRef<ItemRegistration[]>([])\n\n const select = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next)\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n const register = React.useCallback((itemValue: string, focus: () => void) => {\n const entry: ItemRegistration = { value: itemValue, focus }\n itemsRef.current.push(entry)\n return () => {\n itemsRef.current = itemsRef.current.filter((e) => e !== entry)\n }\n }, [])\n\n const move = React.useCallback(\n (from: string, key: string) => {\n const items = itemsRef.current\n const currentIndex = items.findIndex((e) => e.value === from)\n if (currentIndex === -1) return\n\n const targetIndex = getNextSegmentIndex(currentIndex, key, items.length)\n if (targetIndex === currentIndex) return\n\n const target = items[targetIndex]\n select(target.value)\n target.focus()\n },\n [select],\n )\n\n const ctx = React.useMemo<SegmentedControlContextValue>(\n () => ({ value, size, select, register, move }),\n [value, size, select, register, move],\n )\n\n const api = createSegmentedControl({ value, size })\n\n return (\n <SegmentedControlContext.Provider value={ctx}>\n <div\n ref={ref}\n className={cn(segmentedControlVariants({ size }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {children}\n </div>\n </SegmentedControlContext.Provider>\n )\n },\n)\n\nexport interface SegmentedControlItemProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n /** Value identifying this item; selected when it matches the group value. */\n value: string\n}\n\n/**\n * SegmentedControlItem — a single selectable segment (`role=\"radio\"`).\n *\n * Children may include a leading icon. Only the active item is tabbable\n * (roving tabindex); arrow/Home/End keys delegate navigation to the group,\n * which applies the shared `getNextSegmentIndex` rule from the core.\n */\nexport const SegmentedControlItem = React.forwardRef<\n HTMLButtonElement,\n SegmentedControlItemProps\n>(function SegmentedControlItem({ value, className, children, onKeyDown, onClick, ...props }, ref) {\n const ctx = useSegmentedControlContext('SegmentedControlItem')\n const selected = ctx.value === value\n\n const internalRef = React.useRef<HTMLButtonElement>(null)\n const mergedRef = React.useCallback(\n (node: HTMLButtonElement | null) => {\n internalRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n },\n [ref],\n )\n\n React.useEffect(() => {\n return ctx.register(value, () => internalRef.current?.focus())\n }, [ctx, value])\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n event.preventDefault()\n ctx.move(value, event.key)\n break\n case ' ':\n case 'Enter':\n event.preventDefault()\n ctx.select(value)\n break\n }\n }\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n ctx.select(value)\n }\n\n return (\n <button\n ref={mergedRef}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n tabIndex={selected ? 0 : -1}\n data-state={selected ? 'checked' : 'unchecked'}\n className={cn(\n segmentedControlItemVariants({\n size: ctx.size,\n state: selected ? 'checked' : 'unchecked',\n }),\n className,\n )}\n onKeyDown={handleKeyDown}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["SegmentedControl", "SegmentedControlItem"]
7
+ }