@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,207 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-mini-map/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../mini-map/dist/index.js
10
+ function contentBounds(items) {
11
+ if (items.length === 0) return { x: 0, y: 0, width: 0, height: 0 };
12
+ let minX = Infinity;
13
+ let minY = Infinity;
14
+ let maxX = -Infinity;
15
+ let maxY = -Infinity;
16
+ for (const item of items) {
17
+ const right = item.x + (item.width ?? 0);
18
+ const bottom = item.y + (item.height ?? 0);
19
+ if (item.x < minX) minX = item.x;
20
+ if (item.y < minY) minY = item.y;
21
+ if (right > maxX) maxX = right;
22
+ if (bottom > maxY) maxY = bottom;
23
+ }
24
+ return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
25
+ }
26
+ function miniScale(contentRect, miniW, miniH, padding = 8) {
27
+ const availW = miniW - padding * 2;
28
+ const availH = miniH - padding * 2;
29
+ if (availW <= 0 || availH <= 0) return 1;
30
+ if (contentRect.width === 0 || contentRect.height === 0) return 1;
31
+ return Math.min(availW / contentRect.width, availH / contentRect.height);
32
+ }
33
+ function worldToMini(point, contentRect, scale, padding = 8) {
34
+ return {
35
+ x: (point.x - contentRect.x) * scale + padding,
36
+ y: (point.y - contentRect.y) * scale + padding
37
+ };
38
+ }
39
+ function viewportRectInMini(viewport, contentRect, scale, padding = 8) {
40
+ const { x, y } = worldToMini(
41
+ { x: viewport.x, y: viewport.y },
42
+ contentRect,
43
+ scale,
44
+ padding
45
+ );
46
+ return {
47
+ x,
48
+ y,
49
+ width: viewport.width * scale,
50
+ height: viewport.height * scale
51
+ };
52
+ }
53
+ function createMiniMap() {
54
+ return {
55
+ ariaProps: { role: "img", "aria-label": "Minimap" },
56
+ dataAttributes: { "data-component": "mini-map" }
57
+ };
58
+ }
59
+ var miniMapVariants = cva({
60
+ base: [
61
+ "relative overflow-hidden rounded-md border border-border bg-card",
62
+ "select-none"
63
+ ].join(" "),
64
+ variants: {
65
+ interactive: {
66
+ true: "cursor-grab active:cursor-grabbing",
67
+ false: ""
68
+ }
69
+ },
70
+ defaultVariants: {
71
+ interactive: "false"
72
+ }
73
+ });
74
+ var miniMapDotClass = "absolute rounded-sm bg-muted";
75
+ var miniMapViewportClass = "absolute rounded-sm border border-primary ring-1 ring-primary bg-primary/10";
76
+
77
+ // ../react-mini-map/dist/index.js
78
+ import { jsxs, jsx } from "react/jsx-runtime";
79
+ var MiniMap = React.forwardRef(
80
+ function MiniMap2({
81
+ items,
82
+ viewport,
83
+ width = 200,
84
+ height = 140,
85
+ padding = 8,
86
+ onViewportChange,
87
+ className,
88
+ ...props
89
+ }, ref) {
90
+ const containerRef = React.useRef(null);
91
+ const isDragging = React.useRef(false);
92
+ const bounds = React.useMemo(() => contentBounds(items), [items]);
93
+ const scale = React.useMemo(
94
+ () => miniScale(bounds, width, height, padding),
95
+ [bounds, width, height, padding]
96
+ );
97
+ const viewportRect = React.useMemo(
98
+ () => viewport != null ? viewportRectInMini(viewport, bounds, scale, padding) : null,
99
+ [viewport, bounds, scale, padding]
100
+ );
101
+ const { ariaProps, dataAttributes } = createMiniMap();
102
+ const miniToWorld = React.useCallback(
103
+ (miniX, miniY) => {
104
+ return {
105
+ x: (miniX - padding) / scale + bounds.x,
106
+ y: (miniY - padding) / scale + bounds.y
107
+ };
108
+ },
109
+ [scale, bounds, padding]
110
+ );
111
+ const handlePointerEvent = React.useCallback(
112
+ (e) => {
113
+ if (!onViewportChange) return;
114
+ const el = containerRef.current;
115
+ if (!el) return;
116
+ const rect = el.getBoundingClientRect();
117
+ const miniX = e.clientX - rect.left;
118
+ const miniY = e.clientY - rect.top;
119
+ onViewportChange(miniToWorld(miniX, miniY));
120
+ },
121
+ [onViewportChange, miniToWorld]
122
+ );
123
+ const handlePointerDown = React.useCallback(
124
+ (e) => {
125
+ if (!onViewportChange) return;
126
+ isDragging.current = true;
127
+ e.currentTarget.setPointerCapture(e.pointerId);
128
+ handlePointerEvent(e);
129
+ },
130
+ [onViewportChange, handlePointerEvent]
131
+ );
132
+ const handlePointerMove = React.useCallback(
133
+ (e) => {
134
+ if (!isDragging.current) return;
135
+ handlePointerEvent(e);
136
+ },
137
+ [handlePointerEvent]
138
+ );
139
+ const handlePointerUp = React.useCallback(() => {
140
+ isDragging.current = false;
141
+ }, []);
142
+ return /* @__PURE__ */ jsxs(
143
+ "div",
144
+ {
145
+ ref: (node) => {
146
+ containerRef.current = node;
147
+ if (typeof ref === "function") {
148
+ ref(node);
149
+ } else if (ref) {
150
+ ref.current = node;
151
+ }
152
+ },
153
+ className: cn(
154
+ miniMapVariants({ interactive: onViewportChange ? "true" : "false" }),
155
+ className
156
+ ),
157
+ style: { width, height, position: "relative" },
158
+ ...ariaProps,
159
+ ...dataAttributes,
160
+ onPointerDown: onViewportChange ? handlePointerDown : void 0,
161
+ onPointerMove: onViewportChange ? handlePointerMove : void 0,
162
+ onPointerUp: onViewportChange ? handlePointerUp : void 0,
163
+ ...props,
164
+ children: [
165
+ items.map((item) => {
166
+ const pos = worldToMini(item, bounds, scale, padding);
167
+ const w = (item.width ?? 8) * scale;
168
+ const h = (item.height ?? 8) * scale;
169
+ return /* @__PURE__ */ jsx(
170
+ "span",
171
+ {
172
+ className: miniMapDotClass,
173
+ style: {
174
+ position: "absolute",
175
+ left: `${pos.x}px`,
176
+ top: `${pos.y}px`,
177
+ width: `${Math.max(4, w)}px`,
178
+ height: `${Math.max(4, h)}px`
179
+ },
180
+ "aria-hidden": "true"
181
+ },
182
+ item.id
183
+ );
184
+ }),
185
+ viewportRect != null && /* @__PURE__ */ jsx(
186
+ "span",
187
+ {
188
+ className: miniMapViewportClass,
189
+ style: {
190
+ position: "absolute",
191
+ left: `${viewportRect.x}px`,
192
+ top: `${viewportRect.y}px`,
193
+ width: `${viewportRect.width}px`,
194
+ height: `${viewportRect.height}px`
195
+ },
196
+ "aria-hidden": "true"
197
+ }
198
+ )
199
+ ]
200
+ }
201
+ );
202
+ }
203
+ );
204
+ export {
205
+ MiniMap
206
+ };
207
+ //# sourceMappingURL=react-mini-map.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../mini-map/src/mini-map.ts", "../../mini-map/src/mini-map.styles.ts", "../../react-mini-map/src/mini-map.tsx"],
4
+ "sourcesContent": ["/** A rectangle in 2-D space. */\nexport interface Rect {\n x: number\n y: number\n width: number\n height: number\n}\n\n/** A single item to be represented as a dot on the minimap. */\nexport interface MiniMapItem {\n id: string\n x: number\n y: number\n width?: number\n height?: number\n}\n\nexport interface MiniMapAPI {\n /** ARIA attributes to spread on the minimap container element. */\n ariaProps: { role: 'img'; 'aria-label': string }\n /** Data attributes for styling hooks. */\n dataAttributes: Record<string, string>\n}\n\n/**\n * Compute the bounding box that encloses all items (using their x/y + optional\n * width/height). Returns a zero-size rect at the origin when `items` is empty.\n */\nexport function contentBounds(items: MiniMapItem[]): Rect {\n if (items.length === 0) return { x: 0, y: 0, width: 0, height: 0 }\n\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n\n for (const item of items) {\n const right = item.x + (item.width ?? 0)\n const bottom = item.y + (item.height ?? 0)\n if (item.x < minX) minX = item.x\n if (item.y < minY) minY = item.y\n if (right > maxX) maxX = right\n if (bottom > maxY) maxY = bottom\n }\n\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY }\n}\n\n/**\n * Compute the uniform scale factor that fits `contentRect` into the minimap\n * box (after subtracting `padding` on each side). Returns 1 when the content\n * has zero area (nothing to scale).\n */\nexport function miniScale(\n contentRect: Rect,\n miniW: number,\n miniH: number,\n padding = 8,\n): number {\n const availW = miniW - padding * 2\n const availH = miniH - padding * 2\n if (availW <= 0 || availH <= 0) return 1\n if (contentRect.width === 0 || contentRect.height === 0) return 1\n return Math.min(availW / contentRect.width, availH / contentRect.height)\n}\n\n/**\n * Map a world-space point `{ x, y }` to minimap pixel coordinates.\n *\n * @param point World coordinate\n * @param contentRect Bounding box of all content (from `contentBounds`)\n * @param scale Scale factor (from `miniScale`)\n * @param padding Padding inset in px (must match the value passed to `miniScale`)\n */\nexport function worldToMini(\n point: { x: number; y: number },\n contentRect: Rect,\n scale: number,\n padding = 8,\n): { x: number; y: number } {\n return {\n x: (point.x - contentRect.x) * scale + padding,\n y: (point.y - contentRect.y) * scale + padding,\n }\n}\n\n/**\n * Compute the position and size of the viewport indicator rectangle in\n * minimap coordinates, ready to be applied as CSS `left/top/width/height`.\n */\nexport function viewportRectInMini(\n viewport: Rect,\n contentRect: Rect,\n scale: number,\n padding = 8,\n): Rect {\n const { x, y } = worldToMini(\n { x: viewport.x, y: viewport.y },\n contentRect,\n scale,\n padding,\n )\n return {\n x,\n y,\n width: viewport.width * scale,\n height: viewport.height * scale,\n }\n}\n\n/**\n * Build the framework-agnostic ARIA props for the minimap container.\n *\n * Every adapter spreads `ariaProps` onto its outermost element; `dataAttributes`\n * are available for CSS hooks.\n */\nexport function createMiniMap(): MiniMapAPI {\n return {\n ariaProps: { role: 'img', 'aria-label': 'Minimap' },\n dataAttributes: { 'data-component': 'mini-map' },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\n/**\n * The outer minimap box: small, rounded, bordered, card background.\n * The `interactive` variant switches to grab cursor for clickable minimaps.\n */\nexport const miniMapVariants = cva({\n base: [\n 'relative overflow-hidden rounded-md border border-border bg-card',\n 'select-none',\n ].join(' '),\n variants: {\n interactive: {\n true: 'cursor-grab active:cursor-grabbing',\n false: '',\n },\n },\n defaultVariants: {\n interactive: 'false',\n },\n})\n\n/** A single node dot in the minimap (represents one `MiniMapItem`). */\nexport const miniMapDotClass =\n 'absolute rounded-sm bg-muted'\n\n/**\n * The draggable viewport indicator rectangle.\n * Uses a semi-transparent primary fill with a primary ring/border.\n */\nexport const miniMapViewportClass =\n 'absolute rounded-sm border border-primary ring-1 ring-primary bg-primary/10'\n", "import * as React from 'react'\nimport {\n contentBounds,\n miniScale,\n worldToMini,\n viewportRectInMini,\n createMiniMap,\n miniMapVariants,\n miniMapDotClass,\n miniMapViewportClass,\n type MiniMapItem,\n type Rect,\n} from '@refraction-ui/mini-map'\nimport { cn } from '@refraction-ui/shared'\n\nexport type { MiniMapItem, Rect }\n\nexport interface MiniMapProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'results' | 'color' | 'content'\n > {\n /** Items to render as dots on the minimap. */\n items: MiniMapItem[]\n /** Current viewport in world coordinates. Renders a viewport indicator rect. */\n viewport?: Rect\n /** Width of the minimap box in px. */\n width?: number\n /** Height of the minimap box in px. */\n height?: number\n /** Padding inset in px (applied to all sides). */\n padding?: number\n /**\n * Called when the user clicks or drags in the minimap, with the new\n * world-space viewport center `{ x, y }`.\n */\n onViewportChange?: (center: { x: number; y: number }) => void\n}\n\n/**\n * MiniMap — a canvas/editor overview map.\n *\n * Renders each `MiniMapItem` as a positioned dot and an optional `viewport`\n * as a draggable indicator rectangle. All scale math lives in the headless\n * `@refraction-ui/mini-map` core; the React layer only handles event binding\n * and rendering. SSR-safe (no `Math.random` or `Date.now`).\n */\nexport const MiniMap = React.forwardRef<HTMLDivElement, MiniMapProps>(\n function MiniMap(\n {\n items,\n viewport,\n width = 200,\n height = 140,\n padding = 8,\n onViewportChange,\n className,\n ...props\n },\n ref,\n ) {\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const isDragging = React.useRef(false)\n\n const bounds = React.useMemo(() => contentBounds(items), [items])\n const scale = React.useMemo(\n () => miniScale(bounds, width, height, padding),\n [bounds, width, height, padding],\n )\n\n const viewportRect = React.useMemo(\n () =>\n viewport != null\n ? viewportRectInMini(viewport, bounds, scale, padding)\n : null,\n [viewport, bounds, scale, padding],\n )\n\n const { ariaProps, dataAttributes } = createMiniMap()\n\n const miniToWorld = React.useCallback(\n (miniX: number, miniY: number): { x: number; y: number } => {\n return {\n x: (miniX - padding) / scale + bounds.x,\n y: (miniY - padding) / scale + bounds.y,\n }\n },\n [scale, bounds, padding],\n )\n\n const handlePointerEvent = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!onViewportChange) return\n const el = containerRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const miniX = e.clientX - rect.left\n const miniY = e.clientY - rect.top\n onViewportChange(miniToWorld(miniX, miniY))\n },\n [onViewportChange, miniToWorld],\n )\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!onViewportChange) return\n isDragging.current = true\n ;(e.currentTarget as HTMLDivElement).setPointerCapture(e.pointerId)\n handlePointerEvent(e)\n },\n [onViewportChange, handlePointerEvent],\n )\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDragging.current) return\n handlePointerEvent(e)\n },\n [handlePointerEvent],\n )\n\n const handlePointerUp = React.useCallback(() => {\n isDragging.current = false\n }, [])\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n className={cn(\n miniMapVariants({ interactive: onViewportChange ? 'true' : 'false' }),\n className,\n )}\n style={{ width, height, position: 'relative' }}\n {...ariaProps}\n {...dataAttributes}\n onPointerDown={onViewportChange ? handlePointerDown : undefined}\n onPointerMove={onViewportChange ? handlePointerMove : undefined}\n onPointerUp={onViewportChange ? handlePointerUp : undefined}\n {...props}\n >\n {items.map((item) => {\n const pos = worldToMini(item, bounds, scale, padding)\n const w = (item.width ?? 8) * scale\n const h = (item.height ?? 8) * scale\n return (\n <span\n key={item.id}\n className={miniMapDotClass}\n style={{\n position: 'absolute',\n left: `${pos.x}px`,\n top: `${pos.y}px`,\n width: `${Math.max(4, w)}px`,\n height: `${Math.max(4, h)}px`,\n }}\n aria-hidden=\"true\"\n />\n )\n })}\n {viewportRect != null && (\n <span\n className={miniMapViewportClass}\n style={{\n position: 'absolute',\n left: `${viewportRect.x}px`,\n top: `${viewportRect.y}px`,\n width: `${viewportRect.width}px`,\n height: `${viewportRect.height}px`,\n }}\n aria-hidden=\"true\"\n />\n )}\n </div>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["MiniMap"]
7
+ }
@@ -0,0 +1,216 @@
1
+ import {
2
+ Keys,
3
+ cn,
4
+ createKeyboardHandler,
5
+ cva,
6
+ devWarn,
7
+ generateId
8
+ } from "./chunk-ZF3OHCGV.js";
9
+
10
+ // ../react-mobile-nav/dist/index.js
11
+ import * as React from "react";
12
+
13
+ // ../mobile-nav/dist/index.js
14
+ function createMobileNav(props = {}) {
15
+ const isOpen = props.open ?? false;
16
+ const id = props.id ?? generateId("rfr-mobile-nav");
17
+ const contentId = `${id}-content`;
18
+ const state = {
19
+ open: isOpen
20
+ };
21
+ const triggerProps = {
22
+ "aria-expanded": isOpen,
23
+ "aria-controls": contentId,
24
+ "aria-label": "Toggle menu"
25
+ };
26
+ const contentProps = {
27
+ id: contentId,
28
+ role: "menu",
29
+ "data-state": isOpen ? "open" : "closed"
30
+ };
31
+ function setOpen(value) {
32
+ state.open = value;
33
+ props.onOpenChange?.(value);
34
+ }
35
+ const toggle = () => setOpen(!state.open);
36
+ const open = () => setOpen(true);
37
+ const close = () => setOpen(false);
38
+ const keyboardHandlers = {
39
+ [Keys.Escape]: () => close()
40
+ };
41
+ return {
42
+ state,
43
+ triggerProps,
44
+ contentProps,
45
+ toggle,
46
+ open,
47
+ close,
48
+ keyboardHandlers
49
+ };
50
+ }
51
+ var mobileNavTokens = {
52
+ name: "mobile-nav",
53
+ tokens: {
54
+ bg: { variable: "--rfr-mobile-nav-bg", fallback: "hsl(var(--background))" },
55
+ fg: { variable: "--rfr-mobile-nav-fg", fallback: "hsl(var(--foreground))" },
56
+ border: { variable: "--rfr-mobile-nav-border", fallback: "hsl(var(--border))" }
57
+ }
58
+ };
59
+ var mobileNavVariants = cva({
60
+ base: "relative",
61
+ variants: {}
62
+ });
63
+ var mobileNavContentVariants = cva({
64
+ base: "w-full overflow-hidden border-b bg-background transition-all duration-200",
65
+ variants: {
66
+ state: {
67
+ open: "max-h-screen opacity-100 animate-in slide-in-from-top",
68
+ closed: "max-h-0 opacity-0 pointer-events-none animate-out slide-out-to-top"
69
+ }
70
+ },
71
+ defaultVariants: {
72
+ state: "closed"
73
+ }
74
+ });
75
+ var mobileNavTriggerVariants = cva({
76
+ base: "inline-flex items-center justify-center rounded-md p-2 transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2",
77
+ variants: {}
78
+ });
79
+ var mobileNavLinkVariants = cva({
80
+ base: "block w-full px-4 py-2 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2",
81
+ variants: {}
82
+ });
83
+
84
+ // ../react-mobile-nav/dist/index.js
85
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
86
+ var MobileNavContext = React.createContext(null);
87
+ function useMobileNavContext() {
88
+ const ctx = React.useContext(MobileNavContext);
89
+ if (!ctx) {
90
+ devWarn(
91
+ "react-mobile-nav/compound-outside-provider",
92
+ "A MobileNav compound component was rendered outside of <MobileNav>. Wrap it in <MobileNav>."
93
+ );
94
+ throw new Error("MobileNav compound components must be used within <MobileNav>");
95
+ }
96
+ return ctx;
97
+ }
98
+ var MobileNav = React.forwardRef(
99
+ function MobileNav2({ open: controlledOpen, onOpenChange, defaultOpen = false, className, children, ...props }, ref) {
100
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
101
+ const isControlled = controlledOpen !== void 0;
102
+ const open = isControlled ? controlledOpen : uncontrolledOpen;
103
+ const setOpen = React.useCallback(
104
+ (value) => {
105
+ if (!isControlled) {
106
+ setUncontrolledOpen(value);
107
+ }
108
+ onOpenChange?.(value);
109
+ },
110
+ [isControlled, onOpenChange]
111
+ );
112
+ const api = createMobileNav({ open, onOpenChange: setOpen, id: props.id });
113
+ const handleKeyDown = React.useMemo(
114
+ () => createKeyboardHandler(api.keyboardHandlers),
115
+ [open]
116
+ );
117
+ const contextValue = React.useMemo(
118
+ () => ({ open, setOpen, contentId: api.contentProps.id }),
119
+ [open, setOpen, api.contentProps.id]
120
+ );
121
+ return /* @__PURE__ */ jsx(MobileNavContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
122
+ "nav",
123
+ {
124
+ ref,
125
+ className: cn(mobileNavVariants(), className),
126
+ onKeyDown: handleKeyDown,
127
+ ...props,
128
+ children
129
+ }
130
+ ) });
131
+ }
132
+ );
133
+ var MobileNavTrigger = React.forwardRef(
134
+ function MobileNavTrigger2({ className, children, ...props }, ref) {
135
+ const { open, setOpen, contentId } = useMobileNavContext();
136
+ return /* @__PURE__ */ jsx(
137
+ "button",
138
+ {
139
+ ref,
140
+ type: "button",
141
+ "aria-expanded": open,
142
+ "aria-controls": contentId,
143
+ "aria-label": "Toggle menu",
144
+ className: cn(mobileNavTriggerVariants(), className),
145
+ onClick: () => setOpen(!open),
146
+ ...props,
147
+ children: children ?? /* @__PURE__ */ jsx(
148
+ "svg",
149
+ {
150
+ width: "24",
151
+ height: "24",
152
+ viewBox: "0 0 24 24",
153
+ fill: "none",
154
+ stroke: "currentColor",
155
+ strokeWidth: "2",
156
+ strokeLinecap: "round",
157
+ strokeLinejoin: "round",
158
+ "aria-hidden": "true",
159
+ children: open ? /* @__PURE__ */ jsxs(Fragment, { children: [
160
+ /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
161
+ /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
162
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
163
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "6", x2: "20", y2: "6" }),
164
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "12", x2: "20", y2: "12" }),
165
+ /* @__PURE__ */ jsx("line", { x1: "4", y1: "18", x2: "20", y2: "18" })
166
+ ] })
167
+ }
168
+ )
169
+ }
170
+ );
171
+ }
172
+ );
173
+ var MobileNavContent = React.forwardRef(
174
+ function MobileNavContent2({ className, children, ...props }, ref) {
175
+ const { open, contentId } = useMobileNavContext();
176
+ const state = open ? "open" : "closed";
177
+ return /* @__PURE__ */ jsx(
178
+ "div",
179
+ {
180
+ ref,
181
+ id: contentId,
182
+ role: "menu",
183
+ "data-state": state,
184
+ className: cn(mobileNavContentVariants({ state }), className),
185
+ ...props,
186
+ children
187
+ }
188
+ );
189
+ }
190
+ );
191
+ var MobileNavLink = React.forwardRef(
192
+ function MobileNavLink2({ className, children, ...props }, ref) {
193
+ return /* @__PURE__ */ jsx(
194
+ "a",
195
+ {
196
+ ref,
197
+ role: "menuitem",
198
+ className: cn(mobileNavLinkVariants(), className),
199
+ ...props,
200
+ children
201
+ }
202
+ );
203
+ }
204
+ );
205
+ export {
206
+ MobileNav,
207
+ MobileNavContent,
208
+ MobileNavLink,
209
+ MobileNavTrigger,
210
+ mobileNavContentVariants,
211
+ mobileNavLinkVariants,
212
+ mobileNavTokens,
213
+ mobileNavTriggerVariants,
214
+ mobileNavVariants
215
+ };
216
+ //# sourceMappingURL=react-mobile-nav.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../mobile-nav/src/mobile-nav.ts", "../../mobile-nav/src/mobile-nav.styles.ts", "../../react-mobile-nav/src/mobile-nav.tsx"],
4
+ "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface MobileNavProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n id?: string\n}\n\nexport interface MobileNavState {\n open: boolean\n}\n\nexport interface MobileNavAPI {\n /** Current state */\n state: MobileNavState\n /** ARIA and interaction props for the trigger button */\n triggerProps: Partial<AccessibilityProps> & Record<string, string | boolean | undefined>\n /** ARIA and data attributes for the content panel */\n contentProps: Partial<AccessibilityProps> & Record<string, string | boolean | undefined>\n /** Toggle open state */\n toggle: () => void\n /** Open the nav */\n open: () => void\n /** Close the nav */\n close: () => void\n /** Keyboard handlers (Escape closes) */\n keyboardHandlers: KeyboardHandlerMap\n}\n\nexport function createMobileNav(props: MobileNavProps = {}): MobileNavAPI {\n const isOpen = props.open ?? false\n const id = props.id ?? generateId('rfr-mobile-nav')\n const contentId = `${id}-content`\n\n const state: MobileNavState = {\n open: isOpen,\n }\n\n const triggerProps: MobileNavAPI['triggerProps'] = {\n 'aria-expanded': isOpen,\n 'aria-controls': contentId,\n 'aria-label': 'Toggle menu',\n }\n\n const contentProps: MobileNavAPI['contentProps'] = {\n id: contentId,\n role: 'menu',\n 'data-state': isOpen ? 'open' : 'closed',\n }\n\n function setOpen(value: boolean) {\n state.open = value\n props.onOpenChange?.(value)\n }\n\n const toggle = () => setOpen(!state.open)\n const open = () => setOpen(true)\n const close = () => setOpen(false)\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: () => close(),\n }\n\n return {\n state,\n triggerProps,\n contentProps,\n toggle,\n open,\n close,\n keyboardHandlers,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\nimport type { TokenContract } from '@refraction-ui/shared'\n\nexport const mobileNavTokens: TokenContract = {\n name: 'mobile-nav',\n tokens: {\n bg: { variable: '--rfr-mobile-nav-bg', fallback: 'hsl(var(--background))' },\n fg: { variable: '--rfr-mobile-nav-fg', fallback: 'hsl(var(--foreground))' },\n border: { variable: '--rfr-mobile-nav-border', fallback: 'hsl(var(--border))' },\n },\n}\n\nexport const mobileNavVariants = cva({\n base: 'relative',\n variants: {},\n})\n\nexport const mobileNavContentVariants = cva({\n base: 'w-full overflow-hidden border-b bg-background transition-all duration-200',\n variants: {\n state: {\n open: 'max-h-screen opacity-100 animate-in slide-in-from-top',\n closed: 'max-h-0 opacity-0 pointer-events-none animate-out slide-out-to-top',\n },\n },\n defaultVariants: {\n state: 'closed',\n },\n})\n\nexport const mobileNavTriggerVariants = cva({\n base: 'inline-flex items-center justify-center rounded-md p-2 transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variants: {},\n})\n\nexport const mobileNavLinkVariants = cva({\n base: 'block w-full px-4 py-2 text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2',\n variants: {},\n})\n", "import * as React from 'react'\nimport {\n createMobileNav,\n mobileNavVariants,\n mobileNavContentVariants,\n mobileNavTriggerVariants,\n mobileNavLinkVariants,\n} from '@refraction-ui/mobile-nav'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface MobileNavContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n contentId: string\n}\n\nconst MobileNavContext = React.createContext<MobileNavContextValue | null>(null)\n\nfunction useMobileNavContext(): MobileNavContextValue {\n const ctx = React.useContext(MobileNavContext)\n if (!ctx) {\n devWarn(\n 'react-mobile-nav/compound-outside-provider',\n 'A MobileNav compound component was rendered outside of <MobileNav>. Wrap it in <MobileNav>.',\n )\n throw new Error('MobileNav compound components must be used within <MobileNav>')\n }\n return ctx\n}\n\n/* ------------------------------------------------------------------ */\n/* MobileNav (root) */\n/* ------------------------------------------------------------------ */\n\nexport interface MobileNavProps extends React.HTMLAttributes<HTMLElement> {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n defaultOpen?: boolean\n}\n\n/**\n * MobileNav — root wrapper that manages open/closed state via context.\n * Supports both controlled (open + onOpenChange) and uncontrolled (defaultOpen) usage.\n */\nexport const MobileNav = React.forwardRef<HTMLElement, MobileNavProps>(\n function MobileNav({ open: controlledOpen, onOpenChange, defaultOpen = false, className, children, ...props }, ref) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(value)\n }\n onOpenChange?.(value)\n },\n [isControlled, onOpenChange],\n )\n\n const api = createMobileNav({ open, onOpenChange: setOpen, id: props.id })\n\n const handleKeyDown = React.useMemo(\n () => createKeyboardHandler(api.keyboardHandlers),\n [open],\n )\n\n const contextValue = React.useMemo<MobileNavContextValue>(\n () => ({ open, setOpen, contentId: api.contentProps.id as string }),\n [open, setOpen, api.contentProps.id],\n )\n\n return (\n <MobileNavContext.Provider value={contextValue}>\n <nav\n ref={ref}\n className={cn(mobileNavVariants(), className)}\n onKeyDown={handleKeyDown as unknown as React.KeyboardEventHandler}\n {...props}\n >\n {children}\n </nav>\n </MobileNavContext.Provider>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* MobileNavTrigger */\n/* ------------------------------------------------------------------ */\n\nexport interface MobileNavTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * MobileNavTrigger — hamburger button that toggles the mobile nav.\n */\nexport const MobileNavTrigger = React.forwardRef<HTMLButtonElement, MobileNavTriggerProps>(\n function MobileNavTrigger({ className, children, ...props }, ref) {\n const { open, setOpen, contentId } = useMobileNavContext()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-expanded={open}\n aria-controls={contentId}\n aria-label=\"Toggle menu\"\n className={cn(mobileNavTriggerVariants(), className)}\n onClick={() => setOpen(!open)}\n {...props}\n >\n {children ?? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {open ? (\n <>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </>\n ) : (\n <>\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </>\n )}\n </svg>\n )}\n </button>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* MobileNavContent */\n/* ------------------------------------------------------------------ */\n\nexport interface MobileNavContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * MobileNavContent — the collapsible dropdown panel that holds nav links.\n */\nexport const MobileNavContent = React.forwardRef<HTMLDivElement, MobileNavContentProps>(\n function MobileNavContent({ className, children, ...props }, ref) {\n const { open, contentId } = useMobileNavContext()\n const state = open ? 'open' : 'closed'\n\n return (\n <div\n ref={ref}\n id={contentId}\n role=\"menu\"\n data-state={state}\n className={cn(mobileNavContentVariants({ state }), className)}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\n/* ------------------------------------------------------------------ */\n/* MobileNavLink */\n/* ------------------------------------------------------------------ */\n\nexport interface MobileNavLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {}\n\n/**\n * MobileNavLink — a styled link inside the mobile nav dropdown.\n */\nexport const MobileNavLink = React.forwardRef<HTMLAnchorElement, MobileNavLinkProps>(\n function MobileNavLink({ className, children, ...props }, ref) {\n return (\n <a\n ref={ref}\n role=\"menuitem\"\n className={cn(mobileNavLinkVariants(), className)}\n {...props}\n >\n {children}\n </a>\n )\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["MobileNav", "MobileNavTrigger", "MobileNavContent", "MobileNavLink"]
7
+ }
@@ -0,0 +1,96 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-navbar/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../navbar/dist/index.js
10
+ function createNavbar(props = {}) {
11
+ const { currentPath = "/" } = props;
12
+ function isActive(href) {
13
+ if (href === "/") return currentPath === "/";
14
+ return currentPath.startsWith(href);
15
+ }
16
+ function linkAriaProps(href) {
17
+ const active = isActive(href);
18
+ return active ? { "aria-current": "page" } : {};
19
+ }
20
+ return {
21
+ ariaProps: { role: "navigation", "aria-label": "Main navigation" },
22
+ isActive,
23
+ linkAriaProps
24
+ };
25
+ }
26
+ var navbarVariants = cva({
27
+ base: "sticky top-0 z-40 w-full border-b",
28
+ variants: {
29
+ variant: {
30
+ solid: "bg-background",
31
+ blur: "bg-background/80 backdrop-blur-md",
32
+ gradient: "bg-gradient-to-b from-background to-background/80 backdrop-blur-sm",
33
+ transparent: "bg-transparent border-transparent"
34
+ }
35
+ },
36
+ defaultVariants: {
37
+ variant: "blur"
38
+ }
39
+ });
40
+ var navLinkVariants = cva({
41
+ base: "text-sm font-medium transition-colors hover:text-foreground",
42
+ variants: {
43
+ active: {
44
+ true: "text-foreground",
45
+ false: "text-muted-foreground"
46
+ }
47
+ },
48
+ defaultVariants: {
49
+ active: "false"
50
+ }
51
+ });
52
+
53
+ // ../react-navbar/dist/index.js
54
+ import { jsx, jsxs } from "react/jsx-runtime";
55
+ var Navbar = React.forwardRef(
56
+ function Navbar2({
57
+ links = [],
58
+ currentPath,
59
+ variant,
60
+ logo,
61
+ actions,
62
+ className,
63
+ ...props
64
+ }, ref) {
65
+ const api = createNavbar({ links, currentPath, variant });
66
+ const classes = cn(navbarVariants({ variant }), className);
67
+ return /* @__PURE__ */ jsx("header", { ref, className: classes, ...props, children: /* @__PURE__ */ jsxs(
68
+ "nav",
69
+ {
70
+ className: "mx-auto flex h-14 max-w-7xl items-center justify-between px-4",
71
+ ...api.ariaProps,
72
+ children: [
73
+ logo && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: logo }),
74
+ /* @__PURE__ */ jsx("ul", { className: "hidden items-center gap-6 md:flex", children: links.map((link) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
75
+ "a",
76
+ {
77
+ href: link.href,
78
+ className: navLinkVariants({
79
+ active: api.isActive(link.href) ? "true" : "false"
80
+ }),
81
+ ...api.linkAriaProps(link.href),
82
+ children: link.label
83
+ }
84
+ ) }, link.href)) }),
85
+ actions && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: actions })
86
+ ]
87
+ }
88
+ ) });
89
+ }
90
+ );
91
+ export {
92
+ Navbar,
93
+ navLinkVariants,
94
+ navbarVariants
95
+ };
96
+ //# sourceMappingURL=react-navbar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../navbar/src/navbar.ts", "../../navbar/src/navbar.styles.ts", "../../react-navbar/src/navbar.tsx"],
4
+ "sourcesContent": ["export interface NavLink {\n label: string\n href: string\n icon?: string\n}\n\nexport type NavbarVariant = 'solid' | 'blur' | 'gradient' | 'transparent'\n\nexport interface NavbarProps {\n links?: NavLink[]\n currentPath?: string\n variant?: NavbarVariant\n}\n\nexport interface NavbarAPI {\n ariaProps: Record<string, string>\n isActive: (href: string) => boolean\n linkAriaProps: (href: string) => Record<string, string>\n}\n\nexport function createNavbar(props: NavbarProps = {}): NavbarAPI {\n const { currentPath = '/' } = props\n\n function isActive(href: string): boolean {\n if (href === '/') return currentPath === '/'\n return currentPath.startsWith(href)\n }\n\n function linkAriaProps(href: string): Record<string, string> {\n const active = isActive(href)\n return active ? { 'aria-current': 'page' } : {}\n }\n\n return {\n ariaProps: { role: 'navigation', 'aria-label': 'Main navigation' },\n isActive,\n linkAriaProps,\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const navbarVariants = cva({\n base: 'sticky top-0 z-40 w-full border-b',\n variants: {\n variant: {\n solid: 'bg-background',\n blur: 'bg-background/80 backdrop-blur-md',\n gradient: 'bg-gradient-to-b from-background to-background/80 backdrop-blur-sm',\n transparent: 'bg-transparent border-transparent',\n },\n },\n defaultVariants: {\n variant: 'blur',\n },\n})\n\nexport const navLinkVariants = cva({\n base: 'text-sm font-medium transition-colors hover:text-foreground',\n variants: {\n active: {\n true: 'text-foreground',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n active: 'false',\n },\n})\n", "import * as React from 'react'\nimport {\n createNavbar,\n navbarVariants,\n navLinkVariants,\n type NavLink,\n type NavbarVariant,\n} from '@refraction-ui/navbar'\nimport { cn } from '@refraction-ui/shared'\n\nexport interface NavbarProps extends React.HTMLAttributes<HTMLElement> {\n /** Navigation links */\n links?: NavLink[]\n /** Current pathname for active state */\n currentPath?: string\n /** Visual variant */\n variant?: NavbarVariant\n /** Logo or brand slot */\n logo?: React.ReactNode\n /** Right-side actions slot */\n actions?: React.ReactNode\n}\n\n/**\n * Navbar component — renders a sticky header with navigation links.\n *\n * Uses the headless @refraction-ui/navbar core for state and ARIA attributes.\n * Hidden on mobile (links use md:flex).\n */\nexport const Navbar = React.forwardRef<HTMLElement, NavbarProps>(\n function Navbar(\n {\n links = [],\n currentPath,\n variant,\n logo,\n actions,\n className,\n ...props\n },\n ref,\n ) {\n const api = createNavbar({ links, currentPath, variant })\n const classes = cn(navbarVariants({ variant }), className)\n\n return (\n <header ref={ref} className={classes} {...props}>\n <nav\n className=\"mx-auto flex h-14 max-w-7xl items-center justify-between px-4\"\n {...api.ariaProps}\n >\n {logo && <div className=\"flex-shrink-0\">{logo}</div>}\n <ul className=\"hidden items-center gap-6 md:flex\">\n {links.map((link) => (\n <li key={link.href}>\n <a\n href={link.href}\n className={navLinkVariants({\n active: api.isActive(link.href) ? 'true' : 'false',\n })}\n {...api.linkAriaProps(link.href)}\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </nav>\n </header>\n )\n },\n)\n"],
5
+ "mappings": ";;;;;;;;;AAoBO,SAAS,aAAa,QAAqB,CAAA,GAAe;AAC/D,QAAM,EAAE,cAAc,IAAA,IAAQ;AAE9B,WAAS,SAAS,MAAuB;AACvC,QAAI,SAAS,IAAK,QAAO,gBAAgB;AACzC,WAAO,YAAY,WAAW,IAAI;EACpC;AAEA,WAAS,cAAc,MAAsC;AAC3D,UAAM,SAAS,SAAS,IAAI;AAC5B,WAAO,SAAS,EAAE,gBAAgB,OAAA,IAAW,CAAA;EAC/C;AAEA,SAAO;IACL,WAAW,EAAE,MAAM,cAAc,cAAc,kBAAA;IAC/C;IACA;EAAA;AAEJ;ACpCO,IAAM,iBAAiB,IAAI;EAChC,MAAM;EACN,UAAU;IACR,SAAS;MACP,OAAO;MACP,MAAM;MACN,UAAU;MACV,aAAa;IAAA;EACf;EAEF,iBAAiB;IACf,SAAS;EAAA;AAEb,CAAC;AAEM,IAAM,kBAAkB,IAAI;EACjC,MAAM;EACN,UAAU;IACR,QAAQ;MACN,MAAM;MACN,OAAO;IAAA;EACT;EAEF,iBAAiB;IACf,QAAQ;EAAA;AAEZ,CAAC;;;;ACCM,IAAM,SAAe;EAC1B,SAASA,QACP;IACE,QAAQ,CAAA;IACR;IACA;IACA;IACA;IACA;IACA,GAAG;EAAA,GAEL,KACA;AACA,UAAM,MAAM,aAAa,EAAE,OAAO,aAAa,QAAA,CAAS;AACxD,UAAM,UAAU,GAAG,eAAe,EAAE,QAAA,CAAS,GAAG,SAAS;AAEzD,WAAA,oBACG,UAAA,EAAO,KAAU,WAAW,SAAU,GAAG,OACxC,UAAA;MAAC;MAAA;QACC,WAAU;QACT,GAAG,IAAI;QAEP,UAAA;UAAA,QAAQ,oBAAC,OAAA,EAAI,WAAU,iBAAiB,UAAA,KAAA,CAAK;UAC9C,oBAAC,MAAA,EAAG,WAAU,qCACX,UAAA,MAAM,IAAI,CAAC,SACV,oBAAC,MAAA,EACC,UAAA;YAAC;YAAA;cACC,MAAM,KAAK;cACX,WAAW,gBAAgB;gBACzB,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS;cAAA,CAC5C;cACA,GAAG,IAAI,cAAc,KAAK,IAAI;cAE9B,UAAA,KAAK;YAAA;UAAA,EACR,GATO,KAAK,IAUd,CACD,EAAA,CACH;UACC,WAAW,oBAAC,OAAA,EAAI,WAAU,2BAA2B,UAAA,QAAA,CAAQ;QAAA;MAAA;IAAA,EAChE,CACF;EAEJ;AACF;",
6
+ "names": ["Navbar"]
7
+ }
@@ -0,0 +1,67 @@
1
+ import {
2
+ cn,
3
+ cva
4
+ } from "./chunk-ZF3OHCGV.js";
5
+
6
+ // ../react-numbered-steps/dist/index.js
7
+ import * as React from "react";
8
+
9
+ // ../numbered-steps/dist/index.js
10
+ function padOrdinal(n) {
11
+ return String(n).padStart(2, "0");
12
+ }
13
+ function stepColumns(count) {
14
+ return Math.min(5, Math.max(2, count));
15
+ }
16
+ function createNumberedSteps() {
17
+ const ariaProps = { role: "list" };
18
+ const dataAttributes = {
19
+ "data-component": "numbered-steps"
20
+ };
21
+ return { ariaProps, dataAttributes };
22
+ }
23
+ var numberedStepsVariants = cva({
24
+ base: "grid gap-6",
25
+ variants: {
26
+ columns: {
27
+ "2": "grid-cols-2",
28
+ "3": "grid-cols-3",
29
+ "4": "grid-cols-4",
30
+ "5": "grid-cols-5"
31
+ }
32
+ },
33
+ defaultVariants: {
34
+ columns: "3"
35
+ }
36
+ });
37
+ var numberedStepsItemClass = "rounded-xl border border-border bg-card p-5";
38
+ var numberedStepsOrdinalClass = "font-mono text-sm text-primary";
39
+ var numberedStepsTitleClass = "mt-2 text-sm font-bold text-foreground";
40
+ var numberedStepsBodyClass = "mt-1 text-xs text-muted-foreground leading-relaxed";
41
+
42
+ // ../react-numbered-steps/dist/index.js
43
+ import { jsx, jsxs } from "react/jsx-runtime";
44
+ var NumberedSteps = React.forwardRef(function NumberedSteps2({ items, columns, className, ...props }, ref) {
45
+ const cols = columns ?? stepColumns(items.length);
46
+ const { ariaProps, dataAttributes } = createNumberedSteps();
47
+ return /* @__PURE__ */ jsx(
48
+ "div",
49
+ {
50
+ ref,
51
+ className: cn(numberedStepsVariants(), className),
52
+ style: { gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` },
53
+ ...ariaProps,
54
+ ...dataAttributes,
55
+ ...props,
56
+ children: items.map((item, index) => /* @__PURE__ */ jsxs("div", { role: "listitem", className: numberedStepsItemClass, children: [
57
+ /* @__PURE__ */ jsx("span", { className: numberedStepsOrdinalClass, children: padOrdinal(index + 1) }),
58
+ /* @__PURE__ */ jsx("p", { className: numberedStepsTitleClass, children: item.title }),
59
+ /* @__PURE__ */ jsx("p", { className: numberedStepsBodyClass, children: item.body })
60
+ ] }, index))
61
+ }
62
+ );
63
+ });
64
+ export {
65
+ NumberedSteps
66
+ };
67
+ //# sourceMappingURL=react-numbered-steps.js.map