@hanzo/ui 8.27.90 → 8.28.0

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 (698) hide show
  1. package/NOTICE +25 -0
  2. package/README.md +1 -1
  3. package/dist/backends/gui/alert-dialog.cjs +24 -6
  4. package/dist/backends/gui/alert-dialog.d.ts +11 -3
  5. package/dist/backends/gui/alert-dialog.d.ts.map +1 -1
  6. package/dist/backends/gui/alert-dialog.js +24 -6
  7. package/dist/backends/gui/alert-dialog.js.map +1 -1
  8. package/dist/backends/gui/alert.cjs +32 -1
  9. package/dist/backends/gui/alert.d.ts +36 -3
  10. package/dist/backends/gui/alert.d.ts.map +1 -1
  11. package/dist/backends/gui/alert.js +32 -2
  12. package/dist/backends/gui/alert.js.map +1 -1
  13. package/dist/backends/gui/avatar-group.cjs +28 -0
  14. package/dist/backends/gui/avatar-group.d.ts +33 -0
  15. package/dist/backends/gui/avatar-group.d.ts.map +1 -0
  16. package/dist/backends/gui/avatar-group.js +26 -0
  17. package/dist/backends/gui/avatar-group.js.map +1 -0
  18. package/dist/backends/gui/avatar.cjs +53 -3
  19. package/dist/backends/gui/avatar.d.ts +46 -4
  20. package/dist/backends/gui/avatar.d.ts.map +1 -1
  21. package/dist/backends/gui/avatar.js +52 -3
  22. package/dist/backends/gui/avatar.js.map +1 -1
  23. package/dist/backends/gui/badge.cjs +40 -2
  24. package/dist/backends/gui/badge.d.ts +7 -2
  25. package/dist/backends/gui/badge.d.ts.map +1 -1
  26. package/dist/backends/gui/badge.js +40 -2
  27. package/dist/backends/gui/badge.js.map +1 -1
  28. package/dist/backends/gui/banner.cjs +40 -1
  29. package/dist/backends/gui/banner.d.ts +36 -3
  30. package/dist/backends/gui/banner.d.ts.map +1 -1
  31. package/dist/backends/gui/banner.js +42 -4
  32. package/dist/backends/gui/banner.js.map +1 -1
  33. package/dist/backends/gui/breadcrumb.cjs +28 -10
  34. package/dist/backends/gui/breadcrumb.d.ts +20 -11
  35. package/dist/backends/gui/breadcrumb.d.ts.map +1 -1
  36. package/dist/backends/gui/breadcrumb.js +28 -10
  37. package/dist/backends/gui/breadcrumb.js.map +1 -1
  38. package/dist/backends/gui/button-group.cjs +43 -0
  39. package/dist/backends/gui/button-group.d.ts +48 -0
  40. package/dist/backends/gui/button-group.d.ts.map +1 -0
  41. package/dist/backends/gui/button-group.js +40 -0
  42. package/dist/backends/gui/button-group.js.map +1 -0
  43. package/dist/backends/gui/button.cjs +177 -4
  44. package/dist/backends/gui/button.d.ts +69 -4
  45. package/dist/backends/gui/button.d.ts.map +1 -1
  46. package/dist/backends/gui/button.js +179 -6
  47. package/dist/backends/gui/button.js.map +1 -1
  48. package/dist/backends/gui/card.cjs +50 -21
  49. package/dist/backends/gui/card.d.ts +16 -7
  50. package/dist/backends/gui/card.d.ts.map +1 -1
  51. package/dist/backends/gui/card.js +50 -21
  52. package/dist/backends/gui/card.js.map +1 -1
  53. package/dist/backends/gui/checkbox.cjs +86 -14
  54. package/dist/backends/gui/checkbox.d.ts +30 -2
  55. package/dist/backends/gui/checkbox.d.ts.map +1 -1
  56. package/dist/backends/gui/checkbox.js +87 -15
  57. package/dist/backends/gui/checkbox.js.map +1 -1
  58. package/dist/backends/gui/chip.cjs +51 -0
  59. package/dist/backends/gui/chip.d.ts +47 -0
  60. package/dist/backends/gui/chip.d.ts.map +1 -0
  61. package/dist/backends/gui/chip.js +49 -0
  62. package/dist/backends/gui/chip.js.map +1 -0
  63. package/dist/backends/gui/choice.cjs +18 -3
  64. package/dist/backends/gui/choice.d.ts +10 -2
  65. package/dist/backends/gui/choice.d.ts.map +1 -1
  66. package/dist/backends/gui/choice.js +19 -4
  67. package/dist/backends/gui/choice.js.map +1 -1
  68. package/dist/backends/gui/code-editor.cjs +16 -5
  69. package/dist/backends/gui/code-editor.d.ts +18 -1
  70. package/dist/backends/gui/code-editor.d.ts.map +1 -1
  71. package/dist/backends/gui/code-editor.js +16 -5
  72. package/dist/backends/gui/code-editor.js.map +1 -1
  73. package/dist/backends/gui/color-sample.cjs +24 -0
  74. package/dist/backends/gui/color-sample.d.ts +23 -0
  75. package/dist/backends/gui/color-sample.d.ts.map +1 -0
  76. package/dist/backends/gui/color-sample.js +22 -0
  77. package/dist/backends/gui/color-sample.js.map +1 -0
  78. package/dist/backends/gui/control.cjs +5 -3
  79. package/dist/backends/gui/control.d.ts +13 -3
  80. package/dist/backends/gui/control.d.ts.map +1 -1
  81. package/dist/backends/gui/control.js +5 -3
  82. package/dist/backends/gui/control.js.map +1 -1
  83. package/dist/backends/gui/country-select.cjs +69 -0
  84. package/dist/backends/gui/country-select.d.ts +30 -0
  85. package/dist/backends/gui/country-select.d.ts.map +1 -0
  86. package/dist/backends/gui/country-select.js +67 -0
  87. package/dist/backends/gui/country-select.js.map +1 -0
  88. package/dist/backends/gui/currency-picker.cjs +48 -0
  89. package/dist/backends/gui/currency-picker.d.ts +37 -0
  90. package/dist/backends/gui/currency-picker.d.ts.map +1 -0
  91. package/dist/backends/gui/currency-picker.js +46 -0
  92. package/dist/backends/gui/currency-picker.js.map +1 -0
  93. package/dist/backends/gui/density.cjs +32 -0
  94. package/dist/backends/gui/density.d.ts +27 -0
  95. package/dist/backends/gui/density.d.ts.map +1 -0
  96. package/dist/backends/gui/density.js +27 -0
  97. package/dist/backends/gui/density.js.map +1 -0
  98. package/dist/backends/gui/dialog.cjs +65 -7
  99. package/dist/backends/gui/dialog.d.ts +68 -3
  100. package/dist/backends/gui/dialog.d.ts.map +1 -1
  101. package/dist/backends/gui/dialog.js +63 -7
  102. package/dist/backends/gui/dialog.js.map +1 -1
  103. package/dist/backends/gui/dropdown-menu.cjs +361 -31
  104. package/dist/backends/gui/dropdown-menu.d.ts +151 -15
  105. package/dist/backends/gui/dropdown-menu.d.ts.map +1 -1
  106. package/dist/backends/gui/dropdown-menu.js +353 -34
  107. package/dist/backends/gui/dropdown-menu.js.map +1 -1
  108. package/dist/backends/gui/feedback.cjs +78 -0
  109. package/dist/backends/gui/feedback.d.ts +46 -0
  110. package/dist/backends/gui/feedback.d.ts.map +1 -0
  111. package/dist/backends/gui/feedback.js +74 -0
  112. package/dist/backends/gui/feedback.js.map +1 -0
  113. package/dist/backends/gui/field.cjs +71 -14
  114. package/dist/backends/gui/field.d.ts +43 -3
  115. package/dist/backends/gui/field.d.ts.map +1 -1
  116. package/dist/backends/gui/field.js +69 -14
  117. package/dist/backends/gui/field.js.map +1 -1
  118. package/dist/backends/gui/flag.cjs +17 -0
  119. package/dist/backends/gui/flag.d.ts +9 -0
  120. package/dist/backends/gui/flag.d.ts.map +1 -0
  121. package/dist/backends/gui/flag.js +14 -0
  122. package/dist/backends/gui/flag.js.map +1 -0
  123. package/dist/backends/gui/grip.cjs +35 -3
  124. package/dist/backends/gui/grip.d.ts +16 -1
  125. package/dist/backends/gui/grip.d.ts.map +1 -1
  126. package/dist/backends/gui/grip.js +35 -3
  127. package/dist/backends/gui/grip.js.map +1 -1
  128. package/dist/backends/gui/heading.cjs +27 -0
  129. package/dist/backends/gui/heading.d.ts +8 -0
  130. package/dist/backends/gui/heading.d.ts.map +1 -0
  131. package/dist/backends/gui/heading.js +25 -0
  132. package/dist/backends/gui/heading.js.map +1 -0
  133. package/dist/backends/gui/hue.cjs +49 -0
  134. package/dist/backends/gui/hue.d.ts +18 -0
  135. package/dist/backends/gui/hue.d.ts.map +1 -0
  136. package/dist/backends/gui/hue.js +43 -0
  137. package/dist/backends/gui/hue.js.map +1 -0
  138. package/dist/backends/gui/icon-tile.cjs +36 -0
  139. package/dist/backends/gui/icon-tile.d.ts +26 -0
  140. package/dist/backends/gui/icon-tile.d.ts.map +1 -0
  141. package/dist/backends/gui/icon-tile.js +32 -0
  142. package/dist/backends/gui/icon-tile.js.map +1 -0
  143. package/dist/backends/gui/image-input.cjs +78 -0
  144. package/dist/backends/gui/image-input.d.ts +32 -0
  145. package/dist/backends/gui/image-input.d.ts.map +1 -0
  146. package/dist/backends/gui/image-input.js +74 -0
  147. package/dist/backends/gui/image-input.js.map +1 -0
  148. package/dist/backends/gui/index.cjs +93 -7
  149. package/dist/backends/gui/index.d.ts +45 -2
  150. package/dist/backends/gui/index.d.ts.map +1 -1
  151. package/dist/backends/gui/index.js +35 -1
  152. package/dist/backends/gui/index.js.map +1 -1
  153. package/dist/backends/gui/input-group.cjs +49 -0
  154. package/dist/backends/gui/input-group.d.ts +46 -0
  155. package/dist/backends/gui/input-group.d.ts.map +1 -0
  156. package/dist/backends/gui/input-group.js +46 -0
  157. package/dist/backends/gui/input-group.js.map +1 -0
  158. package/dist/backends/gui/input.cjs +32 -4
  159. package/dist/backends/gui/input.d.ts +5 -1
  160. package/dist/backends/gui/input.d.ts.map +1 -1
  161. package/dist/backends/gui/input.js +33 -5
  162. package/dist/backends/gui/input.js.map +1 -1
  163. package/dist/backends/gui/item.cjs +34 -2
  164. package/dist/backends/gui/item.d.ts +21 -5
  165. package/dist/backends/gui/item.d.ts.map +1 -1
  166. package/dist/backends/gui/item.js +35 -3
  167. package/dist/backends/gui/item.js.map +1 -1
  168. package/dist/backends/gui/json-tree.cjs +103 -15
  169. package/dist/backends/gui/json-tree.d.ts +39 -3
  170. package/dist/backends/gui/json-tree.d.ts.map +1 -1
  171. package/dist/backends/gui/json-tree.js +104 -16
  172. package/dist/backends/gui/json-tree.js.map +1 -1
  173. package/dist/backends/gui/kbd.cjs +18 -2
  174. package/dist/backends/gui/kbd.d.ts +5 -2
  175. package/dist/backends/gui/kbd.d.ts.map +1 -1
  176. package/dist/backends/gui/kbd.js +18 -2
  177. package/dist/backends/gui/kbd.js.map +1 -1
  178. package/dist/backends/gui/label.cjs +14 -3
  179. package/dist/backends/gui/label.d.ts +12 -3
  180. package/dist/backends/gui/label.d.ts.map +1 -1
  181. package/dist/backends/gui/label.js +14 -3
  182. package/dist/backends/gui/label.js.map +1 -1
  183. package/dist/backends/gui/layout.cjs +5 -1
  184. package/dist/backends/gui/layout.d.ts +1 -1
  185. package/dist/backends/gui/layout.d.ts.map +1 -1
  186. package/dist/backends/gui/layout.js +5 -1
  187. package/dist/backends/gui/layout.js.map +1 -1
  188. package/dist/backends/gui/number-field.cjs +163 -0
  189. package/dist/backends/gui/number-field.d.ts +34 -0
  190. package/dist/backends/gui/number-field.d.ts.map +1 -0
  191. package/dist/backends/gui/number-field.js +160 -0
  192. package/dist/backends/gui/number-field.js.map +1 -0
  193. package/dist/backends/gui/overflowing-list.cjs +79 -0
  194. package/dist/backends/gui/overflowing-list.d.ts +42 -0
  195. package/dist/backends/gui/overflowing-list.d.ts.map +1 -0
  196. package/dist/backends/gui/overflowing-list.js +76 -0
  197. package/dist/backends/gui/overflowing-list.js.map +1 -0
  198. package/dist/backends/gui/phone-country-picker.cjs +60 -0
  199. package/dist/backends/gui/phone-country-picker.d.ts +34 -0
  200. package/dist/backends/gui/phone-country-picker.d.ts.map +1 -0
  201. package/dist/backends/gui/phone-country-picker.js +57 -0
  202. package/dist/backends/gui/phone-country-picker.js.map +1 -0
  203. package/dist/backends/gui/popover.cjs +20 -4
  204. package/dist/backends/gui/popover.d.ts +12 -1
  205. package/dist/backends/gui/popover.d.ts.map +1 -1
  206. package/dist/backends/gui/popover.js +21 -5
  207. package/dist/backends/gui/popover.js.map +1 -1
  208. package/dist/backends/gui/progress-ring.cjs +38 -0
  209. package/dist/backends/gui/progress-ring.d.ts +37 -0
  210. package/dist/backends/gui/progress-ring.d.ts.map +1 -0
  211. package/dist/backends/gui/progress-ring.js +36 -0
  212. package/dist/backends/gui/progress-ring.js.map +1 -0
  213. package/dist/backends/gui/progress.cjs +31 -7
  214. package/dist/backends/gui/progress.d.ts +25 -3
  215. package/dist/backends/gui/progress.d.ts.map +1 -1
  216. package/dist/backends/gui/progress.js +32 -8
  217. package/dist/backends/gui/progress.js.map +1 -1
  218. package/dist/backends/gui/radio-group.cjs +28 -2
  219. package/dist/backends/gui/radio-group.d.ts +20 -2
  220. package/dist/backends/gui/radio-group.d.ts.map +1 -1
  221. package/dist/backends/gui/radio-group.js +28 -2
  222. package/dist/backends/gui/radio-group.js.map +1 -1
  223. package/dist/backends/gui/search-list.cjs +62 -0
  224. package/dist/backends/gui/search-list.d.ts +65 -0
  225. package/dist/backends/gui/search-list.d.ts.map +1 -0
  226. package/dist/backends/gui/search-list.js +58 -0
  227. package/dist/backends/gui/search-list.js.map +1 -0
  228. package/dist/backends/gui/select.cjs +50 -16
  229. package/dist/backends/gui/select.d.ts +12 -3
  230. package/dist/backends/gui/select.d.ts.map +1 -1
  231. package/dist/backends/gui/select.js +51 -17
  232. package/dist/backends/gui/select.js.map +1 -1
  233. package/dist/backends/gui/shortcut.cjs +122 -0
  234. package/dist/backends/gui/shortcut.d.ts +58 -0
  235. package/dist/backends/gui/shortcut.d.ts.map +1 -0
  236. package/dist/backends/gui/shortcut.js +115 -0
  237. package/dist/backends/gui/shortcut.js.map +1 -0
  238. package/dist/backends/gui/skeleton.cjs +41 -10
  239. package/dist/backends/gui/skeleton.d.ts +46 -8
  240. package/dist/backends/gui/skeleton.d.ts.map +1 -1
  241. package/dist/backends/gui/skeleton.js +39 -8
  242. package/dist/backends/gui/skeleton.js.map +1 -1
  243. package/dist/backends/gui/snippet.cjs +12 -1
  244. package/dist/backends/gui/snippet.d.ts +4 -2
  245. package/dist/backends/gui/snippet.d.ts.map +1 -1
  246. package/dist/backends/gui/snippet.js +12 -1
  247. package/dist/backends/gui/snippet.js.map +1 -1
  248. package/dist/backends/gui/spinner.cjs +8 -1
  249. package/dist/backends/gui/spinner.d.ts +11 -2
  250. package/dist/backends/gui/spinner.d.ts.map +1 -1
  251. package/dist/backends/gui/spinner.js +9 -2
  252. package/dist/backends/gui/spinner.js.map +1 -1
  253. package/dist/backends/gui/stack-icon.cjs +17 -0
  254. package/dist/backends/gui/stack-icon.d.ts +15 -0
  255. package/dist/backends/gui/stack-icon.d.ts.map +1 -0
  256. package/dist/backends/gui/stack-icon.js +15 -0
  257. package/dist/backends/gui/stack-icon.js.map +1 -0
  258. package/dist/backends/gui/status.cjs +38 -1
  259. package/dist/backends/gui/status.d.ts +16 -2
  260. package/dist/backends/gui/status.d.ts.map +1 -1
  261. package/dist/backends/gui/status.js +38 -2
  262. package/dist/backends/gui/status.js.map +1 -1
  263. package/dist/backends/gui/stepper.cjs +73 -3
  264. package/dist/backends/gui/stepper.d.ts +25 -1
  265. package/dist/backends/gui/stepper.d.ts.map +1 -1
  266. package/dist/backends/gui/stepper.js +71 -5
  267. package/dist/backends/gui/stepper.js.map +1 -1
  268. package/dist/backends/gui/switch.cjs +35 -20
  269. package/dist/backends/gui/switch.d.ts +12 -2
  270. package/dist/backends/gui/switch.d.ts.map +1 -1
  271. package/dist/backends/gui/switch.js +35 -20
  272. package/dist/backends/gui/switch.js.map +1 -1
  273. package/dist/backends/gui/tabs.cjs +63 -17
  274. package/dist/backends/gui/tabs.d.ts +35 -6
  275. package/dist/backends/gui/tabs.d.ts.map +1 -1
  276. package/dist/backends/gui/tabs.js +65 -19
  277. package/dist/backends/gui/tabs.js.map +1 -1
  278. package/dist/backends/gui/tag.cjs +48 -0
  279. package/dist/backends/gui/tag.d.ts +53 -0
  280. package/dist/backends/gui/tag.d.ts.map +1 -0
  281. package/dist/backends/gui/tag.js +46 -0
  282. package/dist/backends/gui/tag.js.map +1 -0
  283. package/dist/backends/gui/tags.cjs +9 -2
  284. package/dist/backends/gui/tags.d.ts +6 -5
  285. package/dist/backends/gui/tags.d.ts.map +1 -1
  286. package/dist/backends/gui/tags.js +9 -2
  287. package/dist/backends/gui/tags.js.map +1 -1
  288. package/dist/backends/gui/textarea.cjs +22 -6
  289. package/dist/backends/gui/textarea.d.ts +10 -1
  290. package/dist/backends/gui/textarea.d.ts.map +1 -1
  291. package/dist/backends/gui/textarea.js +22 -6
  292. package/dist/backends/gui/textarea.js.map +1 -1
  293. package/dist/backends/gui/toaster.cjs +167 -3
  294. package/dist/backends/gui/toaster.d.ts +28 -2
  295. package/dist/backends/gui/toaster.d.ts.map +1 -1
  296. package/dist/backends/gui/toaster.js +167 -5
  297. package/dist/backends/gui/toaster.js.map +1 -1
  298. package/dist/backends/gui/toggle-group.cjs +13 -0
  299. package/dist/backends/gui/toggle-group.d.ts +7 -1
  300. package/dist/backends/gui/toggle-group.d.ts.map +1 -1
  301. package/dist/backends/gui/toggle-group.js +13 -0
  302. package/dist/backends/gui/toggle-group.js.map +1 -1
  303. package/dist/backends/gui/tooltip.cjs +29 -6
  304. package/dist/backends/gui/tooltip.d.ts +23 -4
  305. package/dist/backends/gui/tooltip.d.ts.map +1 -1
  306. package/dist/backends/gui/tooltip.js +31 -8
  307. package/dist/backends/gui/tooltip.js.map +1 -1
  308. package/dist/backends/gui/truncated-text.cjs +102 -0
  309. package/dist/backends/gui/truncated-text.d.ts +55 -0
  310. package/dist/backends/gui/truncated-text.d.ts.map +1 -0
  311. package/dist/backends/gui/truncated-text.js +97 -0
  312. package/dist/backends/gui/truncated-text.js.map +1 -0
  313. package/dist/gallery/compound.cjs +60 -0
  314. package/dist/gallery/compound.d.ts +2 -0
  315. package/dist/gallery/compound.d.ts.map +1 -0
  316. package/dist/gallery/compound.js +58 -0
  317. package/dist/gallery/compound.js.map +1 -0
  318. package/dist/gallery/display.cjs +47 -0
  319. package/dist/gallery/display.d.ts +3 -0
  320. package/dist/gallery/display.d.ts.map +1 -0
  321. package/dist/gallery/display.js +45 -0
  322. package/dist/gallery/display.js.map +1 -0
  323. package/dist/gallery/feedback.cjs +38 -0
  324. package/dist/gallery/feedback.d.ts +2 -0
  325. package/dist/gallery/feedback.d.ts.map +1 -0
  326. package/dist/gallery/feedback.js +36 -0
  327. package/dist/gallery/feedback.js.map +1 -0
  328. package/dist/gallery/fields.cjs +53 -0
  329. package/dist/gallery/fields.d.ts +2 -0
  330. package/dist/gallery/fields.d.ts.map +1 -0
  331. package/dist/gallery/fields.js +51 -0
  332. package/dist/gallery/fields.js.map +1 -0
  333. package/dist/gallery/frames.cjs +47 -0
  334. package/dist/gallery/frames.d.ts +2 -0
  335. package/dist/gallery/frames.d.ts.map +1 -0
  336. package/dist/gallery/frames.js +45 -0
  337. package/dist/gallery/frames.js.map +1 -0
  338. package/dist/gallery/menus.cjs +64 -0
  339. package/dist/gallery/menus.d.ts +15 -0
  340. package/dist/gallery/menus.d.ts.map +1 -0
  341. package/dist/gallery/menus.js +58 -0
  342. package/dist/gallery/menus.js.map +1 -0
  343. package/dist/gallery/records.cjs +33 -0
  344. package/dist/gallery/records.d.ts +2 -0
  345. package/dist/gallery/records.d.ts.map +1 -0
  346. package/dist/gallery/records.js +31 -0
  347. package/dist/gallery/records.js.map +1 -0
  348. package/dist/gallery/section.cjs +17 -0
  349. package/dist/gallery/section.d.ts +10 -0
  350. package/dist/gallery/section.d.ts.map +1 -0
  351. package/dist/gallery/section.js +14 -0
  352. package/dist/gallery/section.js.map +1 -0
  353. package/dist/gallery.cjs +8 -14
  354. package/dist/gallery.d.ts.map +1 -1
  355. package/dist/gallery.html +1613 -265
  356. package/dist/gallery.js +3 -9
  357. package/dist/gallery.js.map +1 -1
  358. package/dist/gui-config.cjs +37 -7
  359. package/dist/gui-config.d.ts +11 -3
  360. package/dist/gui-config.d.ts.map +1 -1
  361. package/dist/gui-config.js +37 -7
  362. package/dist/gui-config.js.map +1 -1
  363. package/dist/index.cjs +61 -2
  364. package/dist/index.d.ts +4 -2
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +7 -1
  367. package/dist/index.js.map +1 -1
  368. package/dist/index.node.cjs +61 -2
  369. package/dist/index.node.js +7 -1
  370. package/dist/motion.cjs +25 -1
  371. package/dist/motion.d.ts +16 -1
  372. package/dist/motion.d.ts.map +1 -1
  373. package/dist/motion.js +24 -1
  374. package/dist/motion.js.map +1 -1
  375. package/dist/primitives/AvatarGroup.cjs +8 -0
  376. package/dist/primitives/AvatarGroup.d.ts +2 -0
  377. package/dist/primitives/AvatarGroup.d.ts.map +1 -0
  378. package/dist/primitives/AvatarGroup.js +5 -0
  379. package/dist/primitives/AvatarGroup.js.map +1 -0
  380. package/dist/primitives/BannerAction.cjs +8 -0
  381. package/dist/primitives/BannerAction.d.ts +2 -0
  382. package/dist/primitives/BannerAction.d.ts.map +1 -0
  383. package/dist/primitives/BannerAction.js +5 -0
  384. package/dist/primitives/BannerAction.js.map +1 -0
  385. package/dist/primitives/ButtonGroup.cjs +8 -0
  386. package/dist/primitives/ButtonGroup.d.ts +2 -0
  387. package/dist/primitives/ButtonGroup.d.ts.map +1 -0
  388. package/dist/primitives/ButtonGroup.js +5 -0
  389. package/dist/primitives/ButtonGroup.js.map +1 -0
  390. package/dist/primitives/ButtonGroupContext.cjs +8 -0
  391. package/dist/primitives/ButtonGroupContext.d.ts +2 -0
  392. package/dist/primitives/ButtonGroupContext.d.ts.map +1 -0
  393. package/dist/primitives/ButtonGroupContext.js +5 -0
  394. package/dist/primitives/ButtonGroupContext.js.map +1 -0
  395. package/dist/primitives/CalloutAction.cjs +8 -0
  396. package/dist/primitives/CalloutAction.d.ts +2 -0
  397. package/dist/primitives/CalloutAction.d.ts.map +1 -0
  398. package/dist/primitives/CalloutAction.js +5 -0
  399. package/dist/primitives/CalloutAction.js.map +1 -0
  400. package/dist/primitives/Chip.cjs +8 -0
  401. package/dist/primitives/Chip.d.ts +2 -0
  402. package/dist/primitives/Chip.d.ts.map +1 -0
  403. package/dist/primitives/Chip.js +5 -0
  404. package/dist/primitives/Chip.js.map +1 -0
  405. package/dist/primitives/ColorSample.cjs +8 -0
  406. package/dist/primitives/ColorSample.d.ts +2 -0
  407. package/dist/primitives/ColorSample.d.ts.map +1 -0
  408. package/dist/primitives/ColorSample.js +5 -0
  409. package/dist/primitives/ColorSample.js.map +1 -0
  410. package/dist/primitives/CountrySelect.cjs +8 -0
  411. package/dist/primitives/CountrySelect.d.ts +2 -0
  412. package/dist/primitives/CountrySelect.d.ts.map +1 -0
  413. package/dist/primitives/CountrySelect.js +5 -0
  414. package/dist/primitives/CountrySelect.js.map +1 -0
  415. package/dist/primitives/CurrencyPicker.cjs +8 -0
  416. package/dist/primitives/CurrencyPicker.d.ts +2 -0
  417. package/dist/primitives/CurrencyPicker.d.ts.map +1 -0
  418. package/dist/primitives/CurrencyPicker.js +5 -0
  419. package/dist/primitives/CurrencyPicker.js.map +1 -0
  420. package/dist/primitives/Density.cjs +8 -0
  421. package/dist/primitives/Density.d.ts +2 -0
  422. package/dist/primitives/Density.d.ts.map +1 -0
  423. package/dist/primitives/Density.js +5 -0
  424. package/dist/primitives/Density.js.map +1 -0
  425. package/dist/primitives/DialogBody.cjs +8 -0
  426. package/dist/primitives/DialogBody.d.ts +2 -0
  427. package/dist/primitives/DialogBody.d.ts.map +1 -0
  428. package/dist/primitives/DialogBody.js +5 -0
  429. package/dist/primitives/DialogBody.js.map +1 -0
  430. package/dist/primitives/DropdownMenuBack.cjs +8 -0
  431. package/dist/primitives/DropdownMenuBack.d.ts +2 -0
  432. package/dist/primitives/DropdownMenuBack.d.ts.map +1 -0
  433. package/dist/primitives/DropdownMenuBack.js +5 -0
  434. package/dist/primitives/DropdownMenuBack.js.map +1 -0
  435. package/dist/primitives/DropdownMenuClose.cjs +8 -0
  436. package/dist/primitives/DropdownMenuClose.d.ts +2 -0
  437. package/dist/primitives/DropdownMenuClose.d.ts.map +1 -0
  438. package/dist/primitives/DropdownMenuClose.js +5 -0
  439. package/dist/primitives/DropdownMenuClose.js.map +1 -0
  440. package/dist/primitives/DropdownMenuEmpty.cjs +8 -0
  441. package/dist/primitives/DropdownMenuEmpty.d.ts +2 -0
  442. package/dist/primitives/DropdownMenuEmpty.d.ts.map +1 -0
  443. package/dist/primitives/DropdownMenuEmpty.js +5 -0
  444. package/dist/primitives/DropdownMenuEmpty.js.map +1 -0
  445. package/dist/primitives/DropdownMenuHeader.cjs +8 -0
  446. package/dist/primitives/DropdownMenuHeader.d.ts +2 -0
  447. package/dist/primitives/DropdownMenuHeader.d.ts.map +1 -0
  448. package/dist/primitives/DropdownMenuHeader.js +5 -0
  449. package/dist/primitives/DropdownMenuHeader.js.map +1 -0
  450. package/dist/primitives/DropdownMenuLoading.cjs +8 -0
  451. package/dist/primitives/DropdownMenuLoading.d.ts +2 -0
  452. package/dist/primitives/DropdownMenuLoading.d.ts.map +1 -0
  453. package/dist/primitives/DropdownMenuLoading.js +5 -0
  454. package/dist/primitives/DropdownMenuLoading.js.map +1 -0
  455. package/dist/primitives/DropdownMenuOptionItem.cjs +8 -0
  456. package/dist/primitives/DropdownMenuOptionItem.d.ts +2 -0
  457. package/dist/primitives/DropdownMenuOptionItem.d.ts.map +1 -0
  458. package/dist/primitives/DropdownMenuOptionItem.js +5 -0
  459. package/dist/primitives/DropdownMenuOptionItem.js.map +1 -0
  460. package/dist/primitives/DropdownMenuPage.cjs +8 -0
  461. package/dist/primitives/DropdownMenuPage.d.ts +2 -0
  462. package/dist/primitives/DropdownMenuPage.d.ts.map +1 -0
  463. package/dist/primitives/DropdownMenuPage.js +5 -0
  464. package/dist/primitives/DropdownMenuPage.js.map +1 -0
  465. package/dist/primitives/DropdownMenuSearch.cjs +8 -0
  466. package/dist/primitives/DropdownMenuSearch.d.ts +2 -0
  467. package/dist/primitives/DropdownMenuSearch.d.ts.map +1 -0
  468. package/dist/primitives/DropdownMenuSearch.js +5 -0
  469. package/dist/primitives/DropdownMenuSearch.js.map +1 -0
  470. package/dist/primitives/DropdownMenuSection.cjs +8 -0
  471. package/dist/primitives/DropdownMenuSection.d.ts +2 -0
  472. package/dist/primitives/DropdownMenuSection.d.ts.map +1 -0
  473. package/dist/primitives/DropdownMenuSection.js +5 -0
  474. package/dist/primitives/DropdownMenuSection.js.map +1 -0
  475. package/dist/primitives/DropdownMenuSelectionGroup.cjs +8 -0
  476. package/dist/primitives/DropdownMenuSelectionGroup.d.ts +2 -0
  477. package/dist/primitives/DropdownMenuSelectionGroup.d.ts.map +1 -0
  478. package/dist/primitives/DropdownMenuSelectionGroup.js +5 -0
  479. package/dist/primitives/DropdownMenuSelectionGroup.js.map +1 -0
  480. package/dist/primitives/DropdownMenuTitle.cjs +8 -0
  481. package/dist/primitives/DropdownMenuTitle.d.ts +2 -0
  482. package/dist/primitives/DropdownMenuTitle.d.ts.map +1 -0
  483. package/dist/primitives/DropdownMenuTitle.js +5 -0
  484. package/dist/primitives/DropdownMenuTitle.js.map +1 -0
  485. package/dist/primitives/Heading.cjs +2 -2
  486. package/dist/primitives/Heading.d.ts +1 -1
  487. package/dist/primitives/Heading.d.ts.map +1 -1
  488. package/dist/primitives/Heading.js +1 -1
  489. package/dist/primitives/Heading.js.map +1 -1
  490. package/dist/primitives/IconTile.cjs +8 -0
  491. package/dist/primitives/IconTile.d.ts +2 -0
  492. package/dist/primitives/IconTile.d.ts.map +1 -0
  493. package/dist/primitives/IconTile.js +5 -0
  494. package/dist/primitives/IconTile.js.map +1 -0
  495. package/dist/primitives/ImageInput.cjs +8 -0
  496. package/dist/primitives/ImageInput.d.ts +2 -0
  497. package/dist/primitives/ImageInput.d.ts.map +1 -0
  498. package/dist/primitives/ImageInput.js +5 -0
  499. package/dist/primitives/ImageInput.js.map +1 -0
  500. package/dist/primitives/InputGroup.cjs +8 -0
  501. package/dist/primitives/InputGroup.d.ts +2 -0
  502. package/dist/primitives/InputGroup.d.ts.map +1 -0
  503. package/dist/primitives/InputGroup.js +5 -0
  504. package/dist/primitives/InputGroup.js.map +1 -0
  505. package/dist/primitives/NumberField.cjs +8 -0
  506. package/dist/primitives/NumberField.d.ts +2 -0
  507. package/dist/primitives/NumberField.d.ts.map +1 -0
  508. package/dist/primitives/NumberField.js +5 -0
  509. package/dist/primitives/NumberField.js.map +1 -0
  510. package/dist/primitives/OverflowingList.cjs +8 -0
  511. package/dist/primitives/OverflowingList.d.ts +2 -0
  512. package/dist/primitives/OverflowingList.d.ts.map +1 -0
  513. package/dist/primitives/OverflowingList.js +5 -0
  514. package/dist/primitives/OverflowingList.js.map +1 -0
  515. package/dist/primitives/PhoneCountryPicker.cjs +8 -0
  516. package/dist/primitives/PhoneCountryPicker.d.ts +2 -0
  517. package/dist/primitives/PhoneCountryPicker.d.ts.map +1 -0
  518. package/dist/primitives/PhoneCountryPicker.js +5 -0
  519. package/dist/primitives/PhoneCountryPicker.js.map +1 -0
  520. package/dist/primitives/ProgressRing.cjs +8 -0
  521. package/dist/primitives/ProgressRing.d.ts +2 -0
  522. package/dist/primitives/ProgressRing.d.ts.map +1 -0
  523. package/dist/primitives/ProgressRing.js +5 -0
  524. package/dist/primitives/ProgressRing.js.map +1 -0
  525. package/dist/primitives/RadioCircle.cjs +8 -0
  526. package/dist/primitives/RadioCircle.d.ts +2 -0
  527. package/dist/primitives/RadioCircle.d.ts.map +1 -0
  528. package/dist/primitives/RadioCircle.js +5 -0
  529. package/dist/primitives/RadioCircle.js.map +1 -0
  530. package/dist/primitives/SKELETON_HEIGHT.cjs +8 -0
  531. package/dist/primitives/SKELETON_HEIGHT.d.ts +2 -0
  532. package/dist/primitives/SKELETON_HEIGHT.d.ts.map +1 -0
  533. package/dist/primitives/SKELETON_HEIGHT.js +5 -0
  534. package/dist/primitives/SKELETON_HEIGHT.js.map +1 -0
  535. package/dist/primitives/STATUS_COLOR.cjs +8 -0
  536. package/dist/primitives/STATUS_COLOR.d.ts +2 -0
  537. package/dist/primitives/STATUS_COLOR.d.ts.map +1 -0
  538. package/dist/primitives/STATUS_COLOR.js +5 -0
  539. package/dist/primitives/STATUS_COLOR.js.map +1 -0
  540. package/dist/primitives/STATUS_HUE.cjs +8 -0
  541. package/dist/primitives/STATUS_HUE.d.ts +2 -0
  542. package/dist/primitives/STATUS_HUE.d.ts.map +1 -0
  543. package/dist/primitives/STATUS_HUE.js +5 -0
  544. package/dist/primitives/STATUS_HUE.js.map +1 -0
  545. package/dist/primitives/STATUS_PAINT.cjs +8 -0
  546. package/dist/primitives/STATUS_PAINT.d.ts +2 -0
  547. package/dist/primitives/STATUS_PAINT.d.ts.map +1 -0
  548. package/dist/primitives/STATUS_PAINT.js +5 -0
  549. package/dist/primitives/STATUS_PAINT.js.map +1 -0
  550. package/dist/primitives/Shortcut.cjs +8 -0
  551. package/dist/primitives/Shortcut.d.ts +2 -0
  552. package/dist/primitives/Shortcut.d.ts.map +1 -0
  553. package/dist/primitives/Shortcut.js +5 -0
  554. package/dist/primitives/Shortcut.js.map +1 -0
  555. package/dist/primitives/StackIcon.cjs +8 -0
  556. package/dist/primitives/StackIcon.d.ts +2 -0
  557. package/dist/primitives/StackIcon.d.ts.map +1 -0
  558. package/dist/primitives/StackIcon.js +5 -0
  559. package/dist/primitives/StackIcon.js.map +1 -0
  560. package/dist/primitives/TOAST_DURATION.cjs +8 -0
  561. package/dist/primitives/TOAST_DURATION.d.ts +2 -0
  562. package/dist/primitives/TOAST_DURATION.d.ts.map +1 -0
  563. package/dist/primitives/TOAST_DURATION.js +5 -0
  564. package/dist/primitives/TOAST_DURATION.js.map +1 -0
  565. package/dist/primitives/Tag.cjs +8 -0
  566. package/dist/primitives/Tag.d.ts +2 -0
  567. package/dist/primitives/Tag.d.ts.map +1 -0
  568. package/dist/primitives/Tag.js +5 -0
  569. package/dist/primitives/Tag.js.map +1 -0
  570. package/dist/primitives/ToastCard.cjs +8 -0
  571. package/dist/primitives/ToastCard.d.ts +2 -0
  572. package/dist/primitives/ToastCard.d.ts.map +1 -0
  573. package/dist/primitives/ToastCard.js +5 -0
  574. package/dist/primitives/ToastCard.js.map +1 -0
  575. package/dist/primitives/ToastFace.cjs +8 -0
  576. package/dist/primitives/ToastFace.d.ts +2 -0
  577. package/dist/primitives/ToastFace.d.ts.map +1 -0
  578. package/dist/primitives/ToastFace.js +5 -0
  579. package/dist/primitives/ToastFace.js.map +1 -0
  580. package/dist/primitives/TruncatedText.cjs +8 -0
  581. package/dist/primitives/TruncatedText.d.ts +2 -0
  582. package/dist/primitives/TruncatedText.d.ts.map +1 -0
  583. package/dist/primitives/TruncatedText.js +5 -0
  584. package/dist/primitives/TruncatedText.js.map +1 -0
  585. package/dist/primitives/TruncatedTextProvider.cjs +8 -0
  586. package/dist/primitives/TruncatedTextProvider.d.ts +2 -0
  587. package/dist/primitives/TruncatedTextProvider.d.ts.map +1 -0
  588. package/dist/primitives/TruncatedTextProvider.js +5 -0
  589. package/dist/primitives/TruncatedTextProvider.js.map +1 -0
  590. package/dist/primitives/VisuallyHidden.cjs +8 -0
  591. package/dist/primitives/VisuallyHidden.d.ts +2 -0
  592. package/dist/primitives/VisuallyHidden.d.ts.map +1 -0
  593. package/dist/primitives/VisuallyHidden.js +5 -0
  594. package/dist/primitives/VisuallyHidden.js.map +1 -0
  595. package/dist/primitives/fieldSize.cjs +8 -0
  596. package/dist/primitives/fieldSize.d.ts +2 -0
  597. package/dist/primitives/fieldSize.d.ts.map +1 -0
  598. package/dist/primitives/fieldSize.js +5 -0
  599. package/dist/primitives/fieldSize.js.map +1 -0
  600. package/dist/primitives/flag.cjs +8 -0
  601. package/dist/primitives/flag.d.ts +2 -0
  602. package/dist/primitives/flag.d.ts.map +1 -0
  603. package/dist/primitives/flag.js +5 -0
  604. package/dist/primitives/flag.js.map +1 -0
  605. package/dist/primitives/formatShortcut.cjs +8 -0
  606. package/dist/primitives/formatShortcut.d.ts +2 -0
  607. package/dist/primitives/formatShortcut.d.ts.map +1 -0
  608. package/dist/primitives/formatShortcut.js +5 -0
  609. package/dist/primitives/formatShortcut.js.map +1 -0
  610. package/dist/primitives/initialOf.cjs +8 -0
  611. package/dist/primitives/initialOf.d.ts +2 -0
  612. package/dist/primitives/initialOf.d.ts.map +1 -0
  613. package/dist/primitives/initialOf.js +5 -0
  614. package/dist/primitives/initialOf.js.map +1 -0
  615. package/dist/primitives/parseNumber.cjs +8 -0
  616. package/dist/primitives/parseNumber.d.ts +2 -0
  617. package/dist/primitives/parseNumber.d.ts.map +1 -0
  618. package/dist/primitives/parseNumber.js +5 -0
  619. package/dist/primitives/parseNumber.js.map +1 -0
  620. package/dist/primitives/speakShortcut.cjs +8 -0
  621. package/dist/primitives/speakShortcut.d.ts +2 -0
  622. package/dist/primitives/speakShortcut.d.ts.map +1 -0
  623. package/dist/primitives/speakShortcut.js +5 -0
  624. package/dist/primitives/speakShortcut.js.map +1 -0
  625. package/dist/primitives/tileTones.cjs +8 -0
  626. package/dist/primitives/tileTones.d.ts +2 -0
  627. package/dist/primitives/tileTones.d.ts.map +1 -0
  628. package/dist/primitives/tileTones.js +5 -0
  629. package/dist/primitives/tileTones.js.map +1 -0
  630. package/dist/primitives/useDensity.cjs +8 -0
  631. package/dist/primitives/useDensity.d.ts +2 -0
  632. package/dist/primitives/useDensity.d.ts.map +1 -0
  633. package/dist/primitives/useDensity.js +5 -0
  634. package/dist/primitives/useDensity.js.map +1 -0
  635. package/dist/primitives/useField.cjs +8 -0
  636. package/dist/primitives/useField.d.ts +2 -0
  637. package/dist/primitives/useField.d.ts.map +1 -0
  638. package/dist/primitives/useField.js +5 -0
  639. package/dist/primitives/useField.js.map +1 -0
  640. package/dist/product/ComboBox.cjs +25 -7
  641. package/dist/product/ComboBox.d.ts +3 -1
  642. package/dist/product/ComboBox.d.ts.map +1 -1
  643. package/dist/product/ComboBox.js +25 -7
  644. package/dist/product/ComboBox.js.map +1 -1
  645. package/dist/product/CommandMenu.cjs +137 -0
  646. package/dist/product/CommandMenu.d.ts +77 -0
  647. package/dist/product/CommandMenu.d.ts.map +1 -0
  648. package/dist/product/CommandMenu.js +134 -0
  649. package/dist/product/CommandMenu.js.map +1 -0
  650. package/dist/product/DetailPane.cjs +154 -12
  651. package/dist/product/DetailPane.d.ts +80 -2
  652. package/dist/product/DetailPane.d.ts.map +1 -1
  653. package/dist/product/DetailPane.js +153 -16
  654. package/dist/product/DetailPane.js.map +1 -1
  655. package/dist/product/Fact.cjs +6 -1
  656. package/dist/product/Fact.d.ts +16 -1
  657. package/dist/product/Fact.d.ts.map +1 -1
  658. package/dist/product/Fact.js +6 -1
  659. package/dist/product/Fact.js.map +1 -1
  660. package/dist/product/Field.cjs +14 -2
  661. package/dist/product/Field.d.ts +16 -1
  662. package/dist/product/Field.d.ts.map +1 -1
  663. package/dist/product/Field.js +14 -2
  664. package/dist/product/Field.js.map +1 -1
  665. package/dist/product/Filters.cjs +61 -9
  666. package/dist/product/Filters.d.ts +37 -6
  667. package/dist/product/Filters.d.ts.map +1 -1
  668. package/dist/product/Filters.js +62 -10
  669. package/dist/product/Filters.js.map +1 -1
  670. package/dist/product/MenuRow.cjs +81 -2
  671. package/dist/product/MenuRow.d.ts +76 -6
  672. package/dist/product/MenuRow.d.ts.map +1 -1
  673. package/dist/product/MenuRow.js +81 -4
  674. package/dist/product/MenuRow.js.map +1 -1
  675. package/dist/product/PrimaryButton.cjs +5 -1
  676. package/dist/product/PrimaryButton.d.ts +8 -0
  677. package/dist/product/PrimaryButton.d.ts.map +1 -1
  678. package/dist/product/PrimaryButton.js +5 -1
  679. package/dist/product/PrimaryButton.js.map +1 -1
  680. package/dist/product/Skeleton.cjs +7 -6
  681. package/dist/product/Skeleton.d.ts +3 -20
  682. package/dist/product/Skeleton.d.ts.map +1 -1
  683. package/dist/product/Skeleton.js +8 -7
  684. package/dist/product/Skeleton.js.map +1 -1
  685. package/dist/product/index.cjs +2 -0
  686. package/dist/product/index.d.ts +1 -0
  687. package/dist/product/index.d.ts.map +1 -1
  688. package/dist/product/index.js +2 -0
  689. package/dist/product/index.js.map +1 -1
  690. package/dist/settings/Section.cjs +11 -2
  691. package/dist/settings/Section.d.ts +8 -1
  692. package/dist/settings/Section.d.ts.map +1 -1
  693. package/dist/settings/Section.js +11 -2
  694. package/dist/settings/Section.js.map +1 -1
  695. package/dist/styles/motion.css +70 -0
  696. package/dist/styles.css +1479 -136
  697. package/dist/theme.css +963 -9
  698. package/package.json +2 -1
