@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 @@
1
+ {"version":3,"file":"use-media-query.d.ts","sourceRoot":"","sources":["../../src/hooks/use-media-query.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,UAAU,SAAM,GAAG,OAAO,CAErD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
@@ -0,0 +1,37 @@
1
+ import * as o from "react";
2
+ function r(e) {
3
+ const s = o.useCallback(
4
+ (n) => {
5
+ if (typeof window > "u") return () => {
6
+ };
7
+ const t = window.matchMedia(e);
8
+ return t.addEventListener("change", n), () => t.removeEventListener("change", n);
9
+ },
10
+ [e]
11
+ );
12
+ return o.useSyncExternalStore(
13
+ s,
14
+ () => typeof window > "u" ? !1 : window.matchMedia(e).matches,
15
+ () => !1
16
+ );
17
+ }
18
+ function u(e = 768) {
19
+ return r(`(max-width: ${e - 1}px)`);
20
+ }
21
+ function i() {
22
+ return r("(pointer: coarse)");
23
+ }
24
+ function c() {
25
+ return r("(prefers-color-scheme: dark)");
26
+ }
27
+ function d() {
28
+ return r("(prefers-reduced-motion: reduce)");
29
+ }
30
+ export {
31
+ u as useIsMobile,
32
+ i as useIsTouch,
33
+ r as useMediaQuery,
34
+ c as usePrefersDark,
35
+ d as usePrefersReducedMotion
36
+ };
37
+ //# sourceMappingURL=use-media-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-media-query.js","sources":["../../src/hooks/use-media-query.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Subscribe to a CSS media query.\n *\n * SSR-safe (`false` on the server, resolved on hydration) and driven by\n * `useSyncExternalStore`, so several components watching the same query share\n * one listener and never tear.\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = React.useCallback(\n (onChange: () => void) => {\n if (typeof window === 'undefined') return () => {};\n const mql = window.matchMedia(query);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n },\n [query],\n );\n\n return React.useSyncExternalStore(\n subscribe,\n () => (typeof window === 'undefined' ? false : window.matchMedia(query).matches),\n () => false,\n );\n}\n\n/** True below the `md` breakpoint (768px) — the phone/desktop split. */\nexport function useIsMobile(breakpoint = 768): boolean {\n return useMediaQuery(`(max-width: ${breakpoint - 1}px)`);\n}\n\n/** True on a coarse pointer (finger) — use for tap targets, not for width. */\nexport function useIsTouch(): boolean {\n return useMediaQuery('(pointer: coarse)');\n}\n\n/** The OS colour-scheme preference. See `useTheme` for the resolved theme. */\nexport function usePrefersDark(): boolean {\n return useMediaQuery('(prefers-color-scheme: dark)');\n}\n\n/** True when the user asked for less motion — gate animations on it. */\nexport function usePrefersReducedMotion(): boolean {\n return useMediaQuery('(prefers-reduced-motion: reduce)');\n}\n"],"names":["useMediaQuery","query","subscribe","React","onChange","mql","useIsMobile","breakpoint","useIsTouch","usePrefersDark","usePrefersReducedMotion"],"mappings":";AASO,SAASA,EAAcC,GAAwB;AACpD,QAAMC,IAAYC,EAAM;AAAA,IACtB,CAACC,MAAyB;AACxB,UAAI,OAAO,SAAW,IAAa,QAAO,MAAM;AAAA,MAAC;AACjD,YAAMC,IAAM,OAAO,WAAWJ,CAAK;AACnC,aAAAI,EAAI,iBAAiB,UAAUD,CAAQ,GAChC,MAAMC,EAAI,oBAAoB,UAAUD,CAAQ;AAAA,IACzD;AAAA,IACA,CAACH,CAAK;AAAA,EAAA;AAGR,SAAOE,EAAM;AAAA,IACXD;AAAA,IACA,MAAO,OAAO,SAAW,MAAc,KAAQ,OAAO,WAAWD,CAAK,EAAE;AAAA,IACxE,MAAM;AAAA,EAAA;AAEV;AAGO,SAASK,EAAYC,IAAa,KAAc;AACrD,SAAOP,EAAc,eAAeO,IAAa,CAAC,KAAK;AACzD;AAGO,SAASC,IAAsB;AACpC,SAAOR,EAAc,mBAAmB;AAC1C;AAGO,SAASS,IAA0B;AACxC,SAAOT,EAAc,8BAA8B;AACrD;AAGO,SAASU,IAAmC;AACjD,SAAOV,EAAc,kCAAkC;AACzD;"}
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Lock body scroll while `active`.
4
+ *
5
+ * Reference-counted, so nesting a modal inside a viewer (or opening two at
6
+ * once) doesn't unlock the page when only the inner one closes. Compensates for
7
+ * the scrollbar width so the page doesn't jump on lock.
8
+ */
9
+ export declare function useScrollLock(active?: boolean): void;
10
+ /** Call `onEscape` when Escape is pressed (while `active`). */
11
+ export declare function useEscape(onEscape: () => void, active?: boolean): void;
12
+ /**
13
+ * Close when a click (or focus) lands outside the referenced element.
14
+ *
15
+ * Listens on `pointerdown` so the menu closes before the click resolves — the
16
+ * behaviour every hand-rolled popover forgets, which is why a click on a link
17
+ * behind an open dropdown otherwise gets eaten.
18
+ */
19
+ export declare function useOutsideClick<T extends HTMLElement = HTMLElement>(onOutside: () => void, active?: boolean): React.RefObject<T | null>;
20
+ //# sourceMappingURL=use-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-overlay.d.ts","sourceRoot":"","sources":["../../src/hooks/use-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,UAAO,QAsB1C;AAKD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,MAAM,UAAO,QAY5D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EACjE,SAAS,EAAE,MAAM,IAAI,EACrB,MAAM,UAAO,6BAiBd"}
@@ -0,0 +1,42 @@
1
+ import * as o from "react";
2
+ function f(t = !0) {
3
+ o.useEffect(() => {
4
+ if (!t || typeof document > "u") return;
5
+ const e = document.body;
6
+ if (d === 0) {
7
+ const n = window.innerWidth - document.documentElement.clientWidth;
8
+ u = { overflow: e.style.overflow, paddingRight: e.style.paddingRight }, e.style.overflow = "hidden", n > 0 && (e.style.paddingRight = `${n}px`);
9
+ }
10
+ return d += 1, () => {
11
+ d -= 1, d === 0 && u && (e.style.overflow = u.overflow, e.style.paddingRight = u.paddingRight, u = null);
12
+ };
13
+ }, [t]);
14
+ }
15
+ let d = 0, u = null;
16
+ function l(t, e = !0) {
17
+ const n = o.useRef(t);
18
+ n.current = t, o.useEffect(() => {
19
+ if (!e) return;
20
+ const r = (i) => {
21
+ i.key === "Escape" && n.current();
22
+ };
23
+ return window.addEventListener("keydown", r), () => window.removeEventListener("keydown", r);
24
+ }, [e]);
25
+ }
26
+ function w(t, e = !0) {
27
+ const n = o.useRef(null), r = o.useRef(t);
28
+ return r.current = t, o.useEffect(() => {
29
+ if (!e) return;
30
+ const i = (s) => {
31
+ const c = n.current;
32
+ c && !c.contains(s.target) && r.current();
33
+ };
34
+ return document.addEventListener("pointerdown", i, !0), () => document.removeEventListener("pointerdown", i, !0);
35
+ }, [e]), n;
36
+ }
37
+ export {
38
+ l as useEscape,
39
+ w as useOutsideClick,
40
+ f as useScrollLock
41
+ };
42
+ //# sourceMappingURL=use-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-overlay.js","sources":["../../src/hooks/use-overlay.ts"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Lock body scroll while `active`.\n *\n * Reference-counted, so nesting a modal inside a viewer (or opening two at\n * once) doesn't unlock the page when only the inner one closes. Compensates for\n * the scrollbar width so the page doesn't jump on lock.\n */\nexport function useScrollLock(active = true) {\n React.useEffect(() => {\n if (!active || typeof document === 'undefined') return;\n const body = document.body;\n\n if (locks === 0) {\n const gap = window.innerWidth - document.documentElement.clientWidth;\n previous = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };\n body.style.overflow = 'hidden';\n if (gap > 0) body.style.paddingRight = `${gap}px`;\n }\n locks += 1;\n\n return () => {\n locks -= 1;\n if (locks === 0 && previous) {\n body.style.overflow = previous.overflow;\n body.style.paddingRight = previous.paddingRight;\n previous = null;\n }\n };\n }, [active]);\n}\n\nlet locks = 0;\nlet previous: { overflow: string; paddingRight: string } | null = null;\n\n/** Call `onEscape` when Escape is pressed (while `active`). */\nexport function useEscape(onEscape: () => void, active = true) {\n const cb = React.useRef(onEscape);\n cb.current = onEscape;\n\n React.useEffect(() => {\n if (!active) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') cb.current();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [active]);\n}\n\n/**\n * Close when a click (or focus) lands outside the referenced element.\n *\n * Listens on `pointerdown` so the menu closes before the click resolves — the\n * behaviour every hand-rolled popover forgets, which is why a click on a link\n * behind an open dropdown otherwise gets eaten.\n */\nexport function useOutsideClick<T extends HTMLElement = HTMLElement>(\n onOutside: () => void,\n active = true,\n) {\n const ref = React.useRef<T | null>(null);\n const cb = React.useRef(onOutside);\n cb.current = onOutside;\n\n React.useEffect(() => {\n if (!active) return;\n const onDown = (e: PointerEvent) => {\n const el = ref.current;\n if (el && !el.contains(e.target as globalThis.Node)) cb.current();\n };\n document.addEventListener('pointerdown', onDown, true);\n return () => document.removeEventListener('pointerdown', onDown, true);\n }, [active]);\n\n return ref;\n}\n"],"names":["useScrollLock","active","React","body","locks","gap","previous","useEscape","onEscape","cb","onKey","e","useOutsideClick","onOutside","ref","onDown","el"],"mappings":";AASO,SAASA,EAAcC,IAAS,IAAM;AAC3C,EAAAC,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,KAAU,OAAO,WAAa,IAAa;AAChD,UAAME,IAAO,SAAS;AAEtB,QAAIC,MAAU,GAAG;AACf,YAAMC,IAAM,OAAO,aAAa,SAAS,gBAAgB;AACzD,MAAAC,IAAW,EAAE,UAAUH,EAAK,MAAM,UAAU,cAAcA,EAAK,MAAM,aAAA,GACrEA,EAAK,MAAM,WAAW,UAClBE,IAAM,MAAGF,EAAK,MAAM,eAAe,GAAGE,CAAG;AAAA,IAC/C;AACA,WAAAD,KAAS,GAEF,MAAM;AACX,MAAAA,KAAS,GACLA,MAAU,KAAKE,MACjBH,EAAK,MAAM,WAAWG,EAAS,UAC/BH,EAAK,MAAM,eAAeG,EAAS,cACnCA,IAAW;AAAA,IAEf;AAAA,EACF,GAAG,CAACL,CAAM,CAAC;AACb;AAEA,IAAIG,IAAQ,GACRE,IAA8D;AAG3D,SAASC,EAAUC,GAAsBP,IAAS,IAAM;AAC7D,QAAMQ,IAAKP,EAAM,OAAOM,CAAQ;AAChC,EAAAC,EAAG,UAAUD,GAEbN,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,EAAQ;AACb,UAAMS,IAAQ,CAACC,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAUF,EAAG,QAAA;AAAA,IAC7B;AACA,kBAAO,iBAAiB,WAAWC,CAAK,GACjC,MAAM,OAAO,oBAAoB,WAAWA,CAAK;AAAA,EAC1D,GAAG,CAACT,CAAM,CAAC;AACb;AASO,SAASW,EACdC,GACAZ,IAAS,IACT;AACA,QAAMa,IAAMZ,EAAM,OAAiB,IAAI,GACjCO,IAAKP,EAAM,OAAOW,CAAS;AACjC,SAAAJ,EAAG,UAAUI,GAEbX,EAAM,UAAU,MAAM;AACpB,QAAI,CAACD,EAAQ;AACb,UAAMc,IAAS,CAACJ,MAAoB;AAClC,YAAMK,IAAKF,EAAI;AACf,MAAIE,KAAM,CAACA,EAAG,SAASL,EAAE,MAAyB,OAAM,QAAA;AAAA,IAC1D;AACA,oBAAS,iBAAiB,eAAeI,GAAQ,EAAI,GAC9C,MAAM,SAAS,oBAAoB,eAAeA,GAAQ,EAAI;AAAA,EACvE,GAAG,CAACd,CAAM,CAAC,GAEJa;AACT;"}
@@ -0,0 +1,152 @@
1
+ /*
2
+ * Styling for <ImageViewerProvider> / <ViewableImage>.
3
+ *
4
+ * Plain CSS — no Tailwind directives — so it works whether or not the consumer
5
+ * uses Tailwind. Every visual choice reads from a `--ds-viewer-*` custom
6
+ * property with a sensible fallback, so you can retheme the overlay without
7
+ * overriding selectors. Defaults assume a dark, glassy overlay.
8
+ */
9
+
10
+ :root {
11
+ --ds-viewer-backdrop: rgba(9, 9, 11, 0.96);
12
+ --ds-viewer-fg: #f4f4f5;
13
+ --ds-viewer-muted: #d4d4d8;
14
+ --ds-viewer-ctl-bg: rgba(24, 24, 27, 0.55);
15
+ --ds-viewer-ctl-bg-hover: rgba(63, 63, 70, 0.7);
16
+ --ds-viewer-ctl-border: rgba(255, 255, 255, 0.14);
17
+ --ds-viewer-accent: rgba(255, 255, 255, 0.4);
18
+ --ds-viewer-blur: 6px;
19
+ --ds-viewer-z: 200;
20
+ --ds-viewer-font-mono: ui-monospace, "SFMono-Regular", "JetBrains Mono", "Space Mono", monospace;
21
+ }
22
+
23
+ .viewable-image {
24
+ display: block;
25
+ height: 100%;
26
+ width: 100%;
27
+ padding: 0;
28
+ border: none;
29
+ background: transparent;
30
+ cursor: zoom-in;
31
+ }
32
+
33
+ @keyframes ds-viewer-in {
34
+ from { opacity: 0; }
35
+ to { opacity: 1; }
36
+ }
37
+ @keyframes ds-viewer-img-in {
38
+ from { opacity: 0; }
39
+ to { opacity: 1; }
40
+ }
41
+
42
+ .viewer-overlay {
43
+ position: fixed;
44
+ inset: 0;
45
+ z-index: var(--ds-viewer-z);
46
+ background: var(--ds-viewer-backdrop);
47
+ backdrop-filter: blur(var(--ds-viewer-blur));
48
+ overflow: hidden;
49
+ /* No fill-mode: once the intro ends the animation must release `opacity` so the
50
+ drag-to-dismiss handler can fade the backdrop via inline style. */
51
+ animation: ds-viewer-in 0.18s ease;
52
+ transition: opacity 0.2s ease;
53
+ }
54
+
55
+ .viewer-stage {
56
+ position: absolute;
57
+ inset: 0;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ touch-action: none;
62
+ user-select: none;
63
+ cursor: zoom-in;
64
+ }
65
+ .viewer-stage.is-zoomed { cursor: grab; }
66
+ .viewer-stage.is-zoomed:active { cursor: grabbing; }
67
+
68
+ .viewer-img {
69
+ max-width: 100%;
70
+ max-height: 100%;
71
+ object-fit: contain;
72
+ transform-origin: center center;
73
+ will-change: transform;
74
+ -webkit-user-drag: none;
75
+ animation: ds-viewer-img-in 0.2s ease both;
76
+ }
77
+
78
+ .viewer-ctl {
79
+ position: absolute;
80
+ z-index: calc(var(--ds-viewer-z) + 10);
81
+ display: inline-flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ color: var(--ds-viewer-fg);
85
+ background: var(--ds-viewer-ctl-bg);
86
+ border: 1px solid var(--ds-viewer-ctl-border);
87
+ border-radius: 999px;
88
+ backdrop-filter: blur(8px);
89
+ cursor: pointer;
90
+ transition: background 0.2s, color 0.2s, border-color 0.2s;
91
+ }
92
+ .viewer-ctl:hover {
93
+ background: var(--ds-viewer-ctl-bg-hover);
94
+ color: #fff;
95
+ border-color: var(--ds-viewer-accent);
96
+ }
97
+ .viewer-ctl:focus-visible {
98
+ outline: 2px solid var(--ds-viewer-fg);
99
+ outline-offset: 2px;
100
+ }
101
+ .viewer-ctl svg { width: 1.35rem; height: 1.35rem; }
102
+
103
+ .viewer-close { top: 1rem; right: 1rem; width: 2.75rem; height: 2.75rem; }
104
+
105
+ .viewer-nav {
106
+ top: 50%;
107
+ transform: translateY(-50%);
108
+ width: 3rem;
109
+ height: 3rem;
110
+ }
111
+ .viewer-nav--prev { left: 1rem; }
112
+ .viewer-nav--next { right: 1rem; }
113
+
114
+ .viewer-zoom {
115
+ position: absolute;
116
+ z-index: calc(var(--ds-viewer-z) + 10);
117
+ bottom: 1.1rem;
118
+ left: 50%;
119
+ transform: translateX(-50%);
120
+ display: flex;
121
+ gap: 0.6rem;
122
+ }
123
+ .viewer-zoom .viewer-ctl { position: static; width: 2.6rem; height: 2.6rem; }
124
+
125
+ .viewer-counter {
126
+ position: absolute;
127
+ z-index: calc(var(--ds-viewer-z) + 10);
128
+ top: 1.15rem;
129
+ left: 50%;
130
+ transform: translateX(-50%);
131
+ padding: 0.3rem 0.8rem;
132
+ font-family: var(--ds-viewer-font-mono);
133
+ font-size: 0.62rem;
134
+ letter-spacing: 0.25em;
135
+ color: var(--ds-viewer-muted);
136
+ background: var(--ds-viewer-ctl-bg);
137
+ border: 1px solid var(--ds-viewer-ctl-border);
138
+ border-radius: 999px;
139
+ backdrop-filter: blur(8px);
140
+ }
141
+
142
+ @media (max-width: 640px) {
143
+ .viewer-nav { width: 2.5rem; height: 2.5rem; }
144
+ .viewer-nav--prev { left: 0.5rem; }
145
+ .viewer-nav--next { right: 0.5rem; }
146
+ .viewer-ctl svg { width: 1.15rem; height: 1.15rem; }
147
+ }
148
+
149
+ @media (prefers-reduced-motion: reduce) {
150
+ .viewer-overlay,
151
+ .viewer-img { animation: none; }
152
+ }
@@ -0,0 +1,67 @@
1
+ export { cn } from './lib/utils';
2
+ export { downloadFile, fmtBytes, fmtCost, fmtDateTime, fmtDuration, fmtNum, relTime, } from './lib/format';
3
+ export type { TimeInput } from './lib/format';
4
+ export { useCopyToClipboard, useDebouncedValue, useEscape, useInfiniteScroll, useIntersection, useIsMobile, useIsTouch, useLocalStorage, useLongPress, useMediaQuery, useOutsideClick, usePrefersDark, usePrefersReducedMotion, useScrollLock, } from './hooks';
5
+ export type { LongPressPoint, UseCopyOptions, UseDebouncedValueOptions, UseInfiniteScrollOptions, UseLongPressOptions, } from './hooks';
6
+ export { ToastProvider, Toaster, useToast } from './components/toast';
7
+ export type { Toast, ToastAction, ToastFn, ToastOptions, ToastPosition, ToastType } from './components/toast';
8
+ export { Modal, ModalProvider, useConfirm, useModal } from './components/modal';
9
+ export type { ConfirmSpec, ModalProps, ModalSize, ModalSpec } from './components/modal';
10
+ export { ThemeProvider, ThemeToggle, resolveTheme, setTheme, toggleTheme, useTheme } from './components/theme';
11
+ export type { ThemeMode, ThemeToggleProps, UseThemeResult } from './components/theme';
12
+ export { Spinner } from './components/spinner';
13
+ export type { SpinnerProps } from './components/spinner';
14
+ export { Skeleton, SkeletonGrid, SkeletonText } from './components/skeleton';
15
+ export type { SkeletonGridProps, SkeletonTextProps } from './components/skeleton';
16
+ export { EmptyState } from './components/empty-state';
17
+ export type { EmptyStateProps } from './components/empty-state';
18
+ export { Badge, JOB_STATUS, StatusBadge } from './components/status-badge';
19
+ export type { BadgeProps, StatusBadgeProps, StatusMeta, Tone } from './components/status-badge';
20
+ export { CopyButton } from './components/copy-button';
21
+ export type { CopyButtonProps } from './components/copy-button';
22
+ export { DropZone, useFileDrop } from './components/drop-zone';
23
+ export type { DropZoneProps, FileRejection, UseFileDropOptions } from './components/drop-zone';
24
+ export { SearchInput } from './components/search-input';
25
+ export type { SearchInputProps } from './components/search-input';
26
+ export { ElementPicker, ElementPickerField, ElementPickerOverlay, ElementPreview, useElementPicker, classify, formatHtml, hierarchy, parseElement, uniqueSelector, STYLE_GROUPS, STYLE_PROPS, } from './components/element-picker';
27
+ export type { ElementPickerProps, ElementPickerOverlayProps, ElementPickerFieldProps, ElementPreviewProps, UseElementPickerOptions, UseElementPickerResult, ParseOptions, ElementField, ElementInfo, ElementKind, ElementPathStep, PickedElement, } from './components/element-picker';
28
+ export { RelativeTime } from './components/relative-time';
29
+ export type { RelativeTimeProps } from './components/relative-time';
30
+ export { ImageViewerProvider, useImageViewer, ViewableImage, ProgressiveImage } from './components/image-viewer';
31
+ export { FuzzyList, highlightAll, highlightSnippet } from './components/fuzzy-list';
32
+ export type { FuzzyListProps, FuzzyRenderContext } from './components/fuzzy-list';
33
+ export { GlobalSearch, formatHotkey, parseHotkey, useHotkey } from './components/global-search';
34
+ export type { GlobalSearchProps, GlobalSearchSource, Hotkey } from './components/global-search';
35
+ export { VirtualList } from './components/virtual-list';
36
+ export type { VirtualListProps, VirtualListHandle } from './components/virtual-list';
37
+ export { Changelog } from './components/changelog';
38
+ export type { ChangelogEntry, ChangelogProps } from './components/changelog';
39
+ export { PhonePreview, IOSStatusBar } from './components/phone-preview';
40
+ export type { PhonePreviewProps } from './components/phone-preview';
41
+ export { IframePreview, IframePreviewOverlay } from './components/iframe-preview';
42
+ export type { IframePreviewProps, IframePreviewOverlayProps, IframePreviewDevice, } from './components/iframe-preview';
43
+ export { Nav2DProvider, Nav2DItem, useNav2D } from './components/nav-2d';
44
+ export type { Nav2DProviderProps, Nav2DItemProps, Nav2DContextValue } from './components/nav-2d';
45
+ export { Button, Tooltip } from './components/button';
46
+ export type { ButtonProps, ButtonVariant, ButtonSize, TooltipProps, TooltipSide, } from './components/button';
47
+ export { Input } from './components/input';
48
+ export type { InputProps } from './components/input';
49
+ export { RichInput, defaultComposePrompt } from './components/rich-input';
50
+ export type { RichInputProps, RichFile, GuidelineTag, RichSendPayload, RichInputHandle, ComposeInput, } from './components/rich-input';
51
+ export { ProgressiveText } from './components/progressive-text';
52
+ export type { ProgressiveTextProps, ProgressiveTextMeta } from './components/progressive-text';
53
+ export { ProgressiveList } from './components/progressive-list';
54
+ export type { ProgressiveListProps, ProgressiveListItemMeta } from './components/progressive-list';
55
+ export { ProgressiveTable } from './components/progressive-table';
56
+ export type { ProgressiveTableProps, ProgressiveTableCellContext } from './components/progressive-table';
57
+ export { useProgressiveSlot, ProgressiveTimelineSlot } from './components/progressive-timeline';
58
+ export type { ProgressiveSlotValue } from './components/progressive-timeline';
59
+ export { ProgressiveBash } from './components/progressive-bash';
60
+ export type { ProgressiveBashProps, ProgressiveBashHandle, BashEntry, PlaybackTuning } from './components/progressive-bash';
61
+ export { computeGapMs as computeBashGapMs, DEFAULT_TUNING as DEFAULT_BASH_TUNING, tokenizeCommand, splitOutput, classifyLine, splitBySubparts, } from './components/progressive-bash';
62
+ export type { CmdToken, CmdKind, OutputLine, OutputSpan, LineKind, SubCommand } from './components/progressive-bash';
63
+ export { ResizableLayout } from './components/resizable-layout';
64
+ export type { ResizableLayoutProps, ResizableLayoutHandle, ResizableDrawerConfig, DrawerSide, MobileMode, } from './components/resizable-layout';
65
+ export { FloatingPanel, Dock, DockProvider, useDockContext } from './components/floating-panel';
66
+ export type { FloatingPanelProps, FloatingPanelHandle, DockProps, DockContextValue, PanelPlacement, FloatingGeom, } from './components/floating-panel';
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,WAAW,EACX,MAAM,EACN,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,UAAU,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,uBAAuB,EACvB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9G,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC/G,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,aAAa,GACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACjH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAChG,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAClF,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EACV,WAAW,EACX,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,YAAY,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,YAAY,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzG,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAChG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5H,OAAO,EACL,YAAY,IAAI,gBAAgB,EAChC,cAAc,IAAI,mBAAmB,EACrC,eAAe,EACf,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACrH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,UAAU,GACX,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChG,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,6BAA6B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,161 @@
1
+ import { cn as r } from "./lib/utils.js";
2
+ import { downloadFile as m, fmtBytes as p, fmtCost as s, fmtDateTime as f, fmtDuration as i, fmtNum as a, relTime as x } from "./lib/format.js";
3
+ import { Badge as u, JOB_STATUS as n, StatusBadge as P } from "./components/status-badge/status-badge.js";
4
+ import { Button as c } from "./components/button/button.js";
5
+ import { Changelog as S } from "./components/changelog/changelog.js";
6
+ import { CopyButton as d } from "./components/copy-button/copy-button.js";
7
+ import { DEFAULT_TUNING as k, computeGapMs as I } from "./components/progressive-bash/playback.js";
8
+ import { Dock as D } from "./components/floating-panel/dock.js";
9
+ import { DockProvider as L, useDockContext as B } from "./components/floating-panel/dock-context.js";
10
+ import { DropZone as b } from "./components/drop-zone/drop-zone.js";
11
+ import { ElementPicker as M, ElementPickerOverlay as N } from "./components/element-picker/element-picker.js";
12
+ import { ElementPickerField as F } from "./components/element-picker/element-picker-field.js";
13
+ import { ElementPreview as R } from "./components/element-picker/element-preview.js";
14
+ import { EmptyState as _ } from "./components/empty-state/empty-state.js";
15
+ import { FloatingPanel as H } from "./components/floating-panel/floating-panel.js";
16
+ import { FuzzyList as z } from "./components/fuzzy-list/fuzzy-list.js";
17
+ import { GlobalSearch as q } from "./components/global-search/global-search.js";
18
+ import { IOSStatusBar as Q, PhonePreview as Z } from "./components/phone-preview/phone-preview.js";
19
+ import { IframePreview as K, IframePreviewOverlay as W } from "./components/iframe-preview/iframe-preview.js";
20
+ import { ImageViewerProvider as $, useImageViewer as ee } from "./components/image-viewer/image-viewer.js";
21
+ import { Input as re } from "./components/input/input.js";
22
+ import { Modal as me } from "./components/modal/modal.js";
23
+ import { ModalProvider as se, useConfirm as fe, useModal as ie } from "./components/modal/modal-context.js";
24
+ import { Nav2DItem as xe, Nav2DProvider as le, useNav2D as ue } from "./components/nav-2d/nav-2d.js";
25
+ import { ProgressiveBash as Pe } from "./components/progressive-bash/progressive-bash.js";
26
+ import { ProgressiveImage as ce } from "./components/image-viewer/progressive-image.js";
27
+ import { ProgressiveList as Se } from "./components/progressive-list/progressive-list.js";
28
+ import { ProgressiveTable as de } from "./components/progressive-table/progressive-table.js";
29
+ import { ProgressiveText as ke } from "./components/progressive-text/progressive-text.js";
30
+ import { ProgressiveTimelineSlot as ye, useProgressiveSlot as De } from "./components/progressive-timeline/progressive-timeline.js";
31
+ import { RelativeTime as Le } from "./components/relative-time/relative-time.js";
32
+ import { ResizableLayout as Ce } from "./components/resizable-layout/resizable-layout.js";
33
+ import { RichInput as we } from "./components/rich-input/rich-input.js";
34
+ import { STYLE_GROUPS as Ne, STYLE_PROPS as Oe, classify as Fe, formatHtml as Ge, hierarchy as Re, parseElement as Ue, uniqueSelector as _e } from "./components/element-picker/parse.js";
35
+ import { SearchInput as He } from "./components/search-input/search-input.js";
36
+ import { Skeleton as ze, SkeletonGrid as Ye, SkeletonText as qe } from "./components/skeleton/skeleton.js";
37
+ import { Spinner as Qe } from "./components/spinner/spinner.js";
38
+ import { ThemeProvider as je, resolveTheme as Ke, setTheme as We, toggleTheme as Xe, useTheme as $e } from "./components/theme/theme.js";
39
+ import { ThemeToggle as oo } from "./components/theme/theme-toggle.js";
40
+ import { ToastProvider as to, Toaster as mo, useToast as po } from "./components/toast/toast.js";
41
+ import { Tooltip as fo } from "./components/button/tooltip.js";
42
+ import { ViewableImage as ao } from "./components/image-viewer/viewable-image.js";
43
+ import { VirtualList as lo } from "./components/virtual-list/virtual-list.js";
44
+ import { classifyLine as no, splitBySubparts as Po, splitOutput as To, tokenizeCommand as co } from "./components/progressive-bash/parse.js";
45
+ import { defaultComposePrompt as So } from "./components/rich-input/compose.js";
46
+ import { formatHotkey as ho, parseHotkey as ko, useHotkey as Io } from "./components/global-search/hotkey.js";
47
+ import { highlightAll as Do, highlightSnippet as Eo } from "./lib/highlight.js";
48
+ import { useCopyToClipboard as Bo } from "./hooks/use-copy-to-clipboard.js";
49
+ import { useDebouncedValue as bo } from "./hooks/use-debounced-value.js";
50
+ import { useElementPicker as Mo } from "./components/element-picker/use-element-picker.js";
51
+ import { useEscape as Oo, useOutsideClick as Fo, useScrollLock as Go } from "./hooks/use-overlay.js";
52
+ import { useFileDrop as Uo } from "./components/drop-zone/use-file-drop.js";
53
+ import { useInfiniteScroll as Ao, useIntersection as Ho } from "./hooks/use-intersection.js";
54
+ import { useIsMobile as zo, useIsTouch as Yo, useMediaQuery as qo, usePrefersDark as Jo, usePrefersReducedMotion as Qo } from "./hooks/use-media-query.js";
55
+ import { useLocalStorage as jo } from "./hooks/use-local-storage.js";
56
+ import { useLongPress as Wo } from "./hooks/use-long-press.js";
57
+ export {
58
+ u as Badge,
59
+ c as Button,
60
+ S as Changelog,
61
+ d as CopyButton,
62
+ k as DEFAULT_BASH_TUNING,
63
+ D as Dock,
64
+ L as DockProvider,
65
+ b as DropZone,
66
+ M as ElementPicker,
67
+ F as ElementPickerField,
68
+ N as ElementPickerOverlay,
69
+ R as ElementPreview,
70
+ _ as EmptyState,
71
+ H as FloatingPanel,
72
+ z as FuzzyList,
73
+ q as GlobalSearch,
74
+ Q as IOSStatusBar,
75
+ K as IframePreview,
76
+ W as IframePreviewOverlay,
77
+ $ as ImageViewerProvider,
78
+ re as Input,
79
+ n as JOB_STATUS,
80
+ me as Modal,
81
+ se as ModalProvider,
82
+ xe as Nav2DItem,
83
+ le as Nav2DProvider,
84
+ Z as PhonePreview,
85
+ Pe as ProgressiveBash,
86
+ ce as ProgressiveImage,
87
+ Se as ProgressiveList,
88
+ de as ProgressiveTable,
89
+ ke as ProgressiveText,
90
+ ye as ProgressiveTimelineSlot,
91
+ Le as RelativeTime,
92
+ Ce as ResizableLayout,
93
+ we as RichInput,
94
+ Ne as STYLE_GROUPS,
95
+ Oe as STYLE_PROPS,
96
+ He as SearchInput,
97
+ ze as Skeleton,
98
+ Ye as SkeletonGrid,
99
+ qe as SkeletonText,
100
+ Qe as Spinner,
101
+ P as StatusBadge,
102
+ je as ThemeProvider,
103
+ oo as ThemeToggle,
104
+ to as ToastProvider,
105
+ mo as Toaster,
106
+ fo as Tooltip,
107
+ ao as ViewableImage,
108
+ lo as VirtualList,
109
+ Fe as classify,
110
+ no as classifyLine,
111
+ r as cn,
112
+ I as computeBashGapMs,
113
+ So as defaultComposePrompt,
114
+ m as downloadFile,
115
+ p as fmtBytes,
116
+ s as fmtCost,
117
+ f as fmtDateTime,
118
+ i as fmtDuration,
119
+ a as fmtNum,
120
+ ho as formatHotkey,
121
+ Ge as formatHtml,
122
+ Re as hierarchy,
123
+ Do as highlightAll,
124
+ Eo as highlightSnippet,
125
+ Ue as parseElement,
126
+ ko as parseHotkey,
127
+ x as relTime,
128
+ Ke as resolveTheme,
129
+ We as setTheme,
130
+ Po as splitBySubparts,
131
+ To as splitOutput,
132
+ Xe as toggleTheme,
133
+ co as tokenizeCommand,
134
+ _e as uniqueSelector,
135
+ fe as useConfirm,
136
+ Bo as useCopyToClipboard,
137
+ bo as useDebouncedValue,
138
+ B as useDockContext,
139
+ Mo as useElementPicker,
140
+ Oo as useEscape,
141
+ Uo as useFileDrop,
142
+ Io as useHotkey,
143
+ ee as useImageViewer,
144
+ Ao as useInfiniteScroll,
145
+ Ho as useIntersection,
146
+ zo as useIsMobile,
147
+ Yo as useIsTouch,
148
+ jo as useLocalStorage,
149
+ Wo as useLongPress,
150
+ qo as useMediaQuery,
151
+ ie as useModal,
152
+ ue as useNav2D,
153
+ Fo as useOutsideClick,
154
+ Jo as usePrefersDark,
155
+ Qo as usePrefersReducedMotion,
156
+ De as useProgressiveSlot,
157
+ Go as useScrollLock,
158
+ $e as useTheme,
159
+ po as useToast
160
+ };
161
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,19 @@
1
+ export type TimeInput = string | number | Date;
2
+ /** `just now` · `4m ago` · `3h ago` · `in 2d` — compact, sign-aware. */
3
+ export declare function relTime(input: TimeInput, now?: TimeInput): string;
4
+ /** `840ms` · `12.4s` · `2m 08s` · `1h 04m` — a duration in ms. */
5
+ export declare function fmtDuration(ms: number): string;
6
+ /** `512 B` · `1.4 KB` · `2.3 MB` — SI-ish, one decimal above KB. */
7
+ export declare function fmtBytes(bytes: number, decimals?: number): string;
8
+ /** `947` · `12.4k` · `3.1M` — compact counts (tokens, rows, plays). */
9
+ export declare function fmtNum(n: number, decimals?: number): string;
10
+ /** `$0.0041` · `$1.24` · `$312` — small LLM costs keep their significant digits. */
11
+ export declare function fmtCost(usd: number, currency?: string): string;
12
+ /** Locale date-time, seconds-free: `12 Jul, 14:03`. */
13
+ export declare function fmtDateTime(input: TimeInput, locale?: string): string;
14
+ /**
15
+ * Save a string or Blob to the user's disk — the anchor + object-URL dance,
16
+ * with the revoke that hand-rolled copies forget.
17
+ */
18
+ export declare function downloadFile(filename: string, data: Blob | string, mime?: string): void;
19
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAU/C,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAE,SAAsB,GAAG,MAAM,CAgB7E;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAY9C;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAY5D;AAED,uEAAuE;AACvE,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAOtD;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAK3D;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CASrE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,SAAe,QAStF"}
@@ -0,0 +1,62 @@
1
+ function a(t) {
2
+ if (t instanceof Date) return t.getTime();
3
+ if (typeof t == "number") return t < 1e11 ? t * 1e3 : t;
4
+ const e = Date.parse(t);
5
+ return Number.isNaN(e) ? NaN : e;
6
+ }
7
+ function s(t, e = Date.now()) {
8
+ const r = a(t);
9
+ if (Number.isNaN(r)) return "—";
10
+ const o = a(e) - r, i = o < 0, n = Math.abs(o) / 1e3, u = (f) => i ? `in ${f}` : `${f} ago`;
11
+ return n < 45 ? "just now" : n < 3600 ? u(`${Math.round(n / 60)}m`) : n < 86400 ? u(`${Math.round(n / 3600)}h`) : n < 604800 ? u(`${Math.round(n / 86400)}d`) : n < 2592e3 ? u(`${Math.round(n / 604800)}w`) : n < 31536e3 ? u(`${Math.round(n / 2592e3)}mo`) : u(`${Math.round(n / 31536e3)}y`);
12
+ }
13
+ function c(t) {
14
+ if (!Number.isFinite(t) || t < 0) return "—";
15
+ if (t < 1e3) return `${Math.round(t)}ms`;
16
+ const e = Math.round(t / 1e3);
17
+ if (e < 60) return `${(t / 1e3).toFixed(1)}s`;
18
+ const r = Math.floor(e / 3600), o = Math.floor(e % 3600 / 60), i = e % 60;
19
+ return r > 0 ? `${r}h ${String(o).padStart(2, "0")}m` : `${o}m ${String(i).padStart(2, "0")}s`;
20
+ }
21
+ function h(t, e = 1) {
22
+ if (!Number.isFinite(t)) return "—";
23
+ if (t < 1024) return `${Math.round(t)} B`;
24
+ const r = ["KB", "MB", "GB", "TB", "PB"];
25
+ let o = t / 1024, i = 0;
26
+ for (; o >= 1024 && i < r.length - 1; )
27
+ o /= 1024, i += 1;
28
+ return `${o.toFixed(e)} ${r[i]}`;
29
+ }
30
+ function $(t, e = 1) {
31
+ if (!Number.isFinite(t)) return "—";
32
+ const r = Math.abs(t);
33
+ return r < 1e3 ? String(Math.round(t)) : r < 1e6 ? `${(t / 1e3).toFixed(e)}k` : r < 1e9 ? `${(t / 1e6).toFixed(e)}M` : `${(t / 1e9).toFixed(e)}B`;
34
+ }
35
+ function d(t, e = "$") {
36
+ if (!Number.isFinite(t)) return "—";
37
+ const r = Math.abs(t), o = r === 0 ? 2 : r < 0.01 ? 4 : r < 100 ? 2 : 0;
38
+ return `${t < 0 ? "-" : ""}${e}${r.toFixed(o)}`;
39
+ }
40
+ function m(t, e) {
41
+ const r = a(t);
42
+ return Number.isNaN(r) ? "—" : new Date(r).toLocaleString(e, {
43
+ day: "numeric",
44
+ month: "short",
45
+ hour: "2-digit",
46
+ minute: "2-digit"
47
+ });
48
+ }
49
+ function M(t, e, r = "text/plain") {
50
+ const o = typeof e == "string" ? new Blob([e], { type: `${r};charset=utf-8` }) : e, i = URL.createObjectURL(o), n = document.createElement("a");
51
+ n.href = i, n.download = t, n.click(), setTimeout(() => URL.revokeObjectURL(i), 1e3);
52
+ }
53
+ export {
54
+ M as downloadFile,
55
+ h as fmtBytes,
56
+ d as fmtCost,
57
+ m as fmtDateTime,
58
+ c as fmtDuration,
59
+ $ as fmtNum,
60
+ s as relTime
61
+ };
62
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sources":["../../src/lib/format.ts"],"sourcesContent":["/*\n * The formatters every homelab app rewrites: \"3 min ago\", \"1.4 GB\", \"2m 08s\",\n * \"$0.0412\". One module, so a queue card in one service and a job row in\n * another round the same way.\n */\n\nexport type TimeInput = string | number | Date;\n\n/** Accepts an ISO string, a Date, epoch ms, or epoch *seconds* (< 1e11). */\nfunction toMs(input: TimeInput): number {\n if (input instanceof Date) return input.getTime();\n if (typeof input === 'number') return input < 1e11 ? input * 1000 : input;\n const parsed = Date.parse(input);\n return Number.isNaN(parsed) ? NaN : parsed;\n}\n\n/** `just now` · `4m ago` · `3h ago` · `in 2d` — compact, sign-aware. */\nexport function relTime(input: TimeInput, now: TimeInput = Date.now()): string {\n const ms = toMs(input);\n if (Number.isNaN(ms)) return '—';\n\n const diff = toMs(now) - ms;\n const future = diff < 0;\n const s = Math.abs(diff) / 1000;\n\n const say = (v: string) => (future ? `in ${v}` : `${v} ago`);\n if (s < 45) return 'just now';\n if (s < 3600) return say(`${Math.round(s / 60)}m`);\n if (s < 86_400) return say(`${Math.round(s / 3600)}h`);\n if (s < 604_800) return say(`${Math.round(s / 86_400)}d`);\n if (s < 2_592_000) return say(`${Math.round(s / 604_800)}w`);\n if (s < 31_536_000) return say(`${Math.round(s / 2_592_000)}mo`);\n return say(`${Math.round(s / 31_536_000)}y`);\n}\n\n/** `840ms` · `12.4s` · `2m 08s` · `1h 04m` — a duration in ms. */\nexport function fmtDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return '—';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n\n const total = Math.round(ms / 1000);\n if (total < 60) return `${(ms / 1000).toFixed(1)}s`;\n\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n if (h > 0) return `${h}h ${String(m).padStart(2, '0')}m`;\n return `${m}m ${String(s).padStart(2, '0')}s`;\n}\n\n/** `512 B` · `1.4 KB` · `2.3 MB` — SI-ish, one decimal above KB. */\nexport function fmtBytes(bytes: number, decimals = 1): string {\n if (!Number.isFinite(bytes)) return '—';\n if (bytes < 1024) return `${Math.round(bytes)} B`;\n\n const units = ['KB', 'MB', 'GB', 'TB', 'PB'];\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit += 1;\n }\n return `${value.toFixed(decimals)} ${units[unit]}`;\n}\n\n/** `947` · `12.4k` · `3.1M` — compact counts (tokens, rows, plays). */\nexport function fmtNum(n: number, decimals = 1): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n if (abs < 1000) return String(Math.round(n));\n if (abs < 1_000_000) return `${(n / 1000).toFixed(decimals)}k`;\n if (abs < 1_000_000_000) return `${(n / 1_000_000).toFixed(decimals)}M`;\n return `${(n / 1_000_000_000).toFixed(decimals)}B`;\n}\n\n/** `$0.0041` · `$1.24` · `$312` — small LLM costs keep their significant digits. */\nexport function fmtCost(usd: number, currency = '$'): string {\n if (!Number.isFinite(usd)) return '—';\n const abs = Math.abs(usd);\n const digits = abs === 0 ? 2 : abs < 0.01 ? 4 : abs < 100 ? 2 : 0;\n return `${usd < 0 ? '-' : ''}${currency}${abs.toFixed(digits)}`;\n}\n\n/** Locale date-time, seconds-free: `12 Jul, 14:03`. */\nexport function fmtDateTime(input: TimeInput, locale?: string): string {\n const ms = toMs(input);\n if (Number.isNaN(ms)) return '—';\n return new Date(ms).toLocaleString(locale, {\n day: 'numeric',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\n/**\n * Save a string or Blob to the user's disk — the anchor + object-URL dance,\n * with the revoke that hand-rolled copies forget.\n */\nexport function downloadFile(filename: string, data: Blob | string, mime = 'text/plain') {\n const blob = typeof data === 'string' ? new Blob([data], { type: `${mime};charset=utf-8` }) : data;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n // Give the browser a tick to start the download before dropping the URL.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n"],"names":["toMs","input","parsed","relTime","now","ms","diff","future","s","say","v","fmtDuration","total","h","m","fmtBytes","bytes","decimals","units","value","unit","fmtNum","n","abs","fmtCost","usd","currency","digits","fmtDateTime","locale","downloadFile","filename","data","mime","blob","url","a"],"mappings":"AASA,SAASA,EAAKC,GAA0B;AACtC,MAAIA,aAAiB,KAAM,QAAOA,EAAM,QAAA;AACxC,MAAI,OAAOA,KAAU,iBAAiBA,IAAQ,OAAOA,IAAQ,MAAOA;AACpE,QAAMC,IAAS,KAAK,MAAMD,CAAK;AAC/B,SAAO,OAAO,MAAMC,CAAM,IAAI,MAAMA;AACtC;AAGO,SAASC,EAAQF,GAAkBG,IAAiB,KAAK,OAAe;AAC7E,QAAMC,IAAKL,EAAKC,CAAK;AACrB,MAAI,OAAO,MAAMI,CAAE,EAAG,QAAO;AAE7B,QAAMC,IAAON,EAAKI,CAAG,IAAIC,GACnBE,IAASD,IAAO,GAChBE,IAAI,KAAK,IAAIF,CAAI,IAAI,KAErBG,IAAM,CAACC,MAAeH,IAAS,MAAMG,CAAC,KAAK,GAAGA,CAAC;AACrD,SAAIF,IAAI,KAAW,aACfA,IAAI,OAAaC,EAAI,GAAG,KAAK,MAAMD,IAAI,EAAE,CAAC,GAAG,IAC7CA,IAAI,QAAeC,EAAI,GAAG,KAAK,MAAMD,IAAI,IAAI,CAAC,GAAG,IACjDA,IAAI,SAAgBC,EAAI,GAAG,KAAK,MAAMD,IAAI,KAAM,CAAC,GAAG,IACpDA,IAAI,SAAkBC,EAAI,GAAG,KAAK,MAAMD,IAAI,MAAO,CAAC,GAAG,IACvDA,IAAI,UAAmBC,EAAI,GAAG,KAAK,MAAMD,IAAI,MAAS,CAAC,IAAI,IACxDC,EAAI,GAAG,KAAK,MAAMD,IAAI,OAAU,CAAC,GAAG;AAC7C;AAGO,SAASG,EAAYN,GAAoB;AAC9C,MAAI,CAAC,OAAO,SAASA,CAAE,KAAKA,IAAK,EAAG,QAAO;AAC3C,MAAIA,IAAK,IAAM,QAAO,GAAG,KAAK,MAAMA,CAAE,CAAC;AAEvC,QAAMO,IAAQ,KAAK,MAAMP,IAAK,GAAI;AAClC,MAAIO,IAAQ,GAAI,QAAO,IAAIP,IAAK,KAAM,QAAQ,CAAC,CAAC;AAEhD,QAAMQ,IAAI,KAAK,MAAMD,IAAQ,IAAI,GAC3BE,IAAI,KAAK,MAAOF,IAAQ,OAAQ,EAAE,GAClCJ,IAAII,IAAQ;AAClB,SAAIC,IAAI,IAAU,GAAGA,CAAC,KAAK,OAAOC,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,MAC9C,GAAGA,CAAC,KAAK,OAAON,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC5C;AAGO,SAASO,EAASC,GAAeC,IAAW,GAAW;AAC5D,MAAI,CAAC,OAAO,SAASD,CAAK,EAAG,QAAO;AACpC,MAAIA,IAAQ,KAAM,QAAO,GAAG,KAAK,MAAMA,CAAK,CAAC;AAE7C,QAAME,IAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAC3C,MAAIC,IAAQH,IAAQ,MAChBI,IAAO;AACX,SAAOD,KAAS,QAAQC,IAAOF,EAAM,SAAS;AAC5C,IAAAC,KAAS,MACTC,KAAQ;AAEV,SAAO,GAAGD,EAAM,QAAQF,CAAQ,CAAC,IAAIC,EAAME,CAAI,CAAC;AAClD;AAGO,SAASC,EAAOC,GAAWL,IAAW,GAAW;AACtD,MAAI,CAAC,OAAO,SAASK,CAAC,EAAG,QAAO;AAChC,QAAMC,IAAM,KAAK,IAAID,CAAC;AACtB,SAAIC,IAAM,MAAa,OAAO,KAAK,MAAMD,CAAC,CAAC,IACvCC,IAAM,MAAkB,IAAID,IAAI,KAAM,QAAQL,CAAQ,CAAC,MACvDM,IAAM,MAAsB,IAAID,IAAI,KAAW,QAAQL,CAAQ,CAAC,MAC7D,IAAIK,IAAI,KAAe,QAAQL,CAAQ,CAAC;AACjD;AAGO,SAASO,EAAQC,GAAaC,IAAW,KAAa;AAC3D,MAAI,CAAC,OAAO,SAASD,CAAG,EAAG,QAAO;AAClC,QAAMF,IAAM,KAAK,IAAIE,CAAG,GAClBE,IAASJ,MAAQ,IAAI,IAAIA,IAAM,OAAO,IAAIA,IAAM,MAAM,IAAI;AAChE,SAAO,GAAGE,IAAM,IAAI,MAAM,EAAE,GAAGC,CAAQ,GAAGH,EAAI,QAAQI,CAAM,CAAC;AAC/D;AAGO,SAASC,EAAY3B,GAAkB4B,GAAyB;AACrE,QAAMxB,IAAKL,EAAKC,CAAK;AACrB,SAAI,OAAO,MAAMI,CAAE,IAAU,MACtB,IAAI,KAAKA,CAAE,EAAE,eAAewB,GAAQ;AAAA,IACzC,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT;AACH;AAMO,SAASC,EAAaC,GAAkBC,GAAqBC,IAAO,cAAc;AACvF,QAAMC,IAAO,OAAOF,KAAS,WAAW,IAAI,KAAK,CAACA,CAAI,GAAG,EAAE,MAAM,GAAGC,CAAI,iBAAA,CAAkB,IAAID,GACxFG,IAAM,IAAI,gBAAgBD,CAAI,GAC9BE,IAAI,SAAS,cAAc,GAAG;AACpC,EAAAA,EAAE,OAAOD,GACTC,EAAE,WAAWL,GACbK,EAAE,MAAA,GAEF,WAAW,MAAM,IAAI,gBAAgBD,CAAG,GAAG,GAAI;AACjD;"}
@@ -0,0 +1,15 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * Wrap the matched ranges of `text` in `<mark>`, highlighting the whole string
4
+ * (no windowing). `indices` are Fuse.js match indices — inclusive `[start, end]`
5
+ * pairs.
6
+ */
7
+ export declare function highlightAll(text: string, indices: readonly [number, number][]): ReactNode;
8
+ /**
9
+ * Build a compact snippet of `text` centered on the first match, with the
10
+ * matched ranges wrapped in `<mark>` and ellipses at any trimmed edge. Good for
11
+ * long fields (message bodies, descriptions) where you only want the hit in
12
+ * context. `indices` are Fuse.js match indices — inclusive `[start, end]` pairs.
13
+ */
14
+ export declare function highlightSnippet(text: string, indices: readonly [number, number][], window?: number): ReactNode;
15
+ //# sourceMappingURL=highlight.d.ts.map