@wildo-ai/presets-components 1.1.4 → 1.1.5

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 (705) hide show
  1. package/dist/esm/components/actions/action-bar.d.ts.map +1 -1
  2. package/dist/esm/components/actions/action-bar.js +61 -7
  3. package/dist/esm/components/actions/action-bar.js.map +1 -1
  4. package/dist/esm/components/actions/action-bar.labels.d.ts.map +1 -1
  5. package/dist/esm/components/actions/action-button.d.ts.map +1 -1
  6. package/dist/esm/components/actions/action-button.js +3 -3
  7. package/dist/esm/components/actions/action-button.js.map +1 -1
  8. package/dist/esm/components/actions/action-button.labels.d.ts.map +1 -1
  9. package/dist/esm/components/actions/button-group.d.ts.map +1 -1
  10. package/dist/esm/components/actions/button.d.ts.map +1 -1
  11. package/dist/esm/components/actions/button.js +62 -3
  12. package/dist/esm/components/actions/button.js.map +1 -1
  13. package/dist/esm/components/actions/button.labels.d.ts.map +1 -1
  14. package/dist/esm/components/ai-elements/artifacts/artifact-browser.d.ts.map +1 -1
  15. package/dist/esm/components/ai-elements/artifacts/artifact.d.ts.map +1 -1
  16. package/dist/esm/components/ai-elements/artifacts/artifact.labels.d.ts.map +1 -1
  17. package/dist/esm/components/ai-elements/artifacts/code-block.d.ts.map +1 -1
  18. package/dist/esm/components/ai-elements/artifacts/code-block.js +1 -1
  19. package/dist/esm/components/ai-elements/artifacts/code-block.js.map +1 -1
  20. package/dist/esm/components/ai-elements/artifacts/code-block.labels.d.ts.map +1 -1
  21. package/dist/esm/components/ai-elements/artifacts/diff-block.d.ts +4 -0
  22. package/dist/esm/components/ai-elements/artifacts/diff-block.d.ts.map +1 -0
  23. package/dist/esm/components/ai-elements/artifacts/diff-block.js +165 -0
  24. package/dist/esm/components/ai-elements/artifacts/diff-block.js.map +1 -0
  25. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.d.ts +3 -0
  26. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.d.ts.map +1 -0
  27. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.js +63 -0
  28. package/dist/esm/components/ai-elements/artifacts/diff-block.labels.js.map +1 -0
  29. package/dist/esm/components/ai-elements/artifacts/image.d.ts.map +1 -1
  30. package/dist/esm/components/ai-elements/artifacts/image.labels.d.ts.map +1 -1
  31. package/dist/esm/components/ai-elements/artifacts/shiki-highlighter-runtime.d.ts.map +1 -1
  32. package/dist/esm/components/ai-elements/artifacts/shiki-highlighter.lazy.d.ts.map +1 -1
  33. package/dist/esm/components/ai-elements/artifacts/web-preview.d.ts.map +1 -1
  34. package/dist/esm/components/ai-elements/artifacts/web-preview.labels.d.ts.map +1 -1
  35. package/dist/esm/components/ai-elements/chat/conversation.d.ts.map +1 -1
  36. package/dist/esm/components/ai-elements/chat/conversation.labels.d.ts.map +1 -1
  37. package/dist/esm/components/ai-elements/chat/message.d.ts.map +1 -1
  38. package/dist/esm/components/ai-elements/chat/message.labels.d.ts.map +1 -1
  39. package/dist/esm/components/ai-elements/chat/prompt-input.d.ts.map +1 -1
  40. package/dist/esm/components/ai-elements/chat/prompt-input.labels.d.ts.map +1 -1
  41. package/dist/esm/components/ai-elements/chat/sources.d.ts.map +1 -1
  42. package/dist/esm/components/ai-elements/chat/sources.labels.d.ts.map +1 -1
  43. package/dist/esm/components/ai-elements/chat/suggestion.d.ts.map +1 -1
  44. package/dist/esm/components/ai-elements/chat/suggestion.labels.d.ts.map +1 -1
  45. package/dist/esm/components/ai-elements/decision/approval-argument-fields.d.ts +68 -0
  46. package/dist/esm/components/ai-elements/decision/approval-argument-fields.d.ts.map +1 -0
  47. package/dist/esm/components/ai-elements/decision/approval-argument-fields.js +208 -0
  48. package/dist/esm/components/ai-elements/decision/approval-argument-fields.js.map +1 -0
  49. package/dist/esm/components/ai-elements/decision/approval.d.ts +17 -5
  50. package/dist/esm/components/ai-elements/decision/approval.d.ts.map +1 -1
  51. package/dist/esm/components/ai-elements/decision/approval.js +49 -7
  52. package/dist/esm/components/ai-elements/decision/approval.js.map +1 -1
  53. package/dist/esm/components/ai-elements/decision/decision-request.d.ts.map +1 -1
  54. package/dist/esm/components/ai-elements/decision/decision-request.labels.d.ts.map +1 -1
  55. package/dist/esm/components/ai-elements/execution/confirmation.d.ts.map +1 -1
  56. package/dist/esm/components/ai-elements/execution/confirmation.labels.d.ts.map +1 -1
  57. package/dist/esm/components/ai-elements/execution/queue.d.ts.map +1 -1
  58. package/dist/esm/components/ai-elements/execution/queue.labels.d.ts.map +1 -1
  59. package/dist/esm/components/ai-elements/execution/task.d.ts.map +1 -1
  60. package/dist/esm/components/ai-elements/execution/task.js +1 -1
  61. package/dist/esm/components/ai-elements/execution/task.js.map +1 -1
  62. package/dist/esm/components/ai-elements/execution/task.labels.d.ts.map +1 -1
  63. package/dist/esm/components/ai-elements/execution/tool.d.ts.map +1 -1
  64. package/dist/esm/components/ai-elements/execution/tool.js +8 -1
  65. package/dist/esm/components/ai-elements/execution/tool.js.map +1 -1
  66. package/dist/esm/components/ai-elements/execution/tool.labels.d.ts.map +1 -1
  67. package/dist/esm/components/ai-elements/graph/canvas.d.ts.map +1 -1
  68. package/dist/esm/components/ai-elements/graph/canvas.labels.d.ts.map +1 -1
  69. package/dist/esm/components/ai-elements/graph/connection.d.ts.map +1 -1
  70. package/dist/esm/components/ai-elements/graph/connection.labels.d.ts.map +1 -1
  71. package/dist/esm/components/ai-elements/graph/controls.d.ts.map +1 -1
  72. package/dist/esm/components/ai-elements/graph/controls.labels.d.ts.map +1 -1
  73. package/dist/esm/components/ai-elements/graph/edge.d.ts.map +1 -1
  74. package/dist/esm/components/ai-elements/graph/edge.labels.d.ts.map +1 -1
  75. package/dist/esm/components/ai-elements/graph/graph-runtime.d.ts.map +1 -1
  76. package/dist/esm/components/ai-elements/graph/graph.lazy.d.ts.map +1 -1
  77. package/dist/esm/components/ai-elements/graph/graph.lazy.js +15 -15
  78. package/dist/esm/components/ai-elements/graph/graph.lazy.js.map +1 -1
  79. package/dist/esm/components/ai-elements/graph/node.d.ts.map +1 -1
  80. package/dist/esm/components/ai-elements/graph/node.labels.d.ts.map +1 -1
  81. package/dist/esm/components/ai-elements/graph/panel.d.ts.map +1 -1
  82. package/dist/esm/components/ai-elements/graph/panel.labels.d.ts.map +1 -1
  83. package/dist/esm/components/ai-elements/graph/toolbar.d.ts.map +1 -1
  84. package/dist/esm/components/ai-elements/graph/toolbar.labels.d.ts.map +1 -1
  85. package/dist/esm/components/ai-elements/meta/agent.d.ts +0 -1
  86. package/dist/esm/components/ai-elements/meta/agent.d.ts.map +1 -1
  87. package/dist/esm/components/ai-elements/meta/agent.js +23 -18
  88. package/dist/esm/components/ai-elements/meta/agent.js.map +1 -1
  89. package/dist/esm/components/ai-elements/meta/context.d.ts.map +1 -1
  90. package/dist/esm/components/ai-elements/meta/context.labels.d.ts.map +1 -1
  91. package/dist/esm/components/ai-elements/meta/context.lazy.d.ts.map +1 -1
  92. package/dist/esm/components/ai-elements/meta/context.lazy.js +13 -11
  93. package/dist/esm/components/ai-elements/meta/context.lazy.js.map +1 -1
  94. package/dist/esm/components/ai-elements/meta/model-selector.d.ts.map +1 -1
  95. package/dist/esm/components/ai-elements/meta/model-selector.labels.d.ts.map +1 -1
  96. package/dist/esm/components/ai-elements/meta/open-in-chat.d.ts.map +1 -1
  97. package/dist/esm/components/ai-elements/meta/open-in-chat.labels.d.ts.map +1 -1
  98. package/dist/esm/components/ai-elements/shared/loader.d.ts.map +1 -1
  99. package/dist/esm/components/ai-elements/shared/loader.labels.d.ts.map +1 -1
  100. package/dist/esm/components/ai-elements/shared/shimmer.d.ts.map +1 -1
  101. package/dist/esm/components/ai-elements/shared/shimmer.labels.d.ts.map +1 -1
  102. package/dist/esm/components/ai-elements/stream/execution-stream.d.ts.map +1 -1
  103. package/dist/esm/components/ai-elements/stream/execution-stream.labels.d.ts.map +1 -1
  104. package/dist/esm/components/ai-elements/trace/chain-of-thought.d.ts +6 -0
  105. package/dist/esm/components/ai-elements/trace/chain-of-thought.d.ts.map +1 -1
  106. package/dist/esm/components/ai-elements/trace/chain-of-thought.js +13 -1
  107. package/dist/esm/components/ai-elements/trace/chain-of-thought.js.map +1 -1
  108. package/dist/esm/components/ai-elements/trace/chain-of-thought.labels.d.ts.map +1 -1
  109. package/dist/esm/components/ai-elements/trace/checkpoint.d.ts.map +1 -1
  110. package/dist/esm/components/ai-elements/trace/checkpoint.labels.d.ts.map +1 -1
  111. package/dist/esm/components/ai-elements/trace/inline-citation.d.ts.map +1 -1
  112. package/dist/esm/components/ai-elements/trace/inline-citation.labels.d.ts.map +1 -1
  113. package/dist/esm/components/ai-elements/trace/plan.d.ts.map +1 -1
  114. package/dist/esm/components/ai-elements/trace/plan.labels.d.ts.map +1 -1
  115. package/dist/esm/components/ai-elements/trace/reasoning.d.ts.map +1 -1
  116. package/dist/esm/components/ai-elements/trace/reasoning.labels.d.ts.map +1 -1
  117. package/dist/esm/components/app/app-layout-consent-gate.d.ts +23 -0
  118. package/dist/esm/components/app/app-layout-consent-gate.d.ts.map +1 -0
  119. package/dist/esm/components/app/app-layout-consent-gate.js +133 -0
  120. package/dist/esm/components/app/app-layout-consent-gate.js.map +1 -0
  121. package/dist/esm/components/app/app-layout-document-acceptance-gate.d.ts +19 -0
  122. package/dist/esm/components/app/app-layout-document-acceptance-gate.d.ts.map +1 -0
  123. package/dist/esm/components/app/app-layout-document-acceptance-gate.js +56 -0
  124. package/dist/esm/components/app/app-layout-document-acceptance-gate.js.map +1 -0
  125. package/dist/esm/components/app/app-layout-main-container.d.ts.map +1 -1
  126. package/dist/esm/components/app/app-layout-main-container.labels.d.ts.map +1 -1
  127. package/dist/esm/components/app/app-layout-main-container.labels.js +21 -0
  128. package/dist/esm/components/app/app-layout-main-container.labels.js.map +1 -1
  129. package/dist/esm/components/app/public-layout-main-container.d.ts +1 -1
  130. package/dist/esm/components/app/public-layout-main-container.d.ts.map +1 -1
  131. package/dist/esm/components/app/public-layout-main-container.js +9 -8
  132. package/dist/esm/components/app/public-layout-main-container.js.map +1 -1
  133. package/dist/esm/components/app/public-layout-main-container.labels.d.ts.map +1 -1
  134. package/dist/esm/components/app/public-layout-terms.d.ts +46 -0
  135. package/dist/esm/components/app/public-layout-terms.d.ts.map +1 -0
  136. package/dist/esm/components/app/public-layout-terms.js +137 -0
  137. package/dist/esm/components/app/public-layout-terms.js.map +1 -0
  138. package/dist/esm/components/billing/billing-format.utils.d.ts.map +1 -1
  139. package/dist/esm/components/billing/billing-invoice-history.d.ts +1 -1
  140. package/dist/esm/components/billing/billing-invoice-history.d.ts.map +1 -1
  141. package/dist/esm/components/billing/billing-invoice-history.js +3 -1
  142. package/dist/esm/components/billing/billing-invoice-history.js.map +1 -1
  143. package/dist/esm/components/billing/billing-invoice-history.labels.d.ts.map +1 -1
  144. package/dist/esm/components/billing/billing-invoice-history.labels.js +1 -0
  145. package/dist/esm/components/billing/billing-invoice-history.labels.js.map +1 -1
  146. package/dist/esm/components/billing/billing-plan-change-preview.d.ts +5 -0
  147. package/dist/esm/components/billing/billing-plan-change-preview.d.ts.map +1 -0
  148. package/dist/esm/components/billing/billing-plan-change-preview.js +22 -0
  149. package/dist/esm/components/billing/billing-plan-change-preview.js.map +1 -0
  150. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts +3 -0
  151. package/dist/esm/components/billing/billing-plan-change-preview.labels.d.ts.map +1 -0
  152. package/dist/esm/components/billing/billing-plan-change-preview.labels.js +19 -0
  153. package/dist/esm/components/billing/billing-plan-change-preview.labels.js.map +1 -0
  154. package/dist/esm/components/billing/billing-portal-link.d.ts +1 -1
  155. package/dist/esm/components/billing/billing-portal-link.d.ts.map +1 -1
  156. package/dist/esm/components/billing/billing-portal-link.js +3 -1
  157. package/dist/esm/components/billing/billing-portal-link.js.map +1 -1
  158. package/dist/esm/components/billing/billing-portal-link.labels.d.ts.map +1 -1
  159. package/dist/esm/components/billing/billing-portal-link.labels.js +1 -0
  160. package/dist/esm/components/billing/billing-portal-link.labels.js.map +1 -1
  161. package/dist/esm/components/billing/billing-pricing-table.d.ts +1 -1
  162. package/dist/esm/components/billing/billing-pricing-table.d.ts.map +1 -1
  163. package/dist/esm/components/billing/billing-pricing-table.js +4 -2
  164. package/dist/esm/components/billing/billing-pricing-table.js.map +1 -1
  165. package/dist/esm/components/billing/billing-pricing-table.labels.d.ts.map +1 -1
  166. package/dist/esm/components/billing/billing-pricing-table.labels.js +1 -0
  167. package/dist/esm/components/billing/billing-pricing-table.labels.js.map +1 -1
  168. package/dist/esm/components/billing/billing-subscription-status.d.ts +1 -1
  169. package/dist/esm/components/billing/billing-subscription-status.d.ts.map +1 -1
  170. package/dist/esm/components/billing/billing-subscription-status.js +3 -1
  171. package/dist/esm/components/billing/billing-subscription-status.js.map +1 -1
  172. package/dist/esm/components/billing/billing-subscription-status.labels.d.ts.map +1 -1
  173. package/dist/esm/components/billing/billing-subscription-status.labels.js +1 -0
  174. package/dist/esm/components/billing/billing-subscription-status.labels.js.map +1 -1
  175. package/dist/esm/components/billing/billing-usage-dashboard.d.ts +1 -1
  176. package/dist/esm/components/billing/billing-usage-dashboard.d.ts.map +1 -1
  177. package/dist/esm/components/billing/billing-usage-dashboard.js +4 -4
  178. package/dist/esm/components/billing/billing-usage-dashboard.js.map +1 -1
  179. package/dist/esm/components/billing/billing-usage-dashboard.labels.d.ts.map +1 -1
  180. package/dist/esm/components/billing/billing-usage-dashboard.labels.js +2 -0
  181. package/dist/esm/components/billing/billing-usage-dashboard.labels.js.map +1 -1
  182. package/dist/esm/components/data-display/avatar.d.ts.map +1 -1
  183. package/dist/esm/components/data-display/avatar.labels.d.ts.map +1 -1
  184. package/dist/esm/components/data-display/badge.d.ts.map +1 -1
  185. package/dist/esm/components/data-display/badge.js +16 -15
  186. package/dist/esm/components/data-display/badge.js.map +1 -1
  187. package/dist/esm/components/data-display/badge.labels.d.ts.map +1 -1
  188. package/dist/esm/components/data-display/description-list.d.ts +2 -1
  189. package/dist/esm/components/data-display/description-list.d.ts.map +1 -1
  190. package/dist/esm/components/data-display/description-list.js +24 -8
  191. package/dist/esm/components/data-display/description-list.js.map +1 -1
  192. package/dist/esm/components/data-display/description-list.labels.d.ts.map +1 -1
  193. package/dist/esm/components/data-display/duration.d.ts +15 -0
  194. package/dist/esm/components/data-display/duration.d.ts.map +1 -0
  195. package/dist/esm/components/data-display/duration.js +50 -0
  196. package/dist/esm/components/data-display/duration.js.map +1 -0
  197. package/dist/esm/components/data-display/duration.labels.d.ts +15 -0
  198. package/dist/esm/components/data-display/duration.labels.d.ts.map +1 -0
  199. package/dist/esm/components/data-display/duration.labels.js +35 -0
  200. package/dist/esm/components/data-display/duration.labels.js.map +1 -0
  201. package/dist/esm/components/data-display/formatters/display-field-address.d.ts +21 -0
  202. package/dist/esm/components/data-display/formatters/display-field-address.d.ts.map +1 -0
  203. package/dist/esm/components/data-display/formatters/display-field-address.js +75 -0
  204. package/dist/esm/components/data-display/formatters/display-field-address.js.map +1 -0
  205. package/dist/esm/components/data-display/formatters/display-field-address.labels.d.ts +3 -0
  206. package/dist/esm/components/data-display/formatters/display-field-address.labels.d.ts.map +1 -0
  207. package/dist/esm/components/data-display/formatters/display-field-address.labels.js +13 -0
  208. package/dist/esm/components/data-display/formatters/display-field-address.labels.js.map +1 -0
  209. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.d.ts.map +1 -1
  210. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.js +6 -2
  211. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.js.map +1 -1
  212. package/dist/esm/components/data-display/formatters/display-field-bigdecimal.labels.d.ts.map +1 -1
  213. package/dist/esm/components/data-display/formatters/display-field-boolean.d.ts.map +1 -1
  214. package/dist/esm/components/data-display/formatters/display-field-boolean.js +2 -2
  215. package/dist/esm/components/data-display/formatters/display-field-boolean.js.map +1 -1
  216. package/dist/esm/components/data-display/formatters/display-field-boolean.labels.d.ts.map +1 -1
  217. package/dist/esm/components/data-display/formatters/display-field-code.d.ts.map +1 -1
  218. package/dist/esm/components/data-display/formatters/display-field-code.js +2 -2
  219. package/dist/esm/components/data-display/formatters/display-field-code.js.map +1 -1
  220. package/dist/esm/components/data-display/formatters/display-field-code.labels.d.ts.map +1 -1
  221. package/dist/esm/components/data-display/formatters/display-field-date.d.ts +3 -3
  222. package/dist/esm/components/data-display/formatters/display-field-date.d.ts.map +1 -1
  223. package/dist/esm/components/data-display/formatters/display-field-date.js +17 -4
  224. package/dist/esm/components/data-display/formatters/display-field-date.js.map +1 -1
  225. package/dist/esm/components/data-display/formatters/display-field-date.labels.d.ts.map +1 -1
  226. package/dist/esm/components/data-display/formatters/display-field-datetime.d.ts +3 -3
  227. package/dist/esm/components/data-display/formatters/display-field-datetime.d.ts.map +1 -1
  228. package/dist/esm/components/data-display/formatters/display-field-datetime.js +17 -4
  229. package/dist/esm/components/data-display/formatters/display-field-datetime.js.map +1 -1
  230. package/dist/esm/components/data-display/formatters/display-field-datetime.labels.d.ts.map +1 -1
  231. package/dist/esm/components/data-display/formatters/display-field-duration.d.ts.map +1 -1
  232. package/dist/esm/components/data-display/formatters/display-field-duration.labels.d.ts.map +1 -1
  233. package/dist/esm/components/data-display/formatters/display-field-enum.d.ts.map +1 -1
  234. package/dist/esm/components/data-display/formatters/display-field-enum.js +12 -8
  235. package/dist/esm/components/data-display/formatters/display-field-enum.js.map +1 -1
  236. package/dist/esm/components/data-display/formatters/display-field-enum.labels.d.ts.map +1 -1
  237. package/dist/esm/components/data-display/formatters/display-field-file-audio.d.ts.map +1 -1
  238. package/dist/esm/components/data-display/formatters/display-field-file-audio.js +2 -1
  239. package/dist/esm/components/data-display/formatters/display-field-file-audio.js.map +1 -1
  240. package/dist/esm/components/data-display/formatters/display-field-file-audio.labels.d.ts.map +1 -1
  241. package/dist/esm/components/data-display/formatters/display-field-file-document.d.ts +4 -1
  242. package/dist/esm/components/data-display/formatters/display-field-file-document.d.ts.map +1 -1
  243. package/dist/esm/components/data-display/formatters/display-field-file-document.js +18 -5
  244. package/dist/esm/components/data-display/formatters/display-field-file-document.js.map +1 -1
  245. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.d.ts.map +1 -1
  246. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.js +20 -0
  247. package/dist/esm/components/data-display/formatters/display-field-file-document.labels.js.map +1 -1
  248. package/dist/esm/components/data-display/formatters/display-field-file-gallery.d.ts.map +1 -1
  249. package/dist/esm/components/data-display/formatters/display-field-file-gallery.labels.d.ts.map +1 -1
  250. package/dist/esm/components/data-display/formatters/display-field-file-image.d.ts.map +1 -1
  251. package/dist/esm/components/data-display/formatters/display-field-file-image.js +3 -1
  252. package/dist/esm/components/data-display/formatters/display-field-file-image.js.map +1 -1
  253. package/dist/esm/components/data-display/formatters/display-field-file-image.labels.d.ts.map +1 -1
  254. package/dist/esm/components/data-display/formatters/display-field-file-video.d.ts.map +1 -1
  255. package/dist/esm/components/data-display/formatters/display-field-file-video.labels.d.ts.map +1 -1
  256. package/dist/esm/components/data-display/formatters/display-field-file.d.ts.map +1 -1
  257. package/dist/esm/components/data-display/formatters/display-field-file.js +2 -2
  258. package/dist/esm/components/data-display/formatters/display-field-file.js.map +1 -1
  259. package/dist/esm/components/data-display/formatters/display-field-file.labels.d.ts.map +1 -1
  260. package/dist/esm/components/data-display/formatters/display-field-file.labels.js +1 -0
  261. package/dist/esm/components/data-display/formatters/display-field-file.labels.js.map +1 -1
  262. package/dist/esm/components/data-display/formatters/display-field-format.utils.d.ts.map +1 -1
  263. package/dist/esm/components/data-display/formatters/display-field-i18n.utils.d.ts.map +1 -1
  264. package/dist/esm/components/data-display/formatters/display-field-money.d.ts.map +1 -1
  265. package/dist/esm/components/data-display/formatters/display-field-money.labels.d.ts.map +1 -1
  266. package/dist/esm/components/data-display/formatters/display-field-number.d.ts.map +1 -1
  267. package/dist/esm/components/data-display/formatters/display-field-number.js +2 -2
  268. package/dist/esm/components/data-display/formatters/display-field-number.js.map +1 -1
  269. package/dist/esm/components/data-display/formatters/display-field-number.labels.d.ts.map +1 -1
  270. package/dist/esm/components/data-display/formatters/display-field-phone.d.ts.map +1 -1
  271. package/dist/esm/components/data-display/formatters/display-field-phone.labels.d.ts.map +1 -1
  272. package/dist/esm/components/data-display/formatters/display-field-range-bigdecimal.d.ts.map +1 -1
  273. package/dist/esm/components/data-display/formatters/display-field-range-bigdecimal.labels.d.ts.map +1 -1
  274. package/dist/esm/components/data-display/formatters/display-field-range-date.d.ts.map +1 -1
  275. package/dist/esm/components/data-display/formatters/display-field-range-date.labels.d.ts.map +1 -1
  276. package/dist/esm/components/data-display/formatters/display-field-range-datetime.d.ts.map +1 -1
  277. package/dist/esm/components/data-display/formatters/display-field-range-datetime.labels.d.ts.map +1 -1
  278. package/dist/esm/components/data-display/formatters/display-field-range-money.d.ts.map +1 -1
  279. package/dist/esm/components/data-display/formatters/display-field-range-money.labels.d.ts.map +1 -1
  280. package/dist/esm/components/data-display/formatters/display-field-range-number.d.ts.map +1 -1
  281. package/dist/esm/components/data-display/formatters/display-field-range-number.labels.d.ts.map +1 -1
  282. package/dist/esm/components/data-display/formatters/display-field-range-time.d.ts.map +1 -1
  283. package/dist/esm/components/data-display/formatters/display-field-range-time.labels.d.ts.map +1 -1
  284. package/dist/esm/components/data-display/formatters/display-field-string.d.ts.map +1 -1
  285. package/dist/esm/components/data-display/formatters/display-field-string.js +82 -7
  286. package/dist/esm/components/data-display/formatters/display-field-string.js.map +1 -1
  287. package/dist/esm/components/data-display/formatters/display-field-string.labels.d.ts.map +1 -1
  288. package/dist/esm/components/data-display/formatters/display-field-time.d.ts.map +1 -1
  289. package/dist/esm/components/data-display/formatters/display-field-time.labels.d.ts.map +1 -1
  290. package/dist/esm/components/data-display/identifier.d.ts +19 -0
  291. package/dist/esm/components/data-display/identifier.d.ts.map +1 -0
  292. package/dist/esm/components/data-display/identifier.js +21 -0
  293. package/dist/esm/components/data-display/identifier.js.map +1 -0
  294. package/dist/esm/components/data-display/kbd.d.ts +17 -0
  295. package/dist/esm/components/data-display/kbd.d.ts.map +1 -0
  296. package/dist/esm/components/data-display/kbd.js +18 -0
  297. package/dist/esm/components/data-display/kbd.js.map +1 -0
  298. package/dist/esm/components/data-display/markdown-content.d.ts.map +1 -1
  299. package/dist/esm/components/data-display/markdown-stream-runtime.d.ts.map +1 -1
  300. package/dist/esm/components/data-display/markdown-stream.lazy.d.ts.map +1 -1
  301. package/dist/esm/components/data-display/markdown-stream.lazy.js +13 -2
  302. package/dist/esm/components/data-display/markdown-stream.lazy.js.map +1 -1
  303. package/dist/esm/components/data-display/notification-indicator.d.ts.map +1 -1
  304. package/dist/esm/components/data-display/notification-indicator.js +3 -11
  305. package/dist/esm/components/data-display/notification-indicator.js.map +1 -1
  306. package/dist/esm/components/data-display/notification-indicator.labels.d.ts.map +1 -1
  307. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.d.ts +63 -0
  308. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.d.ts.map +1 -0
  309. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.js +75 -0
  310. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.js.map +1 -0
  311. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.d.ts +32 -0
  312. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.d.ts.map +1 -0
  313. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.js +36 -0
  314. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer-worker.vite.js.map +1 -0
  315. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.d.ts +46 -6
  316. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  317. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.js +70 -46
  318. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.js.map +1 -1
  319. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.d.ts +12 -2
  320. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.d.ts.map +1 -1
  321. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.js +3 -2
  322. package/dist/esm/components/data-display/pdf-viewer/pdf-viewer.lazy.js.map +1 -1
  323. package/dist/esm/components/data-display/timeline.d.ts +3 -0
  324. package/dist/esm/components/data-display/timeline.d.ts.map +1 -0
  325. package/dist/esm/components/data-display/timeline.js +92 -0
  326. package/dist/esm/components/data-display/timeline.js.map +1 -0
  327. package/dist/esm/components/feedback/celebration-overlay.d.ts +13 -4
  328. package/dist/esm/components/feedback/celebration-overlay.d.ts.map +1 -1
  329. package/dist/esm/components/feedback/celebration-overlay.js +146 -22
  330. package/dist/esm/components/feedback/celebration-overlay.js.map +1 -1
  331. package/dist/esm/components/feedback/celebration-overlay.labels.d.ts.map +1 -1
  332. package/dist/esm/components/feedback/danger-zone.d.ts.map +1 -1
  333. package/dist/esm/components/feedback/danger-zone.labels.d.ts.map +1 -1
  334. package/dist/esm/components/feedback/empty-state.d.ts.map +1 -1
  335. package/dist/esm/components/feedback/empty-state.js.map +1 -1
  336. package/dist/esm/components/feedback/empty-state.labels.d.ts.map +1 -1
  337. package/dist/esm/components/feedback/error-display.d.ts.map +1 -1
  338. package/dist/esm/components/feedback/error-display.labels.d.ts.map +1 -1
  339. package/dist/esm/components/feedback/features/feature-limit-indicator.d.ts.map +1 -1
  340. package/dist/esm/components/feedback/features/feature-limit-indicator.labels.d.ts.map +1 -1
  341. package/dist/esm/components/feedback/features/feature-lock-badge.d.ts.map +1 -1
  342. package/dist/esm/components/feedback/features/feature-lock-badge.labels.d.ts.map +1 -1
  343. package/dist/esm/components/feedback/features/feature-unavailable-dialog.d.ts.map +1 -1
  344. package/dist/esm/components/feedback/features/feature-unavailable-dialog.labels.d.ts.map +1 -1
  345. package/dist/esm/components/feedback/features/feature-unavailable-prompt.d.ts.map +1 -1
  346. package/dist/esm/components/feedback/features/feature-unavailable-prompt.js.map +1 -1
  347. package/dist/esm/components/feedback/features/feature-unavailable-prompt.labels.d.ts.map +1 -1
  348. package/dist/esm/components/feedback/loading-overlay.d.ts.map +1 -1
  349. package/dist/esm/components/feedback/loading-overlay.labels.d.ts.map +1 -1
  350. package/dist/esm/components/feedback/loading-spinner.d.ts.map +1 -1
  351. package/dist/esm/components/feedback/loading-spinner.labels.d.ts.map +1 -1
  352. package/dist/esm/components/feedback/notification-center.d.ts.map +1 -1
  353. package/dist/esm/components/feedback/notification-center.js +5 -5
  354. package/dist/esm/components/feedback/notification-center.js.map +1 -1
  355. package/dist/esm/components/feedback/operations-confirm-critical.d.ts +1 -1
  356. package/dist/esm/components/feedback/operations-confirm-critical.d.ts.map +1 -1
  357. package/dist/esm/components/feedback/operations-confirm-critical.js +9 -7
  358. package/dist/esm/components/feedback/operations-confirm-critical.js.map +1 -1
  359. package/dist/esm/components/feedback/operations-confirm-critical.labels.d.ts.map +1 -1
  360. package/dist/esm/components/feedback/progress.d.ts.map +1 -1
  361. package/dist/esm/components/feedback/progress.labels.d.ts.map +1 -1
  362. package/dist/esm/components/feedback/skeleton.d.ts.map +1 -1
  363. package/dist/esm/components/feedback/skeleton.labels.d.ts.map +1 -1
  364. package/dist/esm/components/feedback/toast.d.ts.map +1 -1
  365. package/dist/esm/components/feedback/toast.labels.d.ts.map +1 -1
  366. package/dist/esm/components/form/autosave-indicator.d.ts.map +1 -1
  367. package/dist/esm/components/form/autosave-indicator.labels.d.ts.map +1 -1
  368. package/dist/esm/components/form/chromes/field.d.ts.map +1 -1
  369. package/dist/esm/components/form/chromes/field.js +11 -3
  370. package/dist/esm/components/form/chromes/field.js.map +1 -1
  371. package/dist/esm/components/form/chromes/field.labels.d.ts.map +1 -1
  372. package/dist/esm/components/form/chromes/form-primitive.d.ts.map +1 -1
  373. package/dist/esm/components/form/chromes/form-primitive.labels.d.ts.map +1 -1
  374. package/dist/esm/components/form/chromes/form-primitive.labels.js +28 -0
  375. package/dist/esm/components/form/chromes/form-primitive.labels.js.map +1 -1
  376. package/dist/esm/components/form/combobox.d.ts.map +1 -1
  377. package/dist/esm/components/form/combobox.js +4 -3
  378. package/dist/esm/components/form/combobox.js.map +1 -1
  379. package/dist/esm/components/form/combobox.labels.d.ts.map +1 -1
  380. package/dist/esm/components/form/controls/boolean/checkbox.d.ts.map +1 -1
  381. package/dist/esm/components/form/controls/boolean/checkbox.js +2 -2
  382. package/dist/esm/components/form/controls/boolean/checkbox.js.map +1 -1
  383. package/dist/esm/components/form/controls/boolean/checkbox.labels.d.ts.map +1 -1
  384. package/dist/esm/components/form/controls/boolean/switch.d.ts.map +1 -1
  385. package/dist/esm/components/form/controls/boolean/switch.labels.d.ts.map +1 -1
  386. package/dist/esm/components/form/controls/boolean/toggle-group-boolean.d.ts.map +1 -1
  387. package/dist/esm/components/form/controls/boolean/toggle-group-boolean.labels.d.ts.map +1 -1
  388. package/dist/esm/components/form/controls/boolean/toggle.d.ts.map +1 -1
  389. package/dist/esm/components/form/controls/boolean/toggle.labels.d.ts.map +1 -1
  390. package/dist/esm/components/form/controls/code-editor/cm6-editor-appearance.d.ts.map +1 -1
  391. package/dist/esm/components/form/controls/code-editor/cm6-editor.d.ts.map +1 -1
  392. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.d.ts.map +1 -1
  393. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.js +11 -2
  394. package/dist/esm/components/form/controls/code-editor/cm6-editor.lazy.js.map +1 -1
  395. package/dist/esm/components/form/controls/code-editor/form-field-code.d.ts.map +1 -1
  396. package/dist/esm/components/form/controls/code-editor/markdown-editor.d.ts.map +1 -1
  397. package/dist/esm/components/form/controls/date-time/calendar.d.ts.map +1 -1
  398. package/dist/esm/components/form/controls/date-time/calendar.labels.d.ts.map +1 -1
  399. package/dist/esm/components/form/controls/date-time/date-range-picker.d.ts.map +1 -1
  400. package/dist/esm/components/form/controls/date-time/date-range-picker.labels.d.ts.map +1 -1
  401. package/dist/esm/components/form/controls/date-time/datepicker.d.ts.map +1 -1
  402. package/dist/esm/components/form/controls/date-time/datepicker.labels.d.ts.map +1 -1
  403. package/dist/esm/components/form/controls/date-time/datetime-picker.d.ts.map +1 -1
  404. package/dist/esm/components/form/controls/date-time/datetime-picker.labels.d.ts.map +1 -1
  405. package/dist/esm/components/form/controls/date-time/datetime-range-picker.d.ts.map +1 -1
  406. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.d.ts.map +1 -1
  407. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.js +11 -2
  408. package/dist/esm/components/form/controls/date-time/datetime-range-picker.labels.js.map +1 -1
  409. package/dist/esm/components/form/controls/date-time/time-picker.d.ts.map +1 -1
  410. package/dist/esm/components/form/controls/date-time/time-picker.labels.d.ts.map +1 -1
  411. package/dist/esm/components/form/controls/date-time/time-range-picker.d.ts.map +1 -1
  412. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.d.ts.map +1 -1
  413. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.js +11 -2
  414. package/dist/esm/components/form/controls/date-time/time-range-picker.labels.js.map +1 -1
  415. package/dist/esm/components/form/controls/enum/radio.d.ts +1 -1
  416. package/dist/esm/components/form/controls/enum/radio.d.ts.map +1 -1
  417. package/dist/esm/components/form/controls/enum/radio.js +13 -12
  418. package/dist/esm/components/form/controls/enum/radio.js.map +1 -1
  419. package/dist/esm/components/form/controls/enum/radio.labels.d.ts.map +1 -1
  420. package/dist/esm/components/form/controls/enum/select-multiple.d.ts.map +1 -1
  421. package/dist/esm/components/form/controls/enum/select-multiple.js +5 -3
  422. package/dist/esm/components/form/controls/enum/select-multiple.js.map +1 -1
  423. package/dist/esm/components/form/controls/enum/select-multiple.labels.d.ts.map +1 -1
  424. package/dist/esm/components/form/controls/enum/select.d.ts.map +1 -1
  425. package/dist/esm/components/form/controls/enum/select.labels.d.ts.map +1 -1
  426. package/dist/esm/components/form/controls/enum/toggle-group.d.ts.map +1 -1
  427. package/dist/esm/components/form/controls/enum/toggle-group.js +96 -5
  428. package/dist/esm/components/form/controls/enum/toggle-group.js.map +1 -1
  429. package/dist/esm/components/form/controls/enum/toggle-group.labels.d.ts.map +1 -1
  430. package/dist/esm/components/form/controls/file/file-upload.d.ts.map +1 -1
  431. package/dist/esm/components/form/controls/file/file-upload.labels.d.ts.map +1 -1
  432. package/dist/esm/components/form/controls/file/image-crop.d.ts.map +1 -1
  433. package/dist/esm/components/form/controls/file/image-crop.labels.d.ts.map +1 -1
  434. package/dist/esm/components/form/controls/file/providers/dropbox-picker.d.ts +44 -0
  435. package/dist/esm/components/form/controls/file/providers/dropbox-picker.d.ts.map +1 -0
  436. package/dist/esm/components/form/controls/file/providers/dropbox-picker.js +137 -0
  437. package/dist/esm/components/form/controls/file/providers/dropbox-picker.js.map +1 -0
  438. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.d.ts +22 -0
  439. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.d.ts.map +1 -0
  440. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.js +27 -0
  441. package/dist/esm/components/form/controls/file/providers/dropbox-picker.lazy.js.map +1 -0
  442. package/dist/esm/components/form/controls/file/providers/google-drive-picker.d.ts +3 -1
  443. package/dist/esm/components/form/controls/file/providers/google-drive-picker.d.ts.map +1 -1
  444. package/dist/esm/components/form/controls/file/providers/google-drive-picker.js +3 -1
  445. package/dist/esm/components/form/controls/file/providers/google-drive-picker.js.map +1 -1
  446. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.d.ts +6 -0
  447. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.d.ts.map +1 -1
  448. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.js +8 -1
  449. package/dist/esm/components/form/controls/file/providers/google-drive-picker.lazy.js.map +1 -1
  450. package/dist/esm/components/form/controls/file/providers/onedrive-picker.d.ts +6 -2
  451. package/dist/esm/components/form/controls/file/providers/onedrive-picker.d.ts.map +1 -1
  452. package/dist/esm/components/form/controls/file/providers/onedrive-picker.js +6 -2
  453. package/dist/esm/components/form/controls/file/providers/onedrive-picker.js.map +1 -1
  454. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.d.ts +6 -0
  455. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.d.ts.map +1 -1
  456. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.js +8 -1
  457. package/dist/esm/components/form/controls/file/providers/onedrive-picker.lazy.js.map +1 -1
  458. package/dist/esm/components/form/controls/input-group.d.ts.map +1 -1
  459. package/dist/esm/components/form/controls/input-group.labels.d.ts.map +1 -1
  460. package/dist/esm/components/form/controls/input.d.ts.map +1 -1
  461. package/dist/esm/components/form/controls/input.labels.d.ts.map +1 -1
  462. package/dist/esm/components/form/controls/number/slider.d.ts.map +1 -1
  463. package/dist/esm/components/form/controls/number/slider.labels.d.ts.map +1 -1
  464. package/dist/esm/components/form/controls/number/slider.labels.js +9 -2
  465. package/dist/esm/components/form/controls/number/slider.labels.js.map +1 -1
  466. package/dist/esm/components/form/controls/string/color-input.d.ts.map +1 -1
  467. package/dist/esm/components/form/controls/string/color-input.labels.d.ts.map +1 -1
  468. package/dist/esm/components/form/controls/string/color-picker-surface.d.ts.map +1 -1
  469. package/dist/esm/components/form/controls/string/color-picker-surface.js.map +1 -1
  470. package/dist/esm/components/form/controls/string/inline-edit-text.d.ts.map +1 -1
  471. package/dist/esm/components/form/controls/string/input-otp.d.ts.map +1 -1
  472. package/dist/esm/components/form/controls/string/input-otp.labels.d.ts.map +1 -1
  473. package/dist/esm/components/form/controls/string/password-input.d.ts.map +1 -1
  474. package/dist/esm/components/form/controls/string/password-input.labels.d.ts.map +1 -1
  475. package/dist/esm/components/form/controls/string/password-input.labels.js +9 -2
  476. package/dist/esm/components/form/controls/string/password-input.labels.js.map +1 -1
  477. package/dist/esm/components/form/controls/string/textarea.d.ts.map +1 -1
  478. package/dist/esm/components/form/controls/string/textarea.labels.d.ts.map +1 -1
  479. package/dist/esm/components/layout/aspect-ratio.d.ts.map +1 -1
  480. package/dist/esm/components/layout/aspect-ratio.labels.d.ts.map +1 -1
  481. package/dist/esm/components/layout/carousel.d.ts.map +1 -1
  482. package/dist/esm/components/layout/carousel.labels.d.ts.map +1 -1
  483. package/dist/esm/components/layout/divider.d.ts.map +1 -1
  484. package/dist/esm/components/layout/divider.labels.d.ts.map +1 -1
  485. package/dist/esm/components/layout/resizable.d.ts.map +1 -1
  486. package/dist/esm/components/layout/resizable.labels.d.ts.map +1 -1
  487. package/dist/esm/components/layout/scroll-area.d.ts.map +1 -1
  488. package/dist/esm/components/layout/scroll-area.labels.d.ts.map +1 -1
  489. package/dist/esm/components/layout/separator.d.ts.map +1 -1
  490. package/dist/esm/components/layout/separator.labels.d.ts.map +1 -1
  491. package/dist/esm/components/navigation/app-level/activity-bar.d.ts.map +1 -1
  492. package/dist/esm/components/navigation/app-level/activity-bar.labels.d.ts.map +1 -1
  493. package/dist/esm/components/navigation/app-level/command-menu.d.ts.map +1 -1
  494. package/dist/esm/components/navigation/app-level/command-menu.js +2 -2
  495. package/dist/esm/components/navigation/app-level/command-menu.js.map +1 -1
  496. package/dist/esm/components/navigation/app-level/command-menu.labels.d.ts.map +1 -1
  497. package/dist/esm/components/navigation/app-level/control-panel.d.ts.map +1 -1
  498. package/dist/esm/components/navigation/app-level/control-panel.labels.d.ts.map +1 -1
  499. package/dist/esm/components/navigation/app-level/menu-user-org.d.ts.map +1 -1
  500. package/dist/esm/components/navigation/app-level/menu-user-org.labels.d.ts.map +1 -1
  501. package/dist/esm/components/navigation/app-level/menubar.d.ts.map +1 -1
  502. package/dist/esm/components/navigation/app-level/menubar.js +35 -13
  503. package/dist/esm/components/navigation/app-level/menubar.js.map +1 -1
  504. package/dist/esm/components/navigation/app-level/menubar.labels.d.ts.map +1 -1
  505. package/dist/esm/components/navigation/app-level/navigation-back.d.ts.map +1 -1
  506. package/dist/esm/components/navigation/app-level/navigation-back.js +10 -2
  507. package/dist/esm/components/navigation/app-level/navigation-back.js.map +1 -1
  508. package/dist/esm/components/navigation/app-level/navigation-back.labels.d.ts.map +1 -1
  509. package/dist/esm/components/navigation/app-level/notification-center.d.ts.map +1 -1
  510. package/dist/esm/components/navigation/app-level/notification-center.js.map +1 -1
  511. package/dist/esm/components/navigation/app-level/notification-center.labels.d.ts.map +1 -1
  512. package/dist/esm/components/navigation/app-level/notification-center.labels.js +15 -0
  513. package/dist/esm/components/navigation/app-level/notification-center.labels.js.map +1 -1
  514. package/dist/esm/components/navigation/app-level/quick-action-button.d.ts.map +1 -1
  515. package/dist/esm/components/navigation/app-level/quick-action-button.labels.d.ts.map +1 -1
  516. package/dist/esm/components/navigation/app-level/quick-action-button.labels.js +4 -0
  517. package/dist/esm/components/navigation/app-level/quick-action-button.labels.js.map +1 -1
  518. package/dist/esm/components/navigation/app-level/quick-switcher.d.ts.map +1 -1
  519. package/dist/esm/components/navigation/app-level/quick-switcher.labels.d.ts.map +1 -1
  520. package/dist/esm/components/navigation/app-level/sidebar.d.ts.map +1 -1
  521. package/dist/esm/components/navigation/app-level/sidebar.js +38 -22
  522. package/dist/esm/components/navigation/app-level/sidebar.js.map +1 -1
  523. package/dist/esm/components/navigation/app-level/sidebar.labels.d.ts.map +1 -1
  524. package/dist/esm/components/navigation/app-level/sidebar.labels.js +1 -0
  525. package/dist/esm/components/navigation/app-level/sidebar.labels.js.map +1 -1
  526. package/dist/esm/components/navigation/app-level/status-bar.d.ts.map +1 -1
  527. package/dist/esm/components/navigation/app-level/status-bar.labels.d.ts.map +1 -1
  528. package/dist/esm/components/navigation/app-level/toolbar.d.ts.map +1 -1
  529. package/dist/esm/components/navigation/app-level/toolbar.labels.d.ts.map +1 -1
  530. package/dist/esm/components/navigation/app-level/utility-panel.d.ts.map +1 -1
  531. package/dist/esm/components/navigation/app-level/utility-panel.js +23 -5
  532. package/dist/esm/components/navigation/app-level/utility-panel.js.map +1 -1
  533. package/dist/esm/components/navigation/app-level/utility-panel.labels.d.ts.map +1 -1
  534. package/dist/esm/components/navigation/app-level/utility-panel.labels.js.map +1 -1
  535. package/dist/esm/components/navigation/breadcrumb.d.ts.map +1 -1
  536. package/dist/esm/components/navigation/breadcrumb.labels.d.ts.map +1 -1
  537. package/dist/esm/components/navigation/command.d.ts.map +1 -1
  538. package/dist/esm/components/navigation/command.js +2 -2
  539. package/dist/esm/components/navigation/command.js.map +1 -1
  540. package/dist/esm/components/navigation/command.labels.d.ts.map +1 -1
  541. package/dist/esm/components/navigation/menu-bar.d.ts.map +1 -1
  542. package/dist/esm/components/navigation/menu-bar.labels.d.ts.map +1 -1
  543. package/dist/esm/components/navigation/navbar.d.ts.map +1 -1
  544. package/dist/esm/components/navigation/navbar.labels.d.ts.map +1 -1
  545. package/dist/esm/components/navigation/sidebar.d.ts.map +1 -1
  546. package/dist/esm/components/navigation/sidebar.labels.d.ts.map +1 -1
  547. package/dist/esm/components/overlays/containers/alert-dialog.d.ts.map +1 -1
  548. package/dist/esm/components/overlays/containers/alert-dialog.js +11 -1
  549. package/dist/esm/components/overlays/containers/alert-dialog.js.map +1 -1
  550. package/dist/esm/components/overlays/containers/alert-dialog.labels.d.ts.map +1 -1
  551. package/dist/esm/components/overlays/containers/alert.d.ts.map +1 -1
  552. package/dist/esm/components/overlays/containers/alert.labels.d.ts.map +1 -1
  553. package/dist/esm/components/overlays/containers/dialog.d.ts.map +1 -1
  554. package/dist/esm/components/overlays/containers/dialog.js +11 -1
  555. package/dist/esm/components/overlays/containers/dialog.js.map +1 -1
  556. package/dist/esm/components/overlays/containers/dialog.labels.d.ts.map +1 -1
  557. package/dist/esm/components/overlays/containers/drawer.d.ts.map +1 -1
  558. package/dist/esm/components/overlays/containers/drawer.labels.d.ts.map +1 -1
  559. package/dist/esm/components/overlays/containers/sheet.d.ts.map +1 -1
  560. package/dist/esm/components/overlays/containers/sheet.labels.d.ts.map +1 -1
  561. package/dist/esm/components/overlays/floating/context-menu.d.ts.map +1 -1
  562. package/dist/esm/components/overlays/floating/context-menu.labels.d.ts.map +1 -1
  563. package/dist/esm/components/overlays/floating/dropdown-menu.d.ts.map +1 -1
  564. package/dist/esm/components/overlays/floating/dropdown-menu.labels.d.ts.map +1 -1
  565. package/dist/esm/components/overlays/floating/hover-card.d.ts.map +1 -1
  566. package/dist/esm/components/overlays/floating/hover-card.labels.d.ts.map +1 -1
  567. package/dist/esm/components/overlays/floating/popover.d.ts.map +1 -1
  568. package/dist/esm/components/overlays/floating/popover.labels.d.ts.map +1 -1
  569. package/dist/esm/components/overlays/floating/tooltip.d.ts.map +1 -1
  570. package/dist/esm/components/overlays/floating/tooltip.labels.d.ts.map +1 -1
  571. package/dist/esm/components/sections/accordion.d.ts.map +1 -1
  572. package/dist/esm/components/sections/accordion.labels.d.ts.map +1 -1
  573. package/dist/esm/components/sections/card.d.ts.map +1 -1
  574. package/dist/esm/components/sections/card.js +71 -6
  575. package/dist/esm/components/sections/card.js.map +1 -1
  576. package/dist/esm/components/sections/card.labels.d.ts.map +1 -1
  577. package/dist/esm/components/sections/collapsible.d.ts.map +1 -1
  578. package/dist/esm/components/sections/collapsible.labels.d.ts.map +1 -1
  579. package/dist/esm/components/sections/content-section.d.ts.map +1 -1
  580. package/dist/esm/components/sections/content-section.js +36 -6
  581. package/dist/esm/components/sections/content-section.js.map +1 -1
  582. package/dist/esm/components/sections/disclosure-nesting.d.ts.map +1 -1
  583. package/dist/esm/components/sections/option-gesture.d.ts +15 -0
  584. package/dist/esm/components/sections/option-gesture.d.ts.map +1 -0
  585. package/dist/esm/components/sections/option-gesture.js +66 -0
  586. package/dist/esm/components/sections/option-gesture.js.map +1 -0
  587. package/dist/esm/components/sections/pagination.d.ts.map +1 -1
  588. package/dist/esm/components/sections/pagination.labels.d.ts.map +1 -1
  589. package/dist/esm/components/sections/stacked-layout.d.ts.map +1 -1
  590. package/dist/esm/components/sections/stacked-layout.labels.d.ts.map +1 -1
  591. package/dist/esm/components/sections/stepper.d.ts.map +1 -1
  592. package/dist/esm/components/sections/stepper.labels.d.ts.map +1 -1
  593. package/dist/esm/components/sections/table.d.ts.map +1 -1
  594. package/dist/esm/components/sections/table.labels.d.ts.map +1 -1
  595. package/dist/esm/components/sections/tabs.d.ts.map +1 -1
  596. package/dist/esm/components/sections/tabs.js +60 -15
  597. package/dist/esm/components/sections/tabs.js.map +1 -1
  598. package/dist/esm/components/sections/tabs.labels.d.ts.map +1 -1
  599. package/dist/esm/components/typography/heading.d.ts.map +1 -1
  600. package/dist/esm/components/typography/heading.labels.d.ts.map +1 -1
  601. package/dist/esm/components/typography/label.d.ts.map +1 -1
  602. package/dist/esm/components/typography/label.labels.d.ts.map +1 -1
  603. package/dist/esm/components/typography/link.d.ts.map +1 -1
  604. package/dist/esm/components/typography/link.js +9 -3
  605. package/dist/esm/components/typography/link.js.map +1 -1
  606. package/dist/esm/components/typography/link.labels.d.ts.map +1 -1
  607. package/dist/esm/components/typography/text.d.ts +1 -1
  608. package/dist/esm/components/typography/text.d.ts.map +1 -1
  609. package/dist/esm/components/typography/text.js +3 -2
  610. package/dist/esm/components/typography/text.js.map +1 -1
  611. package/dist/esm/components/typography/text.labels.d.ts.map +1 -1
  612. package/dist/esm/components/typography/truncated-text.d.ts.map +1 -1
  613. package/dist/esm/config/billing-shell.presets.d.ts.map +1 -1
  614. package/dist/esm/config/index.d.ts.map +1 -1
  615. package/dist/esm/config/preset-design-system.d.ts.map +1 -1
  616. package/dist/esm/config/preset-design-system.js +37 -60
  617. package/dist/esm/config/preset-design-system.js.map +1 -1
  618. package/dist/esm/config/preset-error-pages.d.ts.map +1 -1
  619. package/dist/esm/config/preset-kits.d.ts.map +1 -1
  620. package/dist/esm/config/preset-navigation.d.ts.map +1 -1
  621. package/dist/esm/config/preset-navigation.js +0 -5
  622. package/dist/esm/config/preset-navigation.js.map +1 -1
  623. package/dist/esm/config/preset-resources.d.ts.map +1 -1
  624. package/dist/esm/config/preset-shell.d.ts.map +1 -1
  625. package/dist/esm/config/preset-utils.d.ts.map +1 -1
  626. package/dist/esm/config/presets.d.ts.map +1 -1
  627. package/dist/esm/config/resources/application.resource-presets.d.ts +2 -0
  628. package/dist/esm/config/resources/application.resource-presets.d.ts.map +1 -1
  629. package/dist/esm/config/resources/application.resource-presets.js +163 -7
  630. package/dist/esm/config/resources/application.resource-presets.js.map +1 -1
  631. package/dist/esm/config/resources/billing.resource-presets.d.ts.map +1 -1
  632. package/dist/esm/config/resources/billing.resource-presets.js +1 -0
  633. package/dist/esm/config/resources/billing.resource-presets.js.map +1 -1
  634. package/dist/esm/config/resources/guidance.resource-presets.d.ts.map +1 -1
  635. package/dist/esm/config/resources/guidance.resource-presets.js +21 -5
  636. package/dist/esm/config/resources/guidance.resource-presets.js.map +1 -1
  637. package/dist/esm/config/resources/identity.resource-presets.d.ts.map +1 -1
  638. package/dist/esm/config/resources/identity.resource-presets.js +25 -3
  639. package/dist/esm/config/resources/identity.resource-presets.js.map +1 -1
  640. package/dist/esm/config/resources/index.d.ts.map +1 -1
  641. package/dist/esm/config/resources/index.js.map +1 -1
  642. package/dist/esm/config/resources/organizations.resource-presets.d.ts.map +1 -1
  643. package/dist/esm/config/resources/organizations.resource-presets.js +90 -12
  644. package/dist/esm/config/resources/organizations.resource-presets.js.map +1 -1
  645. package/dist/esm/config/resources/resource.config.utils.d.ts.map +1 -1
  646. package/dist/esm/config/resources/security.resource-presets.d.ts +8 -2
  647. package/dist/esm/config/resources/security.resource-presets.d.ts.map +1 -1
  648. package/dist/esm/config/resources/security.resource-presets.js +185 -29
  649. package/dist/esm/config/resources/security.resource-presets.js.map +1 -1
  650. package/dist/esm/config/resources/webhooks.resource-presets.d.ts.map +1 -1
  651. package/dist/esm/config/resources/webhooks.resource-presets.js +27 -2
  652. package/dist/esm/config/resources/webhooks.resource-presets.js.map +1 -1
  653. package/dist/esm/index.d.ts +6 -1
  654. package/dist/esm/index.d.ts.map +1 -1
  655. package/dist/esm/index.js +6 -1
  656. package/dist/esm/index.js.map +1 -1
  657. package/dist/esm/lottie/lottie.content.definitions.d.ts.map +1 -1
  658. package/dist/esm/lottie/lottie.definitions.d.ts.map +1 -1
  659. package/dist/esm/mermaid-stub.d.ts.map +1 -1
  660. package/dist/esm/registration/register-common-enums.d.ts.map +1 -1
  661. package/dist/esm/registration/register-common-enums.js +48 -34
  662. package/dist/esm/registration/register-common-enums.js.map +1 -1
  663. package/dist/esm/registration/register-default-animations.d.ts.map +1 -1
  664. package/dist/esm/registration/register-default-icons.d.ts.map +1 -1
  665. package/dist/esm/registration/register-default-icons.js +3 -1
  666. package/dist/esm/registration/register-default-icons.js.map +1 -1
  667. package/dist/esm/registration/register-default-presets.d.ts.map +1 -1
  668. package/dist/esm/registration/register-default-presets.js +32 -4
  669. package/dist/esm/registration/register-default-presets.js.map +1 -1
  670. package/dist/esm/registration/register-provider-components.d.ts.map +1 -1
  671. package/dist/esm/registration/register-provider-components.js +5 -0
  672. package/dist/esm/registration/register-provider-components.js.map +1 -1
  673. package/dist/esm/shiki-subset.d.ts +11 -3
  674. package/dist/esm/shiki-subset.d.ts.map +1 -1
  675. package/dist/esm/shiki-subset.js +10 -2
  676. package/dist/esm/shiki-subset.js.map +1 -1
  677. package/dist/esm/theme-exports.d.ts.map +1 -1
  678. package/dist/esm/themes/cozy.theme.d.ts.map +1 -1
  679. package/dist/esm/themes/cozy.theme.js +19 -5
  680. package/dist/esm/themes/cozy.theme.js.map +1 -1
  681. package/dist/esm/themes/dense.theme.d.ts.map +1 -1
  682. package/dist/esm/themes/dense.theme.js +56 -10
  683. package/dist/esm/themes/dense.theme.js.map +1 -1
  684. package/dist/esm/themes/editorial.theme.d.ts.map +1 -1
  685. package/dist/esm/themes/editorial.theme.js +19 -5
  686. package/dist/esm/themes/editorial.theme.js.map +1 -1
  687. package/dist/esm/themes/glass.theme.d.ts.map +1 -1
  688. package/dist/esm/themes/glass.theme.js +5 -1
  689. package/dist/esm/themes/glass.theme.js.map +1 -1
  690. package/dist/esm/themes/neo-brutalist.theme.d.ts.map +1 -1
  691. package/dist/esm/themes/neo-brutalist.theme.js +9 -2
  692. package/dist/esm/themes/neo-brutalist.theme.js.map +1 -1
  693. package/dist/esm/themes/terminal.theme.d.ts.map +1 -1
  694. package/dist/esm/themes/terminal.theme.js +19 -5
  695. package/dist/esm/themes/terminal.theme.js.map +1 -1
  696. package/dist/esm/themes/trading.theme.d.ts.map +1 -1
  697. package/dist/esm/themes/trading.theme.js +22 -6
  698. package/dist/esm/themes/trading.theme.js.map +1 -1
  699. package/dist/tsconfig.build.tsbuildinfo +1 -1
  700. package/package.json +29 -45
  701. package/dist/esm/.native.tsbuildinfo +0 -1
  702. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts +0 -16
  703. package/dist/esm/components/form/controls/form-field-checkbox-group.d.ts.map +0 -1
  704. package/dist/esm/components/form/controls/form-field-checkbox-group.js +0 -143
  705. package/dist/esm/components/form/controls/form-field-checkbox-group.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"action-bar.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/action-bar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAEV,cAAc,EAGf,MAAM,6BAA6B,CAAA;AAiCpC,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAyC,EACzC,SAAS,EACT,IAAyB,EACzB,YAAY,EAAE,SAAS,GACxB,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgIpC;kBAxIQ,SAAS;;;AAmTlB,OAAO,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"action-bar.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/action-bar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,6BAA6B,CAAA;AAiCpC,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,WAAyC,EACzC,SAAS,EACT,IAAyB,EACzB,YAAY,EAAE,SAAS,GACxB,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsIpC;kBA9IQ,SAAS;;;AA6YlB,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -95,7 +95,14 @@ function ActionBar({ items, maxDisplayed, labelDisplayMode, orientation = Displa
95
95
  const buttons = toolbar.querySelectorAll("button");
96
96
  buttons[nextIndex]?.focus();
97
97
  }, [activeIndex, focusableMap.count]);
