@bettercms-ai/kit 1.0.0 → 2.0.0-next.1

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 (619) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +94 -31
  8. package/dist/adapters/lossy.js +419 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +91 -26
  11. package/{adapters → dist/adapters}/prod-types.js +82 -13
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +1038 -204
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +131 -2
  22. package/{context.js → dist/context.js} +44 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/dist/controls/form-picker-register.d.ts +7 -0
  50. package/{controls → dist/controls}/form-picker-register.js +2 -6
  51. package/dist/controls/form-picker-register.js.map +1 -0
  52. package/{controls → dist/controls}/form-picker.js +11 -9
  53. package/dist/controls/form-picker.js.map +1 -0
  54. package/{controls → dist/controls}/icon-register.js +1 -1
  55. package/dist/controls/icon-register.js.map +1 -0
  56. package/{controls → dist/controls}/icon.d.ts +4 -2
  57. package/{controls → dist/controls}/icon.js +32 -27
  58. package/dist/controls/icon.js.map +1 -0
  59. package/{controls → dist/controls}/index.d.ts +1 -1
  60. package/{controls → dist/controls}/index.js +4 -3
  61. package/dist/controls/index.js.map +1 -0
  62. package/{controls → dist/controls}/json-register.js +1 -1
  63. package/dist/controls/json-register.js.map +1 -0
  64. package/{controls → dist/controls}/json.js +13 -3
  65. package/dist/controls/json.js.map +1 -0
  66. package/{controls → dist/controls}/link.js +116 -200
  67. package/dist/controls/link.js.map +1 -0
  68. package/{controls → dist/controls}/location-register.js +1 -1
  69. package/dist/controls/location-register.js.map +1 -0
  70. package/{controls → dist/controls}/location.js +59 -40
  71. package/dist/controls/location.js.map +1 -0
  72. package/{controls → dist/controls}/media-register.js +1 -1
  73. package/dist/controls/media-register.js.map +1 -0
  74. package/{controls → dist/controls}/media-services.d.ts +6 -0
  75. package/dist/controls/media-services.js +0 -0
  76. package/{controls → dist/controls}/media.d.ts +21 -4
  77. package/{controls → dist/controls}/media.js +407 -130
  78. package/dist/controls/media.js.map +1 -0
  79. package/{controls → dist/controls}/number.js +10 -9
  80. package/dist/controls/number.js.map +1 -0
  81. package/{controls → dist/controls}/reference-register.js +1 -1
  82. package/dist/controls/reference-register.js.map +1 -0
  83. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  84. package/dist/controls/reference-services.js +0 -0
  85. package/{controls → dist/controls}/reference.d.ts +1 -1
  86. package/{controls → dist/controls}/reference.js +93 -77
  87. package/dist/controls/reference.js.map +1 -0
  88. package/dist/controls/rich-text/article-shell.d.ts +145 -0
  89. package/dist/controls/rich-text/article-shell.js +510 -0
  90. package/dist/controls/rich-text/article-shell.js.map +1 -0
  91. package/dist/controls/rich-text/author.d.ts +25 -0
  92. package/dist/controls/rich-text/author.js +104 -0
  93. package/dist/controls/rich-text/author.js.map +1 -0
  94. package/dist/controls/rich-text/blocks.d.ts +60 -0
  95. package/{controls → dist/controls}/rich-text/blocks.js +164 -389
  96. package/dist/controls/rich-text/blocks.js.map +1 -0
  97. package/dist/controls/rich-text/button.d.ts +23 -0
  98. package/dist/controls/rich-text/button.js +85 -0
  99. package/dist/controls/rich-text/button.js.map +1 -0
  100. package/{controls → dist/controls}/rich-text/catalog.d.ts +7 -4
  101. package/{controls → dist/controls}/rich-text/catalog.js +94 -68
  102. package/dist/controls/rich-text/catalog.js.map +1 -0
  103. package/dist/controls/rich-text/checklist.d.ts +24 -0
  104. package/dist/controls/rich-text/checklist.js +115 -0
  105. package/dist/controls/rich-text/checklist.js.map +1 -0
  106. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  107. package/{controls → dist/controls}/rich-text/codec.js +7 -2
  108. package/dist/controls/rich-text/codec.js.map +1 -0
  109. package/dist/controls/rich-text/columns.d.ts +41 -0
  110. package/dist/controls/rich-text/columns.js +181 -0
  111. package/dist/controls/rich-text/columns.js.map +1 -0
  112. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  113. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  114. package/dist/controls/rich-text/component-card.js.map +1 -0
  115. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  116. package/dist/controls/rich-text/component-panel.js +141 -0
  117. package/dist/controls/rich-text/component-panel.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  119. package/{controls → dist/controls}/rich-text/control.js +84 -42
  120. package/dist/controls/rich-text/control.js.map +1 -0
  121. package/{controls → dist/controls}/rich-text/dom.d.ts +53 -9
  122. package/{controls → dist/controls}/rich-text/dom.js +388 -50
  123. package/dist/controls/rich-text/dom.js.map +1 -0
  124. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  125. package/{controls → dist/controls}/rich-text/editor.js +226 -44
  126. package/dist/controls/rich-text/editor.js.map +1 -0
  127. package/dist/controls/rich-text/embed.d.ts +28 -0
  128. package/dist/controls/rich-text/embed.js +210 -0
  129. package/dist/controls/rich-text/embed.js.map +1 -0
  130. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  131. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  132. package/dist/controls/rich-text/floating.js.map +1 -0
  133. package/dist/controls/rich-text/footnote.d.ts +41 -0
  134. package/dist/controls/rich-text/footnote.js +185 -0
  135. package/dist/controls/rich-text/footnote.js.map +1 -0
  136. package/dist/controls/rich-text/gallery.d.ts +28 -0
  137. package/dist/controls/rich-text/gallery.js +167 -0
  138. package/dist/controls/rich-text/gallery.js.map +1 -0
  139. package/{controls → dist/controls}/rich-text/index.js +1 -1
  140. package/dist/controls/rich-text/index.js.map +1 -0
  141. package/{controls → dist/controls}/rich-text/link-form.d.ts +3 -1
  142. package/dist/controls/rich-text/link-form.js +147 -0
  143. package/dist/controls/rich-text/link-form.js.map +1 -0
  144. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  145. package/dist/controls/rich-text/markdown.js.map +1 -0
  146. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  147. package/dist/controls/rich-text/ops.js.map +1 -0
  148. package/dist/controls/rich-text/plain.d.ts +17 -0
  149. package/dist/controls/rich-text/plain.js +44 -0
  150. package/dist/controls/rich-text/plain.js.map +1 -0
  151. package/dist/controls/rich-text/related.d.ts +36 -0
  152. package/dist/controls/rich-text/related.js +213 -0
  153. package/dist/controls/rich-text/related.js.map +1 -0
  154. package/dist/controls/rich-text/toc.d.ts +46 -0
  155. package/dist/controls/rich-text/toc.js +161 -0
  156. package/dist/controls/rich-text/toc.js.map +1 -0
  157. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  158. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  159. package/dist/controls/rich-text/toolbar.js.map +1 -0
  160. package/{controls → dist/controls}/scale.js +5 -5
  161. package/dist/controls/scale.js.map +1 -0
  162. package/dist/controls/slot-register.d.ts +6 -0
  163. package/{controls → dist/controls}/slot-register.js +2 -5
  164. package/dist/controls/slot-register.js.map +1 -0
  165. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  166. package/dist/controls/slot-services.js +155 -0
  167. package/dist/controls/slot-services.js.map +1 -0
  168. package/{controls → dist/controls}/slot.js +42 -24
  169. package/dist/controls/slot.js.map +1 -0
  170. package/{controls → dist/controls}/table/index.js +1 -1
  171. package/dist/controls/table/index.js.map +1 -0
  172. package/{controls → dist/controls}/table/prod.js +3 -3
  173. package/dist/controls/table/prod.js.map +1 -0
  174. package/{controls → dist/controls}/table/refs.js +13 -2
  175. package/dist/controls/table/refs.js.map +1 -0
  176. package/{controls → dist/controls}/table/stored.js +1 -1
  177. package/dist/controls/table/stored.js.map +1 -0
  178. package/{controls → dist/controls}/table/table-editor.js +51 -48
  179. package/dist/controls/table/table-editor.js.map +1 -0
  180. package/{controls → dist/controls}/table/table-link.js +3 -3
  181. package/dist/controls/table/table-link.js.map +1 -0
  182. package/{controls → dist/controls}/table/table.js +3 -3
  183. package/dist/controls/table/table.js.map +1 -0
  184. package/{controls → dist/controls}/text.d.ts +2 -2
  185. package/{controls → dist/controls}/text.js +78 -43
  186. package/dist/controls/text.js.map +1 -0
  187. package/dist/controls/unknown-value.d.ts +17 -0
  188. package/dist/controls/unknown-value.js +66 -0
  189. package/dist/controls/unknown-value.js.map +1 -0
  190. package/dist/core/core.d.ts +70 -0
  191. package/dist/core/core.js +187 -0
  192. package/dist/core/core.js.map +1 -0
  193. package/dist/core/facets.d.ts +355 -0
  194. package/dist/core/facets.js +342 -0
  195. package/dist/core/facets.js.map +1 -0
  196. package/dist/core/index.d.ts +3 -0
  197. package/dist/core/index.js +3 -0
  198. package/{engine → dist/engine}/array.js +34 -21
  199. package/dist/engine/array.js.map +1 -0
  200. package/{engine → dist/engine}/bits.js +1 -1
  201. package/dist/engine/bits.js.map +1 -0
  202. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  203. package/{engine → dist/engine}/breadcrumb.js +12 -36
  204. package/dist/engine/breadcrumb.js.map +1 -0
  205. package/{engine → dist/engine}/expand.d.ts +2 -4
  206. package/{engine → dist/engine}/expand.js +5 -22
  207. package/dist/engine/expand.js.map +1 -0
  208. package/{engine → dist/engine}/field-list.js +1 -1
  209. package/dist/engine/field-list.js.map +1 -0
  210. package/{engine → dist/engine}/field-shell.js +249 -121
  211. package/dist/engine/field-shell.js.map +1 -0
  212. package/{engine → dist/engine}/frame.d.ts +3 -1
  213. package/{engine → dist/engine}/frame.js +16 -14
  214. package/dist/engine/frame.js.map +1 -0
  215. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  216. package/{engine → dist/engine}/group-summary.js +7 -3
  217. package/dist/engine/group-summary.js.map +1 -0
  218. package/{engine → dist/engine}/grouping.d.ts +19 -5
  219. package/{engine → dist/engine}/grouping.js +193 -21
  220. package/dist/engine/grouping.js.map +1 -0
  221. package/{engine → dist/engine}/item-list.d.ts +11 -1
  222. package/{engine → dist/engine}/item-list.js +35 -13
  223. package/dist/engine/item-list.js.map +1 -0
  224. package/{engine → dist/engine}/kit-field.js +45 -10
  225. package/dist/engine/kit-field.js.map +1 -0
  226. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  227. package/{engine → dist/engine}/schema-form.js +182 -40
  228. package/dist/engine/schema-form.js.map +1 -0
  229. package/{engine → dist/engine}/slot.js +5 -15
  230. package/dist/engine/slot.js.map +1 -0
  231. package/dist/index.js +58 -0
  232. package/dist/index.js.map +1 -0
  233. package/{kit.css → dist/kit.css} +19 -0
  234. package/{lib → dist/lib}/cn.js +7 -4
  235. package/dist/lib/cn.js.map +1 -0
  236. package/{lib → dist/lib}/columns.js +4 -1
  237. package/dist/lib/columns.js.map +1 -0
  238. package/{lib → dist/lib}/frames.js +2 -2
  239. package/dist/lib/frames.js.map +1 -0
  240. package/dist/lib/icon-image.d.ts +10 -0
  241. package/dist/lib/icon-image.js +8 -0
  242. package/dist/lib/icon-image.js.map +1 -0
  243. package/{lib → dist/lib}/icons.js +4 -3
  244. package/dist/lib/icons.js.map +1 -0
  245. package/dist/lib/input-modality.d.ts +11 -0
  246. package/dist/lib/input-modality.js +47 -0
  247. package/dist/lib/input-modality.js.map +1 -0
  248. package/dist/lib/key-event.d.ts +11 -0
  249. package/dist/lib/key-event.js +16 -0
  250. package/dist/lib/key-event.js.map +1 -0
  251. package/{lib → dist/lib}/path.js +4 -2
  252. package/dist/lib/path.js.map +1 -0
  253. package/{lib → dist/lib}/schema.d.ts +34 -3
  254. package/{lib → dist/lib}/schema.js +110 -13
  255. package/dist/lib/schema.js.map +1 -0
  256. package/{lib → dist/lib}/utils.js +1 -1
  257. package/dist/lib/utils.js.map +1 -0
  258. package/{lib → dist/lib}/validate.d.ts +11 -1
  259. package/{lib → dist/lib}/validate.js +85 -11
  260. package/dist/lib/validate.js.map +1 -0
  261. package/dist/library/analysis.d.ts +23 -0
  262. package/dist/library/analysis.js +160 -0
  263. package/dist/library/analysis.js.map +1 -0
  264. package/dist/library/catalog.d.ts +57 -0
  265. package/dist/library/catalog.js +307 -0
  266. package/dist/library/catalog.js.map +1 -0
  267. package/dist/library/coreNotes.d.ts +8 -0
  268. package/dist/library/coreNotes.js +111 -0
  269. package/dist/library/coreNotes.js.map +1 -0
  270. package/dist/library/coverage.d.ts +40 -0
  271. package/dist/library/coverage.js +59 -0
  272. package/dist/library/coverage.js.map +1 -0
  273. package/dist/library/entries/advanced.entries.d.ts +2 -0
  274. package/dist/library/entries/advanced.entries.js +6579 -0
  275. package/dist/library/entries/advanced.entries.js.map +1 -0
  276. package/dist/library/entries/commerce.entries.d.ts +2 -0
  277. package/dist/library/entries/commerce.entries.js +4140 -0
  278. package/dist/library/entries/commerce.entries.js.map +1 -0
  279. package/dist/library/entries/company.entries.d.ts +2 -0
  280. package/dist/library/entries/company.entries.js +2731 -0
  281. package/dist/library/entries/company.entries.js.map +1 -0
  282. package/dist/library/entries/conversion.entries.d.ts +2 -0
  283. package/dist/library/entries/conversion.entries.js +3707 -0
  284. package/dist/library/entries/conversion.entries.js.map +1 -0
  285. package/dist/library/entries/data.entries.d.ts +7 -0
  286. package/dist/library/entries/data.entries.js +4613 -0
  287. package/dist/library/entries/data.entries.js.map +1 -0
  288. package/dist/library/entries/events.entries.d.ts +2 -0
  289. package/dist/library/entries/events.entries.js +3428 -0
  290. package/dist/library/entries/events.entries.js.map +1 -0
  291. package/dist/library/entries/features.entries.d.ts +2 -0
  292. package/dist/library/entries/features.entries.js +3157 -0
  293. package/dist/library/entries/features.entries.js.map +1 -0
  294. package/dist/library/entries/heroes.entries.d.ts +2 -0
  295. package/dist/library/entries/heroes.entries.js +3401 -0
  296. package/dist/library/entries/heroes.entries.js.map +1 -0
  297. package/dist/library/entries/index.d.ts +3 -0
  298. package/dist/library/entries/index.js +35 -0
  299. package/dist/library/entries/index.js.map +1 -0
  300. package/dist/library/entries/listings.entries.d.ts +2 -0
  301. package/dist/library/entries/listings.entries.js +2976 -0
  302. package/dist/library/entries/listings.entries.js.map +1 -0
  303. package/dist/library/entries/longform.entries.d.ts +2 -0
  304. package/dist/library/entries/longform.entries.js +4227 -0
  305. package/dist/library/entries/longform.entries.js.map +1 -0
  306. package/dist/library/entries/media.entries.d.ts +2 -0
  307. package/dist/library/entries/media.entries.js +2781 -0
  308. package/dist/library/entries/media.entries.js.map +1 -0
  309. package/dist/library/entries/navigation.entries.d.ts +2 -0
  310. package/dist/library/entries/navigation.entries.js +4011 -0
  311. package/dist/library/entries/navigation.entries.js.map +1 -0
  312. package/dist/library/entries/pricing.entries.d.ts +2 -0
  313. package/dist/library/entries/pricing.entries.js +2383 -0
  314. package/dist/library/entries/pricing.entries.js.map +1 -0
  315. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  316. package/dist/library/entries/social-proof.entries.js +2297 -0
  317. package/dist/library/entries/social-proof.entries.js.map +1 -0
  318. package/dist/library/examples/bento.d.ts +92 -0
  319. package/dist/library/examples/bento.js +201 -0
  320. package/dist/library/examples/bento.js.map +1 -0
  321. package/dist/library/examples/blocks.d.ts +14 -0
  322. package/dist/library/examples/blocks.js +313 -0
  323. package/dist/library/examples/blocks.js.map +1 -0
  324. package/dist/library/examples/faq.d.ts +28 -0
  325. package/dist/library/examples/faq.js +230 -0
  326. package/dist/library/examples/faq.js.map +1 -0
  327. package/dist/library/examples/hero.d.ts +43 -0
  328. package/dist/library/examples/hero.js +222 -0
  329. package/dist/library/examples/hero.js.map +1 -0
  330. package/dist/library/examples/index.d.ts +36 -0
  331. package/dist/library/examples/index.js +109 -0
  332. package/dist/library/examples/index.js.map +1 -0
  333. package/dist/library/examples/journalStory.d.ts +93 -0
  334. package/dist/library/examples/journalStory.js +338 -0
  335. package/dist/library/examples/journalStory.js.map +1 -0
  336. package/dist/library/examples/megaMenu.d.ts +134 -0
  337. package/dist/library/examples/megaMenu.js +442 -0
  338. package/dist/library/examples/megaMenu.js.map +1 -0
  339. package/dist/library/examples/pricing.d.ts +103 -0
  340. package/dist/library/examples/pricing.js +479 -0
  341. package/dist/library/examples/pricing.js.map +1 -0
  342. package/dist/library/examples/tabs.d.ts +87 -0
  343. package/dist/library/examples/tabs.js +180 -0
  344. package/dist/library/examples/tabs.js.map +1 -0
  345. package/dist/library/export.d.ts +42 -0
  346. package/dist/library/export.js +80 -0
  347. package/dist/library/export.js.map +1 -0
  348. package/dist/library/index.d.ts +13 -0
  349. package/dist/library/index.js +6 -0
  350. package/dist/library/kit-catalog.json +1511 -0
  351. package/dist/library/types.d.ts +42 -0
  352. package/dist/library/types.js +0 -0
  353. package/{schema → dist/schema}/adapters.js +1 -2
  354. package/dist/schema/adapters.js.map +1 -0
  355. package/{schema → dist/schema}/help.d.ts +2 -0
  356. package/{schema → dist/schema}/help.js +6 -4
  357. package/dist/schema/help.js.map +1 -0
  358. package/{schema → dist/schema}/scale.js +1 -1
  359. package/dist/schema/scale.js.map +1 -0
  360. package/{schema → dist/schema}/sources.js +1 -1
  361. package/dist/schema/sources.js.map +1 -0
  362. package/{schema → dist/schema}/table.js +11 -10
  363. package/dist/schema/table.js.map +1 -0
  364. package/{schema → dist/schema}/types.d.ts +36 -1
  365. package/{schema → dist/schema}/types.js +1 -1
  366. package/dist/schema/types.js.map +1 -0
  367. package/dist/styles.css +2 -0
  368. package/dist/table/table-view.d.ts +14 -0
  369. package/dist/table/table-view.js +140 -0
  370. package/dist/table/table-view.js.map +1 -0
  371. package/dist/table/table.css +73 -0
  372. package/dist/testing/corpus.d.ts +63 -0
  373. package/dist/testing/corpus.js +129 -0
  374. package/dist/testing/corpus.js.map +1 -0
  375. package/dist/testing/test-form.d.ts +11 -0
  376. package/dist/testing/test-form.js +38 -0
  377. package/dist/testing/test-form.js.map +1 -0
  378. package/dist/theme.css +345 -0
  379. package/dist/theme.d.ts +22 -0
  380. package/dist/theme.js +43 -0
  381. package/dist/theme.js.map +1 -0
  382. package/dist/tokens.css +542 -0
  383. package/dist/types.js +0 -0
  384. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  385. package/{ui → dist/ui}/action-tray.js +20 -19
  386. package/dist/ui/action-tray.js.map +1 -0
  387. package/dist/ui/autocomplete.d.ts +58 -0
  388. package/dist/ui/autocomplete.js +194 -0
  389. package/dist/ui/autocomplete.js.map +1 -0
  390. package/{ui → dist/ui}/button.d.ts +3 -3
  391. package/{ui → dist/ui}/button.js +8 -11
  392. package/dist/ui/button.js.map +1 -0
  393. package/{ui → dist/ui}/choice-switch.js +1 -1
  394. package/dist/ui/choice-switch.js.map +1 -0
  395. package/{ui → dist/ui}/controls.js +51 -39
  396. package/dist/ui/controls.js.map +1 -0
  397. package/{ui → dist/ui}/display.d.ts +10 -3
  398. package/{ui → dist/ui}/display.js +57 -46
  399. package/dist/ui/display.js.map +1 -0
  400. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  401. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  402. package/dist/ui/expanded-editor-modal.js.map +1 -0
  403. package/{ui → dist/ui}/field-context.js +1 -1
  404. package/dist/ui/field-context.js.map +1 -0
  405. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  406. package/{ui → dist/ui}/floating-panel.js +28 -12
  407. package/dist/ui/floating-panel.js.map +1 -0
  408. package/{ui → dist/ui}/index.d.ts +4 -0
  409. package/dist/ui/index.js +18 -0
  410. package/{ui → dist/ui}/input.d.ts +1 -1
  411. package/{ui → dist/ui}/input.js +9 -9
  412. package/dist/ui/input.js.map +1 -0
  413. package/{ui → dist/ui}/mode-bar.js +3 -3
  414. package/dist/ui/mode-bar.js.map +1 -0
  415. package/{ui → dist/ui}/overlay.d.ts +77 -5
  416. package/dist/ui/overlay.js +697 -0
  417. package/dist/ui/overlay.js.map +1 -0
  418. package/{ui → dist/ui}/path-crumbs.js +37 -3
  419. package/dist/ui/path-crumbs.js.map +1 -0
  420. package/{ui → dist/ui}/presence.js +2 -2
  421. package/dist/ui/presence.js.map +1 -0
  422. package/{ui → dist/ui}/select.js +89 -87
  423. package/dist/ui/select.js.map +1 -0
  424. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  425. package/dist/ui/shortcut-hint.js.map +1 -0
  426. package/dist/ui/spinner.d.ts +24 -0
  427. package/dist/ui/spinner.js +42 -0
  428. package/dist/ui/spinner.js.map +1 -0
  429. package/dist/ui/split-button.d.ts +32 -0
  430. package/dist/ui/split-button.js +60 -0
  431. package/dist/ui/split-button.js.map +1 -0
  432. package/{ui → dist/ui}/surfaces.js +1 -1
  433. package/dist/ui/surfaces.js.map +1 -0
  434. package/dist/ui/tab.d.ts +38 -0
  435. package/dist/ui/tab.js +87 -0
  436. package/dist/ui/tab.js.map +1 -0
  437. package/dist/ui/toast.d.ts +20 -0
  438. package/dist/ui/toast.js +115 -0
  439. package/dist/ui/toast.js.map +1 -0
  440. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  441. package/{ui → dist/ui}/tooltip-root.js +9 -8
  442. package/dist/ui/tooltip-root.js.map +1 -0
  443. package/{ui → dist/ui}/variants.js +1 -1
  444. package/dist/ui/variants.js.map +1 -0
  445. package/package.json +83 -23
  446. package/adapters/icons.js.map +0 -1
  447. package/adapters/lossy.js +0 -233
  448. package/adapters/lossy.js.map +0 -1
  449. package/adapters/prod-types.js.map +0 -1
  450. package/adapters/schema.js.map +0 -1
  451. package/adapters/values.js.map +0 -1
  452. package/brand/logo.js +0 -9
  453. package/brand/logo.js.map +0 -1
  454. package/context.js.map +0 -1
  455. package/controls/button.js.map +0 -1
  456. package/controls/c1.js.map +0 -1
  457. package/controls/c2.js.map +0 -1
  458. package/controls/choice.js.map +0 -1
  459. package/controls/code-register.js.map +0 -1
  460. package/controls/code.js.map +0 -1
  461. package/controls/color.js.map +0 -1
  462. package/controls/date-register.js.map +0 -1
  463. package/controls/date-zone.js.map +0 -1
  464. package/controls/date.js.map +0 -1
  465. package/controls/form-picker-register.d.ts +0 -1
  466. package/controls/form-picker-register.js.map +0 -1
  467. package/controls/form-picker.js.map +0 -1
  468. package/controls/icon-register.js.map +0 -1
  469. package/controls/icon.js.map +0 -1
  470. package/controls/index.js.map +0 -1
  471. package/controls/json-register.js.map +0 -1
  472. package/controls/json.js.map +0 -1
  473. package/controls/link.js.map +0 -1
  474. package/controls/location-register.js.map +0 -1
  475. package/controls/location.js.map +0 -1
  476. package/controls/media-register.js.map +0 -1
  477. package/controls/media.js.map +0 -1
  478. package/controls/number.js.map +0 -1
  479. package/controls/reference-register.js.map +0 -1
  480. package/controls/reference.js.map +0 -1
  481. package/controls/rich-text/blocks.d.ts +0 -28
  482. package/controls/rich-text/blocks.js.map +0 -1
  483. package/controls/rich-text/catalog.js.map +0 -1
  484. package/controls/rich-text/codec.js.map +0 -1
  485. package/controls/rich-text/component-card.js.map +0 -1
  486. package/controls/rich-text/control.js.map +0 -1
  487. package/controls/rich-text/dom.js.map +0 -1
  488. package/controls/rich-text/editor.js.map +0 -1
  489. package/controls/rich-text/floating.js.map +0 -1
  490. package/controls/rich-text/index.js.map +0 -1
  491. package/controls/rich-text/link-form.js +0 -111
  492. package/controls/rich-text/link-form.js.map +0 -1
  493. package/controls/rich-text/markdown.js.map +0 -1
  494. package/controls/rich-text/ops.js.map +0 -1
  495. package/controls/rich-text/toolbar.js.map +0 -1
  496. package/controls/scale.js.map +0 -1
  497. package/controls/slot-register.d.ts +0 -1
  498. package/controls/slot-register.js.map +0 -1
  499. package/controls/slot-services.js +0 -38
  500. package/controls/slot-services.js.map +0 -1
  501. package/controls/slot.js.map +0 -1
  502. package/controls/table/index.js.map +0 -1
  503. package/controls/table/prod.js.map +0 -1
  504. package/controls/table/refs.js.map +0 -1
  505. package/controls/table/stored.js.map +0 -1
  506. package/controls/table/table-editor.js.map +0 -1
  507. package/controls/table/table-link.js.map +0 -1
  508. package/controls/table/table.js.map +0 -1
  509. package/controls/text.js.map +0 -1
  510. package/engine/array.js.map +0 -1
  511. package/engine/bits.js.map +0 -1
  512. package/engine/breadcrumb.js.map +0 -1
  513. package/engine/expand.js.map +0 -1
  514. package/engine/field-list.js.map +0 -1
  515. package/engine/field-shell.js.map +0 -1
  516. package/engine/frame.js.map +0 -1
  517. package/engine/group-summary.js.map +0 -1
  518. package/engine/grouping.js.map +0 -1
  519. package/engine/item-list.js.map +0 -1
  520. package/engine/kit-field.js.map +0 -1
  521. package/engine/schema-form.js.map +0 -1
  522. package/engine/slot.js.map +0 -1
  523. package/index.js +0 -55
  524. package/index.js.map +0 -1
  525. package/lib/cn.js.map +0 -1
  526. package/lib/columns.js.map +0 -1
  527. package/lib/frames.js.map +0 -1
  528. package/lib/icons.js.map +0 -1
  529. package/lib/path.js.map +0 -1
  530. package/lib/schema.js.map +0 -1
  531. package/lib/utils.js.map +0 -1
  532. package/lib/validate.js.map +0 -1
  533. package/schema/adapters.js.map +0 -1
  534. package/schema/help.js.map +0 -1
  535. package/schema/scale.js.map +0 -1
  536. package/schema/sources.js.map +0 -1
  537. package/schema/table.js.map +0 -1
  538. package/schema/types.js.map +0 -1
  539. package/ui/action-tray.js.map +0 -1
  540. package/ui/button.js.map +0 -1
  541. package/ui/choice-switch.js.map +0 -1
  542. package/ui/controls.js.map +0 -1
  543. package/ui/display.js.map +0 -1
  544. package/ui/expanded-editor-modal.js.map +0 -1
  545. package/ui/field-context.js.map +0 -1
  546. package/ui/floating-panel.js.map +0 -1
  547. package/ui/index.js +0 -13
  548. package/ui/input.js.map +0 -1
  549. package/ui/mode-bar.js.map +0 -1
  550. package/ui/overlay.js +0 -378
  551. package/ui/overlay.js.map +0 -1
  552. package/ui/path-crumbs.js.map +0 -1
  553. package/ui/presence.js.map +0 -1
  554. package/ui/select.js.map +0 -1
  555. package/ui/shortcut-hint.js.map +0 -1
  556. package/ui/surfaces.js.map +0 -1
  557. package/ui/tooltip-root.js.map +0 -1
  558. package/ui/variants.js.map +0 -1
  559. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  560. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  561. /package/{brand → dist/brand}/logo.d.ts +0 -0
  562. /package/{controls → dist/controls}/c1.d.ts +0 -0
  563. /package/{controls → dist/controls}/c2.d.ts +0 -0
  564. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  565. /package/{controls → dist/controls}/code.d.ts +0 -0
  566. /package/{controls → dist/controls}/color.d.ts +0 -0
  567. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  568. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  569. /package/{controls → dist/controls}/date.d.ts +0 -0
  570. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  571. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  572. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  573. /package/{controls → dist/controls}/json.d.ts +0 -0
  574. /package/{controls → dist/controls}/link.d.ts +0 -0
  575. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  576. /package/{controls → dist/controls}/location.d.ts +0 -0
  577. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  578. /package/{controls → dist/controls}/number.d.ts +0 -0
  579. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  580. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  581. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  582. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  583. /package/{controls → dist/controls}/scale.d.ts +0 -0
  584. /package/{controls → dist/controls}/slot.d.ts +0 -0
  585. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  586. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  587. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  588. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  589. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  590. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  591. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  592. /package/{engine → dist/engine}/array.d.ts +0 -0
  593. /package/{engine → dist/engine}/bits.d.ts +0 -0
  594. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  595. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  596. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  597. /package/{engine → dist/engine}/slot.d.ts +0 -0
  598. /package/{index.d.ts → dist/index.d.ts} +0 -0
  599. /package/{lib → dist/lib}/cn.d.ts +0 -0
  600. /package/{lib → dist/lib}/columns.d.ts +0 -0
  601. /package/{lib → dist/lib}/frames.d.ts +0 -0
  602. /package/{lib → dist/lib}/icons.d.ts +0 -0
  603. /package/{lib → dist/lib}/path.d.ts +0 -0
  604. /package/{lib → dist/lib}/utils.d.ts +0 -0
  605. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  606. /package/{schema → dist/schema}/scale.d.ts +0 -0
  607. /package/{schema → dist/schema}/sources.d.ts +0 -0
  608. /package/{schema → dist/schema}/table.d.ts +0 -0
  609. /package/{types.d.ts → dist/types.d.ts} +0 -0
  610. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  611. /package/{ui → dist/ui}/controls.d.ts +0 -0
  612. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  613. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  614. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  615. /package/{ui → dist/ui}/presence.d.ts +0 -0
  616. /package/{ui → dist/ui}/select.d.ts +0 -0
  617. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  618. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  619. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand.js","names":[],"sources":["../../src/engine/expand.tsx"],"sourcesContent":["/**\n * Expanded editing (CPO D49), owned by the engine: rich text, code and tables open in the ONE shared\n * ExpandedEditorModal (ui/expanded-editor-modal.tsx). V2 did this per control (RichTextControl + RichTextExpandAction,\n * TableControl + TableFullScreenAction); the engine opens the modal around WHATEVER control the field has: the kit\n * control from CONTROLS, or the host's when a control hands a stored value off (LegacyFallback). The modal body is that same control on the same value and the same onChange, so the field underneath\n * and the expanded one stay in sync and every write keeps the exact stored shape the inline control writes.\n *\n * Ways in (V2): the ⤢ button in the field's label row (shown on hover, always on touch), and ⌘↵ / Ctrl+↵ while the\n * field's control has focus. Inside the modal ⌘↵ or Esc closes it (menus and popovers inside close first) and focus\n * returns to whatever opened it. A control lane may open or close it from its own toolbar with `openExpanded`.\n *\n * Offered only where expanding edits something: never read-only, never a type whose control behind it cannot edit\n * (code and tables expand only once a kit control is registered for them; the host draws those read-only today).\n */\nimport * as React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { IconArrowsMaximize } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { resolveFrames } from \"../lib/frames\";\nimport { isObj, pathKey } from \"../lib/path\";\nimport type { FieldPath, FieldSchema, SchemaType } from \"../schema/types\";\nimport type { ControlProps } from \"../types\";\nimport { useForm, useKitEnv } from \"../context\";\nimport { Tooltip } from \"../ui/overlay\";\nimport { ExpandedEditorModal } from \"../ui/expanded-editor-modal\";\n\nexport interface ExpandSpec {\n /** \"reading\" centres a ~720px writing column; \"wide\" uses the whole dialog (tables, code) */\n layout: \"reading\" | \"wide\";\n /** the header's quiet meta line for this value (\"12 lines\", \"6 rows · 4 columns\") */\n meta?: (value: unknown) => string;\n /** the label-row button's name and tooltip */\n label: \"Expand editor\" | \"Edit in full screen\";\n /** V2: the document variant already draws the full editor in its column, so writing types offer no ⤢ there */\n panelOnly?: boolean;\n /** expanding needs a kit control: the host's control for this type cannot edit it (read-only card) */\n needsKitControl?: boolean;\n}\n\nconst count = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\nfunction codeLines(v: unknown) {\n const src = typeof v === \"string\" ? v : isObj(v) && typeof v.code === \"string\" ? v.code : \"\";\n return count(src ? src.split(\"\\n\").length : 0, \"line\");\n}\nfunction tableSize(v: unknown) {\n const rows = isObj(v) && Array.isArray(v.rows) ? v.rows.length : 0;\n const cols = isObj(v) && Array.isArray(v.columns) ? v.columns.length : 0;\n return `${count(rows, \"row\")} · ${count(cols, \"column\")}`;\n}\n\n/** Type → how it expands. Additive like CONTROLS: one entry per type. Plain long text (`text`) has none: V2's\n * TextControl is a bare textarea that grows to its value, so an extra ⤢ would only add a tab stop V2 lacks. */\nexport const EXPANDABLE: Partial<Record<SchemaType, ExpandSpec>> = {\n richtext: { layout: \"reading\", label: \"Expand editor\", panelOnly: true },\n code: { layout: \"wide\", meta: codeLines, label: \"Expand editor\", needsKitControl: true },\n table: { layout: \"wide\", meta: tableSize, label: \"Edit in full screen\", needsKitControl: true },\n};\n\n/** The spec when this field can expand here, else null. */\nexport function expandSpecFor(field: FieldSchema, opts: { readOnly: boolean; hasKitControl: boolean; variant: string }): ExpandSpec | null {\n const spec = EXPANDABLE[field.type];\n if (!spec || opts.readOnly) return null;\n if (spec.needsKitControl && !opts.hasKitControl) return null;\n if (spec.panelOnly && opts.variant === \"document\") return null;\n return spec;\n}\n\n/* ── which field (docId:pathKey) has its expanded editor open: one at a time, shared with toolbar buttons ── */\nlet openKey: string | null = null;\nconst subs = new Set<() => void>();\nexport function openExpanded(key: string | null) {\n if (openKey === key) return;\n openKey = key;\n subs.forEach((s) => s());\n}\nexport const expandKey = (docId: string, path: FieldPath) => `${docId}:${pathKey(path)}`;\nexport function useExpandedKey() {\n return React.useSyncExternalStore(\n (cb) => {\n subs.add(cb);\n return () => subs.delete(cb);\n },\n () => openKey,\n () => openKey,\n );\n}\n\n/** ⌘↵ / Ctrl+↵ (no Shift or Alt): the expand shortcut. */\nexport const isExpandShortcut = (e: React.KeyboardEvent | KeyboardEvent) => e.key === \"Enter\" && (e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey;\n\n/** The label-row ⤢ (V2 RichTextExpandAction / TableFullScreenButton): hidden at rest until hover, always on touch. */\nexport function ExpandAction({ field, path, spec }: { field: FieldSchema; path: FieldPath; spec: ExpandSpec }) {\n const env = useKitEnv();\n const wide = spec.label === \"Edit in full screen\";\n return (\n <Tooltip content={spec.label} shortcut=\"⌘↵\">\n <button\n type=\"button\"\n aria-label={wide ? `Edit ${field.title} in full screen` : `Expand ${field.title}`}\n aria-haspopup=\"dialog\"\n data-kit-expand=\"\"\n onClick={() => openExpanded(expandKey(env.docId, path))}\n className={cn(\n \"-my-0.5 inline-flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 outline-none hover:bg-kit-hover hover:text-kit-fg\",\n \"focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid]\",\n // V2: quiet at rest (hover / touch shows it). Keyboard focus keeps it visible, so Tab never lands on nothing.\n \"opacity-0 group-hover/field:opacity-100 focus-visible:opacity-100 [@media(pointer:coarse)]:opacity-100\",\n )}\n >\n <IconArrowsMaximize aria-hidden className=\"size-3.5\" stroke={1.5} />\n </button>\n </Tooltip>\n );\n}\n\n/** The modal's breadcrumb: the document, the frames down to this field's parent, then the field. */\nfunction useCrumbs(field: FieldSchema, path: FieldPath): string[] {\n const form = useForm();\n const env = useKitEnv();\n if (!form) return [env.docTitle, field.title].filter(Boolean) as string[];\n const { frames } = resolveFrames(form.schema, form.value, path.slice(0, -1), form.resolveSchema);\n const titles = frames.filter((f) => f.kind !== \"history\").map((f, i) => (i === 0 ? env.docTitle || f.title : f.title));\n return [...titles, field.title].filter(Boolean);\n}\n\n/**\n * The field's expanded editor: the same control, value and onChange in the modal. Mounted only while open, so the\n * inline control and this one never fight over the same DOM id (the modal one gets `${id}-expanded`).\n */\nexport function ExpandedField({\n field,\n path,\n spec,\n Control,\n value,\n onChange,\n onBlur,\n invalid,\n id,\n parent,\n}: {\n field: FieldSchema;\n path: FieldPath;\n spec: ExpandSpec;\n Control: ComponentType<ControlProps>;\n value: unknown;\n onChange: (v: unknown) => void;\n onBlur?: () => void;\n invalid?: boolean;\n id: string;\n parent?: Record<string, unknown>;\n}) {\n const env = useKitEnv();\n const key = expandKey(env.docId, path);\n const open = useExpandedKey() === key;\n const crumbs = useCrumbs(field, path);\n // close when this field goes away (block deselected, drilled elsewhere, schema changed)\n React.useEffect(\n () => () => {\n if (openKey === key) openExpanded(null);\n },\n [key],\n );\n return (\n <ExpandedEditorModal\n open={open}\n onOpenChange={(o) => openExpanded(o ? key : null)}\n crumbs={crumbs}\n meta={spec.meta?.(value)}\n layout={spec.layout}\n returnFocus={() =>\n document.querySelector<HTMLElement>(`[data-field-key=\"${CSS.escape(pathKey(path))}\"] [data-kit-expand]`) ??\n document.getElementById(id)\n }\n >\n {open ? (\n <div\n data-kit-expanded={field.type}\n className={cn(\"min-w-0\", spec.layout === \"wide\" && \"flex min-h-0 flex-1 flex-col\")}\n onBlur={onBlur}\n onKeyDown={(e) => {\n if (!isExpandShortcut(e)) return;\n e.preventDefault();\n openExpanded(null);\n }}\n >\n <Control field={field} value={value} onChange={onChange} id={`${id}-expanded`} invalid={invalid} path={path} parent={parent} onBlur={onBlur} />\n </div>\n ) : null}\n </ExpandedEditorModal>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { FieldList as FieldList$1 } from "./grouping.js";