@@ -6,20 +6,69 @@ exports.SearchInput = SearchInput;
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const gui_1 = require("@hanzo/gui");
8
8
  const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
9
+ const input_1 = require("../backends/gui/input.cjs");
10
+ const input_group_1 = require("../backends/gui/input-group.cjs");
11
+ const density_1 = require("../backends/gui/density.cjs");
9
12
  const instrument_1 = require("./instrument.cjs");
10
- /** A compact segmented pill control — the ONE way filters/ranges/toggles render. */
11
- function Segmented({ options, value, onChange, size = '$2', name, }) {
13
+ /** The two heights of the track and the inset that holds its thumb off the edge. */
14
+ const TRACK = { md: { h: 32, p: 3, item: 24 }, sm: { h: 24, p: 1, item: 20 } };
15
+ /**
16
+ * A compact segmented pill control — the ONE way filters/ranges/toggles render.
17
+ *
18
+ * `variant="track"` is one choice from a few as a pill track (twenty-ui's
19
+ * SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
20
+ * chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
21
+ * semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
22
+ * choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
23
+ * default `row` is the row of separate bordered buttons it has always been.
24
+ */
25
+ function Segmented({ options, value, onChange, size = '$2', name, variant = 'row', trackSize = 'md', itemWidth = 'equal', disabled, 'aria-label': ariaLabel, }) {
12
26
  const track = (0, instrument_1.useEmit)();
27
+ const pick = (v) => {
28
+ track({ component: 'Segmented', action: 'filter', id: name, value: v });
29
+ onChange(v);
30
+ };
31
+ if (variant === 'track') {
32
+ const box = TRACK[trackSize];
33
+ // A radio group: the arrows move the CHOICE, not only the focus (gui's
34
+ // roving focus moves the focus; this moves the value with it).
35
+ const live = options.filter((o) => !o.disabled);
36
+ const onKeyDown = (e) => {
37
+ const by = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;
38
+ if (!by || disabled || live.length === 0)
39
+ return;
40
+ const at = live.findIndex((o) => o.value === value);
41
+ pick(live[(at + by + live.length) % live.length].value);
42
+ };
43
+ return ((0, jsx_runtime_1.jsx)(gui_1.ToggleGroup, { "data-slot": "segmented", ...{
44
+ type: 'single',
45
+ value,
46
+ onValueChange: (next) => next && pick(next),
47
+ disableDeactivation: true,
48
+ }, role: "radiogroup", "aria-label": ariaLabel, orientation: "horizontal", disabled: disabled,
49
+ // No `unstyled` on the root: gui's ToggleGroup root does not consume it
50
+ // and it reached the DOM as an attribute. Every style it would reset is
51
+ // stated below.
52
+ display: "inline-flex", self: "flex-start", flexDirection: "row", items: "center", gap: "$0.5", height: box.h, p: box.p, rounded: "$10", bg: "$panel", borderWidth: 1, borderColor: "$borderColor", opacity: disabled ? 0.5 : 1, ...{ onKeyDown }, children: options.map((o) => {
53
+ const on = o.value === value;
54
+ const iconOnly = !!o.icon && !o.label;
55
+ return ((0, jsx_runtime_1.jsxs)(gui_1.ToggleGroup.Item, { "data-slot": "segmented-item", value: o.value, role: "radio", "aria-checked": on, "aria-label": o['aria-label'], disabled: disabled || o.disabled, "data-state": on ? 'checked' : 'unchecked', unstyled: true, flexDirection: "row", items: "center", justify: "center", gap: "$1", height: box.item, minW: box.item, px: iconOnly ? 0 : '$2', ...(itemWidth === 'equal' ? { flex: 1, flexBasis: 0 } : null), rounded: "$10", borderWidth: 0, bg: on ? '$raised' : 'transparent', cursor: o.disabled ? 'not-allowed' : 'pointer', hoverStyle: { bg: on ? '$raised' : '$hover' }, children: [o.icon ?? null, o.label ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: "500", color: on ? '$ink' : '$aside', numberOfLines: 1, children: o.label })) : null] }, o.value));
56
+ }) }));
57
+ }
13
58
  return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { gap: "$1", flexWrap: "wrap", items: "center", children: options.map((o) => {
14
59
  const active = o.value === value;
15
- return ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => {
16
- track({ component: 'Segmented', action: 'filter', id: name, value: o.value });
17
- onChange(o.value);
18
- }, children: (0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
60
+ return ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => pick(o.value), children: (0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
19
61
  }) }));
