@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,216 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-inline-editor/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../inline-editor/dist/index.js
10
+ function createInlineEditor(props) {
11
+ const { value: initialValue, onSave, onCancel } = props;
12
+ let isEditing = false;
13
+ let currentValue = initialValue;
14
+ const toolbarActions = [
15
+ { name: "bold", syntax: "**" },
16
+ { name: "heading", syntax: "# " },
17
+ { name: "list", syntax: "- " },
18
+ { name: "link", syntax: "[text](url)" }
19
+ ];
20
+ function startEditing() {
21
+ isEditing = true;
22
+ currentValue = initialValue;
23
+ }
24
+ function cancel() {
25
+ isEditing = false;
26
+ currentValue = initialValue;
27
+ onCancel?.();
28
+ }
29
+ function save() {
30
+ isEditing = false;
31
+ onSave?.(currentValue);
32
+ }
33
+ function updateValue(value) {
34
+ currentValue = value;
35
+ }
36
+ function insertAtCursor(syntax) {
37
+ currentValue = currentValue + syntax;
38
+ }
39
+ return {
40
+ get state() {
41
+ return {
42
+ get isEditing() {
43
+ return isEditing;
44
+ },
45
+ get value() {
46
+ return currentValue;
47
+ },
48
+ get preview() {
49
+ return currentValue;
50
+ }
51
+ };
52
+ },
53
+ startEditing,
54
+ cancel,
55
+ save,
56
+ updateValue,
57
+ insertAtCursor,
58
+ toolbarActions
59
+ };
60
+ }
61
+ var editorVariants = cva({
62
+ base: "w-full rounded-md border bg-background",
63
+ variants: {
64
+ state: {
65
+ viewing: "cursor-pointer hover:bg-muted/50 p-3",
66
+ editing: "p-0"
67
+ }
68
+ },
69
+ defaultVariants: {
70
+ state: "viewing"
71
+ }
72
+ });
73
+ var toolbarVariants = cva({
74
+ base: "flex items-center gap-1 border-b px-2 py-1",
75
+ variants: {
76
+ size: {
77
+ sm: "gap-0.5 px-1 py-0.5",
78
+ md: "gap-1 px-2 py-1",
79
+ lg: "gap-2 px-3 py-2"
80
+ }
81
+ },
82
+ defaultVariants: {
83
+ size: "md"
84
+ }
85
+ });
86
+ var previewVariants = cva({
87
+ base: "prose prose-sm max-w-none p-3",
88
+ variants: {
89
+ size: {
90
+ sm: "prose-xs p-2",
91
+ md: "prose-sm p-3",
92
+ lg: "prose-base p-4"
93
+ }
94
+ },
95
+ defaultVariants: {
96
+ size: "md"
97
+ }
98
+ });
99
+
100
+ // ../react-inline-editor/dist/index.js
101
+ var InlineEditor = React.forwardRef(
102
+ function InlineEditor2({ value: initialValue, onSave, onCancel, className }, ref) {
103
+ const [isEditing, setIsEditing] = React.useState(false);
104
+ const [editValue, setEditValue] = React.useState(initialValue);
105
+ const apiRef = React.useRef(null);
106
+ if (apiRef.current === null) {
107
+ apiRef.current = createInlineEditor({ value: initialValue, onSave, onCancel });
108
+ }
109
+ const api = apiRef.current;
110
+ const handleStartEditing = React.useCallback(() => {
111
+ setIsEditing(true);
112
+ setEditValue(initialValue);
113
+ }, [initialValue]);
114
+ const handleCancel = React.useCallback(() => {
115
+ setIsEditing(false);
116
+ setEditValue(initialValue);
117
+ onCancel?.();
118
+ }, [initialValue, onCancel]);
119
+ const handleSave = React.useCallback(() => {
120
+ setIsEditing(false);
121
+ onSave?.(editValue);
122
+ }, [editValue, onSave]);
123
+ const handleInsert = React.useCallback(
124
+ (syntax) => {
125
+ setEditValue((prev) => prev + syntax);
126
+ },
127
+ []
128
+ );
129
+ if (!isEditing) {
130
+ return React.createElement(
131
+ "div",
132
+ {
133
+ ref,
134
+ className: cn(editorVariants({ state: "viewing" }), className),
135
+ onClick: handleStartEditing,
136
+ role: "button",
137
+ tabIndex: 0,
138
+ "aria-label": "Click to edit",
139
+ onKeyDown: (e) => {
140
+ if (e.key === "Enter" || e.key === " ") {
141
+ e.preventDefault();
142
+ handleStartEditing();
143
+ }
144
+ }
145
+ },
146
+ React.createElement("div", { className: previewVariants() }, editValue || initialValue)
147
+ );
148
+ }
149
+ return React.createElement(
150
+ "div",
151
+ {
152
+ ref,
153
+ className: cn(editorVariants({ state: "editing" }), className)
154
+ },
155
+ // Toolbar
156
+ React.createElement(
157
+ "div",
158
+ { className: toolbarVariants(), role: "toolbar", "aria-label": "Formatting toolbar" },
159
+ ...api.toolbarActions.map(
160
+ (action) => React.createElement(
161
+ "button",
162
+ {
163
+ key: action.name,
164
+ type: "button",
165
+ onClick: () => handleInsert(action.syntax),
166
+ "aria-label": action.name,
167
+ "data-action": action.name
168
+ },
169
+ action.name
170
+ )
171
+ )
172
+ ),
173
+ // Editor area: side-by-side textarea + preview
174
+ React.createElement(
175
+ "div",
176
+ { className: "flex gap-2 p-2" },
177
+ React.createElement("textarea", {
178
+ value: editValue,
179
+ onChange: (e) => setEditValue(e.target.value),
180
+ className: "flex-1 min-h-[100px] resize-y border rounded p-2",
181
+ "aria-label": "Editor content"
182
+ }),
183
+ React.createElement(
184
+ "div",
185
+ {
186
+ className: cn("flex-1", previewVariants()),
187
+ "aria-label": "Preview"
188
+ },
189
+ editValue
190
+ )
191
+ ),
192
+ // Action buttons
193
+ React.createElement(
194
+ "div",
195
+ { className: "flex justify-end gap-2 p-2 border-t" },
196
+ React.createElement(
197
+ "button",
198
+ { type: "button", onClick: handleCancel },
199
+ "Cancel"
200
+ ),
201
+ React.createElement(
202
+ "button",
203
+ { type: "button", onClick: handleSave },
204
+ "Save"
205
+ )
206
+ )
207
+ );
208
+ }
209
+ );
210
+ export {
211
+ InlineEditor,
212
+ editorVariants,
213
+ previewVariants,
214
+ toolbarVariants
215
+ };
216
+ //# sourceMappingURL=react-inline-editor.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../inline-editor/src/inline-editor.ts", "../../inline-editor/src/inline-editor.styles.ts", "../../react-inline-editor/src/InlineEditor.tsx"],
4
+ "sourcesContent": ["export interface InlineEditorProps {\n /** Current value */\n value: string\n /** Callback when saving */\n onSave?: (value: string) => void\n /** Callback when cancelling */\n onCancel?: () => void\n}\n\nexport interface ToolbarAction {\n name: string\n syntax: string\n}\n\nexport interface InlineEditorState {\n isEditing: boolean\n value: string\n preview: string\n}\n\nexport interface InlineEditorAPI {\n /** Current editor state */\n state: InlineEditorState\n /** Enter editing mode */\n startEditing(): void\n /** Cancel editing, revert to original value */\n cancel(): void\n /** Save the current value */\n save(): void\n /** Update the editing value */\n updateValue(value: string): void\n /** Insert syntax at cursor position */\n insertAtCursor(syntax: string): void\n /** Available toolbar actions */\n toolbarActions: ToolbarAction[]\n}\n\nexport function createInlineEditor(props: InlineEditorProps): InlineEditorAPI {\n const { value: initialValue, onSave, onCancel } = props\n\n let isEditing = false\n let currentValue = initialValue\n\n const toolbarActions: ToolbarAction[] = [\n { name: 'bold', syntax: '**' },\n { name: 'heading', syntax: '# ' },\n { name: 'list', syntax: '- ' },\n { name: 'link', syntax: '[text](url)' },\n ]\n\n function startEditing(): void {\n isEditing = true\n currentValue = initialValue\n }\n\n function cancel(): void {\n isEditing = false\n currentValue = initialValue\n onCancel?.()\n }\n\n function save(): void {\n isEditing = false\n onSave?.(currentValue)\n }\n\n function updateValue(value: string): void {\n currentValue = value\n }\n\n function insertAtCursor(syntax: string): void {\n currentValue = currentValue + syntax\n }\n\n return {\n get state(): InlineEditorState {\n return {\n get isEditing() {\n return isEditing\n },\n get value() {\n return currentValue\n },\n get preview() {\n return currentValue\n },\n }\n },\n startEditing,\n cancel,\n save,\n updateValue,\n insertAtCursor,\n toolbarActions,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const editorVariants = cva({\n base: 'w-full rounded-md border bg-background',\n variants: {\n state: {\n viewing: 'cursor-pointer hover:bg-muted/50 p-3',\n editing: 'p-0',\n },\n },\n defaultVariants: {\n state: 'viewing',\n },\n})\n\nexport const toolbarVariants = cva({\n base: 'flex items-center gap-1 border-b px-2 py-1',\n variants: {\n size: {\n sm: 'gap-0.5 px-1 py-0.5',\n md: 'gap-1 px-2 py-1',\n lg: 'gap-2 px-3 py-2',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const previewVariants = cva({\n base: 'prose prose-sm max-w-none p-3',\n variants: {\n size: {\n sm: 'prose-xs p-2',\n md: 'prose-sm p-3',\n lg: 'prose-base p-4',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n", "import * as React from 'react'\nimport {\n createInlineEditor,\n editorVariants,\n toolbarVariants,\n previewVariants,\n type InlineEditorProps as CoreProps,\n} from '@refraction-ui/inline-editor'\nimport { cn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// InlineEditor\n// ---------------------------------------------------------------------------\n\nexport interface InlineEditorProps {\n value: string\n onSave?: (value: string) => void\n onCancel?: () => void\n className?: string\n}\n\nexport const InlineEditor = React.forwardRef<HTMLDivElement, InlineEditorProps>(\n function InlineEditor({ value: initialValue, onSave, onCancel, className }, ref) {\n const [isEditing, setIsEditing] = React.useState(false)\n const [editValue, setEditValue] = React.useState(initialValue)\n\n const apiRef = React.useRef<ReturnType<typeof createInlineEditor> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createInlineEditor({ value: initialValue, onSave, onCancel })\n }\n const api = apiRef.current\n\n const handleStartEditing = React.useCallback(() => {\n setIsEditing(true)\n setEditValue(initialValue)\n }, [initialValue])\n\n const handleCancel = React.useCallback(() => {\n setIsEditing(false)\n setEditValue(initialValue)\n onCancel?.()\n }, [initialValue, onCancel])\n\n const handleSave = React.useCallback(() => {\n setIsEditing(false)\n onSave?.(editValue)\n }, [editValue, onSave])\n\n const handleInsert = React.useCallback(\n (syntax: string) => {\n setEditValue((prev) => prev + syntax)\n },\n [],\n )\n\n // View mode\n if (!isEditing) {\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(editorVariants({ state: 'viewing' }), className),\n onClick: handleStartEditing,\n role: 'button',\n tabIndex: 0,\n 'aria-label': 'Click to edit',\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleStartEditing()\n }\n },\n },\n React.createElement('div', { className: previewVariants() }, editValue || initialValue),\n )\n }\n\n // Edit mode\n return React.createElement(\n 'div',\n {\n ref,\n className: cn(editorVariants({ state: 'editing' }), className),\n },\n // Toolbar\n React.createElement(\n 'div',\n { className: toolbarVariants(), role: 'toolbar', 'aria-label': 'Formatting toolbar' },\n ...api.toolbarActions.map((action) =>\n React.createElement(\n 'button',\n {\n key: action.name,\n type: 'button',\n onClick: () => handleInsert(action.syntax),\n 'aria-label': action.name,\n 'data-action': action.name,\n },\n action.name,\n ),\n ),\n ),\n // Editor area: side-by-side textarea + preview\n React.createElement(\n 'div',\n { className: 'flex gap-2 p-2' },\n React.createElement('textarea', {\n value: editValue,\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => setEditValue(e.target.value),\n className: 'flex-1 min-h-[100px] resize-y border rounded p-2',\n 'aria-label': 'Editor content',\n }),\n React.createElement(\n 'div',\n {\n className: cn('flex-1', previewVariants()),\n 'aria-label': 'Preview',\n },\n editValue,\n ),\n ),\n // Action buttons\n React.createElement(\n 'div',\n { className: 'flex justify-end gap-2 p-2 border-t' },\n React.createElement(\n 'button',\n { type: 'button', onClick: handleCancel },\n 'Cancel',\n ),\n React.createElement(\n 'button',\n { type: 'button', onClick: handleSave },\n 'Save',\n ),\n ),\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["InlineEditor"]
7
+ }
@@ -0,0 +1,150 @@
1
+ import {
2
+ cn,
3
+ cva,
4
+ generateId
5
+ } from "./chunk-ZF3OHCGV.js";
6
+
7
+ // ../react-input-group/dist/index.js
8
+ import * as React from "react";
9
+
10
+ // ../input-group/dist/index.js
11
+ function createInputGroup(props = {}) {
12
+ const { orientation = "horizontal" } = props;
13
+ const id = props.id ?? generateId("rfr-input-group");
14
+ const ariaProps = {
15
+ role: "group"
16
+ };
17
+ if (props["aria-label"]) {
18
+ ariaProps["aria-label"] = props["aria-label"];
19
+ }
20
+ if (props["aria-labelledby"]) {
21
+ ariaProps["aria-labelledby"] = props["aria-labelledby"];
22
+ }
23
+ const dataAttributes = {
24
+ "data-orientation": orientation,
25
+ id
26
+ };
27
+ return {
28
+ ariaProps,
29
+ dataAttributes
30
+ };
31
+ }
32
+ var inputGroupTokens = {
33
+ name: "input-group",
34
+ tokens: {
35
+ bg: { variable: "--rfr-input-group-bg", fallback: "hsl(var(--background))" },
36
+ border: { variable: "--rfr-input-group-border", fallback: "hsl(var(--border))" },
37
+ radius: { variable: "--rfr-input-group-radius", fallback: "var(--radius)" }
38
+ }
39
+ };
40
+ var inputGroupVariants = cva({
41
+ base: "flex items-stretch [&>*:not(:first-child):not(:last-child)]:rounded-none",
42
+ variants: {
43
+ orientation: {
44
+ horizontal: "flex-row [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none",
45
+ vertical: "flex-col [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none"
46
+ }
47
+ },
48
+ defaultVariants: {
49
+ orientation: "horizontal"
50
+ }
51
+ });
52
+ var inputGroupAddonVariants = cva({
53
+ base: "flex items-center justify-center border bg-muted px-3 text-sm text-muted-foreground",
54
+ variants: {
55
+ orientation: {
56
+ horizontal: "border-y border-x first:border-r-0 last:border-l-0",
57
+ vertical: "border-x border-y first:border-b-0 last:border-t-0"
58
+ }
59
+ },
60
+ defaultVariants: {
61
+ orientation: "horizontal"
62
+ }
63
+ });
64
+ var inputGroupButtonVariants = cva({
65
+ base: "relative inline-flex items-center justify-center whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
66
+ variants: {
67
+ orientation: {
68
+ horizontal: "",
69
+ vertical: ""
70
+ }
71
+ },
72
+ defaultVariants: {
73
+ orientation: "horizontal"
74
+ }
75
+ });
76
+
77
+ // ../react-input-group/dist/index.js
78
+ import { jsx } from "react/jsx-runtime";
79
+ var InputGroup = React.forwardRef(
80
+ function InputGroup2({ orientation = "horizontal", className, children, ...props }, ref) {
81
+ const api = createInputGroup({
82
+ orientation,
83
+ id: props.id,
84
+ "aria-label": props["aria-label"],
85
+ "aria-labelledby": props["aria-labelledby"]
86
+ });
87
+ return /* @__PURE__ */ jsx(
88
+ "div",
89
+ {
90
+ ref,
91
+ className: cn(inputGroupVariants({ orientation }), className),
92
+ ...api.ariaProps,
93
+ ...api.dataAttributes,
94
+ ...props,
95
+ children
96
+ }
97
+ );
98
+ }
99
+ );
100
+ var InputGroupAddon = React.forwardRef(
101
+ function InputGroupAddon2({ orientation = "horizontal", className, children, ...props }, ref) {
102
+ return /* @__PURE__ */ jsx(
103
+ "div",
104
+ {
105
+ ref,
106
+ className: cn(inputGroupAddonVariants({ orientation }), className),
107
+ ...props,
108
+ children
109
+ }
110
+ );
111
+ }
112
+ );
113
+ var InputGroupText = React.forwardRef(
114
+ function InputGroupText2({ className, children, ...props }, ref) {
115
+ return /* @__PURE__ */ jsx(
116
+ "span",
117
+ {
118
+ ref,
119
+ className: cn("flex items-center px-3 text-sm text-muted-foreground", className),
120
+ ...props,
121
+ children
122
+ }
123
+ );
124
+ }
125
+ );
126
+ var InputGroupButton = React.forwardRef(
127
+ function InputGroupButton2({ orientation = "horizontal", className, children, ...props }, ref) {
128
+ return /* @__PURE__ */ jsx(
129
+ "button",
130
+ {
131
+ ref,
132
+ type: props.type ?? "button",
133
+ className: cn(inputGroupButtonVariants({ orientation }), className),
134
+ ...props,
135
+ children
136
+ }
137
+ );
138
+ }
139
+ );
140
+ export {
141
+ InputGroup,
142
+ InputGroupAddon,
143
+ InputGroupButton,
144
+ InputGroupText,
145
+ inputGroupAddonVariants,
146
+ inputGroupButtonVariants,
147
+ inputGroupTokens,
148
+ inputGroupVariants
149
+ };
150
+ //# sourceMappingURL=react-input-group.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../input-group/src/input-group.ts", "../../input-group/src/input-group.styles.ts", "../../react-input-group/src/input-group.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps } from '@refraction-ui/shared'\nimport { generateId } from '@refraction-ui/shared'\n\nexport type InputGroupOrientation = 'horizontal' | 'vertical'\n\nexport interface InputGroupProps {\n orientation?: InputGroupOrientation\n id?: string\n 'aria-label'?: string\n 'aria-labelledby'?: string\n}\n\nexport interface InputGroupAPI {\n /** ARIA attributes to spread on the group container */\n ariaProps: Partial<AccessibilityProps>\n /** Data attributes for CSS styling hooks */\n dataAttributes: Record<string, string>\n}\n\nexport function createInputGroup(props: InputGroupProps = {}): InputGroupAPI {\n const { orientation = 'horizontal' } = props\n const id = props.id ?? generateId('rfr-input-group')\n\n const ariaProps: Partial<AccessibilityProps> = {\n role: 'group',\n }\n\n if (props['aria-label']) {\n ariaProps['aria-label'] = props['aria-label']\n }\n if (props['aria-labelledby']) {\n ariaProps['aria-labelledby'] = props['aria-labelledby']\n }\n\n const dataAttributes: Record<string, string> = {\n 'data-orientation': orientation,\n id,\n }\n\n return {\n ariaProps,\n dataAttributes,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const inputGroupTokens: TokenContract = {\n name: 'input-group',\n tokens: {\n bg: { variable: '--rfr-input-group-bg', fallback: 'hsl(var(--background))' },\n border: { variable: '--rfr-input-group-border', fallback: 'hsl(var(--border))' },\n radius: { variable: '--rfr-input-group-radius', fallback: 'var(--radius)' },\n },\n}\n\nexport const inputGroupVariants = cva({\n base: 'flex items-stretch [&>*:not(:first-child):not(:last-child)]:rounded-none',\n variants: {\n orientation: {\n horizontal: 'flex-row [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none',\n vertical: 'flex-col [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport const inputGroupAddonVariants = cva({\n base: 'flex items-center justify-center border bg-muted px-3 text-sm text-muted-foreground',\n variants: {\n orientation: {\n horizontal: 'border-y border-x first:border-r-0 last:border-l-0',\n vertical: 'border-x border-y first:border-b-0 last:border-t-0',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n\nexport const inputGroupButtonVariants = cva({\n base: 'relative inline-flex items-center justify-center whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n variants: {\n orientation: {\n horizontal: '',\n vertical: '',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n})\n", "import * as React from 'react'\nimport {\n createInputGroup,\n inputGroupVariants,\n inputGroupAddonVariants,\n inputGroupButtonVariants,\n type InputGroupOrientation,\n} from '@refraction-ui/input-group'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: InputGroupOrientation\n}\n\n/**\n * InputGroup — flex container that visually groups inputs, addons, and buttons.\n * Handles border-radius clipping on first/last children.\n */\nexport const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n function InputGroup({ orientation = 'horizontal', className, children, ...props }, ref) {\n const api = createInputGroup({\n orientation,\n id: props.id,\n 'aria-label': props['aria-label'],\n 'aria-labelledby': props['aria-labelledby'],\n })\n\n return (\n <div\n ref={ref}\n className={cn(inputGroupVariants({ orientation }), className)}\n {...api.ariaProps}\n {...api.dataAttributes}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nexport interface InputGroupAddonProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: InputGroupOrientation\n}\n\n/**\n * InputGroupAddon — decorative text or icon addon (e.g., \"$\", \"@\", icons).\n */\nexport const InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n function InputGroupAddon({ orientation = 'horizontal', className, children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(inputGroupAddonVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nexport interface InputGroupTextProps extends React.HTMLAttributes<HTMLSpanElement> {}\n\n/**\n * InputGroupText — inline text label within an input group.\n */\nexport const InputGroupText = React.forwardRef<HTMLSpanElement, InputGroupTextProps>(\n function InputGroupText({ className, children, ...props }, ref) {\n return (\n <span\n ref={ref}\n className={cn('flex items-center px-3 text-sm text-muted-foreground', className)}\n {...props}\n >\n {children}\n </span>\n )\n },\n)\n\nexport interface InputGroupButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n orientation?: InputGroupOrientation\n}\n\n/**\n * InputGroupButton — a button styled to sit flush inside an input group.\n */\nexport const InputGroupButton = React.forwardRef<HTMLButtonElement, InputGroupButtonProps>(\n function InputGroupButton({ orientation = 'horizontal', className, children, ...props }, ref) {\n return (\n <button\n ref={ref}\n type={props.type ?? 'button'}\n className={cn(inputGroupButtonVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </button>\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;;AAmBO,SAAS,iBAAiB,QAAyB,CAAA,GAAmB;AAC3E,QAAM,EAAE,cAAc,aAAA,IAAiB;AACvC,QAAM,KAAK,MAAM,MAAM,WAAW,iBAAiB;AAEnD,QAAM,YAAyC;IAC7C,MAAM;EAAA;AAGR,MAAI,MAAM,YAAY,GAAG;AACvB,cAAU,YAAY,IAAI,MAAM,YAAY;EAC9C;AACA,MAAI,MAAM,iBAAiB,GAAG;AAC5B,cAAU,iBAAiB,IAAI,MAAM,iBAAiB;EACxD;AAEA,QAAM,iBAAyC;IAC7C,oBAAoB;IACpB;EAAA;AAGF,SAAO;IACL;IACA;EAAA;AAEJ;ACxCO,IAAM,mBAAkC;EAC7C,MAAM;EACN,QAAQ;IACN,IAAI,EAAE,UAAU,wBAAwB,UAAU,yBAAA;IAClD,QAAQ,EAAE,UAAU,4BAA4B,UAAU,qBAAA;IAC1D,QAAQ,EAAE,UAAU,4BAA4B,UAAU,gBAAA;EAAgB;AAE9E;AAEO,IAAM,qBAAqB,IAAI;EACpC,MAAM;EACN,UAAU;IACR,aAAa;MACX,YAAY;MACZ,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,aAAa;EAAA;AAEjB,CAAC;AAEM,IAAM,0BAA0B,IAAI;EACzC,MAAM;EACN,UAAU;IACR,aAAa;MACX,YAAY;MACZ,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,aAAa;EAAA;AAEjB,CAAC;AAEM,IAAM,2BAA2B,IAAI;EAC1C,MAAM;EACN,UAAU;IACR,aAAa;MACX,YAAY;MACZ,UAAU;IAAA;EACZ;EAEF,iBAAiB;IACf,aAAa;EAAA;AAEjB,CAAC;;;;AC/BM,IAAM,aAAmB;EAC9B,SAASA,YAAW,EAAE,cAAc,cAAc,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AACtF,UAAM,MAAM,iBAAiB;MAC3B;MACA,IAAI,MAAM;MACV,cAAc,MAAM,YAAY;MAChC,mBAAmB,MAAM,iBAAiB;IAAA,CAC3C;AAED,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,mBAAmB,EAAE,YAAA,CAAa,GAAG,SAAS;QAC3D,GAAG,IAAI;QACP,GAAG,IAAI;QACP,GAAG;QAEH;MAAA;IAAA;EAGP;AACF;AASO,IAAM,kBAAwB;EACnC,SAASC,iBAAgB,EAAE,cAAc,cAAc,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC3F,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,wBAAwB,EAAE,YAAA,CAAa,GAAG,SAAS;QAChE,GAAG;QAEH;MAAA;IAAA;EAGP;AACF;AAOO,IAAM,iBAAuB;EAClC,SAASC,gBAAe,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC9D,WACE;MAAC;MAAA;QACC;QACA,WAAW,GAAG,wDAAwD,SAAS;QAC9E,GAAG;QAEH;MAAA;IAAA;EAGP;AACF;AASO,IAAM,mBAAyB;EACpC,SAASC,kBAAiB,EAAE,cAAc,cAAc,WAAW,UAAU,GAAG,MAAA,GAAS,KAAK;AAC5F,WACE;MAAC;MAAA;QACC;QACA,MAAM,MAAM,QAAQ;QACpB,WAAW,GAAG,yBAAyB,EAAE,YAAA,CAAa,GAAG,SAAS;QACjE,GAAG;QAEH;MAAA;IAAA;EAGP;AACF;",
6
+ "names": ["InputGroup", "InputGroupAddon", "InputGroupText", "InputGroupButton"]
7
+ }
@@ -0,0 +1,10 @@
1
+ import {
2
+ Input,
3
+ inputVariants
4
+ } from "./chunk-TOZBR4GL.js";
5
+ import "./chunk-ZF3OHCGV.js";
6
+ export {
7
+ Input,
8
+ inputVariants
9
+ };
10
+ //# sourceMappingURL=react-input.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,132 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-install-prompt/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../install-prompt/dist/index.js
10
+ function createInstallPrompt(props = {}, storage) {
11
+ const { storageKey = "rfr-install-dismissed" } = props;
12
+ const dismissed = storage?.get(storageKey) === "true";
13
+ const state = {
14
+ canShow: false,
15
+ isDismissed: dismissed
16
+ };
17
+ return {
18
+ state,
19
+ show() {
20
+ if (!state.isDismissed) {
21
+ state.canShow = true;
22
+ }
23
+ },
24
+ dismiss() {
25
+ state.canShow = false;
26
+ state.isDismissed = true;
27
+ storage?.set(storageKey, "true");
28
+ },
29
+ install(promptEvent) {
30
+ promptEvent?.prompt();
31
+ state.canShow = false;
32
+ },
33
+ ariaProps: {
34
+ role: "banner",
35
+ "aria-label": "Install application"
36
+ }
37
+ };
38
+ }
39
+ var installPromptVariants = cva({
40
+ base: "fixed bottom-0 left-0 right-0 z-50 flex items-center justify-between gap-4 border-t bg-background px-4 py-3 shadow-lg"
41
+ });
42
+
43
+ // ../react-install-prompt/dist/index.js
44
+ import { jsxs, jsx } from "react/jsx-runtime";
45
+ function createLocalStorage() {
46
+ return {
47
+ get(key) {
48
+ try {
49
+ return localStorage.getItem(key);
50
+ } catch {
51
+ return null;
52
+ }
53
+ },
54
+ set(key, value) {
55
+ try {
56
+ localStorage.setItem(key, value);
57
+ } catch {
58
+ }
59
+ }
60
+ };
61
+ }
62
+ var InstallPrompt = React.forwardRef(
63
+ function InstallPrompt2({
64
+ delay = 3e3,
65
+ storageKey,
66
+ installLabel = "Install",
67
+ dismissLabel = "Dismiss",
68
+ message = "Install this app for a better experience",
69
+ className,
70
+ ...props
71
+ }, ref) {
72
+ const storageRef = React.useRef(void 0);
73
+ if (typeof window !== "undefined" && !storageRef.current) {
74
+ storageRef.current = createLocalStorage();
75
+ }
76
+ const api = createInstallPrompt({ delay, storageKey }, storageRef.current);
77
+ const [visible, setVisible] = React.useState(false);
78
+ const promptEventRef = React.useRef(null);
79
+ React.useEffect(() => {
80
+ if (api.state.isDismissed) return;
81
+ const handleBeforeInstall = (e) => {
82
+ e.preventDefault();
83
+ promptEventRef.current = e;
84
+ };
85
+ window.addEventListener("beforeinstallprompt", handleBeforeInstall);
86
+ const timer = setTimeout(() => {
87
+ if (promptEventRef.current && !api.state.isDismissed) {
88
+ api.show();
89
+ setVisible(true);
90
+ }
91
+ }, delay);
92
+ return () => {
93
+ window.removeEventListener("beforeinstallprompt", handleBeforeInstall);
94
+ clearTimeout(timer);
95
+ };
96
+ }, [delay, api]);
97
+ if (!visible) return null;
98
+ const classes = cn(installPromptVariants(), className);
99
+ return /* @__PURE__ */ jsxs("div", { ref, className: classes, ...api.ariaProps, ...props, children: [
100
+ /* @__PURE__ */ jsx("span", { children: message }),
101
+ /* @__PURE__ */ jsxs("div", { children: [
102
+ /* @__PURE__ */ jsx(
103
+ "button",
104
+ {
105
+ type: "button",
106
+ onClick: () => {
107
+ api.install(promptEventRef.current ?? void 0);
108
+ setVisible(false);
109
+ },
110
+ children: installLabel
111
+ }
112
+ ),
113
+ /* @__PURE__ */ jsx(
114
+ "button",
115
+ {
116
+ type: "button",
117
+ onClick: () => {
118
+ api.dismiss();
119
+ setVisible(false);
120
+ },
121
+ children: dismissLabel
122
+ }
123
+ )
124
+ ] })
125
+ ] });
126
+ }
127
+ );
128
+ export {
129
+ InstallPrompt,
130
+ installPromptVariants
131
+ };
132
+ //# sourceMappingURL=react-install-prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../install-prompt/src/install-prompt.ts", "../../install-prompt/src/install-prompt.styles.ts", "../../react-install-prompt/src/install-prompt.tsx"],
4
+ "sourcesContent": ["export interface StorageAdapter {\n get(key: string): string | null\n set(key: string, value: string): void\n}\n\nexport interface InstallPromptProps {\n /** Delay in ms before showing prompt. Default: 3000 */\n delay?: number\n /** Key used to persist dismissed state. Default: 'rfr-install-dismissed' */\n storageKey?: string\n}\n\nexport interface InstallPromptState {\n canShow: boolean\n isDismissed: boolean\n}\n\nexport interface InstallPromptAPI {\n state: InstallPromptState\n /** Mark the prompt as showable (call after delay + event fire) */\n show(): void\n /** Dismiss and persist */\n dismiss(): void\n /** Trigger the browser install prompt */\n install(promptEvent?: { prompt(): void }): void\n /** ARIA attributes for the banner */\n ariaProps: Record<string, string>\n}\n\nexport function createInstallPrompt(\n props: InstallPromptProps = {},\n storage?: StorageAdapter,\n): InstallPromptAPI {\n const { storageKey = 'rfr-install-dismissed' } = props\n\n const dismissed = storage?.get(storageKey) === 'true'\n\n const state: InstallPromptState = {\n canShow: false,\n isDismissed: dismissed,\n }\n\n return {\n state,\n\n show() {\n if (!state.isDismissed) {\n state.canShow = true\n }\n },\n\n dismiss() {\n state.canShow = false\n state.isDismissed = true\n storage?.set(storageKey, 'true')\n },\n\n install(promptEvent?: { prompt(): void }) {\n promptEvent?.prompt()\n state.canShow = false\n },\n\n ariaProps: {\n role: 'banner',\n 'aria-label': 'Install application',\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const installPromptVariants = cva({\n base: 'fixed bottom-0 left-0 right-0 z-50 flex items-center justify-between gap-4 border-t bg-background px-4 py-3 shadow-lg',\n})\n", "import * as React from 'react'\nimport {\n createInstallPrompt,\n installPromptVariants,\n type InstallPromptProps as CoreInstallPromptProps,\n type StorageAdapter,\n} from '@refraction-ui/install-prompt'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface InstallPromptProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Delay in ms before showing. Default: 3000 */\n delay?: number\n /** Storage key for dismissed state. Default: 'rfr-install-dismissed' */\n storageKey?: string\n /** Install button label. Default: 'Install' */\n installLabel?: string\n /** Dismiss button label. Default: 'Dismiss' */\n dismissLabel?: string\n /** Message text. Default: 'Install this app for a better experience' */\n message?: string\n}\n\nfunction createLocalStorage(): StorageAdapter {\n return {\n get(key) {\n try {\n return localStorage.getItem(key)\n } catch {\n return null\n }\n },\n set(key, value) {\n try {\n localStorage.setItem(key, value)\n } catch {\n // Ignore storage errors in SSR or incognito\n }\n },\n }\n}\n\n/**\n * InstallPrompt component — renders a bottom banner prompting PWA installation.\n *\n * Uses the headless @refraction-ui/install-prompt core for state and ARIA attributes.\n * Listens for the `beforeinstallprompt` browser event.\n */\nexport const InstallPrompt = React.forwardRef<HTMLDivElement, InstallPromptProps>(\n function InstallPrompt(\n {\n delay = 3000,\n storageKey,\n installLabel = 'Install',\n dismissLabel = 'Dismiss',\n message = 'Install this app for a better experience',\n className,\n ...props\n },\n ref,\n ) {\n const storageRef = React.useRef<StorageAdapter | undefined>(undefined)\n if (typeof window !== 'undefined' && !storageRef.current) {\n storageRef.current = createLocalStorage()\n }\n\n const api = createInstallPrompt({ delay, storageKey }, storageRef.current)\n const [visible, setVisible] = React.useState(false)\n const promptEventRef = React.useRef<{ prompt(): void } | null>(null)\n\n React.useEffect(() => {\n if (api.state.isDismissed) return\n\n const handleBeforeInstall = (e: Event) => {\n e.preventDefault()\n promptEventRef.current = e as unknown as { prompt(): void }\n }\n\n window.addEventListener('beforeinstallprompt', handleBeforeInstall)\n\n const timer = setTimeout(() => {\n if (promptEventRef.current && !api.state.isDismissed) {\n api.show()\n setVisible(true)\n }\n }, delay)\n\n return () => {\n window.removeEventListener('beforeinstallprompt', handleBeforeInstall)\n clearTimeout(timer)\n }\n }, [delay, api])\n\n if (!visible) return null\n\n const classes = cn(installPromptVariants(), className)\n\n return (\n <div ref={ref} className={classes} {...api.ariaProps} {...props}>\n <span>{message}</span>\n <div>\n <button\n type=\"button\"\n onClick={() => {\n api.install(promptEventRef.current ?? undefined)\n setVisible(false)\n }}\n >\n {installLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n api.dismiss()\n setVisible(false)\n }}\n >\n {dismissLabel}\n </button>\n </div>\n </div>\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;AA6BO,SAAS,oBACd,QAA4B,CAAA,GAC5B,SACkB;AAClB,QAAM,EAAE,aAAa,wBAAA,IAA4B;AAEjD,QAAM,YAAY,SAAS,IAAI,UAAU,MAAM;AAE/C,QAAM,QAA4B;IAChC,SAAS;IACT,aAAa;EAAA;AAGf,SAAO;IACL;IAEA,OAAO;AACL,UAAI,CAAC,MAAM,aAAa;AACtB,cAAM,UAAU;MAClB;IACF;IAEA,UAAU;AACR,YAAM,UAAU;AAChB,YAAM,cAAc;AACpB,eAAS,IAAI,YAAY,MAAM;IACjC;IAEA,QAAQ,aAAkC;AACxC,mBAAa,OAAA;AACb,YAAM,UAAU;IAClB;IAEA,WAAW;MACT,MAAM;MACN,cAAc;IAAA;EAChB;AAEJ;ACjEO,IAAM,wBAAwB,IAAI;EACvC,MAAM;AACR,CAAC;;;;ACkBD,SAAS,qBAAqC;AAC5C,SAAO;IACL,IAAI,KAAK;AACP,UAAI;AACF,eAAO,aAAa,QAAQ,GAAG;MACjC,QAAQ;AACN,eAAO;MACT;IACF;IACA,IAAI,KAAK,OAAO;AACd,UAAI;AACF,qBAAa,QAAQ,KAAK,KAAK;MACjC,QAAQ;MAER;IACF;EAAA;AAEJ;AAQO,IAAM,gBAAsB;EACjC,SAASA,eACP;IACE,QAAQ;IACR;IACA,eAAe;IACf,eAAe;IACf,UAAU;IACV;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,aAAmB,aAAmC,MAAS;AACrE,QAAI,OAAO,WAAW,eAAe,CAAC,WAAW,SAAS;AACxD,iBAAW,UAAU,mBAAA;IACvB;AAEA,UAAM,MAAM,oBAAoB,EAAE,OAAO,WAAA,GAAc,WAAW,OAAO;AACzE,UAAM,CAAC,SAAS,UAAU,IAAU,eAAS,KAAK;AAClD,UAAM,iBAAuB,aAAkC,IAAI;AAE7D,IAAA,gBAAU,MAAM;AACpB,UAAI,IAAI,MAAM,YAAa;AAE3B,YAAM,sBAAsB,CAAC,MAAa;AACxC,UAAE,eAAA;AACF,uBAAe,UAAU;MAC3B;AAEA,aAAO,iBAAiB,uBAAuB,mBAAmB;AAElE,YAAM,QAAQ,WAAW,MAAM;AAC7B,YAAI,eAAe,WAAW,CAAC,IAAI,MAAM,aAAa;AACpD,cAAI,KAAA;AACJ,qBAAW,IAAI;QACjB;MACF,GAAG,KAAK;AAER,aAAO,MAAM;AACX,eAAO,oBAAoB,uBAAuB,mBAAmB;AACrE,qBAAa,KAAK;MACpB;IACF,GAAG,CAAC,OAAO,GAAG,CAAC;AAEf,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,UAAU,GAAG,sBAAA,GAAyB,SAAS;AAErD,WACE,qBAAC,OAAA,EAAI,KAAU,WAAW,SAAU,GAAG,IAAI,WAAY,GAAG,OACxD,UAAA;MAAA,oBAAC,QAAA,EAAM,UAAA,QAAA,CAAQ;MAAA,qBACd,OAAA,EACC,UAAA;QAAA;UAAC;UAAA;YACC,MAAK;YACL,SAAS,MAAM;AACb,kBAAI,QAAQ,eAAe,WAAW,MAAS;AAC/C,yBAAW,KAAK;YAClB;YAEC,UAAA;UAAA;QAAA;QAEH;UAAC;UAAA;YACC,MAAK;YACL,SAAS,MAAM;AACb,kBAAI,QAAA;AACJ,yBAAW,KAAK;YAClB;YAEC,UAAA;UAAA;QAAA;MACH,EAAA,CACF;IAAA,EAAA,CACF;EAEJ;AACF;",
6
+ "names": ["InstallPrompt"]
7
+ }