2
2
  import { KitField } from "./kit-field.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
- //#region src/kit/engine/field-list.tsx
4
+ //#region src/engine/field-list.tsx
5
5
  var renderKitField = (field, path, parent) => /* @__PURE__ */ jsx(KitField, {
6
6
  field,
7
7
  path,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-list.js","names":[],"sources":["../../src/engine/field-list.tsx"],"sourcesContent":["/**\n * FieldList — lays out one frame's fields (CPO D45 grouping; V2 HEAD 9829bf1 kit/engine/field-list.tsx): group TABS\n * (with error dots) at the top of the frame only, FIELDSETS as <FieldSection>, breakpoint objects as ONE\n * <BreakpointGroup>, an auto \"Advanced\" section, and `hidden` conditions that appear / disappear with a height animation.\n *\n * The layout itself lives in grouping.tsx (`FieldList` there takes `renderField`, so grouping never imports KitField).\n * This module is V2's FieldList as the rest of the engine uses it: the same props, each field drawn by KitField — which\n * is where an object too big to inset becomes its drill row (NavRow), an array its rows, a slot its blocks.\n * Frames (frame.tsx `FrameSlots.FieldList`), expanded array rows and popovers render this.\n */\nimport type { FieldGroup, FieldPath, FieldSchema, Fieldset } from \"../schema/types\";\nimport { FieldList as GroupedFieldList, type RenderField } from \"./grouping\";\nimport { KitField } from \"./kit-field\";\n\nexport interface FieldListProps {\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n basePath: FieldPath;\n /** where to remember the selected tab / open fieldsets */\n memoryKey: string;\n}\n\nconst renderKitField: RenderField = (field, path, parent) => <KitField field={field} path={path} parent={parent} />;\n\nexport function FieldList(props: FieldListProps) {\n return <GroupedFieldList {...props} renderField={renderKitField} />;\n}\n"],"mappings":";;;;AAuBA,IAAM,kBAA+B,OAAO,MAAM,WAAW,oBAAC,UAAD;CAAiB;CAAa;CAAc;AAAS,CAAA;AAElH,SAAgB,UAAU,OAAuB;CAC/C,OAAO,oBAAC,aAAD;EAAkB,GAAI;EAAO,aAAa;CAAiB,CAAA;AACpE"}