20
62
  }
21
- /** A search input with a leading magnifier. */
22
- function SearchInput({ value, onChange, placeholder, name, }) {
63
+ /**
64
+ * A search input with a leading magnifier, on the one field box: an
65
+ * `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
66
+ * and `actions` sit beside the field rather than inside it — twenty-ui's
67
+ * SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
68
+ * had; compact takes the group's own.
69
+ */
70
+ function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }) {
71
+ const compact = (0, density_1.useDensity)() === 'compact';
23
72
  const track = (0, instrument_1.useEmit)();
24
73
  // The QUERY IS NEVER SENT — only how long it was. The shape of the behaviour
25
74
  // (did people search? how specifically?) without the content.
@@ -27,5 +76,8 @@ function SearchInput({ value, onChange, placeholder, name, }) {
27
76
  track({ component: 'SearchInput', action: 'search', id: name, value: (0, instrument_1.textSize)(v) });
28
77
  onChange(v);
29
78
  };
30
- return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { flex: 1, minW: 180, items: "center", gap: "$2", px: "$3", borderWidth: 1, borderColor: "$borderColor", rounded: "$4", bg: "$sunken", children: [(0, jsx_runtime_1.jsx)(lucide_icons_2_1.Search, { size: 16, color: "$soft" }), (0, jsx_runtime_1.jsx)(gui_1.Input, { flex: 1, value: value, onChangeText: onChangeTracked, placeholder: placeholder, borderWidth: 0, bg: "transparent", px: "$0", fontSize: "$3" })] }));
79
+ const field = ((0, jsx_runtime_1.jsx)(input_group_1.InputGroup, { size: size, flex: 1, minW: 180, gap: "$2", ...(compact ? null : { bg: '$sunken' }), start: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Search, { size: 16, color: "$ink" }), children: (0, jsx_runtime_1.jsx)(input_1.Input, { value: value, onChangeText: onChangeTracked, placeholder: placeholder, autoFocus: autoFocus }) }));
80
+ if (!actions)
81
+ return field;
82
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { flex: 1, minW: 180, width: "100%", items: "center", gap: "$2", children: [field, (0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, items: "center", gap: "$2", children: actions })] }));
31
83
  }
