@flanksource/clicky-ui 0.2.19 → 0.2.21

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 (423) hide show
  1. package/dist/ai.cjs +26 -0
  2. package/dist/ai.cjs.map +1 -0
  3. package/dist/ai.d.ts +2 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/ai.js +26 -0
  6. package/dist/ai.js.map +1 -0
  7. package/dist/chat.cjs +7 -0
  8. package/dist/chat.cjs.map +1 -1
  9. package/dist/chat.js +7 -0
  10. package/dist/chat.js.map +1 -1
  11. package/dist/components/FilterBar.cjs +49 -18
  12. package/dist/components/FilterBar.cjs.map +1 -1
  13. package/dist/components/FilterBar.d.ts +0 -2
  14. package/dist/components/FilterBar.d.ts.map +1 -1
  15. package/dist/components/FilterBar.js +50 -19
  16. package/dist/components/FilterBar.js.map +1 -1
  17. package/dist/components/SearchInput.cjs +63 -0
  18. package/dist/components/SearchInput.cjs.map +1 -0
  19. package/dist/components/SearchInput.d.ts +31 -0
  20. package/dist/components/SearchInput.d.ts.map +1 -0
  21. package/dist/components/SearchInput.js +63 -0
  22. package/dist/components/SearchInput.js.map +1 -0
  23. package/dist/components/SegmentedControl.cjs +88 -0
  24. package/dist/components/SegmentedControl.cjs.map +1 -0
  25. package/dist/components/SegmentedControl.d.ts +38 -0
  26. package/dist/components/SegmentedControl.d.ts.map +1 -0
  27. package/dist/components/SegmentedControl.js +88 -0
  28. package/dist/components/SegmentedControl.js.map +1 -0
  29. package/dist/components/Switch.cjs +51 -0
  30. package/dist/components/Switch.cjs.map +1 -0
  31. package/dist/components/Switch.d.ts +23 -0
  32. package/dist/components/Switch.d.ts.map +1 -0
  33. package/dist/components/Switch.js +51 -0
  34. package/dist/components/Switch.js.map +1 -0
  35. package/dist/components/TimeRange.cjs +53 -45
  36. package/dist/components/TimeRange.cjs.map +1 -1
  37. package/dist/components/TimeRange.d.ts.map +1 -1
  38. package/dist/components/TimeRange.js +53 -45
  39. package/dist/components/TimeRange.js.map +1 -1
  40. package/dist/components/TreePickerField.cjs +5 -1
  41. package/dist/components/TreePickerField.cjs.map +1 -1
  42. package/dist/components/TreePickerField.d.ts.map +1 -1
  43. package/dist/components/TreePickerField.js +5 -1
  44. package/dist/components/TreePickerField.js.map +1 -1
  45. package/dist/components/filter-bar-utils.cjs +5 -0
  46. package/dist/components/filter-bar-utils.cjs.map +1 -1
  47. package/dist/components/filter-bar-utils.d.ts +2 -0
  48. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  49. package/dist/components/filter-bar-utils.js +5 -0
  50. package/dist/components/filter-bar-utils.js.map +1 -1
  51. package/dist/components/json-schema-form-fields.cjs +8 -2
  52. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  53. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  54. package/dist/components/json-schema-form-fields.js +8 -2
  55. package/dist/components/json-schema-form-fields.js.map +1 -1
  56. package/dist/components/json-schema-form-resolve.cjs +1 -1
  57. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  58. package/dist/components/json-schema-form-resolve.js +1 -1
  59. package/dist/components/json-schema-form-resolve.js.map +1 -1
  60. package/dist/components.cjs +15 -1
  61. package/dist/components.cjs.map +1 -1
  62. package/dist/components.d.ts +8 -1
  63. package/dist/components.d.ts.map +1 -1
  64. package/dist/components.js +15 -1
  65. package/dist/components.js.map +1 -1
  66. package/dist/data/Clicky.cjs +33 -44
  67. package/dist/data/Clicky.cjs.map +1 -1
  68. package/dist/data/Clicky.d.ts +0 -9
  69. package/dist/data/Clicky.d.ts.map +1 -1
  70. package/dist/data/Clicky.js +31 -42
  71. package/dist/data/Clicky.js.map +1 -1
  72. package/dist/data/DataTable.cjs +73 -50
  73. package/dist/data/DataTable.cjs.map +1 -1
  74. package/dist/data/DataTable.d.ts +4 -0
  75. package/dist/data/DataTable.d.ts.map +1 -1
  76. package/dist/data/DataTable.js +73 -50
  77. package/dist/data/DataTable.js.map +1 -1
  78. package/dist/data/Icon.cjs +2 -5
  79. package/dist/data/Icon.cjs.map +1 -1
  80. package/dist/data/Icon.d.ts +1 -21
  81. package/dist/data/Icon.d.ts.map +1 -1
  82. package/dist/data/Icon.js +3 -6
  83. package/dist/data/Icon.js.map +1 -1
  84. package/dist/data/MatrixTable.cjs +4 -4
  85. package/dist/data/MatrixTable.cjs.map +1 -1
  86. package/dist/data/MatrixTable.js +4 -4
  87. package/dist/data/MatrixTable.js.map +1 -1
  88. package/dist/data/RadialGauge.cjs +76 -0
  89. package/dist/data/RadialGauge.cjs.map +1 -0
  90. package/dist/data/RadialGauge.d.ts +24 -0
  91. package/dist/data/RadialGauge.d.ts.map +1 -0
  92. package/dist/data/RadialGauge.js +76 -0
  93. package/dist/data/RadialGauge.js.map +1 -0
  94. package/dist/data/StatusBreakdown.cjs +0 -4
  95. package/dist/data/StatusBreakdown.cjs.map +1 -1
  96. package/dist/data/StatusBreakdown.d.ts +0 -2
  97. package/dist/data/StatusBreakdown.d.ts.map +1 -1
  98. package/dist/data/StatusBreakdown.js +1 -5
  99. package/dist/data/StatusBreakdown.js.map +1 -1
  100. package/dist/data/Timeline.cjs +61 -0
  101. package/dist/data/Timeline.cjs.map +1 -0
  102. package/dist/data/Timeline.d.ts +36 -0
  103. package/dist/data/Timeline.d.ts.map +1 -0
  104. package/dist/data/Timeline.js +61 -0
  105. package/dist/data/Timeline.js.map +1 -0
  106. package/dist/data/TimeseriesCoreBars.cjs +2 -25
  107. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  108. package/dist/data/TimeseriesCoreBars.d.ts +0 -19
  109. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  110. package/dist/data/TimeseriesCoreBars.js +2 -25
  111. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  112. package/dist/data/TimeseriesCoreBars.model.cjs +27 -0
  113. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -0
  114. package/dist/data/TimeseriesCoreBars.model.d.ts +20 -0
  115. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -0
  116. package/dist/data/TimeseriesCoreBars.model.js +27 -0
  117. package/dist/data/TimeseriesCoreBars.model.js.map +1 -0
  118. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  119. package/dist/data/TimeseriesPanel.axes.d.ts +1 -1
  120. package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -1
  121. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  122. package/dist/data/TimeseriesPanel.cjs +4 -54
  123. package/dist/data/TimeseriesPanel.cjs.map +1 -1
  124. package/dist/data/TimeseriesPanel.d.ts +2 -138
  125. package/dist/data/TimeseriesPanel.d.ts.map +1 -1
  126. package/dist/data/TimeseriesPanel.js +2 -52
  127. package/dist/data/TimeseriesPanel.js.map +1 -1
  128. package/dist/data/TimeseriesPanel.model.cjs +53 -0
  129. package/dist/data/TimeseriesPanel.model.cjs.map +1 -0
  130. package/dist/data/TimeseriesPanel.model.d.ts +88 -0
  131. package/dist/data/TimeseriesPanel.model.d.ts.map +1 -0
  132. package/dist/data/TimeseriesPanel.model.js +53 -0
  133. package/dist/data/TimeseriesPanel.model.js.map +1 -0
  134. package/dist/data/Tree.cjs +1 -1
  135. package/dist/data/Tree.cjs.map +1 -1
  136. package/dist/data/Tree.js +1 -1
  137. package/dist/data/Tree.js.map +1 -1
  138. package/dist/data/ai/ChatFab.cjs +29 -0
  139. package/dist/data/ai/ChatFab.cjs.map +1 -0
  140. package/dist/data/ai/ChatFab.d.ts +12 -0
  141. package/dist/data/ai/ChatFab.d.ts.map +1 -0
  142. package/dist/data/ai/ChatFab.js +29 -0
  143. package/dist/data/ai/ChatFab.js.map +1 -0
  144. package/dist/data/ai/ChatWindow.cjs +178 -0
  145. package/dist/data/ai/ChatWindow.cjs.map +1 -0
  146. package/dist/data/ai/ChatWindow.d.ts +38 -0
  147. package/dist/data/ai/ChatWindow.d.ts.map +1 -0
  148. package/dist/data/ai/ChatWindow.js +156 -0
  149. package/dist/data/ai/ChatWindow.js.map +1 -0
  150. package/dist/data/ai/ChatWindowManager.cjs +139 -0
  151. package/dist/data/ai/ChatWindowManager.cjs.map +1 -0
  152. package/dist/data/ai/ChatWindowManager.d.ts +12 -0
  153. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -0
  154. package/dist/data/ai/ChatWindowManager.js +139 -0
  155. package/dist/data/ai/ChatWindowManager.js.map +1 -0
  156. package/dist/data/ai/ContextBadges.cjs +74 -0
  157. package/dist/data/ai/ContextBadges.cjs.map +1 -0
  158. package/dist/data/ai/ContextBadges.d.ts +16 -0
  159. package/dist/data/ai/ContextBadges.d.ts.map +1 -0
  160. package/dist/data/ai/ContextBadges.js +74 -0
  161. package/dist/data/ai/ContextBadges.js.map +1 -0
  162. package/dist/data/ai/ThreadPicker.cjs +148 -0
  163. package/dist/data/ai/ThreadPicker.cjs.map +1 -0
  164. package/dist/data/ai/ThreadPicker.d.ts +37 -0
  165. package/dist/data/ai/ThreadPicker.d.ts.map +1 -0
  166. package/dist/data/ai/ThreadPicker.js +148 -0
  167. package/dist/data/ai/ThreadPicker.js.map +1 -0
  168. package/dist/data/ai/ToolPreferences.cjs +80 -0
  169. package/dist/data/ai/ToolPreferences.cjs.map +1 -0
  170. package/dist/data/ai/ToolPreferences.d.ts +19 -0
  171. package/dist/data/ai/ToolPreferences.d.ts.map +1 -0
  172. package/dist/data/ai/ToolPreferences.js +80 -0
  173. package/dist/data/ai/ToolPreferences.js.map +1 -0
  174. package/dist/data/ai/chat-window-context.cjs +78 -0
  175. package/dist/data/ai/chat-window-context.cjs.map +1 -0
  176. package/dist/data/ai/chat-window-context.d.ts +57 -0
  177. package/dist/data/ai/chat-window-context.d.ts.map +1 -0
  178. package/dist/data/ai/chat-window-context.js +78 -0
  179. package/dist/data/ai/chat-window-context.js.map +1 -0
  180. package/dist/data/ai/context.cjs +43 -0
  181. package/dist/data/ai/context.cjs.map +1 -0
  182. package/dist/data/ai/context.d.ts +35 -0
  183. package/dist/data/ai/context.d.ts.map +1 -0
  184. package/dist/data/ai/context.js +43 -0
  185. package/dist/data/ai/context.js.map +1 -0
  186. package/dist/data/ai/index.d.ts +10 -0
  187. package/dist/data/ai/index.d.ts.map +1 -0
  188. package/dist/data/cache-browser/CacheDetailPanel.cjs +15 -0
  189. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -1
  190. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -1
  191. package/dist/data/cache-browser/CacheDetailPanel.js +15 -0
  192. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -1
  193. package/dist/data/cache-browser/cache-browser.fixtures.d.ts +10 -0
  194. package/dist/data/cache-browser/cache-browser.fixtures.d.ts.map +1 -0
  195. package/dist/data/cache-browser/download.cjs +13 -0
  196. package/dist/data/cache-browser/download.cjs.map +1 -0
  197. package/dist/data/cache-browser/download.d.ts +3 -0
  198. package/dist/data/cache-browser/download.d.ts.map +1 -0
  199. package/dist/data/cache-browser/download.js +13 -0
  200. package/dist/data/cache-browser/download.js.map +1 -0
  201. package/dist/data/chat/Chat.cjs +44 -3
  202. package/dist/data/chat/Chat.cjs.map +1 -1
  203. package/dist/data/chat/Chat.d.ts +5 -2
  204. package/dist/data/chat/Chat.d.ts.map +1 -1
  205. package/dist/data/chat/Chat.fixtures.cjs +86 -0
  206. package/dist/data/chat/Chat.fixtures.cjs.map +1 -0
  207. package/dist/data/chat/Chat.fixtures.d.ts +4 -0
  208. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  209. package/dist/data/chat/Chat.fixtures.js +86 -0
  210. package/dist/data/chat/Chat.fixtures.js.map +1 -0
  211. package/dist/data/chat/Chat.js +45 -4
  212. package/dist/data/chat/Chat.js.map +1 -1
  213. package/dist/data/chat/ContextUsage.cjs +99 -0
  214. package/dist/data/chat/ContextUsage.cjs.map +1 -0
  215. package/dist/data/chat/ContextUsage.d.ts +19 -0
  216. package/dist/data/chat/ContextUsage.d.ts.map +1 -0
  217. package/dist/data/chat/ContextUsage.js +99 -0
  218. package/dist/data/chat/ContextUsage.js.map +1 -0
  219. package/dist/data/chat/Conversation.cjs +47 -2
  220. package/dist/data/chat/Conversation.cjs.map +1 -1
  221. package/dist/data/chat/Conversation.d.ts +8 -2
  222. package/dist/data/chat/Conversation.d.ts.map +1 -1
  223. package/dist/data/chat/Conversation.js +47 -2
  224. package/dist/data/chat/Conversation.js.map +1 -1
  225. package/dist/data/chat/ModelSelector.cjs +28 -14
  226. package/dist/data/chat/ModelSelector.cjs.map +1 -1
  227. package/dist/data/chat/ModelSelector.d.ts +5 -4
  228. package/dist/data/chat/ModelSelector.d.ts.map +1 -1
  229. package/dist/data/chat/ModelSelector.js +28 -14
  230. package/dist/data/chat/ModelSelector.js.map +1 -1
  231. package/dist/data/chat/clickyOperationsToTools.cjs +21 -1
  232. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  233. package/dist/data/chat/clickyOperationsToTools.d.ts +5 -4
  234. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  235. package/dist/data/chat/clickyOperationsToTools.js +21 -1
  236. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  237. package/dist/data/chat/index.d.ts +4 -1
  238. package/dist/data/chat/index.d.ts.map +1 -1
  239. package/dist/data/chat/provider-icons.cjs +15 -0
  240. package/dist/data/chat/provider-icons.cjs.map +1 -0
  241. package/dist/data/chat/provider-icons.d.ts +7 -0
  242. package/dist/data/chat/provider-icons.d.ts.map +1 -0
  243. package/dist/data/chat/provider-icons.js +15 -0
  244. package/dist/data/chat/provider-icons.js.map +1 -0
  245. package/dist/data/chat/types.cjs.map +1 -1
  246. package/dist/data/chat/types.d.ts +41 -9
  247. package/dist/data/chat/types.d.ts.map +1 -1
  248. package/dist/data/chat/types.js.map +1 -1
  249. package/dist/data/clicky-parse.cjs +42 -0
  250. package/dist/data/clicky-parse.cjs.map +1 -0
  251. package/dist/data/clicky-parse.d.ts +11 -0
  252. package/dist/data/clicky-parse.d.ts.map +1 -0
  253. package/dist/data/clicky-parse.js +42 -0
  254. package/dist/data/clicky-parse.js.map +1 -0
  255. package/dist/data/diagnostics/FrameSourceWindow.cjs +0 -4
  256. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  257. package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -11
  258. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  259. package/dist/data/diagnostics/FrameSourceWindow.js +1 -5
  260. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  261. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs +7 -0
  262. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -0
  263. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +12 -0
  264. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -0
  265. package/dist/data/diagnostics/FrameSourceWindow.utils.js +7 -0
  266. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -0
  267. package/dist/data/diagnostics/JvmStackTrace.cjs +2 -1
  268. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  269. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  270. package/dist/data/diagnostics/JvmStackTrace.js +2 -1
  271. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  272. package/dist/data/icon-fallback.cjs +12 -0
  273. package/dist/data/icon-fallback.cjs.map +1 -0
  274. package/dist/data/icon-fallback.d.ts +19 -0
  275. package/dist/data/icon-fallback.d.ts.map +1 -0
  276. package/dist/data/icon-fallback.js +12 -0
  277. package/dist/data/icon-fallback.js.map +1 -0
  278. package/dist/data/status-breakdown-utils.cjs +7 -0
  279. package/dist/data/status-breakdown-utils.cjs.map +1 -0
  280. package/dist/data/status-breakdown-utils.d.ts +4 -0
  281. package/dist/data/status-breakdown-utils.d.ts.map +1 -0
  282. package/dist/data/status-breakdown-utils.js +7 -0
  283. package/dist/data/status-breakdown-utils.js.map +1 -0
  284. package/dist/data/test-runner/TestRunSummary.cjs +36 -0
  285. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  286. package/dist/data/test-runner/TestRunSummary.d.ts +7 -1
  287. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  288. package/dist/data/test-runner/TestRunSummary.js +36 -0
  289. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  290. package/dist/data/test-runner/TestRunner.cjs +5 -3
  291. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  292. package/dist/data/test-runner/TestRunner.d.ts +13 -1
  293. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  294. package/dist/data/test-runner/TestRunner.js +5 -3
  295. package/dist/data/test-runner/TestRunner.js.map +1 -1
  296. package/dist/data/version-info.cjs +3 -3
  297. package/dist/data/version-info.js +3 -3
  298. package/dist/data.cjs +19 -6
  299. package/dist/data.cjs.map +1 -1
  300. package/dist/data.d.ts +13 -5
  301. package/dist/data.d.ts.map +1 -1
  302. package/dist/data.js +18 -5
  303. package/dist/data.js.map +1 -1
  304. package/dist/index.cjs +51 -7
  305. package/dist/index.cjs.map +1 -1
  306. package/dist/index.js +50 -6
  307. package/dist/index.js.map +1 -1
  308. package/dist/layout/AppShell.cjs +179 -29
  309. package/dist/layout/AppShell.cjs.map +1 -1
  310. package/dist/layout/AppShell.d.ts +5 -5
  311. package/dist/layout/AppShell.d.ts.map +1 -1
  312. package/dist/layout/AppShell.js +179 -29
  313. package/dist/layout/AppShell.js.map +1 -1
  314. package/dist/layout/AppSidebar.cjs +239 -0
  315. package/dist/layout/AppSidebar.cjs.map +1 -0
  316. package/dist/layout/AppSidebar.d.ts +62 -0
  317. package/dist/layout/AppSidebar.d.ts.map +1 -0
  318. package/dist/layout/AppSidebar.js +239 -0
  319. package/dist/layout/AppSidebar.js.map +1 -0
  320. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  321. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  322. package/dist/overlay/DropdownMenu.js.map +1 -1
  323. package/dist/overlay/Modal.cjs +4 -2
  324. package/dist/overlay/Modal.cjs.map +1 -1
  325. package/dist/overlay/Modal.d.ts +1 -1
  326. package/dist/overlay/Modal.d.ts.map +1 -1
  327. package/dist/overlay/Modal.js +4 -2
  328. package/dist/overlay/Modal.js.map +1 -1
  329. package/dist/overlay/Toast.cjs +89 -0
  330. package/dist/overlay/Toast.cjs.map +1 -0
  331. package/dist/overlay/Toast.d.ts +14 -0
  332. package/dist/overlay/Toast.d.ts.map +1 -0
  333. package/dist/overlay/Toast.js +89 -0
  334. package/dist/overlay/Toast.js.map +1 -0
  335. package/dist/overlay/toast-context.cjs +12 -0
  336. package/dist/overlay/toast-context.cjs.map +1 -0
  337. package/dist/overlay/toast-context.d.ts +24 -0
  338. package/dist/overlay/toast-context.d.ts.map +1 -0
  339. package/dist/overlay/toast-context.js +12 -0
  340. package/dist/overlay/toast-context.js.map +1 -0
  341. package/dist/rpc/AcceptPicker.cjs +81 -58
  342. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  343. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  344. package/dist/rpc/AcceptPicker.js +81 -58
  345. package/dist/rpc/AcceptPicker.js.map +1 -1
  346. package/dist/rpc/CommandForm.cjs +5 -35
  347. package/dist/rpc/CommandForm.cjs.map +1 -1
  348. package/dist/rpc/CommandForm.d.ts +0 -3
  349. package/dist/rpc/CommandForm.d.ts.map +1 -1
  350. package/dist/rpc/CommandForm.js +2 -32
  351. package/dist/rpc/CommandForm.js.map +1 -1
  352. package/dist/rpc/CommandOutput.cjs +2 -1
  353. package/dist/rpc/CommandOutput.cjs.map +1 -1
  354. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  355. package/dist/rpc/CommandOutput.js +2 -1
  356. package/dist/rpc/CommandOutput.js.map +1 -1
  357. package/dist/rpc/EntityExplorerApp.cjs +28 -83
  358. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  359. package/dist/rpc/EntityExplorerApp.d.ts +1 -4
  360. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  361. package/dist/rpc/EntityExplorerApp.js +13 -68
  362. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  363. package/dist/rpc/OperationCatalog.cjs +2 -2
  364. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  365. package/dist/rpc/OperationCatalog.d.ts +1 -1
  366. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  367. package/dist/rpc/OperationCatalog.js +1 -1
  368. package/dist/rpc/OperationCatalog.js.map +1 -1
  369. package/dist/rpc/OperationCommandPage.cjs +6 -4
  370. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  371. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  372. package/dist/rpc/OperationCommandPage.js +3 -1
  373. package/dist/rpc/OperationCommandPage.js.map +1 -1
  374. package/dist/rpc/RouterProvider.cjs +10 -0
  375. package/dist/rpc/RouterProvider.cjs.map +1 -0
  376. package/dist/rpc/RouterProvider.d.ts +10 -0
  377. package/dist/rpc/RouterProvider.d.ts.map +1 -0
  378. package/dist/rpc/RouterProvider.js +10 -0
  379. package/dist/rpc/RouterProvider.js.map +1 -0
  380. package/dist/rpc/apiClient.cjs +4 -4
  381. package/dist/rpc/apiClient.cjs.map +1 -1
  382. package/dist/rpc/apiClient.js +4 -4
  383. package/dist/rpc/apiClient.js.map +1 -1
  384. package/dist/rpc/command-form-utils.cjs +43 -0
  385. package/dist/rpc/command-form-utils.cjs.map +1 -0
  386. package/dist/rpc/command-form-utils.d.ts +5 -0
  387. package/dist/rpc/command-form-utils.d.ts.map +1 -0
  388. package/dist/rpc/command-form-utils.js +43 -0
  389. package/dist/rpc/command-form-utils.js.map +1 -0
  390. package/dist/rpc/commandHref.cjs +62 -0
  391. package/dist/rpc/commandHref.cjs.map +1 -0
  392. package/dist/rpc/commandHref.d.ts +7 -0
  393. package/dist/rpc/commandHref.d.ts.map +1 -0
  394. package/dist/rpc/commandHref.js +62 -0
  395. package/dist/rpc/commandHref.js.map +1 -0
  396. package/dist/rpc/formMetadata.cjs +1 -1
  397. package/dist/rpc/formMetadata.cjs.map +1 -1
  398. package/dist/rpc/formMetadata.js +1 -1
  399. package/dist/rpc/formMetadata.js.map +1 -1
  400. package/dist/rpc/router.cjs +83 -0
  401. package/dist/rpc/router.cjs.map +1 -0
  402. package/dist/rpc/router.d.ts +24 -0
  403. package/dist/rpc/router.d.ts.map +1 -0
  404. package/dist/rpc/router.js +83 -0
  405. package/dist/rpc/router.js.map +1 -0
  406. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts +3 -0
  407. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -0
  408. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts +3 -0
  409. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -0
  410. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +24 -0
  411. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -0
  412. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts +3 -0
  413. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -0
  414. package/dist/rpc/rpc-story.fixtures.d.ts +16 -0
  415. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -0
  416. package/dist/rpc.cjs +17 -0
  417. package/dist/rpc.cjs.map +1 -1
  418. package/dist/rpc.d.ts +5 -0
  419. package/dist/rpc.d.ts.map +1 -1
  420. package/dist/rpc.js +18 -1
  421. package/dist/rpc.js.map +1 -1
  422. package/dist/styles.css +1 -1
  423. package/package.json +11 -1
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const utils = require("../lib/utils.cjs");
6
+ const Icon = require("../data/Icon.cjs");
7
+ const UiSearch = require("../icons/components/UiSearch.cjs");
8
+ function SearchInput({
9
+ value,
10
+ onChange,
11
+ placeholder = "Search…",
12
+ shortcut = "⌘K",
13
+ onShortcut,
14
+ className,
15
+ ...rest
16
+ }) {
17
+ const inputRef = react.useRef(null);
18
+ const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : "k";
19
+ react.useEffect(() => {
20
+ if (!onShortcut) return;
21
+ const handler = (e) => {
22
+ var _a;
23
+ if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {
24
+ e.preventDefault();
25
+ onShortcut();
26
+ (_a = inputRef.current) == null ? void 0 : _a.focus();
27
+ }
28
+ };
29
+ window.addEventListener("keydown", handler);
30
+ return () => window.removeEventListener("keydown", handler);
31
+ }, [onShortcut, shortcutKey]);
32
+ return /* @__PURE__ */ jsxRuntime.jsxs(
33
+ "div",
34
+ {
35
+ className: utils.cn(
36
+ "flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3",
37
+ "h-control-h focus-within:ring-2 focus-within:ring-ring",
38
+ className
39
+ ),
40
+ children: [
41
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiSearch.UiSearch, className: "shrink-0 text-muted-foreground" }),
42
+ /* @__PURE__ */ jsxRuntime.jsx(
43
+ "input",
44
+ {
45
+ ref: inputRef,
46
+ type: "search",
47
+ value,
48
+ onChange: (e) => onChange(e.target.value),
49
+ placeholder,
50
+ className: utils.cn(
51
+ "min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none",
52
+ "placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none"
53
+ ),
54
+ ...rest
55
+ }
56
+ ),
57
+ shortcut && /* @__PURE__ */ jsxRuntime.jsx("kbd", { className: "shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground", children: shortcut })
58
+ ]
59
+ }
60
+ );
61
+ }
62
+ exports.SearchInput = SearchInput;
63
+ //# sourceMappingURL=SearchInput.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchInput.cjs","sources":["../../src/components/SearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\n\ntype NativeInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"size\"\n>;\n\nexport type SearchInputProps = NativeInputProps & {\n /** Controlled query value. */\n value: string;\n /** Called with the next query string. */\n onChange: (value: string) => void;\n /** Placeholder text. */\n placeholder?: string;\n /**\n * Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).\n * Pass `null` to hide it. Defaults to `⌘K`.\n */\n shortcut?: string | null;\n /**\n * When set, the matching shortcut (cmd/ctrl + the last character of\n * `shortcut`, default `k`) focuses the input from anywhere on the page.\n */\n onShortcut?: () => void;\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\n/**\n * Search field with a leading magnifier and an optional trailing keyboard-hint\n * (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When\n * `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field\n * can be focused from anywhere.\n */\nexport function SearchInput({\n value,\n onChange,\n placeholder = \"Search…\",\n shortcut = \"⌘K\",\n onShortcut,\n className,\n ...rest\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Match cmd/ctrl + the shortcut's trailing key (e.g. \"k\" from \"⌘K\").\n const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : \"k\";\n\n useEffect(() => {\n if (!onShortcut) return;\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {\n e.preventDefault();\n onShortcut();\n inputRef.current?.focus();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onShortcut, shortcutKey]);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3\",\n \"h-control-h focus-within:ring-2 focus-within:ring-ring\",\n className,\n )}\n >\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none\",\n \"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\",\n )}\n {...rest}\n />\n {shortcut && (\n <kbd className=\"shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n}\n"],"names":["useRef","useEffect","jsxs","cn","jsx","Icon","UiSearch"],"mappings":";;;;;;;AAqCO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,WAAWA,MAAAA,OAAgC,IAAI;AAGrD,QAAM,cAAc,WAAW,SAAS,MAAM,EAAE,EAAE,gBAAgB;AAElEC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,CAAC,MAAqB;;AACpC,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAA,MAAkB,aAAa;AACnE,UAAE,eAAA;AACF,mBAAA;AACA,uBAAS,YAAT,mBAAkB;AAAA,MACpB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAC,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAMC,SAAAA,UAAU,WAAU,kCAAiC;AAAA,QACjEF,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC;AAAA,YACA,WAAWD,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEL,YACCC,2BAAAA,IAAC,OAAA,EAAI,WAAU,0FACZ,UAAA,SAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
@@ -0,0 +1,31 @@
1
+ import { InputHTMLAttributes } from 'react';
2
+ type NativeInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "size">;
3
+ export type SearchInputProps = NativeInputProps & {
4
+ /** Controlled query value. */
5
+ value: string;
6
+ /** Called with the next query string. */
7
+ onChange: (value: string) => void;
8
+ /** Placeholder text. */
9
+ placeholder?: string;
10
+ /**
11
+ * Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).
12
+ * Pass `null` to hide it. Defaults to `⌘K`.
13
+ */
14
+ shortcut?: string | null;
15
+ /**
16
+ * When set, the matching shortcut (cmd/ctrl + the last character of
17
+ * `shortcut`, default `k`) focuses the input from anywhere on the page.
18
+ */
19
+ onShortcut?: () => void;
20
+ /** Classes applied to the wrapper. */
21
+ className?: string;
22
+ };
23
+ /**
24
+ * Search field with a leading magnifier and an optional trailing keyboard-hint
25
+ * (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When
26
+ * `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field
27
+ * can be focused from anywhere.
28
+ */
29
+ export declare function SearchInput({ value, onChange, placeholder, shortcut, onShortcut, className, ...rest }: SearchInputProps): import("react/jsx-runtime").JSX.Element;
30
+ export {};
31
+ //# sourceMappingURL=SearchInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../../src/components/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAKpE,KAAK,gBAAgB,GAAG,IAAI,CAC1B,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,OAAO,GAAG,UAAU,GAAG,MAAM,CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG;IAChD,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAuB,EACvB,QAAe,EACf,UAAU,EACV,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CA+ClB"}
@@ -0,0 +1,63 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useRef, useEffect } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { UiSearch } from "../icons/components/UiSearch.js";
6
+ function SearchInput({
7
+ value,
8
+ onChange,
9
+ placeholder = "Search…",
10
+ shortcut = "⌘K",
11
+ onShortcut,
12
+ className,
13
+ ...rest
14
+ }) {
15
+ const inputRef = useRef(null);
16
+ const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : "k";
17
+ useEffect(() => {
18
+ if (!onShortcut) return;
19
+ const handler = (e) => {
20
+ var _a;
21
+ if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {
22
+ e.preventDefault();
23
+ onShortcut();
24
+ (_a = inputRef.current) == null ? void 0 : _a.focus();
25
+ }
26
+ };
27
+ window.addEventListener("keydown", handler);
28
+ return () => window.removeEventListener("keydown", handler);
29
+ }, [onShortcut, shortcutKey]);
30
+ return /* @__PURE__ */ jsxs(
31
+ "div",
32
+ {
33
+ className: cn(
34
+ "flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3",
35
+ "h-control-h focus-within:ring-2 focus-within:ring-ring",
36
+ className
37
+ ),
38
+ children: [
39
+ /* @__PURE__ */ jsx(Icon, { icon: UiSearch, className: "shrink-0 text-muted-foreground" }),
40
+ /* @__PURE__ */ jsx(
41
+ "input",
42
+ {
43
+ ref: inputRef,
44
+ type: "search",
45
+ value,
46
+ onChange: (e) => onChange(e.target.value),
47
+ placeholder,
48
+ className: cn(
49
+ "min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none",
50
+ "placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none"
51
+ ),
52
+ ...rest
53
+ }
54
+ ),
55
+ shortcut && /* @__PURE__ */ jsx("kbd", { className: "shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground", children: shortcut })
56
+ ]
57
+ }
58
+ );
59
+ }
60
+ export {
61
+ SearchInput
62
+ };
63
+ //# sourceMappingURL=SearchInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchInput.js","sources":["../../src/components/SearchInput.tsx"],"sourcesContent":["import { useEffect, useRef, type InputHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\n\ntype NativeInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"size\"\n>;\n\nexport type SearchInputProps = NativeInputProps & {\n /** Controlled query value. */\n value: string;\n /** Called with the next query string. */\n onChange: (value: string) => void;\n /** Placeholder text. */\n placeholder?: string;\n /**\n * Keyboard-shortcut hint rendered as a trailing `<kbd>` (Gavel's `⌘K`).\n * Pass `null` to hide it. Defaults to `⌘K`.\n */\n shortcut?: string | null;\n /**\n * When set, the matching shortcut (cmd/ctrl + the last character of\n * `shortcut`, default `k`) focuses the input from anywhere on the page.\n */\n onShortcut?: () => void;\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\n/**\n * Search field with a leading magnifier and an optional trailing keyboard-hint\n * (the Gavel app-bar `⌘K` search). Controlled. Built on clicky tokens. When\n * `onShortcut` is provided, a global cmd/ctrl+K listener is wired so the field\n * can be focused from anywhere.\n */\nexport function SearchInput({\n value,\n onChange,\n placeholder = \"Search…\",\n shortcut = \"⌘K\",\n onShortcut,\n className,\n ...rest\n}: SearchInputProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Match cmd/ctrl + the shortcut's trailing key (e.g. \"k\" from \"⌘K\").\n const shortcutKey = shortcut ? shortcut.slice(-1).toLowerCase() : \"k\";\n\n useEffect(() => {\n if (!onShortcut) return;\n const handler = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === shortcutKey) {\n e.preventDefault();\n onShortcut();\n inputRef.current?.focus();\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onShortcut, shortcutKey]);\n\n return (\n <div\n className={cn(\n \"flex items-center gap-density-2 rounded-md border border-border bg-secondary px-density-3\",\n \"h-control-h focus-within:ring-2 focus-within:ring-ring\",\n className,\n )}\n >\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"search\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 border-none bg-transparent text-sm text-foreground outline-none\",\n \"placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:appearance-none\",\n )}\n {...rest}\n />\n {shortcut && (\n <kbd className=\"shrink-0 rounded border border-border px-1 font-mono text-[10px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAqCO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,WAAW,OAAgC,IAAI;AAGrD,QAAM,cAAc,WAAW,SAAS,MAAM,EAAE,EAAE,gBAAgB;AAElE,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,UAAM,UAAU,CAAC,MAAqB;;AACpC,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAA,MAAkB,aAAa;AACnE,UAAE,eAAA;AACF,mBAAA;AACA,uBAAS,YAAT,mBAAkB;AAAA,MACpB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,OAAO;AAC1C,WAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,EAC5D,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAM,UAAU,WAAU,kCAAiC;AAAA,QACjE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAED,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAEL,YACC,oBAAC,OAAA,EAAI,WAAU,0FACZ,UAAA,SAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const utils = require("../lib/utils.cjs");
6
+ const Icon = require("../data/Icon.cjs");
7
+ const SIZE_CLASSES = {
8
+ sm: "text-xs px-density-2 py-density-1 gap-1",
9
+ md: "text-sm px-density-3 py-1.5 gap-1.5"
10
+ };
11
+ function SegmentedControl({
12
+ value,
13
+ options,
14
+ onChange,
15
+ size = "md",
16
+ className,
17
+ "aria-label": ariaLabel
18
+ }) {
19
+ const btnRefs = react.useRef([]);
20
+ const move = (from, dir) => {
21
+ var _a;
22
+ const n = options.length;
23
+ let i = from;
24
+ for (let step = 0; step < n; step++) {
25
+ i = (i + dir + n) % n;
26
+ const opt = options[i];
27
+ if (opt && !opt.disabled) {
28
+ onChange(opt.id);
29
+ (_a = btnRefs.current[i]) == null ? void 0 : _a.focus();
30
+ return;
31
+ }
32
+ }
33
+ };
34
+ return /* @__PURE__ */ jsxRuntime.jsx(
35
+ "div",
36
+ {
37
+ role: "radiogroup",
38
+ "aria-label": ariaLabel,
39
+ className: utils.cn("inline-flex items-center rounded-md bg-muted p-0.5", className),
40
+ children: options.map((option, index) => {
41
+ const active = option.id === value;
42
+ return /* @__PURE__ */ jsxRuntime.jsxs(
43
+ "button",
44
+ {
45
+ ref: (el) => {
46
+ btnRefs.current[index] = el;
47
+ },
48
+ type: "button",
49
+ role: "radio",
50
+ "aria-checked": active,
51
+ title: option.title,
52
+ disabled: option.disabled,
53
+ tabIndex: active ? 0 : -1,
54
+ onClick: () => !option.disabled && onChange(option.id),
55
+ onKeyDown: (e) => {
56
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
57
+ e.preventDefault();
58
+ move(index, 1);
59
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
60
+ e.preventDefault();
61
+ move(index, -1);
62
+ }
63
+ },
64
+ className: utils.cn(
65
+ "inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors",
66
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
67
+ "disabled:cursor-not-allowed disabled:opacity-50",
68
+ SIZE_CLASSES[size],
69
+ active ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
70
+ ),
71
+ children: [
72
+ option.icon && /* @__PURE__ */ jsxRuntime.jsx(
73
+ Icon.Icon,
74
+ {
75
+ ...typeof option.icon === "string" ? { name: option.icon } : { icon: option.icon }
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: option.label })
79
+ ]
80
+ },
81
+ option.id
82
+ );
83
+ })
84
+ }
85
+ );
86
+ }
87
+ exports.SegmentedControl = SegmentedControl;
88
+ //# sourceMappingURL=SegmentedControl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.cjs","sources":["../../src/components/SegmentedControl.tsx"],"sourcesContent":["import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\n\nexport type SegmentedSize = \"sm\" | \"md\";\n\nexport type SegmentedOption<T extends string = string> = {\n /** Stable value emitted on selection. */\n id: T;\n /** Visible label. */\n label: ReactNode;\n /** Optional leading icon (imported `Ui*` component or runtime name). */\n icon?: string | StaticIconComponent;\n /** Native title attribute. */\n title?: string;\n /** Disable this segment. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Currently selected option id. */\n value: T;\n /** Mutually-exclusive options rendered left to right. */\n options: SegmentedOption<T>[];\n /** Called with the newly selected id. */\n onChange: (id: T) => void;\n /** Control size. `md` (default) matches form controls; `sm` is denser. */\n size?: SegmentedSize;\n /** Accessible group label. */\n \"aria-label\"?: string;\n /** Classes applied to the track. */\n className?: string;\n};\n\nconst SIZE_CLASSES: Record<SegmentedSize, string> = {\n sm: \"text-xs px-density-2 py-density-1 gap-1\",\n md: \"text-sm px-density-3 py-1.5 gap-1.5\",\n};\n\n/**\n * Single-select toggle group (the Gavel `Segmented` \"Mine / All / Bots\"\n * pattern). A muted track holds mutually-exclusive segments; the active\n * segment lifts onto the card surface. Built on clicky tokens so it inherits\n * dark-mode and density. Use for small, flat choice sets — reach for `Select`\n * when the option count grows.\n */\nexport function SegmentedControl<T extends string = string>({\n value,\n options,\n onChange,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps<T>) {\n const btnRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const move = (from: number, dir: 1 | -1) => {\n const n = options.length;\n let i = from;\n for (let step = 0; step < n; step++) {\n i = (i + dir + n) % n;\n const opt = options[i];\n if (opt && !opt.disabled) {\n onChange(opt.id);\n btnRefs.current[i]?.focus();\n return;\n }\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex items-center rounded-md bg-muted p-0.5\", className)}\n >\n {options.map((option, index) => {\n const active = option.id === value;\n return (\n <button\n key={option.id}\n ref={(el) => {\n btnRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n title={option.title}\n disabled={option.disabled}\n tabIndex={active ? 0 : -1}\n onClick={() => !option.disabled && onChange(option.id)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n move(index, 1);\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n move(index, -1);\n }\n }}\n className={cn(\n \"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n SIZE_CLASSES[size],\n active\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {option.icon && (\n <Icon\n {...(typeof option.icon === \"string\" ? { name: option.icon } : { icon: option.icon })}\n />\n )}\n <span>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["useRef","jsx","cn","jsxs","Icon"],"mappings":";;;;;;AAkCA,MAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AACN;AASO,SAAS,iBAA4C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAChB,GAA6B;AAC3B,QAAM,UAAUA,MAAAA,OAAqC,EAAE;AAEvD,QAAM,OAAO,CAAC,MAAc,QAAgB;;AAC1C,UAAM,IAAI,QAAQ;AAClB,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,WAAK,IAAI,MAAM,KAAK;AACpB,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,OAAO,CAAC,IAAI,UAAU;AACxB,iBAAS,IAAI,EAAE;AACf,sBAAQ,QAAQ,CAAC,MAAjB,mBAAoB;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAWC,MAAAA,GAAG,sDAAsD,SAAS;AAAA,MAE5E,UAAA,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,SAAS,OAAO,OAAO;AAC7B,eACEC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,sBAAQ,QAAQ,KAAK,IAAI;AAAA,YAC3B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,OAAO,OAAO;AAAA,YACd,UAAU,OAAO;AAAA,YACjB,UAAU,SAAS,IAAI;AAAA,YACvB,SAAS,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO,EAAE;AAAA,YACrD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,kBAAE,eAAA;AACF,qBAAK,OAAO,CAAC;AAAA,cACf,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AACvD,kBAAE,eAAA;AACF,qBAAK,OAAO,EAAE;AAAA,cAChB;AAAA,YACF;AAAA,YACA,WAAWD,MAAAA;AAAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,IAAI;AAAA,cACjB,SACI,sCACA;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA,OAAO,QACND,2BAAAA;AAAAA,gBAACG,KAAAA;AAAAA,gBAAA;AAAA,kBACE,GAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAM,OAAO,KAAA,IAAS,EAAE,MAAM,OAAO,KAAA;AAAA,gBAAK;AAAA,cAAA;AAAA,cAGvFH,2BAAAA,IAAC,QAAA,EAAM,UAAA,OAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAnCf,OAAO;AAAA,QAAA;AAAA,MAsClB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
@@ -0,0 +1,38 @@
1
+ import { ReactNode } from 'react';
2
+ import { StaticIconComponent } from '../data/Icon';
3
+ export type SegmentedSize = "sm" | "md";
4
+ export type SegmentedOption<T extends string = string> = {
5
+ /** Stable value emitted on selection. */
6
+ id: T;
7
+ /** Visible label. */
8
+ label: ReactNode;
9
+ /** Optional leading icon (imported `Ui*` component or runtime name). */
10
+ icon?: string | StaticIconComponent;
11
+ /** Native title attribute. */
12
+ title?: string;
13
+ /** Disable this segment. */
14
+ disabled?: boolean;
15
+ };
16
+ export type SegmentedControlProps<T extends string = string> = {
17
+ /** Currently selected option id. */
18
+ value: T;
19
+ /** Mutually-exclusive options rendered left to right. */
20
+ options: SegmentedOption<T>[];
21
+ /** Called with the newly selected id. */
22
+ onChange: (id: T) => void;
23
+ /** Control size. `md` (default) matches form controls; `sm` is denser. */
24
+ size?: SegmentedSize;
25
+ /** Accessible group label. */
26
+ "aria-label"?: string;
27
+ /** Classes applied to the track. */
28
+ className?: string;
29
+ };
30
+ /**
31
+ * Single-select toggle group (the Gavel `Segmented` "Mine / All / Bots"
32
+ * pattern). A muted track holds mutually-exclusive segments; the active
33
+ * segment lifts onto the card surface. Built on clicky tokens so it inherits
34
+ * dark-mode and density. Use for small, flat choice sets — reach for `Select`
35
+ * when the option count grows.
36
+ */
37
+ export declare function SegmentedControl<T extends string = string>({ value, options, onChange, size, className, "aria-label": ariaLabel, }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
38
+ //# sourceMappingURL=SegmentedControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/components/SegmentedControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACvD,yCAAyC;IACzC,EAAE,EAAE,CAAC,CAAC;IACN,qBAAqB;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7D,oCAAoC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,yDAAyD;IACzD,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC;IAC1B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAOF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EAC1D,KAAK,EACL,OAAO,EACP,QAAQ,EACR,IAAW,EACX,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,qBAAqB,CAAC,CAAC,CAAC,2CAoE1B"}
@@ -0,0 +1,88 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRef } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ const SIZE_CLASSES = {
6
+ sm: "text-xs px-density-2 py-density-1 gap-1",
7
+ md: "text-sm px-density-3 py-1.5 gap-1.5"
8
+ };
9
+ function SegmentedControl({
10
+ value,
11
+ options,
12
+ onChange,
13
+ size = "md",
14
+ className,
15
+ "aria-label": ariaLabel
16
+ }) {
17
+ const btnRefs = useRef([]);
18
+ const move = (from, dir) => {
19
+ var _a;
20
+ const n = options.length;
21
+ let i = from;
22
+ for (let step = 0; step < n; step++) {
23
+ i = (i + dir + n) % n;
24
+ const opt = options[i];
25
+ if (opt && !opt.disabled) {
26
+ onChange(opt.id);
27
+ (_a = btnRefs.current[i]) == null ? void 0 : _a.focus();
28
+ return;
29
+ }
30
+ }
31
+ };
32
+ return /* @__PURE__ */ jsx(
33
+ "div",
34
+ {
35
+ role: "radiogroup",
36
+ "aria-label": ariaLabel,
37
+ className: cn("inline-flex items-center rounded-md bg-muted p-0.5", className),
38
+ children: options.map((option, index) => {
39
+ const active = option.id === value;
40
+ return /* @__PURE__ */ jsxs(
41
+ "button",
42
+ {
43
+ ref: (el) => {
44
+ btnRefs.current[index] = el;
45
+ },
46
+ type: "button",
47
+ role: "radio",
48
+ "aria-checked": active,
49
+ title: option.title,
50
+ disabled: option.disabled,
51
+ tabIndex: active ? 0 : -1,
52
+ onClick: () => !option.disabled && onChange(option.id),
53
+ onKeyDown: (e) => {
54
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
55
+ e.preventDefault();
56
+ move(index, 1);
57
+ } else if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
58
+ e.preventDefault();
59
+ move(index, -1);
60
+ }
61
+ },
62
+ className: cn(
63
+ "inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors",
64
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
65
+ "disabled:cursor-not-allowed disabled:opacity-50",
66
+ SIZE_CLASSES[size],
67
+ active ? "bg-card text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
68
+ ),
69
+ children: [
70
+ option.icon && /* @__PURE__ */ jsx(
71
+ Icon,
72
+ {
73
+ ...typeof option.icon === "string" ? { name: option.icon } : { icon: option.icon }
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx("span", { children: option.label })
77
+ ]
78
+ },
79
+ option.id
80
+ );
81
+ })
82
+ }
83
+ );
84
+ }
85
+ export {
86
+ SegmentedControl
87
+ };
88
+ //# sourceMappingURL=SegmentedControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.js","sources":["../../src/components/SegmentedControl.tsx"],"sourcesContent":["import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\n\nexport type SegmentedSize = \"sm\" | \"md\";\n\nexport type SegmentedOption<T extends string = string> = {\n /** Stable value emitted on selection. */\n id: T;\n /** Visible label. */\n label: ReactNode;\n /** Optional leading icon (imported `Ui*` component or runtime name). */\n icon?: string | StaticIconComponent;\n /** Native title attribute. */\n title?: string;\n /** Disable this segment. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Currently selected option id. */\n value: T;\n /** Mutually-exclusive options rendered left to right. */\n options: SegmentedOption<T>[];\n /** Called with the newly selected id. */\n onChange: (id: T) => void;\n /** Control size. `md` (default) matches form controls; `sm` is denser. */\n size?: SegmentedSize;\n /** Accessible group label. */\n \"aria-label\"?: string;\n /** Classes applied to the track. */\n className?: string;\n};\n\nconst SIZE_CLASSES: Record<SegmentedSize, string> = {\n sm: \"text-xs px-density-2 py-density-1 gap-1\",\n md: \"text-sm px-density-3 py-1.5 gap-1.5\",\n};\n\n/**\n * Single-select toggle group (the Gavel `Segmented` \"Mine / All / Bots\"\n * pattern). A muted track holds mutually-exclusive segments; the active\n * segment lifts onto the card surface. Built on clicky tokens so it inherits\n * dark-mode and density. Use for small, flat choice sets — reach for `Select`\n * when the option count grows.\n */\nexport function SegmentedControl<T extends string = string>({\n value,\n options,\n onChange,\n size = \"md\",\n className,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps<T>) {\n const btnRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const move = (from: number, dir: 1 | -1) => {\n const n = options.length;\n let i = from;\n for (let step = 0; step < n; step++) {\n i = (i + dir + n) % n;\n const opt = options[i];\n if (opt && !opt.disabled) {\n onChange(opt.id);\n btnRefs.current[i]?.focus();\n return;\n }\n }\n };\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n className={cn(\"inline-flex items-center rounded-md bg-muted p-0.5\", className)}\n >\n {options.map((option, index) => {\n const active = option.id === value;\n return (\n <button\n key={option.id}\n ref={(el) => {\n btnRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n title={option.title}\n disabled={option.disabled}\n tabIndex={active ? 0 : -1}\n onClick={() => !option.disabled && onChange(option.id)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n move(index, 1);\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n move(index, -1);\n }\n }}\n className={cn(\n \"inline-flex items-center whitespace-nowrap rounded-[5px] font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n SIZE_CLASSES[size],\n active\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {option.icon && (\n <Icon\n {...(typeof option.icon === \"string\" ? { name: option.icon } : { icon: option.icon })}\n />\n )}\n <span>{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAkCA,MAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AACN;AASO,SAAS,iBAA4C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,cAAc;AAChB,GAA6B;AAC3B,QAAM,UAAU,OAAqC,EAAE;AAEvD,QAAM,OAAO,CAAC,MAAc,QAAgB;;AAC1C,UAAM,IAAI,QAAQ;AAClB,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,WAAK,IAAI,MAAM,KAAK;AACpB,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,OAAO,CAAC,IAAI,UAAU;AACxB,iBAAS,IAAI,EAAE;AACf,sBAAQ,QAAQ,CAAC,MAAjB,mBAAoB;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,GAAG,sDAAsD,SAAS;AAAA,MAE5E,UAAA,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,SAAS,OAAO,OAAO;AAC7B,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,sBAAQ,QAAQ,KAAK,IAAI;AAAA,YAC3B;AAAA,YACA,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,OAAO,OAAO;AAAA,YACd,UAAU,OAAO;AAAA,YACjB,UAAU,SAAS,IAAI;AAAA,YACvB,SAAS,MAAM,CAAC,OAAO,YAAY,SAAS,OAAO,EAAE;AAAA,YACrD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,kBAAE,eAAA;AACF,qBAAK,OAAO,CAAC;AAAA,cACf,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;AACvD,kBAAE,eAAA;AACF,qBAAK,OAAO,EAAE;AAAA,cAChB;AAAA,YACF;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,IAAI;AAAA,cACjB,SACI,sCACA;AAAA,YAAA;AAAA,YAGL,UAAA;AAAA,cAAA,OAAO,QACN;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACE,GAAI,OAAO,OAAO,SAAS,WAAW,EAAE,MAAM,OAAO,KAAA,IAAS,EAAE,MAAM,OAAO,KAAA;AAAA,gBAAK;AAAA,cAAA;AAAA,cAGvF,oBAAC,QAAA,EAAM,UAAA,OAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAnCf,OAAO;AAAA,QAAA;AAAA,MAsClB,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const utils = require("../lib/utils.cjs");
6
+ function Switch({
7
+ checked,
8
+ onChange,
9
+ disabled,
10
+ label,
11
+ className,
12
+ "aria-label": ariaLabel
13
+ }) {
14
+ const labelId = react.useId();
15
+ const track = /* @__PURE__ */ jsxRuntime.jsx(
16
+ "button",
17
+ {
18
+ type: "button",
19
+ role: "switch",
20
+ "aria-checked": checked,
21
+ "aria-label": label ? void 0 : ariaLabel,
22
+ "aria-labelledby": label ? labelId : void 0,
23
+ disabled,
24
+ onClick: () => onChange(!checked),
25
+ className: utils.cn(
26
+ "inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors",
27
+ "h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11",
28
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
29
+ "disabled:cursor-not-allowed disabled:opacity-50",
30
+ checked ? "justify-end bg-primary" : "justify-start bg-input",
31
+ !label && className
32
+ ),
33
+ children: /* @__PURE__ */ jsxRuntime.jsx(
34
+ "span",
35
+ {
36
+ className: utils.cn(
37
+ "pointer-events-none rounded-full bg-background shadow transition-all",
38
+ "h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5"
39
+ )
40
+ }
41
+ )
42
+ }
43
+ );
44
+ if (!label) return track;
45
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: utils.cn("inline-flex cursor-pointer items-center gap-density-2", className), children: [
46
+ track,
47
+ /* @__PURE__ */ jsxRuntime.jsx("span", { id: labelId, className: "text-sm text-foreground", children: label })
48
+ ] });
49
+ }
50
+ exports.Switch = Switch;
51
+ //# sourceMappingURL=Switch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.cjs","sources":["../../src/components/Switch.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SwitchProps = {\n /** Current on/off state. */\n checked: boolean;\n /** Called with the next state when toggled. */\n onChange: (checked: boolean) => void;\n /** Disable interaction. */\n disabled?: boolean;\n /** Optional clickable label rendered after the track. */\n label?: ReactNode;\n /** Accessible name when no visible `label` is given. */\n \"aria-label\"?: string;\n /** Classes applied to the wrapper (or the track when there is no label). */\n className?: string;\n};\n\n/**\n * On/off toggle switch (`role=\"switch\"`). Density-aware: the track and knob\n * scale via `density-*` variants, so it shrinks/grows with the active\n * `data-density`. The knob is positioned with flex alignment (no translate\n * math), so it stays centered at every size.\n */\nexport function Switch({\n checked,\n onChange,\n disabled,\n label,\n className,\n \"aria-label\": ariaLabel,\n}: SwitchProps) {\n const labelId = useId();\n\n const track = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors\",\n \"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n checked ? \"justify-end bg-primary\" : \"justify-start bg-input\",\n !label && className,\n )}\n >\n <span\n className={cn(\n \"pointer-events-none rounded-full bg-background shadow transition-all\",\n \"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5\",\n )}\n />\n </button>\n );\n\n if (!label) return track;\n\n return (\n <label className={cn(\"inline-flex cursor-pointer items-center gap-density-2\", className)}>\n {track}\n <span id={labelId} className=\"text-sm text-foreground\">\n {label}\n </span>\n </label>\n );\n}\n"],"names":["useId","jsx","cn"],"mappings":";;;;;AAwBO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAgB;AACd,QAAM,UAAUA,MAAAA,MAAA;AAEhB,QAAM,QACJC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY,QAAQ,SAAY;AAAA,MAChC,mBAAiB,QAAQ,UAAU;AAAA,MACnC;AAAA,MACA,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,2BAA2B;AAAA,QACrC,CAAC,SAAS;AAAA,MAAA;AAAA,MAGZ,UAAAD,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,MAAAA;AAAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAIJ,MAAI,CAAC,MAAO,QAAO;AAEnB,yCACG,SAAA,EAAM,WAAWA,MAAAA,GAAG,yDAAyD,SAAS,GACpF,UAAA;AAAA,IAAA;AAAA,mCACA,QAAA,EAAK,IAAI,SAAS,WAAU,2BAC1B,UAAA,MAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from 'react';
2
+ export type SwitchProps = {
3
+ /** Current on/off state. */
4
+ checked: boolean;
5
+ /** Called with the next state when toggled. */
6
+ onChange: (checked: boolean) => void;
7
+ /** Disable interaction. */
8
+ disabled?: boolean;
9
+ /** Optional clickable label rendered after the track. */
10
+ label?: ReactNode;
11
+ /** Accessible name when no visible `label` is given. */
12
+ "aria-label"?: string;
13
+ /** Classes applied to the wrapper (or the track when there is no label). */
14
+ className?: string;
15
+ };
16
+ /**
17
+ * On/off toggle switch (`role="switch"`). Density-aware: the track and knob
18
+ * scale via `density-*` variants, so it shrinks/grows with the active
19
+ * `data-density`. The knob is positioned with flex alignment (no translate
20
+ * math), so it stays centered at every size.
21
+ */
22
+ export declare function Switch({ checked, onChange, disabled, label, className, "aria-label": ariaLabel, }: SwitchProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=Switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../src/components/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM,MAAM,WAAW,GAAG;IACxB,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,WAAW,2CAwCb"}
@@ -0,0 +1,51 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ function Switch({
5
+ checked,
6
+ onChange,
7
+ disabled,
8
+ label,
9
+ className,
10
+ "aria-label": ariaLabel
11
+ }) {
12
+ const labelId = useId();
13
+ const track = /* @__PURE__ */ jsx(
14
+ "button",
15
+ {
16
+ type: "button",
17
+ role: "switch",
18
+ "aria-checked": checked,
19
+ "aria-label": label ? void 0 : ariaLabel,
20
+ "aria-labelledby": label ? labelId : void 0,
21
+ disabled,
22
+ onClick: () => onChange(!checked),
23
+ className: cn(
24
+ "inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors",
25
+ "h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11",
26
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
27
+ "disabled:cursor-not-allowed disabled:opacity-50",
28
+ checked ? "justify-end bg-primary" : "justify-start bg-input",
29
+ !label && className
30
+ ),
31
+ children: /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ className: cn(
35
+ "pointer-events-none rounded-full bg-background shadow transition-all",
36
+ "h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5"
37
+ )
38
+ }
39
+ )
40
+ }
41
+ );
42
+ if (!label) return track;
43
+ return /* @__PURE__ */ jsxs("label", { className: cn("inline-flex cursor-pointer items-center gap-density-2", className), children: [
44
+ track,
45
+ /* @__PURE__ */ jsx("span", { id: labelId, className: "text-sm text-foreground", children: label })
46
+ ] });
47
+ }
48
+ export {
49
+ Switch
50
+ };
51
+ //# sourceMappingURL=Switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.js","sources":["../../src/components/Switch.tsx"],"sourcesContent":["import { useId, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type SwitchProps = {\n /** Current on/off state. */\n checked: boolean;\n /** Called with the next state when toggled. */\n onChange: (checked: boolean) => void;\n /** Disable interaction. */\n disabled?: boolean;\n /** Optional clickable label rendered after the track. */\n label?: ReactNode;\n /** Accessible name when no visible `label` is given. */\n \"aria-label\"?: string;\n /** Classes applied to the wrapper (or the track when there is no label). */\n className?: string;\n};\n\n/**\n * On/off toggle switch (`role=\"switch\"`). Density-aware: the track and knob\n * scale via `density-*` variants, so it shrinks/grows with the active\n * `data-density`. The knob is positioned with flex alignment (no translate\n * math), so it stays centered at every size.\n */\nexport function Switch({\n checked,\n onChange,\n disabled,\n label,\n className,\n \"aria-label\": ariaLabel,\n}: SwitchProps) {\n const labelId = useId();\n\n const track = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label ? undefined : ariaLabel}\n aria-labelledby={label ? labelId : undefined}\n disabled={disabled}\n onClick={() => onChange(!checked)}\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full px-0.5 transition-colors\",\n \"h-5 w-9 density-compact:h-4 density-compact:w-7 density-spacious:h-6 density-spacious:w-11\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n checked ? \"justify-end bg-primary\" : \"justify-start bg-input\",\n !label && className,\n )}\n >\n <span\n className={cn(\n \"pointer-events-none rounded-full bg-background shadow transition-all\",\n \"h-4 w-4 density-compact:h-3 density-compact:w-3 density-spacious:h-5 density-spacious:w-5\",\n )}\n />\n </button>\n );\n\n if (!label) return track;\n\n return (\n <label className={cn(\"inline-flex cursor-pointer items-center gap-density-2\", className)}>\n {track}\n <span id={labelId} className=\"text-sm text-foreground\">\n {label}\n </span>\n </label>\n );\n}\n"],"names":[],"mappings":";;;AAwBO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAgB;AACd,QAAM,UAAU,MAAA;AAEhB,QAAM,QACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY,QAAQ,SAAY;AAAA,MAChC,mBAAiB,QAAQ,UAAU;AAAA,MACnC;AAAA,MACA,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,2BAA2B;AAAA,QACrC,CAAC,SAAS;AAAA,MAAA;AAAA,MAGZ,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAIJ,MAAI,CAAC,MAAO,QAAO;AAEnB,8BACG,SAAA,EAAM,WAAW,GAAG,yDAAyD,SAAS,GACpF,UAAA;AAAA,IAAA;AAAA,wBACA,QAAA,EAAK,IAAI,SAAS,WAAU,2BAC1B,UAAA,MAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}