@@ -1,22 +1,21 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { AI_PRESETS, FieldHeaderSlot, KitSectionTitle, seesDevSurfaces, useForm, useKitEnv, useKitServices } from "../context.js";
2
3
  import { pathKey, same } from "../lib/path.js";
3
- import { AI_PRESETS, FieldHeaderSlot, seesDevSurfaces, useForm, useKitEnv, useKitServices } from "../context.js";
4
4
  import { Button, Sparkle } from "../ui/button.js";
5
5
  import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverAnchor, PopoverContent, Tooltip } from "../ui/overlay.js";
6
6
  import { isTextual, plainText } from "../lib/schema.js";
7
7
  import { RowChrome } from "./bits.js";
8
8
  import { Avatar, avatarRingSpread } from "../ui/display.js";
9
- import { HelpMore } from "../ui/input.js";
10
9
  import { presenceColor } from "../ui/presence.js";
11
10
  import { HISTORY_SEGMENT } from "../schema/types.js";
12
11
  import { resolveHelp } from "../schema/help.js";
13
12
  import { textLength } from "../lib/validate.js";
14
13
  import * as React from "react";
15
- import { IconAlertCircle, IconAlertTriangle, IconArrowBackUp, IconBraces, IconClipboard, IconCopy, IconDots, IconHistory, IconMessage, IconMessagePlus, IconRefresh, IconRotate, IconWorld } from "@tabler/icons-react";
16
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
+ import { IconAlertCircle, IconAlertTriangle, IconArrowBackUp, IconBraces, IconClipboard, IconCopy, IconDots, IconHistory, IconInfoCircle, IconLock, IconMessage, IconMessagePlus, IconRefresh, IconRotate, IconWorld } from "@tabler/icons-react";
17
16
  import { AnimatePresence, motion } from "framer-motion";
