@moldable-ai/ui 0.2.22 → 0.2.25

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 (492) hide show
  1. package/dist/catalog/catalog-coverage.d.ts +1 -1
  2. package/dist/catalog/catalog-manifest.d.ts +1 -1
  3. package/dist/catalog/catalog-manifest.js +1 -1
  4. package/dist/catalog/component-catalog.d.ts +1 -1
  5. package/dist/catalog/component-catalog.js +2 -2
  6. package/dist/catalog/core-catalog-exclusions.d.ts +1 -1
  7. package/dist/catalog/core-catalog-exclusions.d.ts.map +1 -1
  8. package/dist/catalog/core-catalog-exclusions.js +1 -150
  9. package/dist/catalog/core-catalog.d.ts +1 -1
  10. package/dist/catalog/core-catalog.d.ts.map +1 -1
  11. package/dist/catalog/core-catalog.js +11 -7
  12. package/dist/catalog/core-collection-stories.d.ts +1 -1
  13. package/dist/catalog/core-collection-stories.d.ts.map +1 -1
  14. package/dist/catalog/core-collection-stories.js +40 -8
  15. package/dist/catalog/core-control-stories.d.ts +1 -1
  16. package/dist/catalog/core-control-stories.d.ts.map +1 -1
  17. package/dist/catalog/core-control-stories.js +48 -20
  18. package/dist/catalog/core-feedback-stories.d.ts +1 -1
  19. package/dist/catalog/core-feedback-stories.d.ts.map +1 -1
  20. package/dist/catalog/core-feedback-stories.js +89 -10
  21. package/dist/catalog/core-form-stories.d.ts +3 -0
  22. package/dist/catalog/core-form-stories.d.ts.map +1 -0
  23. package/dist/catalog/core-form-stories.js +56 -0
  24. package/dist/catalog/core-foundation-stories.d.ts +1 -1
  25. package/dist/catalog/core-foundation-stories.js +7 -7
  26. package/dist/catalog/core-layout-stories.d.ts +3 -0
  27. package/dist/catalog/core-layout-stories.d.ts.map +1 -0
  28. package/dist/catalog/core-layout-stories.js +78 -0
  29. package/dist/catalog/core-navigation-stories.d.ts +1 -1
  30. package/dist/catalog/core-navigation-stories.d.ts.map +1 -1
  31. package/dist/catalog/core-navigation-stories.js +25 -3
  32. package/dist/catalog/core-overlay-stories.d.ts +1 -1
  33. package/dist/catalog/core-overlay-stories.d.ts.map +1 -1
  34. package/dist/catalog/core-overlay-stories.js +113 -8
  35. package/dist/catalog/index.d.ts +6 -6
  36. package/dist/catalog/index.js +6 -6
  37. package/dist/components/app-error-boundary.js +2 -2
  38. package/dist/components/chat/chat-image-lightbox.js +3 -3
  39. package/dist/components/chat/chat-input.js +5 -5
  40. package/dist/components/chat/chat-message.js +17 -17
  41. package/dist/components/chat/chat-messages.d.ts +1 -1
  42. package/dist/components/chat/chat-messages.js +3 -3
  43. package/dist/components/chat/chat-panel.d.ts +6 -6
  44. package/dist/components/chat/chat-panel.d.ts.map +1 -1
  45. package/dist/components/chat/chat-panel.js +33 -33
  46. package/dist/components/chat/checkpoint-badge.js +3 -3
  47. package/dist/components/chat/conversation-history.d.ts.map +1 -1
  48. package/dist/components/chat/conversation-history.js +13 -13
  49. package/dist/components/chat/index.d.ts +20 -15
  50. package/dist/components/chat/index.d.ts.map +1 -1
  51. package/dist/components/chat/index.js +20 -15
  52. package/dist/components/chat/markdown.js +1 -1
  53. package/dist/components/chat/model-effort-selector.js +10 -10
  54. package/dist/components/chat/model-selector.js +4 -4
  55. package/dist/components/chat/reasoning-effort-selector.js +4 -4
  56. package/dist/components/chat/restore-dialog.js +3 -3
  57. package/dist/components/chat/thinking-timeline.js +2 -2
  58. package/dist/components/chat/tool-approval.d.ts +1 -1
  59. package/dist/components/chat/tool-approval.d.ts.map +1 -1
  60. package/dist/components/chat/tool-approval.js +9 -9
  61. package/dist/components/chat/tool-handlers.d.ts +2 -2
  62. package/dist/components/chat/tool-handlers.js +90 -90
  63. package/dist/components/chat/voice-orb-audio.d.ts +16 -0
  64. package/dist/components/chat/voice-orb-audio.d.ts.map +1 -0
  65. package/dist/components/chat/voice-orb-audio.js +110 -0
  66. package/dist/components/chat/voice-orb-renderer.d.ts +51 -0
  67. package/dist/components/chat/voice-orb-renderer.d.ts.map +1 -0
  68. package/dist/components/chat/voice-orb-renderer.js +410 -0
  69. package/dist/components/chat/voice-orb-shaders.d.ts +3 -0
  70. package/dist/components/chat/voice-orb-shaders.d.ts.map +1 -0
  71. package/dist/components/chat/voice-orb-shaders.js +355 -0
  72. package/dist/components/chat/voice-orb-types.d.ts +24 -0
  73. package/dist/components/chat/voice-orb-types.d.ts.map +1 -0
  74. package/dist/components/chat/voice-orb-types.js +73 -0
  75. package/dist/components/chat/voice-orb.d.ts +20 -0
  76. package/dist/components/chat/voice-orb.d.ts.map +1 -0
  77. package/dist/components/chat/voice-orb.js +67 -0
  78. package/dist/components/code-block.js +1 -1
  79. package/dist/components/hardware/bluetooth-panel.d.ts +2 -2
  80. package/dist/components/hardware/bluetooth-panel.js +10 -10
  81. package/dist/components/hardware/camera-preview.js +6 -6
  82. package/dist/components/hardware/capability-badge.d.ts +2 -2
  83. package/dist/components/hardware/capability-badge.js +2 -2
  84. package/dist/components/hardware/capability-matrix.d.ts +1 -1
  85. package/dist/components/hardware/capability-matrix.js +5 -5
  86. package/dist/components/hardware/clipboard-button.d.ts +1 -1
  87. package/dist/components/hardware/clipboard-button.js +2 -2
  88. package/dist/components/hardware/device-list.js +1 -1
  89. package/dist/components/hardware/display-map.d.ts +1 -1
  90. package/dist/components/hardware/display-map.js +7 -7
  91. package/dist/components/hardware/haptic-button.d.ts +2 -2
  92. package/dist/components/hardware/haptic-button.js +3 -3
  93. package/dist/components/hardware/hardware-panel.js +1 -1
  94. package/dist/components/hardware/hid-panel.d.ts +2 -2
  95. package/dist/components/hardware/hid-panel.js +10 -10
  96. package/dist/components/hardware/index.d.ts +26 -26
  97. package/dist/components/hardware/index.js +26 -26
  98. package/dist/components/hardware/live-indicator.js +1 -1
  99. package/dist/components/hardware/local-auth-button.d.ts +2 -2
  100. package/dist/components/hardware/local-auth-button.js +4 -4
  101. package/dist/components/hardware/location-panel.d.ts +1 -1
  102. package/dist/components/hardware/location-panel.js +6 -6
  103. package/dist/components/hardware/microphone-meter.js +7 -7
  104. package/dist/components/hardware/midi-monitor.d.ts +2 -2
  105. package/dist/components/hardware/midi-monitor.js +9 -9
  106. package/dist/components/hardware/notification-panel.d.ts +1 -1
  107. package/dist/components/hardware/notification-panel.js +8 -8
  108. package/dist/components/hardware/power-blocker-controller.d.ts +1 -1
  109. package/dist/components/hardware/power-blocker-controller.js +1 -1
  110. package/dist/components/hardware/power-panel.d.ts +1 -1
  111. package/dist/components/hardware/power-panel.js +9 -9
  112. package/dist/components/hardware/readout.js +1 -1
  113. package/dist/components/hardware/screen-share-preview.js +5 -5
  114. package/dist/components/hardware/secure-storage-panel.d.ts +1 -1
  115. package/dist/components/hardware/secure-storage-panel.js +9 -9
  116. package/dist/components/hardware/serial-console.d.ts +2 -2
  117. package/dist/components/hardware/serial-console.js +10 -10
  118. package/dist/components/hardware/shortcut-recorder.d.ts +1 -1
  119. package/dist/components/hardware/shortcut-recorder.js +4 -4
  120. package/dist/components/hardware/stream-log.js +1 -1
  121. package/dist/components/hardware/system-audio-monitor.d.ts +1 -1
  122. package/dist/components/hardware/system-audio-monitor.js +9 -9
  123. package/dist/components/hardware/usb-panel.d.ts +5 -5
  124. package/dist/components/hardware/usb-panel.js +10 -10
  125. package/dist/components/hardware/use-capability.d.ts +1 -1
  126. package/dist/components/hardware/use-capability.js +1 -1
  127. package/dist/components/markdown.js +5 -5
  128. package/dist/components/native-capabilities/bluetooth-panel.d.ts +2 -2
  129. package/dist/components/native-capabilities/bluetooth-panel.d.ts.map +1 -1
  130. package/dist/components/native-capabilities/bluetooth-panel.js +17 -17
  131. package/dist/components/native-capabilities/camera-preview.d.ts.map +1 -1
  132. package/dist/components/native-capabilities/camera-preview.js +7 -7
  133. package/dist/components/native-capabilities/capability-badge.d.ts +2 -2
  134. package/dist/components/native-capabilities/capability-badge.js +4 -4
  135. package/dist/components/native-capabilities/capability-matrix.d.ts +1 -1
  136. package/dist/components/native-capabilities/capability-matrix.js +7 -7
  137. package/dist/components/native-capabilities/clipboard-button.d.ts +1 -1
  138. package/dist/components/native-capabilities/clipboard-button.js +2 -2
  139. package/dist/components/native-capabilities/device-list.js +4 -4
  140. package/dist/components/native-capabilities/display-map.d.ts +1 -1
  141. package/dist/components/native-capabilities/display-map.d.ts.map +1 -1
  142. package/dist/components/native-capabilities/display-map.js +11 -11
  143. package/dist/components/native-capabilities/haptic-button.d.ts +2 -2
  144. package/dist/components/native-capabilities/haptic-button.js +3 -3
  145. package/dist/components/native-capabilities/hid-panel.d.ts +2 -2
  146. package/dist/components/native-capabilities/hid-panel.d.ts.map +1 -1
  147. package/dist/components/native-capabilities/hid-panel.js +14 -14
  148. package/dist/components/native-capabilities/index.d.ts +26 -26
  149. package/dist/components/native-capabilities/index.js +26 -26
  150. package/dist/components/native-capabilities/live-indicator.js +3 -3
  151. package/dist/components/native-capabilities/local-auth-button.d.ts +2 -2
  152. package/dist/components/native-capabilities/local-auth-button.js +4 -4
  153. package/dist/components/native-capabilities/location-panel.d.ts +1 -1
  154. package/dist/components/native-capabilities/location-panel.d.ts.map +1 -1
  155. package/dist/components/native-capabilities/location-panel.js +8 -8
  156. package/dist/components/native-capabilities/microphone-meter.js +9 -9
  157. package/dist/components/native-capabilities/midi-monitor.d.ts +2 -2
  158. package/dist/components/native-capabilities/midi-monitor.d.ts.map +1 -1
  159. package/dist/components/native-capabilities/midi-monitor.js +11 -11
  160. package/dist/components/native-capabilities/native-capability-panel.js +6 -6
  161. package/dist/components/native-capabilities/notification-panel.d.ts +1 -1
  162. package/dist/components/native-capabilities/notification-panel.js +9 -9
  163. package/dist/components/native-capabilities/power-blocker-controller.d.ts +1 -1
  164. package/dist/components/native-capabilities/power-blocker-controller.js +1 -1
  165. package/dist/components/native-capabilities/power-panel.d.ts +1 -1
  166. package/dist/components/native-capabilities/power-panel.d.ts.map +1 -1
  167. package/dist/components/native-capabilities/power-panel.js +12 -12
  168. package/dist/components/native-capabilities/readout.d.ts.map +1 -1
  169. package/dist/components/native-capabilities/readout.js +2 -2
  170. package/dist/components/native-capabilities/screen-share-preview.js +6 -6
  171. package/dist/components/native-capabilities/secure-storage-panel.d.ts +1 -1
  172. package/dist/components/native-capabilities/secure-storage-panel.d.ts.map +1 -1
  173. package/dist/components/native-capabilities/secure-storage-panel.js +11 -11
  174. package/dist/components/native-capabilities/serial-console.d.ts +2 -2
  175. package/dist/components/native-capabilities/serial-console.d.ts.map +1 -1
  176. package/dist/components/native-capabilities/serial-console.js +11 -11
  177. package/dist/components/native-capabilities/shortcut-recorder.d.ts +1 -1
  178. package/dist/components/native-capabilities/shortcut-recorder.js +5 -5
  179. package/dist/components/native-capabilities/stream-log.js +3 -3
  180. package/dist/components/native-capabilities/system-audio-monitor.d.ts +1 -1
  181. package/dist/components/native-capabilities/system-audio-monitor.js +12 -12
  182. package/dist/components/native-capabilities/usb-panel.d.ts +5 -5
  183. package/dist/components/native-capabilities/usb-panel.js +15 -15
  184. package/dist/components/native-capabilities/use-capability.d.ts +1 -1
  185. package/dist/components/native-capabilities/use-capability.js +1 -1
  186. package/dist/components/rich-media-player.js +3 -3
  187. package/dist/components/ui/accordion.js +3 -3
  188. package/dist/components/ui/alert-dialog.d.ts +2 -2
  189. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  190. package/dist/components/ui/alert-dialog.js +16 -10
  191. package/dist/components/ui/alert.d.ts +1 -1
  192. package/dist/components/ui/alert.d.ts.map +1 -1
  193. package/dist/components/ui/alert.js +11 -11
  194. package/dist/components/ui/app-frame.d.ts +7 -1
  195. package/dist/components/ui/app-frame.d.ts.map +1 -1
  196. package/dist/components/ui/app-frame.js +52 -16
  197. package/dist/components/ui/avatar.js +5 -5
  198. package/dist/components/ui/badge.d.ts +1 -1
  199. package/dist/components/ui/badge.js +4 -4
  200. package/dist/components/ui/breadcrumb.js +2 -2
  201. package/dist/components/ui/button-group.d.ts +1 -1
  202. package/dist/components/ui/button-group.js +4 -4
  203. package/dist/components/ui/button.d.ts +1 -1
  204. package/dist/components/ui/button.d.ts.map +1 -1
  205. package/dist/components/ui/button.js +16 -16
  206. package/dist/components/ui/calendar.d.ts +1 -1
  207. package/dist/components/ui/calendar.d.ts.map +1 -1
  208. package/dist/components/ui/calendar.js +15 -15
  209. package/dist/components/ui/card.js +3 -3
  210. package/dist/components/ui/carousel.d.ts +1 -1
  211. package/dist/components/ui/carousel.js +4 -4
  212. package/dist/components/ui/chart.js +5 -5
  213. package/dist/components/ui/checkbox.d.ts.map +1 -1
  214. package/dist/components/ui/checkbox.js +2 -2
  215. package/dist/components/ui/collapsible.js +3 -3
  216. package/dist/components/ui/color-well.js +2 -2
  217. package/dist/components/ui/combobox.js +9 -9
  218. package/dist/components/ui/command.d.ts +1 -1
  219. package/dist/components/ui/command.d.ts.map +1 -1
  220. package/dist/components/ui/command.js +9 -9
  221. package/dist/components/ui/confirm-dialog.d.ts +1 -1
  222. package/dist/components/ui/confirm-dialog.js +2 -2
  223. package/dist/components/ui/context-menu.d.ts +16 -5
  224. package/dist/components/ui/context-menu.d.ts.map +1 -1
  225. package/dist/components/ui/context-menu.js +92 -16
  226. package/dist/components/ui/date-field.d.ts.map +1 -1
  227. package/dist/components/ui/date-field.js +8 -8
  228. package/dist/components/ui/date-picker.d.ts +2 -2
  229. package/dist/components/ui/date-picker.js +7 -7
  230. package/dist/components/ui/dialog.d.ts +2 -2
  231. package/dist/components/ui/dialog.d.ts.map +1 -1
  232. package/dist/components/ui/dialog.js +16 -8
  233. package/dist/components/ui/drawer.js +4 -4
  234. package/dist/components/ui/dropdown-menu.d.ts +15 -5
  235. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  236. package/dist/components/ui/dropdown-menu.js +98 -16
  237. package/dist/components/ui/edge-fade.js +1 -1
  238. package/dist/components/ui/empty.d.ts +1 -1
  239. package/dist/components/ui/empty.js +5 -5
  240. package/dist/components/ui/error-boundary-view.d.ts.map +1 -1
  241. package/dist/components/ui/error-boundary-view.js +3 -3
  242. package/dist/components/ui/field.d.ts +1 -1
  243. package/dist/components/ui/field.d.ts.map +1 -1
  244. package/dist/components/ui/field.js +9 -9
  245. package/dist/components/ui/form.js +4 -4
  246. package/dist/components/ui/grid.d.ts.map +1 -1
  247. package/dist/components/ui/grid.js +5 -5
  248. package/dist/components/ui/hover-card.js +2 -2
  249. package/dist/components/ui/icon-button.d.ts +1 -1
  250. package/dist/components/ui/icon-button.js +3 -3
  251. package/dist/components/ui/index.d.ts +77 -77
  252. package/dist/components/ui/index.js +77 -77
  253. package/dist/components/ui/input-group.d.ts +2 -2
  254. package/dist/components/ui/input-group.js +14 -14
  255. package/dist/components/ui/input-otp.js +3 -3
  256. package/dist/components/ui/input.js +2 -2
  257. package/dist/components/ui/inspector.d.ts +1 -1
  258. package/dist/components/ui/inspector.js +6 -6
  259. package/dist/components/ui/item.d.ts +1 -1
  260. package/dist/components/ui/item.js +7 -7
  261. package/dist/components/ui/kbd.js +2 -2
  262. package/dist/components/ui/label.js +2 -2
  263. package/dist/components/ui/list.d.ts.map +1 -1
  264. package/dist/components/ui/list.js +5 -5
  265. package/dist/components/ui/material.js +3 -3
  266. package/dist/components/ui/menu-items.d.ts +28 -0
  267. package/dist/components/ui/menu-items.d.ts.map +1 -0
  268. package/dist/components/ui/menu-items.js +111 -0
  269. package/dist/components/ui/menubar.js +11 -11
  270. package/dist/components/ui/message-scroller-controller.d.ts +1 -1
  271. package/dist/components/ui/message-scroller-controller.js +1 -1
  272. package/dist/components/ui/message-scroller-primitive.d.ts +1 -1
  273. package/dist/components/ui/message-scroller-primitive.js +1 -1
  274. package/dist/components/ui/message-scroller.d.ts +2 -2
  275. package/dist/components/ui/message-scroller.js +3 -3
  276. package/dist/components/ui/navigation-button-group.d.ts +2 -2
  277. package/dist/components/ui/navigation-button-group.js +2 -2
  278. package/dist/components/ui/navigation-menu.js +6 -6
  279. package/dist/components/ui/notification-dot.js +2 -2
  280. package/dist/components/ui/number-input.js +8 -8
  281. package/dist/components/ui/pagination.d.ts +1 -1
  282. package/dist/components/ui/pagination.js +2 -2
  283. package/dist/components/ui/panel.d.ts +1 -1
  284. package/dist/components/ui/panel.js +3 -3
  285. package/dist/components/ui/popover.d.ts +1 -1
  286. package/dist/components/ui/popover.js +3 -3
  287. package/dist/components/ui/progress.js +2 -2
  288. package/dist/components/ui/radio-group.d.ts.map +1 -1
  289. package/dist/components/ui/radio-group.js +2 -2
  290. package/dist/components/ui/resizable.d.ts +1 -1
  291. package/dist/components/ui/resizable.d.ts.map +1 -1
  292. package/dist/components/ui/resizable.js +15 -4
  293. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  294. package/dist/components/ui/scroll-area.js +3 -3
  295. package/dist/components/ui/search-field.js +7 -7
  296. package/dist/components/ui/segmented-control.js +9 -9
  297. package/dist/components/ui/select.d.ts.map +1 -1
  298. package/dist/components/ui/select.js +6 -6
  299. package/dist/components/ui/separator.js +1 -1
  300. package/dist/components/ui/sheet.js +4 -4
  301. package/dist/components/ui/sidebar.d.ts +5 -5
  302. package/dist/components/ui/sidebar.d.ts.map +1 -1
  303. package/dist/components/ui/sidebar.js +111 -24
  304. package/dist/components/ui/skeleton.js +2 -2
  305. package/dist/components/ui/slider.d.ts +3 -1
  306. package/dist/components/ui/slider.d.ts.map +1 -1
  307. package/dist/components/ui/slider.js +3 -3
  308. package/dist/components/ui/sonner.js +1 -1
  309. package/dist/components/ui/spinner.js +1 -1
  310. package/dist/components/ui/split-view.js +1 -1
  311. package/dist/components/ui/status.d.ts +1 -1
  312. package/dist/components/ui/status.d.ts.map +1 -1
  313. package/dist/components/ui/status.js +10 -9
  314. package/dist/components/ui/switch.js +2 -2
  315. package/dist/components/ui/table.d.ts.map +1 -1
  316. package/dist/components/ui/table.js +7 -7
  317. package/dist/components/ui/tabs.js +3 -3
  318. package/dist/components/ui/text.d.ts +2 -2
  319. package/dist/components/ui/text.js +19 -19
  320. package/dist/components/ui/textarea.js +2 -2
  321. package/dist/components/ui/toggle-group.d.ts +1 -1
  322. package/dist/components/ui/toggle-group.js +4 -4
  323. package/dist/components/ui/toggle.d.ts +1 -1
  324. package/dist/components/ui/toggle.js +10 -10
  325. package/dist/components/ui/toolbar.d.ts +7 -7
  326. package/dist/components/ui/toolbar.js +7 -7
  327. package/dist/components/ui/tooltip.d.ts +2 -2
  328. package/dist/components/ui/tooltip.js +5 -5
  329. package/dist/index.d.ts +21 -20
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +21 -20
  332. package/dist/lib/frame-lifecycle.d.ts +27 -0
  333. package/dist/lib/frame-lifecycle.d.ts.map +1 -1
  334. package/dist/lib/frame-lifecycle.js +136 -0
  335. package/dist/lib/host-date-time-picker.d.ts +1 -1
  336. package/dist/lib/host-date-time-picker.js +1 -1
  337. package/dist/lib/host-file-dialog.d.ts +1 -1
  338. package/dist/lib/host-file-dialog.js +1 -1
  339. package/dist/lib/host-native-menu.d.ts +48 -7
  340. package/dist/lib/host-native-menu.d.ts.map +1 -1
  341. package/dist/lib/host-native-menu.js +56 -1
  342. package/dist/lib/host-services.js +1 -1
  343. package/dist/lib/host-share.d.ts +1 -1
  344. package/dist/lib/host-share.js +1 -1
  345. package/dist/lib/host-web-surface.d.ts +31 -0
  346. package/dist/lib/host-web-surface.d.ts.map +1 -0
  347. package/dist/lib/host-web-surface.js +116 -0
  348. package/dist/lib/native-capabilities/access.d.ts +2 -2
  349. package/dist/lib/native-capabilities/access.js +2 -2
  350. package/dist/lib/native-capabilities/bluetooth-access.d.ts +1 -1
  351. package/dist/lib/native-capabilities/bluetooth-access.js +2 -2
  352. package/dist/lib/native-capabilities/bluetooth-connection.d.ts +1 -1
  353. package/dist/lib/native-capabilities/bluetooth-connection.js +1 -1
  354. package/dist/lib/native-capabilities/bluetooth-gatt.d.ts +1 -1
  355. package/dist/lib/native-capabilities/bluetooth-gatt.js +1 -1
  356. package/dist/lib/native-capabilities/bluetooth-internal.d.ts +2 -2
  357. package/dist/lib/native-capabilities/bluetooth-internal.js +1 -1
  358. package/dist/lib/native-capabilities/bluetooth-native-fallback.d.ts +2 -2
  359. package/dist/lib/native-capabilities/bluetooth-native-fallback.js +2 -2
  360. package/dist/lib/native-capabilities/bluetooth.d.ts +6 -6
  361. package/dist/lib/native-capabilities/bluetooth.js +4 -4
  362. package/dist/lib/native-capabilities/bridge.d.ts +1 -1
  363. package/dist/lib/native-capabilities/bridge.js +2 -2
  364. package/dist/lib/native-capabilities/capabilities.d.ts +1 -1
  365. package/dist/lib/native-capabilities/capabilities.js +1 -1
  366. package/dist/lib/native-capabilities/clipboard.js +2 -2
  367. package/dist/lib/native-capabilities/device-io-errors.d.ts +1 -1
  368. package/dist/lib/native-capabilities/device-io-errors.js +1 -1
  369. package/dist/lib/native-capabilities/displays.d.ts +1 -1
  370. package/dist/lib/native-capabilities/displays.js +1 -1
  371. package/dist/lib/native-capabilities/global-shortcuts.d.ts +2 -2
  372. package/dist/lib/native-capabilities/global-shortcuts.js +1 -1
  373. package/dist/lib/native-capabilities/haptics.d.ts +1 -1
  374. package/dist/lib/native-capabilities/haptics.js +1 -1
  375. package/dist/lib/native-capabilities/hid-native.d.ts +2 -2
  376. package/dist/lib/native-capabilities/hid-native.js +3 -3
  377. package/dist/lib/native-capabilities/hid.js +5 -5
  378. package/dist/lib/native-capabilities/index.d.ts +39 -39
  379. package/dist/lib/native-capabilities/index.js +21 -21
  380. package/dist/lib/native-capabilities/local-authentication.d.ts +1 -1
  381. package/dist/lib/native-capabilities/local-authentication.js +1 -1
  382. package/dist/lib/native-capabilities/location.js +1 -1
  383. package/dist/lib/native-capabilities/media-permissions.d.ts +1 -1
  384. package/dist/lib/native-capabilities/media-permissions.js +1 -1
  385. package/dist/lib/native-capabilities/media.d.ts +1 -1
  386. package/dist/lib/native-capabilities/media.js +2 -2
  387. package/dist/lib/native-capabilities/midi-access.d.ts +1 -1
  388. package/dist/lib/native-capabilities/midi-access.js +3 -3
  389. package/dist/lib/native-capabilities/midi-internal.d.ts +1 -1
  390. package/dist/lib/native-capabilities/midi-internal.js +1 -1
  391. package/dist/lib/native-capabilities/midi-native-fallback.d.ts +1 -1
  392. package/dist/lib/native-capabilities/midi-native-fallback.js +2 -2
  393. package/dist/lib/native-capabilities/midi-ports.d.ts +1 -1
  394. package/dist/lib/native-capabilities/midi-ports.js +1 -1
  395. package/dist/lib/native-capabilities/midi.d.ts +5 -5
  396. package/dist/lib/native-capabilities/midi.js +3 -3
  397. package/dist/lib/native-capabilities/native-device-io.d.ts +1 -1
  398. package/dist/lib/native-capabilities/native-device-io.js +1 -1
  399. package/dist/lib/native-capabilities/native-device-lifecycle.js +1 -1
  400. package/dist/lib/native-capabilities/notifications.d.ts +2 -2
  401. package/dist/lib/native-capabilities/notifications.js +1 -1
  402. package/dist/lib/native-capabilities/power-session.d.ts +2 -2
  403. package/dist/lib/native-capabilities/power-session.js +1 -1
  404. package/dist/lib/native-capabilities/secure-storage.d.ts +1 -1
  405. package/dist/lib/native-capabilities/secure-storage.js +1 -1
  406. package/dist/lib/native-capabilities/serial-native.d.ts +2 -2
  407. package/dist/lib/native-capabilities/serial-native.js +3 -3
  408. package/dist/lib/native-capabilities/serial.js +5 -5
  409. package/dist/lib/native-capabilities/system-audio.d.ts +1 -1
  410. package/dist/lib/native-capabilities/system-audio.js +1 -1
  411. package/dist/lib/native-capabilities/usb-native.d.ts +2 -2
  412. package/dist/lib/native-capabilities/usb-native.js +3 -3
  413. package/dist/lib/native-capabilities/usb.js +5 -5
  414. package/dist/lib/native-hardware/bluetooth-access.d.ts +1 -1
  415. package/dist/lib/native-hardware/bluetooth-access.js +1 -1
  416. package/dist/lib/native-hardware/bluetooth-connection.d.ts +1 -1
  417. package/dist/lib/native-hardware/bluetooth-connection.js +1 -1
  418. package/dist/lib/native-hardware/bluetooth-gatt.d.ts +1 -1
  419. package/dist/lib/native-hardware/bluetooth-gatt.js +1 -1
  420. package/dist/lib/native-hardware/bluetooth-internal.d.ts +2 -2
  421. package/dist/lib/native-hardware/bluetooth-internal.js +1 -1
  422. package/dist/lib/native-hardware/bluetooth-native-fallback.d.ts +2 -2
  423. package/dist/lib/native-hardware/bluetooth-native-fallback.js +2 -2
  424. package/dist/lib/native-hardware/bluetooth.d.ts +6 -6
  425. package/dist/lib/native-hardware/bluetooth.js +4 -4
  426. package/dist/lib/native-hardware/bridge.d.ts +1 -1
  427. package/dist/lib/native-hardware/bridge.js +2 -2
  428. package/dist/lib/native-hardware/capabilities.d.ts +1 -1
  429. package/dist/lib/native-hardware/capabilities.js +1 -1
  430. package/dist/lib/native-hardware/clipboard.js +1 -1
  431. package/dist/lib/native-hardware/device-io-errors.d.ts +1 -1
  432. package/dist/lib/native-hardware/device-io-errors.js +1 -1
  433. package/dist/lib/native-hardware/displays.d.ts +1 -1
  434. package/dist/lib/native-hardware/displays.js +1 -1
  435. package/dist/lib/native-hardware/global-shortcuts.d.ts +2 -2
  436. package/dist/lib/native-hardware/global-shortcuts.js +1 -1
  437. package/dist/lib/native-hardware/haptics.d.ts +1 -1
  438. package/dist/lib/native-hardware/haptics.js +1 -1
  439. package/dist/lib/native-hardware/hid-native.d.ts +2 -2
  440. package/dist/lib/native-hardware/hid-native.js +3 -3
  441. package/dist/lib/native-hardware/hid.js +4 -4
  442. package/dist/lib/native-hardware/index.d.ts +37 -37
  443. package/dist/lib/native-hardware/index.js +20 -20
  444. package/dist/lib/native-hardware/local-authentication.d.ts +1 -1
  445. package/dist/lib/native-hardware/local-authentication.js +1 -1
  446. package/dist/lib/native-hardware/location.js +1 -1
  447. package/dist/lib/native-hardware/media-permissions.d.ts +1 -1
  448. package/dist/lib/native-hardware/media-permissions.js +1 -1
  449. package/dist/lib/native-hardware/media.d.ts +1 -1
  450. package/dist/lib/native-hardware/media.js +1 -1
  451. package/dist/lib/native-hardware/midi-access.d.ts +1 -1
  452. package/dist/lib/native-hardware/midi-access.js +2 -2
  453. package/dist/lib/native-hardware/midi-internal.d.ts +1 -1
  454. package/dist/lib/native-hardware/midi-internal.js +1 -1
  455. package/dist/lib/native-hardware/midi-native-fallback.d.ts +1 -1
  456. package/dist/lib/native-hardware/midi-native-fallback.js +2 -2
  457. package/dist/lib/native-hardware/midi-ports.d.ts +1 -1
  458. package/dist/lib/native-hardware/midi-ports.js +1 -1
  459. package/dist/lib/native-hardware/midi.d.ts +5 -5
  460. package/dist/lib/native-hardware/midi.js +3 -3
  461. package/dist/lib/native-hardware/native-device-io.d.ts +1 -1
  462. package/dist/lib/native-hardware/native-device-io.js +1 -1
  463. package/dist/lib/native-hardware/native-device-lifecycle.js +1 -1
  464. package/dist/lib/native-hardware/notifications.d.ts +2 -2
  465. package/dist/lib/native-hardware/notifications.js +1 -1
  466. package/dist/lib/native-hardware/power-session.d.ts +2 -2
  467. package/dist/lib/native-hardware/power-session.js +1 -1
  468. package/dist/lib/native-hardware/secure-storage.d.ts +1 -1
  469. package/dist/lib/native-hardware/secure-storage.js +1 -1
  470. package/dist/lib/native-hardware/serial-native.d.ts +2 -2
  471. package/dist/lib/native-hardware/serial-native.js +3 -3
  472. package/dist/lib/native-hardware/serial.js +4 -4
  473. package/dist/lib/native-hardware/system-audio.d.ts +1 -1
  474. package/dist/lib/native-hardware/system-audio.js +1 -1
  475. package/dist/lib/native-hardware/usb-native.d.ts +2 -2
  476. package/dist/lib/native-hardware/usb-native.js +3 -3
  477. package/dist/lib/native-hardware/usb.js +4 -4
  478. package/dist/lib/theme.js +1 -1
  479. package/docs/design-tokens.md +28 -6
  480. package/docs/foundations.md +4 -2
  481. package/package.json +4 -2
  482. package/src/components/ui/confirm-dialog.md +97 -0
  483. package/src/components/ui/context-menu.md +158 -0
  484. package/src/components/ui/dropdown-menu.md +165 -0
  485. package/src/components/ui/hover-card.md +90 -0
  486. package/src/components/ui/select.md +111 -0
  487. package/src/lib/host-date-time-picker.md +29 -0
  488. package/src/lib/host-file-dialog.md +76 -0
  489. package/src/lib/host-native-menu.md +67 -0
  490. package/src/lib/host-share.md +36 -0
  491. package/src/lib/host-web-surface.md +66 -0
  492. package/src/styles/index.css +141 -68