@@ -7,28 +7,59 @@
7
7
  * — the same separation-of-concerns move `ui/Metric.tsx` made out of `gpus/`.
8
8
  * `inference/parts.tsx` re-exports them, so there is exactly one definition.
9
9
  */
10
- import type { ComponentProps } from 'react';
10
+ import type { ComponentProps, ReactNode } from 'react';
11
11
  import { Button } from '@hanzo/gui';
12
- /** One pill in a segmented control. */
12
+ import type { FieldSize } from '../backends/gui/control.js';
13
+ /** One pill in a segmented control. `icon` leads the label; an icon-only option needs `aria-label`. */
13
14
  export type Option<T extends string> = {
14
15
  label: string;
15
16
  value: T;
17
+ icon?: ReactNode;
18
+ /** Names an icon-only option for assistive technology. */
19
+ 'aria-label'?: string;
20
+ disabled?: boolean;
16
21
  };
17
- /** A compact segmented pill control — the ONE way filters/ranges/toggles render. */
18
- export declare function Segmented<T extends string>({ options, value, onChange, size, name, }: {
22
+ /**
23
+ * A compact segmented pill control — the ONE way filters/ranges/toggles render.
24
+ *
25
+ * `variant="track"` is one choice from a few as a pill track (twenty-ui's
26
+ * SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
27
+ * chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
28
+ * semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
29
+ * choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
30
+ * default `row` is the row of separate bordered buttons it has always been.
31
+ */
32
+ export declare function Segmented<T extends string>({ options, value, onChange, size, name, variant, trackSize, itemWidth, disabled, 'aria-label': ariaLabel, }: {
19
33
  options: Option<T>[];
20
34
  value: T;
21
35
  onChange: (v: T) => void;
22
36
  size?: ComponentProps<typeof Button>['size'];
23
37
  /** Names the filter in analytics (`status`, `range`); defaults to `Segmented`. */
24
38
  name?: string;
39
+ variant?: 'row' | 'track';
40
+ trackSize?: 'md' | 'sm';
41
+ itemWidth?: 'equal' | 'content';
42
+ disabled?: boolean;
43
+ /** Names the choice for assistive technology. */
44
+ 'aria-label'?: string;
25
45
  }): import("react").JSX.Element;
26
- /** A search input with a leading magnifier. */
27
- export declare function SearchInput({ value, onChange, placeholder, name, }: {
46
+ /**
47
+ * A search input with a leading magnifier, on the one field box: an
48
+ * `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
49
+ * and `actions` sit beside the field rather than inside it — twenty-ui's
50
+ * SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
51
+ * had; compact takes the group's own.
52
+ */
53
+ export declare function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }: {
28
54
  value: string;
29
55
  onChange: (v: string) => void;
30
56
  placeholder?: string;
31
57
  /** Names the search box in analytics; defaults to `SearchInput`. */
32
58
  name?: string;
59
+ /** The field box (control.ts `BOX`). Unset, the nearest `<Density>` decides. */
60
+ size?: FieldSize;
61
+ /** Controls after the field, 8px from it: a filter toggle, a "new" button. */
62
+ actions?: ReactNode;
63
+ autoFocus?: boolean;
33
64
  }): import("react").JSX.Element;
34
65
  //# sourceMappingURL=Filters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.d.ts","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAuB,MAAM,YAAY,CAAA;AAKxD,uCAAuC;AACvC,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAA;AAElE,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAW,EACX,IAAI,GACL,EAAE;IACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5C,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,+BA2BA;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,GACL,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,+BAcA"}
1
+ {"version":3,"file":"Filters.d.ts","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAA+C,MAAM,YAAY,CAAA;AAMhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,uGAAuG;AACvG,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAKD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAW,EACX,IAAI,EACJ,OAAe,EACf,SAAgB,EAChB,SAAmB,EACnB,QAAQ,EACR,YAAY,EAAE,SAAS,GACxB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5C,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,GAAG,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,+BA6GA;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,+BA8BA"}
@@ -1,21 +1,70 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Button, Input, Text, XStack } from '@hanzo/gui';
3
+ import { Button, Text, ToggleGroup as GuiToggleGroup, XStack } from '@hanzo/gui';
4
4
  import { Search } from '@hanzogui/lucide-icons-2';
5
+ import { Input } from '../backends/gui/input.js';
6
+ import { InputGroup } from '../backends/gui/input-group.js';
7
+ import { useDensity } from '../backends/gui/density.js';
5
8
  import { textSize, useEmit } from './instrument.js';
6
- /** A compact segmented pill control — the ONE way filters/ranges/toggles render. */
7
- export function Segmented({ options, value, onChange, size = '$2', name, }) {
9
+ /** The two heights of the track and the inset that holds its thumb off the edge. */
10
+ const TRACK = { md: { h: 32, p: 3, item: 24 }, sm: { h: 24, p: 1, item: 20 } };
11
+ /**
12
+ * A compact segmented pill control — the ONE way filters/ranges/toggles render.
13
+ *
14
+ * `variant="track"` is one choice from a few as a pill track (twenty-ui's
15
+ * SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
16
+ * chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
17
+ * semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
18
+ * choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
19
+ * default `row` is the row of separate bordered buttons it has always been.
20
+ */
21
+ export function Segmented({ options, value, onChange, size = '$2', name, variant = 'row', trackSize = 'md', itemWidth = 'equal', disabled, 'aria-label': ariaLabel, }) {
8
22
  const track = useEmit();
23
+ const pick = (v) => {
24
+ track({ component: 'Segmented', action: 'filter', id: name, value: v });
25
+ onChange(v);
26
+ };
27
+ if (variant === 'track') {
28
+ const box = TRACK[trackSize];
29
+ // A radio group: the arrows move the CHOICE, not only the focus (gui's
30
+ // roving focus moves the focus; this moves the value with it).
31
+ const live = options.filter((o) => !o.disabled);
32
+ const onKeyDown = (e) => {
33
+ const by = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;
34
+ if (!by || disabled || live.length === 0)
35
+ return;
36
+ const at = live.findIndex((o) => o.value === value);
37
+ pick(live[(at + by + live.length) % live.length].value);
38
+ };
39
+ return (_jsx(GuiToggleGroup, { "data-slot": "segmented", ...{
40
+ type: 'single',
41
+ value,
42
+ onValueChange: (next) => next && pick(next),
43
+ disableDeactivation: true,
44
+ }, role: "radiogroup", "aria-label": ariaLabel, orientation: "horizontal", disabled: disabled,
45
+ // No `unstyled` on the root: gui's ToggleGroup root does not consume it
46
+ // and it reached the DOM as an attribute. Every style it would reset is
47
+ // stated below.
48
+ display: "inline-flex", self: "flex-start", flexDirection: "row", items: "center", gap: "$0.5", height: box.h, p: box.p, rounded: "$10", bg: "$panel", borderWidth: 1, borderColor: "$borderColor", opacity: disabled ? 0.5 : 1, ...{ onKeyDown }, children: options.map((o) => {
49
+ const on = o.value === value;
50
+ const iconOnly = !!o.icon && !o.label;
51
+ return (_jsxs(GuiToggleGroup.Item, { "data-slot": "segmented-item", value: o.value, role: "radio", "aria-checked": on, "aria-label": o['aria-label'], disabled: disabled || o.disabled, "data-state": on ? 'checked' : 'unchecked', unstyled: true, flexDirection: "row", items: "center", justify: "center", gap: "$1", height: box.item, minW: box.item, px: iconOnly ? 0 : '$2', ...(itemWidth === 'equal' ? { flex: 1, flexBasis: 0 } : null), rounded: "$10", borderWidth: 0, bg: on ? '$raised' : 'transparent', cursor: o.disabled ? 'not-allowed' : 'pointer', hoverStyle: { bg: on ? '$raised' : '$hover' }, children: [o.icon ?? null, o.label ? (_jsx(Text, { fontSize: "$2", fontWeight: "500", color: on ? '$ink' : '$aside', numberOfLines: 1, children: o.label })) : null] }, o.value));
52
+ }) }));
53
+ }
9
54
  return (_jsx(XStack, { gap: "$1", flexWrap: "wrap", items: "center", children: options.map((o) => {
10
55
  const active = o.value === value;
11
- return (_jsx(Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => {
12
- track({ component: 'Segmented', action: 'filter', id: name, value: o.value });
13
- onChange(o.value);
14
- }, children: _jsx(Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
56
+ return (_jsx(Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => pick(o.value), children: _jsx(Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
15
57
  }) }));
16
58
  }
17
- /** A search input with a leading magnifier. */
18
- export function SearchInput({ value, onChange, placeholder, name, }) {
59
+ /**
60
+ * A search input with a leading magnifier, on the one field box: an
61
+ * `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
62
+ * and `actions` sit beside the field rather than inside it — twenty-ui's
63
+ * SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
64
+ * had; compact takes the group's own.
65
+ */
66
+ export function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }) {
67
+ const compact = useDensity() === 'compact';
19
68
  const track = useEmit();
20
69
  // The QUERY IS NEVER SENT — only how long it was. The shape of the behaviour
21
70
  // (did people search? how specifically?) without the content.
@@ -23,6 +72,9 @@ export function SearchInput({ value, onChange, placeholder, name, }) {
23
72
  track({ component: 'SearchInput', action: 'search', id: name, value: textSize(v) });
24
73
  onChange(v);
25
74
  };
26
- return (_jsxs(XStack, { flex: 1, minW: 180, items: "center", gap: "$2", px: "$3", borderWidth: 1, borderColor: "$borderColor", rounded: "$4", bg: "$sunken", children: [_jsx(Search, { size: 16, color: "$soft" }), _jsx(Input, { flex: 1, value: value, onChangeText: onChangeTracked, placeholder: placeholder, borderWidth: 0, bg: "transparent", px: "$0", fontSize: "$3" })] }));
75
+ const field = (_jsx(InputGroup, { size: size, flex: 1, minW: 180, gap: "$2", ...(compact ? null : { bg: '$sunken' }), start: _jsx(Search, { size: 16, color: "$ink" }), children: _jsx(Input, { value: value, onChangeText: onChangeTracked, placeholder: placeholder, autoFocus: autoFocus }) }));
76
+ if (!actions)
77
+ return field;
78
+ return (_jsxs(XStack, { flex: 1, minW: 180, width: "100%", items: "center", gap: "$2", children: [field, _jsx(XStack, { shrink: 0, items: "center", gap: "$2", children: actions })] }));
27
79
  }
28
80
  //# sourceMappingURL=Filters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.js","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAYZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAKhD,oFAAoF;AACpF,MAAM,UAAU,SAAS,CAAmB,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,IAAI,GAQL;IACC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IACvB,OAAO,CACL,KAAC,MAAM,IAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,YAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAA;YAChC,OAAO,CACL,KAAC,MAAM,IAEL,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EACtC,WAAW,EAAE,CAAC,EACd,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,kBACjC,MAAM,EACpB,OAAO,EAAE,GAAG,EAAE;oBACZ,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;oBAC7E,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACnB,CAAC,YAED,KAAC,IAAI,IAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,YACtF,CAAC,CAAC,KAAK,GACH,IAbF,CAAC,CAAC,KAAK,CAcL,CACV,CAAA;QACH,CAAC,CAAC,GACK,CACV,CAAA;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,GAOL;IACC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IACvB,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE;QACpC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnF,QAAQ,CAAC,CAAC,CAAC,CAAA;IACb,CAAC,CAAA;IACD,OAAO,CACL,MAAC,MAAM,IAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,WAAW,EAAE,CAAC,EAAE,WAAW,EAAC,cAAc,EAAC,OAAO,EAAC,IAAI,EAAC,EAAE,EAAC,SAAS,aAC9H,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,OAAO,GAAG,EAClC,KAAC,KAAK,IAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,EAAC,aAAa,EAAC,EAAE,EAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,GAAG,IACzI,CACV,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"Filters.js","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"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"}
@@ -1,16 +1,95 @@
1
1
  'use client';"use strict";
2
2
  'use client';
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MENU_ROW = void 0;
5
+ exports.MenuRowContent = MenuRowContent;
4
6
  exports.MenuRow = MenuRow;
5
7
  exports.MenuLabel = MenuLabel;
6
8
  exports.MenuRule = MenuRule;
7
9
  const jsx_runtime_1 = require("react/jsx-runtime");
10
+ /**
11
+ * MenuRow — ONE row for the identity sheets: `OrgSwitcher`, `UserMenu`, and
12
+ * whatever a surface adds to either through `footer`.
13
+ *
14
+ * The anatomy is always the same — a leading dot or icon, a label, an optional
15
+ * second line, and a check on the chosen one — and it was written four times:
16
+ * once inside the org switcher, once inside the account menu, and twice more in
17
+ * the console, which had to draw its own to put project rows in the same sheet.
18
+ * Four copies is four sets of numbers, and they disagreed: the same sheet held
19
+ * rows a step apart in their gutter and two different hover tints.
20
+ *
21
+ * A row also has to SAY what it is. A row that can be current is one of a set
22
+ * exactly one of which holds (`menuitemradio`, inside the caller's `group`); a
23
+ * row without the notion is an action (`menuitem`). The presence of `active`
24
+ * decides it, so no call site states it twice and none of them can forget.
25
+ *
26
+ * Every sheet these rows sit in is a `menu`, and a menu owns menu items, groups
27
+ * and separators — nothing else. The choice used to be a `radiogroup` of `radio`
28
+ * rows, the pair gui's `role` union carries whole, and axe fails a `radiogroup`
29
+ * inside a `menu` outright (`aria-required-children`: "children which are not
30
+ * allowed"). `group` + `menuitemradio` + `aria-checked` is the pair ARIA names
31
+ * for a single choice inside a menu. gui's union is React Native's role set and
32
+ * lacks `menuitemradio`, so the one cast below says it; the attribute reaches
33
+ * the DOM as written.
34
+ *
35
+ * THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
36
+ * leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
37
+ * grip), the label with its contextual text, the second line, the shortcut keys,
38
+ * and the trailing check or submenu chevron — and `DropdownMenuItem`'s
39
+ * declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
40
+ * sheet row are one anatomy with each keeping its own role.
41
+ *
42
+ * `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
43
+ * 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
44
+ * rung up, the label in the secondary ink. The default stays the sheet row these
45
+ * screens were drawn with.
46
+ */
47
+ const react_1 = require("react");
8
48
  const gui_1 = require("@hanzo/gui");
9
49
  const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
10
50
  const press_1 = require("../backends/gui/press.cjs");
11
- function MenuRow({ label, sub, dot, icon, active, danger, onPress }) {
51
+ const shortcut_1 = require("../backends/gui/shortcut.cjs");
52
+ const gesture_1 = require("../backends/gui/gesture.cjs");
53
+ /** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
54
+ exports.MENU_ROW = { h: 32, px: 4, gap: 8, icon: 16, chevron: 14, well: 4 };
55
+ /** The label's ink. The sheet row keeps the red it was drawn with; the record row reads the error state. */
56
+ const labelColor = (tone, quiet) => tone === 'danger' ? (quiet ? '$bad' : '$red10') : tone === 'placeholder' ? '$hint' : quiet ? '$aside' : '$ink';
57
+ /** A key, a chord or a sequence, as the kit's Shortcut keycaps (spoken once). A node is the caller's own rendering. */
58
+ const keys = (shortcut) => {
59
+ if (shortcut == null || shortcut === false)
60
+ return null;
61
+ if (typeof shortcut === 'string')
62
+ return (0, jsx_runtime_1.jsx)(shortcut_1.Shortcut, { keys: [shortcut] });
63
+ if (Array.isArray(shortcut))
64
+ return (0, jsx_runtime_1.jsx)(shortcut_1.Shortcut, { keys: shortcut });
65
+ return shortcut;
66
+ };
67
+ function MenuRowContent({ label, sub, contextual, contextualPosition = 'left', dot, icon, iconContainer = false, grip = 'never', shortcut, check = false, submenu = false, tone = 'default', quiet = false, hovered = false, subColor = '$hint', }) {
68
+ const lead = dot ? (0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon;
69
+ const swap = grip === 'onHover' && hovered;
70
+ const leading = grip === 'always' || swap ? ((0, jsx_runtime_1.jsx)(lucide_icons_2_1.GripVertical, { size: exports.MENU_ROW.icon, color: "$hush" })) : lead && iconContainer ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { p: exports.MENU_ROW.well, rounded: "$xs", bg: "$hover", items: "center", justify: "center", shrink: 0, children: lead })) : (lead);
71
+ const dim = contextual != null && contextual !== '' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$hint", numberOfLines: 1, pl: 4, shrink: 1, children: contextual })) : null;
72
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [grip !== 'never' ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, items: "center", justify: "center", minW: exports.MENU_ROW.icon, children: leading })) : (leading ?? null), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", minW: 0, children: [typeof label === 'string' || typeof label === 'number' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: labelColor(tone, quiet), numberOfLines: 1, shrink: 1, children: label })) : (label), contextualPosition === 'left' ? dim : null] }), sub ? (typeof sub === 'string' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$1", color: subColor, numberOfLines: 1, children: sub })) : (sub)) : null] }), contextualPosition === 'right' ? dim : null, shortcut != null ? (0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, children: keys(shortcut) }) : null, check ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Check, { size: exports.MENU_ROW.icon, strokeWidth: 2 }) : null, submenu ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, animation: "quick", rotate: submenu === 'open' ? '90deg' : '0deg', ...{ 'data-open': submenu === 'open' ? '' : undefined }, children: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronRight, { size: exports.MENU_ROW.chevron, color: "$hush" }) })) : null] }));
73
+ }
74
+ function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused = false, disabled = false, actions, actionsVisibility = 'hover', variant = 'default', selected = false, size = 'default', onPress, ...content }) {
12
75
  const selectable = active !== undefined;
13
- return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...(0, press_1.press)(onPress), ...{ role: selectable ? (gui_1.isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, cursor: "pointer", items: "center", gap: "$2.5", px: "$2", py: "$2", rounded: "$3", bg: active ? '$edge' : 'transparent', hoverStyle: { bg: '$raised' }, focusVisibleStyle: press_1.RING, children: [dot ? (0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon, (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: danger ? '$red10' : '$ink', numberOfLines: 1, children: label }), sub ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$1", color: "$soft", numberOfLines: 1, children: sub })) : null] }), active ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Check, { size: 16 }) : null] }));
76
+ const row = size === 'row';
77
+ const [hovered, setHovered] = (0, react_1.useState)(false);
78
+ const [within, setWithin] = (0, react_1.useState)(false);
79
+ const shown = actionsVisibility === 'always' || hovered || within;
80
+ const lit = variant === 'suggestion' && selected ? '$raised' : focused ? '$hover' : active ? '$edge' : 'transparent';
81
+ const run = disabled ? undefined : onPress;
82
+ const hover = { onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false) };
83
+ const body = ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, press_1.press)(run), ...{ role: selectable ? (gui_1.isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, "aria-disabled": disabled || undefined, ...(variant === 'suggestion' ? { 'aria-selected': selected } : null), cursor: disabled ? 'default' : 'pointer', items: "center", ...(row
84
+ ? { gap: exports.MENU_ROW.gap, px: exports.MENU_ROW.px, minH: exports.MENU_ROW.h, rounded: '$xs', ...(0, gesture_1.touch)(exports.MENU_ROW.h, 44, 'y') }
85
+ : { gap: '$2.5', px: '$2', py: '$2', rounded: '$3' }), bg: lit, opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : { bg: variant === 'suggestion' && selected ? '$raised' : row ? '$hover' : '$raised' }, focusVisibleStyle: press_1.RING, ...(actions ? { flex: 1, minW: 0 } : hover), onFocus: () => setWithin(true), onBlur: () => setWithin(false), children: (0, jsx_runtime_1.jsx)(MenuRowContent, { ...content, label: label, sub: sub, dot: dot, icon: icon, check: !!active, tone: danger ? 'danger' : placeholder ? 'placeholder' : 'default', quiet: row, hovered: hovered, subColor: row ? '$hint' : '$soft' }) }));
86
+ if (!actions)
87
+ return body;
88
+ // The actions sit BESIDE the row, not inside it: a control inside a
89
+ // `menuitem` is a nested interactive. One hover covers both.
90
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...{ 'data-slot': 'menu-row-with-actions' }, items: "center", gap: exports.MENU_ROW.gap, ...hover, children: [body, (0, jsx_runtime_1.jsx)(gui_1.XStack, { ...{ 'data-slot': 'menu-row-actions' }, role: "group", shrink: 0, items: "center", gap: "$1", opacity: shown ? 1 : 0,
91
+ // A finger cannot hover: on a coarse pointer the actions are always there.
92
+ $touchable: { opacity: 1 }, animation: "75ms", children: actions })] }));
14
93
  }