98
- return (_jsxs("div", { role: "toolbar", "aria-label": ariaLabel, "aria-orientation": isVertical ? "vertical" : "horizontal", "data-slot": "action-bar", className: cn("flex gap-element-sm", isVertical ? "flex-col items-start" : "items-center", className), onKeyDown: handleKeyDown, children: [displayedItems.map((item, index) => {
98
+ return (_jsxs("div", { role: "toolbar", "aria-label": ariaLabel, "aria-orientation": isVertical ? "vertical" : "horizontal", "data-slot": "action-bar",
99
+ // `gap-element` — the role's DEFAULT step, and the reason is rhythm rather than size. A
100
+ // collection toolbar puts two of these bars side by side (whole-scope actions, then the
101
+ // bulk/primary slot) inside a cluster that is itself `gap-element`, so a tightened `-sm`
102
+ // here produced 4px inside each bar and 8px between them: one continuous run of buttons
103
+ // reading as two groups that nothing in the design intends. `element` is the declared role
104
+ // for "between inline elements: icons, buttons, tags"; the tightening was the deviation.
105
+ className: cn("flex gap-element", isVertical ? "flex-col items-start" : "items-center", className), onKeyDown: handleKeyDown, children: [displayedItems.map((item, index) => {
99
106
  const pos = focusableMap.map[index];
100
107
  if (pos === -1) {
101
108
  return _jsx(ActionBarDirectItem, { item: item, size: size, labelDisplayMode: effectiveLabelMode, orientation: orientation }, index);
@@ -117,20 +124,64 @@ function ActionBarDirectItem({ item, size, labelDisplayMode, orientation = Displ
117
124
  return _jsx(ActionBarSubGroupTrigger, { item: item, size: size, tabIndex: tabIndex });
118
125
  }
119
126
  // Regular button
120
- const button = (_jsx(ActionButton, { icon: item.icon, label: item.label,
127
+ const buttonProps = {
128
+ icon: item.icon,
129
+ label: item.label,
121
130
  // A popover-bearing item's click is owned by the trigger, which toggles `open`. Passing
122
131
  // `onClick` through as well would ALSO run the fallback path — opening the panel and
123
132
  // navigating to the overlay in the same click.
124
- onClick: item.popover ? undefined : item.onClick, variant: item.variant, size: size, labelDisplayMode: labelDisplayMode, disabled: item.disabled, className: item.className, tabIndex: tabIndex, operationIdentifier: item.operationIdentifier }));
133
+ onClick: item.popover ? undefined : item.onClick,
134
+ variant: item.variant,
135
+ size,
136
+ labelDisplayMode,
137
+ disabled: item.disabled,
138
+ busy: item.busy,
139
+ className: item.className,
140
+ tabIndex,
141
+ operationIdentifier: item.operationIdentifier,
142
+ };
143
+ if (item.unavailability) {
144
+ return _jsx(ActionBarUnavailableItem, { button: buttonProps, label: item.label, unavailability: item.unavailability });
145
+ }
125
146
  if (!item.popover) {
126
- return button;
147
+ return _jsx(ActionButton, { ...buttonProps });
127
148
  }
128
149
  // Anchored panel. Only DIRECTLY-rendered buttons get one: the overflow and subgroup renderers
129
150
  // below deliberately ignore `popover` and use `onClick`, because a panel anchored to a row of an
130
151
  // already-open dropdown is a nested-overlay problem rather than a layout choice. See
131
152
  // `ActionBarButtonPopover`.
132
- return (_jsxs(Popover, { open: item.popover.open, onOpenChange: item.popover.onOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: button }), _jsx(PopoverContent, { align: HorizontalAlign.END, "aria-label": item.popover.title ?? item.label, className: "w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))]", children: item.popover.content })] }));
153
+ return (_jsxs(Popover, { open: item.popover.open, onOpenChange: item.popover.onOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(ActionBarPopoverTriggerButton, { button: buttonProps }) }), _jsx(PopoverContent, { align: HorizontalAlign.END, "aria-label": item.popover.title ?? item.label, className: "w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))]", children: item.popover.content })] }));
154
+ }
155
+ /**
156
+ * The trigger an anchored panel clones onto.
157
+ *
158
+ * `PopoverTrigger asChild` merges the trigger's props — `onClick`, `aria-haspopup`, `aria-expanded`,
159
+ * `aria-controls`, `data-state`, and the ref the panel positions against — onto its child ELEMENT.
160
+ * `ActionButton` destructures only the props it knows, so cloned straight onto it the click arrived
161
+ * (as `onClick`, which it does forward) and every attribute was dropped: a working panel was announced
162
+ * to assistive technology as a plain button (#1041). `triggerProps` is the seam `ActionButton` offers
163
+ * for exactly this; this adapter is the element the trigger clones onto, and it hands everything it
164
+ * received to that seam, so what the trigger merged is what the button carries.
165
+ */
166
+ /**
167
+ * An action that cannot run, rendered so it can still explain itself (`ActionBarUnavailability`).
168
+ *
169
+ * `aria-disabled` rather than `disabled`: the native attribute removes the button from the tab order
170
+ * and swallows the click, so neither a keyboard user nor anyone else could ever learn WHY. Here the
171
+ * click opens the same anchored panel an action with parameters uses, holding the reason and, when
172
+ * there is one, the step that makes the action runnable. The panel never runs the action.
173
+ */
174
+ function ActionBarUnavailableItem({ button, label, unavailability, }) {
175
+ const [open, setOpen] = React.useState(false);
176
+ const reasonId = React.useId();
177
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(ActionBarPopoverTriggerButton, { button: { ...button, onClick: undefined, disabled: false }, "aria-disabled": "true", "aria-describedby": reasonId, "data-unavailable": "true" }) }), _jsxs(PopoverContent, { align: HorizontalAlign.END, "aria-label": label, className: "flex w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))] flex-col gap-group", children: [_jsx("p", { id: reasonId, className: "text-sm", children: unavailability.reason }), unavailability.resolve ? (_jsx(Button, { variant: ButtonVariants_Variant.OUTLINE, size: ButtonSize.SM, className: "self-end", onClick: () => {
178
+ setOpen(false);
179
+ unavailability.resolve?.onSelect();
180
+ }, children: unavailability.resolve.label })) : null] })] }));
133
181
  }
182
+ const ActionBarPopoverTriggerButton = React.forwardRef(function ActionBarPopoverTriggerButton({ button, ...injected }, ref) {
183
+ return _jsx(ActionButton, { ...button, ref: ref, triggerProps: injected });
184
+ });
134
185
  /* ── Sub-group trigger (inline dropdown) ──────────────────────────────────── */
135
186
  function ActionBarSubGroupTrigger({ item, size, tabIndex, }) {
136
187
  return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: item.variant ?? ButtonVariants_Variant.GHOST, size: size, disabled: item.disabled, onClick: (e) => e.stopPropagation(), "aria-label": item.label, tabIndex: tabIndex, className: item.className, "data-operation-id": item.operationIdentifier, children: item.icon }) }), _jsx(DropdownMenuContent, { children: item.items.map((subItem, index) => (_jsx(ActionBarOverflowItem, { item: subItem }, index))) })] }));
