@gabvdl/ui 0.0.14

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 (330) hide show
  1. package/README.md +95 -0
  2. package/dist/components/button/button.d.ts +39 -0
  3. package/dist/components/button/button.d.ts.map +1 -0
  4. package/dist/components/button/button.js +72 -0
  5. package/dist/components/button/button.js.map +1 -0
  6. package/dist/components/button/index.d.ts +5 -0
  7. package/dist/components/button/index.d.ts.map +1 -0
  8. package/dist/components/button/tooltip.d.ts +31 -0
  9. package/dist/components/button/tooltip.d.ts.map +1 -0
  10. package/dist/components/button/tooltip.js +83 -0
  11. package/dist/components/button/tooltip.js.map +1 -0
  12. package/dist/components/changelog/changelog.d.ts +52 -0
  13. package/dist/components/changelog/changelog.d.ts.map +1 -0
  14. package/dist/components/changelog/changelog.js +164 -0
  15. package/dist/components/changelog/changelog.js.map +1 -0
  16. package/dist/components/changelog/index.d.ts +3 -0
  17. package/dist/components/changelog/index.d.ts.map +1 -0
  18. package/dist/components/copy-button/copy-button.d.ts +16 -0
  19. package/dist/components/copy-button/copy-button.d.ts.map +1 -0
  20. package/dist/components/copy-button/copy-button.js +40 -0
  21. package/dist/components/copy-button/copy-button.js.map +1 -0
  22. package/dist/components/copy-button/index.d.ts +3 -0
  23. package/dist/components/copy-button/index.d.ts.map +1 -0
  24. package/dist/components/drop-zone/drop-zone.d.ts +20 -0
  25. package/dist/components/drop-zone/drop-zone.d.ts.map +1 -0
  26. package/dist/components/drop-zone/drop-zone.js +54 -0
  27. package/dist/components/drop-zone/drop-zone.js.map +1 -0
  28. package/dist/components/drop-zone/index.d.ts +5 -0
  29. package/dist/components/drop-zone/index.d.ts.map +1 -0
  30. package/dist/components/drop-zone/use-file-drop.d.ts +45 -0
  31. package/dist/components/drop-zone/use-file-drop.d.ts.map +1 -0
  32. package/dist/components/drop-zone/use-file-drop.js +97 -0
  33. package/dist/components/drop-zone/use-file-drop.js.map +1 -0
  34. package/dist/components/element-picker/element-picker-field.d.ts +30 -0
  35. package/dist/components/element-picker/element-picker-field.d.ts.map +1 -0
  36. package/dist/components/element-picker/element-picker-field.js +273 -0
  37. package/dist/components/element-picker/element-picker-field.js.map +1 -0
  38. package/dist/components/element-picker/element-picker.d.ts +45 -0
  39. package/dist/components/element-picker/element-picker.d.ts.map +1 -0
  40. package/dist/components/element-picker/element-picker.js +179 -0
  41. package/dist/components/element-picker/element-picker.js.map +1 -0
  42. package/dist/components/element-picker/element-preview.d.ts +23 -0
  43. package/dist/components/element-picker/element-preview.d.ts.map +1 -0
  44. package/dist/components/element-picker/element-preview.js +72 -0
  45. package/dist/components/element-picker/element-preview.js.map +1 -0
  46. package/dist/components/element-picker/index.d.ts +12 -0
  47. package/dist/components/element-picker/index.d.ts.map +1 -0
  48. package/dist/components/element-picker/parse.d.ts +32 -0
  49. package/dist/components/element-picker/parse.d.ts.map +1 -0
  50. package/dist/components/element-picker/parse.js +230 -0
  51. package/dist/components/element-picker/parse.js.map +1 -0
  52. package/dist/components/element-picker/types.d.ts +72 -0
  53. package/dist/components/element-picker/types.d.ts.map +1 -0
  54. package/dist/components/element-picker/use-element-picker.d.ts +56 -0
  55. package/dist/components/element-picker/use-element-picker.d.ts.map +1 -0
  56. package/dist/components/element-picker/use-element-picker.js +201 -0
  57. package/dist/components/element-picker/use-element-picker.js.map +1 -0
  58. package/dist/components/empty-state/empty-state.d.ts +16 -0
  59. package/dist/components/empty-state/empty-state.d.ts.map +1 -0
  60. package/dist/components/empty-state/empty-state.js +41 -0
  61. package/dist/components/empty-state/empty-state.js.map +1 -0
  62. package/dist/components/empty-state/index.d.ts +3 -0
  63. package/dist/components/empty-state/index.d.ts.map +1 -0
  64. package/dist/components/floating-panel/dock-context.d.ts +66 -0
  65. package/dist/components/floating-panel/dock-context.d.ts.map +1 -0
  66. package/dist/components/floating-panel/dock-context.js +96 -0
  67. package/dist/components/floating-panel/dock-context.js.map +1 -0
  68. package/dist/components/floating-panel/dock.d.ts +26 -0
  69. package/dist/components/floating-panel/dock.d.ts.map +1 -0
  70. package/dist/components/floating-panel/dock.js +46 -0
  71. package/dist/components/floating-panel/dock.js.map +1 -0
  72. package/dist/components/floating-panel/floating-panel.d.ts +69 -0
  73. package/dist/components/floating-panel/floating-panel.d.ts.map +1 -0
  74. package/dist/components/floating-panel/floating-panel.js +285 -0
  75. package/dist/components/floating-panel/floating-panel.js.map +1 -0
  76. package/dist/components/floating-panel/index.d.ts +7 -0
  77. package/dist/components/floating-panel/index.d.ts.map +1 -0
  78. package/dist/components/fuzzy-list/fuzzy-list.d.ts +96 -0
  79. package/dist/components/fuzzy-list/fuzzy-list.d.ts.map +1 -0
  80. package/dist/components/fuzzy-list/fuzzy-list.js +127 -0
  81. package/dist/components/fuzzy-list/fuzzy-list.js.map +1 -0
  82. package/dist/components/fuzzy-list/index.d.ts +4 -0
  83. package/dist/components/fuzzy-list/index.d.ts.map +1 -0
  84. package/dist/components/global-search/global-search.d.ts +78 -0
  85. package/dist/components/global-search/global-search.d.ts.map +1 -0
  86. package/dist/components/global-search/global-search.js +181 -0
  87. package/dist/components/global-search/global-search.js.map +1 -0
  88. package/dist/components/global-search/hotkey.d.ts +23 -0
  89. package/dist/components/global-search/hotkey.d.ts.map +1 -0
  90. package/dist/components/global-search/hotkey.js +41 -0
  91. package/dist/components/global-search/hotkey.js.map +1 -0
  92. package/dist/components/global-search/index.d.ts +5 -0
  93. package/dist/components/global-search/index.d.ts.map +1 -0
  94. package/dist/components/iframe-preview/iframe-preview.d.ts +64 -0
  95. package/dist/components/iframe-preview/iframe-preview.d.ts.map +1 -0
  96. package/dist/components/iframe-preview/iframe-preview.js +257 -0
  97. package/dist/components/iframe-preview/iframe-preview.js.map +1 -0
  98. package/dist/components/iframe-preview/index.d.ts +3 -0
  99. package/dist/components/iframe-preview/index.d.ts.map +1 -0
  100. package/dist/components/image-viewer/image-viewer.d.ts +30 -0
  101. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -0
  102. package/dist/components/image-viewer/image-viewer.js +226 -0
  103. package/dist/components/image-viewer/image-viewer.js.map +1 -0
  104. package/dist/components/image-viewer/index.d.ts +4 -0
  105. package/dist/components/image-viewer/index.d.ts.map +1 -0
  106. package/dist/components/image-viewer/progressive-image.d.ts +20 -0
  107. package/dist/components/image-viewer/progressive-image.d.ts.map +1 -0
  108. package/dist/components/image-viewer/progressive-image.js +62 -0
  109. package/dist/components/image-viewer/progressive-image.js.map +1 -0
  110. package/dist/components/image-viewer/viewable-image.d.ts +17 -0
  111. package/dist/components/image-viewer/viewable-image.d.ts.map +1 -0
  112. package/dist/components/image-viewer/viewable-image.js +38 -0
  113. package/dist/components/image-viewer/viewable-image.js.map +1 -0
  114. package/dist/components/input/index.d.ts +3 -0
  115. package/dist/components/input/index.d.ts.map +1 -0
  116. package/dist/components/input/input.d.ts +15 -0
  117. package/dist/components/input/input.d.ts.map +1 -0
  118. package/dist/components/input/input.js +56 -0
  119. package/dist/components/input/input.js.map +1 -0
  120. package/dist/components/modal/index.d.ts +5 -0
  121. package/dist/components/modal/index.d.ts.map +1 -0
  122. package/dist/components/modal/modal-context.d.ts +37 -0
  123. package/dist/components/modal/modal-context.d.ts.map +1 -0
  124. package/dist/components/modal/modal-context.js +81 -0
  125. package/dist/components/modal/modal-context.js.map +1 -0
  126. package/dist/components/modal/modal.d.ts +28 -0
  127. package/dist/components/modal/modal.d.ts.map +1 -0
  128. package/dist/components/modal/modal.js +94 -0
  129. package/dist/components/modal/modal.js.map +1 -0
  130. package/dist/components/nav-2d/index.d.ts +3 -0
  131. package/dist/components/nav-2d/index.d.ts.map +1 -0
  132. package/dist/components/nav-2d/nav-2d.d.ts +59 -0
  133. package/dist/components/nav-2d/nav-2d.d.ts.map +1 -0
  134. package/dist/components/nav-2d/nav-2d.js +290 -0
  135. package/dist/components/nav-2d/nav-2d.js.map +1 -0
  136. package/dist/components/phone-preview/index.d.ts +3 -0
  137. package/dist/components/phone-preview/index.d.ts.map +1 -0
  138. package/dist/components/phone-preview/phone-preview.d.ts +45 -0
  139. package/dist/components/phone-preview/phone-preview.d.ts.map +1 -0
  140. package/dist/components/phone-preview/phone-preview.js +117 -0
  141. package/dist/components/phone-preview/phone-preview.js.map +1 -0
  142. package/dist/components/progressive-bash/index.d.ts +7 -0
  143. package/dist/components/progressive-bash/index.d.ts.map +1 -0
  144. package/dist/components/progressive-bash/parse.d.ts +88 -0
  145. package/dist/components/progressive-bash/parse.d.ts.map +1 -0
  146. package/dist/components/progressive-bash/parse.js +120 -0
  147. package/dist/components/progressive-bash/parse.js.map +1 -0
  148. package/dist/components/progressive-bash/playback.d.ts +50 -0
  149. package/dist/components/progressive-bash/playback.d.ts.map +1 -0
  150. package/dist/components/progressive-bash/playback.js +19 -0
  151. package/dist/components/progressive-bash/playback.js.map +1 -0
  152. package/dist/components/progressive-bash/progressive-bash.d.ts +97 -0
  153. package/dist/components/progressive-bash/progressive-bash.d.ts.map +1 -0
  154. package/dist/components/progressive-bash/progressive-bash.js +377 -0
  155. package/dist/components/progressive-bash/progressive-bash.js.map +1 -0
  156. package/dist/components/progressive-list/index.d.ts +3 -0
  157. package/dist/components/progressive-list/index.d.ts.map +1 -0
  158. package/dist/components/progressive-list/progressive-list.d.ts +55 -0
  159. package/dist/components/progressive-list/progressive-list.d.ts.map +1 -0
  160. package/dist/components/progressive-list/progressive-list.js +83 -0
  161. package/dist/components/progressive-list/progressive-list.js.map +1 -0
  162. package/dist/components/progressive-table/index.d.ts +3 -0
  163. package/dist/components/progressive-table/index.d.ts.map +1 -0
  164. package/dist/components/progressive-table/progressive-table.d.ts +58 -0
  165. package/dist/components/progressive-table/progressive-table.d.ts.map +1 -0
  166. package/dist/components/progressive-table/progressive-table.js +86 -0
  167. package/dist/components/progressive-table/progressive-table.js.map +1 -0
  168. package/dist/components/progressive-text/index.d.ts +3 -0
  169. package/dist/components/progressive-text/index.d.ts.map +1 -0
  170. package/dist/components/progressive-text/progressive-text.d.ts +54 -0
  171. package/dist/components/progressive-text/progressive-text.d.ts.map +1 -0
  172. package/dist/components/progressive-text/progressive-text.js +97 -0
  173. package/dist/components/progressive-text/progressive-text.js.map +1 -0
  174. package/dist/components/progressive-timeline/index.d.ts +3 -0
  175. package/dist/components/progressive-timeline/index.d.ts.map +1 -0
  176. package/dist/components/progressive-timeline/progressive-timeline.d.ts +46 -0
  177. package/dist/components/progressive-timeline/progressive-timeline.d.ts.map +1 -0
  178. package/dist/components/progressive-timeline/progressive-timeline.js +62 -0
  179. package/dist/components/progressive-timeline/progressive-timeline.js.map +1 -0
  180. package/dist/components/relative-time/index.d.ts +3 -0
  181. package/dist/components/relative-time/index.d.ts.map +1 -0
  182. package/dist/components/relative-time/relative-time.d.ts +14 -0
  183. package/dist/components/relative-time/relative-time.d.ts.map +1 -0
  184. package/dist/components/relative-time/relative-time.js +15 -0
  185. package/dist/components/relative-time/relative-time.js.map +1 -0
  186. package/dist/components/resizable-layout/index.d.ts +3 -0
  187. package/dist/components/resizable-layout/index.d.ts.map +1 -0
  188. package/dist/components/resizable-layout/resizable-layout.d.ts +113 -0
  189. package/dist/components/resizable-layout/resizable-layout.d.ts.map +1 -0
  190. package/dist/components/resizable-layout/resizable-layout.js +398 -0
  191. package/dist/components/resizable-layout/resizable-layout.js.map +1 -0
  192. package/dist/components/rich-input/compose.d.ts +13 -0
  193. package/dist/components/rich-input/compose.d.ts.map +1 -0
  194. package/dist/components/rich-input/compose.js +28 -0
  195. package/dist/components/rich-input/compose.js.map +1 -0
  196. package/dist/components/rich-input/index.d.ts +5 -0
  197. package/dist/components/rich-input/index.d.ts.map +1 -0
  198. package/dist/components/rich-input/parts.d.ts +53 -0
  199. package/dist/components/rich-input/parts.d.ts.map +1 -0
  200. package/dist/components/rich-input/parts.js +285 -0
  201. package/dist/components/rich-input/parts.js.map +1 -0
  202. package/dist/components/rich-input/rich-input.d.ts +64 -0
  203. package/dist/components/rich-input/rich-input.d.ts.map +1 -0
  204. package/dist/components/rich-input/rich-input.js +351 -0
  205. package/dist/components/rich-input/rich-input.js.map +1 -0
  206. package/dist/components/rich-input/types.d.ts +92 -0
  207. package/dist/components/rich-input/types.d.ts.map +1 -0
  208. package/dist/components/rich-input/use-draft.d.ts +9 -0
  209. package/dist/components/rich-input/use-draft.d.ts.map +1 -0
  210. package/dist/components/rich-input/use-draft.js +47 -0
  211. package/dist/components/rich-input/use-draft.js.map +1 -0
  212. package/dist/components/rich-input/use-file-upload.d.ts +18 -0
  213. package/dist/components/rich-input/use-file-upload.d.ts.map +1 -0
  214. package/dist/components/rich-input/use-file-upload.js +88 -0
  215. package/dist/components/rich-input/use-file-upload.js.map +1 -0
  216. package/dist/components/rich-input/use-guidelines.d.ts +16 -0
  217. package/dist/components/rich-input/use-guidelines.d.ts.map +1 -0
  218. package/dist/components/rich-input/use-guidelines.js +85 -0
  219. package/dist/components/rich-input/use-guidelines.js.map +1 -0
  220. package/dist/components/rich-input/use-input-history.d.ts +22 -0
  221. package/dist/components/rich-input/use-input-history.d.ts.map +1 -0
  222. package/dist/components/rich-input/use-input-history.js +61 -0
  223. package/dist/components/rich-input/use-input-history.js.map +1 -0
  224. package/dist/components/rich-input/use-mention.d.ts +24 -0
  225. package/dist/components/rich-input/use-mention.d.ts.map +1 -0
  226. package/dist/components/rich-input/use-mention.js +54 -0
  227. package/dist/components/rich-input/use-mention.js.map +1 -0
  228. package/dist/components/search-input/index.d.ts +3 -0
  229. package/dist/components/search-input/index.d.ts.map +1 -0
  230. package/dist/components/search-input/search-input.d.ts +14 -0
  231. package/dist/components/search-input/search-input.d.ts.map +1 -0
  232. package/dist/components/search-input/search-input.js +63 -0
  233. package/dist/components/search-input/search-input.js.map +1 -0
  234. package/dist/components/skeleton/index.d.ts +3 -0
  235. package/dist/components/skeleton/index.d.ts.map +1 -0
  236. package/dist/components/skeleton/skeleton.d.ts +19 -0
  237. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  238. package/dist/components/skeleton/skeleton.js +29 -0
  239. package/dist/components/skeleton/skeleton.js.map +1 -0
  240. package/dist/components/spinner/index.d.ts +3 -0
  241. package/dist/components/spinner/index.d.ts.map +1 -0
  242. package/dist/components/spinner/spinner.d.ts +11 -0
  243. package/dist/components/spinner/spinner.d.ts.map +1 -0
  244. package/dist/components/spinner/spinner.js +32 -0
  245. package/dist/components/spinner/spinner.js.map +1 -0
  246. package/dist/components/status-badge/index.d.ts +3 -0
  247. package/dist/components/status-badge/index.d.ts.map +1 -0
  248. package/dist/components/status-badge/status-badge.d.ts +31 -0
  249. package/dist/components/status-badge/status-badge.d.ts.map +1 -0
  250. package/dist/components/status-badge/status-badge.js +53 -0
  251. package/dist/components/status-badge/status-badge.js.map +1 -0
  252. package/dist/components/theme/index.d.ts +5 -0
  253. package/dist/components/theme/index.d.ts.map +1 -0
  254. package/dist/components/theme/theme-toggle.d.ts +11 -0
  255. package/dist/components/theme/theme-toggle.d.ts.map +1 -0
  256. package/dist/components/theme/theme-toggle.js +57 -0
  257. package/dist/components/theme/theme-toggle.js.map +1 -0
  258. package/dist/components/theme/theme.d.ts +29 -0
  259. package/dist/components/theme/theme.d.ts.map +1 -0
  260. package/dist/components/theme/theme.js +70 -0
  261. package/dist/components/theme/theme.js.map +1 -0
  262. package/dist/components/toast/index.d.ts +3 -0
  263. package/dist/components/toast/index.d.ts.map +1 -0
  264. package/dist/components/toast/toast.d.ts +64 -0
  265. package/dist/components/toast/toast.d.ts.map +1 -0
  266. package/dist/components/toast/toast.js +155 -0
  267. package/dist/components/toast/toast.js.map +1 -0
  268. package/dist/components/virtual-list/index.d.ts +3 -0
  269. package/dist/components/virtual-list/index.d.ts.map +1 -0
  270. package/dist/components/virtual-list/virtual-list.d.ts +71 -0
  271. package/dist/components/virtual-list/virtual-list.d.ts.map +1 -0
  272. package/dist/components/virtual-list/virtual-list.js +65 -0
  273. package/dist/components/virtual-list/virtual-list.js.map +1 -0
  274. package/dist/hooks/index.d.ts +12 -0
  275. package/dist/hooks/index.d.ts.map +1 -0
  276. package/dist/hooks/use-copy-to-clipboard.d.ts +26 -0
  277. package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
  278. package/dist/hooks/use-copy-to-clipboard.js +36 -0
  279. package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
  280. package/dist/hooks/use-debounced-value.d.ts +23 -0
  281. package/dist/hooks/use-debounced-value.d.ts.map +1 -0
  282. package/dist/hooks/use-debounced-value.js +19 -0
  283. package/dist/hooks/use-debounced-value.js.map +1 -0
  284. package/dist/hooks/use-intersection.d.ts +25 -0
  285. package/dist/hooks/use-intersection.d.ts.map +1 -0
  286. package/dist/hooks/use-intersection.js +38 -0
  287. package/dist/hooks/use-intersection.js.map +1 -0
  288. package/dist/hooks/use-local-storage.d.ts +12 -0
  289. package/dist/hooks/use-local-storage.d.ts.map +1 -0
  290. package/dist/hooks/use-local-storage.js +43 -0
  291. package/dist/hooks/use-local-storage.js.map +1 -0
  292. package/dist/hooks/use-long-press.d.ts +37 -0
  293. package/dist/hooks/use-long-press.d.ts.map +1 -0
  294. package/dist/hooks/use-long-press.js +39 -0
  295. package/dist/hooks/use-long-press.js.map +1 -0
  296. package/dist/hooks/use-media-query.d.ts +17 -0
  297. package/dist/hooks/use-media-query.d.ts.map +1 -0
  298. package/dist/hooks/use-media-query.js +37 -0
  299. package/dist/hooks/use-media-query.js.map +1 -0
  300. package/dist/hooks/use-overlay.d.ts +20 -0
  301. package/dist/hooks/use-overlay.d.ts.map +1 -0
  302. package/dist/hooks/use-overlay.js +42 -0
  303. package/dist/hooks/use-overlay.js.map +1 -0
  304. package/dist/image-viewer.css +152 -0
  305. package/dist/index.d.ts +67 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +161 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/lib/format.d.ts +19 -0
  310. package/dist/lib/format.d.ts.map +1 -0
  311. package/dist/lib/format.js +62 -0
  312. package/dist/lib/format.js.map +1 -0
  313. package/dist/lib/highlight.d.ts +15 -0
  314. package/dist/lib/highlight.d.ts.map +1 -0
  315. package/dist/lib/highlight.js +39 -0
  316. package/dist/lib/highlight.js.map +1 -0
  317. package/dist/lib/search.d.ts +40 -0
  318. package/dist/lib/search.d.ts.map +1 -0
  319. package/dist/lib/search.js +91 -0
  320. package/dist/lib/search.js.map +1 -0
  321. package/dist/lib/utils.d.ts +4 -0
  322. package/dist/lib/utils.d.ts.map +1 -0
  323. package/dist/lib/utils.js +9 -0
  324. package/dist/lib/utils.js.map +1 -0
  325. package/dist/overlay.css +78 -0
  326. package/dist/styles.css +6 -0
  327. package/dist/theme.css +81 -0
  328. package/dist/tooltip.css +53 -0
  329. package/dist/virtual-list.css +29 -0
  330. package/package.json +77 -0