15
94
  /**
16
95
  * A quiet heading over a group of rows — "Organization", "Project", "Theme".
@@ -22,25 +22,95 @@
22
22
  * for a single choice inside a menu. gui's union is React Native's role set and
23
23
  * lacks `menuitemradio`, so the one cast below says it; the attribute reaches
24
24
  * the DOM as written.
25
+ *
26
+ * THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
27
+ * leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
28
+ * grip), the label with its contextual text, the second line, the shortcut keys,
29
+ * and the trailing check or submenu chevron — and `DropdownMenuItem`'s
30
+ * declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
31
+ * sheet row are one anatomy with each keeping its own role.
32
+ *
33
+ * `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
34
+ * 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
35
+ * rung up, the label in the secondary ink. The default stays the sheet row these
36
+ * screens were drawn with.
25
37
  */
26
- import type { ReactNode } from 'react';
38
+ import { type ReactNode } from 'react';
39
+ import { type ShortcutKeys } from '../backends/gui/shortcut.js';
27
40
  /** The tier hue a row may carry. Monochrome by default — only the genuine states
28
41
  * take a colour (a live network green, a caution amber). */
29
42
  export type DotColor = '$green10' | '$yellow10' | '$soft' | '$faint' | '$dim';
30
- export type MenuRowProps = {
31
- label: string;
43
+ /** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
44
+ export declare const MENU_ROW: {
45
+ readonly h: 32;
46
+ readonly px: 4;
47
+ readonly gap: 8;
48
+ readonly icon: 16;
49
+ readonly chevron: 14;
50
+ readonly well: 4;
51
+ };
52
+ export type MenuRowShortcut = ReactNode | string | ShortcutKeys;
53
+ export type MenuRowContentProps = {
54
+ label: ReactNode;
32
55
  /** A second, muted line under the label. */
33
- sub?: string;
56
+ sub?: ReactNode;
57
+ /** Dimmed text beside the label — a count, a type, an id. */
58
+ contextual?: ReactNode;
59
+ /** `left` sits right after the label; `right` is pushed to the trailing end. */
60
+ contextualPosition?: 'left' | 'right';
34
61
  /** A tier dot in place of an icon. */
35
62
  dot?: DotColor;
63
+ /** The leading slot: an icon, an Avatar, a logo. */
36
64
  icon?: ReactNode;
65
+ /** Seat the icon in its tinted well (4px padding, 4px corner). */
66
+ iconContainer?: boolean;
67
+ /** A drag grip: `always` in place of the icon, `onHover` swapping with it. */
68
+ grip?: 'never' | 'always' | 'onHover';
69
+ /** Keys: a ReactNode, one key, or a list read as one chord. */
70
+ shortcut?: MenuRowShortcut;
71
+ /** The trailing check of the chosen row. */
72
+ check?: boolean;
73
+ /** A submenu chevron; `open` turns it a quarter. */
74
+ submenu?: boolean | 'open';
75
+ /** `danger` for a destructive row, `placeholder` for a row that offers rather than does. */
76
+ tone?: 'default' | 'danger' | 'placeholder';
77
+ /** The record row reads in the secondary ink; the sheet row in full ink. */
78
+ quiet?: boolean;
79
+ /** Whether the row is under the pointer, for the hover-only grip. */
80
+ hovered?: boolean;
81
+ /** The second line's rung: the sheet's softer one or a menu's quiet one. */
82
+ subColor?: '$soft' | '$hint';
83
+ };
84
+ export declare function MenuRowContent({ label, sub, contextual, contextualPosition, dot, icon, iconContainer, grip, shortcut, check, submenu, tone, quiet, hovered, subColor, }: MenuRowContentProps): import("react").JSX.Element;
85
+ export type MenuRowProps = Omit<MenuRowContentProps, 'check' | 'tone' | 'quiet' | 'hovered' | 'subColor' | 'label' | 'sub'> & {
86
+ label: string;
87
+ /** A second, muted line under the label. */
88
+ sub?: string;
37
89
  /** Whether this row is the chosen one — see the note above on what it decides. */
38
90
  active?: boolean;
39
91
  /** The destructive register — sign out, delete, revoke. */
40
92
  danger?: boolean;
41
- onPress: () => void;
93
+ /** A row that offers rather than does: "Add a field", "No value". */
94
+ placeholder?: boolean;
95
+ /** Keyboard-highlighted from outside (a list whose cursor is not focus). */
96
+ focused?: boolean;
97
+ disabled?: boolean;
98
+ /** Trailing actions: shown on hover or focus on a pointer, always on touch. */
99
+ actions?: ReactNode;
100
+ actionsVisibility?: 'hover' | 'always';
101
+ /**
102
+ * `suggestion` is a typeahead row (an @-mention, a variable): its selection
103
+ * follows a caret, not the pointer, so the selected row is a rung stronger
104
+ * than hover.
105
+ */
106
+ variant?: 'default' | 'suggestion';
107
+ /** With `variant="suggestion"`, the row the caret is on. */
108
+ selected?: boolean;
109
+ /** `row` is the record geometry; the default is the identity sheet's. */
110
+ size?: 'default' | 'row';
111
+ onPress?: () => void;
42
112
  };
