@flanksource/clicky-ui 0.1.0 → 0.2.2

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 (378) hide show
  1. package/README.md +29 -2
  2. package/dist/api-explorer.d.ts +5 -0
  3. package/dist/api-explorer.d.ts.map +1 -0
  4. package/dist/api-explorer.js +25 -0
  5. package/dist/api-explorer.js.map +1 -0
  6. package/dist/clicky.d.ts +2 -0
  7. package/dist/clicky.d.ts.map +1 -0
  8. package/dist/clicky.js +5 -0
  9. package/dist/clicky.js.map +1 -0
  10. package/dist/components/DatePicker.d.ts +18 -0
  11. package/dist/components/DatePicker.d.ts.map +1 -0
  12. package/dist/components/DatePicker.js +63 -0
  13. package/dist/components/DatePicker.js.map +1 -0
  14. package/dist/components/DateTimePicker.d.ts +18 -0
  15. package/dist/components/DateTimePicker.d.ts.map +1 -0
  16. package/dist/components/DateTimePicker.js +84 -0
  17. package/dist/components/DateTimePicker.js.map +1 -0
  18. package/dist/components/FilterBar.d.ts +180 -0
  19. package/dist/components/FilterBar.d.ts.map +1 -0
  20. package/dist/components/FilterBar.js +1685 -0
  21. package/dist/components/FilterBar.js.map +1 -0
  22. package/dist/components/MultiSelect.d.ts +19 -0
  23. package/dist/components/MultiSelect.d.ts.map +1 -0
  24. package/dist/components/MultiSelect.js +143 -0
  25. package/dist/components/MultiSelect.js.map +1 -0
  26. package/dist/components/RangeSlider.d.ts +16 -0
  27. package/dist/components/RangeSlider.d.ts.map +1 -0
  28. package/dist/components/RangeSlider.js +92 -0
  29. package/dist/components/RangeSlider.js.map +1 -0
  30. package/dist/components/button.d.ts +21 -0
  31. package/dist/components/button.d.ts.map +1 -0
  32. package/dist/components/button.js +126 -0
  33. package/dist/components/button.js.map +1 -0
  34. package/dist/components/density-switcher.d.ts +7 -0
  35. package/dist/components/density-switcher.d.ts.map +1 -0
  36. package/dist/components/density-switcher.js +32 -0
  37. package/dist/components/density-switcher.js.map +1 -0
  38. package/dist/components/icon-menu-picker.d.ts +23 -0
  39. package/dist/components/icon-menu-picker.d.ts.map +1 -0
  40. package/dist/components/icon-menu-picker.js +192 -0
  41. package/dist/components/icon-menu-picker.js.map +1 -0
  42. package/dist/components/select.d.ts +15 -0
  43. package/dist/components/select.d.ts.map +1 -0
  44. package/dist/components/select.js +39 -0
  45. package/dist/components/select.js.map +1 -0
  46. package/dist/components/theme-switcher.d.ts +7 -0
  47. package/dist/components/theme-switcher.d.ts.map +1 -0
  48. package/dist/components/theme-switcher.js +42 -0
  49. package/dist/components/theme-switcher.js.map +1 -0
  50. package/dist/components.d.ts +15 -0
  51. package/dist/components.d.ts.map +1 -0
  52. package/dist/components.js +33 -0
  53. package/dist/components.js.map +1 -0
  54. package/dist/data/AnsiHtml.d.ts +7 -0
  55. package/dist/data/AnsiHtml.d.ts.map +1 -0
  56. package/dist/data/AnsiHtml.js +71 -0
  57. package/dist/data/AnsiHtml.js.map +1 -0
  58. package/dist/data/Avatar.d.ts +32 -0
  59. package/dist/data/Avatar.d.ts.map +1 -0
  60. package/dist/data/Avatar.js +201 -0
  61. package/dist/data/Avatar.js.map +1 -0
  62. package/dist/data/AvatarBadge.d.ts +26 -0
  63. package/dist/data/AvatarBadge.d.ts.map +1 -0
  64. package/dist/data/AvatarBadge.js +104 -0
  65. package/dist/data/AvatarBadge.js.map +1 -0
  66. package/dist/data/Badge.d.ts +44 -0
  67. package/dist/data/Badge.d.ts.map +1 -0
  68. package/dist/data/Badge.js +667 -0
  69. package/dist/data/Badge.js.map +1 -0
  70. package/dist/data/Clicky.d.ts +147 -0
  71. package/dist/data/Clicky.d.ts.map +1 -0
  72. package/dist/data/Clicky.fixtures.d.ts +3 -0
  73. package/dist/data/Clicky.fixtures.d.ts.map +1 -0
  74. package/dist/data/Clicky.js +1960 -0
  75. package/dist/data/Clicky.js.map +1 -0
  76. package/dist/data/DataTable.d.ts +95 -0
  77. package/dist/data/DataTable.d.ts.map +1 -0
  78. package/dist/data/DataTable.js +1464 -0
  79. package/dist/data/DataTable.js.map +1 -0
  80. package/dist/data/FilterPill.d.ts +29 -0
  81. package/dist/data/FilterPill.d.ts.map +1 -0
  82. package/dist/data/FilterPill.js +153 -0
  83. package/dist/data/FilterPill.js.map +1 -0
  84. package/dist/data/Gauge.d.ts +15 -0
  85. package/dist/data/Gauge.d.ts.map +1 -0
  86. package/dist/data/Gauge.js +63 -0
  87. package/dist/data/Gauge.js.map +1 -0
  88. package/dist/data/Icon.d.ts +53 -0
  89. package/dist/data/Icon.d.ts.map +1 -0
  90. package/dist/data/Icon.js +115 -0
  91. package/dist/data/Icon.js.map +1 -0
  92. package/dist/data/JsonView.d.ts +8 -0
  93. package/dist/data/JsonView.d.ts.map +1 -0
  94. package/dist/data/JsonView.js +74 -0
  95. package/dist/data/JsonView.js.map +1 -0
  96. package/dist/data/KeyValueList.d.ts +17 -0
  97. package/dist/data/KeyValueList.d.ts.map +1 -0
  98. package/dist/data/KeyValueList.js +33 -0
  99. package/dist/data/KeyValueList.js.map +1 -0
  100. package/dist/data/LogViewer.d.ts +10 -0
  101. package/dist/data/LogViewer.d.ts.map +1 -0
  102. package/dist/data/LogViewer.js +46 -0
  103. package/dist/data/LogViewer.js.map +1 -0
  104. package/dist/data/LogsTable.d.ts +27 -0
  105. package/dist/data/LogsTable.d.ts.map +1 -0
  106. package/dist/data/LogsTable.js +580 -0
  107. package/dist/data/LogsTable.js.map +1 -0
  108. package/dist/data/Markdown.d.ts +6 -0
  109. package/dist/data/Markdown.d.ts.map +1 -0
  110. package/dist/data/Markdown.js +59 -0
  111. package/dist/data/Markdown.js.map +1 -0
  112. package/dist/data/MatrixTable.d.ts +22 -0
  113. package/dist/data/MatrixTable.d.ts.map +1 -0
  114. package/dist/data/MatrixTable.js +164 -0
  115. package/dist/data/MatrixTable.js.map +1 -0
  116. package/dist/data/MethodBadge.d.ts +6 -0
  117. package/dist/data/MethodBadge.d.ts.map +1 -0
  118. package/dist/data/MethodBadge.js +18 -0
  119. package/dist/data/MethodBadge.js.map +1 -0
  120. package/dist/data/ProgressBar.d.ts +13 -0
  121. package/dist/data/ProgressBar.d.ts.map +1 -0
  122. package/dist/data/ProgressBar.js +34 -0
  123. package/dist/data/ProgressBar.js.map +1 -0
  124. package/dist/data/SortableHeader.d.ts +12 -0
  125. package/dist/data/SortableHeader.d.ts.map +1 -0
  126. package/dist/data/SortableHeader.js +33 -0
  127. package/dist/data/SortableHeader.js.map +1 -0
  128. package/dist/data/TabButton.d.ts +12 -0
  129. package/dist/data/TabButton.d.ts.map +1 -0
  130. package/dist/data/TabButton.js +45 -0
  131. package/dist/data/TabButton.js.map +1 -0
  132. package/dist/data/Tree.d.ts +35 -0
  133. package/dist/data/Tree.d.ts.map +1 -0
  134. package/dist/data/Tree.js +236 -0
  135. package/dist/data/Tree.js.map +1 -0
  136. package/dist/data/TreeGroupHeader.d.ts +11 -0
  137. package/dist/data/TreeGroupHeader.d.ts.map +1 -0
  138. package/dist/data/TreeGroupHeader.js +41 -0
  139. package/dist/data/TreeGroupHeader.js.map +1 -0
  140. package/dist/data/TreeNode.d.ts +43 -0
  141. package/dist/data/TreeNode.d.ts.map +1 -0
  142. package/dist/data/TreeNode.js +100 -0
  143. package/dist/data/TreeNode.js.map +1 -0
  144. package/dist/data/cells/StatusDot.d.ts +11 -0
  145. package/dist/data/cells/StatusDot.d.ts.map +1 -0
  146. package/dist/data/cells/StatusDot.js +38 -0
  147. package/dist/data/cells/StatusDot.js.map +1 -0
  148. package/dist/data/cells/TagList.d.ts +59 -0
  149. package/dist/data/cells/TagList.d.ts.map +1 -0
  150. package/dist/data/cells/TagList.js +257 -0
  151. package/dist/data/cells/TagList.js.map +1 -0
  152. package/dist/data/cells/Timestamp.d.ts +46 -0
  153. package/dist/data/cells/Timestamp.d.ts.map +1 -0
  154. package/dist/data/cells/Timestamp.js +146 -0
  155. package/dist/data/cells/Timestamp.js.map +1 -0
  156. package/dist/data/cells/status-mapping.d.ts +8 -0
  157. package/dist/data/cells/status-mapping.d.ts.map +1 -0
  158. package/dist/data/cells/status-mapping.js +44 -0
  159. package/dist/data/cells/status-mapping.js.map +1 -0
  160. package/dist/data/code-highlight.d.ts +12 -0
  161. package/dist/data/code-highlight.d.ts.map +1 -0
  162. package/dist/data/code-highlight.js +28 -0
  163. package/dist/data/code-highlight.js.map +1 -0
  164. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
  165. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
  166. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
  167. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
  168. package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
  169. package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
  170. package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
  171. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
  172. package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
  173. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
  174. package/dist/data/diagnostics/ErrorDetails.js +157 -0
  175. package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
  176. package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
  177. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
  178. package/dist/data/diagnostics/GoroutineCard.js +75 -0
  179. package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
  180. package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
  181. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
  182. package/dist/data/diagnostics/JvmStackTrace.js +26 -0
  183. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
  184. package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
  185. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
  186. package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
  187. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
  188. package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
  189. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
  190. package/dist/data/diagnostics/ThreadCard.js +78 -0
  191. package/dist/data/diagnostics/ThreadCard.js.map +1 -0
  192. package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
  193. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
  194. package/dist/data/diagnostics/error-diagnostics.js +108 -0
  195. package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
  196. package/dist/data/diagnostics/fixtures.d.ts +3 -0
  197. package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
  198. package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
  199. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
  200. package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
  201. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
  202. package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
  203. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
  204. package/dist/data/diagnostics/stacktrace-parse.js +87 -0
  205. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
  206. package/dist/data/diagnostics/stacktrace.d.ts +38 -0
  207. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
  208. package/dist/data/diagnostics/stacktrace.js +119 -0
  209. package/dist/data/diagnostics/stacktrace.js.map +1 -0
  210. package/dist/data/diagnostics/types.d.ts +30 -0
  211. package/dist/data/diagnostics/types.d.ts.map +1 -0
  212. package/dist/data/diagnostics/utils.d.ts +8 -0
  213. package/dist/data/diagnostics/utils.d.ts.map +1 -0
  214. package/dist/data/diagnostics/utils.js +59 -0
  215. package/dist/data/diagnostics/utils.js.map +1 -0
  216. package/dist/data/har/HarPanel.d.ts +9 -0
  217. package/dist/data/har/HarPanel.d.ts.map +1 -0
  218. package/dist/data/har/HarPanel.js +175 -0
  219. package/dist/data/har/HarPanel.js.map +1 -0
  220. package/dist/data/har/fixtures.d.ts +3 -0
  221. package/dist/data/har/fixtures.d.ts.map +1 -0
  222. package/dist/data/har/types.d.ts +47 -0
  223. package/dist/data/har/types.d.ts.map +1 -0
  224. package/dist/data.d.ts +39 -0
  225. package/dist/data.d.ts.map +1 -0
  226. package/dist/data.js +109 -0
  227. package/dist/data.js.map +1 -0
  228. package/dist/hooks/use-density.d.ts +22 -0
  229. package/dist/hooks/use-density.d.ts.map +1 -0
  230. package/dist/hooks/use-density.js +54 -0
  231. package/dist/hooks/use-density.js.map +1 -0
  232. package/dist/hooks/use-history-route.d.ts +6 -0
  233. package/dist/hooks/use-history-route.d.ts.map +1 -0
  234. package/dist/hooks/use-history-route.js +31 -0
  235. package/dist/hooks/use-history-route.js.map +1 -0
  236. package/dist/hooks/use-sort.d.ts +17 -0
  237. package/dist/hooks/use-sort.d.ts.map +1 -0
  238. package/dist/hooks/use-sort.js +42 -0
  239. package/dist/hooks/use-sort.js.map +1 -0
  240. package/dist/hooks/use-theme.d.ts +17 -0
  241. package/dist/hooks/use-theme.d.ts.map +1 -0
  242. package/dist/hooks/use-theme.js +68 -0
  243. package/dist/hooks/use-theme.js.map +1 -0
  244. package/dist/hooks.d.ts +5 -0
  245. package/dist/hooks.d.ts.map +1 -0
  246. package/dist/hooks.js +14 -0
  247. package/dist/hooks.js.map +1 -0
  248. package/dist/index.d.ts +7 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +195 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/layout/Section.d.ts +23 -0
  253. package/dist/layout/Section.d.ts.map +1 -0
  254. package/dist/layout/Section.js +73 -0
  255. package/dist/layout/Section.js.map +1 -0
  256. package/dist/layout/SplitPane.d.ts +13 -0
  257. package/dist/layout/SplitPane.d.ts.map +1 -0
  258. package/dist/layout/SplitPane.js +72 -0
  259. package/dist/layout/SplitPane.js.map +1 -0
  260. package/dist/lib/palette.d.ts +4 -0
  261. package/dist/lib/palette.d.ts.map +1 -0
  262. package/dist/lib/palette.js +35 -0
  263. package/dist/lib/palette.js.map +1 -0
  264. package/dist/lib/size.d.ts +6 -0
  265. package/dist/lib/size.d.ts.map +1 -0
  266. package/dist/lib/size.js +14 -0
  267. package/dist/lib/size.js.map +1 -0
  268. package/dist/lib/utils.d.ts +3 -0
  269. package/dist/lib/utils.d.ts.map +1 -0
  270. package/dist/lib/utils.js +9 -0
  271. package/dist/lib/utils.js.map +1 -0
  272. package/dist/overlay/HoverCard.d.ts +13 -0
  273. package/dist/overlay/HoverCard.d.ts.map +1 -0
  274. package/dist/overlay/HoverCard.js +170 -0
  275. package/dist/overlay/HoverCard.js.map +1 -0
  276. package/dist/overlay/Modal.d.ts +17 -0
  277. package/dist/overlay/Modal.d.ts.map +1 -0
  278. package/dist/overlay/Modal.js +91 -0
  279. package/dist/overlay/Modal.js.map +1 -0
  280. package/dist/rpc/AcceptPicker.d.ts +52 -0
  281. package/dist/rpc/AcceptPicker.d.ts.map +1 -0
  282. package/dist/rpc/AcceptPicker.js +126 -0
  283. package/dist/rpc/AcceptPicker.js.map +1 -0
  284. package/dist/rpc/ApiExplorer.d.ts +11 -0
  285. package/dist/rpc/ApiExplorer.d.ts.map +1 -0
  286. package/dist/rpc/ApiExplorer.js +37 -0
  287. package/dist/rpc/ApiExplorer.js.map +1 -0
  288. package/dist/rpc/CommandForm.d.ts +15 -0
  289. package/dist/rpc/CommandForm.d.ts.map +1 -0
  290. package/dist/rpc/CommandForm.js +356 -0
  291. package/dist/rpc/CommandForm.js.map +1 -0
  292. package/dist/rpc/CommandOutput.d.ts +11 -0
  293. package/dist/rpc/CommandOutput.d.ts.map +1 -0
  294. package/dist/rpc/CommandOutput.js +195 -0
  295. package/dist/rpc/CommandOutput.js.map +1 -0
  296. package/dist/rpc/EndpointList.d.ts +18 -0
  297. package/dist/rpc/EndpointList.d.ts.map +1 -0
  298. package/dist/rpc/EndpointList.js +56 -0
  299. package/dist/rpc/EndpointList.js.map +1 -0
  300. package/dist/rpc/EntityExplorerApp.d.ts +15 -0
  301. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
  302. package/dist/rpc/EntityExplorerApp.js +282 -0
  303. package/dist/rpc/EntityExplorerApp.js.map +1 -0
  304. package/dist/rpc/ExecutionResult.d.ts +14 -0
  305. package/dist/rpc/ExecutionResult.d.ts.map +1 -0
  306. package/dist/rpc/ExecutionResult.js +51 -0
  307. package/dist/rpc/ExecutionResult.js.map +1 -0
  308. package/dist/rpc/FilterForm.d.ts +22 -0
  309. package/dist/rpc/FilterForm.d.ts.map +1 -0
  310. package/dist/rpc/FilterForm.js +392 -0
  311. package/dist/rpc/FilterForm.js.map +1 -0
  312. package/dist/rpc/InlineError.d.ts +7 -0
  313. package/dist/rpc/InlineError.d.ts.map +1 -0
  314. package/dist/rpc/InlineError.js +54 -0
  315. package/dist/rpc/InlineError.js.map +1 -0
  316. package/dist/rpc/OperationActionDialog.d.ts +12 -0
  317. package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
  318. package/dist/rpc/OperationActionDialog.js +105 -0
  319. package/dist/rpc/OperationActionDialog.js.map +1 -0
  320. package/dist/rpc/OperationCatalog.d.ts +21 -0
  321. package/dist/rpc/OperationCatalog.d.ts.map +1 -0
  322. package/dist/rpc/OperationCatalog.js +339 -0
  323. package/dist/rpc/OperationCatalog.js.map +1 -0
  324. package/dist/rpc/OperationCommandPage.d.ts +22 -0
  325. package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
  326. package/dist/rpc/OperationCommandPage.js +484 -0
  327. package/dist/rpc/OperationCommandPage.js.map +1 -0
  328. package/dist/rpc/OperationEntityPage.d.ts +23 -0
  329. package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
  330. package/dist/rpc/OperationEntityPage.js +218 -0
  331. package/dist/rpc/OperationEntityPage.js.map +1 -0
  332. package/dist/rpc/classify.d.ts +8 -0
  333. package/dist/rpc/classify.d.ts.map +1 -0
  334. package/dist/rpc/classify.js +76 -0
  335. package/dist/rpc/classify.js.map +1 -0
  336. package/dist/rpc/clickyMetadata.d.ts +12 -0
  337. package/dist/rpc/clickyMetadata.d.ts.map +1 -0
  338. package/dist/rpc/clickyMetadata.js +71 -0
  339. package/dist/rpc/clickyMetadata.js.map +1 -0
  340. package/dist/rpc/formMetadata.d.ts +27 -0
  341. package/dist/rpc/formMetadata.d.ts.map +1 -0
  342. package/dist/rpc/formMetadata.js +250 -0
  343. package/dist/rpc/formMetadata.js.map +1 -0
  344. package/dist/rpc/types.d.ts +109 -0
  345. package/dist/rpc/types.d.ts.map +1 -0
  346. package/dist/rpc/types.js +8 -0
  347. package/dist/rpc/types.js.map +1 -0
  348. package/dist/rpc/useOperations.d.ts +346 -0
  349. package/dist/rpc/useOperations.d.ts.map +1 -0
  350. package/dist/rpc/useOperations.js +31 -0
  351. package/dist/rpc/useOperations.js.map +1 -0
  352. package/dist/rpc.d.ts +14 -0
  353. package/dist/rpc.d.ts.map +1 -0
  354. package/dist/rpc.js +37 -0
  355. package/dist/rpc.js.map +1 -0
  356. package/dist/styles.css +2 -0
  357. package/dist/styles.d.ts +1 -0
  358. package/dist/styles.d.ts.map +1 -0
  359. package/dist/styles.js +2 -0
  360. package/dist/styles.js.map +1 -0
  361. package/dist/tailwind-preset.d.ts +4 -0
  362. package/dist/tailwind-preset.d.ts.map +1 -0
  363. package/dist/tailwind-preset.js +69 -0
  364. package/dist/tailwind-preset.js.map +1 -0
  365. package/dist/utils.d.ts +4 -0
  366. package/dist/utils.d.ts.map +1 -0
  367. package/dist/utils.js +12 -0
  368. package/dist/utils.js.map +1 -0
  369. package/package.json +83 -40
  370. package/dist/index.d.mts +0 -834
  371. package/dist/index.d.mts.map +0 -1
  372. package/dist/index.mjs +0 -2918
  373. package/dist/index.mjs.map +0 -1
  374. package/dist/tailwind-preset.d.mts +0 -7
  375. package/dist/tailwind-preset.d.mts.map +0 -1
  376. package/dist/tailwind-preset.mjs +0 -64
  377. package/dist/tailwind-preset.mjs.map +0 -1
  378. package/src/styles/tokens.css +0 -78