@@ -0,0 +1,113 @@
1
+ import { ReactNode } from 'react';
2
+ export type DrawerSide = 'left' | 'right' | 'top' | 'bottom';
3
+ /**
4
+ * How a side behaves below the desktop breakpoint.
5
+ *
6
+ * - `'drawer'` — a fixed slide-in overlay with a backdrop. It **takes focus**:
7
+ * the center is dimmed and inert until the drawer is dismissed. Right for
8
+ * navigation and detail views the user opens, reads, then closes.
9
+ * - `'panel'` — stays in the layout flow and **splits the screen** with the
10
+ * center. No backdrop, no focus steal: the panel and the center are usable at
11
+ * the same time. Right for a composer or toolbar that has to stay reachable.
12
+ */
13
+ export type MobileMode = 'drawer' | 'panel';
14
+ /** Per-drawer configuration. `content` is the whole drawer body (header + list). */
15
+ export interface ResizableDrawerConfig {
16
+ /** The drawer's content — including its own header row, if any. */
17
+ content: ReactNode;
18
+ /** Desktop start size, as a percentage of its axis (0–100). */
19
+ defaultSize?: number;
20
+ /** Desktop minimum size before it snaps closed, as a percentage. */
21
+ minSize?: number;
22
+ /** Desktop maximum size, as a percentage. */
23
+ maxSize?: number;
24
+ /**
25
+ * Mobile behaviour: a focus-taking `'drawer'` overlay, or an always-visible
26
+ * split-screen `'panel'`. @default 'drawer'
27
+ */
28
+ mobileMode?: MobileMode;
29
+ /**
30
+ * Mobile width, for `left`/`right` sides. A number is treated as pixels, a
31
+ * string is used verbatim (`'85%'`, `'320px'`, or `'auto'` in `'panel'` mode
32
+ * to hug the content). Defaults to `'85%'`.
33
+ */
34
+ mobileWidth?: string | number;
35
+ /**
36
+ * Mobile height, for `top`/`bottom` sides. A number is treated as pixels, a
37
+ * string is used verbatim (`'auto'` in `'panel'` mode hugs the content).
38
+ * Defaults to `'45%'`.
39
+ */
40
+ mobileHeight?: string | number;
41
+ /**
42
+ * `'panel'` mode only: the size the panel keeps while closed, so it can leave
43
+ * a tappable strip (a header, a collapsed composer bar) behind instead of
44
+ * vanishing with no way back. Number = px, string = verbatim. @default 0
45
+ */
46
+ mobileCollapsedSize?: string | number;
47
+ /** Extra classes on the drawer surface (desktop panel + mobile overlay). */
48
+ className?: string;
49
+ /** `'drawer'` mode only: swipe in-axis on the drawer to close it. Default true. */
50
+ swipeToClose?: boolean;
51
+ /** `'drawer'` mode only: off-screen edge zone that opens it on an inward swipe. Default false. */
52
+ edgeSwipeToOpen?: boolean;
53
+ }
54
+ export interface ResizableLayoutHandle {
55
+ collapse(side: DrawerSide): void;
56
+ expand(side: DrawerSide): void;
57
+ toggle(side: DrawerSide): void;
58
+ isCollapsed(side: DrawerSide): boolean;
59
+ }
60
+ export interface ResizableLayoutProps {
61
+ left?: ResizableDrawerConfig;
62
+ right?: ResizableDrawerConfig;
63
+ top?: ResizableDrawerConfig;
64
+ bottom?: ResizableDrawerConfig;
65
+ /** Controlled open state of the left drawer (collapse on desktop, overlay on mobile). */
66
+ leftOpen?: boolean;
67
+ onLeftOpenChange?: (open: boolean) => void;
68
+ rightOpen?: boolean;
69
+ onRightOpenChange?: (open: boolean) => void;
70
+ topOpen?: boolean;
71
+ onTopOpenChange?: (open: boolean) => void;
72
+ bottomOpen?: boolean;
73
+ onBottomOpenChange?: (open: boolean) => void;
74
+ /** The scrollable center. Give its inner scroll region `min-h-0 flex-1 overflow-y-auto`. */
75
+ children: ReactNode;
76
+ className?: string;
77
+ /** Persist desktop panel sizes under this key (react-resizable-panels autoSaveId). */
78
+ autoSaveId?: string;
79
+ /** Render a collapse/expand toggle on each resize handle (desktop). Default true. */
80
+ showCollapseButtons?: boolean;
81
+ /** Breakpoint (px) at/above which the desktop resizable layout is used. Default 768. */
82
+ desktopBreakpoint?: number;
83
+ }
84
+ /**
85
+ * A four-slot application layout — left/right/top/bottom drawers around a
86
+ * scrollable center — that adapts to the viewport:
87
+ *
88
+ * - **Desktop** (≥ `desktopBreakpoint`): the drawers are real shadcn-style
89
+ * resizable panels (react-resizable-panels). Each can be dragged between
90
+ * `minSize`/`maxSize`, collapsed completely (to zero) via the handle button
91
+ * or the imperative ref, and its size is persisted with `autoSaveId`.
92
+ * - **Mobile**: each side picks its own behaviour via `mobileMode`:
93
+ * - `'drawer'` (default) — a fixed, swipeable overlay with a backdrop, like a
94
+ * native slide-in sheet. It takes focus: the center is dimmed and inert.
95
+ * - `'panel'` — stays in the flow and splits the screen with the center, which
96
+ * stays fully usable. Use it for anything the user must be able to reach
97
+ * without dismissing something first (a composer, a toolbar); a `'drawer'`
98
+ * with no on-screen trigger is a drawer the user cannot re-open.
99
+ *
100
+ * Both are sized per side with `mobileWidth`/`mobileHeight` (a `'panel'` may
101
+ * also use `'auto'` to hug its content, and `mobileCollapsedSize` to keep a
102
+ * tappable strip visible while closed).
103
+ *
104
+ * The center is always a `min-h-0` flex column, so a child with
105
+ * `min-h-0 flex-1 overflow-y-auto` scrolls correctly in both modes — no more
106
+ * "stuck" content.
107
+ *
108
+ * `open` state is controlled per side (`leftOpen`/`onLeftOpenChange`, …). On
109
+ * desktop that maps to collapsed/expanded; on mobile to the slide-in overlay.
110
+ * The imperative handle exposes `collapse`/`expand`/`toggle`/`isCollapsed`.
111
+ */
112
+ export declare const ResizableLayout: import('react').ForwardRefExoticComponent<ResizableLayoutProps & import('react').RefAttributes<ResizableLayoutHandle>>;
113
+ //# sourceMappingURL=resizable-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable-layout.d.ts","sourceRoot":"","sources":["../../../src/components/resizable-layout/resizable-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAWf,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7D;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAK5C,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,OAAO,EAAE,SAAS,CAAC;IACnB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC5B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,4FAA4F;IAC5F,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAkCD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,eAAe,wHA4P3B,CAAC"}
@@ -0,0 +1,398 @@
1
+ import { jsxs as x, jsx as n, Fragment as y } from "react/jsx-runtime";
2
+ import { forwardRef as K, useRef as g, useCallback as Q, useEffect as X, useImperativeHandle as V, useState as O } from "react";
3
+ import { ChevronDown as q, ChevronUp as F, ChevronRight as G, ChevronLeft as A } from "lucide-react";
4
+ import { PanelGroup as U, Panel as S, PanelResizeHandle as ee } from "react-resizable-panels";
5
+ import { cn as a } from "../../lib/utils.js";
6
+ const te = /* @__PURE__ */ new Set(["left", "right"]), N = (e) => te.has(e);
7
+ function oe(e) {
8
+ const t = `(min-width: ${e}px)`, [r, i] = O(
9
+ () => typeof window < "u" ? window.matchMedia(t).matches : !0
10
+ );
11
+ return X(() => {
12
+ if (typeof window > "u") return;
13
+ const l = window.matchMedia(t), s = () => i(l.matches);
14
+ return s(), l.addEventListener("change", s), () => l.removeEventListener("change", s);
15
+ }, [t]), r;
16
+ }
17
+ const H = (e) => typeof e == "number" ? `${e}px` : e;
18
+ function Y(e, t) {
19
+ return N(e) ? H(t.mobileWidth ?? "85%") : H(t.mobileHeight ?? "45%");
20
+ }
21
+ function re(e, t) {
22
+ const r = Y(e, t);
23
+ return N(e) ? { width: r, maxWidth: "100%" } : { height: r, maxHeight: "100%" };
24
+ }
25
+ const fe = K(
26
+ function({
27
+ left: t,
28
+ right: r,
29
+ top: i,
30
+ bottom: l,
31
+ leftOpen: s = !0,
32
+ onLeftOpenChange: p,
33
+ rightOpen: m = !0,
34
+ onRightOpenChange: z,
35
+ topOpen: c = !0,
36
+ onTopOpenChange: b,
37
+ bottomOpen: w = !0,
38
+ onBottomOpenChange: I,
39
+ children: R,
40
+ className: P,
41
+ autoSaveId: C,
42
+ showCollapseButtons: E = !0,
43
+ desktopBreakpoint: Z = 768
44
+ }, _) {
45
+ const v = oe(Z), k = g(null), L = g(null), D = g(null), W = g(null), M = { left: s, right: m, top: c, bottom: w }, j = { left: k, right: L, top: D, bottom: W }, B = { left: t, right: r, top: i, bottom: l }, d = Q(
46
+ (f, u) => {
47
+ var o, h;
48
+ (h = (o = {
49
+ left: p,
50
+ right: z,
51
+ top: b,
52
+ bottom: I
53
+ })[f]) == null || h.call(o, u);
54
+ },
55
+ [p, z, b, I]
56
+ );
57
+ if (X(() => {
58
+ ["left", "right", "top", "bottom"].forEach((f) => {
59
+ const u = j[f].current;
60
+ if (!v || !u || !B[f]) return;
61
+ const o = M[f];
62
+ o && u.isCollapsed() ? u.expand() : !o && u.isExpanded() && u.collapse();
63
+ });
64
+ }, [v, t, r, i, l, s, m, c, w]), V(
65
+ _,
66
+ () => {
67
+ const f = (o) => j[o].current, u = (o) => {
68
+ var h;
69
+ return v ? ((h = f(o)) == null ? void 0 : h.isCollapsed()) ?? !0 : !M[o];
70
+ };
71
+ return {
72
+ collapse: (o) => {
73
+ var h;
74
+ (h = f(o)) == null || h.collapse(), d(o, !1);
75
+ },
76
+ expand: (o) => {
77
+ var h;
78
+ (h = f(o)) == null || h.expand(), d(o, !0);
79
+ },
80
+ toggle: (o) => d(o, u(o)),
81
+ isCollapsed: u
82
+ };
83
+ },
84
+ // eslint-disable-next-line react-hooks/exhaustive-deps
85
+ [v, s, m, c, w, d]
86
+ ), !v) {
87
+ const f = (u) => {
88
+ const o = B[u];
89
+ if (!o) return null;
90
+ const h = {
91
+ side: u,
92
+ config: o,
93
+ open: M[u],
94
+ onOpenChange: (J) => d(u, J)
95
+ };
96
+ return (o.mobileMode ?? "drawer") === "panel" ? /* @__PURE__ */ n(le, { ...h }) : /* @__PURE__ */ n(ne, { ...h });
97
+ };
98
+ return /* @__PURE__ */ x("div", { className: a("relative flex h-full w-full min-h-0 flex-col overflow-hidden", P), children: [
99
+ f("top"),
100
+ /* @__PURE__ */ x("div", { className: "relative flex min-h-0 min-w-0 flex-1 overflow-hidden", children: [
101
+ f("left"),
102
+ /* @__PURE__ */ n("div", { className: "relative grid min-h-0 min-w-0 flex-1 grid-cols-1 grid-rows-1 overflow-hidden", children: R }),
103
+ f("right")
104
+ ] }),
105
+ f("bottom")
106
+ ] });
107
+ }
108
+ const $ = /* @__PURE__ */ x(
109
+ U,
110
+ {
111
+ direction: "horizontal",
112
+ autoSaveId: C,
113
+ className: "h-full w-full min-h-0",
114
+ children: [
115
+ t && /* @__PURE__ */ x(y, { children: [
116
+ /* @__PURE__ */ n(
117
+ S,
118
+ {
119
+ ref: k,
120
+ order: 1,
121
+ collapsible: !0,
122
+ collapsedSize: 0,
123
+ defaultSize: s ? t.defaultSize ?? 20 : 0,
124
+ minSize: t.minSize ?? 12,
125
+ maxSize: t.maxSize ?? 40,
126
+ onCollapse: () => d("left", !1),
127
+ onExpand: () => d("left", !0),
128
+ className: a("flex min-h-0 flex-col overflow-hidden", t.className),
129
+ children: t.content
130
+ }
131
+ ),
132
+ /* @__PURE__ */ n(
133
+ T,
134
+ {
135
+ side: "left",
136
+ showButton: E,
137
+ onToggle: () => d("left", !s),
138
+ open: s
139
+ }
140
+ )
141
+ ] }),
142
+ /* @__PURE__ */ n(
143
+ S,
144
+ {
145
+ order: 2,
146
+ minSize: 30,
147
+ className: "relative grid min-h-0 min-w-0 grid-cols-1 grid-rows-1 overflow-hidden",
148
+ children: R
149
+ }
150
+ ),
151
+ r && /* @__PURE__ */ x(y, { children: [
152
+ /* @__PURE__ */ n(
153
+ T,
154
+ {
155
+ side: "right",
156
+ showButton: E,
157
+ onToggle: () => d("right", !m),
158
+ open: m
159
+ }
160
+ ),
161
+ /* @__PURE__ */ n(
162
+ S,
163
+ {
164
+ ref: L,
165
+ order: 3,
166
+ collapsible: !0,
167
+ collapsedSize: 0,
168
+ defaultSize: m ? r.defaultSize ?? 22 : 0,
169
+ minSize: r.minSize ?? 12,
170
+ maxSize: r.maxSize ?? 45,
171
+ onCollapse: () => d("right", !1),
172
+ onExpand: () => d("right", !0),
173
+ className: a("flex min-h-0 flex-col overflow-hidden", r.className),
174
+ children: r.content
175
+ }
176
+ )
177
+ ] })
178
+ ]
179
+ }
180
+ );
181
+ return !i && !l ? /* @__PURE__ */ n("div", { className: a("h-full w-full min-h-0", P), children: $ }) : /* @__PURE__ */ x(
182
+ U,
183
+ {
184
+ direction: "vertical",
185
+ autoSaveId: C ? `${C}:vertical` : void 0,
186
+ className: a("h-full w-full min-h-0", P),
187
+ children: [
188
+ i && /* @__PURE__ */ x(y, { children: [
189
+ /* @__PURE__ */ n(
190
+ S,
191
+ {
192
+ ref: D,
193
+ order: 1,
194
+ collapsible: !0,
195
+ collapsedSize: 0,
196
+ defaultSize: c ? i.defaultSize ?? 30 : 0,
197
+ minSize: i.minSize ?? 12,
198
+ maxSize: i.maxSize ?? 60,
199
+ onCollapse: () => d("top", !1),
200
+ onExpand: () => d("top", !0),
201
+ className: a("flex min-h-0 flex-col overflow-hidden", i.className),
202
+ children: i.content
203
+ }
204
+ ),
205
+ /* @__PURE__ */ n(
206
+ T,
207
+ {
208
+ side: "top",
209
+ showButton: E,
210
+ onToggle: () => d("top", !c),
211
+ open: c
212
+ }
213
+ )
214
+ ] }),
215
+ /* @__PURE__ */ n(S, { order: 2, minSize: 20, className: "relative min-h-0 w-full overflow-hidden", children: $ }),
216
+ l && /* @__PURE__ */ x(y, { children: [
217
+ /* @__PURE__ */ n(
218
+ T,
219
+ {
220
+ side: "bottom",
221
+ showButton: E,
222
+ onToggle: () => d("bottom", !w),
223
+ open: w
224
+ }
225
+ ),
226
+ /* @__PURE__ */ n(
227
+ S,
228
+ {
229
+ ref: W,
230
+ order: 3,
231
+ collapsible: !0,
232
+ collapsedSize: 0,
233
+ defaultSize: w ? l.defaultSize ?? 30 : 0,
234
+ minSize: l.minSize ?? 12,
235
+ maxSize: l.maxSize ?? 60,
236
+ onCollapse: () => d("bottom", !1),
237
+ onExpand: () => d("bottom", !0),
238
+ className: a("flex min-h-0 flex-col overflow-hidden", l.className),
239
+ children: l.content
240
+ }
241
+ )
242
+ ] })
243
+ ]
244
+ }
245
+ );
246
+ }
247
+ );
248
+ function T({
249
+ side: e,
250
+ showButton: t,
251
+ onToggle: r,
252
+ open: i
253
+ }) {
254
+ const p = i ? {
255
+ left: A,
256
+ right: G,
257
+ top: F,
258
+ bottom: q
259
+ }[e] : {
260
+ left: G,
261
+ right: A,
262
+ top: q,
263
+ bottom: F
264
+ }[e], m = N(e);
265
+ return /* @__PURE__ */ x(
266
+ ee,
267
+ {
268
+ className: a(
269
+ "group relative bg-border transition-colors hover:bg-primary/50 data-[resize-handle-state=drag]:bg-primary",
270
+ m ? "w-px" : "h-px"
271
+ ),
272
+ children: [
273
+ /* @__PURE__ */ n(
274
+ "div",
275
+ {
276
+ className: a(
277
+ "absolute z-10",
278
+ m ? "inset-y-0 -left-1 -right-1" : "inset-x-0 -top-1 -bottom-1"
279
+ )
280
+ }
281
+ ),
282
+ t && /* @__PURE__ */ n(
283
+ "button",
284
+ {
285
+ type: "button",
286
+ onClick: (z) => {
287
+ z.stopPropagation(), r();
288
+ },
289
+ title: i ? "Collapse" : "Expand",
290
+ className: a(
291
+ "absolute z-20 flex items-center justify-center rounded-sm border border-border bg-card text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground group-hover:opacity-100",
292
+ m ? a("top-1/2 h-8 w-4 -translate-y-1/2", e === "left" ? "-left-2" : "-right-2") : a("left-1/2 h-4 w-8 -translate-x-1/2", e === "top" ? "-top-2" : "-bottom-2")
293
+ ),
294
+ children: /* @__PURE__ */ n(p, { className: "h-3.5 w-3.5" })
295
+ }
296
+ )
297
+ ]
298
+ }
299
+ );
300
+ }
301
+ function le({
302
+ side: e,
303
+ config: t,
304
+ open: r
305
+ }) {
306
+ const i = N(e), l = r ? Y(e, t) : H(t.mobileCollapsedSize ?? 0);
307
+ return /* @__PURE__ */ n(
308
+ "aside",
309
+ {
310
+ style: i ? { width: l, maxWidth: "100%" } : { height: l, maxHeight: "100%" },
311
+ className: a(
312
+ "relative flex shrink-0 flex-col overflow-hidden bg-card transition-[width,height] duration-200",
313
+ e === "left" && "border-r border-border",
314
+ e === "right" && "border-l border-border",
315
+ e === "top" && "border-b border-border",
316
+ e === "bottom" && "border-t border-border",
317
+ t.className
318
+ ),
319
+ children: t.content
320
+ }
321
+ );
322
+ }
323
+ function ne({
324
+ side: e,
325
+ config: t,
326
+ open: r,
327
+ onOpenChange: i
328
+ }) {
329
+ const l = N(e), s = g(null), p = g(null), m = t.swipeToClose ?? !0, z = (c) => l ? c.touches[0].clientX : c.touches[0].clientY;
330
+ return /* @__PURE__ */ x(y, { children: [
331
+ /* @__PURE__ */ n(
332
+ "div",
333
+ {
334
+ onClick: () => i(!1),
335
+ className: a(
336
+ "fixed inset-0 z-30 bg-black/50 transition-opacity",
337
+ r ? "opacity-100" : "pointer-events-none opacity-0"
338
+ )
339
+ }
340
+ ),
341
+ t.edgeSwipeToOpen && !r && /* @__PURE__ */ n(
342
+ "div",
343
+ {
344
+ className: a(
345
+ "fixed z-20",
346
+ l ? a("inset-y-0 w-4", e === "left" ? "left-0" : "right-0") : a("inset-x-0 h-4", e === "top" ? "top-0" : "bottom-0")
347
+ ),
348
+ onTouchStart: (c) => p.current = z(c),
349
+ onTouchMove: (c) => {
350
+ if (p.current === null) return;
351
+ const b = z(c) - p.current;
352
+ (e === "left" && b > 50 || e === "right" && b < -50 || e === "top" && b > 50 || e === "bottom" && b < -50) && (i(!0), p.current = null);
353
+ },
354
+ onTouchEnd: () => p.current = null
355
+ }
356
+ ),
357
+ /* @__PURE__ */ n(
358
+ "aside",
359
+ {
360
+ style: re(e, t),
361
+ onTouchStart: (c) => m && (s.current = z(c)),
362
+ onTouchMove: (c) => {
363
+ if (!m || s.current === null) return;
364
+ const b = z(c) - s.current;
365
+ (e === "left" && b < -60 || e === "right" && b > 60 || e === "top" && b < -60 || e === "bottom" && b > 60) && (i(!1), s.current = null);
366
+ },
367
+ onTouchEnd: () => s.current = null,
368
+ className: a(
369
+ "fixed z-40 flex flex-col bg-card transition-transform duration-200",
370
+ l ? "inset-y-0" : "inset-x-0",
371
+ e === "left" && "left-0 border-r border-border",
372
+ e === "right" && "right-0 border-l border-border",
373
+ e === "top" && "top-0 border-b border-border",
374
+ e === "bottom" && "bottom-0 border-t border-border",
375
+ r ? "translate-x-0 translate-y-0" : a(ie(e), "pointer-events-none"),
376
+ t.className
377
+ ),
378
+ children: t.content
379
+ }
380
+ )
381
+ ] });
382
+ }
383
+ function ie(e) {
384
+ switch (e) {
385
+ case "left":
386
+ return "-translate-x-full";
387
+ case "right":
388
+ return "translate-x-full";
389
+ case "top":
390
+ return "-translate-y-full";
391
+ case "bottom":
392
+ return "translate-y-full";
393
+ }
394
+ }
395
+ export {
396
+ fe as ResizableLayout
397
+ };
398
+ //# sourceMappingURL=resizable-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable-layout.js","sources":["../../../src/components/resizable-layout/resizable-layout.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type TouchEvent,\n} from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport {\n Panel,\n PanelGroup,\n PanelResizeHandle,\n type ImperativePanelHandle,\n} from 'react-resizable-panels';\n\nimport { cn } from '../../lib/utils';\n\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom';\n\n/**\n * How a side behaves below the desktop breakpoint.\n *\n * - `'drawer'` — a fixed slide-in overlay with a backdrop. It **takes focus**:\n * the center is dimmed and inert until the drawer is dismissed. Right for\n * navigation and detail views the user opens, reads, then closes.\n * - `'panel'` — stays in the layout flow and **splits the screen** with the\n * center. No backdrop, no focus steal: the panel and the center are usable at\n * the same time. Right for a composer or toolbar that has to stay reachable.\n */\nexport type MobileMode = 'drawer' | 'panel';\n\nconst HORIZONTAL_SIDES = new Set<DrawerSide>(['left', 'right']);\nconst isHorizontal = (side: DrawerSide) => HORIZONTAL_SIDES.has(side);\n\n/** Per-drawer configuration. `content` is the whole drawer body (header + list). */\nexport interface ResizableDrawerConfig {\n /** The drawer's content — including its own header row, if any. */\n content: ReactNode;\n /** Desktop start size, as a percentage of its axis (0–100). */\n defaultSize?: number;\n /** Desktop minimum size before it snaps closed, as a percentage. */\n minSize?: number;\n /** Desktop maximum size, as a percentage. */\n maxSize?: number;\n /**\n * Mobile behaviour: a focus-taking `'drawer'` overlay, or an always-visible\n * split-screen `'panel'`. @default 'drawer'\n */\n mobileMode?: MobileMode;\n /**\n * Mobile width, for `left`/`right` sides. A number is treated as pixels, a\n * string is used verbatim (`'85%'`, `'320px'`, or `'auto'` in `'panel'` mode\n * to hug the content). Defaults to `'85%'`.\n */\n mobileWidth?: string | number;\n /**\n * Mobile height, for `top`/`bottom` sides. A number is treated as pixels, a\n * string is used verbatim (`'auto'` in `'panel'` mode hugs the content).\n * Defaults to `'45%'`.\n */\n mobileHeight?: string | number;\n /**\n * `'panel'` mode only: the size the panel keeps while closed, so it can leave\n * a tappable strip (a header, a collapsed composer bar) behind instead of\n * vanishing with no way back. Number = px, string = verbatim. @default 0\n */\n mobileCollapsedSize?: string | number;\n /** Extra classes on the drawer surface (desktop panel + mobile overlay). */\n className?: string;\n /** `'drawer'` mode only: swipe in-axis on the drawer to close it. Default true. */\n swipeToClose?: boolean;\n /** `'drawer'` mode only: off-screen edge zone that opens it on an inward swipe. Default false. */\n edgeSwipeToOpen?: boolean;\n}\n\nexport interface ResizableLayoutHandle {\n collapse(side: DrawerSide): void;\n expand(side: DrawerSide): void;\n toggle(side: DrawerSide): void;\n isCollapsed(side: DrawerSide): boolean;\n}\n\nexport interface ResizableLayoutProps {\n left?: ResizableDrawerConfig;\n right?: ResizableDrawerConfig;\n top?: ResizableDrawerConfig;\n bottom?: ResizableDrawerConfig;\n /** Controlled open state of the left drawer (collapse on desktop, overlay on mobile). */\n leftOpen?: boolean;\n onLeftOpenChange?: (open: boolean) => void;\n rightOpen?: boolean;\n onRightOpenChange?: (open: boolean) => void;\n topOpen?: boolean;\n onTopOpenChange?: (open: boolean) => void;\n bottomOpen?: boolean;\n onBottomOpenChange?: (open: boolean) => void;\n /** The scrollable center. Give its inner scroll region `min-h-0 flex-1 overflow-y-auto`. */\n children: ReactNode;\n className?: string;\n /** Persist desktop panel sizes under this key (react-resizable-panels autoSaveId). */\n autoSaveId?: string;\n /** Render a collapse/expand toggle on each resize handle (desktop). Default true. */\n showCollapseButtons?: boolean;\n /** Breakpoint (px) at/above which the desktop resizable layout is used. Default 768. */\n desktopBreakpoint?: number;\n}\n\n/** True at or above `min` px wide; re-renders on viewport crossing. */\nfunction useMinWidth(min: number): boolean {\n const query = `(min-width: ${min}px)`;\n const [match, setMatch] = useState(() =>\n typeof window !== 'undefined' ? window.matchMedia(query).matches : true,\n );\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const mq = window.matchMedia(query);\n const on = () => setMatch(mq.matches);\n on();\n mq.addEventListener('change', on);\n return () => mq.removeEventListener('change', on);\n }, [query]);\n return match;\n}\n\nconst css = (v: string | number) => (typeof v === 'number' ? `${v}px` : v);\n\n/** The open size of a mobile side along its own axis. */\nfunction openSize(side: DrawerSide, config: ResizableDrawerConfig): string {\n if (isHorizontal(side)) return css(config.mobileWidth ?? '85%');\n return css(config.mobileHeight ?? '45%');\n}\n\nfunction sizeStyle(side: DrawerSide, config: ResizableDrawerConfig): CSSProperties {\n const value = openSize(side, config);\n return isHorizontal(side)\n ? { width: value, maxWidth: '100%' }\n : { height: value, maxHeight: '100%' };\n}\n\n/**\n * A four-slot application layout — left/right/top/bottom drawers around a\n * scrollable center — that adapts to the viewport:\n *\n * - **Desktop** (≥ `desktopBreakpoint`): the drawers are real shadcn-style\n * resizable panels (react-resizable-panels). Each can be dragged between\n * `minSize`/`maxSize`, collapsed completely (to zero) via the handle button\n * or the imperative ref, and its size is persisted with `autoSaveId`.\n * - **Mobile**: each side picks its own behaviour via `mobileMode`:\n * - `'drawer'` (default) — a fixed, swipeable overlay with a backdrop, like a\n * native slide-in sheet. It takes focus: the center is dimmed and inert.\n * - `'panel'` — stays in the flow and splits the screen with the center, which\n * stays fully usable. Use it for anything the user must be able to reach\n * without dismissing something first (a composer, a toolbar); a `'drawer'`\n * with no on-screen trigger is a drawer the user cannot re-open.\n *\n * Both are sized per side with `mobileWidth`/`mobileHeight` (a `'panel'` may\n * also use `'auto'` to hug its content, and `mobileCollapsedSize` to keep a\n * tappable strip visible while closed).\n *\n * The center is always a `min-h-0` flex column, so a child with\n * `min-h-0 flex-1 overflow-y-auto` scrolls correctly in both modes — no more\n * \"stuck\" content.\n *\n * `open` state is controlled per side (`leftOpen`/`onLeftOpenChange`, …). On\n * desktop that maps to collapsed/expanded; on mobile to the slide-in overlay.\n * The imperative handle exposes `collapse`/`expand`/`toggle`/`isCollapsed`.\n */\nexport const ResizableLayout = forwardRef<ResizableLayoutHandle, ResizableLayoutProps>(\n function ResizableLayout(\n {\n left,\n right,\n top,\n bottom,\n leftOpen = true,\n onLeftOpenChange,\n rightOpen = true,\n onRightOpenChange,\n topOpen = true,\n onTopOpenChange,\n bottomOpen = true,\n onBottomOpenChange,\n children,\n className,\n autoSaveId,\n showCollapseButtons = true,\n desktopBreakpoint = 768,\n },\n ref,\n ) {\n const isDesktop = useMinWidth(desktopBreakpoint);\n const leftPanel = useRef<ImperativePanelHandle>(null);\n const rightPanel = useRef<ImperativePanelHandle>(null);\n const topPanel = useRef<ImperativePanelHandle>(null);\n const bottomPanel = useRef<ImperativePanelHandle>(null);\n\n const openBySide = { left: leftOpen, right: rightOpen, top: topOpen, bottom: bottomOpen };\n const panelBySide = { left: leftPanel, right: rightPanel, top: topPanel, bottom: bottomPanel };\n const configBySide = { left, right, top, bottom };\n\n const onChange = useCallback(\n (side: DrawerSide, open: boolean) => {\n (\n {\n left: onLeftOpenChange,\n right: onRightOpenChange,\n top: onTopOpenChange,\n bottom: onBottomOpenChange,\n }[side]\n )?.(open);\n },\n [onLeftOpenChange, onRightOpenChange, onTopOpenChange, onBottomOpenChange],\n );\n\n // Keep each collapsible panel in sync with its controlled `open` prop.\n useEffect(() => {\n (['left', 'right', 'top', 'bottom'] as const).forEach((side) => {\n const p = panelBySide[side].current;\n if (!isDesktop || !p || !configBySide[side]) return;\n const open = openBySide[side];\n if (open && p.isCollapsed()) p.expand();\n else if (!open && p.isExpanded()) p.collapse();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDesktop, left, right, top, bottom, leftOpen, rightOpen, topOpen, bottomOpen]);\n\n useImperativeHandle(\n ref,\n () => {\n const panelFor = (s: DrawerSide) => panelBySide[s].current;\n const isCollapsed = (s: DrawerSide) => {\n if (isDesktop) return panelFor(s)?.isCollapsed() ?? true;\n return !openBySide[s];\n };\n return {\n collapse: (s) => {\n panelFor(s)?.collapse();\n onChange(s, false);\n },\n expand: (s) => {\n panelFor(s)?.expand();\n onChange(s, true);\n },\n toggle: (s) => onChange(s, isCollapsed(s)),\n isCollapsed,\n };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [isDesktop, leftOpen, rightOpen, topOpen, bottomOpen, onChange],\n );\n\n // ---- Mobile: per-side overlay drawer or in-flow split panel -------------\n if (!isDesktop) {\n const mobileSide = (side: DrawerSide) => {\n const config = configBySide[side];\n if (!config) return null;\n const props = {\n side,\n config,\n open: openBySide[side],\n onOpenChange: (o: boolean) => onChange(side, o),\n };\n return (config.mobileMode ?? 'drawer') === 'panel' ? (\n <MobilePanel {...props} />\n ) : (\n <MobileDrawer {...props} />\n );\n };\n\n return (\n <div className={cn('relative flex h-full w-full min-h-0 flex-col overflow-hidden', className)}>\n {mobileSide('top')}\n <div className=\"relative flex min-h-0 min-w-0 flex-1 overflow-hidden\">\n {mobileSide('left')}\n <div className=\"relative grid min-h-0 min-w-0 flex-1 grid-cols-1 grid-rows-1 overflow-hidden\">\n {children}\n </div>\n {mobileSide('right')}\n </div>\n {mobileSide('bottom')}\n </div>\n );\n }\n\n // ---- Desktop: resizable panels -----------------------------------------\n const horizontalGroup = (\n <PanelGroup\n direction=\"horizontal\"\n autoSaveId={autoSaveId}\n className=\"h-full w-full min-h-0\"\n >\n {left && (\n <>\n <Panel\n ref={leftPanel}\n order={1}\n collapsible\n collapsedSize={0}\n defaultSize={leftOpen ? (left.defaultSize ?? 20) : 0}\n minSize={left.minSize ?? 12}\n maxSize={left.maxSize ?? 40}\n onCollapse={() => onChange('left', false)}\n onExpand={() => onChange('left', true)}\n className={cn('flex min-h-0 flex-col overflow-hidden', left.className)}\n >\n {left.content}\n </Panel>\n <ResizeHandle\n side=\"left\"\n showButton={showCollapseButtons}\n onToggle={() => onChange('left', !leftOpen)}\n open={leftOpen}\n />\n </>\n )}\n\n <Panel\n order={2}\n minSize={30}\n className=\"relative grid min-h-0 min-w-0 grid-cols-1 grid-rows-1 overflow-hidden\"\n >\n {children}\n </Panel>\n\n {right && (\n <>\n <ResizeHandle\n side=\"right\"\n showButton={showCollapseButtons}\n onToggle={() => onChange('right', !rightOpen)}\n open={rightOpen}\n />\n <Panel\n ref={rightPanel}\n order={3}\n collapsible\n collapsedSize={0}\n defaultSize={rightOpen ? (right.defaultSize ?? 22) : 0}\n minSize={right.minSize ?? 12}\n maxSize={right.maxSize ?? 45}\n onCollapse={() => onChange('right', false)}\n onExpand={() => onChange('right', true)}\n className={cn('flex min-h-0 flex-col overflow-hidden', right.className)}\n >\n {right.content}\n </Panel>\n </>\n )}\n </PanelGroup>\n );\n\n if (!top && !bottom) {\n return (\n <div className={cn('h-full w-full min-h-0', className)}>{horizontalGroup}</div>\n );\n }\n\n return (\n <PanelGroup\n direction=\"vertical\"\n autoSaveId={autoSaveId ? `${autoSaveId}:vertical` : undefined}\n className={cn('h-full w-full min-h-0', className)}\n >\n {top && (\n <>\n <Panel\n ref={topPanel}\n order={1}\n collapsible\n collapsedSize={0}\n defaultSize={topOpen ? (top.defaultSize ?? 30) : 0}\n minSize={top.minSize ?? 12}\n maxSize={top.maxSize ?? 60}\n onCollapse={() => onChange('top', false)}\n onExpand={() => onChange('top', true)}\n className={cn('flex min-h-0 flex-col overflow-hidden', top.className)}\n >\n {top.content}\n </Panel>\n <ResizeHandle\n side=\"top\"\n showButton={showCollapseButtons}\n onToggle={() => onChange('top', !topOpen)}\n open={topOpen}\n />\n </>\n )}\n\n <Panel order={2} minSize={20} className=\"relative min-h-0 w-full overflow-hidden\">\n {horizontalGroup}\n </Panel>\n\n {bottom && (\n <>\n <ResizeHandle\n side=\"bottom\"\n showButton={showCollapseButtons}\n onToggle={() => onChange('bottom', !bottomOpen)}\n open={bottomOpen}\n />\n <Panel\n ref={bottomPanel}\n order={3}\n collapsible\n collapsedSize={0}\n defaultSize={bottomOpen ? (bottom.defaultSize ?? 30) : 0}\n minSize={bottom.minSize ?? 12}\n maxSize={bottom.maxSize ?? 60}\n onCollapse={() => onChange('bottom', false)}\n onExpand={() => onChange('bottom', true)}\n className={cn('flex min-h-0 flex-col overflow-hidden', bottom.className)}\n >\n {bottom.content}\n </Panel>\n </>\n )}\n </PanelGroup>\n );\n },\n);\n\n/** A draggable divider with an optional collapse/expand toggle button. */\nfunction ResizeHandle({\n side,\n showButton,\n onToggle,\n open,\n}: {\n side: DrawerSide;\n showButton: boolean;\n onToggle: () => void;\n open: boolean;\n}) {\n // Which way the chevron points to \"put the drawer away\".\n const collapseIcons: Record<DrawerSide, typeof ChevronLeft> = {\n left: ChevronLeft,\n right: ChevronRight,\n top: ChevronUp,\n bottom: ChevronDown,\n };\n const expandIcons: Record<DrawerSide, typeof ChevronLeft> = {\n left: ChevronRight,\n right: ChevronLeft,\n top: ChevronDown,\n bottom: ChevronUp,\n };\n const Icon = open ? collapseIcons[side] : expandIcons[side];\n const horizontal = isHorizontal(side);\n\n return (\n <PanelResizeHandle\n className={cn(\n 'group relative bg-border transition-colors hover:bg-primary/50 data-[resize-handle-state=drag]:bg-primary',\n horizontal ? 'w-px' : 'h-px',\n )}\n >\n {/* widen the hit area without taking layout width/height */}\n <div\n className={cn(\n 'absolute z-10',\n horizontal ? 'inset-y-0 -left-1 -right-1' : 'inset-x-0 -top-1 -bottom-1',\n )}\n />\n {showButton && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n title={open ? 'Collapse' : 'Expand'}\n className={cn(\n 'absolute z-20 flex items-center justify-center rounded-sm border border-border bg-card text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground group-hover:opacity-100',\n horizontal\n ? cn('top-1/2 h-8 w-4 -translate-y-1/2', side === 'left' ? '-left-2' : '-right-2')\n : cn('left-1/2 h-4 w-8 -translate-x-1/2', side === 'top' ? '-top-2' : '-bottom-2'),\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </PanelResizeHandle>\n );\n}\n\n/**\n * An in-flow mobile side that splits the screen with the center instead of\n * overlaying it — no backdrop, so the center stays interactive. Closing it\n * shrinks it to `mobileCollapsedSize` (0 by default) rather than sliding it\n * off-screen; the content stays mounted either way, so a composer keeps its\n * draft across a collapse.\n */\nfunction MobilePanel({\n side,\n config,\n open,\n}: {\n side: DrawerSide;\n config: ResizableDrawerConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const horizontal = isHorizontal(side);\n const size = open ? openSize(side, config) : css(config.mobileCollapsedSize ?? 0);\n\n return (\n <aside\n style={horizontal ? { width: size, maxWidth: '100%' } : { height: size, maxHeight: '100%' }}\n className={cn(\n 'relative flex shrink-0 flex-col overflow-hidden bg-card transition-[width,height] duration-200',\n side === 'left' && 'border-r border-border',\n side === 'right' && 'border-l border-border',\n side === 'top' && 'border-b border-border',\n side === 'bottom' && 'border-t border-border',\n config.className,\n )}\n >\n {config.content}\n </aside>\n );\n}\n\n/** A fixed, swipeable slide-in drawer used on mobile viewports. */\nfunction MobileDrawer({\n side,\n config,\n open,\n onOpenChange,\n}: {\n side: DrawerSide;\n config: ResizableDrawerConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const horizontal = isHorizontal(side);\n const touchPos = useRef<number | null>(null);\n const edgePos = useRef<number | null>(null);\n const swipeClose = config.swipeToClose ?? true;\n\n const clientPos = (e: TouchEvent) =>\n horizontal ? e.touches[0].clientX : e.touches[0].clientY;\n\n return (\n <>\n {/* backdrop */}\n <div\n onClick={() => onOpenChange(false)}\n className={cn(\n 'fixed inset-0 z-30 bg-black/50 transition-opacity',\n open ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n />\n\n {/* off-screen edge zone that opens the drawer on an inward swipe */}\n {config.edgeSwipeToOpen && !open && (\n <div\n className={cn(\n 'fixed z-20',\n horizontal\n ? cn('inset-y-0 w-4', side === 'left' ? 'left-0' : 'right-0')\n : cn('inset-x-0 h-4', side === 'top' ? 'top-0' : 'bottom-0'),\n )}\n onTouchStart={(e) => (edgePos.current = clientPos(e))}\n onTouchMove={(e) => {\n if (edgePos.current === null) return;\n const d = clientPos(e) - edgePos.current;\n const opens =\n (side === 'left' && d > 50) ||\n (side === 'right' && d < -50) ||\n (side === 'top' && d > 50) ||\n (side === 'bottom' && d < -50);\n if (opens) {\n onOpenChange(true);\n edgePos.current = null;\n }\n }}\n onTouchEnd={() => (edgePos.current = null)}\n />\n )}\n\n <aside\n style={sizeStyle(side, config)}\n onTouchStart={(e) => swipeClose && (touchPos.current = clientPos(e))}\n onTouchMove={(e) => {\n if (!swipeClose || touchPos.current === null) return;\n const d = clientPos(e) - touchPos.current;\n const closes =\n (side === 'left' && d < -60) ||\n (side === 'right' && d > 60) ||\n (side === 'top' && d < -60) ||\n (side === 'bottom' && d > 60);\n if (closes) {\n onOpenChange(false);\n touchPos.current = null;\n }\n }}\n onTouchEnd={() => (touchPos.current = null)}\n className={cn(\n 'fixed z-40 flex flex-col bg-card transition-transform duration-200',\n horizontal ? 'inset-y-0' : 'inset-x-0',\n side === 'left' && 'left-0 border-r border-border',\n side === 'right' && 'right-0 border-l border-border',\n side === 'top' && 'top-0 border-b border-border',\n side === 'bottom' && 'bottom-0 border-t border-border',\n open ? 'translate-x-0 translate-y-0' : cn(closedTransform(side), 'pointer-events-none'),\n config.className,\n )}\n >\n {config.content}\n </aside>\n </>\n );\n}\n\nfunction closedTransform(side: DrawerSide): string {\n switch (side) {\n case 'left':\n return '-translate-x-full';\n case 'right':\n return 'translate-x-full';\n case 'top':\n return '-translate-y-full';\n case 'bottom':\n return 'translate-y-full';\n }\n}\n"],"names":["HORIZONTAL_SIDES","isHorizontal","side","useMinWidth","min","query","match","setMatch","useState","useEffect","mq","on","css","v","openSize","config","sizeStyle","value","ResizableLayout","forwardRef","left","right","top","bottom","leftOpen","onLeftOpenChange","rightOpen","onRightOpenChange","topOpen","onTopOpenChange","bottomOpen","onBottomOpenChange","children","className","autoSaveId","showCollapseButtons","desktopBreakpoint","ref","isDesktop","leftPanel","useRef","rightPanel","topPanel","bottomPanel","openBySide","panelBySide","configBySide","onChange","useCallback","open","_b","_a","p","useImperativeHandle","panelFor","s","isCollapsed","mobileSide","props","o","jsx","MobilePanel","MobileDrawer","cn","jsxs","horizontalGroup","PanelGroup","Fragment","Panel","ResizeHandle","showButton","onToggle","Icon","ChevronLeft","ChevronRight","ChevronUp","ChevronDown","horizontal","PanelResizeHandle","e","size","onOpenChange","touchPos","edgePos","swipeClose","clientPos","d","closedTransform"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ComposeInput } from './types';
2
+ /**
3
+ * Default prompt composer: appends an attachments block, the injected guideline
4
+ * lines and any tag descriptions under the raw text. Callers that want a
5
+ * different shape (or none) pass their own `composePrompt`.
6
+ */
7
+ export declare function defaultComposePrompt({ text, guidelines, tags, files }: ComposeInput): string;
8
+ /** The guideline line a tag contributes for its current on/off state. */
9
+ export declare function tagGuideline(tag: {
10
+ prompt?: string;
11
+ promptOff?: string;
12
+ }, on: boolean): string | null;
13
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/components/rich-input/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,YAAY,GAAG,MAAM,CAqB5F;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGrG"}
@@ -0,0 +1,28 @@
1
+ function p({ text: e, guidelines: i, tags: o, files: r }) {
2
+ const n = [e.trim()];
3
+ if (r.length > 0) {
4
+ n.push("", "Attachments:");
5
+ for (const t of r) n.push(`- ${t.name}`);
6
+ }
7
+ const s = o.filter((t) => t.description);
8
+ if (s.length > 0) {
9
+ n.push("", "Context:");
10
+ for (const t of s) n.push(`- ${t.label} — ${t.description}`);
11
+ }
12
+ const f = i.map((t) => t.trim()).filter(Boolean);
13
+ if (f.length > 0) {
14
+ n.push("", "Guidelines:");
15
+ for (const t of f) n.push(`- ${t}`);
16
+ }
17
+ return n.join(`
18
+ `);
19
+ }
20
+ function c(e, i) {
21
+ const o = i ? e.prompt : e.promptOff;
22
+ return o != null && o.trim() ? o : null;
23
+ }
24
+ export {
25
+ p as defaultComposePrompt,
26
+ c as tagGuideline
27
+ };
28
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sources":["../../../src/components/rich-input/compose.ts"],"sourcesContent":["import type { ComposeInput } from './types';\n\n/**\n * Default prompt composer: appends an attachments block, the injected guideline\n * lines and any tag descriptions under the raw text. Callers that want a\n * different shape (or none) pass their own `composePrompt`.\n */\nexport function defaultComposePrompt({ text, guidelines, tags, files }: ComposeInput): string {\n const lines: string[] = [text.trim()];\n\n if (files.length > 0) {\n lines.push('', 'Attachments:');\n for (const f of files) lines.push(`- ${f.name}`);\n }\n\n const described = tags.filter((t) => t.description);\n if (described.length > 0) {\n lines.push('', 'Context:');\n for (const t of described) lines.push(`- ${t.label} — ${t.description}`);\n }\n\n const clean = guidelines.map((g) => g.trim()).filter(Boolean);\n if (clean.length > 0) {\n lines.push('', 'Guidelines:');\n for (const g of clean) lines.push(`- ${g}`);\n }\n\n return lines.join('\\n');\n}\n\n/** The guideline line a tag contributes for its current on/off state. */\nexport function tagGuideline(tag: { prompt?: string; promptOff?: string }, on: boolean): string | null {\n const line = on ? tag.prompt : tag.promptOff;\n return line?.trim() ? line : null;\n}\n"],"names":["defaultComposePrompt","text","guidelines","tags","files","lines","f","described","clean","g","tagGuideline","tag","on","line"],"mappings":"AAOO,SAASA,EAAqB,EAAE,MAAAC,GAAM,YAAAC,GAAY,MAAAC,GAAM,OAAAC,KAA+B;AAC5F,QAAMC,IAAkB,CAACJ,EAAK,MAAM;AAEpC,MAAIG,EAAM,SAAS,GAAG;AACpB,IAAAC,EAAM,KAAK,IAAI,cAAc;AAC7B,eAAWC,KAAKF,EAAO,CAAAC,EAAM,KAAK,KAAKC,EAAE,IAAI,EAAE;AAAA,EACjD;AAEA,QAAMC,IAAYJ,EAAK,OAAO,CAAC,MAAM,EAAE,WAAW;AAClD,MAAII,EAAU,SAAS,GAAG;AACxB,IAAAF,EAAM,KAAK,IAAI,UAAU;AACzB,eAAW,KAAKE,EAAW,CAAAF,EAAM,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE;AAAA,EACzE;AAEA,QAAMG,IAAQN,EAAW,IAAI,CAACO,MAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO;AAC5D,MAAID,EAAM,SAAS,GAAG;AACpB,IAAAH,EAAM,KAAK,IAAI,aAAa;AAC5B,eAAWI,KAAKD,EAAO,CAAAH,EAAM,KAAK,KAAKI,CAAC,EAAE;AAAA,EAC5C;AAEA,SAAOJ,EAAM,KAAK;AAAA,CAAI;AACxB;AAGO,SAASK,EAAaC,GAA8CC,GAA4B;AACrG,QAAMC,IAAOD,IAAKD,EAAI,SAASA,EAAI;AACnC,SAAOE,KAAA,QAAAA,EAAM,SAASA,IAAO;AAC/B;"}
@@ -0,0 +1,5 @@
1
+ export { RichInput } from './rich-input';
2
+ export type { RichInputProps } from './rich-input';
3
+ export type { RichFile, GuidelineTag, RichSendPayload, RichInputHandle, ComposeInput, } from './types';
4
+ export { defaultComposePrompt } from './compose';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/rich-input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC"}