43
- export declare function MenuRow({ label, sub, dot, icon, active, danger, onPress }: MenuRowProps): import("react").JSX.Element;
113
+ export declare function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused, disabled, actions, actionsVisibility, variant, selected, size, onPress, ...content }: MenuRowProps): import("react").JSX.Element;
44
114
  /**
45
115
  * A quiet heading over a group of rows — "Organization", "Project", "Theme".
46
116
  *
@@ -1 +1 @@
1
- {"version":3,"file":"MenuRow.d.ts","sourceRoot":"","sources":["../../src/product/MenuRow.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC;6DAC6D;AAC7D,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE7E,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sCAAsC;IACtC,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,+BAgCvF;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAM9D;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,gCAEvB"}
1
+ {"version":3,"file":"MenuRow.d.ts","sourceRoot":"","sources":["../../src/product/MenuRow.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,88 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * MenuRow — ONE row for the identity sheets: `OrgSwitcher`, `UserMenu`, and
5
+ * whatever a surface adds to either through `footer`.
6
+ *
7
+ * The anatomy is always the same — a leading dot or icon, a label, an optional
8
+ * second line, and a check on the chosen one — and it was written four times:
9
+ * once inside the org switcher, once inside the account menu, and twice more in
10
+ * the console, which had to draw its own to put project rows in the same sheet.
11
+ * Four copies is four sets of numbers, and they disagreed: the same sheet held
12
+ * rows a step apart in their gutter and two different hover tints.
13
+ *
14
+ * A row also has to SAY what it is. A row that can be current is one of a set
15
+ * exactly one of which holds (`menuitemradio`, inside the caller's `group`); a
16
+ * row without the notion is an action (`menuitem`). The presence of `active`
17
+ * decides it, so no call site states it twice and none of them can forget.
18
+ *
19
+ * Every sheet these rows sit in is a `menu`, and a menu owns menu items, groups
20
+ * and separators — nothing else. The choice used to be a `radiogroup` of `radio`
21
+ * rows, the pair gui's `role` union carries whole, and axe fails a `radiogroup`
22
+ * inside a `menu` outright (`aria-required-children`: "children which are not
23
+ * allowed"). `group` + `menuitemradio` + `aria-checked` is the pair ARIA names
24
+ * for a single choice inside a menu. gui's union is React Native's role set and
25
+ * lacks `menuitemradio`, so the one cast below says it; the attribute reaches
26
+ * the DOM as written.
27
+ *
28
+ * THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
29
+ * leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
30
+ * grip), the label with its contextual text, the second line, the shortcut keys,
31
+ * and the trailing check or submenu chevron — and `DropdownMenuItem`'s
32
+ * declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
33
+ * sheet row are one anatomy with each keeping its own role.
34
+ *
35
+ * `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
36
+ * 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
37
+ * rung up, the label in the secondary ink. The default stays the sheet row these
38
+ * screens were drawn with.
39
+ */
40
+ import { useState } from 'react';
3
41
  import { Text, XStack, YStack, isWeb } from '@hanzo/gui';