@@ -145,10 +196,13 @@ function ActionBarOverflowItem({ item, }) {
145
196
  }
146
197
  // Regular button → menu item. `data-operation-id` is the i18n-independent
147
198
  // automation hook (labels are runtime-translated) — attribute only.
148
- return (_jsxs(DropdownMenuItem, { variant: item.variant === "destructive" ? "destructive" : "default", disabled: item.disabled, "data-operation-id": item.operationIdentifier, onClick: (e) => {
199
+ // An unavailable action inside an open menu cannot anchor a second panel (see
200
+ // `ActionBarButtonPopover`), so its reason is written under its label instead: still disabled,
201
+ // but no longer silent about why.
202
+ return (_jsxs(DropdownMenuItem, { variant: item.variant === "destructive" ? "destructive" : "default", disabled: item.disabled || item.unavailability !== undefined, "data-operation-id": item.operationIdentifier, onClick: (e) => {
149
203
  e.stopPropagation();
150
204
  item.onClick?.();
151
- }, children: [_jsx("span", { className: "me-element flex size-4 items-center justify-center shrink-0", children: item.icon }), item.label] }));
205
+ }, children: [_jsx("span", { className: "me-element flex size-4 items-center justify-center shrink-0", children: item.icon }), item.unavailability ? (_jsxs("span", { className: "flex flex-col", children: [_jsx("span", { children: item.label }), _jsx("span", { className: "text-xs text-muted-foreground", children: item.unavailability.reason })] })) : item.label] }));
152
206
  }