@@ -0,0 +1,126 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Slot } from "@radix-ui/react-slot";
3
+ import { cva } from "class-variance-authority";
4
+ import { forwardRef } from "react";
5
+ import { cn } from "../lib/utils.js";
6
+ const buttonVariants = cva(
7
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
12
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
13
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
14
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
15
+ ghost: "hover:bg-accent hover:text-accent-foreground",
16
+ link: "text-primary underline-offset-4 hover:underline"
17
+ },
18
+ size: {
19
+ default: "h-control-h px-control-px py-2",
20
+ sm: "h-8 rounded-md px-3 text-xs",
21
+ lg: "h-10 rounded-md px-8",
22
+ icon: "h-control-h w-control-h"
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ variant: "default",
27
+ size: "default"
28
+ }
29
+ }
30
+ );
31
+ function ButtonSpinner() {
32
+ return /* @__PURE__ */ jsxs(
33
+ "svg",
34
+ {
35
+ xmlns: "http://www.w3.org/2000/svg",
36
+ width: "32",
37
+ height: "32",
38
+ viewBox: "0 0 24 24",
39
+ "aria-hidden": "true",
40
+ className: "h-4 w-4 shrink-0",
41
+ children: [
42
+ /* @__PURE__ */ jsx("circle", { cx: "4", cy: "12", r: "3", fill: "#151515", children: /* @__PURE__ */ jsx(
43
+ "animate",
44
+ {
45
+ id: "SVG7x14Dcom",
46
+ fill: "freeze",
47
+ attributeName: "opacity",
48
+ begin: "0;SVGqSjG0dUp.end-0.25s",
49
+ dur: "0.75s",
50
+ values: "1;0.2"
51
+ }
52
+ ) }),
53
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "3", fill: "#151515", opacity: "0.4", children: /* @__PURE__ */ jsx(
54
+ "animate",
55
+ {
56
+ fill: "freeze",
57
+ attributeName: "opacity",
58
+ begin: "SVG7x14Dcom.begin+0.15s",
59
+ dur: "0.75s",
60
+ values: "1;0.2"
61
+ }
62
+ ) }),
63
+ /* @__PURE__ */ jsx("circle", { cx: "20", cy: "12", r: "3", fill: "#151515", opacity: "0.3", children: /* @__PURE__ */ jsx(
64
+ "animate",
65
+ {
66
+ id: "SVGqSjG0dUp",
67
+ fill: "freeze",
68
+ attributeName: "opacity",
69
+ begin: "SVG7x14Dcom.begin+0.3s",
70
+ dur: "0.75s",
71
+ values: "1;0.2"
72
+ }
73
+ ) })
74
+ ]
75
+ }
76
+ );
77
+ }
78
+ const Button = forwardRef(
79
+ ({
80
+ children,
81
+ className,
82
+ disabled,
83
+ loading = false,
84
+ loadingLabel,
85
+ variant,
86
+ size,
87
+ asChild = false,
88
+ ...props
89
+ }, ref) => {
90
+ const Comp = asChild ? Slot : "button";
91
+ const content = loadingLabel !== void 0 ? loadingLabel : children;
92
+ if (asChild) {
93
+ return /* @__PURE__ */ jsx(
94
+ Comp,
95
+ {
96
+ ref,
97
+ "aria-busy": loading || void 0,
98
+ className: cn(buttonVariants({ variant, size }), className),
99
+ disabled: disabled || loading,
100
+ ...props,
101
+ children
102
+ }
103
+ );
104
+ }
105
+ return /* @__PURE__ */ jsxs(
106
+ Comp,
107
+ {
108
+ ref,
109
+ "aria-busy": loading || void 0,
110
+ className: cn(buttonVariants({ variant, size }), className),
111
+ disabled: disabled || loading,
112
+ ...props,
113
+ children: [
114
+ loading && /* @__PURE__ */ jsx(ButtonSpinner, {}),
115
+ content
116
+ ]
117
+ }
118
+ );
119
+ }
120
+ );
121
+ Button.displayName = "Button";
122
+ export {
123
+ Button,
124
+ buttonVariants
125
+ };
126
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sources":["../../src/components/button.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-control-h px-control-px py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-control-h w-control-h\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n loading?: boolean;\n loadingLabel?: ReactNode;\n };\n\nfunction ButtonSpinner() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0\"\n >\n <circle cx=\"4\" cy=\"12\" r=\"3\" fill=\"#151515\">\n <animate\n id=\"SVG7x14Dcom\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"0;SVGqSjG0dUp.end-0.25s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"#151515\" opacity=\"0.4\">\n <animate\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"SVG7x14Dcom.begin+0.15s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n <circle cx=\"20\" cy=\"12\" r=\"3\" fill=\"#151515\" opacity=\"0.3\">\n <animate\n id=\"SVGqSjG0dUp\"\n fill=\"freeze\"\n attributeName=\"opacity\"\n begin=\"SVG7x14Dcom.begin+0.3s\"\n dur=\"0.75s\"\n values=\"1;0.2\"\n />\n </circle>\n </svg>\n );\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled,\n loading = false,\n loadingLabel,\n variant,\n size,\n asChild = false,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : \"button\";\n const content = loadingLabel !== undefined ? loadingLabel : children;\n\n if (asChild) {\n return (\n <Comp\n ref={ref}\n aria-busy={loading || undefined}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n\n return (\n <Comp\n ref={ref}\n aria-busy={loading || undefined}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <ButtonSpinner />}\n {content}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { buttonVariants };\n"],"names":[],"mappings":";;;;;AAKA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AASA,SAAS,gBAAgB;AACvB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI,MAAK,WAChC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU,SAAQ,OACnD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,GAEX;AAAA,QACA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,WAAU,SAAQ,OACnD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,eAAc;AAAA,YACd,OAAM;AAAA,YACN,KAAI;AAAA,YACJ,QAAO;AAAA,UAAA;AAAA,QAAA,EACT,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EAAA,GAEL,QACG;AACH,UAAM,OAAO,UAAU,OAAO;AAC9B,UAAM,UAAU,iBAAiB,SAAY,eAAe;AAE5D,QAAI,SAAS;AACX,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,aAAW,WAAW;AAAA,UACtB,WAAW,GAAG,eAAe,EAAE,SAAS,KAAA,CAAM,GAAG,SAAS;AAAA,UAC1D,UAAU,YAAY;AAAA,UACrB,GAAG;AAAA,UAEH;AAAA,QAAA;AAAA,MAAA;AAAA,IAGP;AAEA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,aAAW,WAAW;AAAA,QACtB,WAAW,GAAG,eAAe,EAAE,SAAS,KAAA,CAAM,GAAG,SAAS;AAAA,QAC1D,UAAU,YAAY;AAAA,QACrB,GAAG;AAAA,QAEH,UAAA;AAAA,UAAA,+BAAY,eAAA,EAAc;AAAA,UAC1B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACA,OAAO,cAAc;"}
@@ -0,0 +1,7 @@
1
+ export type DensitySwitcherProps = {
2
+ className?: string;
3
+ triggerClassName?: string;
4
+ menuClassName?: string;
5
+ };
6
+ export declare const DensitySwitcher: import('react').ForwardRefExoticComponent<DensitySwitcherProps & import('react').RefAttributes<HTMLDivElement>>;
7
+ //# sourceMappingURL=density-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"density-switcher.d.ts","sourceRoot":"","sources":["../../src/components/density-switcher.tsx"],"names":[],"mappings":"AAUA,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,eAAe,iHAgB3B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { IconMenuPicker } from "./icon-menu-picker.js";
4
+ import { useDensity } from "../hooks/use-density.js";
5
+ const DENSITY_OPTIONS = [
6
+ { value: "compact", icon: "ph:rows", label: "compact" },
7
+ { value: "comfortable", icon: "ph:list", label: "comfortable" },
8
+ { value: "spacious", icon: "ph:list-dashes", label: "spacious" }
9
+ ];
10
+ const DensitySwitcher = forwardRef(
11
+ ({ className, triggerClassName, menuClassName }, ref) => {
12
+ const { density, setDensity } = useDensity();
13
+ return /* @__PURE__ */ jsx(
14
+ IconMenuPicker,
15
+ {
16
+ ref,
17
+ value: density,
18
+ onChange: setDensity,
19
+ options: DENSITY_OPTIONS,
20
+ ariaLabel: "Density",
21
+ className,
22
+ triggerClassName,
23
+ menuClassName
24
+ }
25
+ );
26
+ }
27
+ );
28
+ DensitySwitcher.displayName = "DensitySwitcher";
29
+ export {
30
+ DensitySwitcher
31
+ };
32
+ //# sourceMappingURL=density-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"density-switcher.js","sources":["../../src/components/density-switcher.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { IconMenuPicker, type IconMenuOption } from \"./icon-menu-picker\";\nimport { useDensity, type Density } from \"../hooks/use-density\";\n\nconst DENSITY_OPTIONS: IconMenuOption<Density>[] = [\n { value: \"compact\", icon: \"ph:rows\", label: \"compact\" },\n { value: \"comfortable\", icon: \"ph:list\", label: \"comfortable\" },\n { value: \"spacious\", icon: \"ph:list-dashes\", label: \"spacious\" },\n];\n\nexport type DensitySwitcherProps = {\n className?: string;\n triggerClassName?: string;\n menuClassName?: string;\n};\n\nexport const DensitySwitcher = forwardRef<HTMLDivElement, DensitySwitcherProps>(\n ({ className, triggerClassName, menuClassName }, ref) => {\n const { density, setDensity } = useDensity();\n return (\n <IconMenuPicker<Density>\n ref={ref}\n value={density}\n onChange={setDensity}\n options={DENSITY_OPTIONS}\n ariaLabel=\"Density\"\n className={className}\n triggerClassName={triggerClassName}\n menuClassName={menuClassName}\n />\n );\n },\n);\nDensitySwitcher.displayName = \"DensitySwitcher\";\n"],"names":[],"mappings":";;;;AAIA,MAAM,kBAA6C;AAAA,EACjD,EAAE,OAAO,WAAW,MAAM,WAAW,OAAO,UAAA;AAAA,EAC5C,EAAE,OAAO,eAAe,MAAM,WAAW,OAAO,cAAA;AAAA,EAChD,EAAE,OAAO,YAAY,MAAM,kBAAkB,OAAO,WAAA;AACtD;AAQO,MAAM,kBAAkB;AAAA,EAC7B,CAAC,EAAE,WAAW,kBAAkB,cAAA,GAAiB,QAAQ;AACvD,UAAM,EAAE,SAAS,WAAA,IAAe,WAAA;AAChC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACA,gBAAgB,cAAc;"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from 'react';
2
+ export type IconMenuOption<T extends string> = {
3
+ value: T;
4
+ icon: string;
5
+ label: string;
6
+ description?: string;
7
+ };
8
+ export type IconMenuPickerProps<T extends string> = {
9
+ value: T;
10
+ onChange: (next: T) => void;
11
+ options: IconMenuOption<T>[];
12
+ ariaLabel: string;
13
+ triggerTitle?: string | undefined;
14
+ footer?: ReactNode | undefined;
15
+ showLabel?: boolean | undefined;
16
+ className?: string | undefined;
17
+ triggerClassName?: string | undefined;
18
+ menuClassName?: string | undefined;
19
+ };
20
+ export declare const IconMenuPicker: <T extends string>(props: IconMenuPickerProps<T> & {
21
+ ref?: React.Ref<HTMLDivElement>;
22
+ }) => JSX.Element;
23
+ //# sourceMappingURL=icon-menu-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-menu-picker.d.ts","sourceRoot":"","sources":["../../src/components/icon-menu-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAKf,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI;IAC7C,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI;IAClD,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,CAAC;AA4MF,eAAO,MAAM,cAAc,EAAsC,CAAC,CAAC,SAAS,MAAM,EAChF,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,KAChE,GAAG,CAAC,OAAO,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { forwardRef, useRef, useState, useImperativeHandle, useMemo, useCallback, useEffect } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { Button } from "./button.js";
6
+ function IconMenuPickerInner({
7
+ value,
8
+ onChange,
9
+ options,
10
+ ariaLabel,
11
+ triggerTitle,
12
+ footer,
13
+ showLabel,
14
+ className,
15
+ triggerClassName,
16
+ menuClassName
17
+ }, ref) {
18
+ const rootRef = useRef(null);
19
+ const triggerRef = useRef(null);
20
+ const itemRefs = useRef([]);
21
+ const [open, setOpen] = useState(false);
22
+ useImperativeHandle(ref, () => rootRef.current);
23
+ const activeIndex = useMemo(
24
+ () => Math.max(
25
+ 0,
26
+ options.findIndex((option) => option.value === value)
27
+ ),
28
+ [options, value]
29
+ );
30
+ const close = useCallback((returnFocus) => {
31
+ var _a;
32
+ setOpen(false);
33
+ if (returnFocus) (_a = triggerRef.current) == null ? void 0 : _a.focus();
34
+ }, []);
35
+ const select = useCallback(
36
+ (next) => {
37
+ onChange(next);
38
+ close(true);
39
+ },
40
+ [close, onChange]
41
+ );
42
+ useEffect(() => {
43
+ if (!open) return;
44
+ const onPointerDown = (event) => {
45
+ var _a;
46
+ if (event.button !== 0) return;
47
+ if (!((_a = rootRef.current) == null ? void 0 : _a.contains(event.target))) {
48
+ close(false);
49
+ }
50
+ };
51
+ const onKeyDown = (event) => {
52
+ if (event.key === "Escape") {
53
+ event.preventDefault();
54
+ close(true);
55
+ }
56
+ };
57
+ document.addEventListener("pointerdown", onPointerDown);
58
+ document.addEventListener("keydown", onKeyDown);
59
+ return () => {
60
+ document.removeEventListener("pointerdown", onPointerDown);
61
+ document.removeEventListener("keydown", onKeyDown);
62
+ };
63
+ }, [close, open]);
64
+ useEffect(() => {
65
+ if (!open) return;
66
+ const node = itemRefs.current[activeIndex];
67
+ node == null ? void 0 : node.focus();
68
+ }, [activeIndex, open]);
69
+ const focusItem = (index) => {
70
+ var _a;
71
+ const wrapped = (index + options.length) % options.length;
72
+ (_a = itemRefs.current[wrapped]) == null ? void 0 : _a.focus();
73
+ };
74
+ const onMenuKeyDown = (event) => {
75
+ const focusedIndex = itemRefs.current.findIndex((node) => node === document.activeElement);
76
+ if (event.key === "ArrowDown") {
77
+ event.preventDefault();
78
+ focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) + 1);
79
+ return;
80
+ }
81
+ if (event.key === "ArrowUp") {
82
+ event.preventDefault();
83
+ focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) - 1);
84
+ return;
85
+ }
86
+ if (event.key === "Home") {
87
+ event.preventDefault();
88
+ focusItem(0);
89
+ return;
90
+ }
91
+ if (event.key === "End") {
92
+ event.preventDefault();
93
+ focusItem(options.length - 1);
94
+ return;
95
+ }
96
+ if (event.key === "Tab") {
97
+ close(false);
98
+ }
99
+ };
100
+ const onTriggerKeyDown = (event) => {
101
+ if (event.key === "ArrowDown" || event.key === "Enter" || event.key === " ") {
102
+ event.preventDefault();
103
+ setOpen(true);
104
+ }
105
+ };
106
+ const selected = options[activeIndex];
107
+ if (!selected) {
108
+ throw new Error(`IconMenuPicker: value "${value}" not found in options for ${ariaLabel}`);
109
+ }
110
+ return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: cn("relative inline-flex", showLabel && "w-full", className), children: [
111
+ /* @__PURE__ */ jsxs(
112
+ Button,
113
+ {
114
+ ref: triggerRef,
115
+ type: "button",
116
+ variant: "ghost",
117
+ size: showLabel ? "default" : "icon",
118
+ "aria-label": ariaLabel,
119
+ "aria-haspopup": "menu",
120
+ "aria-expanded": open,
121
+ title: triggerTitle ?? `${ariaLabel}: ${selected.label}`,
122
+ onClick: () => setOpen((current) => !current),
123
+ onKeyDown: onTriggerKeyDown,
124
+ className: cn(
125
+ "text-muted-foreground hover:text-foreground",
126
+ showLabel && "w-full justify-start",
127
+ triggerClassName
128
+ ),
129
+ children: [
130
+ /* @__PURE__ */ jsx(Icon, { name: selected.icon, className: showLabel ? "shrink-0 text-foreground" : void 0 }),
131
+ showLabel && /* @__PURE__ */ jsxs(Fragment, { children: [
132
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left capitalize", children: selected.label }),
133
+ /* @__PURE__ */ jsx(Icon, { name: "ph:caret-up-down", className: "shrink-0 text-muted-foreground" })
134
+ ] })
135
+ ]
136
+ }
137
+ ),
138
+ open && /* @__PURE__ */ jsxs(
139
+ "div",
140
+ {
141
+ role: "menu",
142
+ "aria-label": ariaLabel,
143
+ onKeyDown: onMenuKeyDown,
144
+ className: cn(
145
+ "absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5",
146
+ menuClassName
147
+ ),
148
+ children: [
149
+ options.map((option, index) => {
150
+ const active = option.value === value;
151
+ return /* @__PURE__ */ jsxs(
152
+ "button",
153
+ {
154
+ ref: (node) => {
155
+ itemRefs.current[index] = node;
156
+ },
157
+ type: "button",
158
+ role: "menuitemradio",
159
+ "aria-checked": active,
160
+ tabIndex: active ? 0 : -1,
161
+ onClick: () => select(option.value),
162
+ onKeyDown: (event) => {
163
+ if (event.key === "Enter" || event.key === " ") {
164
+ event.preventDefault();
165
+ select(option.value);
166
+ }
167
+ },
168
+ className: cn(
169
+ "flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors",
170
+ "hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none",
171
+ active && "text-foreground"
172
+ ),
173
+ children: [
174
+ /* @__PURE__ */ jsx(Icon, { name: option.icon, className: "shrink-0 text-muted-foreground" }),
175
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate capitalize", children: option.label }),
176
+ active ? /* @__PURE__ */ jsx(Icon, { name: "ph:check", className: "shrink-0 text-foreground" }) : /* @__PURE__ */ jsx("span", { className: "inline-block size-4 shrink-0", "aria-hidden": true })
177
+ ]
178
+ },
179
+ option.value
180
+ );
181
+ }),
182
+ footer ? /* @__PURE__ */ jsx("div", { className: "mt-1 border-t border-border/60 px-2 py-1.5 text-[11px] text-muted-foreground", children: footer }) : null
183
+ ]
184
+ }
185
+ )
186
+ ] });
187
+ }
188
+ const IconMenuPicker = forwardRef(IconMenuPickerInner);
189
+ export {
190
+ IconMenuPicker
191
+ };
192
+ //# sourceMappingURL=icon-menu-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-menu-picker.js","sources":["../../src/components/icon-menu-picker.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"./button\";\n\nexport type IconMenuOption<T extends string> = {\n value: T;\n icon: string;\n label: string;\n description?: string;\n};\n\nexport type IconMenuPickerProps<T extends string> = {\n value: T;\n onChange: (next: T) => void;\n options: IconMenuOption<T>[];\n ariaLabel: string;\n triggerTitle?: string | undefined;\n footer?: ReactNode | undefined;\n showLabel?: boolean | undefined;\n className?: string | undefined;\n triggerClassName?: string | undefined;\n menuClassName?: string | undefined;\n};\n\nfunction IconMenuPickerInner<T extends string>(\n {\n value,\n onChange,\n options,\n ariaLabel,\n triggerTitle,\n footer,\n showLabel,\n className,\n triggerClassName,\n menuClassName,\n }: IconMenuPickerProps<T>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [open, setOpen] = useState(false);\n\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement);\n\n const activeIndex = useMemo(\n () =>\n Math.max(\n 0,\n options.findIndex((option) => option.value === value),\n ),\n [options, value],\n );\n\n const close = useCallback((returnFocus: boolean) => {\n setOpen(false);\n if (returnFocus) triggerRef.current?.focus();\n }, []);\n\n const select = useCallback(\n (next: T) => {\n onChange(next);\n close(true);\n },\n [close, onChange],\n );\n\n useEffect(() => {\n if (!open) return;\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n if (!rootRef.current?.contains(event.target as Node)) {\n close(false);\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close(true);\n }\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [close, open]);\n\n useEffect(() => {\n if (!open) return;\n const node = itemRefs.current[activeIndex];\n node?.focus();\n }, [activeIndex, open]);\n\n const focusItem = (index: number) => {\n const wrapped = (index + options.length) % options.length;\n itemRefs.current[wrapped]?.focus();\n };\n\n const onMenuKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const focusedIndex = itemRefs.current.findIndex((node) => node === document.activeElement);\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) + 1);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusItem((focusedIndex < 0 ? activeIndex : focusedIndex) - 1);\n return;\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n focusItem(0);\n return;\n }\n if (event.key === \"End\") {\n event.preventDefault();\n focusItem(options.length - 1);\n return;\n }\n if (event.key === \"Tab\") {\n close(false);\n }\n };\n\n const onTriggerKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (event.key === \"ArrowDown\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const selected = options[activeIndex];\n if (!selected) {\n throw new Error(`IconMenuPicker: value \"${value}\" not found in options for ${ariaLabel}`);\n }\n\n return (\n <div ref={rootRef} className={cn(\"relative inline-flex\", showLabel && \"w-full\", className)}>\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"ghost\"\n size={showLabel ? \"default\" : \"icon\"}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n title={triggerTitle ?? `${ariaLabel}: ${selected.label}`}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={onTriggerKeyDown}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n showLabel && \"w-full justify-start\",\n triggerClassName,\n )}\n >\n <Icon name={selected.icon} className={showLabel ? \"shrink-0 text-foreground\" : undefined} />\n {showLabel && (\n <>\n <span className=\"min-w-0 flex-1 truncate text-left capitalize\">{selected.label}</span>\n <Icon name=\"ph:caret-up-down\" className=\"shrink-0 text-muted-foreground\" />\n </>\n )}\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label={ariaLabel}\n onKeyDown={onMenuKeyDown}\n className={cn(\n \"absolute left-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\",\n menuClassName,\n )}\n >\n {options.map((option, index) => {\n const active = option.value === value;\n return (\n <button\n key={option.value}\n ref={(node) => {\n itemRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n tabIndex={active ? 0 : -1}\n onClick={() => select(option.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n select(option.value);\n }\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n active && \"text-foreground\",\n )}\n >\n <Icon name={option.icon} className=\"shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate capitalize\">{option.label}</span>\n {active ? (\n <Icon name=\"ph:check\" className=\"shrink-0 text-foreground\" />\n ) : (\n <span className=\"inline-block size-4 shrink-0\" aria-hidden />\n )}\n </button>\n );\n })}\n {footer ? (\n <div className=\"mt-1 border-t border-border/60 px-2 py-1.5 text-[11px] text-muted-foreground\">\n {footer}\n </div>\n ) : null}\n </div>\n )}\n </div>\n );\n}\n\nexport const IconMenuPicker = forwardRef(IconMenuPickerInner) as <T extends string>(\n props: IconMenuPickerProps<T> & { ref?: React.Ref<HTMLDivElement> },\n) => JSX.Element;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { SelectHTMLAttributes } from 'react';
2
+ export type SelectOption = {
3
+ value: string;
4
+ label: string;
5
+ disabled?: boolean;
6
+ };
7
+ export type SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {
8
+ options?: SelectOption[];
9
+ placeholder?: string;
10
+ };
11
+ export declare const Select: import('react').ForwardRefExoticComponent<SelectHTMLAttributes<HTMLSelectElement> & {
12
+ options?: SelectOption[];
13
+ placeholder?: string;
14
+ } & import('react').RefAttributes<HTMLSelectElement>>;
15
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAI9D,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,MAAM;cAJP,YAAY,EAAE;kBACV,MAAM;qDAqCrB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ const Select = forwardRef(
6
+ ({ className, options, placeholder, children, ...props }, ref) => {
7
+ return /* @__PURE__ */ jsxs("div", { className: "relative inline-flex w-full items-center", children: [
8
+ /* @__PURE__ */ jsxs(
9
+ "select",
10
+ {
11
+ ref,
12
+ className: cn(
13
+ "h-control-h w-full appearance-none rounded-md border border-input bg-background px-control-px pr-8 text-sm text-foreground",
14
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
15
+ "disabled:cursor-not-allowed disabled:opacity-50",
16
+ className
17
+ ),
18
+ ...props,
19
+ children: [
20
+ placeholder !== void 0 && /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: placeholder }),
21
+ options ? options.map((opt) => /* @__PURE__ */ jsx("option", { value: opt.value, disabled: opt.disabled, children: opt.label }, opt.value)) : children
22
+ ]
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx(
26
+ Icon,
27
+ {
28
+ name: "codicon:chevron-down",
29
+ className: "pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
30
+ }
31
+ )
32
+ ] });
33
+ }
34
+ );
35
+ Select.displayName = "Select";
36
+ export {
37
+ Select
38
+ };
39
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sources":["../../src/components/select.tsx"],"sourcesContent":["import { forwardRef, type SelectHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\n\nexport type SelectOption = { value: string; label: string; disabled?: boolean };\n\nexport type SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {\n options?: SelectOption[];\n placeholder?: string;\n};\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, options, placeholder, children, ...props }, ref) => {\n return (\n <div className=\"relative inline-flex w-full items-center\">\n <select\n ref={ref}\n className={cn(\n \"h-control-h w-full appearance-none rounded-md border border-input bg-background px-control-px pr-8 text-sm text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n {placeholder !== undefined && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options\n ? options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))\n : children}\n </select>\n <Icon\n name=\"codicon:chevron-down\"\n className=\"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\"\n />\n </div>\n );\n },\n);\nSelect.displayName = \"Select\";\n"],"names":[],"mappings":";;;;AAWO,MAAM,SAAS;AAAA,EACpB,CAAC,EAAE,WAAW,SAAS,aAAa,UAAU,GAAG,MAAA,GAAS,QAAQ;AAChE,WACE,qBAAC,OAAA,EAAI,WAAU,4CACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAED,GAAG;AAAA,UAEH,UAAA;AAAA,YAAA,gBAAgB,UACf,oBAAC,UAAA,EAAO,OAAM,IAAG,UAAQ,MACtB,UAAA,YAAA,CACH;AAAA,YAED,UACG,QAAQ,IAAI,CAAC,QACX,oBAAC,YAAuB,OAAO,IAAI,OAAO,UAAU,IAAI,UACrD,UAAA,IAAI,SADM,IAAI,KAEjB,CACD,IACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ,GACF;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;"}
@@ -0,0 +1,7 @@
1
+ export type ThemeSwitcherProps = {
2
+ className?: string;
3
+ triggerClassName?: string;
4
+ menuClassName?: string;
5
+ };
6
+ export declare const ThemeSwitcher: import('react').ForwardRefExoticComponent<ThemeSwitcherProps & import('react').RefAttributes<HTMLDivElement>>;
7
+ //# sourceMappingURL=theme-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-switcher.d.ts","sourceRoot":"","sources":["../../src/components/theme-switcher.tsx"],"names":[],"mappings":"AAWA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,aAAa,+GA6BzB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { Icon } from "../data/Icon.js";
4
+ import { IconMenuPicker } from "./icon-menu-picker.js";
5
+ import { useTheme } from "../hooks/use-theme.js";
6
+ const THEME_OPTIONS = [
7
+ { value: "light", icon: "ph:sun", label: "light" },
8
+ { value: "dark", icon: "ph:moon", label: "dark" },
9
+ { value: "system", icon: "ph:desktop", label: "system" }
10
+ ];
11
+ const ThemeSwitcher = forwardRef(
12
+ ({ className, triggerClassName, menuClassName }, ref) => {
13
+ const { theme, setTheme, resolvedTheme } = useTheme();
14
+ const footer = theme === "system" ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
15
+ /* @__PURE__ */ jsx(Icon, { name: resolvedTheme === "dark" ? "ph:moon" : "ph:sun", width: 12, height: 12 }),
16
+ /* @__PURE__ */ jsxs("span", { children: [
17
+ "resolves to",
18
+ " ",
19
+ /* @__PURE__ */ jsx("span", { "data-testid": "resolved-theme", className: "font-medium text-foreground", children: resolvedTheme })
20
+ ] })
21
+ ] }) : null;
22
+ return /* @__PURE__ */ jsx(
23
+ IconMenuPicker,
24
+ {
25
+ ref,
26
+ value: theme,
27
+ onChange: setTheme,
28
+ options: THEME_OPTIONS,
29
+ ariaLabel: "Theme",
30
+ footer,
31
+ className,
32
+ triggerClassName,
33
+ menuClassName
34
+ }
35
+ );
36
+ }
37
+ );
38
+ ThemeSwitcher.displayName = "ThemeSwitcher";
39
+ export {
40
+ ThemeSwitcher
41
+ };
42
+ //# sourceMappingURL=theme-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-switcher.js","sources":["../../src/components/theme-switcher.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { IconMenuPicker, type IconMenuOption } from \"./icon-menu-picker\";\nimport { useTheme, type Theme } from \"../hooks/use-theme\";\n\nconst THEME_OPTIONS: IconMenuOption<Theme>[] = [\n { value: \"light\", icon: \"ph:sun\", label: \"light\" },\n { value: \"dark\", icon: \"ph:moon\", label: \"dark\" },\n { value: \"system\", icon: \"ph:desktop\", label: \"system\" },\n];\n\nexport type ThemeSwitcherProps = {\n className?: string;\n triggerClassName?: string;\n menuClassName?: string;\n};\n\nexport const ThemeSwitcher = forwardRef<HTMLDivElement, ThemeSwitcherProps>(\n ({ className, triggerClassName, menuClassName }, ref) => {\n const { theme, setTheme, resolvedTheme } = useTheme();\n const footer =\n theme === \"system\" ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <Icon name={resolvedTheme === \"dark\" ? \"ph:moon\" : \"ph:sun\"} width={12} height={12} />\n <span>\n resolves to{\" \"}\n <span data-testid=\"resolved-theme\" className=\"font-medium text-foreground\">\n {resolvedTheme}\n </span>\n </span>\n </span>\n ) : null;\n return (\n <IconMenuPicker<Theme>\n ref={ref}\n value={theme}\n onChange={setTheme}\n options={THEME_OPTIONS}\n ariaLabel=\"Theme\"\n footer={footer}\n className={className}\n triggerClassName={triggerClassName}\n menuClassName={menuClassName}\n />\n );\n },\n);\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n"],"names":[],"mappings":";;;;;AAKA,MAAM,gBAAyC;AAAA,EAC7C,EAAE,OAAO,SAAS,MAAM,UAAU,OAAO,QAAA;AAAA,EACzC,EAAE,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAA;AAAA,EACzC,EAAE,OAAO,UAAU,MAAM,cAAc,OAAO,SAAA;AAChD;AAQO,MAAM,gBAAgB;AAAA,EAC3B,CAAC,EAAE,WAAW,kBAAkB,cAAA,GAAiB,QAAQ;AACvD,UAAM,EAAE,OAAO,UAAU,cAAA,IAAkB,SAAA;AAC3C,UAAM,SACJ,UAAU,WACR,qBAAC,QAAA,EAAK,WAAU,oCACd,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAK,MAAM,kBAAkB,SAAS,YAAY,UAAU,OAAO,IAAI,QAAQ,GAAA,CAAI;AAAA,2BACnF,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QACQ;AAAA,4BACX,QAAA,EAAK,eAAY,kBAAiB,WAAU,+BAC1C,UAAA,cAAA,CACH;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,IACE;AACN,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACA,cAAc,cAAc;"}
@@ -0,0 +1,15 @@
1
+ export { Button, buttonVariants, type ButtonProps } from './components/button';
2
+ export { DatePicker, type DatePickerProps } from './components/DatePicker';
3
+ export { DateTimePicker, type DateTimePickerProps } from './components/DateTimePicker';
4
+ export { RangeSlider, type RangeSliderProps, type RangeSliderValue, } from './components/RangeSlider';
5
+ export { FilterBar, type FilterBarBooleanFilter, type FilterBarEnumFilter, type FilterBarFilter, type FilterBarLookupFilter, type FilterBarLookupInputType, type FilterBarLookupMultiFilter, type FilterBarLookupOption, type FilterBarMultiFilter, type FilterBarMultiFilterMode, type FilterBarNestedMultiFilter, type FilterBarNestedMultiGroup, type FilterBarNumberFilter, type FilterBarNumberValue, type FilterBarProps, type FilterBarRangePreset, type FilterBarRangeProps, type FilterBarSearchProps, type FilterBarSelectMultiFilter, type FilterBarTextFilter, } from './components/FilterBar';
6
+ export { MultiSelect, type MultiSelectOption, type MultiSelectProps, } from './components/MultiSelect';
7
+ export { Select, type SelectProps, type SelectOption } from './components/select';
8
+ export { ThemeSwitcher, type ThemeSwitcherProps } from './components/theme-switcher';
9
+ export { DensitySwitcher, type DensitySwitcherProps } from './components/density-switcher';
10
+ export { IconMenuPicker, type IconMenuPickerProps, type IconMenuOption, } from './components/icon-menu-picker';
11
+ export { SplitPane, type SplitPaneProps } from './layout/SplitPane';
12
+ export { Section, DetailEmptyState, type SectionProps, type DetailEmptyStateProps, } from './layout/Section';
13
+ export { HoverCard, type HoverCardProps, type HoverCardPlacement } from './overlay/HoverCard';
14
+ export { Modal, type ModalProps, type ModalSize } from './overlay/Modal';
15
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,SAAS,EACT,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,OAAO,EACP,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Button, buttonVariants } from "./components/button.js";
2
+ import { DatePicker } from "./components/DatePicker.js";
3
+ import { DateTimePicker } from "./components/DateTimePicker.js";
4
+ import { RangeSlider } from "./components/RangeSlider.js";
5
+ import { FilterBar } from "./components/FilterBar.js";
6
+ import { MultiSelect } from "./components/MultiSelect.js";
7
+ import { Select } from "./components/select.js";
8
+ import { ThemeSwitcher } from "./components/theme-switcher.js";
9
+ import { DensitySwitcher } from "./components/density-switcher.js";
10
+ import { IconMenuPicker } from "./components/icon-menu-picker.js";
11
+ import { SplitPane } from "./layout/SplitPane.js";
12
+ import { DetailEmptyState, Section } from "./layout/Section.js";
13
+ import { HoverCard } from "./overlay/HoverCard.js";
14
+ import { Modal } from "./overlay/Modal.js";
15
+ export {
16
+ Button,
17
+ DatePicker,
18
+ DateTimePicker,
19
+ DensitySwitcher,
20
+ DetailEmptyState,
21
+ FilterBar,
22
+ HoverCard,
23
+ IconMenuPicker,
24
+ Modal,
25
+ MultiSelect,
26
+ RangeSlider,
27
+ Section,
28
+ Select,
29
+ SplitPane,
30
+ ThemeSwitcher,
31
+ buttonVariants
32
+ };
33
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -0,0 +1,7 @@
1
+ export type AnsiHtmlProps = {
2
+ text: string;
3
+ className?: string;
4
+ as?: "pre" | "span";
5
+ };
6
+ export declare function AnsiHtml({ text, className, as }: AnsiHtmlProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=AnsiHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnsiHtml.d.ts","sourceRoot":"","sources":["../../src/data/AnsiHtml.tsx"],"names":[],"mappings":"AAmEA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAU,EAAE,EAAE,aAAa,2CAatE"}