4
- import { Check } from '@hanzogui/lucide-icons-2';
42
+ import { Check, ChevronRight, GripVertical } from '@hanzogui/lucide-icons-2';
5
43
  import { press, RING } from '../backends/gui/press.js';
6
- export function MenuRow({ label, sub, dot, icon, active, danger, onPress }) {
44
+ import { Shortcut } from '../backends/gui/shortcut.js';
45
+ import { touch } from '../backends/gui/gesture.js';
46
+ /** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
47
+ export const MENU_ROW = { h: 32, px: 4, gap: 8, icon: 16, chevron: 14, well: 4 };
48
+ /** The label's ink. The sheet row keeps the red it was drawn with; the record row reads the error state. */
49
+ const labelColor = (tone, quiet) => tone === 'danger' ? (quiet ? '$bad' : '$red10') : tone === 'placeholder' ? '$hint' : quiet ? '$aside' : '$ink';
50
+ /** A key, a chord or a sequence, as the kit's Shortcut keycaps (spoken once). A node is the caller's own rendering. */
51
+ const keys = (shortcut) => {
52
+ if (shortcut == null || shortcut === false)
53
+ return null;
54
+ if (typeof shortcut === 'string')
55
+ return _jsx(Shortcut, { keys: [shortcut] });
56
+ if (Array.isArray(shortcut))
57
+ return _jsx(Shortcut, { keys: shortcut });
58
+ return shortcut;
59
+ };
60
+ export function MenuRowContent({ label, sub, contextual, contextualPosition = 'left', dot, icon, iconContainer = false, grip = 'never', shortcut, check = false, submenu = false, tone = 'default', quiet = false, hovered = false, subColor = '$hint', }) {
61
+ const lead = dot ? _jsx(YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon;
62
+ const swap = grip === 'onHover' && hovered;
63
+ const leading = grip === 'always' || swap ? (_jsx(GripVertical, { size: MENU_ROW.icon, color: "$hush" })) : lead && iconContainer ? (_jsx(XStack, { p: MENU_ROW.well, rounded: "$xs", bg: "$hover", items: "center", justify: "center", shrink: 0, children: lead })) : (lead);
64
+ const dim = contextual != null && contextual !== '' ? (_jsx(Text, { fontSize: "$2", color: "$hint", numberOfLines: 1, pl: 4, shrink: 1, children: contextual })) : null;
65
+ return (_jsxs(_Fragment, { children: [grip !== 'never' ? (_jsx(XStack, { shrink: 0, items: "center", justify: "center", minW: MENU_ROW.icon, children: leading })) : (leading ?? null), _jsxs(YStack, { flex: 1, minW: 0, children: [_jsxs(XStack, { items: "center", minW: 0, children: [typeof label === 'string' || typeof label === 'number' ? (_jsx(Text, { fontSize: "$2", color: labelColor(tone, quiet), numberOfLines: 1, shrink: 1, children: label })) : (label), contextualPosition === 'left' ? dim : null] }), sub ? (typeof sub === 'string' ? (_jsx(Text, { fontSize: "$1", color: subColor, numberOfLines: 1, children: sub })) : (sub)) : null] }), contextualPosition === 'right' ? dim : null, shortcut != null ? _jsx(XStack, { shrink: 0, children: keys(shortcut) }) : null, check ? _jsx(Check, { size: MENU_ROW.icon, strokeWidth: 2 }) : null, submenu ? (_jsx(XStack, { shrink: 0, animation: "quick", rotate: submenu === 'open' ? '90deg' : '0deg', ...{ 'data-open': submenu === 'open' ? '' : undefined }, children: _jsx(ChevronRight, { size: MENU_ROW.chevron, color: "$hush" }) })) : null] }));
66
+ }
67
+ export function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused = false, disabled = false, actions, actionsVisibility = 'hover', variant = 'default', selected = false, size = 'default', onPress, ...content }) {
7
68
  const selectable = active !== undefined;
8
- return (_jsxs(XStack, { ...press(onPress), ...{ role: selectable ? (isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, cursor: "pointer", items: "center", gap: "$2.5", px: "$2", py: "$2", rounded: "$3", bg: active ? '$edge' : 'transparent', hoverStyle: { bg: '$raised' }, focusVisibleStyle: RING, children: [dot ? _jsx(YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon, _jsxs(YStack, { flex: 1, minW: 0, children: [_jsx(Text, { fontSize: "$2", color: danger ? '$red10' : '$ink', numberOfLines: 1, children: label }), sub ? (_jsx(Text, { fontSize: "$1", color: "$soft", numberOfLines: 1, children: sub })) : null] }), active ? _jsx(Check, { size: 16 }) : null] }));
69
+ const row = size === 'row';
70
+ const [hovered, setHovered] = useState(false);
71
+ const [within, setWithin] = useState(false);
72
+ const shown = actionsVisibility === 'always' || hovered || within;
73
+ const lit = variant === 'suggestion' && selected ? '$raised' : focused ? '$hover' : active ? '$edge' : 'transparent';
74
+ const run = disabled ? undefined : onPress;
75
+ const hover = { onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false) };
76
+ const body = (_jsx(XStack, { ...press(run), ...{ role: selectable ? (isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, "aria-disabled": disabled || undefined, ...(variant === 'suggestion' ? { 'aria-selected': selected } : null), cursor: disabled ? 'default' : 'pointer', items: "center", ...(row
77
+ ? { gap: MENU_ROW.gap, px: MENU_ROW.px, minH: MENU_ROW.h, rounded: '$xs', ...touch(MENU_ROW.h, 44, 'y') }
78
+ : { gap: '$2.5', px: '$2', py: '$2', rounded: '$3' }), bg: lit, opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : { bg: variant === 'suggestion' && selected ? '$raised' : row ? '$hover' : '$raised' }, focusVisibleStyle: RING, ...(actions ? { flex: 1, minW: 0 } : hover), onFocus: () => setWithin(true), onBlur: () => setWithin(false), children: _jsx(MenuRowContent, { ...content, label: label, sub: sub, dot: dot, icon: icon, check: !!active, tone: danger ? 'danger' : placeholder ? 'placeholder' : 'default', quiet: row, hovered: hovered, subColor: row ? '$hint' : '$soft' }) }));
79
+ if (!actions)
80
+ return body;
81
+ // The actions sit BESIDE the row, not inside it: a control inside a
82
+ // `menuitem` is a nested interactive. One hover covers both.
83
+ return (_jsxs(XStack, { ...{ 'data-slot': 'menu-row-with-actions' }, items: "center", gap: MENU_ROW.gap, ...hover, children: [body, _jsx(XStack, { ...{ 'data-slot': 'menu-row-actions' }, role: "group", shrink: 0, items: "center", gap: "$1", opacity: shown ? 1 : 0,
84
+ // A finger cannot hover: on a coarse pointer the actions are always there.
85
+ $touchable: { opacity: 1 }, animation: "75ms", children: actions })] }));
9
86
  }
10
87
  /**
11
88
  * A quiet heading over a group of rows — "Organization", "Project", "Theme".