153
207
  export { ActionBar };
154
208
  //# sourceMappingURL=action-bar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"action-bar.js","sourceRoot":"","sources":["../../../../../src/components/actions/action-bar.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport * as React from \"react\"\nimport type {\n ActionBarItem,\n ActionBarProps,\n ActionBarSubGroup,\n ActionButtonSize\n} from '@wildo-ai/saas-frontend-lib'\n\nimport {\n ActionButton, Button, cn, DropdownMenu, DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, IconSize,\n Popover, PopoverContent, PopoverTrigger,\n Separator, StandardIconReference, useI18n, useIconRegistry, useUI\n} from \"@wildo-ai/saas-frontend-lib\"\n\nimport { FrontendComponentType, ActionLabelDisplayMode } from \"@wildo-ai/presets-components-models\"\nimport { ButtonVariants_Variant } from \"@wildo-ai/saas-frontend-lib\"\nimport { ButtonSize } from \"@wildo-ai/presets-components-models\"\nimport { HorizontalAlign, DisplayDirection } from \"@wildo-ai/zod-decorators\"\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * ActionBar\n *\n * A toolbar-style group of ActionButtons with built-in overflow management.\n *\n * Features:\n * • maxDisplayed — shows N items directly; the rest collapse into a \"…\" menu.\n * • Separators — visual dividers between logical groups.\n * • Sub-groups — inline dropdown menus for related actions.\n * • Theme-aware — all buttons and menus use design-system recipes.\n *\n * This component replaces the external TinyButtonGroup pattern, adapted to\n * compose existing engine primitives (Button, DropdownMenu, Tooltip, etc.).\n * ────────────────────────────────────────────────────────────────────────── */\n\n/* ── Component ────────────────────────────────────────────────────────────── */\n\nfunction ActionBar({\n items,\n maxDisplayed,\n labelDisplayMode,\n orientation = DisplayDirection.HORIZONTAL,\n className,\n size = ButtonSize.ICON_SM,\n \"aria-label\": ariaLabel,\n}: ActionBarProps): React.JSX.Element {\n const isVertical = orientation === DisplayDirection.VERTICAL\n const { renderIcon } = useIconRegistry()\n const { actionLabelDisplayMode: appLabelDisplayMode } = useUI()\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_ACTION_BAR,\n })\n\n // Resolve the effective label affordance: explicit prop (per-resource-view\n // override) → app-wide theme default (`ComponentStyleTheme.actionLabelDisplayMode`).\n const effectiveLabelMode = labelDisplayMode ?? appLabelDisplayMode\n\n // DROPDOWN forces the whole cluster into the overflow menu (no direct\n // buttons): clamp the displayed count to 0 so every item — separators\n // included — renders through the `…` menu path below.\n const effectiveMax = effectiveLabelMode === ActionLabelDisplayMode.DROPDOWN\n ? 0\n : (maxDisplayed ?? items.length)\n const displayedItems = items.slice(0, effectiveMax)\n const overflowItems = items.slice(effectiveMax)\n const hasOverflow = overflowItems.length > 0\n\n // WAI-ARIA toolbar pattern: roving tabindex (Arrow keys move focus, Tab exits toolbar)\n const [activeIndex, setActiveIndex] = React.useState(0)\n\n // Map each displayed item to its focusable position (separators excluded)\n const focusableMap = React.useMemo(() => {\n const displayed = items.slice(0, effectiveMax)\n const overflow = items.length > displayed.length\n const map: number[] = []\n let pos = 0\n for (const item of displayed) {\n if (item.type === \"separator\") {\n map.push(-1)\n } else {\n map.push(pos++)\n }\n }\n return { map, count: pos + (overflow ? 1 : 0) }\n }, [items, effectiveMax])\n\n // Reset activeIndex if it's out of bounds after items change\n React.useEffect(() => {\n if (focusableMap.count > 0 && activeIndex >= focusableMap.count) {\n setActiveIndex(focusableMap.count - 1)\n }\n }, [focusableMap.count, activeIndex])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const total = focusableMap.count\n if (total === 0) return\n\n let nextIndex: number | undefined\n switch (e.key) {\n // Both axes advance/retreat so the arrow keys match the bar's\n // orientation (vertical stacks navigate with Up/Down).\n case \"ArrowRight\":\n case \"ArrowDown\":\n nextIndex = (activeIndex + 1) % total\n break\n case \"ArrowLeft\":\n case \"ArrowUp\":\n nextIndex = (activeIndex - 1 + total) % total\n break\n case \"Home\":\n nextIndex = 0\n break\n case \"End\":\n nextIndex = total - 1\n break\n default:\n return\n }\n e.preventDefault()\n setActiveIndex(nextIndex)\n\n // Focus the target button via DOM query (dropdown content is portalled, so only toolbar buttons are found)\n const toolbar = e.currentTarget\n const buttons = toolbar.querySelectorAll<HTMLButtonElement>(\"button\")\n buttons[nextIndex]?.focus()\n },\n [activeIndex, focusableMap.count],\n )\n\n return (\n <div\n role=\"toolbar\"\n aria-label={ariaLabel}\n aria-orientation={isVertical ? \"vertical\" : \"horizontal\"}\n data-slot=\"action-bar\"\n className={cn(\"flex gap-element-sm\", isVertical ? \"flex-col items-start\" : \"items-center\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* ── Directly-displayed items ─────────────────────────────────── */}\n {displayedItems.map((item, index) => {\n const pos = focusableMap.map[index]\n if (pos === -1) {\n return <ActionBarDirectItem key={index} item={item} size={size} labelDisplayMode={effectiveLabelMode} orientation={orientation} />\n }\n return <ActionBarDirectItem key={index} item={item} size={size} labelDisplayMode={effectiveLabelMode} orientation={orientation} tabIndex={activeIndex === pos ? 0 : -1} />\n })}\n\n {/* ── Overflow menu ────────────────────────────────────────────── */}\n {hasOverflow && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant={ButtonVariants_Variant.GHOST}\n size={size}\n onClick={(e) => e.stopPropagation()}\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_ACTION_BAR, 'moreActions')}\n tabIndex={activeIndex === focusableMap.count - 1 ? 0 : -1}\n >\n {renderIcon(StandardIconReference.MORE_HORIZONTAL, {\n size: IconSize.SM,\n })}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={HorizontalAlign.END}>\n {overflowItems.map((item, index) => (\n <ActionBarOverflowItem key={index} item={item} />\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n\nActionBar.displayName = \"ActionBar\"\n\n/* ── Direct item renderer ─────────────────────────────────────────────────── */\n\nfunction ActionBarDirectItem({\n item,\n size,\n labelDisplayMode,\n orientation = DisplayDirection.HORIZONTAL,\n tabIndex,\n}: {\n item: ActionBarItem\n size: ActionButtonSize\n labelDisplayMode: ActionLabelDisplayMode\n orientation?: DisplayDirection\n tabIndex?: number\n}): React.JSX.Element | null {\n if (item.type === \"separator\") {\n // The divider runs across the bar's cross-axis: a vertical rule between\n // buttons in a row, a horizontal rule between buttons in a vertical stack.\n return orientation === DisplayDirection.VERTICAL ? (\n <Separator\n orientation={DisplayDirection.HORIZONTAL}\n className=\"my-element-xs w-4 self-center\"\n />\n ) : (\n <Separator\n orientation={DisplayDirection.VERTICAL}\n className=\"mx-element-xs h-4 self-center\"\n />\n )\n }\n\n if (item.type === \"subgroup\") {\n return <ActionBarSubGroupTrigger item={item} size={size} tabIndex={tabIndex} />\n }\n\n // Regular button\n const button = (\n <ActionButton\n icon={item.icon}\n label={item.label}\n // A popover-bearing item's click is owned by the trigger, which toggles `open`. Passing\n // `onClick` through as well would ALSO run the fallback path — opening the panel and\n // navigating to the overlay in the same click.\n onClick={item.popover ? undefined : item.onClick}\n variant={item.variant}\n size={size}\n labelDisplayMode={labelDisplayMode}\n disabled={item.disabled}\n className={item.className}\n tabIndex={tabIndex}\n operationIdentifier={item.operationIdentifier}\n />\n )\n\n if (!item.popover) {\n return button\n }\n\n // Anchored panel. Only DIRECTLY-rendered buttons get one: the overflow and subgroup renderers\n // below deliberately ignore `popover` and use `onClick`, because a panel anchored to a row of an\n // already-open dropdown is a nested-overlay problem rather than a layout choice. See\n // `ActionBarButtonPopover`.\n return (\n <Popover open={item.popover.open} onOpenChange={item.popover.onOpenChange}>\n <PopoverTrigger asChild>{button}</PopoverTrigger>\n <PopoverContent\n align={HorizontalAlign.END}\n aria-label={item.popover.title ?? item.label}\n className=\"w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))]\"\n >\n {item.popover.content}\n </PopoverContent>\n </Popover>\n )\n}\n\n/* ── Sub-group trigger (inline dropdown) ──────────────────────────────────── */\n\nfunction ActionBarSubGroupTrigger({\n item,\n size,\n tabIndex,\n}: {\n item: ActionBarSubGroup\n size: ActionButtonSize\n tabIndex?: number\n}): React.JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant={item.variant ?? ButtonVariants_Variant.GHOST}\n size={size}\n disabled={item.disabled}\n onClick={(e) => e.stopPropagation()}\n aria-label={item.label}\n tabIndex={tabIndex}\n className={item.className}\n // Same `data-operation-id` a plain action button carries (see `ActionButton`). A subgroup\n // is still ONE operation — several ways to invoke it — so anything that addresses actions\n // by operation rather than by their translated label must be able to find it. Without this,\n // an operation that renders as a subgroup is unreachable to every such consumer while its\n // single-variant sibling is not, which is a difference in the RENDERING and not in the\n // operation.\n data-operation-id={item.operationIdentifier}\n >\n {item.icon}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {item.items.map((subItem, index) => (\n <ActionBarOverflowItem key={index} item={subItem} />\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/* ── Overflow menu item renderer ──────────────────────────────────────────── */\n\nfunction ActionBarOverflowItem({\n item,\n}: {\n item: ActionBarItem\n}): React.JSX.Element | null {\n if (item.type === \"separator\") {\n return <DropdownMenuSeparator />\n }\n\n if (item.type === \"subgroup\") {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n <span className=\"me-element flex size-4 items-center justify-center shrink-0\">\n {item.icon}\n </span>\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {item.items.map((subItem, index) => (\n <ActionBarOverflowItem key={index} item={subItem} />\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n }\n\n // Regular button → menu item. `data-operation-id` is the i18n-independent\n // automation hook (labels are runtime-translated) — attribute only.\n return (\n <DropdownMenuItem\n variant={item.variant === \"destructive\" ? \"destructive\" : \"default\"}\n disabled={item.disabled}\n data-operation-id={item.operationIdentifier}\n onClick={(e) => {\n e.stopPropagation()\n item.onClick?.()\n }}\n >\n <span className=\"me-element flex size-4 items-center justify-center shrink-0\">\n {item.icon}\n </span>\n {item.label}\n </DropdownMenuItem>\n )\n}\n\nexport { ActionBar }\n"]}