18
17
  import { createPortal } from "react-dom";
19
- //#region src/kit/engine/field-shell.tsx
18
+ //#region src/engine/field-shell.tsx
20
19
  /**
21
20
  * FIELD SHELL — the one field chrome (V2 HEAD 9829bf1 kit/engine/field-shell.tsx; production FieldShell + CPO D8).
22
21
  *
@@ -99,13 +98,19 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
99
98
  const peers = env.presence[key] ?? [];
100
99
  const editor = peers.find((p) => p.status !== "viewing");
101
100
  const InPlaceComments = services.FieldComments;
102
- const canComment = !noComments && (!!env.onComment || !!InPlaceComments);
101
+ const quiet = env.fieldChrome === "quiet";
102
+ const bare = quiet || env.fieldChrome === "preview";
103
+ const canComment = !noComments && !bare && (!!env.onComment || !!InPlaceComments);
103
104
  const openCount = env.comments[key] ?? 0;
104
105
  const useStoreCount = env.onComment ? void 0 : services.useFieldCommentCount;
105
106
  const changed = !!form?.hasPublished && !same(value, form.publishedAt(path));
106
107
  const inh = form?.inherited && path.length === 1 ? form.inherited : void 0;
107
108
  const overridden = !!inh && inh.isOverridden(key);
108
- const canUndo = !!form?.canUndo(key) && !readOnly;
109
+ const reviewing = !!env.review;
110
+ const bar = env.review && env.review.count(path) > 0 ? env.review.bar(path, field) : null;
111
+ const sectionTitle = React.useContext(KitSectionTitle);
112
+ const repeatsSection = quiet && layout === "stack" && !!sectionTitle && sectionTitle.trim().toLowerCase() === field.title.trim().toLowerCase();
113
+ const canUndo = !bare && !!form?.canUndo(key) && !readOnly;
109
114
  const synced = field.synced?.from;
110
115
  const limit = field.validation?.max ?? field.validation?.recommendedMax;
111
116
  const len = textLength(value);
@@ -120,11 +125,24 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
120
125
  ]
121
126
  }) : null;
122
127
  const dense = env.helpDisplay === "tooltip";
123
- const help = resolveHelp(field);
128
+ const lockedHere = !!readOnly && !!field.access?.edit && !env.readOnly && !env.can(field.access.edit);
129
+ const help = lockedHere ? (field.lockReason?.trim() || "Set by developers").replace(/\.?$/, ".") : resolveHelp(field);
130
+ const helpNode = lockedHere ? /* @__PURE__ */ jsxs("span", {
131
+ "data-locked": "",
132
+ className: "inline-flex items-start gap-1",
133
+ children: [/* @__PURE__ */ jsx(IconLock, {
134
+ className: "mt-px size-3 shrink-0",
135
+ stroke: 1.75,
136
+ "aria-hidden": true
137
+ }), /* @__PURE__ */ jsxs("span", { children: [/* @__PURE__ */ jsx("span", {
138
+ className: "sr-only",
139
+ children: "Locked. "
140
+ }), help] })]
141
+ }) : help;
124
142
  const more = field.helpMore || void 0;