package/dist/lib/theme.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
4
- import { TooltipProvider } from '../components/ui/tooltip';
4
+ import { TooltipProvider } from '../components/ui/tooltip.js';
5
5
  const ThemeContext = createContext(null);
6
6
  const STORAGE_KEY = 'moldable-theme';
7
7
  function getSystemTheme() {
@@ -28,6 +28,11 @@ The default UI font is the platform sans-serif stack. Monospaced text uses the
28
28
  platform monospace stack. Prefer `Text` for normal interface copy; the token
29
29
  utilities are useful for display-scale titles and highly composed canvases.
30
30
 
31
+ The native UI scale is deliberately small: `--text-11` for captions and
32
+ metadata, `--text-13` for body and control text, `--text-16` for emphasized
33
+ titles, `--text-18` for secondary headings, and `--text-24` for primary
34
+ headings. Long-form Markdown keeps its prose scale.
35
+
31
36
  | Role | CSS token | Tailwind utility | Use |
32
37
  | ------- | ------------------ | ----------------- | ---------------------------------- |
33
38
  | Display | `--type-display-*` | `text-ui-display` | One dominant app or document title |
@@ -109,15 +114,32 @@ disabled, and invalid states. Disabled wins over pointer states. Focus remains
109
114
  visible when combined with selected or invalid. Selection is durable state;
110
115
  hover is not a substitute for it.
111
116
 
117
+ Focus rings use the neutral translucent `--ring` token at one pixel. Never use
118
+ plain `focus:` ring utilities or accent colors for keyboard focus.
119
+
112
120
  Do not use state-layer colors as arbitrary fills. Prefer the shared component
113
121
  when one exists.
114
122
 
115
123
  ## Shape and materials
116
124
 
117
- Use `rounded-control`, `rounded-container`, and `rounded-overlay` to keep
118
- related objects visually consistent. `rounded-window` is host-informed and
119
- normally only useful in previews; the native host owns the actual window
120
- shape.
125
+ Use `rounded-control`, `rounded-checkbox`, `rounded-popover`, `rounded-card`,
126
+ `rounded-group`, `rounded-panel`, `rounded-dialog`, and `rounded-pill` to keep
127
+ geometry tied to its role. The 4px checkbox role keeps a 16px checkbox
128
+ visually square while ordinary controls retain their softer 10px corners.
129
+ `rounded-container` and `rounded-overlay` remain compatibility aliases for
130
+ card and popover geometry. `rounded-window` is host-informed and normally only
131
+ useful in previews; the native host owns the actual window shape. Increased
132
+ contrast reduces authored radii and uses inset borders instead of drop
133
+ shadows.
134
+
135
+ ## Data series
136
+
137
+ Charts consume `--chart-1` through `--chart-5` (and the matching
138
+ `chart-1`…`chart-5` Tailwind aliases). The defaults intentionally reuse the
139
+ info, success, pending, neutral, and accent support families so data graphics
140
+ stay theme-aware and do not inherit Moldable's legacy brand orange. Apps may
141
+ override the complete series palette at a theme boundary, but chart
142
+ components and stories should never embed raw series colors.
121
143
 
122
144
  Adaptive material has two semantic variants. Each includes fill, fallback,
123
145
  border, highlight, blur, and saturation tokens:
@@ -125,8 +147,8 @@ border, highlight, blur, and saturation tokens:
125
147
  - `--material-regular-*` supports normal toolbar and control chrome.
126
148
  - `--material-clear-*` supports compact controls over media or a richly
127
149
  colored canvas.
128
- - `shadow-panel`, `shadow-overlay`, and `shadow-window` provide elevation
129
- independently from translucency.
150
+ - `shadow-panel`, `shadow-overlay`, `shadow-dialog`, and `shadow-window`
151
+ provide elevation independently from translucency.
130
152
 
131
153
  Use `Material` and `MaterialGroup` instead of assembling those tokens in app
132
154
  markup. `MaterialGroup` owns one sampled layer for a related control cluster;
@@ -54,5 +54,7 @@ springy, and do not animate layout merely to make a screen feel active.
54
54
 
55
55
  ## Focus
56
56
 
57
- Keyboard focus must remain visible against every surface. Do not remove a
58
- focus ring unless the replacement is at least as clear.
57
+ Keyboard focus uses a thin, neutral system-chrome ring. Apply it only through
58
+ `focus-visible`; pointer and programmatic focus must not paint a ring. Dialogs
59
+ focus their content container on open so the first Tab reaches the first
60
+ control with the keyboard indicator.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moldable-ai/ui",
3
- "version": "0.2.22",
3
+ "version": "0.2.25",
4
4
  "description": "Shared UI components for Moldable applications",
5
5
  "author": "Desiderata LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -37,11 +37,12 @@
37
37
  "dist",
38
38
  "docs",
39
39
  "src/components/ui/*.md",
40
+ "src/lib/*.md",
40
41
  "src/styles",
41
42
  "LICENSE"
42
43
  ],