1
+ {"version":3,"file":"action-bar.js","sourceRoot":"","sources":["../../../../../src/components/actions/action-bar.tsx"],"names":[],"mappings":"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","sourcesContent":["\nimport * as React from \"react\"\nimport type { ActionButtonProps } from \"@wildo-ai/saas-frontend-lib\"\nimport type {\n ActionBarButton,\n ActionBarItem,\n ActionBarProps,\n ActionBarSubGroup,\n ActionButtonSize\n} from '@wildo-ai/saas-frontend-lib'\n\nimport {\n ActionButton, Button, cn, DropdownMenu, DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, IconSize,\n Popover, PopoverContent, PopoverTrigger,\n Separator, StandardIconReference, useI18n, useIconRegistry, useUI\n} from \"@wildo-ai/saas-frontend-lib\"\n\nimport { FrontendComponentType, ActionLabelDisplayMode } from \"@wildo-ai/presets-components-models\"\nimport { ButtonVariants_Variant } from \"@wildo-ai/saas-frontend-lib\"\nimport { ButtonSize } from \"@wildo-ai/presets-components-models\"\nimport { HorizontalAlign, DisplayDirection } from \"@wildo-ai/zod-decorators\"\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * ActionBar\n *\n * A toolbar-style group of ActionButtons with built-in overflow management.\n *\n * Features:\n * • maxDisplayed — shows N items directly; the rest collapse into a \"…\" menu.\n * • Separators — visual dividers between logical groups.\n * • Sub-groups — inline dropdown menus for related actions.\n * • Theme-aware — all buttons and menus use design-system recipes.\n *\n * This component replaces the external TinyButtonGroup pattern, adapted to\n * compose existing engine primitives (Button, DropdownMenu, Tooltip, etc.).\n * ────────────────────────────────────────────────────────────────────────── */\n\n/* ── Component ────────────────────────────────────────────────────────────── */\n\nfunction ActionBar({\n items,\n maxDisplayed,\n labelDisplayMode,\n orientation = DisplayDirection.HORIZONTAL,\n className,\n size = ButtonSize.ICON_SM,\n \"aria-label\": ariaLabel,\n}: ActionBarProps): React.JSX.Element {\n const isVertical = orientation === DisplayDirection.VERTICAL\n const { renderIcon } = useIconRegistry()\n const { actionLabelDisplayMode: appLabelDisplayMode } = useUI()\n const { tComponent, isReady } = useI18n({\n component: FrontendComponentType.LOW_LEVEL_ACTION_BAR,\n })\n\n // Resolve the effective label affordance: explicit prop (per-resource-view\n // override) → app-wide theme default (`ComponentStyleTheme.actionLabelDisplayMode`).\n const effectiveLabelMode = labelDisplayMode ?? appLabelDisplayMode\n\n // DROPDOWN forces the whole cluster into the overflow menu (no direct\n // buttons): clamp the displayed count to 0 so every item — separators\n // included — renders through the `…` menu path below.\n const effectiveMax = effectiveLabelMode === ActionLabelDisplayMode.DROPDOWN\n ? 0\n : (maxDisplayed ?? items.length)\n const displayedItems = items.slice(0, effectiveMax)\n const overflowItems = items.slice(effectiveMax)\n const hasOverflow = overflowItems.length > 0\n\n // WAI-ARIA toolbar pattern: roving tabindex (Arrow keys move focus, Tab exits toolbar)\n const [activeIndex, setActiveIndex] = React.useState(0)\n\n // Map each displayed item to its focusable position (separators excluded)\n const focusableMap = React.useMemo(() => {\n const displayed = items.slice(0, effectiveMax)\n const overflow = items.length > displayed.length\n const map: number[] = []\n let pos = 0\n for (const item of displayed) {\n if (item.type === \"separator\") {\n map.push(-1)\n } else {\n map.push(pos++)\n }\n }\n return { map, count: pos + (overflow ? 1 : 0) }\n }, [items, effectiveMax])\n\n // Reset activeIndex if it's out of bounds after items change\n React.useEffect(() => {\n if (focusableMap.count > 0 && activeIndex >= focusableMap.count) {\n setActiveIndex(focusableMap.count - 1)\n }\n }, [focusableMap.count, activeIndex])\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const total = focusableMap.count\n if (total === 0) return\n\n let nextIndex: number | undefined\n switch (e.key) {\n // Both axes advance/retreat so the arrow keys match the bar's\n // orientation (vertical stacks navigate with Up/Down).\n case \"ArrowRight\":\n case \"ArrowDown\":\n nextIndex = (activeIndex + 1) % total\n break\n case \"ArrowLeft\":\n case \"ArrowUp\":\n nextIndex = (activeIndex - 1 + total) % total\n break\n case \"Home\":\n nextIndex = 0\n break\n case \"End\":\n nextIndex = total - 1\n break\n default:\n return\n }\n e.preventDefault()\n setActiveIndex(nextIndex)\n\n // Focus the target button via DOM query (dropdown content is portalled, so only toolbar buttons are found)\n const toolbar = e.currentTarget\n const buttons = toolbar.querySelectorAll<HTMLButtonElement>(\"button\")\n buttons[nextIndex]?.focus()\n },\n [activeIndex, focusableMap.count],\n )\n\n return (\n <div\n role=\"toolbar\"\n aria-label={ariaLabel}\n aria-orientation={isVertical ? \"vertical\" : \"horizontal\"}\n data-slot=\"action-bar\"\n // `gap-element` — the role's DEFAULT step, and the reason is rhythm rather than size. A\n // collection toolbar puts two of these bars side by side (whole-scope actions, then the\n // bulk/primary slot) inside a cluster that is itself `gap-element`, so a tightened `-sm`\n // here produced 4px inside each bar and 8px between them: one continuous run of buttons\n // reading as two groups that nothing in the design intends. `element` is the declared role\n // for \"between inline elements: icons, buttons, tags\"; the tightening was the deviation.\n className={cn(\"flex gap-element\", isVertical ? \"flex-col items-start\" : \"items-center\", className)}\n onKeyDown={handleKeyDown}\n >\n {/* ── Directly-displayed items ─────────────────────────────────── */}\n {displayedItems.map((item, index) => {\n const pos = focusableMap.map[index]\n if (pos === -1) {\n return <ActionBarDirectItem key={index} item={item} size={size} labelDisplayMode={effectiveLabelMode} orientation={orientation} />\n }\n return <ActionBarDirectItem key={index} item={item} size={size} labelDisplayMode={effectiveLabelMode} orientation={orientation} tabIndex={activeIndex === pos ? 0 : -1} />\n })}\n\n {/* ── Overflow menu ────────────────────────────────────────────── */}\n {hasOverflow && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant={ButtonVariants_Variant.GHOST}\n size={size}\n onClick={(e) => e.stopPropagation()}\n aria-label={tComponent(FrontendComponentType.LOW_LEVEL_ACTION_BAR, 'moreActions')}\n tabIndex={activeIndex === focusableMap.count - 1 ? 0 : -1}\n >\n {renderIcon(StandardIconReference.MORE_HORIZONTAL, {\n size: IconSize.SM,\n })}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={HorizontalAlign.END}>\n {overflowItems.map((item, index) => (\n <ActionBarOverflowItem key={index} item={item} />\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )\n}\n\nActionBar.displayName = \"ActionBar\"\n\n/* ── Direct item renderer ─────────────────────────────────────────────────── */\n\nfunction ActionBarDirectItem({\n item,\n size,\n labelDisplayMode,\n orientation = DisplayDirection.HORIZONTAL,\n tabIndex,\n}: {\n item: ActionBarItem\n size: ActionButtonSize\n labelDisplayMode: ActionLabelDisplayMode\n orientation?: DisplayDirection\n tabIndex?: number\n}): React.JSX.Element | null {\n if (item.type === \"separator\") {\n // The divider runs across the bar's cross-axis: a vertical rule between\n // buttons in a row, a horizontal rule between buttons in a vertical stack.\n return orientation === DisplayDirection.VERTICAL ? (\n <Separator\n orientation={DisplayDirection.HORIZONTAL}\n className=\"my-element-xs w-4 self-center\"\n />\n ) : (\n <Separator\n orientation={DisplayDirection.VERTICAL}\n className=\"mx-element-xs h-4 self-center\"\n />\n )\n }\n\n if (item.type === \"subgroup\") {\n return <ActionBarSubGroupTrigger item={item} size={size} tabIndex={tabIndex} />\n }\n\n // Regular button\n const buttonProps: ActionButtonProps = {\n icon: item.icon,\n label: item.label,\n // A popover-bearing item's click is owned by the trigger, which toggles `open`. Passing\n // `onClick` through as well would ALSO run the fallback path — opening the panel and\n // navigating to the overlay in the same click.\n onClick: item.popover ? undefined : item.onClick,\n variant: item.variant,\n size,\n labelDisplayMode,\n disabled: item.disabled,\n busy: item.busy,\n className: item.className,\n tabIndex,\n operationIdentifier: item.operationIdentifier,\n }\n\n if (item.unavailability) {\n return <ActionBarUnavailableItem button={buttonProps} label={item.label} unavailability={item.unavailability} />\n }\n\n if (!item.popover) {\n return <ActionButton {...buttonProps} />\n }\n\n // Anchored panel. Only DIRECTLY-rendered buttons get one: the overflow and subgroup renderers\n // below deliberately ignore `popover` and use `onClick`, because a panel anchored to a row of an\n // already-open dropdown is a nested-overlay problem rather than a layout choice. See\n // `ActionBarButtonPopover`.\n return (\n <Popover open={item.popover.open} onOpenChange={item.popover.onOpenChange}>\n <PopoverTrigger asChild>\n <ActionBarPopoverTriggerButton button={buttonProps} />\n </PopoverTrigger>\n <PopoverContent\n align={HorizontalAlign.END}\n aria-label={item.popover.title ?? item.label}\n className=\"w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))]\"\n >\n {item.popover.content}\n </PopoverContent>\n </Popover>\n )\n}\n\n/**\n * The trigger an anchored panel clones onto.\n *\n * `PopoverTrigger asChild` merges the trigger's props — `onClick`, `aria-haspopup`, `aria-expanded`,\n * `aria-controls`, `data-state`, and the ref the panel positions against — onto its child ELEMENT.\n * `ActionButton` destructures only the props it knows, so cloned straight onto it the click arrived\n * (as `onClick`, which it does forward) and every attribute was dropped: a working panel was announced\n * to assistive technology as a plain button (#1041). `triggerProps` is the seam `ActionButton` offers\n * for exactly this; this adapter is the element the trigger clones onto, and it hands everything it\n * received to that seam, so what the trigger merged is what the button carries.\n */\n/**\n * An action that cannot run, rendered so it can still explain itself (`ActionBarUnavailability`).\n *\n * `aria-disabled` rather than `disabled`: the native attribute removes the button from the tab order\n * and swallows the click, so neither a keyboard user nor anyone else could ever learn WHY. Here the\n * click opens the same anchored panel an action with parameters uses, holding the reason and, when\n * there is one, the step that makes the action runnable. The panel never runs the action.\n */\nfunction ActionBarUnavailableItem({\n button,\n label,\n unavailability,\n}: {\n button: ActionButtonProps\n label: string\n unavailability: NonNullable<ActionBarButton[\"unavailability\"]>\n}): React.JSX.Element {\n const [open, setOpen] = React.useState(false)\n const reasonId = React.useId()\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <ActionBarPopoverTriggerButton\n button={{ ...button, onClick: undefined, disabled: false }}\n aria-disabled=\"true\"\n aria-describedby={reasonId}\n data-unavailable=\"true\"\n />\n </PopoverTrigger>\n <PopoverContent\n align={HorizontalAlign.END}\n aria-label={label}\n className=\"flex w-(--action-bar-popover-width,20rem) max-w-[min(24rem,calc(100vw-2rem))] flex-col gap-group\"\n >\n <p id={reasonId} className=\"text-sm\">{unavailability.reason}</p>\n {unavailability.resolve ? (\n <Button\n variant={ButtonVariants_Variant.OUTLINE}\n size={ButtonSize.SM}\n className=\"self-end\"\n onClick={() => {\n setOpen(false)\n unavailability.resolve?.onSelect()\n }}\n >\n {unavailability.resolve.label}\n </Button>\n ) : null}\n </PopoverContent>\n </Popover>\n )\n}\n\nconst ActionBarPopoverTriggerButton = React.forwardRef<\n HTMLButtonElement,\n { button: ActionButtonProps } & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function ActionBarPopoverTriggerButton({ button, ...injected }, ref) {\n return <ActionButton {...button} ref={ref} triggerProps={injected} />\n})\n\n/* ── Sub-group trigger (inline dropdown) ──────────────────────────────────── */\n\nfunction ActionBarSubGroupTrigger({\n item,\n size,\n tabIndex,\n}: {\n item: ActionBarSubGroup\n size: ActionButtonSize\n tabIndex?: number\n}): React.JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant={item.variant ?? ButtonVariants_Variant.GHOST}\n size={size}\n disabled={item.disabled}\n onClick={(e) => e.stopPropagation()}\n aria-label={item.label}\n tabIndex={tabIndex}\n className={item.className}\n // Same `data-operation-id` a plain action button carries (see `ActionButton`). A subgroup\n // is still ONE operation — several ways to invoke it — so anything that addresses actions\n // by operation rather than by their translated label must be able to find it. Without this,\n // an operation that renders as a subgroup is unreachable to every such consumer while its\n // single-variant sibling is not, which is a difference in the RENDERING and not in the\n // operation.\n data-operation-id={item.operationIdentifier}\n >\n {item.icon}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {item.items.map((subItem, index) => (\n <ActionBarOverflowItem key={index} item={subItem} />\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\n/* ── Overflow menu item renderer ──────────────────────────────────────────── */\n\nfunction ActionBarOverflowItem({\n item,\n}: {\n item: ActionBarItem\n}): React.JSX.Element | null {\n if (item.type === \"separator\") {\n return <DropdownMenuSeparator />\n }\n\n if (item.type === \"subgroup\") {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n <span className=\"me-element flex size-4 items-center justify-center shrink-0\">\n {item.icon}\n </span>\n {item.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n {item.items.map((subItem, index) => (\n <ActionBarOverflowItem key={index} item={subItem} />\n ))}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )\n }\n\n // Regular button → menu item. `data-operation-id` is the i18n-independent\n // automation hook (labels are runtime-translated) — attribute only.\n // An unavailable action inside an open menu cannot anchor a second panel (see\n // `ActionBarButtonPopover`), so its reason is written under its label instead: still disabled,\n // but no longer silent about why.\n return (\n <DropdownMenuItem\n variant={item.variant === \"destructive\" ? \"destructive\" : \"default\"}\n disabled={item.disabled || item.unavailability !== undefined}\n data-operation-id={item.operationIdentifier}\n onClick={(e) => {\n e.stopPropagation()\n item.onClick?.()\n }}\n >\n <span className=\"me-element flex size-4 items-center justify-center shrink-0\">\n {item.icon}\n </span>\n {item.unavailability ? (\n <span className=\"flex flex-col\">\n <span>{item.label}</span>\n <span className=\"text-xs text-muted-foreground\">{item.unavailability.reason}</span>\n </span>\n ) : item.label}\n </DropdownMenuItem>\n )\n}\n\nexport { ActionBar }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"action-bar.labels.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/action-bar.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM1I,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAOxD,CAAC"}
1
+ {"version":3,"file":"action-bar.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/action-bar.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM1I,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAOxD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"action-button.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/action-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,6BAA6B,CAAA;AA0BtF,QAAA,MAAM,YAAY,6FAmFhB,CAAA;AAIF,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"action-button.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/action-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,6BAA6B,CAAA;AA0BtF,QAAA,MAAM,YAAY,6FAsFhB,CAAA;AAIF,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -22,7 +22,7 @@ import { PlacementSide } from "@wildo-ai/presets-components-models";
22
22
  * Event propagation is stopped by default, which makes ActionButton safe
23
23
  * inside clickable containers (table rows, cards, etc.).
24
24
  * ────────────────────────────────────────────────────────────────────────── */
25
- const ActionButton = React.forwardRef(function ActionButton({ icon, label, onClick, variant = ButtonVariants_Variant.GHOST, size = ButtonSize.ICON_SM, labelDisplayMode = ActionLabelDisplayMode.TOOLTIP, disabled = false, stopPropagation = true, className, tabIndex, operationIdentifier, triggerProps, }, ref) {
25
+ const ActionButton = React.forwardRef(function ActionButton({ icon, label, onClick, variant = ButtonVariants_Variant.GHOST, size = ButtonSize.ICON_SM, labelDisplayMode = ActionLabelDisplayMode.TOOLTIP, disabled = false, busy = false, stopPropagation = true, className, tabIndex, operationIdentifier, triggerProps, }, ref) {
26
26
  const handleClick = React.useCallback((e) => {
27
27
  if (stopPropagation)
28
28
  e.stopPropagation();
@@ -38,7 +38,7 @@ const ActionButton = React.forwardRef(function ActionButton({ icon, label, onCli
38
38
  }, [onClick, stopPropagation, triggerProps]);
39
39
  /* ── Inline-label mode ──────────────────────────────────────────────── */
40
40
  if (labelDisplayMode === ActionLabelDisplayMode.INLINE) {
41
- return (_jsxs(Button, { variant: variant, size: ButtonSize.SM, disabled: disabled, ...triggerProps, onClick: handleClick, ref: ref, tabIndex: tabIndex, "data-operation-id": operationIdentifier, className: cn("gap-1.5", className), children: [icon, _jsx("span", { className: "text-xs font-medium whitespace-nowrap", children: label })] }));
41
+ return (_jsxs(Button, { variant: variant, size: ButtonSize.SM, disabled: disabled, loading: busy, ...triggerProps, onClick: handleClick, ref: ref, tabIndex: tabIndex, "data-operation-id": operationIdentifier, className: cn("gap-1.5", className), children: [icon, _jsx("span", { className: "text-xs font-medium whitespace-nowrap", children: label })] }));
42
42
  }
43
43
  /* ── Icon-only mode with tooltip ────────────────────────────────────── */
44
44
  /*
@@ -49,7 +49,7 @@ const ActionButton = React.forwardRef(function ActionButton({ icon, label, onCli
49
49
  * `ActionBar`'s `ActionBarButton.popover` came to be silently inert in this mode: the button
50
50
  * rendered, hovered, focused and clicked, and the panel never opened.
51
51
  */
52
- return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: variant, size: size, disabled: disabled, ...triggerProps, onClick: handleClick, ref: ref, "aria-label": label, tabIndex: tabIndex, "data-operation-id": operationIdentifier, className: className, children: icon }) }), _jsx(TooltipContent, { side: PlacementSide.BOTTOM, sideOffset: 5, children: label })] }));
52
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: variant, size: size, disabled: disabled, loading: busy, ...triggerProps, onClick: handleClick, ref: ref, "aria-label": label, tabIndex: tabIndex, "data-operation-id": operationIdentifier, className: className, children: icon }) }), _jsx(TooltipContent, { side: PlacementSide.BOTTOM, sideOffset: 5, children: label })] }));
53
53
  });