125
143
  const erroring = issue?.level === "error";
126
- const helpInline = !!help && !dense && !erroring;
127
- const tip = dense ? [help, more].filter(Boolean).join(" ") : more;
144
+ const helpInline = !!help && (!dense || lockedHere) && !erroring;
145
+ const tip = dense && !lockedHere ? [help, more].filter(Boolean).join(" ") : more;
128
146
  const helpId = `${id}-help`;
129
147
  const moreId = `${id}-more`;
130
148
  const msgId = `${id}-msg`;
@@ -140,10 +158,25 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
140
158
  if (next) el.setAttribute("aria-describedby", next);
141
159
  else el.removeAttribute("aria-describedby");
142
160
  }, [id, describedBy]);
143
- const info = tip ? /* @__PURE__ */ jsx(HelpMore, {
144
- id: moreId,
145
- label: field.title,
146
- children: tip
161
+ const info = tip ? /* @__PURE__ */ jsx(Tooltip, {
162
+ content: /* @__PURE__ */ jsx("span", {
163
+ className: "block max-w-[260px] whitespace-normal font-normal leading-4",
164
+ children: tip
165
+ }),
166
+ children: /* @__PURE__ */ jsxs("button", {
167
+ type: "button",
168
+ "aria-label": `About ${field.title}`,
169
+ className: "-my-0.5 inline-flex size-4 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 hover:text-kit-fg-2",
170
+ children: [/* @__PURE__ */ jsx(IconInfoCircle, {
171
+ className: "size-3.5",
172
+ stroke: 1.5,
173
+ "aria-hidden": true
174
+ }), /* @__PURE__ */ jsx("span", {
175
+ id: moreId,
176
+ className: "sr-only",
177
+ children: tip
178
+ })]
179
+ })
147
180
  }) : null;
148
181
  const label = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
149
182
  className: "truncate",
@@ -158,14 +191,14 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
158
191
  })] }) : null] });
