@invergent/ui-sdk 0.0.0-stage → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +70 -2
  2. package/dist/accordion.cjs +97 -0
  3. package/dist/accordion.cjs.map +1 -0
  4. package/dist/accordion.d.cts +10 -0
  5. package/dist/accordion.d.ts +10 -0
  6. package/dist/accordion.js +92 -0
  7. package/dist/accordion.js.map +1 -0
  8. package/dist/alert.cjs +82 -0
  9. package/dist/alert.cjs.map +1 -0
  10. package/dist/alert.d.cts +14 -0
  11. package/dist/alert.d.ts +14 -0
  12. package/dist/alert.js +77 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/avatar.cjs +110 -0
  15. package/dist/avatar.cjs.map +1 -0
  16. package/dist/avatar.d.cts +14 -0
  17. package/dist/avatar.d.ts +14 -0
  18. package/dist/avatar.js +103 -0
  19. package/dist/avatar.js.map +1 -0
  20. package/dist/badge.cjs +47 -0
  21. package/dist/badge.cjs.map +1 -0
  22. package/dist/badge.d.cts +13 -0
  23. package/dist/badge.d.ts +13 -0
  24. package/dist/badge.js +44 -0
  25. package/dist/badge.js.map +1 -0
  26. package/dist/brand-beam.cjs +2303 -0
  27. package/dist/brand-beam.cjs.map +1 -0
  28. package/dist/brand-beam.d.cts +36 -0
  29. package/dist/brand-beam.d.ts +36 -0
  30. package/dist/brand-beam.js +2301 -0
  31. package/dist/brand-beam.js.map +1 -0
  32. package/dist/button-group.cjs +80 -0
  33. package/dist/button-group.cjs.map +1 -0
  34. package/dist/button-group.d.cts +17 -0
  35. package/dist/button-group.d.ts +17 -0
  36. package/dist/button-group.js +75 -0
  37. package/dist/button-group.js.map +1 -0
  38. package/dist/button.cjs +17 -0
  39. package/dist/button.cjs.map +1 -0
  40. package/dist/button.d.cts +14 -0
  41. package/dist/button.d.ts +14 -0
  42. package/dist/button.js +4 -0
  43. package/dist/button.js.map +1 -0
  44. package/dist/card.cjs +109 -0
  45. package/dist/card.cjs.map +1 -0
  46. package/dist/card.d.cts +14 -0
  47. package/dist/card.d.ts +14 -0
  48. package/dist/card.js +101 -0
  49. package/dist/card.js.map +1 -0
  50. package/dist/chart.cjs +275 -0
  51. package/dist/chart.cjs.map +1 -0
  52. package/dist/chart.d.cts +47 -0
  53. package/dist/chart.d.ts +47 -0
  54. package/dist/chart.js +247 -0
  55. package/dist/chart.js.map +1 -0
  56. package/dist/checkbox.cjs +41 -0
  57. package/dist/checkbox.cjs.map +1 -0
  58. package/dist/checkbox.d.cts +7 -0
  59. package/dist/checkbox.d.ts +7 -0
  60. package/dist/checkbox.js +39 -0
  61. package/dist/checkbox.js.map +1 -0
  62. package/dist/chip.cjs +92 -0
  63. package/dist/chip.cjs.map +1 -0
  64. package/dist/chip.d.cts +33 -0
  65. package/dist/chip.d.ts +33 -0
  66. package/dist/chip.js +86 -0
  67. package/dist/chip.js.map +1 -0
  68. package/dist/choice-card.cjs +127 -0
  69. package/dist/choice-card.cjs.map +1 -0
  70. package/dist/choice-card.d.cts +20 -0
  71. package/dist/choice-card.d.ts +20 -0
  72. package/dist/choice-card.js +124 -0
  73. package/dist/choice-card.js.map +1 -0
  74. package/dist/chunk-2UHRDVPT.cjs +183 -0
  75. package/dist/chunk-2UHRDVPT.cjs.map +1 -0
  76. package/dist/chunk-5CRE35VX.js +20 -0
  77. package/dist/chunk-5CRE35VX.js.map +1 -0
  78. package/dist/chunk-6ARYCL4L.cjs +30 -0
  79. package/dist/chunk-6ARYCL4L.cjs.map +1 -0
  80. package/dist/chunk-6JCVTRUK.js +21 -0
  81. package/dist/chunk-6JCVTRUK.js.map +1 -0
  82. package/dist/chunk-6YHDDRIM.cjs +13 -0
  83. package/dist/chunk-6YHDDRIM.cjs.map +1 -0
  84. package/dist/chunk-A44JJ6NH.js +58 -0
  85. package/dist/chunk-A44JJ6NH.js.map +1 -0
  86. package/dist/chunk-CPAFEXKR.js +63 -0
  87. package/dist/chunk-CPAFEXKR.js.map +1 -0
  88. package/dist/chunk-CTIEUG5L.js +28 -0
  89. package/dist/chunk-CTIEUG5L.js.map +1 -0
  90. package/dist/chunk-DSDDDYG3.cjs +60 -0
  91. package/dist/chunk-DSDDDYG3.cjs.map +1 -0
  92. package/dist/chunk-IB7LTHEQ.js +55 -0
  93. package/dist/chunk-IB7LTHEQ.js.map +1 -0
  94. package/dist/chunk-ID7MWMJO.cjs +162 -0
  95. package/dist/chunk-ID7MWMJO.cjs.map +1 -0
  96. package/dist/chunk-IVMZANP7.cjs +67 -0
  97. package/dist/chunk-IVMZANP7.cjs.map +1 -0
  98. package/dist/chunk-L73QIINW.js +157 -0
  99. package/dist/chunk-L73QIINW.js.map +1 -0
  100. package/dist/chunk-LZGII7SX.js +11 -0
  101. package/dist/chunk-LZGII7SX.js.map +1 -0
  102. package/dist/chunk-M677T75H.js +24 -0
  103. package/dist/chunk-M677T75H.js.map +1 -0
  104. package/dist/chunk-NSK344BJ.js +80 -0
  105. package/dist/chunk-NSK344BJ.js.map +1 -0
  106. package/dist/chunk-OAVCB3MR.cjs +26 -0
  107. package/dist/chunk-OAVCB3MR.cjs.map +1 -0
  108. package/dist/chunk-PH733KDD.js +141 -0
  109. package/dist/chunk-PH733KDD.js.map +1 -0
  110. package/dist/chunk-QEBQ5NUN.cjs +148 -0
  111. package/dist/chunk-QEBQ5NUN.cjs.map +1 -0
  112. package/dist/chunk-RVX6SN4U.cjs +23 -0
  113. package/dist/chunk-RVX6SN4U.cjs.map +1 -0
  114. package/dist/chunk-T74Z3WTK.js +151 -0
  115. package/dist/chunk-T74Z3WTK.js.map +1 -0
  116. package/dist/chunk-UOUXW63J.cjs +22 -0
  117. package/dist/chunk-UOUXW63J.cjs.map +1 -0
  118. package/dist/chunk-UXSDDJXM.cjs +88 -0
  119. package/dist/chunk-UXSDDJXM.cjs.map +1 -0
  120. package/dist/chunk-VBICNC43.cjs +61 -0
  121. package/dist/chunk-VBICNC43.cjs.map +1 -0
  122. package/dist/collapsible-header.cjs +66 -0
  123. package/dist/collapsible-header.cjs.map +1 -0
  124. package/dist/collapsible-header.d.cts +15 -0
  125. package/dist/collapsible-header.d.ts +15 -0
  126. package/dist/collapsible-header.js +63 -0
  127. package/dist/collapsible-header.js.map +1 -0
  128. package/dist/collapsible.cjs +38 -0
  129. package/dist/collapsible.cjs.map +1 -0
  130. package/dist/collapsible.d.cts +8 -0
  131. package/dist/collapsible.d.ts +8 -0
  132. package/dist/collapsible.js +34 -0
  133. package/dist/collapsible.js.map +1 -0
  134. package/dist/color-picker.cjs +60 -0
  135. package/dist/color-picker.cjs.map +1 -0
  136. package/dist/color-picker.d.cts +12 -0
  137. package/dist/color-picker.d.ts +12 -0
  138. package/dist/color-picker.js +57 -0
  139. package/dist/color-picker.js.map +1 -0
  140. package/dist/command.cjs +177 -0
  141. package/dist/command.cjs.map +1 -0
  142. package/dist/command.d.cts +22 -0
  143. package/dist/command.d.ts +22 -0
  144. package/dist/command.js +167 -0
  145. package/dist/command.js.map +1 -0
  146. package/dist/confirm-dialog.cjs +72 -0
  147. package/dist/confirm-dialog.cjs.map +1 -0
  148. package/dist/confirm-dialog.d.cts +19 -0
  149. package/dist/confirm-dialog.d.ts +19 -0
  150. package/dist/confirm-dialog.js +70 -0
  151. package/dist/confirm-dialog.js.map +1 -0
  152. package/dist/control-styles.cjs +16 -0
  153. package/dist/control-styles.cjs.map +1 -0
  154. package/dist/control-styles.d.cts +7 -0
  155. package/dist/control-styles.d.ts +7 -0
  156. package/dist/control-styles.js +10 -0
  157. package/dist/control-styles.js.map +1 -0
  158. package/dist/dialog.cjs +50 -0
  159. package/dist/dialog.cjs.map +1 -0
  160. package/dist/dialog.d.cts +20 -0
  161. package/dist/dialog.d.ts +20 -0
  162. package/dist/dialog.js +5 -0
  163. package/dist/dialog.js.map +1 -0
  164. package/dist/dropdown-menu.cjs +265 -0
  165. package/dist/dropdown-menu.cjs.map +1 -0
  166. package/dist/dropdown-menu.d.cts +32 -0
  167. package/dist/dropdown-menu.d.ts +32 -0
  168. package/dist/dropdown-menu.js +249 -0
  169. package/dist/dropdown-menu.js.map +1 -0
  170. package/dist/empty-state.cjs +50 -0
  171. package/dist/empty-state.cjs.map +1 -0
  172. package/dist/empty-state.d.cts +23 -0
  173. package/dist/empty-state.d.ts +23 -0
  174. package/dist/empty-state.js +47 -0
  175. package/dist/empty-state.js.map +1 -0
  176. package/dist/field.cjs +221 -0
  177. package/dist/field.cjs.map +1 -0
  178. package/dist/field.d.cts +30 -0
  179. package/dist/field.d.ts +30 -0
  180. package/dist/field.js +210 -0
  181. package/dist/field.js.map +1 -0
  182. package/dist/hover-card.cjs +43 -0
  183. package/dist/hover-card.cjs.map +1 -0
  184. package/dist/hover-card.d.cts +9 -0
  185. package/dist/hover-card.d.ts +9 -0
  186. package/dist/hover-card.js +39 -0
  187. package/dist/hover-card.js.map +1 -0
  188. package/dist/input-group.cjs +36 -0
  189. package/dist/input-group.cjs.map +1 -0
  190. package/dist/input-group.d.cts +20 -0
  191. package/dist/input-group.d.ts +20 -0
  192. package/dist/input-group.js +7 -0
  193. package/dist/input-group.js.map +1 -0
  194. package/dist/input.cjs +13 -0
  195. package/dist/input.cjs.map +1 -0
  196. package/dist/input.d.cts +6 -0
  197. package/dist/input.d.ts +6 -0
  198. package/dist/input.js +4 -0
  199. package/dist/input.js.map +1 -0
  200. package/dist/item.cjs +196 -0
  201. package/dist/item.cjs.map +1 -0
  202. package/dist/item.d.cts +28 -0
  203. package/dist/item.d.ts +28 -0
  204. package/dist/item.js +185 -0
  205. package/dist/item.js.map +1 -0
  206. package/dist/label.cjs +13 -0
  207. package/dist/label.cjs.map +1 -0
  208. package/dist/label.d.cts +7 -0
  209. package/dist/label.d.ts +7 -0
  210. package/dist/label.js +4 -0
  211. package/dist/label.js.map +1 -0
  212. package/dist/lib/utils.cjs +12 -0
  213. package/dist/lib/utils.cjs.map +1 -0
  214. package/dist/lib/utils.d.cts +5 -0
  215. package/dist/lib/utils.d.ts +5 -0
  216. package/dist/lib/utils.js +3 -0
  217. package/dist/lib/utils.js.map +1 -0
  218. package/dist/list-row.cjs +188 -0
  219. package/dist/list-row.cjs.map +1 -0
  220. package/dist/list-row.d.cts +51 -0
  221. package/dist/list-row.d.ts +51 -0
  222. package/dist/list-row.js +164 -0
  223. package/dist/list-row.js.map +1 -0
  224. package/dist/pill-tabs.cjs +109 -0
  225. package/dist/pill-tabs.cjs.map +1 -0
  226. package/dist/pill-tabs.d.cts +24 -0
  227. package/dist/pill-tabs.d.ts +24 -0
  228. package/dist/pill-tabs.js +107 -0
  229. package/dist/pill-tabs.js.map +1 -0
  230. package/dist/popover.cjs +37 -0
  231. package/dist/popover.cjs.map +1 -0
  232. package/dist/popover.d.cts +13 -0
  233. package/dist/popover.d.ts +13 -0
  234. package/dist/popover.js +4 -0
  235. package/dist/popover.js.map +1 -0
  236. package/dist/progress-bar.cjs +40 -0
  237. package/dist/progress-bar.cjs.map +1 -0
  238. package/dist/progress-bar.d.cts +12 -0
  239. package/dist/progress-bar.d.ts +12 -0
  240. package/dist/progress-bar.js +38 -0
  241. package/dist/progress-bar.js.map +1 -0
  242. package/dist/rabbit-mark.cjs +30 -0
  243. package/dist/rabbit-mark.cjs.map +1 -0
  244. package/dist/rabbit-mark.d.cts +16 -0
  245. package/dist/rabbit-mark.d.ts +16 -0
  246. package/dist/rabbit-mark.js +26 -0
  247. package/dist/rabbit-mark.js.map +1 -0
  248. package/dist/responsive-panel.cjs +85 -0
  249. package/dist/responsive-panel.cjs.map +1 -0
  250. package/dist/responsive-panel.d.cts +33 -0
  251. package/dist/responsive-panel.d.ts +33 -0
  252. package/dist/responsive-panel.js +83 -0
  253. package/dist/responsive-panel.js.map +1 -0
  254. package/dist/scroll-area.cjs +63 -0
  255. package/dist/scroll-area.cjs.map +1 -0
  256. package/dist/scroll-area.d.cts +8 -0
  257. package/dist/scroll-area.d.ts +8 -0
  258. package/dist/scroll-area.js +60 -0
  259. package/dist/scroll-area.js.map +1 -0
  260. package/dist/section-label.cjs +30 -0
  261. package/dist/section-label.cjs.map +1 -0
  262. package/dist/section-label.d.cts +13 -0
  263. package/dist/section-label.d.ts +13 -0
  264. package/dist/section-label.js +28 -0
  265. package/dist/section-label.js.map +1 -0
  266. package/dist/segmented-control.cjs +75 -0
  267. package/dist/segmented-control.cjs.map +1 -0
  268. package/dist/segmented-control.d.cts +26 -0
  269. package/dist/segmented-control.d.ts +26 -0
  270. package/dist/segmented-control.js +53 -0
  271. package/dist/segmented-control.js.map +1 -0
  272. package/dist/select.cjs +193 -0
  273. package/dist/select.cjs.map +1 -0
  274. package/dist/select.d.cts +18 -0
  275. package/dist/select.d.ts +18 -0
  276. package/dist/select.js +182 -0
  277. package/dist/select.js.map +1 -0
  278. package/dist/separator.cjs +13 -0
  279. package/dist/separator.cjs.map +1 -0
  280. package/dist/separator.d.cts +7 -0
  281. package/dist/separator.d.ts +7 -0
  282. package/dist/separator.js +4 -0
  283. package/dist/separator.js.map +1 -0
  284. package/dist/sidebar.cjs +29 -0
  285. package/dist/sidebar.cjs.map +1 -0
  286. package/dist/sidebar.d.cts +58 -0
  287. package/dist/sidebar.d.ts +58 -0
  288. package/dist/sidebar.js +4 -0
  289. package/dist/sidebar.js.map +1 -0
  290. package/dist/skeleton.cjs +19 -0
  291. package/dist/skeleton.cjs.map +1 -0
  292. package/dist/skeleton.d.cts +5 -0
  293. package/dist/skeleton.d.ts +5 -0
  294. package/dist/skeleton.js +17 -0
  295. package/dist/skeleton.js.map +1 -0
  296. package/dist/sonner.cjs +40 -0
  297. package/dist/sonner.cjs.map +1 -0
  298. package/dist/sonner.d.cts +6 -0
  299. package/dist/sonner.d.ts +6 -0
  300. package/dist/sonner.js +38 -0
  301. package/dist/sonner.js.map +1 -0
  302. package/dist/sparkline.cjs +44 -0
  303. package/dist/sparkline.cjs.map +1 -0
  304. package/dist/sparkline.d.cts +12 -0
  305. package/dist/sparkline.d.ts +12 -0
  306. package/dist/sparkline.js +42 -0
  307. package/dist/sparkline.js.map +1 -0
  308. package/dist/spinner.cjs +13 -0
  309. package/dist/spinner.cjs.map +1 -0
  310. package/dist/spinner.d.cts +5 -0
  311. package/dist/spinner.d.ts +5 -0
  312. package/dist/spinner.js +11 -0
  313. package/dist/spinner.js.map +1 -0
  314. package/dist/stat-card.cjs +65 -0
  315. package/dist/stat-card.cjs.map +1 -0
  316. package/dist/stat-card.d.cts +22 -0
  317. package/dist/stat-card.d.ts +22 -0
  318. package/dist/stat-card.js +61 -0
  319. package/dist/stat-card.js.map +1 -0
  320. package/dist/status-dot.cjs +32 -0
  321. package/dist/status-dot.cjs.map +1 -0
  322. package/dist/status-dot.d.cts +11 -0
  323. package/dist/status-dot.d.ts +11 -0
  324. package/dist/status-dot.js +29 -0
  325. package/dist/status-dot.js.map +1 -0
  326. package/dist/switch.cjs +38 -0
  327. package/dist/switch.cjs.map +1 -0
  328. package/dist/switch.d.cts +9 -0
  329. package/dist/switch.d.ts +9 -0
  330. package/dist/switch.js +36 -0
  331. package/dist/switch.js.map +1 -0
  332. package/dist/table.cjs +118 -0
  333. package/dist/table.cjs.map +1 -0
  334. package/dist/table.d.cts +13 -0
  335. package/dist/table.d.ts +13 -0
  336. package/dist/table.js +109 -0
  337. package/dist/table.js.map +1 -0
  338. package/dist/tabs.cjs +124 -0
  339. package/dist/tabs.cjs.map +1 -0
  340. package/dist/tabs.d.cts +15 -0
  341. package/dist/tabs.d.ts +15 -0
  342. package/dist/tabs.js +118 -0
  343. package/dist/tabs.js.map +1 -0
  344. package/dist/text-link.cjs +51 -0
  345. package/dist/text-link.cjs.map +1 -0
  346. package/dist/text-link.d.cts +15 -0
  347. package/dist/text-link.d.ts +15 -0
  348. package/dist/text-link.js +48 -0
  349. package/dist/text-link.js.map +1 -0
  350. package/dist/textarea.cjs +13 -0
  351. package/dist/textarea.cjs.map +1 -0
  352. package/dist/textarea.d.cts +6 -0
  353. package/dist/textarea.d.ts +6 -0
  354. package/dist/textarea.js +4 -0
  355. package/dist/textarea.js.map +1 -0
  356. package/dist/theme.css +109 -0
  357. package/dist/timeline.cjs +171 -0
  358. package/dist/timeline.cjs.map +1 -0
  359. package/dist/timeline.d.cts +28 -0
  360. package/dist/timeline.d.ts +28 -0
  361. package/dist/timeline.js +162 -0
  362. package/dist/timeline.js.map +1 -0
  363. package/dist/toggle-group.cjs +155 -0
  364. package/dist/toggle-group.cjs.map +1 -0
  365. package/dist/toggle-group.d.cts +31 -0
  366. package/dist/toggle-group.d.ts +31 -0
  367. package/dist/toggle-group.js +130 -0
  368. package/dist/toggle-group.js.map +1 -0
  369. package/dist/toggle.cjs +21 -0
  370. package/dist/toggle.cjs.map +1 -0
  371. package/dist/toggle.d.cts +23 -0
  372. package/dist/toggle.d.ts +23 -0
  373. package/dist/toggle.js +4 -0
  374. package/dist/toggle.js.map +1 -0
  375. package/dist/tokens.css +77 -0
  376. package/dist/tooltip.cjs +25 -0
  377. package/dist/tooltip.cjs.map +1 -0
  378. package/dist/tooltip.d.cts +10 -0
  379. package/dist/tooltip.d.ts +10 -0
  380. package/dist/tooltip.js +4 -0
  381. package/dist/tooltip.js.map +1 -0
  382. package/package.json +61 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rabbit-mark.tsx"],"names":[],"mappings":";;;AAeO,IAAM,gBAAA,GACX;AAGK,IAAM,eAAA,GAAkB;AAAA,EAC7B,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG,KAAA;AAAA,EACH,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG;AACL;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAA2B;AAChE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,OAAA,EAAQ,+BAAA;AAAA,MACR,IAAA,EAAK,cAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MAEZ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAG,gBAAA,EAAkB;AAAA;AAAA,GAC7B;AAEJ","file":"rabbit-mark.js","sourcesContent":["// Copyright (c) 2026, Invergent SA, developed by Flavius Burca\n// SPDX-License-Identifier: AGPL-3.0-only\n//\n// The Surogate rabbit, as one path.\n//\n// Lifted from the brand favicon and stripped to the silhouette: the\n// circle, the amber ground and the registered mark all belong to the\n// full lockup, not to a 16px glyph. The viewBox is the path's own\n// bounding box, so the mark fills whatever box it is given the way a\n// lucide icon does, and `currentColor` lets it inherit like one too.\n//\n// The path is exported on its own because the whiteboard also paints\n// it onto a canvas, where there is no DOM to render an `<svg>` into.\n\n/** The rabbit silhouette, in the coordinate space of {@link RABBIT_MARK_BOX}. */\nexport const RABBIT_MARK_PATH =\n \"M49.71,46.83c0,.23.02.45.07.67,2.1.49,4.16,1.07,6.18,1.74.58-.64.94-1.48.94-2.42,0-1.98-1.61-3.59-3.59-3.59s-3.59,1.61-3.59,3.59M33.95,78.3c3.1-5.1,6.72-8.89,11.64-12.21.61-.42,1.24-.8,1.88-1.17.44-.25.61-.66.58-1.05,0-.53-.49-.91-.93-1.12-1.34-.62-2.72-1.5-4.06-2.54-1.57-1.22-3.01-2.59-4.36-4.06-.95-1.04-2.02-2.38-3-3.81-.81-1.18-.63-2.77.43-3.73,1.1-1,2.26-1.92,3.48-2.76.36-.25.72-.49,1.1-.73,2.43-1.55,5.05-2.79,7.79-3.7,3.23-1.07,6.62-1.66,10.03-1.74.59-.35,1.19-.69,1.8-1.01,1.66-.88,3.38-1.62,5.17-2.21,1.58-.54,3.2-.95,4.85-1.24,3.28-.59,6.64-.7,9.95-.32,1.23.14,2.45.34,3.68.62,2.87.64,5.59,1.62,8.09,2.9.54.27.71.95.36,1.45-1.58,2.22-3.46,4.25-5.5,6.05-3.01,2.65-6.51,4.75-10.26,6.17-2.32.88-4.75,1.53-7.22,1.91-.62.1-.78.9-.24,1.22,0,0,.01,0,.02.01,6.97,4.05,13.1,9.22,18.36,15.32.72.83,1.42,1.68,2.1,2.53,3.36,4.22,6.23,8.82,8.56,13.68,1.8,3.73,3.27,7.63,4.39,11.62.73,2.6,1.34,5.24,1.76,7.91.11.76-.87,1.16-1.3.53-1.15-1.69-2.31-3.35-3.61-4.93-1.2-1.46-2.46-2.86-3.75-4.24-5.44-5.8-11.84-10.7-18.84-14.48-7.32-3.94-15.09-6.38-23.44-6.53-2.23-.04-4.46.08-6.68.3-4.05.43-8.02,1.28-11.93,2.4-.03,0-.05.01-.08.02,0,0-.01,0-.02,0-.07.02-.14.03-.21.03-.53,0-.91-.6-.61-1.09M50.95,12.97c-1.31,1.16-2.2,2.71-2.9,4.29-1.66,3.74-2.85,7.74-3.52,11.77-.32,1.92-.56,3.87-1.28,5.69-.17.44-.37.87-.6,1.28-1.18,2.1-3.37,3.19-5.6,3.86-4.96,1.47-10.14,1.97-15.25,2.65-2.37.31-8.03,1.12-7.34,4.69.46,2.36,2.26,4.16,4.08,5.6,2.66,2.11,5.44,4.09,8.33,5.88,1.87,1.15,3.85,2.11,5.6,3.44,1.74,1.33,3.15,3.05,3.58,5.25.22,1.16-.18,2.35-1,3.2-1.57,1.63-3,3.41-4.25,5.29-1.32,2.1-2.38,4.35-3.25,6.65-.59,1.44.97,2.98,2.41,2.37.53-.21,1.07-.41,1.61-.61,2.26-.82,4.68.73,4.93,3.12.17,1.61.38,3.17.63,4.57.46,2.57,3.14,3.63,5.32,1.41,2.84-2.88,4.66-6.31,7.84-8.86,2.53-2.03,6.26-4.17,9.71-3.59,3.17.56,6.27,1.52,9.23,2.85,5.32,2.32,10.36,5.29,14.95,8.86,9.17,7.1,16.56,16.51,21.27,27.1.93,2.07,4.03,1.44,4.1-.83.55-17.71-5.72-35.46-17.11-49.01-2.87-3.42-6.07-6.65-9.59-9.44-.88-.8-1.54-1.7-1.38-2.93.38-2.97,2-4.32,4.04-5.85,2.51-1.89,5.02-3.85,7.16-6.21.03-.03.06-.06.09-.1,1.24-1.37,2.38-2.83,3.4-4.37,1.2-1.81.6-4.26-1.3-5.31,0,0-.96-.52-1.45-.76-2.72-1.34-5.61-2.36-8.6-3.03-2.76-.62-5.58-.93-8.38-.93-2.38,0-4.76.22-7.09.67-1.96.37-3.97-.31-5.25-1.84-.28-.34-.54-.69-.79-1.04-.58-.84-1.09-1.71-1.63-2.58-1.29-2.06-1.87-3.63-2.89-5.84-1.06-2.29-1.85-4.73-3.26-6.86-.73-1.11-1.53-1.54-2.32-1.54s-1.54.41-2.24,1.02\";\n\n/** The path's bounding box: what to scale against when painting it. */\nexport const RABBIT_MARK_BOX = {\n x: 14.4021,\n y: 11.93,\n w: 95.1813,\n h: 109.058,\n} as const;\n\nexport function RabbitMark({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n viewBox=\"14.4021 11.93 95.1813 109.058\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d={RABBIT_MARK_PATH} />\n </svg>\n );\n}\n"]}
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var chunkUXSDDJXM_cjs = require('./chunk-UXSDDJXM.cjs');
4
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
5
+ var radixUi = require('radix-ui');
6
+ var react = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ var MOBILE_QUERY = "(max-width: 767px)";
10
+ function subscribe(onChange) {
11
+ const mql = window.matchMedia(MOBILE_QUERY);
12
+ mql.addEventListener("change", onChange);
13
+ return () => mql.removeEventListener("change", onChange);
14
+ }
15
+ function useIsMobile() {
16
+ return react.useSyncExternalStore(
17
+ subscribe,
18
+ () => window.matchMedia(MOBILE_QUERY).matches,
19
+ // No viewport when server-rendered; assume desktop, as the components do.
20
+ () => false
21
+ );
22
+ }
23
+ function ResponsivePanel({
24
+ open,
25
+ onOpenChange,
26
+ trigger,
27
+ title,
28
+ children,
29
+ align = "start",
30
+ popoverClassName
31
+ }) {
32
+ const isMobile = useIsMobile();
33
+ if (!isMobile) {
34
+ return /* @__PURE__ */ jsxRuntime.jsxs(chunkUXSDDJXM_cjs.Popover, { open, onOpenChange, children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUXSDDJXM_cjs.PopoverTrigger, { asChild: true, children: trigger }),
36
+ /* @__PURE__ */ jsxRuntime.jsx(
37
+ chunkUXSDDJXM_cjs.PopoverContent,
38
+ {
39
+ side: "top",
40
+ align,
41
+ className: chunk6YHDDRIM_cjs.cn("w-64 overflow-hidden rounded-xl p-1", popoverClassName),
42
+ children
43
+ }
44
+ )
45
+ ] });
46
+ }
47
+ return /* @__PURE__ */ jsxRuntime.jsxs(radixUi.Dialog.Root, { open, onOpenChange, children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(radixUi.Dialog.Trigger, { asChild: true, children: trigger }),
49
+ /* @__PURE__ */ jsxRuntime.jsxs(radixUi.Dialog.Portal, { children: [
50
+ /* @__PURE__ */ jsxRuntime.jsx(
51
+ radixUi.Dialog.Overlay,
52
+ {
53
+ "data-slot": "responsive-panel-overlay",
54
+ className: "fixed inset-0 z-50 bg-black/40 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsxRuntime.jsxs(
58
+ radixUi.Dialog.Content,
59
+ {
60
+ "data-slot": "responsive-panel-sheet",
61
+ "aria-describedby": void 0,
62
+ className: chunk6YHDDRIM_cjs.cn(
63
+ "fixed inset-x-0 bottom-0 z-50 flex max-h-[80svh] flex-col overflow-hidden rounded-t-2xl border-t border-border bg-popover pb-[env(safe-area-inset-bottom)] text-popover-foreground shadow-lg",
64
+ "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom"
65
+ ),
66
+ children: [
67
+ /* @__PURE__ */ jsxRuntime.jsx(radixUi.Dialog.Title, { className: "sr-only", children: title }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(
69
+ "div",
70
+ {
71
+ "aria-hidden": "true",
72
+ className: "mx-auto mt-2.5 mb-1 h-1 w-9 shrink-0 rounded-full bg-muted-foreground/30"
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain p-1", children })
76
+ ]
77
+ }
78
+ )
79
+ ] })
80
+ ] });
81
+ }
82
+
83
+ exports.ResponsivePanel = ResponsivePanel;
84
+ //# sourceMappingURL=responsive-panel.cjs.map
85
+ //# sourceMappingURL=responsive-panel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/use-is-mobile.ts","../src/responsive-panel.tsx"],"names":["useSyncExternalStore","jsxs","Popover","jsx","PopoverTrigger","PopoverContent","cn","DialogPrimitive"],"mappings":";;;;;;;;AAQA,IAAM,YAAA,GAAe,oBAAA;AAOrB,SAAS,UAAU,QAAA,EAAkC;AACnD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAC1C,EAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,EAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AACzD;AASO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAOA,0BAAA;AAAA,IACL,SAAA;AAAA,IACA,MAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA,CAAE,OAAA;AAAA;AAAA,IAEtC,MAAM;AAAA,GACR;AACF;ACUO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,uBACEC,eAAA,CAACC,yBAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EACnB,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACC,gCAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACjCD,cAAA;AAAA,QAACE,gCAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,KAAA;AAAA,UACL,KAAA;AAAA,UACA,SAAA,EAAWC,oBAAA,CAAG,qCAAA,EAAuC,gBAAgB,CAAA;AAAA,UAEpE;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEL,eAAA,CAACM,cAAA,CAAgB,IAAA,EAAhB,EAAqB,MAAY,YAAA,EAChC,QAAA,EAAA;AAAA,oBAAAJ,cAAA,CAACI,cAAA,CAAgB,OAAA,EAAhB,EAAwB,OAAA,EAAO,MAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBAC1CN,eAAA,CAACM,cAAA,CAAgB,MAAA,EAAhB,EACC,QAAA,EAAA;AAAA,sBAAAJ,cAAA;AAAA,QAACI,cAAA,CAAgB,OAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,0BAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACAN,eAAA;AAAA,QAACM,cAAA,CAAgB,OAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,wBAAA;AAAA,UACV,kBAAA,EAAkB,MAAA;AAAA,UAClB,SAAA,EAAWD,oBAAA;AAAA,YACT,8LAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAH,cAAA,CAACI,cAAA,CAAgB,KAAA,EAAhB,EAAsB,SAAA,EAAU,WAC9B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,4BAIAJ,cAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAY,MAAA;AAAA,gBACZ,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EACH;AAAA;AAAA;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"responsive-panel.cjs","sourcesContent":["import { useSyncExternalStore } from \"react\";\n\n/**\n * The `md` breakpoint, matching the Tailwind default the components'\n * responsive classes use. Anything that needs to *render* differently on a\n * phone (rather than just restyle) reads this; a media query alone cannot\n * swap a popover for a sheet, because they are different components.\n */\nconst MOBILE_QUERY = \"(max-width: 767px)\";\n\n// Deliberately not caching the MediaQueryList across calls. getSnapshot does\n// run per render, but matchMedia is ~1µs and a module-level cache would pin\n// the first `window.matchMedia` this module ever saw — which makes the hook\n// untestable by stubbing it, and the sheet branch is only reachable in tests\n// that way. Not a trade worth making for a cost that does not register.\nfunction subscribe(onChange: () => void): () => void {\n const mql = window.matchMedia(MOBILE_QUERY);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n}\n\n/**\n * True while the viewport is narrower than `md`.\n *\n * Reads synchronously on the first render rather than filling in from an\n * effect: a value that says \"desktop\" for one frame is invisible for a class\n * name and wrong for anything that decides *which component to mount*.\n */\nexport function useIsMobile(): boolean {\n return useSyncExternalStore(\n subscribe,\n () => window.matchMedia(MOBILE_QUERY).matches,\n // No viewport when server-rendered; assume desktop, as the components do.\n () => false,\n );\n}\n","// A panel that is a popover with a cursor and a bottom sheet on a phone.\n//\n// The composer's secondary controls (tools, session context) open panels that\n// are anchored above a ~32px button. That is right on a desktop and wrong on a\n// phone: an anchored popover near the bottom of the screen has nowhere to go,\n// its content is capped by whatever space is left above the composer, and the\n// whole thing sits under the thumb that opened it. A sheet rising from the\n// bottom edge has the full width, as much height as it needs, and lands where\n// the hand already is.\n//\n// The two are different components, not one component with different classes,\n// so the choice is made in JS — see useIsMobile.\n\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useIsMobile } from \"./lib/use-is-mobile\";\nimport { cn } from \"./lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport interface ResponsivePanelProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The control that opens the panel. Rendered as the trigger in both forms. */\n trigger: ReactNode;\n /**\n * Names the sheet for screen readers. Radix Dialog requires an accessible\n * name; it is visually hidden, since the panel's own contents are labelled.\n */\n title: string;\n children: ReactNode;\n /** Popover-only; the sheet is always full width. */\n align?: ComponentProps<typeof PopoverContent>[\"align\"];\n /**\n * Styling for the popover form only.\n *\n * Deliberately not a shared `className`: `cn` is tailwind-merge, so a class\n * written for the popover silently deletes a conflicting one from the\n * sheet's own base list. `p-0` and `pb-[env(safe-area-inset-bottom)]` are\n * the same conflict group, so passing the popover's `p-0` through dropped\n * the sheet's home-indicator inset — and a `divide-y` meant for the\n * popover's sections drew a rule under the sheet's grab handle instead.\n */\n popoverClassName?: string;\n}\n\nexport function ResponsivePanel({\n open,\n onOpenChange,\n trigger,\n title,\n children,\n align = \"start\",\n popoverClassName,\n}: ResponsivePanelProps) {\n const isMobile = useIsMobile();\n\n if (!isMobile) {\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align={align}\n className={cn(\"w-64 overflow-hidden rounded-xl p-1\", popoverClassName)}\n >\n {children}\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Trigger asChild>{trigger}</DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n data-slot=\"responsive-panel-overlay\"\n className=\"fixed inset-0 z-50 bg-black/40 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\"\n />\n <DialogPrimitive.Content\n data-slot=\"responsive-panel-sheet\"\n aria-describedby={undefined}\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 flex max-h-[80svh] flex-col overflow-hidden rounded-t-2xl border-t border-border bg-popover pb-[env(safe-area-inset-bottom)] text-popover-foreground shadow-lg\",\n \"data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom\",\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">\n {title}\n </DialogPrimitive.Title>\n {/* Not draggable — Radix has no drag gesture and the sheet is short\n enough that a grab bar would only promise one. It reads as the\n handle the shape implies while staying purely decorative. */}\n <div\n aria-hidden=\"true\"\n className=\"mx-auto mt-2.5 mb-1 h-1 w-9 shrink-0 rounded-full bg-muted-foreground/30\"\n />\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1\">\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, ComponentProps } from 'react';
3
+ import { PopoverContent } from './popover.cjs';
4
+ import 'radix-ui';
5
+
6
+ interface ResponsivePanelProps {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ /** The control that opens the panel. Rendered as the trigger in both forms. */
10
+ trigger: ReactNode;
11
+ /**
12
+ * Names the sheet for screen readers. Radix Dialog requires an accessible
13
+ * name; it is visually hidden, since the panel's own contents are labelled.
14
+ */
15
+ title: string;
16
+ children: ReactNode;
17
+ /** Popover-only; the sheet is always full width. */
18
+ align?: ComponentProps<typeof PopoverContent>["align"];
19
+ /**
20
+ * Styling for the popover form only.
21
+ *
22
+ * Deliberately not a shared `className`: `cn` is tailwind-merge, so a class
23
+ * written for the popover silently deletes a conflicting one from the
24
+ * sheet's own base list. `p-0` and `pb-[env(safe-area-inset-bottom)]` are
25
+ * the same conflict group, so passing the popover's `p-0` through dropped
26
+ * the sheet's home-indicator inset — and a `divide-y` meant for the
27
+ * popover's sections drew a rule under the sheet's grab handle instead.
28
+ */
29
+ popoverClassName?: string;
30
+ }
31
+ declare function ResponsivePanel({ open, onOpenChange, trigger, title, children, align, popoverClassName, }: ResponsivePanelProps): react_jsx_runtime.JSX.Element;
32
+
33
+ export { ResponsivePanel, type ResponsivePanelProps };
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, ComponentProps } from 'react';
3
+ import { PopoverContent } from './popover.js';
4
+ import 'radix-ui';
5
+
6
+ interface ResponsivePanelProps {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ /** The control that opens the panel. Rendered as the trigger in both forms. */
10
+ trigger: ReactNode;
11
+ /**
12
+ * Names the sheet for screen readers. Radix Dialog requires an accessible
13
+ * name; it is visually hidden, since the panel's own contents are labelled.
14
+ */
15
+ title: string;
16
+ children: ReactNode;
17
+ /** Popover-only; the sheet is always full width. */
18
+ align?: ComponentProps<typeof PopoverContent>["align"];
19
+ /**
20
+ * Styling for the popover form only.
21
+ *
22
+ * Deliberately not a shared `className`: `cn` is tailwind-merge, so a class
23
+ * written for the popover silently deletes a conflicting one from the
24
+ * sheet's own base list. `p-0` and `pb-[env(safe-area-inset-bottom)]` are
25
+ * the same conflict group, so passing the popover's `p-0` through dropped
26
+ * the sheet's home-indicator inset — and a `divide-y` meant for the
27
+ * popover's sections drew a rule under the sheet's grab handle instead.
28
+ */
29
+ popoverClassName?: string;
30
+ }
31
+ declare function ResponsivePanel({ open, onOpenChange, trigger, title, children, align, popoverClassName, }: ResponsivePanelProps): react_jsx_runtime.JSX.Element;
32
+
33
+ export { ResponsivePanel, type ResponsivePanelProps };
@@ -0,0 +1,83 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-NSK344BJ.js';
2
+ import { cn } from './chunk-LZGII7SX.js';
3
+ import { Dialog } from 'radix-ui';
4
+ import { useSyncExternalStore } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var MOBILE_QUERY = "(max-width: 767px)";
8
+ function subscribe(onChange) {
9
+ const mql = window.matchMedia(MOBILE_QUERY);
10
+ mql.addEventListener("change", onChange);
11
+ return () => mql.removeEventListener("change", onChange);
12
+ }
13
+ function useIsMobile() {
14
+ return useSyncExternalStore(
15
+ subscribe,
16
+ () => window.matchMedia(MOBILE_QUERY).matches,
17
+ // No viewport when server-rendered; assume desktop, as the components do.
18
+ () => false
19
+ );
20
+ }
21
+ function ResponsivePanel({
22
+ open,
23
+ onOpenChange,
24
+ trigger,
25
+ title,
26
+ children,
27
+ align = "start",
28
+ popoverClassName
29
+ }) {
30
+ const isMobile = useIsMobile();
31
+ if (!isMobile) {
32
+ return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange, children: [
33
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: trigger }),
34
+ /* @__PURE__ */ jsx(
35
+ PopoverContent,
36
+ {
37
+ side: "top",
38
+ align,
39
+ className: cn("w-64 overflow-hidden rounded-xl p-1", popoverClassName),
40
+ children
41
+ }
42
+ )
43
+ ] });
44
+ }
45
+ return /* @__PURE__ */ jsxs(Dialog.Root, { open, onOpenChange, children: [
46
+ /* @__PURE__ */ jsx(Dialog.Trigger, { asChild: true, children: trigger }),
47
+ /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
48
+ /* @__PURE__ */ jsx(
49
+ Dialog.Overlay,
50
+ {
51
+ "data-slot": "responsive-panel-overlay",
52
+ className: "fixed inset-0 z-50 bg-black/40 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0"
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsxs(
56
+ Dialog.Content,
57
+ {
58
+ "data-slot": "responsive-panel-sheet",
59
+ "aria-describedby": void 0,
60
+ className: cn(
61
+ "fixed inset-x-0 bottom-0 z-50 flex max-h-[80svh] flex-col overflow-hidden rounded-t-2xl border-t border-border bg-popover pb-[env(safe-area-inset-bottom)] text-popover-foreground shadow-lg",
62
+ "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom"
63
+ ),
64
+ children: [
65
+ /* @__PURE__ */ jsx(Dialog.Title, { className: "sr-only", children: title }),
66
+ /* @__PURE__ */ jsx(
67
+ "div",
68
+ {
69
+ "aria-hidden": "true",
70
+ className: "mx-auto mt-2.5 mb-1 h-1 w-9 shrink-0 rounded-full bg-muted-foreground/30"
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain p-1", children })
74
+ ]
75
+ }
76
+ )
77
+ ] })
78
+ ] });
79
+ }
80
+
81
+ export { ResponsivePanel };
82
+ //# sourceMappingURL=responsive-panel.js.map
83
+ //# sourceMappingURL=responsive-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/use-is-mobile.ts","../src/responsive-panel.tsx"],"names":["DialogPrimitive"],"mappings":";;;;;;AAQA,IAAM,YAAA,GAAe,oBAAA;AAOrB,SAAS,UAAU,QAAA,EAAkC;AACnD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAC1C,EAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,EAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AACzD;AASO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,oBAAA;AAAA,IACL,SAAA;AAAA,IACA,MAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA,CAAE,OAAA;AAAA;AAAA,IAEtC,MAAM;AAAA,GACR;AACF;ACUO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EACnB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACjC,GAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,KAAA;AAAA,UACL,KAAA;AAAA,UACA,SAAA,EAAW,EAAA,CAAG,qCAAA,EAAuC,gBAAgB,CAAA;AAAA,UAEpE;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAACA,MAAA,CAAgB,IAAA,EAAhB,EAAqB,MAAY,YAAA,EAChC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAACA,MAAA,CAAgB,OAAA,EAAhB,EAAwB,OAAA,EAAO,MAAE,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBAC1C,IAAA,CAACA,MAAA,CAAgB,MAAA,EAAhB,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAACA,MAAA,CAAgB,OAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,0BAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBACA,IAAA;AAAA,QAACA,MAAA,CAAgB,OAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,wBAAA;AAAA,UACV,kBAAA,EAAkB,MAAA;AAAA,UAClB,SAAA,EAAW,EAAA;AAAA,YACT,8LAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAACA,MAAA,CAAgB,KAAA,EAAhB,EAAsB,SAAA,EAAU,WAC9B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,4BAIA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAY,MAAA;AAAA,gBACZ,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EACH;AAAA;AAAA;AAAA;AACF,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"responsive-panel.js","sourcesContent":["import { useSyncExternalStore } from \"react\";\n\n/**\n * The `md` breakpoint, matching the Tailwind default the components'\n * responsive classes use. Anything that needs to *render* differently on a\n * phone (rather than just restyle) reads this; a media query alone cannot\n * swap a popover for a sheet, because they are different components.\n */\nconst MOBILE_QUERY = \"(max-width: 767px)\";\n\n// Deliberately not caching the MediaQueryList across calls. getSnapshot does\n// run per render, but matchMedia is ~1µs and a module-level cache would pin\n// the first `window.matchMedia` this module ever saw — which makes the hook\n// untestable by stubbing it, and the sheet branch is only reachable in tests\n// that way. Not a trade worth making for a cost that does not register.\nfunction subscribe(onChange: () => void): () => void {\n const mql = window.matchMedia(MOBILE_QUERY);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n}\n\n/**\n * True while the viewport is narrower than `md`.\n *\n * Reads synchronously on the first render rather than filling in from an\n * effect: a value that says \"desktop\" for one frame is invisible for a class\n * name and wrong for anything that decides *which component to mount*.\n */\nexport function useIsMobile(): boolean {\n return useSyncExternalStore(\n subscribe,\n () => window.matchMedia(MOBILE_QUERY).matches,\n // No viewport when server-rendered; assume desktop, as the components do.\n () => false,\n );\n}\n","// A panel that is a popover with a cursor and a bottom sheet on a phone.\n//\n// The composer's secondary controls (tools, session context) open panels that\n// are anchored above a ~32px button. That is right on a desktop and wrong on a\n// phone: an anchored popover near the bottom of the screen has nowhere to go,\n// its content is capped by whatever space is left above the composer, and the\n// whole thing sits under the thumb that opened it. A sheet rising from the\n// bottom edge has the full width, as much height as it needs, and lands where\n// the hand already is.\n//\n// The two are different components, not one component with different classes,\n// so the choice is made in JS — see useIsMobile.\n\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useIsMobile } from \"./lib/use-is-mobile\";\nimport { cn } from \"./lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nexport interface ResponsivePanelProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** The control that opens the panel. Rendered as the trigger in both forms. */\n trigger: ReactNode;\n /**\n * Names the sheet for screen readers. Radix Dialog requires an accessible\n * name; it is visually hidden, since the panel's own contents are labelled.\n */\n title: string;\n children: ReactNode;\n /** Popover-only; the sheet is always full width. */\n align?: ComponentProps<typeof PopoverContent>[\"align\"];\n /**\n * Styling for the popover form only.\n *\n * Deliberately not a shared `className`: `cn` is tailwind-merge, so a class\n * written for the popover silently deletes a conflicting one from the\n * sheet's own base list. `p-0` and `pb-[env(safe-area-inset-bottom)]` are\n * the same conflict group, so passing the popover's `p-0` through dropped\n * the sheet's home-indicator inset — and a `divide-y` meant for the\n * popover's sections drew a rule under the sheet's grab handle instead.\n */\n popoverClassName?: string;\n}\n\nexport function ResponsivePanel({\n open,\n onOpenChange,\n trigger,\n title,\n children,\n align = \"start\",\n popoverClassName,\n}: ResponsivePanelProps) {\n const isMobile = useIsMobile();\n\n if (!isMobile) {\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n <PopoverContent\n side=\"top\"\n align={align}\n className={cn(\"w-64 overflow-hidden rounded-xl p-1\", popoverClassName)}\n >\n {children}\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Trigger asChild>{trigger}</DialogPrimitive.Trigger>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n data-slot=\"responsive-panel-overlay\"\n className=\"fixed inset-0 z-50 bg-black/40 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\"\n />\n <DialogPrimitive.Content\n data-slot=\"responsive-panel-sheet\"\n aria-describedby={undefined}\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 flex max-h-[80svh] flex-col overflow-hidden rounded-t-2xl border-t border-border bg-popover pb-[env(safe-area-inset-bottom)] text-popover-foreground shadow-lg\",\n \"data-[state=closed]:animate-out data-[state=closed]:slide-out-to-bottom data-[state=open]:animate-in data-[state=open]:slide-in-from-bottom\",\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">\n {title}\n </DialogPrimitive.Title>\n {/* Not draggable — Radix has no drag gesture and the sheet is short\n enough that a grab bar would only promise one. It reads as the\n handle the shape implies while staying purely decorative. */}\n <div\n aria-hidden=\"true\"\n className=\"mx-auto mt-2.5 mb-1 h-1 w-9 shrink-0 rounded-full bg-muted-foreground/30\"\n />\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1\">\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n"]}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var radixUi = require('radix-ui');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function ScrollArea({
8
+ className,
9
+ children,
10
+ ...props
11
+ }) {
12
+ return /* @__PURE__ */ jsxRuntime.jsxs(
13
+ radixUi.ScrollArea.Root,
14
+ {
15
+ "data-slot": "scroll-area",
16
+ className: chunk6YHDDRIM_cjs.cn("relative", className),
17
+ ...props,
18
+ children: [
19
+ /* @__PURE__ */ jsxRuntime.jsx(
20
+ radixUi.ScrollArea.Viewport,
21
+ {
22
+ "data-slot": "scroll-area-viewport",
23
+ className: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",
24
+ children
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsxRuntime.jsx(ScrollBar, {}),
28
+ /* @__PURE__ */ jsxRuntime.jsx(radixUi.ScrollArea.Corner, {})
29
+ ]
30
+ }
31
+ );
32
+ }
33
+ function ScrollBar({
34
+ className,
35
+ orientation = "vertical",
36
+ ...props
37
+ }) {
38
+ return /* @__PURE__ */ jsxRuntime.jsx(
39
+ radixUi.ScrollArea.ScrollAreaScrollbar,
40
+ {
41
+ "data-slot": "scroll-area-scrollbar",
42
+ "data-orientation": orientation,
43
+ orientation,
44
+ className: chunk6YHDDRIM_cjs.cn(
45
+ "flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",
46
+ className
47
+ ),
48
+ ...props,
49
+ children: /* @__PURE__ */ jsxRuntime.jsx(
50
+ radixUi.ScrollArea.ScrollAreaThumb,
51
+ {
52
+ "data-slot": "scroll-area-thumb",
53
+ className: "relative flex-1 rounded-none bg-border"
54
+ }
55
+ )
56
+ }
57
+ );
58
+ }
59
+
60
+ exports.ScrollArea = ScrollArea;
61
+ exports.ScrollBar = ScrollBar;
62
+ //# sourceMappingURL=scroll-area.cjs.map
63
+ //# sourceMappingURL=scroll-area.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scroll-area.tsx"],"names":["jsxs","ScrollAreaPrimitive","cn","jsx"],"mappings":";;;;;;AAOA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACEA,eAAA;AAAA,IAACC,kBAAA,CAAoB,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAWC,oBAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,MAClC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAACF,kBAAA,CAAoB,QAAA;AAAA,UAApB;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,SAAA,EAAU,oJAAA;AAAA,YAET;AAAA;AAAA,SACH;AAAA,uCACC,SAAA,EAAA,EAAU,CAAA;AAAA,wBACXE,cAAA,CAACF,kBAAA,CAAoB,MAAA,EAApB,EAA2B;AAAA;AAAA;AAAA,GAC9B;AAEJ;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACEE,cAAA;AAAA,IAACF,kBAAA,CAAoB,mBAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,kBAAA,EAAkB,WAAA;AAAA,MAClB,WAAA;AAAA,MACA,SAAA,EAAWC,oBAAA;AAAA,QACT,oQAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAC,cAAA;AAAA,QAACF,kBAAA,CAAoB,eAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ","file":"scroll-area.cjs","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"./lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n"]}
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ScrollArea as ScrollArea$1 } from 'radix-ui';
4
+
5
+ declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollArea$1.Root>): react_jsx_runtime.JSX.Element;
6
+ declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollArea$1.ScrollAreaScrollbar>): react_jsx_runtime.JSX.Element;
7
+
8
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,8 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ScrollArea as ScrollArea$1 } from 'radix-ui';
4
+
5
+ declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollArea$1.Root>): react_jsx_runtime.JSX.Element;
6
+ declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollArea$1.ScrollAreaScrollbar>): react_jsx_runtime.JSX.Element;
7
+
8
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,60 @@
1
+ import { cn } from './chunk-LZGII7SX.js';
2
+ import { ScrollArea as ScrollArea$1 } from 'radix-ui';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function ScrollArea({
6
+ className,
7
+ children,
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsxs(
11
+ ScrollArea$1.Root,
12
+ {
13
+ "data-slot": "scroll-area",
14
+ className: cn("relative", className),
15
+ ...props,
16
+ children: [
17
+ /* @__PURE__ */ jsx(
18
+ ScrollArea$1.Viewport,
19
+ {
20
+ "data-slot": "scroll-area-viewport",
21
+ className: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",
22
+ children
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(ScrollBar, {}),
26
+ /* @__PURE__ */ jsx(ScrollArea$1.Corner, {})
27
+ ]
28
+ }
29
+ );
30
+ }
31
+ function ScrollBar({
32
+ className,
33
+ orientation = "vertical",
34
+ ...props
35
+ }) {
36
+ return /* @__PURE__ */ jsx(
37
+ ScrollArea$1.ScrollAreaScrollbar,
38
+ {
39
+ "data-slot": "scroll-area-scrollbar",
40
+ "data-orientation": orientation,
41
+ orientation,
42
+ className: cn(
43
+ "flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",
44
+ className
45
+ ),
46
+ ...props,
47
+ children: /* @__PURE__ */ jsx(
48
+ ScrollArea$1.ScrollAreaThumb,
49
+ {
50
+ "data-slot": "scroll-area-thumb",
51
+ className: "relative flex-1 rounded-none bg-border"
52
+ }
53
+ )
54
+ }
55
+ );
56
+ }
57
+
58
+ export { ScrollArea, ScrollBar };
59
+ //# sourceMappingURL=scroll-area.js.map
60
+ //# sourceMappingURL=scroll-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scroll-area.tsx"],"names":["ScrollAreaPrimitive"],"mappings":";;;;AAOA,SAAS,UAAA,CAAW;AAAA,EAClB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACE,IAAA;AAAA,IAACA,YAAA,CAAoB,IAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,MAClC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAACA,YAAA,CAAoB,QAAA;AAAA,UAApB;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,SAAA,EAAU,oJAAA;AAAA,YAET;AAAA;AAAA,SACH;AAAA,4BACC,SAAA,EAAA,EAAU,CAAA;AAAA,wBACX,GAAA,CAACA,YAAA,CAAoB,MAAA,EAApB,EAA2B;AAAA;AAAA;AAAA,GAC9B;AAEJ;AAEA,SAAS,SAAA,CAAU;AAAA,EACjB,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACE,GAAA;AAAA,IAACA,YAAA,CAAoB,mBAAA;AAAA,IAApB;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,kBAAA,EAAkB,WAAA;AAAA,MAClB,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,oQAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA;AAAA,QAACA,YAAA,CAAoB,eAAA;AAAA,QAApB;AAAA,UACC,WAAA,EAAU,mBAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,GACF;AAEJ","file":"scroll-area.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"./lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-none bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n"]}
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ var chunk2UHRDVPT_cjs = require('./chunk-2UHRDVPT.cjs');
4
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function SectionLabel({
8
+ label,
9
+ className,
10
+ ...props
11
+ }) {
12
+ const { collapsed } = chunk2UHRDVPT_cjs.useSidebar();
13
+ return /* @__PURE__ */ jsxRuntime.jsx(
14
+ "div",
15
+ {
16
+ "data-slot": "section-label",
17
+ className: chunk6YHDDRIM_cjs.cn(
18
+ "border-t border-line pointer-coarse:mt-3 pointer-coarse:mb-1 pointer-coarse:pt-4",
19
+ collapsed ? "my-1.5" : "mt-2 mb-0.5 pt-3 pl-2.5",
20
+ className
21
+ ),
22
+ ...props,
23
+ children: !collapsed && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block text-xs text-subtle pointer-coarse:text-[13px] pointer-coarse:font-medium pointer-coarse:tracking-wide", children: label })
24
+ }
25
+ );
26
+ }
27
+
28
+ exports.SectionLabel = SectionLabel;
29
+ //# sourceMappingURL=section-label.cjs.map
30
+ //# sourceMappingURL=section-label.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/section-label.tsx"],"names":["useSidebar","jsx","cn"],"mappings":";;;;;;AAUA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+E;AAG7E,EAAA,MAAM,EAAE,SAAA,EAAU,GAAIA,4BAAA,EAAW;AAEjC,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAWC,oBAAA;AAAA,QACT,kFAAA;AAAA,QACA,YAAY,QAAA,GAAW,yBAAA;AAAA,QACvB;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,WAAC,SAAA,oBACAD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHACb,QAAA,EAAA,KAAA,EACH;AAAA;AAAA,GAEJ;AAEJ","file":"section-label.cjs","sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"./lib/utils\"\nimport { useSidebar } from \"./sidebar\"\n\n/**\n * The Work navbar's group label (\"Library\"): a rule above a small, quiet\n * word, starting a new group in a list of rows. Touch steps the type up and\n * the spacing out with the rows around it.\n */\nfunction SectionLabel({\n label,\n className,\n ...props\n}: Omit<React.ComponentProps<\"div\">, \"children\"> & { label: React.ReactNode }) {\n // In a collapsed sidebar rail there is no room for the word: the rule alone\n // still says \"a new group\".\n const { collapsed } = useSidebar()\n\n return (\n <div\n data-slot=\"section-label\"\n className={cn(\n \"border-t border-line pointer-coarse:mt-3 pointer-coarse:mb-1 pointer-coarse:pt-4\",\n collapsed ? \"my-1.5\" : \"mt-2 mb-0.5 pt-3 pl-2.5\",\n className\n )}\n {...props}\n >\n {!collapsed && (\n <span className=\"inline-block text-xs text-subtle pointer-coarse:text-[13px] pointer-coarse:font-medium pointer-coarse:tracking-wide\">\n {label}\n </span>\n )}\n </div>\n )\n}\n\nexport { SectionLabel }\n"]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ /**
5
+ * The Work navbar's group label ("Library"): a rule above a small, quiet
6
+ * word, starting a new group in a list of rows. Touch steps the type up and
7
+ * the spacing out with the rows around it.
8
+ */
9
+ declare function SectionLabel({ label, className, ...props }: Omit<React.ComponentProps<"div">, "children"> & {
10
+ label: React.ReactNode;
11
+ }): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SectionLabel };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ /**
5
+ * The Work navbar's group label ("Library"): a rule above a small, quiet
6
+ * word, starting a new group in a list of rows. Touch steps the type up and
7
+ * the spacing out with the rows around it.
8
+ */
9
+ declare function SectionLabel({ label, className, ...props }: Omit<React.ComponentProps<"div">, "children"> & {
10
+ label: React.ReactNode;
11
+ }): react_jsx_runtime.JSX.Element;
12
+
13
+ export { SectionLabel };
@@ -0,0 +1,28 @@
1
+ import { useSidebar } from './chunk-L73QIINW.js';
2
+ import { cn } from './chunk-LZGII7SX.js';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function SectionLabel({
6
+ label,
7
+ className,
8
+ ...props
9
+ }) {
10
+ const { collapsed } = useSidebar();
11
+ return /* @__PURE__ */ jsx(
12
+ "div",
13
+ {
14
+ "data-slot": "section-label",
15
+ className: cn(
16
+ "border-t border-line pointer-coarse:mt-3 pointer-coarse:mb-1 pointer-coarse:pt-4",
17
+ collapsed ? "my-1.5" : "mt-2 mb-0.5 pt-3 pl-2.5",
18
+ className
19
+ ),
20
+ ...props,
21
+ children: !collapsed && /* @__PURE__ */ jsx("span", { className: "inline-block text-xs text-subtle pointer-coarse:text-[13px] pointer-coarse:font-medium pointer-coarse:tracking-wide", children: label })
22
+ }
23
+ );
24
+ }
25
+
26
+ export { SectionLabel };
27
+ //# sourceMappingURL=section-label.js.map
28
+ //# sourceMappingURL=section-label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/section-label.tsx"],"names":[],"mappings":";;;;AAUA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+E;AAG7E,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,UAAA,EAAW;AAEjC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,kFAAA;AAAA,QACA,YAAY,QAAA,GAAW,yBAAA;AAAA,QACvB;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,WAAC,SAAA,oBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHACb,QAAA,EAAA,KAAA,EACH;AAAA;AAAA,GAEJ;AAEJ","file":"section-label.js","sourcesContent":["import * as React from \"react\"\n\nimport { cn } from \"./lib/utils\"\nimport { useSidebar } from \"./sidebar\"\n\n/**\n * The Work navbar's group label (\"Library\"): a rule above a small, quiet\n * word, starting a new group in a list of rows. Touch steps the type up and\n * the spacing out with the rows around it.\n */\nfunction SectionLabel({\n label,\n className,\n ...props\n}: Omit<React.ComponentProps<\"div\">, \"children\"> & { label: React.ReactNode }) {\n // In a collapsed sidebar rail there is no room for the word: the rule alone\n // still says \"a new group\".\n const { collapsed } = useSidebar()\n\n return (\n <div\n data-slot=\"section-label\"\n className={cn(\n \"border-t border-line pointer-coarse:mt-3 pointer-coarse:mb-1 pointer-coarse:pt-4\",\n collapsed ? \"my-1.5\" : \"mt-2 mb-0.5 pt-3 pl-2.5\",\n className\n )}\n {...props}\n >\n {!collapsed && (\n <span className=\"inline-block text-xs text-subtle pointer-coarse:text-[13px] pointer-coarse:font-medium pointer-coarse:tracking-wide\">\n {label}\n </span>\n )}\n </div>\n )\n}\n\nexport { SectionLabel }\n"]}
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var chunk6YHDDRIM_cjs = require('./chunk-6YHDDRIM.cjs');
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ function SegmentedControl({
28
+ segments,
29
+ value,
30
+ onChange,
31
+ className,
32
+ "aria-label": ariaLabel
33
+ }) {
34
+ return /* @__PURE__ */ jsxRuntime.jsx(
35
+ "div",
36
+ {
37
+ role: "group",
38
+ "aria-label": ariaLabel,
39
+ "data-slot": "segmented-control",
40
+ className: chunk6YHDDRIM_cjs.cn(
41
+ "flex shrink-0 items-center gap-2 text-[13px]",
42
+ "pointer-coarse:w-full pointer-coarse:gap-1 pointer-coarse:rounded-full pointer-coarse:bg-foreground/[0.06] pointer-coarse:p-1 pointer-coarse:text-sm",
43
+ className
44
+ ),
45
+ children: segments.map((segment, index) => {
46
+ const active = segment.value === value;
47
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
48
+ index > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "text-subtle pointer-coarse:hidden", children: "/" }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(
50
+ "button",
51
+ {
52
+ type: "button",
53
+ "data-slot": "segmented-control-item",
54
+ "aria-label": segment.ariaLabel,
55
+ "aria-pressed": active,
56
+ onClick: () => {
57
+ if (!active) onChange(segment.value);
58
+ },
59
+ className: chunk6YHDDRIM_cjs.cn(
60
+ "cursor-pointer rounded-full border-none font-semibold transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
61
+ "pointer-coarse:inline-flex pointer-coarse:min-h-11 pointer-coarse:flex-1 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:px-4",
62
+ active ? "bg-amber-400 px-3 py-1.25 text-stone-950 pointer-coarse:py-0" : "bg-transparent text-subtle hover:text-foreground pointer-coarse:text-muted-foreground pointer-coarse:active:bg-foreground/[0.06]"
63
+ ),
64
+ children: segment.label
65
+ }
66
+ )
67
+ ] }, segment.value);
68
+ })
69
+ }
70
+ );
71
+ }
72
+
73
+ exports.SegmentedControl = SegmentedControl;
74
+ //# sourceMappingURL=segmented-control.cjs.map
75
+ //# sourceMappingURL=segmented-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/segmented-control.tsx"],"names":["jsx","cn","jsxs","React"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAS,gBAAA,CAAmC;AAAA,EAC1C,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAMG;AACD,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,YAAA,EAAY,SAAA;AAAA,MACZ,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAWC,oBAAA;AAAA,QACT,8CAAA;AAAA,QACA,sJAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AAChC,QAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,KAAU,KAAA;AACjC,QAAA,uBACEC,eAAA,CAAOC,2BAAN,EACE,QAAA,EAAA;AAAA,UAAA,KAAA,GAAQ,qBACPH,cAAA,CAAC,MAAA,EAAA,EAAK,eAAa,IAAA,EAAM,SAAA,EAAU,qCAAoC,QAAA,EAAA,GAAA,EAEvE,CAAA;AAAA,0BAEFA,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,wBAAA;AAAA,cACV,cAAY,OAAA,CAAQ,SAAA;AAAA,cACpB,cAAA,EAAc,MAAA;AAAA,cACd,SAAS,MAAM;AACb,gBAAA,IAAI,CAAC,MAAA,EAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,cACrC,CAAA;AAAA,cACA,SAAA,EAAWC,oBAAA;AAAA,gBACT,sIAAA;AAAA,gBACA,wJAAA;AAAA,gBACA,SACI,8DAAA,GACA;AAAA,eACN;AAAA,cAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA;AACX,SAAA,EAAA,EAvBmB,QAAQ,KAwB7B,CAAA;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"segmented-control.cjs","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"./lib/utils\"\n\nexport interface Segment<T extends string> {\n value: T\n label: React.ReactNode\n /** Accessible name when the label alone is too terse (\"Dev\" → \"Dev workspace\"). */\n ariaLabel?: string\n}\n\n/**\n * The Work console's mode switch (its Work / Dev toggle), for any two or\n * three peers. With a mouse it is a line of 13px words split by slashes, the\n * picked one an amber pill; on touch it becomes a full-width segmented\n * control at the 44px floor, equal halves on a round track. Every segment is\n * a button: the picked one is inert but stays focusable and announces its\n * state, which a `<span>` cannot.\n */\nfunction SegmentedControl<T extends string>({\n segments,\n value,\n onChange,\n className,\n \"aria-label\": ariaLabel,\n}: {\n segments: readonly Segment<T>[]\n value: T\n onChange: (value: T) => void\n className?: string\n \"aria-label\"?: string\n}) {\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n data-slot=\"segmented-control\"\n className={cn(\n \"flex shrink-0 items-center gap-2 text-[13px]\",\n \"pointer-coarse:w-full pointer-coarse:gap-1 pointer-coarse:rounded-full pointer-coarse:bg-foreground/[0.06] pointer-coarse:p-1 pointer-coarse:text-sm\",\n className\n )}\n >\n {segments.map((segment, index) => {\n const active = segment.value === value\n return (\n <React.Fragment key={segment.value}>\n {index > 0 && (\n <span aria-hidden={true} className=\"text-subtle pointer-coarse:hidden\">\n /\n </span>\n )}\n <button\n type=\"button\"\n data-slot=\"segmented-control-item\"\n aria-label={segment.ariaLabel}\n aria-pressed={active}\n onClick={() => {\n if (!active) onChange(segment.value)\n }}\n className={cn(\n \"cursor-pointer rounded-full border-none font-semibold transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/40\",\n \"pointer-coarse:inline-flex pointer-coarse:min-h-11 pointer-coarse:flex-1 pointer-coarse:items-center pointer-coarse:justify-center pointer-coarse:px-4\",\n active\n ? \"bg-amber-400 px-3 py-1.25 text-stone-950 pointer-coarse:py-0\"\n : \"bg-transparent text-subtle hover:text-foreground pointer-coarse:text-muted-foreground pointer-coarse:active:bg-foreground/[0.06]\"\n )}\n >\n {segment.label}\n </button>\n </React.Fragment>\n )\n })}\n </div>\n )\n}\n\nexport { SegmentedControl }\n"]}