54
54
  ActionButton.displayName = "ActionButton";
55
55
  export { ActionButton };
@@ -1 +1 @@
1
- {"version":3,"file":"action-button.js","sourceRoot":"","sources":["../../../../../src/components/actions/action-button.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzH,OAAO,EAAE,UAAU,EAAyB,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAC/G,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEnE;;;;;;;;;;;;;;;;;;gFAkBgF;AAEhF,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAuC,SAAS,YAAY,CAAC,EAChG,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,GAAG,sBAAsB,CAAC,KAAK,EACtC,IAAI,GAAG,UAAU,CAAC,OAAO,EACzB,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,EACjD,QAAQ,GAAG,KAAK,EAChB,eAAe,GAAG,IAAI,EACtB,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,YAAY,GACM,EAAE,GAAG;IAEvB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CACnC,CAAC,CAAsC,EAAE,EAAE;QACzC,IAAI,eAAe;YAAE,CAAC,CAAC,eAAe,EAAE,CAAA;QACxC;;;;;;WAMG;QACH,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACd,CAAC,EACD,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC,CACzC,CAAA;IAED,2EAA2E;IAC3E,IAAI,gBAAgB,KAAK,sBAAsB,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,CACL,MAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,QAAQ,EAAE,QAAQ,KACd,YAAY,EAChB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,uBACC,mBAAmB,EACtC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,aAElC,IAAI,EACL,eAAM,SAAS,EAAC,uCAAuC,YAAE,KAAK,GAAQ,IAC/D,CACV,CAAA;IACH,CAAC;IAED,2EAA2E;IAC3E;;;;;;;OAOG;IACH,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,KACd,YAAY,EAChB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,GAAG,gBACI,KAAK,EACjB,QAAQ,EAAE,QAAQ,uBACC,mBAAmB,EACtC,SAAS,EAAE,SAAS,YAEnB,IAAI,GACE,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,YACtD,KAAK,GACS,IACT,CACX,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,YAAY,CAAC,WAAW,GAAG,cAAc,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,CAAA","sourcesContent":["import * as React from \"react\"\nimport type { ActionButtonProps, ActionButtonSize } from '@wildo-ai/saas-frontend-lib'\n\nimport { cn, Button, Tooltip, TooltipTrigger, TooltipContent, ButtonVariants_Variant } from \"@wildo-ai/saas-frontend-lib\"\nimport { ButtonSize, FrontendComponentType, ActionLabelDisplayMode } from \"@wildo-ai/presets-components-models\"\nimport { PlacementSide } from \"@wildo-ai/presets-components-models\"\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * ActionButton\n *\n * A compact, icon-first button designed for toolbars, table rows, and inline\n * action groups. Wraps the base Button with automatic tooltip behaviour:\n *\n * • Tooltip mode (default) — icon-only; shows a tooltip on hover / focus.\n * • Inline mode — renders the label as text next to the icon.\n *\n * The mode is driven by `labelDisplayMode`. (The `DROPDOWN` app-policy is\n * resolved by ActionBar, which never renders a direct ActionButton in that\n * mode, so here `DROPDOWN` degrades to the tooltip affordance.)\n *\n * Uses the design-system recipe system, so it adapts to every theme\n * (default, glass, neo-brutalist, …).\n *\n * Event propagation is stopped by default, which makes ActionButton safe\n * inside clickable containers (table rows, cards, etc.).\n * ────────────────────────────────────────────────────────────────────────── */\n\nconst ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>(function ActionButton({\n icon,\n label,\n onClick,\n variant = ButtonVariants_Variant.GHOST,\n size = ButtonSize.ICON_SM,\n labelDisplayMode = ActionLabelDisplayMode.TOOLTIP,\n disabled = false,\n stopPropagation = true,\n className,\n tabIndex,\n operationIdentifier,\n triggerProps,\n}: ActionButtonProps, ref): React.JSX.Element {\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (stopPropagation) e.stopPropagation()\n /*\n * The OUTER trigger's handler first, then this component's own.\n *\n * An anchored overlay opens from its trigger's `onClick`; dropping it is what made\n * `ActionBarButton.popover` inert. Calling both keeps an action that has BOTH — a panel and a\n * fallback — behaving the same in either label mode.\n */\n triggerProps?.onClick?.(e)\n onClick?.(e)\n },\n [onClick, stopPropagation, triggerProps],\n )\n\n /* ── Inline-label mode ──────────────────────────────────────────────── */\n if (labelDisplayMode === ActionLabelDisplayMode.INLINE) {\n return (\n <Button\n variant={variant}\n size={ButtonSize.SM}\n disabled={disabled}\n {...triggerProps}\n onClick={handleClick}\n ref={ref}\n tabIndex={tabIndex}\n data-operation-id={operationIdentifier}\n className={cn(\"gap-1.5\", className)}\n >\n {icon}\n <span className=\"text-xs font-medium whitespace-nowrap\">{label}</span>\n </Button>\n )\n }\n\n /* ── Icon-only mode with tooltip ────────────────────────────────────── */\n /*\n * `triggerProps` and `ref` land on the BUTTON, not on the `<Tooltip>` root above it.\n *\n * A Radix root renders no DOM element and forwards nothing, so an outer `asChild` trigger cloning\n * onto THIS component's return value would merge its props into nothing — which is precisely how\n * `ActionBar`'s `ActionBarButton.popover` came to be silently inert in this mode: the button\n * rendered, hovered, focused and clicked, and the panel never opened.\n */\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={variant}\n size={size}\n disabled={disabled}\n {...triggerProps}\n onClick={handleClick}\n ref={ref}\n aria-label={label}\n tabIndex={tabIndex}\n data-operation-id={operationIdentifier}\n className={className}\n >\n {icon}\n </Button>\n </TooltipTrigger>\n <TooltipContent side={PlacementSide.BOTTOM} sideOffset={5}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n})\n\nActionButton.displayName = \"ActionButton\"\n\nexport { ActionButton }\n"]}
1
+ {"version":3,"file":"action-button.js","sourceRoot":"","sources":["../../../../../src/components/actions/action-button.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzH,OAAO,EAAE,UAAU,EAAyB,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAC/G,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AAEnE;;;;;;;;;;;;;;;;;;gFAkBgF;AAEhF,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAuC,SAAS,YAAY,CAAC,EAChG,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,GAAG,sBAAsB,CAAC,KAAK,EACtC,IAAI,GAAG,UAAU,CAAC,OAAO,EACzB,gBAAgB,GAAG,sBAAsB,CAAC,OAAO,EACjD,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,KAAK,EACZ,eAAe,GAAG,IAAI,EACtB,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,YAAY,GACM,EAAE,GAAG;IAEvB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CACnC,CAAC,CAAsC,EAAE,EAAE;QACzC,IAAI,eAAe;YAAE,CAAC,CAAC,eAAe,EAAE,CAAA;QACxC;;;;;;WAMG;QACH,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACd,CAAC,EACD,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC,CACzC,CAAA;IAED,2EAA2E;IAC3E,IAAI,gBAAgB,KAAK,sBAAsB,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,CACL,MAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,UAAU,CAAC,EAAE,EACnB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,IAAI,KACT,YAAY,EAChB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,uBACC,mBAAmB,EACtC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,aAElC,IAAI,EACL,eAAM,SAAS,EAAC,uCAAuC,YAAE,KAAK,GAAQ,IAC/D,CACV,CAAA;IACH,CAAC;IAED,2EAA2E;IAC3E;;;;;;;OAOG;IACH,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,IAAI,KACT,YAAY,EAChB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,GAAG,gBACI,KAAK,EACjB,QAAQ,EAAE,QAAQ,uBACC,mBAAmB,EACtC,SAAS,EAAE,SAAS,YAEnB,IAAI,GACE,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,YACtD,KAAK,GACS,IACT,CACX,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,YAAY,CAAC,WAAW,GAAG,cAAc,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,CAAA","sourcesContent":["import * as React from \"react\"\nimport type { ActionButtonProps, ActionButtonSize } from '@wildo-ai/saas-frontend-lib'\n\nimport { cn, Button, Tooltip, TooltipTrigger, TooltipContent, ButtonVariants_Variant } from \"@wildo-ai/saas-frontend-lib\"\nimport { ButtonSize, FrontendComponentType, ActionLabelDisplayMode } from \"@wildo-ai/presets-components-models\"\nimport { PlacementSide } from \"@wildo-ai/presets-components-models\"\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * ActionButton\n *\n * A compact, icon-first button designed for toolbars, table rows, and inline\n * action groups. Wraps the base Button with automatic tooltip behaviour:\n *\n * • Tooltip mode (default) — icon-only; shows a tooltip on hover / focus.\n * • Inline mode — renders the label as text next to the icon.\n *\n * The mode is driven by `labelDisplayMode`. (The `DROPDOWN` app-policy is\n * resolved by ActionBar, which never renders a direct ActionButton in that\n * mode, so here `DROPDOWN` degrades to the tooltip affordance.)\n *\n * Uses the design-system recipe system, so it adapts to every theme\n * (default, glass, neo-brutalist, …).\n *\n * Event propagation is stopped by default, which makes ActionButton safe\n * inside clickable containers (table rows, cards, etc.).\n * ────────────────────────────────────────────────────────────────────────── */\n\nconst ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>(function ActionButton({\n icon,\n label,\n onClick,\n variant = ButtonVariants_Variant.GHOST,\n size = ButtonSize.ICON_SM,\n labelDisplayMode = ActionLabelDisplayMode.TOOLTIP,\n disabled = false,\n busy = false,\n stopPropagation = true,\n className,\n tabIndex,\n operationIdentifier,\n triggerProps,\n}: ActionButtonProps, ref): React.JSX.Element {\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n if (stopPropagation) e.stopPropagation()\n /*\n * The OUTER trigger's handler first, then this component's own.\n *\n * An anchored overlay opens from its trigger's `onClick`; dropping it is what made\n * `ActionBarButton.popover` inert. Calling both keeps an action that has BOTH — a panel and a\n * fallback — behaving the same in either label mode.\n */\n triggerProps?.onClick?.(e)\n onClick?.(e)\n },\n [onClick, stopPropagation, triggerProps],\n )\n\n /* ── Inline-label mode ──────────────────────────────────────────────── */\n if (labelDisplayMode === ActionLabelDisplayMode.INLINE) {\n return (\n <Button\n variant={variant}\n size={ButtonSize.SM}\n disabled={disabled}\n loading={busy}\n {...triggerProps}\n onClick={handleClick}\n ref={ref}\n tabIndex={tabIndex}\n data-operation-id={operationIdentifier}\n className={cn(\"gap-1.5\", className)}\n >\n {icon}\n <span className=\"text-xs font-medium whitespace-nowrap\">{label}</span>\n </Button>\n )\n }\n\n /* ── Icon-only mode with tooltip ────────────────────────────────────── */\n /*\n * `triggerProps` and `ref` land on the BUTTON, not on the `<Tooltip>` root above it.\n *\n * A Radix root renders no DOM element and forwards nothing, so an outer `asChild` trigger cloning\n * onto THIS component's return value would merge its props into nothing — which is precisely how\n * `ActionBar`'s `ActionBarButton.popover` came to be silently inert in this mode: the button\n * rendered, hovered, focused and clicked, and the panel never opened.\n */\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={variant}\n size={size}\n disabled={disabled}\n loading={busy}\n {...triggerProps}\n onClick={handleClick}\n ref={ref}\n aria-label={label}\n tabIndex={tabIndex}\n data-operation-id={operationIdentifier}\n className={className}\n >\n {icon}\n </Button>\n </TooltipTrigger>\n <TooltipContent side={PlacementSide.BOTTOM} sideOffset={5}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n})\n\nActionButton.displayName = \"ActionButton\"\n\nexport { ActionButton }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"action-button.labels.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/action-button.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM/H,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,EAAO,CAAC"}
1
+ {"version":3,"file":"action-button.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/action-button.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM/H,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,EAAO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"button-group.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/button-group.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAE1B,MAAM,6BAA6B,CAAC;AAIrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAkB9B,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,WAAW,EACX,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUtC;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,OAAe,EACf,GAAG,KAAK,EACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmB1C;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,WAAuC,EACvC,GAAG,KAAK,EACT,EAAE,yBAAyB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAY/C;AAED,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,eAAe,GAChB,CAAA"}
1
+ {"version":3,"file":"button-group.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/button-group.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAE1B,MAAM,6BAA6B,CAAC;AAIrC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAkB9B,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,WAAW,EACX,GAAG,KAAK,EACT,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUtC;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,OAAe,EACf,GAAG,KAAK,EACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAmB1C;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,WAAuC,EACvC,GAAG,KAAK,EACT,EAAE,yBAAyB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAY/C;AAED,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,eAAe,GAChB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,6BAA6B,CAAA;AAkBtF,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,yBAAyB,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CA4FhG,CAAA;AAIF,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,6BAA6B,CAAA;AAgFtF,QAAA,MAAM,MAAM,EAAE,KAAK,CAAC,yBAAyB,CAAC,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAgGhG,CAAA;AAIF,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -4,7 +4,7 @@ import { Slot } from "@radix-ui/react-slot";
4
4
  import { motion } from "motion/react";
5
5
  import { Loader2 } from "lucide-react";
6
6
  import { InteractiveVariant, UIBehavior } from "@wildo-ai/presets-components-models";
7
- import { cn, useMaterialRuntime, useUI } from "@wildo-ai/saas-frontend-lib";
7
+ import { ButtonLabelOverflow, cn, useMaterialRuntime, useUI } from "@wildo-ai/saas-frontend-lib";
8
8
  /** Map public variant names to InteractiveVariant enum values */
9
9
  const VARIANT_MAP = {
10
10
  default: InteractiveVariant.PRIMARY,
@@ -17,7 +17,65 @@ const VARIANT_MAP = {
17
17
  };
18
18
  /** Structure classes — layout, accessibility, SVG handling. Theme-independent. */
19
19
  const STRUCTURE = "relative inline-flex items-center justify-center gap-element whitespace-nowrap shrink-0 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none";
20
- const Button = React.forwardRef(({ className, style, variant = "default", size = "md", asChild = false, loading, children, ...props }, ref) => {
20
+ /**
21
+ * Structure added when the label may wrap (`ButtonLabelOverflow.WRAP`).
22
+ *
23
+ * `wrap-anywhere` rather than `break-words`: only `overflow-wrap: anywhere` lowers the label's
24
+ * min-content width, so a single long translated word shrinks with its button instead of pushing it
25
+ * past its container.
26
+ */
27
+ const LABEL_WRAP_STRUCTURE = "whitespace-normal wrap-anywhere hyphens-auto text-balance";
28
+ /**
29
+ * The vertical padding of a wrapping button, applied AFTER the theme size so it replaces the theme's
30
+ * own `py-*`. Measured on the running sign-in screen, default theme: a theme's fixed height is SMALLER
31
+ * than the box its own padding implies — `h-9` is 36px while 20px of line plus the theme's `py-2` and
32
+ * the 1px borders come to 38px. A fixed height hides that by clipping; a minimum height cannot, so the
33
+ * wrapping button rendered 2px taller than the non-wrapping one beside it.
34
+ *
35
+ * At `py-item` (4px) a one-line label measures 30px, below every theme's floor, so the button takes the
36
+ * theme height EXACTLY and only a second line grows it. The trade is deliberate: a wrapped label has
37
+ * less vertical padding than a theme might choose, and matching its siblings is worth more than that.
38
+ */
39
+ const LABEL_WRAP_PADDING = "py-item";
40
+ /**
41
+ * The minimum-height class for each fixed height a theme gives an interactive size, WRITTEN OUT.
42
+ *
43
+ * A table and not `min-${token}`: Tailwind generates CSS only for class names that appear literally in
44
+ * scanned source, so a name assembled at runtime is styled only when the same name happens to be
45
+ * written somewhere else. Built that way, WRAP kept its floor at every theme's `md` by coincidence and
46
+ * lost it at cozy `lg` (`h-12`) and the trading/terminal/dense small sizes (`h-5`, `h-6`), which no
47
+ * other file spells.
48
+ *
49
+ * `button.label-overflow.test.tsx` walks every theme's size entries and fails when a theme introduces
50
+ * a height missing here. Add the row in the same change.
51
+ */
52
+ const WRAPPING_MIN_HEIGHT_CLASSES = {
53
+ 'h-5': 'min-h-5',
54
+ 'h-6': 'min-h-6',
55
+ 'h-7': 'min-h-7',
56
+ 'h-8': 'min-h-8',
57
+ 'h-9': 'min-h-9',
58
+ 'h-10': 'min-h-10',
59
+ 'h-11': 'min-h-11',
60
+ 'h-12': 'min-h-12',
61
+ };
62
+ /**
63
+ * A theme size, re-expressed for a label that may wrap: each plain `h-N` token becomes its literal
64
+ * `min-h-N`, so a wrapping button is exactly as tall as its non-wrapping siblings while its label fits
65
+ * on one line — `h-11` in cozy, `h-8` in dense, `h-9` in the default theme — and grows only when the
66
+ * label needs a second line.
67
+ *
68
+ * Only plain `h-N` tokens are converted. `size-*` belongs to the square icon sizes, which carry no
69
+ * label to wrap. A variant-prefixed height (`sm:h-10`) — used by no theme today — and a height missing
70
+ * from the table are left as they are: the button keeps a fixed height rather than losing its floor.
71
+ */
72
+ function toWrappingSizeClasses(sizeClasses) {
73
+ return sizeClasses
74
+ ?.split(/\s+/)
75
+ .map((token) => WRAPPING_MIN_HEIGHT_CLASSES[token] ?? token)
76
+ .join(' ');
77
+ }
78
+ const Button = React.forwardRef(({ className, style, variant = "default", size = "md", asChild = false, loading, labelOverflow = ButtonLabelOverflow.NOWRAP, children, ...props }, ref) => {
21
79
  const { getMaterialProfile, getRecipe } = useUI();
22
80
  const recipe = getRecipe(UIBehavior.INTERACTIVE, VARIANT_MAP[variant]);
23
81
  const materialProfile = getMaterialProfile?.(recipe.material);
@@ -32,7 +90,8 @@ const Button = React.forwardRef(({ className, style, variant = "default", size =
32
90
  const materialRuntime = useMaterialRuntime(materialProfile, elementRef);
33
91
  const resolvedStyle = { ...materialRuntime.style, ...style };
34
92
  const isLoading = loading === true && !asChild;
35
- const classes = cn(STRUCTURE, recipe.base, recipe.states.hover, recipe.states.active, recipe.states.focus, recipe.states.disabled, recipe.states.invalid, recipe.sizes?.[size], recipe.motion.transition, className);
93
+ const labelWraps = labelOverflow === ButtonLabelOverflow.WRAP;
94
+ const classes = cn(STRUCTURE, labelWraps && LABEL_WRAP_STRUCTURE, recipe.base, recipe.states.hover, recipe.states.active, recipe.states.focus, recipe.states.disabled, recipe.states.invalid, labelWraps ? toWrappingSizeClasses(recipe.sizes?.[size]) : recipe.sizes?.[size], labelWraps && LABEL_WRAP_PADDING, recipe.motion.transition, className);
36
95
  const content = isLoading ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: _jsx(Loader2, { className: "size-4 animate-spin motion-reduce:animate-none" }) }), _jsx("span", { className: "inline-flex items-center gap-element invisible", children: children })] })) : children;
37
96
  const loadingProps = isLoading ? { disabled: true, 'aria-busy': true } : {};
38
97
  // Gesture layer: if theme provides gesture config, use motion.button for spring physics
@@ -1 +1 @@
1
- {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../../../src/components/actions/button.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { motion } from \"motion/react\"\nimport { Loader2 } from \"lucide-react\"\nimport { FrontendComponentType, InteractiveVariant, UIBehavior } from \"@wildo-ai/presets-components-models\"\nimport type { ButtonProps, ButtonVariants_Variant } from '@wildo-ai/saas-frontend-lib'\n\nimport { cn, useMaterialRuntime, useUI } from \"@wildo-ai/saas-frontend-lib\"\n\n/** Map public variant names to InteractiveVariant enum values */\nconst VARIANT_MAP: Record<ButtonVariants_Variant, InteractiveVariant> = {\n default: InteractiveVariant.PRIMARY,\n destructive: InteractiveVariant.DESTRUCTIVE,\n outline: InteractiveVariant.OUTLINE,\n secondary: InteractiveVariant.SECONDARY,\n ghost: InteractiveVariant.GHOST,\n link: InteractiveVariant.LINK,\n accent: InteractiveVariant.ACCENT,\n}\n\n/** Structure classes — layout, accessibility, SVG handling. Theme-independent. */\nconst STRUCTURE: string = \"relative inline-flex items-center justify-center gap-element whitespace-nowrap shrink-0 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none\"\n\nconst Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>> = React.forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, style, variant = \"default\", size = \"md\", asChild = false, loading, children, ...props }, ref): React.JSX.Element => {\n const { getMaterialProfile, getRecipe } = useUI()\n\n const recipe = getRecipe(UIBehavior.INTERACTIVE, VARIANT_MAP[variant])\n const materialProfile = getMaterialProfile?.(recipe.material)\n const elementRef = React.useRef<HTMLElement | null>(null)\n const composedRef = React.useCallback((node: HTMLButtonElement | null): void => {\n elementRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }, [ref])\n const materialRuntime = useMaterialRuntime(materialProfile, elementRef)\n const resolvedStyle = { ...materialRuntime.style, ...style }\n\n const isLoading = loading === true && !asChild\n\n const classes = cn(\n STRUCTURE,\n recipe.base,\n recipe.states.hover,\n recipe.states.active,\n recipe.states.focus,\n recipe.states.disabled,\n recipe.states.invalid,\n recipe.sizes?.[size],\n recipe.motion.transition,\n className,\n )\n\n const content = isLoading ? (\n <>\n <span className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"size-4 animate-spin motion-reduce:animate-none\" />\n </span>\n <span className=\"inline-flex items-center gap-element invisible\">{children}</span>\n </>\n ) : children\n\n const loadingProps = isLoading ? { disabled: true, 'aria-busy': true as const } : {}\n\n // Gesture layer: if theme provides gesture config, use motion.button for spring physics\n if (recipe.gesture && !materialProfile && !asChild) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, onAnimationEnd, ...motionSafeProps } = props\n return (\n <motion.button\n ref={composedRef}\n data-slot=\"button\"\n data-material-kind={materialRuntime['data-material-kind']}\n data-material-tier={materialRuntime['data-material-tier']}\n data-material-variant={materialRuntime['data-material-variant']}\n data-material-depth={materialRuntime['data-material-depth']}\n data-material-composition={materialRuntime['data-material-composition']}\n data-material-group={materialRuntime['data-material-group']}\n data-material-refractive-budget={materialRuntime['data-material-refractive-budget']}\n className={classes}\n style={resolvedStyle}\n whileHover={isLoading ? undefined : recipe.gesture.whileHover}\n whileTap={isLoading ? undefined : recipe.gesture.whileTap}\n whileFocus={recipe.gesture.whileFocus}\n transition={recipe.gesture.transition}\n {...motionSafeProps}\n {...loadingProps}\n >\n {content}\n </motion.button>\n )\n }\n\n // CSS-only fallback (default theme, or asChild mode)\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n ref={composedRef}\n data-slot=\"button\"\n data-material-kind={materialRuntime['data-material-kind']}\n data-material-tier={materialRuntime['data-material-tier']}\n data-material-variant={materialRuntime['data-material-variant']}\n data-material-depth={materialRuntime['data-material-depth']}\n data-material-composition={materialRuntime['data-material-composition']}\n data-material-group={materialRuntime['data-material-group']}\n data-material-refractive-budget={materialRuntime['data-material-refractive-budget']}\n className={classes}\n style={resolvedStyle}\n {...props}\n {...loadingProps}\n >\n {content}\n </Comp>\n )\n})\n\nButton.displayName = \"Button\"\n\nexport { Button }\n"]}
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../../../src/components/actions/button.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { motion } from \"motion/react\"\nimport { Loader2 } from \"lucide-react\"\nimport { FrontendComponentType, InteractiveVariant, UIBehavior } from \"@wildo-ai/presets-components-models\"\nimport type { ButtonProps, ButtonVariants_Variant } from '@wildo-ai/saas-frontend-lib'\n\nimport { ButtonLabelOverflow, cn, useMaterialRuntime, useUI } from \"@wildo-ai/saas-frontend-lib\"\n\n/** Map public variant names to InteractiveVariant enum values */\nconst VARIANT_MAP: Record<ButtonVariants_Variant, InteractiveVariant> = {\n default: InteractiveVariant.PRIMARY,\n destructive: InteractiveVariant.DESTRUCTIVE,\n outline: InteractiveVariant.OUTLINE,\n secondary: InteractiveVariant.SECONDARY,\n ghost: InteractiveVariant.GHOST,\n link: InteractiveVariant.LINK,\n accent: InteractiveVariant.ACCENT,\n}\n\n/** Structure classes — layout, accessibility, SVG handling. Theme-independent. */\nconst STRUCTURE: string = \"relative inline-flex items-center justify-center gap-element whitespace-nowrap shrink-0 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none\"\n\n/**\n * Structure added when the label may wrap (`ButtonLabelOverflow.WRAP`).\n *\n * `wrap-anywhere` rather than `break-words`: only `overflow-wrap: anywhere` lowers the label's\n * min-content width, so a single long translated word shrinks with its button instead of pushing it\n * past its container.\n */\nconst LABEL_WRAP_STRUCTURE: string = \"whitespace-normal wrap-anywhere hyphens-auto text-balance\"\n\n/**\n * The vertical padding of a wrapping button, applied AFTER the theme size so it replaces the theme's\n * own `py-*`. Measured on the running sign-in screen, default theme: a theme's fixed height is SMALLER\n * than the box its own padding implies — `h-9` is 36px while 20px of line plus the theme's `py-2` and\n * the 1px borders come to 38px. A fixed height hides that by clipping; a minimum height cannot, so the\n * wrapping button rendered 2px taller than the non-wrapping one beside it.\n *\n * At `py-item` (4px) a one-line label measures 30px, below every theme's floor, so the button takes the\n * theme height EXACTLY and only a second line grows it. The trade is deliberate: a wrapped label has\n * less vertical padding than a theme might choose, and matching its siblings is worth more than that.\n */\nconst LABEL_WRAP_PADDING: string = \"py-item\"\n\n/**\n * The minimum-height class for each fixed height a theme gives an interactive size, WRITTEN OUT.\n *\n * A table and not `min-${token}`: Tailwind generates CSS only for class names that appear literally in\n * scanned source, so a name assembled at runtime is styled only when the same name happens to be\n * written somewhere else. Built that way, WRAP kept its floor at every theme's `md` by coincidence and\n * lost it at cozy `lg` (`h-12`) and the trading/terminal/dense small sizes (`h-5`, `h-6`), which no\n * other file spells.\n *\n * `button.label-overflow.test.tsx` walks every theme's size entries and fails when a theme introduces\n * a height missing here. Add the row in the same change.\n */\nconst WRAPPING_MIN_HEIGHT_CLASSES: Readonly<Record<string, string>> = {\n 'h-5': 'min-h-5',\n 'h-6': 'min-h-6',\n 'h-7': 'min-h-7',\n 'h-8': 'min-h-8',\n 'h-9': 'min-h-9',\n 'h-10': 'min-h-10',\n 'h-11': 'min-h-11',\n 'h-12': 'min-h-12',\n}\n\n/**\n * A theme size, re-expressed for a label that may wrap: each plain `h-N` token becomes its literal\n * `min-h-N`, so a wrapping button is exactly as tall as its non-wrapping siblings while its label fits\n * on one line — `h-11` in cozy, `h-8` in dense, `h-9` in the default theme — and grows only when the\n * label needs a second line.\n *\n * Only plain `h-N` tokens are converted. `size-*` belongs to the square icon sizes, which carry no\n * label to wrap. A variant-prefixed height (`sm:h-10`) — used by no theme today — and a height missing\n * from the table are left as they are: the button keeps a fixed height rather than losing its floor.\n */\nfunction toWrappingSizeClasses(sizeClasses: string | undefined): string | undefined {\n return sizeClasses\n ?.split(/\\s+/)\n .map((token) => WRAPPING_MIN_HEIGHT_CLASSES[token] ?? token)\n .join(' ')\n}\n\nconst Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>> = React.forwardRef<\n HTMLButtonElement,\n ButtonProps\n>(({ className, style, variant = \"default\", size = \"md\", asChild = false, loading, labelOverflow = ButtonLabelOverflow.NOWRAP, children, ...props }, ref): React.JSX.Element => {\n const { getMaterialProfile, getRecipe } = useUI()\n\n const recipe = getRecipe(UIBehavior.INTERACTIVE, VARIANT_MAP[variant])\n const materialProfile = getMaterialProfile?.(recipe.material)\n const elementRef = React.useRef<HTMLElement | null>(null)\n const composedRef = React.useCallback((node: HTMLButtonElement | null): void => {\n elementRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }, [ref])\n const materialRuntime = useMaterialRuntime(materialProfile, elementRef)\n const resolvedStyle = { ...materialRuntime.style, ...style }\n\n const isLoading = loading === true && !asChild\n\n const labelWraps = labelOverflow === ButtonLabelOverflow.WRAP\n\n const classes = cn(\n STRUCTURE,\n labelWraps && LABEL_WRAP_STRUCTURE,\n recipe.base,\n recipe.states.hover,\n recipe.states.active,\n recipe.states.focus,\n recipe.states.disabled,\n recipe.states.invalid,\n labelWraps ? toWrappingSizeClasses(recipe.sizes?.[size]) : recipe.sizes?.[size],\n labelWraps && LABEL_WRAP_PADDING,\n recipe.motion.transition,\n className,\n )\n\n const content = isLoading ? (\n <>\n <span className=\"absolute inset-0 flex items-center justify-center\">\n <Loader2 className=\"size-4 animate-spin motion-reduce:animate-none\" />\n </span>\n <span className=\"inline-flex items-center gap-element invisible\">{children}</span>\n </>\n ) : children\n\n const loadingProps = isLoading ? { disabled: true, 'aria-busy': true as const } : {}\n\n // Gesture layer: if theme provides gesture config, use motion.button for spring physics\n if (recipe.gesture && !materialProfile && !asChild) {\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, onAnimationEnd, ...motionSafeProps } = props\n return (\n <motion.button\n ref={composedRef}\n data-slot=\"button\"\n data-material-kind={materialRuntime['data-material-kind']}\n data-material-tier={materialRuntime['data-material-tier']}\n data-material-variant={materialRuntime['data-material-variant']}\n data-material-depth={materialRuntime['data-material-depth']}\n data-material-composition={materialRuntime['data-material-composition']}\n data-material-group={materialRuntime['data-material-group']}\n data-material-refractive-budget={materialRuntime['data-material-refractive-budget']}\n className={classes}\n style={resolvedStyle}\n whileHover={isLoading ? undefined : recipe.gesture.whileHover}\n whileTap={isLoading ? undefined : recipe.gesture.whileTap}\n whileFocus={recipe.gesture.whileFocus}\n transition={recipe.gesture.transition}\n {...motionSafeProps}\n {...loadingProps}\n >\n {content}\n </motion.button>\n )\n }\n\n // CSS-only fallback (default theme, or asChild mode)\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n ref={composedRef}\n data-slot=\"button\"\n data-material-kind={materialRuntime['data-material-kind']}\n data-material-tier={materialRuntime['data-material-tier']}\n data-material-variant={materialRuntime['data-material-variant']}\n data-material-depth={materialRuntime['data-material-depth']}\n data-material-composition={materialRuntime['data-material-composition']}\n data-material-group={materialRuntime['data-material-group']}\n data-material-refractive-budget={materialRuntime['data-material-refractive-budget']}\n className={classes}\n style={resolvedStyle}\n {...props}\n {...loadingProps}\n >\n {content}\n </Comp>\n )\n})\n\nButton.displayName = \"Button\"\n\nexport { Button }\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"button.labels.d.ts","sourceRoot":"","sources":["../../../../src/components/actions/button.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM1I,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,EAKrD,CAAC"}
1
+ {"version":3,"file":"button.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/actions/button.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,mBAAmB,EAA2B,MAAM,qCAAqC,CAAC;AAM1I,eAAO,MAAM,oBAAoB,EAAE,mBAAmB,EAKrD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-browser.d.ts","sourceRoot":"","sources":["../../../../../src/components/ai-elements/artifacts/artifact-browser.tsx"],"names":[],"mappings":"AAGA,OAAO,EAaL,uBAAuB,EAUxB,MAAM,6BAA6B,CAAC;AA6ZrC,eAAO,MAAM,eAAe,yBAM1B,CAAC"}
1
+ {"version":3,"file":"artifact-browser.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/artifact-browser.tsx"],"names":[],"mappings":"AAGA,OAAO,EAaL,uBAAuB,EAUxB,MAAM,6BAA6B,CAAC;AA6ZrC,eAAO,MAAM,eAAe,yBAM1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../../../src/components/ai-elements/artifacts/artifact.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,MAAM,EAYN,mBAAmB,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AA6C1D,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AA4DlE,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;CAClF,CAAC;AAuDF,eAAO,MAAM,WAAW,qBAQtB,CAAC"}
1
+ {"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/artifact.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,MAAM,EAYN,mBAAmB,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AA6C1D,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AA4DlE,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;CAClF,CAAC;AAuDF,eAAO,MAAM,WAAW,qBAQtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"artifact.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/ai-elements/artifacts/artifact.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAM7C,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,EA0BzD,CAAC"}
1
+ {"version":3,"file":"artifact.labels.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/artifact.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAM7C,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,EA0BzD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../../../src/components/ai-elements/artifacts/code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,MAAM,EAOP,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAOf,KAAK,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAiEF,eAAO,MAAM,YAAY,GAAI,oEAO1B,iBAAiB,KAAG,KAAK,CAAC,GAAG,CAAC,OAoDhC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACxE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,6DAOpC,2BAA2B,KAAG,KAAK,CAAC,GAAG,CAAC,OAoC1C,CAAC"}
1
+ {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/code-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,MAAM,EAOP,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAOf,KAAK,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAiEF,eAAO,MAAM,YAAY,GAAI,oEAO1B,iBAAiB,KAAG,KAAK,CAAC,GAAG,CAAC,OAoDhC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACxE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,6DAOpC,2BAA2B,KAAG,KAAK,CAAC,GAAG,CAAC,OAoC1C,CAAC"}
@@ -52,7 +52,7 @@ async function highlightCode(code, language, showLineNumbers = false, lineNumber
52
52
  : [];
53
53
  const resolvedLanguage = language ?? "plaintext";
54
54
  return Promise.all([
55
- highlightToHtml({ code, language: resolvedLanguage, theme: "one-light", transformers }),
55
+ highlightToHtml({ code, language: resolvedLanguage, theme: "github-light-high-contrast", transformers }),
56
56
  highlightToHtml({ code, language: resolvedLanguage, theme: "one-dark-pro", transformers }),
57
57
  ]);
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.js","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/code-block.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Button,\n cn,\n useIconRegistry,\n StandardIconReference,\n useUI,\n useI18n,\n Surface,\n} from '@wildo-ai/saas-frontend-lib';\n\nimport { FrontendComponentType, SurfaceVariant, TypographyVariant, UIBehavior } from \"@wildo-ai/presets-components-models\";\nimport {\n type ComponentProps,\n createContext,\n type HTMLAttributes,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n// The highlighter (31.2 kB gzipped) resolves through this door on first HIGHLIGHT, not on first\n// paint. Highlighting was already async here, so the door adds no fallback and no render-tree\n// layer — see `shiki-highlighter.lazy.ts`. The type-only import carries no runtime edge.\nimport { highlightToHtml } from \"~wildo-presets/components/ai-elements/artifacts/shiki-highlighter.lazy\";\nimport type { ShikiTransformer } from \"~wildo-presets/shiki-subset\";\n\ntype AI_CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language?: string;\n showLineNumbers?: boolean;\n};\n\ntype CodeBlockContextType = {\n code: string;\n};\n\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\nfunction createLineNumberTransformer(lineNumberClass: string): ShikiTransformer {\n return {\n name: \"line-numbers\",\n line(node, line) {\n node.children.unshift({\n type: \"element\",\n tagName: \"span\",\n properties: {\n className: [\n \"inline-block\",\n \"min-w-10\",\n \"me-4\",\n \"text-end\",\n \"select-none\",\n lineNumberClass,\n ],\n },\n children: [{ type: \"text\", value: String(line) }],\n });\n },\n };\n}\n\n/**\n * Highlights `code` once per theme, returning `[lightHtml, darkHtml]`.\n *\n * Both variants are rendered up front and the CSS `dark:` classes below pick one, rather than\n * re-highlighting on a theme change — the component has no access to the resolved color scheme at\n * this point, and shiki has already loaded both themes into the shared highlighter by the time the\n * second call runs, so the second pass is tokenization only.\n *\n * `language` is honoured. It was hardcoded to `\"text\"` here until 2026-08-28, which meant the\n * component's `language` prop was accepted, forwarded, and discarded: every `AI_CodeBlock` — including\n * the two `language=\"json\"` tool-payload blocks in `ai-elements/execution/tool.tsx` — rendered as\n * uncolored plain text through a highlighter loaded for exactly that purpose. An unknown language\n * still degrades to plain text inside the lazy door, so passing an arbitrary string is safe.\n */\nasync function highlightCode(\n code: string,\n language?: string,\n showLineNumbers = false,\n lineNumberClass = \"text-muted-foreground\"\n): Promise<[string, string]> {\n const transformers: ShikiTransformer[] = showLineNumbers\n ? [createLineNumberTransformer(lineNumberClass)]\n : [];\n\n const resolvedLanguage = language ?? \"plaintext\";\n\n return Promise.all([\n highlightToHtml({ code, language: resolvedLanguage, theme: \"one-light\", transformers }),\n highlightToHtml({ code, language: resolvedLanguage, theme: \"one-dark-pro\", transformers }),\n ]);\n}\n\nexport const AI_CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: AI_CodeBlockProps): React.JSX.Element => {\n const [html, setHtml] = useState<string>(\"\");\n const [darkHtml, setDarkHtml] = useState<string>(\"\");\n const mounted = useRef(false);\n const { getRecipe } = useUI();\n const descRecipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION);\n\n useEffect(() => {\n highlightCode(code, language, showLineNumbers, descRecipe.base).then(([light, dark]) => {\n if (!mounted.current) {\n setHtml(light);\n setDarkHtml(dark);\n mounted.current = true;\n }\n });\n\n return () => {\n mounted.current = false;\n };\n }, [code, language, showLineNumbers, descRecipe.base]);\n\n return (\n <CodeBlockContext.Provider value={{ code }}>\n <Surface asChild emitPolicyVars={false} variant={SurfaceVariant.INSET}>\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n {...props}\n >\n <div className=\"relative\">\n <div\n className=\"overflow-hidden dark:hidden [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-card [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: \"this is needed.\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n <div\n className=\"hidden overflow-hidden dark:block [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-card [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: \"this is needed.\"\n dangerouslySetInnerHTML={{ __html: darkHtml }}\n />\n {children && (\n <div className=\"absolute top-2 end-2 flex items-center gap-element\">\n {children}\n </div>\n )}\n </div>\n </div>\n </Surface>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type AI_CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const AI_CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: AI_CodeBlockCopyButtonProps): React.JSX.Element => {\n const [isCopied, setIsCopied] = useState(false);\n const { code } = useContext(CodeBlockContext);\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_AI_CODE_BLOCK });\n\n const copyToClipboard = async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n };\n\n return (\n <Button\n {...({\n className: cn(\"shrink-0\", className),\n onClick: copyToClipboard,\n size: \"icon\" as const,\n variant: \"ghost\" as const,\n \"aria-label\": tComponent(FrontendComponentType.LOW_LEVEL_AI_CODE_BLOCK, 'copyCode'),\n ...props,\n } as React.ComponentProps<typeof Button>)}\n >\n {children ?? renderIcon(isCopied ? StandardIconReference.CHECK : StandardIconReference.COPY, { className: \"size-3.5\" })}\n </Button>\n );\n};\n"]}
1
+ {"version":3,"file":"code-block.js","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/code-block.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EACL,MAAM,EACN,EAAE,EACF,eAAe,EACf,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,OAAO,GACR,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAC3H,OAAO,EAEL,aAAa,EAEb,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,gGAAgG;AAChG,8FAA8F;AAC9F,yFAAyF;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,wEAAwE,CAAC;AAazG,MAAM,gBAAgB,GAAG,aAAa,CAAuB;IAC3D,IAAI,EAAE,EAAE;CACT,CAAC,CAAC;AAEH,SAAS,2BAA2B,CAAC,eAAuB;IAC1D,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI,CAAC,IAAI,EAAE,IAAI;YACb,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACpB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE;oBACV,SAAS,EAAE;wBACT,cAAc;wBACd,UAAU;wBACV,MAAM;wBACN,UAAU;wBACV,aAAa;wBACb,eAAe;qBAChB;iBACF;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,QAAiB,EACjB,eAAe,GAAG,KAAK,EACvB,eAAe,GAAG,uBAAuB;IAEzC,MAAM,YAAY,GAAuB,eAAe;QACtD,CAAC,CAAC,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,gBAAgB,GAAG,QAAQ,IAAI,WAAW,CAAC;IAEjD,OAAO,OAAO,CAAC,GAAG,CAAC;QACjB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,4BAA4B,EAAE,YAAY,EAAE,CAAC;QACxG,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;KAC3F,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,eAAe,GAAG,KAAK,EACvB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACU,EAAqB,EAAE;IACzC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEnF,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;YACrF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvD,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YACxC,KAAC,OAAO,IAAC,OAAO,QAAC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,YACnE,cACE,SAAS,EAAE,EAAE,CACX,uFAAuF,EACvF,SAAS,CACV,KACG,KAAK,YAET,eAAK,SAAS,EAAC,UAAU,aACvB,cACE,SAAS,EAAC,4JAA4J;4BACtK,0EAA0E;4BAC1E,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GACzC,EACF,cACE,SAAS,EAAC,kKAAkK;4BAC5K,0EAA0E;4BAC1E,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC7C,EACD,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,oDAAoD,YAChE,QAAQ,GACL,CACP,IACG,GACF,GACE,GACgB,CAC7B,CAAC;AACJ,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,MAAM,EACN,OAAO,EACP,OAAO,GAAG,IAAI,EACd,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACoB,EAAqB,EAAE;IACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAEtG,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;YACtE,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1C,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,EAAE,EAAE,CAAC;YACX,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,CAAC,KAAc,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,MAAM,OACA;YACH,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;YACpC,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,MAAe;YACrB,OAAO,EAAE,OAAgB;YACzB,YAAY,EAAE,UAAU,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,UAAU,CAAC;YACnF,GAAG,KAAK;SAC+B,YAExC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAChH,CACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Button,\n cn,\n useIconRegistry,\n StandardIconReference,\n useUI,\n useI18n,\n Surface,\n} from '@wildo-ai/saas-frontend-lib';\n\nimport { FrontendComponentType, SurfaceVariant, TypographyVariant, UIBehavior } from \"@wildo-ai/presets-components-models\";\nimport {\n type ComponentProps,\n createContext,\n type HTMLAttributes,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n// The highlighter (31.2 kB gzipped) resolves through this door on first HIGHLIGHT, not on first\n// paint. Highlighting was already async here, so the door adds no fallback and no render-tree\n// layer — see `shiki-highlighter.lazy.ts`. The type-only import carries no runtime edge.\nimport { highlightToHtml } from \"~wildo-presets/components/ai-elements/artifacts/shiki-highlighter.lazy\";\nimport type { ShikiTransformer } from \"~wildo-presets/shiki-subset\";\n\ntype AI_CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language?: string;\n showLineNumbers?: boolean;\n};\n\ntype CodeBlockContextType = {\n code: string;\n};\n\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\nfunction createLineNumberTransformer(lineNumberClass: string): ShikiTransformer {\n return {\n name: \"line-numbers\",\n line(node, line) {\n node.children.unshift({\n type: \"element\",\n tagName: \"span\",\n properties: {\n className: [\n \"inline-block\",\n \"min-w-10\",\n \"me-4\",\n \"text-end\",\n \"select-none\",\n lineNumberClass,\n ],\n },\n children: [{ type: \"text\", value: String(line) }],\n });\n },\n };\n}\n\n/**\n * Highlights `code` once per theme, returning `[lightHtml, darkHtml]`.\n *\n * Both variants are rendered up front and the CSS `dark:` classes below pick one, rather than\n * re-highlighting on a theme change — the component has no access to the resolved color scheme at\n * this point, and shiki has already loaded both themes into the shared highlighter by the time the\n * second call runs, so the second pass is tokenization only.\n *\n * `language` is honoured. It was hardcoded to `\"text\"` here until 2026-08-28, which meant the\n * component's `language` prop was accepted, forwarded, and discarded: every `AI_CodeBlock` — including\n * the two `language=\"json\"` tool-payload blocks in `ai-elements/execution/tool.tsx` — rendered as\n * uncolored plain text through a highlighter loaded for exactly that purpose. An unknown language\n * still degrades to plain text inside the lazy door, so passing an arbitrary string is safe.\n */\nasync function highlightCode(\n code: string,\n language?: string,\n showLineNumbers = false,\n lineNumberClass = \"text-muted-foreground\"\n): Promise<[string, string]> {\n const transformers: ShikiTransformer[] = showLineNumbers\n ? [createLineNumberTransformer(lineNumberClass)]\n : [];\n\n const resolvedLanguage = language ?? \"plaintext\";\n\n return Promise.all([\n highlightToHtml({ code, language: resolvedLanguage, theme: \"github-light-high-contrast\", transformers }),\n highlightToHtml({ code, language: resolvedLanguage, theme: \"one-dark-pro\", transformers }),\n ]);\n}\n\nexport const AI_CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n className,\n children,\n ...props\n}: AI_CodeBlockProps): React.JSX.Element => {\n const [html, setHtml] = useState<string>(\"\");\n const [darkHtml, setDarkHtml] = useState<string>(\"\");\n const mounted = useRef(false);\n const { getRecipe } = useUI();\n const descRecipe = getRecipe(UIBehavior.TYPOGRAPHY, TypographyVariant.DESCRIPTION);\n\n useEffect(() => {\n highlightCode(code, language, showLineNumbers, descRecipe.base).then(([light, dark]) => {\n if (!mounted.current) {\n setHtml(light);\n setDarkHtml(dark);\n mounted.current = true;\n }\n });\n\n return () => {\n mounted.current = false;\n };\n }, [code, language, showLineNumbers, descRecipe.base]);\n\n return (\n <CodeBlockContext.Provider value={{ code }}>\n <Surface asChild emitPolicyVars={false} variant={SurfaceVariant.INSET}>\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className\n )}\n {...props}\n >\n <div className=\"relative\">\n <div\n className=\"overflow-hidden dark:hidden [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-card [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: \"this is needed.\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n <div\n className=\"hidden overflow-hidden dark:block [&>pre]:m-0 [&>pre]:bg-background! [&>pre]:p-card [&>pre]:text-foreground! [&>pre]:text-sm [&_code]:font-mono [&_code]:text-sm\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: \"this is needed.\"\n dangerouslySetInnerHTML={{ __html: darkHtml }}\n />\n {children && (\n <div className=\"absolute top-2 end-2 flex items-center gap-element\">\n {children}\n </div>\n )}\n </div>\n </div>\n </Surface>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type AI_CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const AI_CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: AI_CodeBlockCopyButtonProps): React.JSX.Element => {\n const [isCopied, setIsCopied] = useState(false);\n const { code } = useContext(CodeBlockContext);\n const { renderIcon } = useIconRegistry();\n const { tComponent, isReady } = useI18n({ component: FrontendComponentType.LOW_LEVEL_AI_CODE_BLOCK });\n\n const copyToClipboard = async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n };\n\n return (\n <Button\n {...({\n className: cn(\"shrink-0\", className),\n onClick: copyToClipboard,\n size: \"icon\" as const,\n variant: \"ghost\" as const,\n \"aria-label\": tComponent(FrontendComponentType.LOW_LEVEL_AI_CODE_BLOCK, 'copyCode'),\n ...props,\n } as React.ComponentProps<typeof Button>)}\n >\n {children ?? renderIcon(isCopied ? StandardIconReference.CHECK : StandardIconReference.COPY, { className: \"size-3.5\" })}\n </Button>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.labels.d.ts","sourceRoot":"","sources":["../../../../../src/components/ai-elements/artifacts/code-block.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAM7C,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,EAM1D,CAAC"}
1
+ {"version":3,"file":"code-block.labels.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/code-block.labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,qCAAqC,CAAC;AAM7C,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,EAM1D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as React from "react";
2
+ import type { AI_DiffBlockProps } from '@wildo-ai/saas-frontend-lib';
3
+ export declare const AI_DiffBlock: ({ files, actions, collapseAboveLines, oversizedAboveLines, className, ...props }: AI_DiffBlockProps) => React.JSX.Element | null;
4
+ //# sourceMappingURL=diff-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-block.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ai-elements/artifacts/diff-block.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,KAAK,EAAE,iBAAiB,EAA+C,MAAM,6BAA6B,CAAC;AA8KlH,eAAO,MAAM,YAAY,GAAI,kFAO1B,iBAAiB,KAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAqF1C,CAAC"}