159
192
  const badges = /* @__PURE__ */ jsxs(Fragment, { children: [
160
193
  overridden ? /* @__PURE__ */ jsx(Tooltip, {
161
- content: `Overrides ${inh.from}. Changes to the component no longer reach this field.`,
194
+ content: `Overrides ${inh.from}. Changes to the block no longer reach this field.`,
162
195
  children: /* @__PURE__ */ jsx("span", {
163
196
  role: "img",
164
197
  className: "size-1.5 shrink-0 rounded-full bg-kit-accent",
165
198
  "aria-label": `Overrides ${inh.from}`
166
199
  })
167
200
  }) : null,
168
- changed ? /* @__PURE__ */ jsx(Tooltip, {
201
+ changed && !reviewing ? /* @__PURE__ */ jsx(Tooltip, {
169
202
  content: "Changed since publish",
170
203
  children: /* @__PURE__ */ jsx("span", {
171
204
  role: "img",
@@ -185,7 +218,7 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
185
218
  })
186
219
  }) : null,
187
220
  field.localized ? /* @__PURE__ */ jsx(Tooltip, {
188
- content: "Translatable · English (default). Spanish and French are missing.",
221
+ content: "Translatable: this field can hold a value for each of the site's languages.",
189
222
  children: /* @__PURE__ */ jsxs("span", {
190
223
  className: "inline-flex h-4 shrink-0 items-center gap-0.5 rounded-kit-md bg-kit-muted px-1 text-kit-2xs font-medium text-kit-fg-3",
191
224
  children: [/* @__PURE__ */ jsx(IconWorld, {
@@ -238,7 +271,7 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
238
271
  }
239
272
  }) : null,
240
273
  /* @__PURE__ */ jsx(PeerStack, { peers }),
241
- /* @__PURE__ */ jsx(FieldMenu, {
274
+ bare ? null : /* @__PURE__ */ jsx(FieldMenu, {
242
275
  field,
243
276
  path,
244
277
  value,
@@ -277,7 +310,15 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
277
310
  className: "mt-px size-3.5 shrink-0",
278
311
  stroke: 1.5,
279
312
  "aria-hidden": true
280
- }), issue.message]
313
+ }), /* @__PURE__ */ jsxs("span", {
314
+ className: "min-w-0",
315
+ children: [issue.message, issue.fix && !readOnly ? /* @__PURE__ */ jsxs(Fragment, { children: [" ", /* @__PURE__ */ jsx("button", {
316
+ type: "button",
317
+ onClick: issue.fix.apply,
318
+ className: "font-medium text-kit-fg underline-offset-2 hover:underline",
319
+ children: issue.fix.label
320
+ })] }) : null]
321
+ })]
281
322
  }, issue.message) : /* @__PURE__ */ jsx("span", {})
282
323
  }), meta ? /* @__PURE__ */ jsx("span", {
283
324
  className: "flex shrink-0 items-center gap-2",
@@ -291,6 +332,162 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
291
332
  title: field.title.length > 28 ? field.title : void 0,
292
333
  children: label
293
334
  });
335
+ const body = layout === "row" ? /* @__PURE__ */ jsxs("div", {
336
+ className: cn("group/field relative flex min-w-0 flex-col gap-1.5", className),
337
+ "data-field-key": key,
338
+ "data-field": path.length === 1 ? key : void 0,
339
+ "data-slot": "kit-field",
340
+ children: [
341
+ bar,
342
+ /* @__PURE__ */ jsx(RowChrome.Provider, {
343
+ value: /* @__PURE__ */ jsxs(Fragment, { children: [
344
+ info,
345
+ badges,
346
+ accessories
347
+ ] }),
348
+ children: control
349
+ }),
350
+ message
351
+ ]
352
+ }) : layout === "card" && quiet ? /* @__PURE__ */ jsxs("div", {
353
+ className: cn("group/field relative flex flex-col gap-1", className),
354
+ "data-field-key": key,
355
+ "data-field": path.length === 1 ? key : void 0,
356
+ "data-slot": "kit-field",
357
+ children: [
358
+ bar,
359
+ /* @__PURE__ */ jsxs("div", {
360
+ "data-field-head": "",
361
+ className: "flex min-h-8 items-center gap-3",
362
+ children: [
363
+ /* @__PURE__ */ jsxs("label", {
364
+ htmlFor: id,
365
+ id: `${id}-label`,
366
+ className: "min-w-0 flex-1 cursor-pointer",
367
+ children: [/* @__PURE__ */ jsxs("span", {
368
+ className: "flex min-w-0 items-center gap-1 text-kit-sm font-medium text-kit-fg-2 transition-colors group-focus-within/field:text-kit-fg",
369
+ children: [
370
+ label,
371
+ info,
372
+ badges
373
+ ]
374
+ }), helpInline ? /* @__PURE__ */ jsx("span", {
375
+ id: helpId,
376
+ "data-slot": "field-help",
377
+ className: "mt-0.5 block text-kit-xs leading-4 text-kit-fg-3",
378
+ children: helpNode
379
+ }) : null]
380
+ }),
381
+ /* @__PURE__ */ jsx("span", {
382
+ className: "flex shrink-0 items-center gap-0.5 empty:hidden",
383
+ children: accessories
384
+ }),
385
+ /* @__PURE__ */ jsx("span", {
386
+ className: "flex shrink-0 items-center",
387
+ children: readOnly ? /* @__PURE__ */ jsx("span", {
388
+ className: "text-kit-sm text-kit-fg-2",
389
+ children: value ? "On" : "Off"
390
+ }) : control
391
+ })
392
+ ]
393
+ }),
394
+ message
395
+ ]
396
+ }) : layout === "card" ? /* @__PURE__ */ jsxs("div", {
397
+ className: cn("group/field relative flex flex-col gap-1.5", className),
398
+ "data-field-key": key,
399
+ "data-field": path.length === 1 ? key : void 0,
400
+ "data-slot": "kit-field",
401
+ children: [
402
+ bar,
403
+ /* @__PURE__ */ jsxs("div", {
404
+ "data-field-head": "",
405
+ className: cn("flex items-center gap-3 rounded-kit-lg border bg-kit-surface px-3 py-2.5 transition-colors", issue?.level === "error" ? "border-[var(--kit-field-invalid)]" : "border-kit-line hover:border-kit-line-strong"),
406
+ children: [
407
+ control,
408
+ /* @__PURE__ */ jsxs("label", {
409
+ htmlFor: id,
410
+ id: `${id}-label`,
411
+ className: "min-w-0 flex-1 cursor-pointer",
412
+ children: [/* @__PURE__ */ jsxs("span", {
413
+ className: "flex min-w-0 items-center gap-1.5 text-kit-sm font-medium text-kit-fg",
414
+ children: [
415
+ label,
416
+ info,
417
+ badges
418
+ ]
419
+ }), helpInline ? /* @__PURE__ */ jsx("span", {
420
+ id: helpId,
421
+ "data-slot": "field-help",
422
+ className: "block text-kit-xs leading-4 text-kit-fg-3",
423
+ children: helpNode
424
+ }) : null]
425
+ }),
426
+ /* @__PURE__ */ jsx("span", {
427
+ className: "shrink-0 text-kit-xs text-kit-fg-3",
428
+ children: value ? "On" : "Off"
429
+ }),
430
+ /* @__PURE__ */ jsx("span", {
431
+ className: "flex shrink-0 items-center gap-0.5 empty:hidden",
432
+ children: accessories
433
+ })
434
+ ]
435
+ }),
436
+ message
437
+ ]
438
+ }) : /* @__PURE__ */ jsxs("div", {
439
+ className: cn("group/field relative flex min-w-0 flex-col gap-1.5", className),
440
+ "data-field-key": key,
441
+ "data-field": path.length === 1 ? key : void 0,
442
+ "data-slot": "kit-field",
443
+ "data-inherited": inh && !overridden ? "" : void 0,
444
+ "data-overridden": overridden ? "" : void 0,
445
+ children: [
446
+ bar,
447
+ repeatsSection ? /* @__PURE__ */ jsx("label", {
448
+ htmlFor: id,
449
+ id: `${id}-label`,
450
+ className: "sr-only",
451
+ children: label
452
+ }) : lifted ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("label", {
453
+ htmlFor: id,
454
+ id: `${id}-label`,
455
+ className: "sr-only",
456
+ children: label
457
+ }), createPortal(/* @__PURE__ */ jsxs("span", {
458
+ className: "flex items-center gap-0.5 [&>button]:!inline-flex",
459
+ children: [
460
+ info,
461
+ badges,
462
+ counter,
463
+ accessories
464
+ ]
465
+ }), lifted)] }) : /* @__PURE__ */ jsxs("div", {
466
+ "data-slot": "field-label-row",
467
+ "data-field-head": "",
468
+ className: "flex min-h-5 min-w-0 items-center gap-1.5",
469
+ children: [
470
+ labelEl,
471
+ info,
472
+ badges,
473
+ /* @__PURE__ */ jsx("span", { className: "flex-1" }),
474
+ counter,
475
+ /* @__PURE__ */ jsx("span", {
476
+ className: "flex shrink-0 items-center gap-0.5",
477
+ children: accessories
478
+ })
479
+ ]
480
+ }),
481
+ helpInline ? /* @__PURE__ */ jsx("p", {
482
+ id: helpId,
483
+ "data-slot": "field-help",
484
+ className: "-mt-0.5 text-kit-xs leading-4 text-kit-fg-3",
485
+ children: helpNode
486
+ }) : null,
487
+ control,
488
+ message
489
+ ]
490
+ });
294
491
  return /* @__PURE__ */ jsxs(Popover, {
295
492
  open: ai,
296
493
  onOpenChange: setAi,
@@ -304,102 +501,7 @@ function FieldShell({ field, path, id, value, onChange, readOnly, issue, action,
304
501
  },
305
502
  children: [/* @__PURE__ */ jsx(PopoverAnchor, {
306
503
  className: "min-w-0",
307
- children: layout === "row" ? /* @__PURE__ */ jsxs("div", {
308
- className: cn("group/field flex min-w-0 flex-col gap-1.5", className),
309
- "data-field-key": key,
310
- "data-field": path.length === 1 ? key : void 0,
311
- "data-slot": "kit-field",
312
- children: [/* @__PURE__ */ jsx(RowChrome.Provider, {
313
- value: /* @__PURE__ */ jsxs(Fragment, { children: [
314
- info,
315
- badges,
316
- accessories
317
- ] }),
318
- children: control
319
- }), message]
320
- }) : layout === "card" ? /* @__PURE__ */ jsxs("div", {
321
- className: cn("group/field flex flex-col gap-1.5", className),
322
- "data-field-key": key,
323
- "data-field": path.length === 1 ? key : void 0,
324
- "data-slot": "kit-field",
325
- children: [/* @__PURE__ */ jsxs("div", {
326
- className: cn("flex items-center gap-3 rounded-kit-lg border bg-kit-surface px-3 py-2.5 transition-colors", issue?.level === "error" ? "border-[var(--kit-field-invalid)]" : "border-kit-line hover:border-kit-line-strong"),
327
- children: [
328
- control,
329
- /* @__PURE__ */ jsxs("label", {
330
- htmlFor: id,
331
- id: `${id}-label`,
332
- className: "min-w-0 flex-1 cursor-pointer",
333
- children: [/* @__PURE__ */ jsxs("span", {
334
- className: "flex min-w-0 items-center gap-1.5 text-kit-sm font-medium text-kit-fg",
335
- children: [
336
- label,
337
- info,
338
- badges
339
- ]
340
- }), helpInline ? /* @__PURE__ */ jsx("span", {
341
- id: helpId,
342
- "data-slot": "field-help",
343
- className: "block text-kit-xs leading-4 text-kit-fg-3",
344
- children: help
345
- }) : null]
346
- }),
347
- /* @__PURE__ */ jsx("span", {
348
- className: "shrink-0 text-kit-xs text-kit-fg-3",
349
- children: value ? "On" : "Off"
350
- }),
351
- /* @__PURE__ */ jsx("span", {
352
- className: "flex shrink-0 items-center gap-0.5 empty:hidden",
353
- children: accessories
354
- })
355
- ]
356
- }), message]
357
- }) : /* @__PURE__ */ jsxs("div", {
358
- className: cn("group/field flex min-w-0 flex-col gap-1.5", className),
359
- "data-field-key": key,
360
- "data-field": path.length === 1 ? key : void 0,
361
- "data-slot": "kit-field",
362
- "data-inherited": inh && !overridden ? "" : void 0,
363
- "data-overridden": overridden ? "" : void 0,
364
- children: [
365
- lifted ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("label", {
366
- htmlFor: id,
367
- id: `${id}-label`,
368
- className: "sr-only",
369
- children: label
370
- }), createPortal(/* @__PURE__ */ jsxs("span", {
371
- className: "flex items-center gap-0.5 [&>button]:!inline-flex",
372
- children: [
373
- info,
374
- badges,
375
- counter,
376
- accessories
377
- ]
378
- }), lifted)] }) : /* @__PURE__ */ jsxs("div", {
379
- "data-slot": "field-label-row",
380
- className: "flex min-h-5 min-w-0 items-center gap-1.5",
381
- children: [
382
- labelEl,
383
- info,
384
- badges,
385
- /* @__PURE__ */ jsx("span", { className: "flex-1" }),
386
- counter,
387
- /* @__PURE__ */ jsx("span", {
388
- className: "flex shrink-0 items-center gap-0.5",
389
- children: accessories
390
- })
391
- ]
392
- }),
393
- helpInline ? /* @__PURE__ */ jsx("p", {
394
- id: helpId,
395
- "data-slot": "field-help",
396
- className: "-mt-0.5 text-kit-xs leading-4 text-kit-fg-3",
397
- children: help
398
- }) : null,
399
- control,
400
- message
401
- ]
402
- })
504
+ children: body
403
505
  }), commentsOpen && InPlaceComments ? /* @__PURE__ */ jsx(PopoverContent, {
404
506
  align: "start",
405
507
  sideOffset: 8,
@@ -471,10 +573,10 @@ function CountedCommentButton({ count, label, open, onOpen }) {
471
573
  onClick: (e) => onOpen(e.currentTarget),
472
574
  "data-state": open ? "open" : "closed",
473
575
  "aria-label": `${count} open comments on ${label}`,
474
- className: "inline-flex h-5 items-center gap-1 rounded-full bg-[var(--kit-chip-ink-bg)] px-1.5 text-kit-2xs font-medium text-[var(--kit-chip-ink-fg)] hover:opacity-90",
576
+ className: "-my-0.5 inline-flex h-5 items-center gap-0.5 rounded-kit-md px-1 text-kit-2xs font-medium text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[state=open]:bg-kit-hover data-[state=open]:text-kit-fg",
475
577
  children: [/* @__PURE__ */ jsx(IconMessage, {
476
- className: "size-3",
477
- stroke: 2,
578
+ className: "size-3.5",
579
+ stroke: 1.5,
478
580
  "aria-hidden": true
479
581
  }), /* @__PURE__ */ jsx("span", {
480
582
  className: "tabular-nums",
@@ -567,7 +669,7 @@ function PeerStack({ peers, size = 16 }) {
567
669
  function FieldMenu({ field, path, value, onChange, readOnly, changed, onAi }) {
568
670
  const form = useForm();
569
671
  const env = useKitEnv();
570
- const { toast, aiRewrite, richText } = useKitServices();
672
+ const { toast, aiRewrite, richText, FieldMenuExtras } = useKitServices();
571
673
  const key = pathKey(path);
572
674
  const api = apiName(form?.schema.name ?? "doc", path);
573
675
  const textual = isTextual(field.type);
@@ -631,6 +733,11 @@ function FieldMenu({ field, path, value, onChange, readOnly, changed, onAi }) {
631
733
  onClick: () => form.navigate([...path, HISTORY_SEGMENT]),
632
734
  children: "History"
633
735
  }) : null,
736
+ FieldMenuExtras ? /* @__PURE__ */ jsx(FieldMenuExtras, {
737
+ field,
738
+ path,
739
+ readOnly
740
+ }) : null,
634
741
  editable && prose && aiRewrite ? /* @__PURE__ */ jsxs(Fragment, { children: [
635
742
  /* @__PURE__ */ jsx(MenuSeparator, {}),
636
743
  form?.aiKeys.has(key) ? /* @__PURE__ */ jsx(MenuItem, {
@@ -839,9 +946,23 @@ function Shimmer({ children }) {
839
946
  children
840
947
  });
841
948
  }
949
+ /**
950
+ * Reduced motion as the app reads it: the OS query or the in-app preference (which stamps `data-reduce-motion` on
951
+ * <html>; the kit cannot import the app's hook). Read per render, so a toggle applies to the next answer.
952
+ */
953
+ function motionReduced() {
954
+ if (typeof window === "undefined") return false;
955
+ return document.documentElement.hasAttribute("data-reduce-motion") || !!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
956
+ }
957
+ /** Reduced: the whole answer at once, with no caret (canvas revamp V701, lib/motion TypeOut semantics). */
842
958
  function TypeOut({ text, speed = 14 }) {
843
- const [n, setN] = React.useState(0);
959
+ const reduce = motionReduced();
960
+ const [n, setN] = React.useState(reduce ? text.length : 0);
844
961
  React.useEffect(() => {
962
+ if (reduce) {
963
+ setN(text.length);
964
+ return;
965
+ }
845
966
  setN(0);
846
967
  const id = setInterval(() => {
847
968
  setN((x) => {
@@ -851,8 +972,15 @@ function TypeOut({ text, speed = 14 }) {
851
972
  });
852
973
  }, speed);
853
974
  return () => clearInterval(id);
854
- }, [text, speed]);
855
- return /* @__PURE__ */ jsxs("span", { children: [text.slice(0, n), n < text.length ? /* @__PURE__ */ jsx("span", { className: "ml-0.5 inline-block h-[1em] w-[2px] translate-y-[2px] animate-pulse bg-kit-fg" }) : null] });
975
+ }, [
976
+ text,
977
+ speed,
978
+ reduce
979
+ ]);
980
+ return /* @__PURE__ */ jsxs("span", { children: [text.slice(0, n), n < text.length ? /* @__PURE__ */ jsx("span", {
981
+ "data-typeout-caret": true,
982
+ className: "ml-0.5 inline-block h-[1em] w-[2px] translate-y-[2px] bg-kit-fg motion-safe:animate-pulse"
983
+ }) : null] });
856
984
  }
857
985
  //#endregion
858
986
  export { FieldShell, LABEL_HINT_AT, PeerStack, apiName, resetFieldClipboard };