@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
@@ -5,9 +5,9 @@ import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, Popov
5
5
  import { Avatar } from "../ui/display.js";
6
6
  import { useDragReorder } from "../engine/item-list.js";
7
7
  import * as React from "react";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
9
  import { IconArrowUpRight, IconCheck, IconChevronDown, IconDatabase, IconDots, IconFileDatabase, IconFileText, IconForms, IconPlus, IconReplace, IconSearch, IconShoppingBag, IconTrash, IconX } from "@tabler/icons-react";
9
- import { jsx, jsxs } from "react/jsx-runtime";
10
- //#region src/kit/controls/reference.tsx
10
+ //#region src/controls/reference.tsx
11
11
  /**
12
12
  * REFERENCE — single: a select-like trigger ("Select a CMS item") → a 300px search popover with "None", result rows,
13
13
  * drafts labelled, and "Create new" inline when the host can create. Never lists the document being edited. No one-click
@@ -23,7 +23,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
23
23
  * multi list one compact "n missing" chip with Remove (DESIGN 9.6's production rule), instead of disappearing; chips sort with the engine's `useDragReorder`
24
24
  * (@dnd-kit is not on the kit allow-list).
25
25
  */
26
- var NON_ENTRY = new Set([
26
+ var NON_ENTRY = /* @__PURE__ */ new Set([
27
27
  "page",
28
28
  "form",
29
29
  "collection",
@@ -51,12 +51,21 @@ var KIND_ICON = {
51
51
  shopify: IconShoppingBag
52
52
  };
53
53
  function RefThumb({ o, size = 28 }) {
54
- if (o?.photo) return /* @__PURE__ */ jsx(Avatar, {
54
+ if (o?.avatar || o?.photo) return /* @__PURE__ */ jsx(Avatar, {
55
55
  name: o.title,
56
- src: o.photo,
56
+ src: o.photo ?? void 0,
57
57
  size,
58
58
  decorative: true
59
59
  });
60
+ if (o?.cover) return /* @__PURE__ */ jsx("img", {
61
+ src: o.cover,
62
+ alt: "",
63
+ style: {
64
+ width: size,
65
+ height: size
66
+ },
67
+ className: "shrink-0 rounded-kit-md border border-kit-line object-cover"
68
+ });
60
69
  const Icon = o ? KIND_ICON[o.kind] : IconFileDatabase;
61
70
  return /* @__PURE__ */ jsx("span", {
62
71
  "aria-hidden": true,
@@ -108,7 +117,7 @@ function useReferenceRecords(ids, to) {
108
117
  ...k,
109
118
  ...Object.fromEntries(rows.map((r) => [r.id, r]))
110
119
  }));
111
- setMissing((m) => new Set([...m, ...asked.filter((x) => !found.has(x))]));
120
+ setMissing((m) => /* @__PURE__ */ new Set([...m, ...asked.filter((x) => !found.has(x))]));
112
121
  setError(null);
113
122
  }).catch((e) => alive.current && setError(`The saved ${plural(referenceNoun(to))} could not be read: ${reasonOf(e)}`)).finally(() => {
114
123
  for (const x of asked) inflight.current.delete(x);
@@ -261,31 +270,35 @@ function PickerBody({ to, filter, selected, multi, max, noun, onPick, onNone, ca
261
270
  "aria-multiselectable": multi || void 0,
262
271
  "aria-busy": loading || void 0,
263
272
  children: [
264
- none ? /* @__PURE__ */ jsx("div", {
273
+ none ? /* @__PURE__ */ jsx("button", {
274
+ type: "button",
265
275
  id: optionId(0),
266
276
  role: "option",
267
277
  "aria-selected": false,
278
+ tabIndex: -1,
268
279
  onMouseEnter: () => setActive(0),
269
280
  onMouseDown: (e) => e.preventDefault(),
270
281
  onClick: onNone,
271
- className: cn("flex h-8 w-full cursor-pointer items-center gap-2 rounded-kit-md px-2 text-left text-kit-sm text-kit-fg-3", active === 0 && "bg-kit-hover"),
282
+ className: cn("flex h-8 w-full items-center gap-2 rounded-kit-md px-2 text-left text-kit-sm text-kit-fg-3 hover:bg-kit-hover", active === 0 && "bg-kit-hover"),
272
283
  children: "None"
273
284
  }) : null,
274
285
  rows.map((o, j) => {
275
286
  const i = j + (none ? 1 : 0);
276
287
  const on = selected.includes(o.id);
277
- return /* @__PURE__ */ jsxs("div", {
288
+ return /* @__PURE__ */ jsxs("button", {
289
+ type: "button",
278
290
  id: optionId(i),
279
291
  role: "option",
280
292
  "aria-selected": on,
293
+ tabIndex: -1,
281
294
  onMouseEnter: () => setActive(i),
282
295
  onMouseDown: (e) => e.preventDefault(),
283
296
  onClick: () => onPick(o),
284
- className: cn("flex w-full cursor-pointer items-center gap-2.5 rounded-kit-md p-1.5 text-left", i === active && "bg-kit-hover"),
297
+ className: cn("flex w-full items-center gap-2.5 rounded-kit-md p-1.5 text-left", i === active && "bg-kit-hover"),
285
298
  children: [
286
299
  multi ? /* @__PURE__ */ jsx("span", {
287
300
  "aria-hidden": true,
288
- className: cn("flex size-4 shrink-0 items-center justify-center rounded-kit-sm border", on ? "border-kit-accent bg-kit-accent text-kit-accent-on" : "border-kit-line-strong", !on && full && "opacity-40"),
301
+ className: cn("flex size-4 shrink-0 items-center justify-center rounded-kit-md border", on ? "border-kit-accent bg-kit-accent text-kit-accent-on" : "border-kit-line-strong", !on && full && "opacity-40"),
289
302
  children: on ? /* @__PURE__ */ jsx(IconCheck, {
290
303
  className: "size-3",
291
304
  stroke: 3
@@ -354,37 +367,34 @@ function PickerBody({ to, filter, selected, multi, max, noun, onPick, onNone, ca
354
367
  }) : null,
355
368
  canCreate ? /* @__PURE__ */ jsx("div", {
356
369
  className: "border-t border-kit-line p-1.5",
357
- children: creating ? /* @__PURE__ */ jsxs("form", {
358
- className: "flex flex-col gap-1.5",
370
+ children: creating ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("form", {
371
+ className: "flex items-center gap-1.5",
359
372
  onSubmit: (e) => {
360
373
  e.preventDefault();
361
374
  e.stopPropagation();
362
375
  const t = String(new FormData(e.currentTarget).get("t") ?? "").trim();
363
376
  if (t) create(t);
364
377
  },
365
- children: [/* @__PURE__ */ jsxs("div", {
366
- className: "flex items-center gap-1.5",
367
- children: [/* @__PURE__ */ jsx("input", {
368
- name: "t",
369
- autoFocus: true,
370
- defaultValue: q,
371
- "aria-label": `New ${noun} name`,
372
- placeholder: `New ${noun} name`,
373
- className: "h-8 min-w-0 flex-1 rounded-kit-md border border-kit-field-border bg-kit-field-bg px-2 text-kit-sm text-kit-fg outline-none hover:border-kit-field-border-hover focus:border-kit-field-border-focus"
374
- }), /* @__PURE__ */ jsx(Button, {
375
- size: "sm",
376
- type: "submit",
377
- variant: "primary",
378
- loading: createBusy,
379
- disabled: createBusy,
380
- children: "Create"
381
- })]
382
- }), createError ? /* @__PURE__ */ jsx("p", {
383
- role: "alert",
384
- className: "px-1 text-kit-xs text-kit-danger-fg",
385
- children: createError
386
- }) : null]
387
- }) : /* @__PURE__ */ jsxs("button", {
378
+ children: [/* @__PURE__ */ jsx("input", {
379
+ name: "t",
380
+ autoFocus: true,
381
+ defaultValue: q,
382
+ "aria-label": `New ${noun} name`,
383
+ placeholder: `New ${noun} name`,
384
+ className: "h-8 min-w-0 flex-1 rounded-kit-md border border-kit-line-strong bg-kit-field-bg px-2 text-kit-sm text-kit-fg outline-none focus:bg-kit-field-bg focus:ring-1 focus:ring-kit-line-strong"
385
+ }), /* @__PURE__ */ jsx(Button, {
386
+ size: "sm",
387
+ type: "submit",
388
+ variant: "primary",
389
+ loading: createBusy,
390
+ disabled: createBusy,
391
+ children: "Create"
392
+ })]
393
+ }), createError ? /* @__PURE__ */ jsx("p", {
394
+ role: "alert",
395
+ className: "mt-1.5 px-1 text-kit-xs text-kit-danger-fg",
396
+ children: createError
397
+ }) : null] }) : /* @__PURE__ */ jsxs("button", {
388
398
  type: "button",
389
399
  onClick: () => setCreating(true),
390
400
  className: "flex h-8 w-full items-center gap-2 rounded-kit-md px-2 text-left text-kit-sm text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg",
@@ -479,12 +489,12 @@ function ReferenceControl({ field, value, onChange, readOnly, id }) {
479
489
  onOpenChange: setOpen,
480
490
  children: [/* @__PURE__ */ jsxs("div", {
481
491
  "data-slot": "kit-reference-card",
482
- className: "flex items-center gap-2.5 rounded-kit-lg border border-kit-line bg-kit-control-bg p-1.5 pr-1 transition-colors hover:border-kit-line-strong",
492
+ className: "group/ref flex items-center gap-2.5 rounded-kit-lg border border-kit-line bg-kit-control-bg p-1.5 pr-1 transition-colors hover:border-kit-line-strong",
483
493
  children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
484
494
  id,
485
495
  disabled: !editable,
486
496
  "aria-label": `${field.title}: ${title}.${editable ? " Change" : ""}`,
487
- className: "flex min-w-0 flex-1 items-center gap-2.5 rounded-kit-md text-left outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid] disabled:cursor-default [html[data-input-modality=pointer]_&]:focus-visible:outline-none",
497
+ className: "flex min-w-0 flex-1 items-center gap-2.5 text-left",
488
498
  children: [
489
499
  /* @__PURE__ */ jsx(RefThumb, {
490
500
  o: o ?? null,
@@ -549,10 +559,10 @@ function ReferenceControl({ field, value, onChange, readOnly, id }) {
549
559
  "data-slot": missing ? "kit-reference-card" : void 0,
550
560
  "data-missing": missing || void 0,
551
561
  "aria-label": missing ? `${field.title}: Missing ${noun}.${editable ? " Change" : ""}` : `${field.title}: select ${withArticle(noun)}`,
552
- className: cn("flex h-8 w-full items-center gap-2 rounded-kit-md border bg-kit-field-bg px-2.5 text-left text-kit-sm transition-colors hover:border-kit-field-border-hover disabled:cursor-not-allowed disabled:opacity-60 data-[popup-open]:border-kit-field-border-focus", missing ? "border-kit-warning-line text-kit-warning-fg" : "border-kit-field-border text-kit-fg-3"),
562
+ className: cn("flex h-8 w-full items-center gap-2 rounded-kit-md border border-kit-line-strong bg-kit-field-bg px-2.5 text-left text-kit-sm text-kit-fg-3 transition-colors hover:border-kit-line-strong data-[popup-open]:border-kit-line-strong data-[popup-open]:bg-kit-field-bg", missing && "border-kit-warning-line text-kit-warning-fg hover:border-kit-warning-line data-[popup-open]:border-kit-warning-line"),
553
563
  children: [
554
564
  /* @__PURE__ */ jsx(IconFileDatabase, {
555
- className: "size-4 shrink-0",
565
+ className: "size-4",
556
566
  stroke: 1.5,
557
567
  "aria-hidden": true
558
568
  }),
@@ -571,7 +581,7 @@ function ReferenceControl({ field, value, onChange, readOnly, id }) {
571
581
  children: ["Select ", withArticle(noun)]
572
582
  }),
573
583
  /* @__PURE__ */ jsx(IconChevronDown, {
574
- className: "size-3.5 shrink-0",
584
+ className: "size-3.5",
575
585
  stroke: 1.5,
576
586
  "aria-hidden": true
577
587
  })
@@ -581,44 +591,51 @@ function ReferenceControl({ field, value, onChange, readOnly, id }) {
581
591
  }
582
592
  function RefChip({ id, o, canLookup, readOnly, sort, onRemove }) {
583
593
  const handle = sort.handle(id);
594
+ const register = sort.register(id);
584
595
  const title = o?.title ?? (canLookup ? "Loading…" : id);
585
596
  return /* @__PURE__ */ jsxs("span", {
586
- ref: sort.register(id),
597
+ ...readOnly ? {} : handle,
598
+ ref: (el) => {
599
+ register(el);
600
+ if (!readOnly) handle.ref(el);
601
+ },
587
602
  style: sort.style(id),
588
- className: cn("inline-flex h-6 max-w-full items-center gap-1.5 rounded-kit-md border border-kit-line bg-kit-control-bg pl-0.5 pr-1 text-kit-sm text-kit-fg shadow-kit-xs", sort.active === id && "z-10 shadow-kit-md"),
589
- children: [/* @__PURE__ */ jsxs("span", {
590
- ...readOnly ? {} : handle,
591
- tabIndex: 0,
592
- "aria-label": readOnly ? title : `${title}, drag to reorder`,
593
- onKeyDown: (e) => {
594
- if (readOnly) return;
595
- if (e.key === "Delete" || e.key === "Backspace") {
596
- e.preventDefault();
597
- onRemove();
598
- return;
599
- }
600
- handle.onKeyDown(e);
601
- },
602
- className: cn("inline-flex min-w-0 touch-none items-center gap-1.5 rounded-kit-sm outline-none focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid] [html[data-input-modality=pointer]_&]:focus-visible:outline-none", !readOnly && "cursor-grab active:cursor-grabbing"),
603
- children: [/* @__PURE__ */ jsx(RefThumb, {
603
+ tabIndex: 0,
604
+ role: "group",
605
+ "aria-roledescription": "sortable item",
606
+ "aria-label": readOnly ? title : `${title}, drag to reorder`,
607
+ onKeyDown: (e) => {
608
+ if (readOnly || e.target !== e.currentTarget) return;
609
+ if (e.key === "Delete" || e.key === "Backspace") {
610
+ e.preventDefault();
611
+ onRemove();
612
+ return;
613
+ }
614
+ handle.onKeyDown(e);
615
+ },
616
+ className: cn("inline-flex h-6 max-w-full cursor-grab touch-none items-center gap-1.5 rounded-kit-md border border-kit-line bg-kit-control-bg pl-0.5 pr-1 text-kit-sm text-kit-fg shadow-kit-xs active:cursor-grabbing", sort.active === id && "z-10 shadow-kit-md"),
617
+ children: [
618
+ /* @__PURE__ */ jsx(RefThumb, {
604
619
  o: o ?? null,
605
620
  size: 20
606
- }), /* @__PURE__ */ jsx("span", {
621
+ }),
622
+ /* @__PURE__ */ jsx("span", {
607
623
  className: "truncate",
608
624
  children: title
609
- })]
610
- }), readOnly ? null : /* @__PURE__ */ jsx("button", {
611
- type: "button",
612
- "aria-label": `Remove ${title}`,
613
- onPointerDown: (e) => e.stopPropagation(),
614
- onClick: onRemove,
615
- className: "flex rounded-kit-sm p-0.5 text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg",
616
- children: /* @__PURE__ */ jsx(IconX, {
617
- className: "size-3",
618
- stroke: 1.5,
619
- "aria-hidden": true
625
+ }),
626
+ readOnly ? null : /* @__PURE__ */ jsx("button", {
627
+ type: "button",
628
+ "aria-label": `Remove ${title}`,
629
+ onPointerDown: (e) => e.stopPropagation(),
630
+ onClick: onRemove,
631
+ className: "flex rounded-kit-md p-0.5 text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg",
632
+ children: /* @__PURE__ */ jsx(IconX, {
633
+ className: "size-3",
634
+ stroke: 1.5,
635
+ "aria-hidden": true
636
+ })
620
637
  })
621
- })]
638
+ ]
622
639
  });
623
640
  }
624
641
  /** Multi-reference: an array of reference ids. `field` is the ARRAY field; the engine hands it the item's `reference`. */
@@ -656,9 +673,9 @@ function ReferencesControl({ field, value, onChange, readOnly, id }) {
656
673
  children: [
657
674
  /* @__PURE__ */ jsxs("div", {
658
675
  id: readOnly ? id : void 0,
659
- role: "group",
660
- "aria-label": field.title,
661
- className: "flex min-h-8 flex-wrap items-center gap-1 rounded-kit-md border border-kit-field-border bg-kit-field-bg p-1 transition-colors hover:border-kit-field-border-hover",
676
+ role: readOnly ? "group" : void 0,
677
+ "aria-label": readOnly ? field.title : void 0,
678
+ className: "flex min-h-8 flex-wrap items-center gap-1 rounded-kit-md border border-kit-line-strong bg-kit-field-bg p-1 transition-colors hover:border-kit-line-strong",
662
679
  children: [
663
680
  shown.map((x) => /* @__PURE__ */ jsx(RefChip, {
664
681
  id: x,
@@ -671,7 +688,6 @@ function ReferencesControl({ field, value, onChange, readOnly, id }) {
671
688
  sort.a11y,
672
689
  !readOnly ? /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
673
690
  id,
674
- "aria-label": `Add to ${field.title}`,
675
691
  className: "inline-flex h-6 items-center gap-1 rounded-kit-md px-1.5 text-kit-sm text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg",
676
692
  children: [/* @__PURE__ */ jsx(IconPlus, {
677
693
  className: "size-3.5",
@@ -745,7 +761,7 @@ function ReferencesControl({ field, value, onChange, readOnly, id }) {
745
761
  children: rec.error
746
762
  }) : null,
747
763
  max != null ? /* @__PURE__ */ jsxs("span", {
748
- className: "self-end tabular-nums text-kit-xs text-kit-fg-3",
764
+ className: "tabular-nums self-end text-kit-xs text-kit-fg-3",
749
765
  children: [
750
766
  ids.length,
751
767
  " / ",
@@ -756,6 +772,6 @@ function ReferencesControl({ field, value, onChange, readOnly, id }) {
756
772
  });
757
773
  }
758
774
  //#endregion
759
- export { ReferenceControl, ReferencesControl };
775
+ export { RefThumb, ReferenceControl, ReferencesControl, referenceNoun, useReferenceRecords };
760
776
 
761
777
  //# sourceMappingURL=reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.js","names":[],"sources":["../../src/controls/reference.tsx"],"sourcesContent":["/**\n * REFERENCE — single: a select-like trigger (\"Select a CMS item\") → a 300px search popover with \"None\", result rows,\n * drafts labelled, and \"Create new\" inline when the host can create. Never lists the document being edited. No one-click\n * clear (⋯ → Remove). MULTI-REFERENCE — reorderable chips + \"+ Add\", \"n / max\"; at the limit the picker swaps in place.\n * (V2 HEAD 9829bf1 kit/controls/reference.tsx, DESIGN.md 6.8, 8.16, 9.6.)\n *\n * The rows come from the host (reference-services.ts): `searchReferences` is POST /content/reference-options, which\n * already applies the field's `reference.filter` and scope; `truncated` says its filter scan stopped early, and the\n * picker says so. The stored value is the target id (\"en_12\"; a list for many), exactly V2's shape.\n *\n * Kit deviations from V2: no seed rows (every row is a real record from the service); matching is the server's title /\n * slug search, so rows keep the server's order; a stored id the lookup cannot find shows as a \"Missing\" card, or in a\n * multi list one compact \"n missing\" chip with Remove (DESIGN 9.6's production rule), instead of disappearing; chips sort with the engine's `useDragReorder`\n * (@dnd-kit is not on the kit allow-list).\n */\nimport * as React from \"react\";\nimport { IconArrowUpRight, IconCheck, IconChevronDown, IconDatabase, IconDots, IconFileDatabase, IconFileText, IconForms, IconPlus, IconReplace, IconSearch, IconShoppingBag, IconTrash, IconX } from \"@tabler/icons-react\";\nimport type { KitReferenceKind, KitReferenceOption } from \"./reference-services\";\nimport { Button } from \"../ui/button\";\nimport { Avatar } from \"../ui/display\";\nimport { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport { useDragReorder } from \"../engine/item-list\";\nimport { useKitEnv, useKitServices } from \"../context\";\nimport type { ControlProps } from \"../types\";\n\nconst NON_ENTRY = new Set([\"page\", \"form\", \"collection\", \"shopify\"]);\nconst isEntryTarget = (t: string) => !NON_ENTRY.has(t);\nconst targetsOf = (field: ControlProps[\"field\"]) => field.reference?.to ?? [];\n\n/** The noun the picker uses (D48: \"CMS item\" where V2 says \"entry\"). */\nexport function referenceNoun(to: string[]): string {\n if (to.length === 1) return to[0] === \"page\" ? \"page\" : to[0] === \"form\" ? \"form\" : to[0] === \"collection\" ? \"collection\" : to[0] === \"shopify\" ? \"product\" : \"CMS item\";\n return to.length && to.every(isEntryTarget) ? \"CMS item\" : \"item\";\n}\nconst plural = (noun: string) => (noun === \"CMS item\" ? \"CMS items\" : `${noun}s`);\nconst withArticle = (noun: string) => `${/^[aeiou]/i.test(noun) ? \"an\" : \"a\"} ${noun}`;\nconst reasonOf = (e: unknown) => (e instanceof Error ? e.message : String(e));\nconst PAGE = 25;\n/** V2 (Radix) slides a picker that would overflow along the edge, keeping it over the panel; Base UI would flip it to\n * end-aligned, which hangs it left over the preview */\nconst SHIFT = { align: \"shift\" } as const;\n\nconst KIND_ICON: Record<KitReferenceKind, React.ComponentType<{ className?: string; stroke?: number }>> = {\n entry: IconFileDatabase,\n page: IconFileText,\n form: IconForms,\n collection: IconDatabase,\n shopify: IconShoppingBag,\n};\n\nexport function RefThumb({ o, size = 28 }: { o: Pick<KitReferenceOption, \"kind\" | \"title\" | \"photo\" | \"avatar\" | \"cover\"> | null; size?: number }) {\n // V2 reference.tsx:152-156: a person is their round avatar (initials without a photo), a record with a cover its image\n if (o?.avatar || o?.photo) return <Avatar name={o.title} src={o.photo ?? undefined} size={size} decorative />;\n if (o?.cover) return <img src={o.cover} alt=\"\" style={{ width: size, height: size }} className=\"shrink-0 rounded-kit-md border border-kit-line object-cover\" />;\n const Icon = o ? KIND_ICON[o.kind] : IconFileDatabase;\n return (\n <span aria-hidden style={{ width: size, height: size }} className=\"flex shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-subtle text-kit-fg-3\">\n <Icon className={size > 24 ? \"size-4\" : \"size-3.5\"} stroke={1.5} />\n </span>\n );\n}\n\nfunction DraftChip({ status }: { status?: string | null }) {\n return status === \"draft\" ? <span className=\"shrink-0 rounded-kit-md bg-kit-muted px-1 text-kit-2xs text-kit-fg-3\">Draft</span> : null;\n}\n\n/* ── Lookup: stored ids → their records ────────────────────────────── */\n/**\n * The records behind `ids`, read once per id through `lookupReferences`. An id the service does not hand back is\n * `missing`; a failed read is `error` (in words). A row picked in the picker is `remember`ed, so it shows at once.\n */\nexport function useReferenceRecords(ids: string[], to: string[]) {\n const { lookupReferences } = useKitServices();\n const [known, setKnown] = React.useState<Record<string, KitReferenceOption>>({});\n const [missing, setMissing] = React.useState<ReadonlySet<string>>(new Set());\n const [error, setError] = React.useState<string | null>(null);\n const inflight = React.useRef(new Set<string>());\n const alive = React.useRef(true);\n // set on every mount: StrictMode mounts, unmounts and mounts again, and a flag only cleared would drop every read\n React.useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n const idsKey = ids.join(\"|\");\n const toKey = to.join(\"|\");\n React.useEffect(() => {\n if (!lookupReferences) return;\n const asked = ids.filter((x) => !known[x] && !missing.has(x) && !inflight.current.has(x));\n if (!asked.length) return;\n for (const x of asked) inflight.current.add(x);\n lookupReferences(asked, to)\n .then((rows) => {\n if (!alive.current) return;\n const found = new Set(rows.map((r) => r.id));\n setKnown((k) => ({ ...k, ...Object.fromEntries(rows.map((r) => [r.id, r])) }));\n setMissing((m) => new Set([...m, ...asked.filter((x) => !found.has(x))]));\n setError(null);\n })\n .catch((e: unknown) => alive.current && setError(`The saved ${plural(referenceNoun(to))} could not be read: ${reasonOf(e)}`))\n .finally(() => {\n for (const x of asked) inflight.current.delete(x);\n });\n }, [idsKey, toKey, lookupReferences, known, missing]); // eslint-disable-line react-hooks/exhaustive-deps\n const remember = React.useCallback((o: KitReferenceOption) => {\n setKnown((k) => ({ ...k, [o.id]: o }));\n setMissing((m) => (m.has(o.id) ? new Set([...m].filter((x) => x !== o.id)) : m));\n }, []);\n return { known, missing, loading: !!lookupReferences && ids.some((x) => !known[x] && !missing.has(x)) && !error, error, remember, canLookup: !!lookupReferences };\n}\n\n/* ── The search popover body, shared by single and multi ───────────── */\nfunction PickerBody({\n to,\n filter,\n selected,\n multi,\n max,\n noun,\n onPick,\n onNone,\n canCreate,\n onCreated,\n}: {\n to: string[];\n filter?: string;\n selected: string[];\n multi?: boolean;\n max?: number;\n noun: string;\n onPick: (o: KitReferenceOption) => void;\n onNone?: () => void;\n canCreate: boolean;\n onCreated: (o: KitReferenceOption) => void;\n}) {\n const { searchReferences, createReference } = useKitServices();\n const env = useKitEnv();\n const [q, setQ] = React.useState(\"\");\n const [query, setQuery] = React.useState(\"\");\n const [rows, setRows] = React.useState<KitReferenceOption[]>([]);\n const [truncated, setTruncated] = React.useState(false);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n const [active, setActive] = React.useState(0);\n const [creating, setCreating] = React.useState(false);\n const [createBusy, setCreateBusy] = React.useState(false);\n const [createError, setCreateError] = React.useState<string | null>(null);\n const listId = React.useId();\n\n React.useEffect(() => {\n const t = window.setTimeout(() => setQuery(q.trim()), q.trim() ? 180 : 0);\n return () => window.clearTimeout(t);\n }, [q]);\n const toKey = to.join(\"|\");\n React.useEffect(() => {\n if (!searchReferences) return;\n const ctrl = new AbortController();\n setLoading(true);\n searchReferences({ to, filter, q: query, limit: PAGE, excludeId: env.docId, signal: ctrl.signal })\n .then((r) => {\n if (ctrl.signal.aborted) return;\n setRows(r.options.filter((o) => o.id !== env.docId));\n setTruncated(r.truncated);\n setError(null);\n setActive(0);\n })\n .catch((e: unknown) => !ctrl.signal.aborted && setError(reasonOf(e)))\n .finally(() => !ctrl.signal.aborted && setLoading(false));\n return () => ctrl.abort();\n }, [query, toKey, filter, env.docId, searchReferences]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const none = onNone && !q;\n const total = rows.length + (none ? 1 : 0);\n const at = (i: number) => (none ? (i === 0 ? null : rows[i - 1]) : rows[i]);\n const full = multi && max != null && selected.length >= max;\n const choose = (i: number) => {\n const o = at(i);\n if (o) onPick(o);\n else if (none) onNone!();\n };\n const optionId = (i: number) => `${listId}-${i}`;\n const create = async (title: string) => {\n if (!createReference) return;\n setCreateBusy(true);\n setCreateError(null);\n try {\n const o = await createReference({ to: to[0], title });\n setCreating(false);\n onCreated(o);\n } catch (e) {\n setCreateError(`Not created: ${reasonOf(e)}`);\n } finally {\n setCreateBusy(false);\n }\n };\n // V2's search copy: \"pages\" for a page picker, \"entries\" for every other one\n const searchLabel = `Search ${noun === \"page\" ? \"pages\" : \"entries\"}`;\n return (\n <div className=\"flex flex-col\">\n <label className=\"flex h-10 items-center gap-2 border-b border-kit-line px-3 text-kit-fg-3\">\n <IconSearch className=\"size-4 shrink-0\" stroke={1.5} aria-hidden />\n <input\n autoFocus\n value={q}\n onChange={(e) => {\n setQ(e.target.value);\n setActive(0);\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive((a) => Math.min(total - 1, a + 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((a) => Math.max(0, a - 1));\n } else if (e.key === \"Home\") {\n e.preventDefault();\n setActive(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n setActive(Math.max(0, total - 1));\n } else if (e.key === \"Enter\" && total) {\n e.preventDefault();\n choose(Math.min(active, total - 1));\n }\n }}\n placeholder={`${searchLabel}…`}\n role=\"combobox\"\n aria-expanded\n aria-autocomplete=\"list\"\n aria-controls={listId}\n aria-activedescendant={total ? optionId(Math.min(active, total - 1)) : undefined}\n aria-label={searchLabel}\n className=\"h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-3\"\n />\n </label>\n <div id={listId} className=\"max-h-72 overflow-y-auto p-1\" role=\"listbox\" aria-label={`${noun} results`} aria-multiselectable={multi || undefined} aria-busy={loading || undefined}>\n {none ? (\n <button\n type=\"button\"\n id={optionId(0)}\n role=\"option\"\n aria-selected={false}\n tabIndex={-1}\n onMouseEnter={() => setActive(0)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={onNone}\n className={cn(\"flex h-8 w-full items-center gap-2 rounded-kit-md px-2 text-left text-kit-sm text-kit-fg-3 hover:bg-kit-hover\", active === 0 && \"bg-kit-hover\")}\n >\n None\n </button>\n ) : null}\n {rows.map((o, j) => {\n const i = j + (none ? 1 : 0);\n const on = selected.includes(o.id);\n return (\n <button\n type=\"button\"\n key={`${o.kind}:${o.id}`}\n id={optionId(i)}\n role=\"option\"\n aria-selected={on}\n tabIndex={-1}\n onMouseEnter={() => setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onPick(o)}\n className={cn(\"flex w-full items-center gap-2.5 rounded-kit-md p-1.5 text-left\", i === active && \"bg-kit-hover\")}\n >\n {multi ? (\n <span aria-hidden className={cn(\"flex size-4 shrink-0 items-center justify-center rounded-kit-md border\", on ? \"border-kit-accent bg-kit-accent text-kit-accent-on\" : \"border-kit-line-strong\", !on && full && \"opacity-40\")}>\n {on ? <IconCheck className=\"size-3\" stroke={3} /> : null}\n </span>\n ) : null}\n <RefThumb o={o} size={28} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-kit-sm text-kit-fg\">{o.title}</span>\n {o.subtitle ? <span className=\"block truncate text-kit-xs text-kit-fg-3\">{o.subtitle}</span> : null}\n </span>\n <DraftChip status={o.status} />\n {!multi && on ? <IconCheck className=\"size-4 shrink-0 text-kit-fg\" stroke={2} aria-hidden /> : null}\n </button>\n );\n })}\n {!loading && !error && rows.length === 0 ? <div className=\"px-3 py-6 text-center text-kit-sm text-kit-fg-3\">No matches</div> : null}\n {loading && rows.length === 0 ? (\n <div role=\"status\" className=\"px-3 py-6 text-center text-kit-sm text-kit-fg-3\">\n Searching…\n </div>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"px-3 py-3 text-kit-xs text-kit-danger-fg\">\n {plural(noun).replace(/^./, (c) => c.toUpperCase())} could not be listed: {error}\n </p>\n ) : null}\n </div>\n {truncated && !error ? (\n <p role=\"note\" className=\"border-t border-kit-line px-3 py-2 text-kit-xs text-kit-warning-fg\">\n Some {plural(noun)} were not checked against this field's filter, so the list may be incomplete. Search by name to narrow it.\n </p>\n ) : null}\n {multi ? (\n <div className={cn(\"border-t border-kit-line px-3 py-2 text-kit-xs\", full ? \"text-kit-warning-fg\" : \"text-kit-fg-3\")}>\n {selected.length}\n {max != null ? ` of ${max}` : \"\"} selected{full ? ` · Limit is ${max}. Picking another swaps out the last one.` : \"\"}\n </div>\n ) : null}\n {canCreate ? (\n <div className=\"border-t border-kit-line p-1.5\">\n {creating ? (\n <>\n <form\n className=\"flex items-center gap-1.5\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const t = String(new FormData(e.currentTarget).get(\"t\") ?? \"\").trim();\n if (t) void create(t);\n }}\n >\n <input\n name=\"t\"\n autoFocus\n defaultValue={q}\n aria-label={`New ${noun} name`}\n placeholder={`New ${noun} name`}\n className=\"h-8 min-w-0 flex-1 rounded-kit-md border border-kit-line-strong bg-kit-field-bg px-2 text-kit-sm text-kit-fg outline-none focus:bg-kit-field-bg focus:ring-1 focus:ring-kit-line-strong\"\n />\n <Button size=\"sm\" type=\"submit\" variant=\"primary\" loading={createBusy} disabled={createBusy}>\n Create\n </Button>\n </form>\n {createError ? (\n <p role=\"alert\" className=\"mt-1.5 px-1 text-kit-xs text-kit-danger-fg\">\n {createError}\n </p>\n ) : null}\n </>\n ) : (\n <button\n type=\"button\"\n onClick={() => setCreating(true)}\n className=\"flex h-8 w-full items-center gap-2 rounded-kit-md px-2 text-left text-kit-sm text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg\"\n >\n <IconPlus className=\"size-4\" stroke={1.5} aria-hidden />\n Create new {noun}\n {q ? <span className=\"truncate text-kit-fg-3\">“{q}”</span> : null}\n </button>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\n/** \"Create new\" only where the host can create a draft in the ONE entry model the field targets. */\nfunction useCanCreate(to: string[]) {\n const { createReference } = useKitServices();\n return !!createReference && to.length === 1 && isEntryTarget(to[0]);\n}\n\n/** Why the field cannot change its value here (no search service), in words. */\nfunction NoSearch({ title }: { title: string }) {\n return (\n <p role=\"note\" className=\"text-kit-xs text-kit-fg-3\">\n No reference search is connected to this editor, so {title} can't be changed here.\n </p>\n );\n}\n\n/* ── Single reference ──────────────────────────────────────────────── */\nexport function ReferenceControl({ field, value, onChange, readOnly, id }: ControlProps) {\n const env = useKitEnv();\n const { searchReferences, toast } = useKitServices();\n const to = targetsOf(field);\n const noun = referenceNoun(to);\n const current = typeof value === \"string\" && value ? value : null;\n const ids = React.useMemo(() => (current ? [current] : []), [current]);\n const rec = useReferenceRecords(ids, to);\n const canCreate = useCanCreate(to) && !readOnly;\n const [open, setOpen] = React.useState(false);\n const pick = (o: KitReferenceOption) => {\n rec.remember(o);\n onChange(o.id);\n setOpen(false);\n };\n /* the trigger opens like V2's even with no search service; the popover then says why nothing can be picked */\n const editable = !readOnly;\n const body = !editable ? null : !searchReferences ? (\n <PopoverContent className=\"w-[300px] p-3\" align=\"start\" collisionAvoidance={SHIFT}>\n <NoSearch title={field.title} />\n </PopoverContent>\n ) : (\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\" collisionAvoidance={SHIFT}>\n <PickerBody\n to={to}\n filter={field.reference?.filter}\n selected={current ? [current] : []}\n noun={noun}\n onPick={pick}\n onNone={\n current\n ? () => {\n onChange(null);\n setOpen(false);\n }\n : undefined\n }\n canCreate={canCreate}\n onCreated={(o) => {\n pick(o);\n toast?.success(`${noun.replace(/^./, (c) => c.toUpperCase())} created as a draft`, { description: `“${o.title}”` });\n }}\n />\n </PopoverContent>\n );\n\n const missing = !!current && rec.missing.has(current);\n if (current && !missing) {\n const o = rec.known[current];\n const title = o?.title ?? (rec.loading ? \"Loading…\" : current);\n const subtitle = o ? o.subtitle : rec.error ?? (!rec.canLookup ? `Saved ${noun} id` : null);\n const openable = !!o && o.kind === \"entry\" && !!o.modelSlug && !!env.onOpenReference;\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <div data-slot=\"kit-reference-card\" className=\"group/ref flex items-center gap-2.5 rounded-kit-lg border border-kit-line bg-kit-control-bg p-1.5 pr-1 transition-colors hover:border-kit-line-strong\">\n <PopoverTrigger\n id={id}\n disabled={!editable}\n aria-label={`${field.title}: ${title}.${editable ? \" Change\" : \"\"}`}\n className=\"flex min-w-0 flex-1 items-center gap-2.5 text-left\"\n >\n <RefThumb o={o ?? null} size={32} />\n <span className=\"min-w-0 flex-1\">\n <span className={cn(\"block truncate text-kit-sm font-medium text-kit-fg\", !o && !rec.canLookup && \"font-kit-mono text-kit-xs\")}>{title}</span>\n {subtitle ? <span className={cn(\"block truncate text-kit-xs\", rec.error && !o ? \"text-kit-danger-fg\" : \"text-kit-fg-3\")}>{subtitle}</span> : null}\n </span>\n <DraftChip status={o?.status} />\n </PopoverTrigger>\n {readOnly ? null : (\n <Menu>\n <MenuTrigger\n aria-label={`${o?.title ?? field.title} actions`}\n className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover\"\n >\n <IconDots className=\"size-4\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"w-48\">\n {openable ? (\n <MenuItem icon={<IconArrowUpRight stroke={1.5} />} onClick={() => env.onOpenReference!({ collectionId: o!.modelSlug!, entryId: o!.id, title: o!.title })}>\n Open {o!.title.length > 18 ? `${o!.title.slice(0, 16)}…` : o!.title}\n </MenuItem>\n ) : null}\n {editable ? (\n <MenuItem icon={<IconReplace stroke={1.5} />} onClick={() => window.setTimeout(() => setOpen(true), 0)}>\n Replace\n </MenuItem>\n ) : null}\n {openable || editable ? <MenuSeparator /> : null}\n <MenuItem danger icon={<IconTrash stroke={1.5} />} onClick={() => onChange(null)}>\n Remove\n </MenuItem>\n </MenuContent>\n </Menu>\n )}\n </div>\n {body}\n </Popover>\n );\n }\n /* empty, or a saved id the lookup cannot find: V2's select trigger (V2 draws an unresolved id as no selection). Ours\n says \"Missing\" on it instead of hiding the saved id (DESIGN 9.6); the picker's None clears it, a row replaces it. */\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n id={id}\n disabled={!editable}\n data-slot={missing ? \"kit-reference-card\" : undefined}\n data-missing={missing || undefined}\n aria-label={missing ? `${field.title}: Missing ${noun}.${editable ? \" Change\" : \"\"}` : `${field.title}: select ${withArticle(noun)}`}\n className={cn(\n \"flex h-8 w-full items-center gap-2 rounded-kit-md border border-kit-line-strong bg-kit-field-bg px-2.5 text-left text-kit-sm text-kit-fg-3 transition-colors hover:border-kit-line-strong data-[popup-open]:border-kit-line-strong data-[popup-open]:bg-kit-field-bg\",\n missing && \"border-kit-warning-line text-kit-warning-fg hover:border-kit-warning-line data-[popup-open]:border-kit-warning-line\",\n )}\n >\n <IconFileDatabase className=\"size-4\" stroke={1.5} aria-hidden />\n {missing ? (\n <span className=\"flex-1 truncate\">\n Missing {noun}\n <span className=\"sr-only\">. Deleted, or not visible to you. The saved id stays until you replace or remove it.</span>\n </span>\n ) : (\n <span className=\"flex-1 truncate\">Select {withArticle(noun)}</span>\n )}\n <IconChevronDown className=\"size-3.5\" stroke={1.5} aria-hidden />\n </PopoverTrigger>\n {body}\n </Popover>\n );\n}\n\n/* ── Multi-reference: an array of ids ─────────────────────────────── */\nfunction RefChip({\n id,\n o,\n canLookup,\n readOnly,\n sort,\n onRemove,\n}: {\n id: string;\n o?: KitReferenceOption;\n /** false: no lookup service, so the saved id is all there is to show (never a \"Loading…\" that never ends) */\n canLookup: boolean;\n readOnly?: boolean;\n sort: ReturnType<typeof useDragReorder>;\n onRemove: () => void;\n}) {\n const handle = sort.handle(id);\n const register = sort.register(id);\n const title = o?.title ?? (canLookup ? \"Loading…\" : id);\n /* V2: the chip itself is the sortable item (thumb, title and remove button inside it) */\n return (\n <span\n {...(readOnly ? {} : handle)}\n ref={(el: HTMLElement | null) => {\n register(el);\n if (!readOnly) handle.ref(el);\n }}\n style={sort.style(id)}\n tabIndex={0}\n role=\"group\"\n aria-roledescription=\"sortable item\"\n aria-label={readOnly ? title : `${title}, drag to reorder`}\n onKeyDown={(e) => {\n // keys on the remove button are the button's own\n if (readOnly || e.target !== e.currentTarget) return;\n if (e.key === \"Delete\" || e.key === \"Backspace\") {\n e.preventDefault();\n onRemove();\n return;\n }\n handle.onKeyDown(e);\n }}\n className={cn(\n \"inline-flex h-6 max-w-full cursor-grab touch-none items-center gap-1.5 rounded-kit-md border border-kit-line bg-kit-control-bg pl-0.5 pr-1 text-kit-sm text-kit-fg shadow-kit-xs active:cursor-grabbing\",\n sort.active === id && \"z-10 shadow-kit-md\",\n )}\n >\n <RefThumb o={o ?? null} size={20} />\n <span className=\"truncate\">{title}</span>\n {readOnly ? null : (\n <button type=\"button\" aria-label={`Remove ${title}`} onPointerDown={(e) => e.stopPropagation()} onClick={onRemove} className=\"flex rounded-kit-md p-0.5 text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg\">\n <IconX className=\"size-3\" stroke={1.5} aria-hidden />\n </button>\n )}\n </span>\n );\n}\n\n/** Multi-reference: an array of reference ids. `field` is the ARRAY field; the engine hands it the item's `reference`. */\nexport function ReferencesControl({ field, value, onChange, readOnly, id }: ControlProps) {\n const { searchReferences } = useKitServices();\n const item = Array.isArray(field.of) ? field.of[0] : undefined;\n const to = item?.reference?.to ?? field.reference?.to ?? [];\n const filter = item?.reference?.filter ?? field.reference?.filter;\n const noun = referenceNoun(to);\n const ids = React.useMemo(() => (Array.isArray(value) ? value : []).filter((x): x is string => typeof x === \"string\" && x !== \"\"), [value]);\n const rec = useReferenceRecords(ids, to);\n const canCreate = useCanCreate(to) && !readOnly;\n const max = field.validation?.max;\n /* ids the lookup cannot find are drawn as ONE compact \"n missing\" chip after Add (V2 hides them; one row keeps V2's height),\n so the chips that sort are the rest; a reorder puts them back around the missing ids, which keep their places */\n const missingIds = ids.filter((x) => rec.missing.has(x));\n const shown = missingIds.length ? ids.filter((x) => !rec.missing.has(x)) : ids;\n const sort = useDragReorder(\n shown,\n (from, to2) => {\n const next = [...shown];\n const [moved] = next.splice(from, 1);\n next.splice(to2, 0, moved);\n let i = 0;\n onChange(ids.map((x) => (rec.missing.has(x) ? x : next[i++])));\n },\n { axis: \"grid\", disabled: readOnly },\n );\n const missingNoun = missingIds.length === 1 ? noun : plural(noun);\n const toggle = (o: KitReferenceOption) => {\n rec.remember(o);\n if (ids.includes(o.id)) return onChange(ids.filter((x) => x !== o.id));\n if (max != null && ids.length >= max) return onChange([...ids.slice(0, -1), o.id]); // swap in place at the limit\n onChange([...ids, o.id]);\n };\n return (\n <div className=\"flex flex-col gap-1\">\n {/* the field label points at the Add trigger; read-only there is none, so the box carries the id. The chips sit\n straight in the wrapping box, as V2's do (a wrapper would take them out of the box's flow). V2's box has no\n role or name while editing; read-only (no Add to label) it is named as a group. */}\n <div\n id={readOnly ? id : undefined}\n role={readOnly ? \"group\" : undefined}\n aria-label={readOnly ? field.title : undefined}\n className=\"flex min-h-8 flex-wrap items-center gap-1 rounded-kit-md border border-kit-line-strong bg-kit-field-bg p-1 transition-colors hover:border-kit-line-strong\"\n >\n {shown.map((x) => (\n <RefChip key={x} id={x} o={rec.known[x]} canLookup={rec.canLookup} readOnly={readOnly} sort={sort} onRemove={() => onChange(ids.filter((y) => y !== x))} />\n ))}\n {sort.a11y}\n {!readOnly ? (\n <Popover>\n <PopoverTrigger id={id} className=\"inline-flex h-6 items-center gap-1 rounded-kit-md px-1.5 text-kit-sm text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg\">\n <IconPlus className=\"size-3.5\" stroke={1.5} aria-hidden />\n Add\n </PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\" collisionAvoidance={SHIFT}>\n {/* no search service: the picker says why instead of listing anything */}\n {!searchReferences ? (\n <div className=\"p-3\">\n <NoSearch title={field.title} />\n </div>\n ) : (\n <PickerBody\n to={to}\n filter={filter}\n selected={ids}\n multi\n max={max}\n noun={noun}\n onPick={toggle}\n canCreate={canCreate}\n onCreated={(o) => {\n rec.remember(o);\n onChange(max != null && ids.length >= max ? [...ids.slice(0, -1), o.id] : [...ids, o.id]);\n }}\n />\n )}\n </PopoverContent>\n </Popover>\n ) : ids.length === 0 ? (\n <span className=\"px-1.5 text-kit-sm text-kit-fg-3\">None</span>\n ) : null}\n {/* after Add, so Add keeps V2's place (V2 draws nothing for these ids) */}\n {missingIds.length ? (\n <span\n data-missing\n data-slot=\"kit-reference-missing\"\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-kit-md border border-kit-warning-line bg-kit-control-bg pl-1.5 pr-1 text-kit-sm text-kit-warning-fg shadow-kit-xs\"\n >\n <span className=\"truncate tabular-nums\">\n {missingIds.length} missing\n <span className=\"sr-only\">\n {\" \"}\n {missingNoun}. Deleted, or not visible to you. The saved {missingIds.length === 1 ? \"id stays\" : \"ids stay\"} until you remove {missingIds.length === 1 ? \"it\" : \"them\"}.\n </span>\n </span>\n {readOnly ? null : (\n <button\n type=\"button\"\n aria-label={`Remove ${missingIds.length} missing ${missingNoun}`}\n onClick={() => onChange(ids.filter((y) => !rec.missing.has(y)))}\n className=\"flex rounded-kit-sm p-0.5 hover:bg-kit-hover hover:text-kit-fg\"\n >\n <IconX className=\"size-3\" stroke={1.5} aria-hidden />\n </button>\n )}\n </span>\n ) : null}\n </div>\n {rec.error ? (\n <p role=\"alert\" className=\"text-kit-xs text-kit-danger-fg\">\n {rec.error}\n </p>\n ) : null}\n {max != null ? (\n <span className=\"tabular-nums self-end text-kit-xs text-kit-fg-3\">\n {ids.length} / {max}\n </span>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * RICH TEXT · the article-block shell (V2 article-blocks.tsx ArticleBlock), shared by every article block: the one-open
3
+ * store (one panel or popover open at a time), the card the block draws in (a focusable group: Enter opens it, Escape
4
+ * closes it then leaves, ⌘Z / ⌘⇧Z, ⌘D, ⌥↑/↓, Backspace), the edit / remove chip on its top edge, the empty state, the
5
+ * schema form a panel or popover holds, and the floating properties panel (D54).
6
+ *
7
+ * surface "panel" ArticlePanelBlock: ArticleCard + useArticleOpen + ArticlePanel(ArticleForm) (pull quote, gallery,
8
+ * related posts)
9
+ * surface "popover" ArticlePopoverBlock: ArticleCard + useArticleOpen + a Popover of ArticleForm (embed, table of
10
+ * contents, author bio)
11
+ * surface "inline" ArticleCard without onOpen: the block edits in the text itself (key takeaways)
12
+ */
13
+ import * as React from "react";
14
+ import type { TypeSchema } from "../../schema/types";
15
+ import type { IslandEl } from "./dom";
16
+ import type { IslandCtx } from "./blocks";
17
+ export interface OpenArticle {
18
+ id: string;
19
+ /** the field the panel focuses when it opens (a click on the preview's `data-field`), null = the first */
20
+ focusKey: string | null;
21
+ /** bumps on every open, so re-opening the open block refocuses */
22
+ nonce: number;
23
+ }
24
+ /** The article block open now, if any. */
25
+ export declare const currentOpenArticle: () => OpenArticle | null;
26
+ export declare function useOpenArticle(): OpenArticle | null;
27
+ /**
28
+ * One block's place in the one-open store: `open(field?)` opens it (closing any other), `close()` closes it if it is
29
+ * the open one. It closes when the block unmounts, and a fresh insert (`autoFocus`) opens its form.
30
+ */
31
+ export declare function useArticleOpen({ ro, autoFocus }: {
32
+ ro: boolean;
33
+ autoFocus: boolean;
34
+ }): {
35
+ open: OpenArticle | null;
36
+ editing: boolean;
37
+ openPanel: (k?: string | null) => void;
38
+ close: () => void;
39
+ };
40
+ /** Focus the form row `key` names (`data-field-key`), else the first row. */
41
+ export declare function focusField(root: HTMLElement | null, key: string | null): void;
42
+ /**
43
+ * V2 ArticleBlock onKeyDown, on the card itself (its own fields handle their own keys). With `onOpen` (a panel or
44
+ * popover block) Enter / Space open it and Escape closes it first; without (an inline block) Escape leaves the block.
45
+ */
46
+ export declare function articleCardKeyDown({ card, ctx, el, ro, editing, onOpen, onClose, focusCard, }: {
47
+ card: React.RefObject<HTMLElement | null>;
48
+ ctx: IslandCtx;
49
+ el: IslandEl;
50
+ ro: boolean;
51
+ editing?: boolean;
52
+ onOpen?: () => void;
53
+ onClose?: () => void;
54
+ focusCard: () => void;
55
+ }): (e: React.KeyboardEvent) => void;
56
+ /** The chip on the block's top edge (so it never covers the block's own text): Edit (with `onEdit`) and Remove. */
57
+ export declare function ArticleActions({ label, ctx, el, editing, onEdit, tooltips, }: {
58
+ label: string;
59
+ ctx: IslandCtx;
60
+ el: IslandEl;
61
+ editing?: boolean;
62
+ /** toggles the block's panel or popover; absent on an inline block */
63
+ onEdit?: () => void;
64
+ /** each button also says what it does in a tooltip */
65
+ tooltips?: boolean;
66
+ }): import("react/jsx-runtime").JSX.Element | null;
67
+ /**
68
+ * The card an article block draws in. With `onOpen` (panel / popover) it is pressable: a click opens it on the field
69
+ * clicked (`data-field`), and it shows the open ring while `editing`. Without, it is the inline block's quiet group.
70
+ */
71
+ export declare const ArticleCard: React.ForwardRefExoticComponent<{
72
+ label: string;
73
+ kind: string;
74
+ ro: boolean;
75
+ editing?: boolean;
76
+ onOpen?: (field: string | null) => void;
77
+ onKeyDown: (e: React.KeyboardEvent) => void;
78
+ children: React.ReactNode;
79
+ } & React.RefAttributes<HTMLDivElement>>;
80
+ /** The block's settings, built from its schema (V2 ArticleForm: the kit SchemaForm, flush to the panel's top). */
81
+ export declare function ArticleForm({ schema, label, value, onChange, ro, }: {
82
+ schema: TypeSchema;
83
+ label: string;
84
+ value: Record<string, unknown>;
85
+ onChange: (v: Record<string, unknown>) => void;
86
+ ro: boolean;
87
+ }): import("react/jsx-runtime").JSX.Element;
88
+ /** V2 article-blocks.tsx Empty: a block with nothing to show yet. */
89
+ export declare const ArticleEmpty: ({ icon, title, action, onAction, ro }: {
90
+ icon: React.ReactNode;
91
+ title: string;
92
+ action: string;
93
+ onAction: () => void;
94
+ ro: boolean;
95
+ }) => import("react/jsx-runtime").JSX.Element;
96
+ export declare function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx, el, children, }: {
97
+ label: string;
98
+ anchor: HTMLElement | null;
99
+ nonce: number;
100
+ focusKey: string | null;
101
+ onClose: () => void;
102
+ focusBack: () => void;
103
+ ctx: IslandCtx;
104
+ el: IslandEl;
105
+ children: React.ReactNode;
106
+ }): import("react/jsx-runtime").JSX.Element;
107
+ /**
108
+ * A panel article block (V2 ArticleBlock surface "panel": Gallery, Related posts): the shell's card + chip, its
109
+ * settings in the floating properties panel, one undo step per field edit.
110
+ */
111
+ export declare function ArticlePanelBlock<M extends object>({ label, kind, schema, m, set, el, ctx, autoFocus, openOnInsert, toForm, fromForm, children, }: {
112
+ label: string;
113
+ kind: string;
114
+ schema: TypeSchema;
115
+ m: M;
116
+ set: (fn: (m: M) => M, label?: string) => void;
117
+ el: IslandEl;
118
+ ctx: IslandCtx;
119
+ autoFocus: boolean;
120
+ /** V2 article-blocks.tsx:127-133: a fresh insert opens the panel, except Related posts, which focuses the card */
121
+ openOnInsert?: boolean;
122
+ toForm: (m: M) => Record<string, unknown>;
123
+ fromForm: (v: Record<string, unknown>, prev: M) => M;
124
+ children: (open: (field?: string | null) => void, ro: boolean) => React.ReactNode;
125
+ }): import("react/jsx-runtime").JSX.Element;
126
+ /**
127
+ * A popover article block (V2 ArticleBlock surface "popover": TOC, Embed, Author bio): the shell's card + chip, its
128
+ * settings in a popover from the card's top-right corner, one undo step per field edit.
129
+ */
130
+ export declare function ArticlePopoverBlock<M extends object>({ label, kind, schema, m, set, el, ctx, autoFocus, openOnInsert, toForm, fromForm, children, }: {
131
+ label: string;
132
+ kind: string;
133
+ schema: TypeSchema;
134
+ m: M;
135
+ set: (fn: (m: M) => M, label?: string) => void;
136
+ el: IslandEl;
137
+ ctx: IslandCtx;
138
+ autoFocus: boolean;
139
+ /** V2 article-blocks.tsx:127-133: a fresh insert opens the form, except TOC and Related, which focus the card */
140
+ openOnInsert?: boolean;
141
+ toForm: (m: M) => Record<string, unknown>;
142
+ fromForm: (v: Record<string, unknown>, prev: M) => M;
143
+ /** the preview; `open(field)` opens the popover on that field (the empty state's action) */
144
+ children: (open: (field?: string | null) => void, ro: boolean) => React.ReactNode;
145
+ }): import("react/jsx-runtime").JSX.Element;