43
44
  "scripts": {
44
- "build": "tsc",
45
+ "build": "tsc && node ./scripts/rewrite-relative-imports.mjs",
45
46
  "build:visual-host": "vite build --config vite.visual.config.ts",
46
47
  "dev": "tsc --watch",
47
48
  "lint": "eslint . --ext .ts,.tsx --max-warnings 0",
@@ -50,6 +51,7 @@
50
51
  "test": "vitest run",
51
52
  "test:visual": "pnpm build:visual-host && playwright test --config playwright.visual.config.ts",
52
53
  "test:visual:update": "pnpm build:visual-host && playwright test --config playwright.visual.config.ts --update-snapshots",
54
+ "filmstrip:orb-spawn": "node scripts/render-orb-spawn-filmstrip.mjs",
53
55
  "visual:serve": "vite preview --config vite.visual.config.ts --host 127.0.0.1 --port 4179 --strictPort"
54
56
  },
55
57
  "dependencies": {
@@ -0,0 +1,97 @@
1
+ # Confirm dialog
2
+
3
+ ## Purpose
4
+
5
+ `ConfirmDialog` asks for explicit confirmation before a consequential action
6
+ and owns the pending and error states of an asynchronous confirmation.
7
+
8
+ Use it for destructive or difficult-to-reverse actions, security-sensitive
9
+ changes, and operations with a meaningful external effect. Do not interrupt
10
+ routine, reversible actions; use undo or inline feedback instead. Use the
11
+ lower-level `AlertDialog` family when the body needs custom media or layout.
12
+
13
+ ## Usage patterns
14
+
15
+ ```tsx
16
+ import { Button, ConfirmDialog } from '@moldable-ai/ui'
17
+
18
+ function DeleteRecordingDialog() {
19
+ return (
20
+ <ConfirmDialog
21
+ title="Delete recording?"
22
+ description="The audio and transcript will be permanently removed."
23
+ trigger={<Button variant="destructive">Delete recording</Button>}
24
+ confirmLabel="Delete"
25
+ pendingLabel="Deleting…"
26
+ variant="destructive"
27
+ size="sm"
28
+ onConfirm={() => deleteRecording(recordingId)}
29
+ onConfirmError={reportDeleteError}
30
+ getErrorMessage={() => 'The recording could not be deleted.'}
31
+ />
32
+ )
33
+ }
34
+ ```
35
+
36
+ For a controlled dialog, pass `open` and `onOpenChange`. Omit `trigger` when
37
+ another event owns opening.
38
+
39
+ ## Anatomy
40
+
41
+ `ConfirmDialog` composes `AlertDialog` with a required title and description,
42
+ a cancel action, and one primary confirm action. It shows a shared spinner and
43
+ `pendingLabel` while `onConfirm` is unresolved, then closes only after success.
44
+ Rejected confirmation remains open and renders an alert message.
45
+
46
+ ## API summary
47
+
48
+ - `title`, `description`, and `onConfirm` are required.
49
+ - `trigger` accepts one React element.
50
+ - `confirmLabel`, `pendingLabel`, and `cancelLabel` accept React content and
51
+ default to “Confirm”, “Working…”, and “Cancel”.
52
+ - `variant` is `"default" | "destructive"` and defaults to `"default"`.
53
+ - `size` is `"sm" | "default" | "lg"` and defaults to `"default"`.
54
+ - `open`, `defaultOpen`, and `onOpenChange` support controlled or uncontrolled
55
+ disclosure.
56
+ - `onConfirmError` receives the rejected value. `getErrorMessage` maps it to
57
+ rendered React content.
58
+
59
+ ## States and interaction
60
+
61
+ While `onConfirm` is pending, both actions are disabled, repeated confirmation
62
+ is ignored, and close requests are blocked. Success closes the dialog and calls
63
+ `onOpenChange(false)`. Failure clears pending state, keeps the dialog open,
64
+ shows the mapped error or default message, and calls `onConfirmError`.
65
+
66
+ The surface uses `bg-background`, `border-separator`, `rounded-dialog`, and
67
+ `shadow-dialog`. Description copy uses `text-text-secondary`; failed and
68
+ destructive states use the semantic destructive role. Do not add raw danger
69
+ colors or custom dialog elevation.
70
+
71
+ ## Keyboard and accessibility
72
+
73
+ The component inherits alert-dialog semantics and focus containment. The
74
+ dialog content receives initial focus; Enter activates the marked primary
75
+ action when appropriate, and pending state prevents dismissal. Write a
76
+ specific title and describe the consequence, not merely “Are you sure?”.
77
+ Error copy is announced with `role="alert"`.
78
+
79
+ ## Do
80
+
81
+ - Name the action and the affected object in the title or description.
82
+ - Use `variant="destructive"` only for destructive confirmation.
83
+ - Return the action promise from `onConfirm`.
84
+ - Map technical failures to concise, actionable copy with `getErrorMessage`.
85
+
86
+ ## Don't
87
+
88
+ - Do not confirm harmless, reversible, or high-frequency actions.
89
+ - Do not close optimistically before `onConfirm` succeeds.
90
+ - Do not perform the action from both the trigger and `onConfirm`.
91
+ - Do not expose raw exception text to users.
92
+
93
+ ## Testing
94
+
95
+ Exercise controlled and uncontrolled opening, success, rejection, repeated
96
+ activation while pending, attempted dismissal while pending, destructive
97
+ styling, all three sizes, and keyboard confirmation.
@@ -0,0 +1,158 @@
1
+ # Context menu
2
+
3
+ ## Purpose
4
+
5
+ `ContextMenu` presents commands for the object or region under the pointer. Its
6
+ declarative item API automatically adopts the host-native menu when available
7
+ and renders the same commands portably everywhere else.
8
+
9
+ Context menus are shortcuts, not the only route to essential actions. Use
10
+ `DropdownMenu` when a visible button should advertise the command list.
11
+
12
+ ## Usage patterns
13
+
14
+ Use `items` for standard command menus that should automatically adopt the
15
+ native host menu:
16
+
17
+ ```tsx
18
+ import { FolderOpen } from 'lucide-react'
19
+ import {
20
+ ContextMenu,
21
+ ContextMenuTrigger,
22
+ type MenuItems,
23
+ } from '@moldable-ai/ui'
24
+
25
+ const items: MenuItems[] = [
26
+ {
27
+ id: 'open',
28
+ label: 'Open',
29
+ icon: FolderOpen,
30
+ sfSymbol: 'folder',
31
+ shortcut: { key: 'o', modifiers: ['cmd'] },
32
+ },
33
+ { id: 'divider', kind: 'separator' },
34
+ { id: 'trash', label: 'Move to trash', destructive: true },
35
+ ]
36
+
37
+ function ProjectContextMenu() {
38
+ return (
39
+ <ContextMenu items={items} onSelectItem={runCommand}>
40
+ <ContextMenuTrigger asChild>
41
+ <article>{project.name}</article>
42
+ </ContextMenuTrigger>
43
+ </ContextMenu>
44
+ )
45
+ }
46
+ ```
47
+
48
+ Use children for custom portable-only content or per-row handlers:
49
+
50
+ ```tsx
51
+ import {
52
+ ContextMenu,
53
+ ContextMenuContent,
54
+ ContextMenuItem,
55
+ ContextMenuSeparator,
56
+ ContextMenuShortcut,
57
+ ContextMenuTrigger,
58
+ } from '@moldable-ai/ui'
59
+
60
+ function ProjectContextMenu() {
61
+ return (
62
+ <ContextMenu onOpenChange={setMenuOpen}>
63
+ <ContextMenuTrigger asChild>
64
+ <article>{project.name}</article>
65
+ </ContextMenuTrigger>
66
+ <ContextMenuContent>
67
+ <ContextMenuItem onSelect={openProject}>
68
+ Open
69
+ <ContextMenuShortcut>⌘O</ContextMenuShortcut>
70
+ </ContextMenuItem>
71
+ <ContextMenuSeparator />
72
+ <ContextMenuItem variant="destructive" onSelect={moveToTrash}>
73
+ Move to trash
74
+ </ContextMenuItem>
75
+ </ContextMenuContent>
76
+ </ContextMenu>
77
+ )
78
+ }
79
+ ```
80
+
81
+ ## Anatomy
82
+
83
+ Use `ContextMenuTrigger` around the target and place commands in
84
+ `ContextMenuContent`. Groups, labels, separators, checkbox items, radio groups,
85
+ shortcuts, and submenus are available for structured command sets.
86
+
87
+ ## API summary
88
+
89
+ - `ContextMenu` supports `items?: MenuItems[]`,
90
+ `onSelectItem?: (id: string) => void`, `onOpenChange`, `dir`, and `modal`.
91
+ - A `MenuItems` value supports `id`, `kind`, `label`, portable `icon`, reserved
92
+ `sfSymbol`, `enabled`, `checked`, `shortcut`, `destructive`, and `submenu`.
93
+ - Do not provide `ContextMenuContent` together with `items`. In development this
94
+ reports an error, and `items` wins.
95
+ - `ContextMenuTrigger` supports `asChild` and `disabled`.
96
+ - `ContextMenuItem` supports menu item props such as `onSelect` and `disabled`,
97
+ plus `inset` and `variant="default" | "destructive"`.
98
+ - `ContextMenuCheckboxItem` supports `checked`; radio items belong inside
99
+ `ContextMenuRadioGroup`, whose `value` and `onValueChange` manage the group.
100
+ - `ContextMenuSub` supports `open`, `defaultOpen`, and `onOpenChange`.
101
+ - `ContextMenuLabel` and `ContextMenuSubTrigger` support `inset`.
102
+
103
+ ## States and interaction
104
+
105
+ Keep command order and wording stable across openings. Disable temporarily
106
+ unavailable commands, but omit commands the target can never support. Check and
107
+ radio state represent durable settings; focus highlighting is transient.
108
+
109
+ Menu surfaces use `bg-popover`, `text-popover-foreground`,
110
+ `rounded-overlay`, and `shadow-overlay`. Focused rows use the accent roles;
111
+ destructive rows use `text-destructive` and the destructive focus layer.
112
+
113
+ ## Keyboard and accessibility
114
+
115
+ Radix supplies menu roles, roving focus, typeahead, Escape dismissal, and
116
+ submenu keyboard behavior. Do not put arbitrary controls inside an item. Make
117
+ every essential command available from a visible button, menu, toolbar, or
118
+ command palette as well as the context menu.
119
+
120
+ ## Platform behavior
121
+
122
+ With `items`, a user-initiated context-menu gesture automatically opens the
123
+ host-native menu when `nativeMenu` is advertised. The pointer position is its
124
+ anchor, `selectedId` is delivered to `onSelectItem`, and dismissal is a no-op.
125
+ No portable menu is rendered while that native request is open.
126
+
127
+ When the service is not advertised, including web and iOS, the same items
128
+ automatically render through the existing Radix anatomy. If advertised
129
+ availability becomes stale and the host returns fallback, the original gesture
130
+ is replayed into that portable implementation. Icons and destructive styling
131
+ are portable in v1; `sfSymbol` is reserved and is not posted to or rendered by
132
+ the native service.
133
+
134
+ Shortcuts are display metadata only. They do not register keyboard handlers;
135
+ keep command execution keyed by `onSelectItem`. See
136
+ [`host-native-menu.md`](../../lib/host-native-menu.md) for host limits and
137
+ cancellation behavior.
138
+
139
+ ## Do
140
+
141
+ - Name items with short, verb-led labels.
142
+ - Put JSX shortcuts at the end with `ContextMenuShortcut`, or declare shortcut
143
+ display metadata in `items`.
144
+ - Separate destructive commands from routine commands.
145
+ - Keep submenu depth shallow.
146
+
147
+ ## Don't
148
+
149
+ - Do not make a context menu the only way to complete a task.
150
+ - Do not mix `items` with `ContextMenuContent` children.
151
+ - Do not treat shortcut metadata as a registered keyboard command.
152
+ - Do not use raw colors, shadows, or radii for menu states.
153
+
154
+ ## Testing
155
+
156
+ Exercise secondary click, long press where supported, keyboard navigation,
157
+ Escape, disabled items, checkbox/radio state, submenus, native selection and
158
+ dismissal, service availability changes, and portable fallback.
@@ -0,0 +1,165 @@
1
+ # Dropdown menu
2
+
3
+ ## Purpose
4
+
5
+ `DropdownMenu` presents a compact list of commands from a visible trigger. Use
6
+ it for overflow actions, view commands, and small command groups. Its
7
+ declarative item API automatically adopts the host-native menu when available.
8
+
9
+ Use `Select` for a form value, `Combobox` for searchable selection,
10
+ `ContextMenu` for commands attached to the pointer target, and `Popover` when
11
+ the surface needs arbitrary interactive content rather than menu items.
12
+
13
+ ## Usage patterns
14
+
15
+ Use `items` for standard command menus:
16
+
17
+ ```tsx
18
+ import { Copy } from 'lucide-react'
19
+ import {
20
+ Button,
21
+ DropdownMenu,
22
+ DropdownMenuTrigger,
23
+ type MenuItems,
24
+ } from '@moldable-ai/ui'
25
+
26
+ const items: MenuItems[] = [
27
+ {
28
+ id: 'duplicate',
29
+ label: 'Duplicate',
30
+ icon: Copy,
31
+ shortcut: { key: 'd', modifiers: ['cmd'] },
32
+ },
33
+ { id: 'divider', kind: 'separator' },
34
+ { id: 'trash', label: 'Move to trash', destructive: true },
35
+ ]
36
+
37
+ function ProjectActionsMenu() {
38
+ return (
39
+ <DropdownMenu items={items} onSelectItem={runCommand}>
40
+ <DropdownMenuTrigger asChild>
41
+ <Button type="button" variant="outline" size="sm">
42
+ Actions
43
+ </Button>
44
+ </DropdownMenuTrigger>
45
+ </DropdownMenu>
46
+ )
47
+ }
48
+ ```
49
+
50
+ Use children for custom portable-only content or per-row handlers:
51
+
52
+ ```tsx
53
+ import {
54
+ Button,
55
+ DropdownMenu,
56
+ DropdownMenuContent,
57
+ DropdownMenuItem,
58
+ DropdownMenuSeparator,
59
+ DropdownMenuShortcut,
60
+ DropdownMenuTrigger,
61
+ } from '@moldable-ai/ui'
62
+
63
+ function ProjectActionsMenu() {
64
+ return (
65
+ <DropdownMenu open={open} onOpenChange={setOpen}>
66
+ <DropdownMenuTrigger asChild>
67
+ <Button type="button" variant="outline" size="sm">
68
+ Actions
69
+ </Button>
70
+ </DropdownMenuTrigger>
71
+ <DropdownMenuContent sideOffset={4} align="end">
72
+ <DropdownMenuItem onSelect={duplicate}>
73
+ Duplicate
74
+ <DropdownMenuShortcut>⌘D</DropdownMenuShortcut>
75
+ </DropdownMenuItem>
76
+ <DropdownMenuSeparator />
77
+ <DropdownMenuItem variant="destructive" onSelect={moveToTrash}>
78
+ Move to trash
79
+ </DropdownMenuItem>
80
+ </DropdownMenuContent>
81
+ </DropdownMenu>
82
+ )
83
+ }
84
+ ```
85
+
86
+ ## Anatomy
87
+
88
+ `DropdownMenuTrigger` advertises the menu and `DropdownMenuContent` contains
89
+ the commands. Groups, labels, separators, checkbox items, radio groups,
90
+ shortcuts, and submenus are available when the command set needs structure.
91
+
92
+ ## API summary
93
+
94
+ - `DropdownMenu` supports `items?: MenuItems[]`,
95
+ `onSelectItem?: (id: string) => void`, `open`, `defaultOpen`,
96
+ `onOpenChange`, `dir`, and `modal`.
97
+ - A `MenuItems` value supports `id`, `kind`, `label`, portable `icon`, reserved
98
+ `sfSymbol`, `enabled`, `checked`, `shortcut`, `destructive`, and `submenu`.
99
+ - Do not provide `DropdownMenuContent` together with `items`. In development
100
+ this reports an error, and `items` wins.
101
+ - `DropdownMenuTrigger` accepts button props and `asChild`.
102
+ - `DropdownMenuContent` accepts positioning props including `side`, `align`,
103
+ and `sideOffset`; this wrapper defaults `sideOffset` to `4`.
104
+ - `DropdownMenuItem` supports menu item props such as `onSelect` and
105
+ `disabled`, plus `inset` and `variant="default" | "destructive"`.
106
+ - `DropdownMenuCheckboxItem` supports `checked`; radio items belong inside
107
+ `DropdownMenuRadioGroup`, whose `value` and `onValueChange` manage the group.
108
+ - `DropdownMenuSub` supports `open`, `defaultOpen`, and `onOpenChange`.
109
+ - `DropdownMenuLabel` and `DropdownMenuSubTrigger` support `inset`.
110
+
111
+ ## States and interaction
112
+
113
+ Use controlled `open` when another surface, including a native-menu fallback,
114
+ must open the portable menu. Checkbox and radio items retain menu semantics and
115
+ should represent durable state. Keep command order stable and place destructive
116
+ commands last or in a separated group.
117
+
118
+ Menu surfaces use `bg-popover`, `text-popover-foreground`,
119
+ `rounded-overlay`, and `shadow-overlay`. Focused and open submenu rows use the
120
+ accent roles; destructive rows use the semantic destructive roles.
121
+
122
+ ## Keyboard and accessibility
123
+
124
+ Radix supplies menu roles, trigger semantics, roving focus, typeahead, Escape
125
+ dismissal, and submenu navigation. Give icon-only triggers an accessible name
126
+ and a tooltip. Do not place form fields or arbitrary focusable content inside a
127
+ menu item; use `Popover` or `Dialog`.
128
+
129
+ ## Platform behavior
130
+
131
+ With `items`, pointer and keyboard trigger activation automatically opens the
132
+ host-native menu when `nativeMenu` is advertised. The trigger rectangle is its
133
+ anchor, `selectedId` is delivered to `onSelectItem`, and dismissal is a no-op.
134
+ No portable menu is rendered while that native request is open.
135
+
136
+ Without the advertisement, including web and iOS, the same items automatically
137
+ render through the existing Radix anatomy. A stale advertisement that returns
138
+ fallback opens the portable menu as well. Icons and destructive styling are
139
+ portable in v1; `sfSymbol` is reserved and is not posted to or rendered by the
140
+ native service.
141
+
142
+ Shortcuts are display metadata only. They do not register keyboard handlers;
143
+ keep command execution keyed by `onSelectItem`. See
144
+ [`host-native-menu.md`](../../lib/host-native-menu.md) for host limits and
145
+ cancellation behavior.
146
+
147
+ ## Do
148
+
149
+ - Use a visible trigger that communicates the menu's scope.
150
+ - Keep labels concise and verb-led.
151
+ - Use checkbox and radio items for menu-owned state.
152
+ - Keep submenus shallow and provide shortcuts only for real commands.
153
+
154
+ ## Don't
155
+
156
+ - Do not use a command menu as a form-value selector.
157
+ - Do not hide a single primary action behind an overflow trigger.
158
+ - Do not mix `items` with `DropdownMenuContent` children.
159
+ - Do not treat shortcut metadata as a registered keyboard command.
160
+
161
+ ## Testing
162
+
163
+ Exercise pointer and keyboard opening, focus movement, typeahead, Escape,
164
+ disabled items, checkbox/radio state, submenus, native selection and dismissal,
165
+ service availability changes, and portable fallback.
@@ -0,0 +1,90 @@
1
+ # Hover card
2
+
3
+ ## Purpose
4
+
5
+ `HoverCard` reveals a richer, non-essential preview for a referenced object,
6
+ usually a link. It helps users decide whether to open a person, file, project,
7
+ or other destination without leaving the current view.
8
+
9
+ Use `Tooltip` for a terse, non-interactive clarification of an already named
10
+ control. Use `HoverCard` for preview content with several lines or pieces of
11
+ metadata. Use `Popover` when the surface contains actions, fields, settings, or
12
+ other interactive content.
13
+
14
+ ## Usage patterns
15
+
16
+ ```tsx
17
+ import { HoverCard, HoverCardContent, HoverCardTrigger } from '@moldable-ai/ui'
18
+
19
+ function ProjectPreview() {
20
+ return (
21
+ <HoverCard openDelay={400} closeDelay={150}>
22
+ <HoverCardTrigger href="/projects/atlas">
23
+ Atlas migration
24
+ </HoverCardTrigger>
25
+ <HoverCardContent side="right" align="start">
26
+ <p className="text-ui-label font-medium">Atlas migration</p>
27
+ <p className="text-text-secondary text-ui-body">
28
+ Infrastructure move · updated 12 minutes ago
29
+ </p>
30
+ </HoverCardContent>
31
+ </HoverCard>
32
+ )
33
+ }
34
+ ```
35
+
36
+ The trigger is link-based by default and accepts anchor props. Keep the
37
+ destination usable without opening the preview.
38
+
39
+ ## Anatomy
40
+
41
+ `HoverCard` owns timing and open state. `HoverCardTrigger` references the
42
+ previewed object. `HoverCardContent` is portalled and collision-aware; this
43
+ wrapper defaults to `align="center"`, `sideOffset={4}`, and a `w-64` preview.
44
+
45
+ ## API summary
46
+
47
+ - `HoverCard` supports `open`, `defaultOpen`, `onOpenChange`, `openDelay`, and
48
+ `closeDelay`.
49
+ - `HoverCardTrigger` accepts anchor props, including `href`.
50
+ - `HoverCardContent` accepts positioning props including `side`, `align`, and
51
+ `sideOffset`, plus `forceMount` and outside-interaction handlers.
52
+
53
+ ## States and interaction
54
+
55
+ The preview must remain supplementary. Touch users and users who never hover
56
+ must still be able to understand and activate the trigger. Keep delay changes
57
+ local and deliberate so neighboring previews do not flicker while the pointer
58
+ moves through a collection.
59
+
60
+ Content uses `bg-popover`, `text-popover-foreground`, `rounded-overlay`, and
61
+ `shadow-overlay`. Use `text-text-secondary` for supporting preview metadata;
62
+ do not invent a preview-only palette or elevation.
63
+
64
+ ## Keyboard and accessibility
65
+
66
+ The trigger must retain its own accessible name and destination. Do not put
67
+ required instructions only in the card. If content must receive focus or
68
+ contain controls, switch to `Popover`, whose explicit trigger and dismissal
69
+ model fit interactive content.
70
+
71
+ ## Do
72
+
73
+ - Preview the same object the trigger names.
74
+ - Keep content concise enough to scan without scrolling.
75
+ - Include metadata that helps a navigation decision.
76
+ - Preserve a working link or other primary path on the trigger.
77
+
78
+ ## Don't
79
+
80
+ - Do not repeat a one-line label that belongs in `Tooltip`.
81
+ - Do not place buttons, links, form fields, or required actions in the card;
82
+ use `Popover`.
83
+ - Do not make hover the only way to discover important information.
84
+ - Do not use a hover card as a delayed dialog.
85
+
86
+ ## Moldable considerations
87
+
88
+ Hover cards are portable webview overlays. Keep them within collision-aware
89
+ viewport bounds and avoid previews that cover the fixed desktop chat or a
90
+ primary action for prolonged periods.