@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,213 @@
1
+ import { useRichTextRefs } from "../../context.js";
2
+ import { ArticleEmpty, ArticlePanelBlock } from "./article-shell.js";
3
+ import * as React from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { IconPlus } from "@tabler/icons-react";
6
+ //#region src/controls/rich-text/related.tsx
7
+ /**
8
+ * RICH TEXT · Related posts (kit-richtext-ui-spec.md §6): V2's article block, stored as the PT block object
9
+ * `{ _type: "relatedPosts", title?, mode, count, posts: { _ref }[] }`. Each post's title, cover, category and URL are
10
+ * derived from the referenced or queried entries, never stored.
11
+ *
12
+ * modes e1 2026-10-24 (signed deviation from V2's Automatic | Hand-picked): Same topic (topic) · Newest (newest) ·
13
+ * Hand-picked (manual). "How many" shows for the two automatic modes, Posts for Hand-picked. The schema's
14
+ * `hidden` is "show only when" (schema/types.ts), as V2's was.
15
+ * form V2 article.ts:167-195: Title (≤40, default "Related stories"), Stories (segmented), How many (1–6),
16
+ * Posts (1–6 unique references to the field's collection). Four settings → the floating panel (D54).
17
+ * preview V2 article-blocks.tsx:572-597: the title with the automatic mode's tag, three post cards (4:3 cover,
18
+ * two-line title, category); "Pick stories" when Hand-picked holds nothing that resolves.
19
+ * data KitServices.resolveRichTextRefs (useRichTextRefs): ids for Hand-picked, a query for the automatic modes.
20
+ * A fresh insert focuses the card (V2 article-blocks.tsx:131).
21
+ */
22
+ var RELATED_LABEL = "Related posts";
23
+ var relatedDefault = () => ({
24
+ title: "Related stories",
25
+ mode: "topic",
26
+ count: 3,
27
+ posts: []
28
+ });
29
+ var MODE_TAG = {
30
+ topic: "Same topic",
31
+ newest: "Newest"
32
+ };
33
+ var asMode = (v) => v === "newest" || v === "manual" ? v : "topic";
34
+ var clampCount = (v) => Math.min(6, Math.max(1, Math.round(Number(v) || 3)));
35
+ /** The panel form; `to` is the field's collection. "How many" explains the chosen automatic mode. */
36
+ var relatedSchema = (to, mode) => ({
37
+ name: "relatedPosts",
38
+ title: RELATED_LABEL,
39
+ kind: "object",
40
+ icon: "news",
41
+ fields: [
42
+ {
43
+ name: "title",
44
+ title: "Title",
45
+ type: "string",
46
+ validation: { max: 40 }
47
+ },
48
+ {
49
+ name: "mode",
50
+ title: "Stories",
51
+ type: "select",
52
+ layout: "segmented",
53
+ initialValue: "topic",
54
+ options: [
55
+ {
56
+ value: "topic",
57
+ label: "Same topic"
58
+ },
59
+ {
60
+ value: "newest",
61
+ label: "Newest"
62
+ },
63
+ {
64
+ value: "manual",
65
+ label: "Hand-picked"
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ name: "count",
71
+ title: "How many",
72
+ type: "number",
73
+ hidden: {
74
+ field: "mode",
75
+ op: "in",
76
+ value: ["topic", "newest"]
77
+ },
78
+ numeric: {
79
+ min: 1,
80
+ max: 6,
81
+ step: 1
82
+ },
83
+ description: mode === "newest" ? "Newest first." : "Same topic, newest first."
84
+ },
85
+ {
86
+ name: "posts",
87
+ title: "Posts",
88
+ type: "array",
89
+ hidden: {
90
+ field: "mode",
91
+ equals: "manual"
92
+ },
93
+ validation: {
94
+ min: 1,
95
+ max: 6,
96
+ unique: true
97
+ },
98
+ of: [{
99
+ name: "post",
100
+ title: "Post",
101
+ type: "reference",
102
+ reference: { to }
103
+ }]
104
+ }
105
+ ]
106
+ });
107
+ /** What the preview asks the host for: the picked ids, or the automatic mode's query. */
108
+ function relatedRequest(m, collection, excludeId) {
109
+ if (m.mode === "manual") return m.posts.length ? {
110
+ kind: "relatedPosts",
111
+ ids: m.posts
112
+ } : null;
113
+ return {
114
+ kind: "relatedPosts",
115
+ query: {
116
+ collection,
117
+ mode: m.mode,
118
+ count: m.count,
119
+ excludeId
120
+ }
121
+ };
122
+ }
123
+ function RelatedPreview({ m, onPick, ro, collection, excludeId }) {
124
+ const { items, loading, error } = useRichTextRefs(relatedRequest(m, collection, excludeId));
125
+ const posts = m.mode === "manual" ? m.posts.map((id) => items.find((x) => x.id === id)).filter((x) => !!x) : items;
126
+ if (m.mode === "manual" && !loading && !error && !posts.length) return /* @__PURE__ */ jsx(ArticleEmpty, {
127
+ icon: /* @__PURE__ */ jsx(IconPlus, { stroke: 1.5 }),
128
+ title: m.title || "Related posts",
129
+ action: "Pick stories",
130
+ onAction: onPick,
131
+ ro
132
+ });
133
+ return /* @__PURE__ */ jsxs("aside", {
134
+ className: "rounded-kit-lg border border-kit-line bg-kit-surface px-4 py-3",
135
+ "aria-label": m.title || "Related posts",
136
+ "aria-busy": loading || void 0,
137
+ children: [/* @__PURE__ */ jsxs("div", {
138
+ className: "mb-2 flex items-baseline gap-2",
139
+ children: [m.title ? /* @__PURE__ */ jsx("p", {
140
+ "data-field": "title",
141
+ className: "text-kit-sm font-semibold text-kit-fg",
142
+ children: m.title
143
+ }) : null, m.mode !== "manual" ? /* @__PURE__ */ jsx("span", {
144
+ "data-field": "mode",
145
+ className: "text-kit-2xs text-kit-fg-3",
146
+ children: MODE_TAG[m.mode]
147
+ }) : null]
148
+ }), error ? /* @__PURE__ */ jsxs("p", {
149
+ role: "status",
150
+ className: "text-kit-sm text-kit-warning-fg",
151
+ children: ["The stories couldn't load: ", error]
152
+ }) : /* @__PURE__ */ jsx("ul", {
153
+ className: "m-0 grid grid-cols-3 gap-3 p-0",
154
+ "data-field": m.mode === "manual" ? "posts" : "count",
155
+ children: posts.map((e) => /* @__PURE__ */ jsxs("li", {
156
+ className: "min-w-0 list-none",
157
+ children: [
158
+ e.cover ? /* @__PURE__ */ jsx("img", {
159
+ src: e.cover,
160
+ alt: "",
161
+ draggable: false,
162
+ className: "block aspect-[4/3] w-full rounded-kit-md border border-kit-line object-cover"
163
+ }) : /* @__PURE__ */ jsx("div", { className: "aspect-[4/3] rounded-kit-md bg-kit-muted" }),
164
+ /* @__PURE__ */ jsx("p", {
165
+ className: "mt-1.5 line-clamp-2 text-kit-xs font-medium leading-snug text-kit-fg",
166
+ children: e.title
167
+ }),
168
+ e.category ? /* @__PURE__ */ jsx("p", {
169
+ className: "mt-0.5 truncate text-kit-2xs text-kit-fg-3",
170
+ children: e.category
171
+ }) : null
172
+ ]
173
+ }, e.id))
174
+ })]
175
+ });
176
+ }
177
+ function RelatedBlock({ m, set, el, ctx, autoFocus, collection, excludeId }) {
178
+ const schema = React.useMemo(() => relatedSchema([collection], m.mode), [collection, m.mode]);
179
+ return /* @__PURE__ */ jsx(ArticlePanelBlock, {
180
+ label: RELATED_LABEL,
181
+ kind: "related",
182
+ schema,
183
+ m,
184
+ set,
185
+ el,
186
+ ctx,
187
+ autoFocus,
188
+ openOnInsert: false,
189
+ toForm: (x) => ({
190
+ title: x.title,
191
+ mode: x.mode,
192
+ count: x.count,
193
+ posts: x.posts
194
+ }),
195
+ fromForm: (v) => ({
196
+ title: String(v.title ?? ""),
197
+ mode: asMode(v.mode),
198
+ count: clampCount(v.count),
199
+ posts: Array.isArray(v.posts) ? v.posts.filter((x) => typeof x === "string") : []
200
+ }),
201
+ children: (open, ro) => /* @__PURE__ */ jsx(RelatedPreview, {
202
+ m,
203
+ onPick: () => open("posts"),
204
+ ro,
205
+ collection,
206
+ excludeId
207
+ })
208
+ });
209
+ }
210
+ //#endregion
211
+ export { RELATED_LABEL, RelatedBlock, RelatedPreview, relatedDefault, relatedRequest, relatedSchema };
212
+
213
+ //# sourceMappingURL=related.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"related.js","names":[],"sources":["../../../src/controls/rich-text/related.tsx"],"sourcesContent":["/**\n * RICH TEXT · Related posts (kit-richtext-ui-spec.md §6): V2's article block, stored as the PT block object\n * `{ _type: \"relatedPosts\", title?, mode, count, posts: { _ref }[] }`. Each post's title, cover, category and URL are\n * derived from the referenced or queried entries, never stored.\n *\n * modes e1 2026-10-24 (signed deviation from V2's Automatic | Hand-picked): Same topic (topic) · Newest (newest) ·\n * Hand-picked (manual). \"How many\" shows for the two automatic modes, Posts for Hand-picked. The schema's\n * `hidden` is \"show only when\" (schema/types.ts), as V2's was.\n * form V2 article.ts:167-195: Title (≤40, default \"Related stories\"), Stories (segmented), How many (1–6),\n * Posts (1–6 unique references to the field's collection). Four settings → the floating panel (D54).\n * preview V2 article-blocks.tsx:572-597: the title with the automatic mode's tag, three post cards (4:3 cover,\n * two-line title, category); \"Pick stories\" when Hand-picked holds nothing that resolves.\n * data KitServices.resolveRichTextRefs (useRichTextRefs): ids for Hand-picked, a query for the automatic modes.\n * A fresh insert focuses the card (V2 article-blocks.tsx:131).\n */\nimport * as React from \"react\";\nimport { IconPlus } from \"@tabler/icons-react\";\nimport { useRichTextRefs, type KitRichTextRefRequest } from \"../../context\";\nimport type { TypeSchema } from \"../../schema/types\";\nimport { ArticleEmpty, ArticlePanelBlock } from \"./article-shell\";\nimport type { IslandCtx } from \"./blocks\";\nimport type { IslandEl } from \"./dom\";\n\nexport type RelatedMode = \"topic\" | \"newest\" | \"manual\";\nexport interface RelatedModel {\n title: string;\n mode: RelatedMode;\n count: number;\n /** entry ids, Hand-picked only; the PT form wraps each as `{ _key, _ref }` */\n posts: string[];\n}\nexport const RELATED_LABEL = \"Related posts\";\nexport const relatedDefault = (): RelatedModel => ({ title: \"Related stories\", mode: \"topic\", count: 3, posts: [] });\nconst MODE_TAG: Record<Exclude<RelatedMode, \"manual\">, string> = { topic: \"Same topic\", newest: \"Newest\" };\nconst asMode = (v: unknown): RelatedMode => (v === \"newest\" || v === \"manual\" ? v : \"topic\");\nconst clampCount = (v: unknown) => Math.min(6, Math.max(1, Math.round(Number(v) || 3)));\n\n/** The panel form; `to` is the field's collection. \"How many\" explains the chosen automatic mode. */\nexport const relatedSchema = (to: string[], mode: RelatedMode): TypeSchema => ({\n name: \"relatedPosts\",\n title: RELATED_LABEL,\n kind: \"object\",\n icon: \"news\",\n fields: [\n { name: \"title\", title: \"Title\", type: \"string\", validation: { max: 40 } },\n {\n name: \"mode\",\n title: \"Stories\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"topic\",\n options: [\n { value: \"topic\", label: \"Same topic\" },\n { value: \"newest\", label: \"Newest\" },\n { value: \"manual\", label: \"Hand-picked\" },\n ],\n },\n {\n name: \"count\",\n title: \"How many\",\n type: \"number\",\n hidden: { field: \"mode\", op: \"in\", value: [\"topic\", \"newest\"] },\n numeric: { min: 1, max: 6, step: 1 },\n description: mode === \"newest\" ? \"Newest first.\" : \"Same topic, newest first.\",\n },\n {\n name: \"posts\",\n title: \"Posts\",\n type: \"array\",\n hidden: { field: \"mode\", equals: \"manual\" },\n validation: { min: 1, max: 6, unique: true },\n of: [{ name: \"post\", title: \"Post\", type: \"reference\", reference: { to } }],\n },\n ],\n});\n\n/** What the preview asks the host for: the picked ids, or the automatic mode's query. */\nexport function relatedRequest(m: RelatedModel, collection?: string, excludeId?: string): KitRichTextRefRequest | null {\n if (m.mode === \"manual\") return m.posts.length ? { kind: \"relatedPosts\", ids: m.posts } : null;\n return { kind: \"relatedPosts\", query: { collection, mode: m.mode, count: m.count, excludeId } };\n}\n\nexport function RelatedPreview({ m, onPick, ro, collection, excludeId }: { m: RelatedModel; onPick: () => void; ro: boolean; collection?: string; excludeId?: string }) {\n const { items, loading, error } = useRichTextRefs(relatedRequest(m, collection, excludeId));\n // Hand-picked keeps the picked order; a post that no longer resolves is skipped (V2 .filter)\n const posts = m.mode === \"manual\" ? m.posts.map((id) => items.find((x) => x.id === id)).filter((x): x is NonNullable<typeof x> => !!x) : items;\n if (m.mode === \"manual\" && !loading && !error && !posts.length)\n return <ArticleEmpty icon={<IconPlus stroke={1.5} />} title={m.title || RELATED_LABEL} action=\"Pick stories\" onAction={onPick} ro={ro} />;\n return (\n <aside className=\"rounded-kit-lg border border-kit-line bg-kit-surface px-4 py-3\" aria-label={m.title || RELATED_LABEL} aria-busy={loading || undefined}>\n <div className=\"mb-2 flex items-baseline gap-2\">\n {m.title ? (\n <p data-field=\"title\" className=\"text-kit-sm font-semibold text-kit-fg\">\n {m.title}\n </p>\n ) : null}\n {m.mode !== \"manual\" ? (\n <span data-field=\"mode\" className=\"text-kit-2xs text-kit-fg-3\">\n {MODE_TAG[m.mode]}\n </span>\n ) : null}\n </div>\n {error ? (\n <p role=\"status\" className=\"text-kit-sm text-kit-warning-fg\">\n The stories couldn't load: {error}\n </p>\n ) : (\n <ul className=\"m-0 grid grid-cols-3 gap-3 p-0\" data-field={m.mode === \"manual\" ? \"posts\" : \"count\"}>\n {posts.map((e) => (\n <li key={e.id} className=\"min-w-0 list-none\">\n {e.cover ? (\n <img src={e.cover} alt=\"\" draggable={false} className=\"block aspect-[4/3] w-full rounded-kit-md border border-kit-line object-cover\" />\n ) : (\n <div className=\"aspect-[4/3] rounded-kit-md bg-kit-muted\" />\n )}\n <p className=\"mt-1.5 line-clamp-2 text-kit-xs font-medium leading-snug text-kit-fg\">{e.title}</p>\n {e.category ? <p className=\"mt-0.5 truncate text-kit-2xs text-kit-fg-3\">{e.category}</p> : null}\n </li>\n ))}\n </ul>\n )}\n </aside>\n );\n}\n\nexport function RelatedBlock({\n m, set, el, ctx, autoFocus, collection, excludeId,\n}: {\n m: RelatedModel;\n set: (fn: (m: RelatedModel) => RelatedModel, label?: string) => void;\n el: IslandEl;\n ctx: IslandCtx;\n autoFocus: boolean;\n /** the posts collection (the field's config) */\n collection: string;\n /** the entry being edited, left out of the automatic modes */\n excludeId?: string;\n}) {\n const schema = React.useMemo(() => relatedSchema([collection], m.mode), [collection, m.mode]);\n return (\n <ArticlePanelBlock<RelatedModel>\n label={RELATED_LABEL}\n kind=\"related\"\n schema={schema}\n m={m}\n set={set}\n el={el}\n ctx={ctx}\n autoFocus={autoFocus}\n openOnInsert={false}\n toForm={(x) => ({ title: x.title, mode: x.mode, count: x.count, posts: x.posts })}\n fromForm={(v) => ({\n title: String(v.title ?? \"\"),\n mode: asMode(v.mode),\n count: clampCount(v.count),\n posts: Array.isArray(v.posts) ? v.posts.filter((x): x is string => typeof x === \"string\") : [],\n })}\n >\n {(open, ro) => <RelatedPreview m={m} onPick={() => open(\"posts\")} ro={ro} collection={collection} excludeId={excludeId} />}\n </ArticlePanelBlock>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { TypeSchema } from "../../schema/types";
2
+ import type { IslandCtx } from "./blocks";
3
+ import { type IslandEl } from "./dom";
4
+ export interface TocModel {
5
+ title: string;
6
+ depth: "2" | "3";
7
+ }
8
+ export declare const TOC_LABEL = "Table of contents";
9
+ export declare const tocDefault: () => TocModel;
10
+ /** The popover form (V2 ARTICLE_SCHEMAS.toc). Two settings → the shell's popover (D54). */
11
+ export declare const TOC_SCHEMA: TypeSchema;
12
+ export interface OutlineItem {
13
+ id: string;
14
+ text: string;
15
+ depth: 2 | 3;
16
+ }
17
+ /** V2 article.ts:250-251. ponytail: richtext's one slugify replaces this when it lands (plan RT5); it must stay equal. */
18
+ export declare const slugify: (s: string) => string;
19
+ /** The body's H2 and H3, top level only, in order, with stable de-duplicated ids. */
20
+ export declare function outlineOf(root: ParentNode): OutlineItem[];
21
+ export declare const tocVisible: (outline: OutlineItem[], depth: TocModel["depth"]) => OutlineItem[];
22
+ /** One live outline per editor: the editor sets it after each input, every TOC preview subscribes. */
23
+ export interface OutlineStore {
24
+ get: () => OutlineItem[];
25
+ subscribe: (fn: () => void) => () => void;
26
+ set: (next: OutlineItem[]) => void;
27
+ }
28
+ export declare function createOutlineStore(): OutlineStore;
29
+ export declare const NO_OUTLINE: OutlineStore;
30
+ /** `host` is the TOC's island element; its parent is the editor surface whose headings it lists. */
31
+ export declare function TocPreview({ m, outline, host }: {
32
+ m: TocModel;
33
+ outline: OutlineStore;
34
+ host: HTMLElement;
35
+ }): import("react/jsx-runtime").JSX.Element;
36
+ export interface TocBlockProps {
37
+ m: TocModel;
38
+ set: (fn: (m: TocModel) => TocModel, label?: string) => void;
39
+ el: IslandEl;
40
+ /** the editor's live outline rides the island context */
41
+ ctx: IslandCtx & {
42
+ outline?: OutlineStore;
43
+ };
44
+ autoFocus: boolean;
45
+ }
46
+ export declare function TocBlock({ m, set, el, ctx, autoFocus }: TocBlockProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,161 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { ArticlePopoverBlock } from "./article-shell.js";
3
+ import { placeCaret } from "./dom.js";
4
+ import * as React from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/controls/rich-text/toc.tsx
7
+ /**
8
+ * RICH TEXT · Table of contents (kit-richtext-ui-spec.md §5): V2's article block, stored as the PT block object
9
+ * `{ _type: "tableOfContents", title?, depth: "2" | "3" }`. The list is derived from the same body's top-level H2/H3,
10
+ * never stored.
11
+ *
12
+ * form V2 article.ts:137-156: Title (max 40, default "In this article"), Headings H2 | H2 and H3 (segmented)
13
+ * outline V2 article.ts:248-266: the body's top-level non-empty H2/H3 in order, ids slugified and de-duplicated
14
+ * (x, x-2, …), the same ids the site stamps on its headings
15
+ * preview V2 article-blocks.tsx:537-568: the nav as the reader sees it; each entry a button that scrolls the
16
+ * heading to the centre and puts the caret in it; "No headings yet." when there are none
17
+ * store V2 article-blocks.tsx:45-66: one live outline per editor, so every TOC follows the headings as they are typed
18
+ *
19
+ * The block itself (card, chip, popover at its corner) is the shared article shell (article-shell.tsx, kit-40); it
20
+ * opens on a fresh insert by focusing the card only (V2 article-blocks.tsx:131).
21
+ */
22
+ var TOC_LABEL = "Table of contents";
23
+ var tocDefault = () => ({
24
+ title: "In this article",
25
+ depth: "3"
26
+ });
27
+ /** The popover form (V2 ARTICLE_SCHEMAS.toc). Two settings → the shell's popover (D54). */
28
+ var TOC_SCHEMA = {
29
+ name: "tableOfContents",
30
+ title: TOC_LABEL,
31
+ kind: "object",
32
+ icon: "list-tree",
33
+ fields: [{
34
+ name: "title",
35
+ title: "Title",
36
+ type: "string",
37
+ validation: { max: 40 }
38
+ }, {
39
+ name: "depth",
40
+ title: "Headings",
41
+ type: "select",
42
+ layout: "segmented",
43
+ initialValue: "3",
44
+ options: [{
45
+ value: "2",
46
+ label: "H2"
47
+ }, {
48
+ value: "3",
49
+ label: "H2 and H3"
50
+ }]
51
+ }]
52
+ };
53
+ /** V2 article.ts:250-251. ponytail: richtext's one slugify replaces this when it lands (plan RT5); it must stay equal. */
54
+ var slugify = (s) => s.toLowerCase().normalize("NFKD").replace(/[̀-ͯ]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 60) || "section";
55
+ /** The body's H2 and H3, top level only, in order, with stable de-duplicated ids. */
56
+ function outlineOf(root) {
57
+ const used = /* @__PURE__ */ new Set();
58
+ const out = [];
59
+ root.querySelectorAll(":scope > h2, :scope > h3").forEach((h) => {
60
+ const text = (h.textContent ?? "").replace(/​/g, "").trim();
61
+ if (!text) return;
62
+ let id = slugify(text);
63
+ for (let n = 2; used.has(id); n++) id = `${slugify(text)}-${n}`;
64
+ used.add(id);
65
+ out.push({
66
+ id,
67
+ text,
68
+ depth: h.tagName === "H2" ? 2 : 3
69
+ });
70
+ });
71
+ return out;
72
+ }
73
+ var tocVisible = (outline, depth) => outline.filter((o) => o.depth === 2 || depth === "3");
74
+ function createOutlineStore() {
75
+ let cur = [];
76
+ const subs = /* @__PURE__ */ new Set();
77
+ return {
78
+ get: () => cur,
79
+ subscribe: (fn) => (subs.add(fn), () => void subs.delete(fn)),
80
+ set: (next) => {
81
+ if (JSON.stringify(next) === JSON.stringify(cur)) return;
82
+ cur = next;
83
+ subs.forEach((f) => f());
84
+ }
85
+ };
86
+ }
87
+ var NO_OUTLINE = {
88
+ get: () => [],
89
+ subscribe: () => () => {},
90
+ set: () => {}
91
+ };
92
+ /** `host` is the TOC's island element; its parent is the editor surface whose headings it lists. */
93
+ function TocPreview({ m, outline, host }) {
94
+ const all = React.useSyncExternalStore(outline.subscribe, outline.get, outline.get);
95
+ const items = tocVisible(all, m.depth);
96
+ const go = (it) => {
97
+ const root = host.parentElement;
98
+ if (!root) return;
99
+ const h = Array.from(root.querySelectorAll(":scope > h2, :scope > h3")).filter((h) => (h.textContent ?? "").replace(/​/g, "").trim())[all.indexOf(it)];
100
+ if (!h) return;
101
+ h.scrollIntoView?.({
102
+ block: "center",
103
+ behavior: "smooth"
104
+ });
105
+ root.focus({ preventScroll: true });
106
+ placeCaret(h);
107
+ };
108
+ return /* @__PURE__ */ jsxs("nav", {
109
+ "aria-label": m.title || "Table of contents",
110
+ className: "rounded-kit-lg border border-kit-line bg-kit-surface px-4 py-3",
111
+ children: [m.title ? /* @__PURE__ */ jsx("p", {
112
+ "data-field": "title",
113
+ className: "mb-1.5 text-kit-sm font-semibold text-kit-fg",
114
+ children: m.title
115
+ }) : null, items.length ? /* @__PURE__ */ jsx("ol", {
116
+ className: "m-0 flex list-none flex-col gap-0.5 p-0 text-kit-sm",
117
+ children: items.map((it, i) => /* @__PURE__ */ jsx("li", {
118
+ className: cn(it.depth === 3 && "pl-4"),
119
+ children: /* @__PURE__ */ jsx("button", {
120
+ type: "button",
121
+ onClick: (e) => (e.stopPropagation(), go(it)),
122
+ className: "max-w-full truncate rounded-kit-sm text-left text-kit-fg-2 hover:text-kit-fg hover:underline",
123
+ children: it.text
124
+ })
125
+ }, `${it.id}-${i}`))
126
+ }) : /* @__PURE__ */ jsx("p", {
127
+ className: "text-kit-sm text-kit-fg-3",
128
+ children: "No headings yet."
129
+ })]
130
+ });
131
+ }
132
+ function TocBlock({ m, set, el, ctx, autoFocus }) {
133
+ return /* @__PURE__ */ jsx(ArticlePopoverBlock, {
134
+ label: TOC_LABEL,
135
+ kind: "toc",
136
+ schema: TOC_SCHEMA,
137
+ m,
138
+ set,
139
+ el,
140
+ ctx,
141
+ autoFocus,
142
+ openOnInsert: false,
143
+ toForm: (x) => ({
144
+ title: x.title,
145
+ depth: x.depth
146
+ }),
147
+ fromForm: (v) => ({
148
+ title: String(v.title ?? ""),
149
+ depth: v.depth === "2" ? "2" : "3"
150
+ }),
151
+ children: () => /* @__PURE__ */ jsx(TocPreview, {
152
+ m,
153
+ outline: ctx.outline ?? NO_OUTLINE,
154
+ host: el
155
+ })
156
+ });
157
+ }
158
+ //#endregion
159
+ export { NO_OUTLINE, TOC_LABEL, TOC_SCHEMA, TocBlock, TocPreview, createOutlineStore, outlineOf, slugify, tocDefault, tocVisible };
160
+
161
+ //# sourceMappingURL=toc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc.js","names":[],"sources":["../../../src/controls/rich-text/toc.tsx"],"sourcesContent":["/**\n * RICH TEXT · Table of contents (kit-richtext-ui-spec.md §5): V2's article block, stored as the PT block object\n * `{ _type: \"tableOfContents\", title?, depth: \"2\" | \"3\" }`. The list is derived from the same body's top-level H2/H3,\n * never stored.\n *\n * form V2 article.ts:137-156: Title (max 40, default \"In this article\"), Headings H2 | H2 and H3 (segmented)\n * outline V2 article.ts:248-266: the body's top-level non-empty H2/H3 in order, ids slugified and de-duplicated\n * (x, x-2, …), the same ids the site stamps on its headings\n * preview V2 article-blocks.tsx:537-568: the nav as the reader sees it; each entry a button that scrolls the\n * heading to the centre and puts the caret in it; \"No headings yet.\" when there are none\n * store V2 article-blocks.tsx:45-66: one live outline per editor, so every TOC follows the headings as they are typed\n *\n * The block itself (card, chip, popover at its corner) is the shared article shell (article-shell.tsx, kit-40); it\n * opens on a fresh insert by focusing the card only (V2 article-blocks.tsx:131).\n */\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport type { TypeSchema } from \"../../schema/types\";\nimport { ArticlePopoverBlock } from \"./article-shell\";\nimport type { IslandCtx } from \"./blocks\";\nimport { placeCaret, type IslandEl } from \"./dom\";\n\nexport interface TocModel {\n title: string;\n depth: \"2\" | \"3\";\n}\nexport const TOC_LABEL = \"Table of contents\";\nexport const tocDefault = (): TocModel => ({ title: \"In this article\", depth: \"3\" });\n\n/** The popover form (V2 ARTICLE_SCHEMAS.toc). Two settings → the shell's popover (D54). */\nexport const TOC_SCHEMA: TypeSchema = {\n name: \"tableOfContents\",\n title: TOC_LABEL,\n kind: \"object\",\n icon: \"list-tree\",\n fields: [\n { name: \"title\", title: \"Title\", type: \"string\", validation: { max: 40 } },\n {\n name: \"depth\",\n title: \"Headings\",\n type: \"select\",\n layout: \"segmented\",\n initialValue: \"3\",\n options: [\n { value: \"2\", label: \"H2\" },\n { value: \"3\", label: \"H2 and H3\" },\n ],\n },\n ],\n};\n\n/* ── Outline ───────────────────────────────────────────────────────── */\nexport interface OutlineItem {\n id: string;\n text: string;\n depth: 2 | 3;\n}\n/** V2 article.ts:250-251. ponytail: richtext's one slugify replaces this when it lands (plan RT5); it must stay equal. */\nexport const slugify = (s: string) =>\n s.toLowerCase().normalize(\"NFKD\").replace(/[̀-ͯ]/g, \"\").replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").slice(0, 60) || \"section\";\n\n/** The body's H2 and H3, top level only, in order, with stable de-duplicated ids. */\nexport function outlineOf(root: ParentNode): OutlineItem[] {\n const used = new Set<string>();\n const out: OutlineItem[] = [];\n root.querySelectorAll(\":scope > h2, :scope > h3\").forEach((h) => {\n const text = (h.textContent ?? \"\").replace(/​/g, \"\").trim();\n if (!text) return;\n let id = slugify(text);\n for (let n = 2; used.has(id); n++) id = `${slugify(text)}-${n}`;\n used.add(id);\n out.push({ id, text, depth: h.tagName === \"H2\" ? 2 : 3 });\n });\n return out;\n}\nexport const tocVisible = (outline: OutlineItem[], depth: TocModel[\"depth\"]) => outline.filter((o) => o.depth === 2 || depth === \"3\");\n\n/** One live outline per editor: the editor sets it after each input, every TOC preview subscribes. */\nexport interface OutlineStore {\n get: () => OutlineItem[];\n subscribe: (fn: () => void) => () => void;\n set: (next: OutlineItem[]) => void;\n}\nexport function createOutlineStore(): OutlineStore {\n let cur: OutlineItem[] = [];\n const subs = new Set<() => void>();\n return {\n get: () => cur,\n subscribe: (fn) => (subs.add(fn), () => void subs.delete(fn)),\n set: (next) => {\n if (JSON.stringify(next) === JSON.stringify(cur)) return;\n cur = next;\n subs.forEach((f) => f());\n },\n };\n}\nexport const NO_OUTLINE: OutlineStore = { get: () => [], subscribe: () => () => {}, set: () => {} };\n\n/* ── Preview (what the reader sees) ────────────────────────────────── */\n/** `host` is the TOC's island element; its parent is the editor surface whose headings it lists. */\nexport function TocPreview({ m, outline, host }: { m: TocModel; outline: OutlineStore; host: HTMLElement }) {\n const all = React.useSyncExternalStore(outline.subscribe, outline.get, outline.get);\n const items = tocVisible(all, m.depth);\n const go = (it: OutlineItem) => {\n const root = host.parentElement;\n if (!root) return;\n const hs = Array.from(root.querySelectorAll<HTMLElement>(\":scope > h2, :scope > h3\")).filter((h) => (h.textContent ?? \"\").replace(/​/g, \"\").trim());\n const h = hs[all.indexOf(it)];\n if (!h) return;\n h.scrollIntoView?.({ block: \"center\", behavior: \"smooth\" });\n root.focus({ preventScroll: true });\n placeCaret(h);\n };\n return (\n <nav aria-label={m.title || TOC_LABEL} className=\"rounded-kit-lg border border-kit-line bg-kit-surface px-4 py-3\">\n {m.title ? (\n <p data-field=\"title\" className=\"mb-1.5 text-kit-sm font-semibold text-kit-fg\">\n {m.title}\n </p>\n ) : null}\n {items.length ? (\n <ol className=\"m-0 flex list-none flex-col gap-0.5 p-0 text-kit-sm\">\n {items.map((it, i) => (\n <li key={`${it.id}-${i}`} className={cn(it.depth === 3 && \"pl-4\")}>\n <button type=\"button\" onClick={(e) => (e.stopPropagation(), go(it))} className=\"max-w-full truncate rounded-kit-sm text-left text-kit-fg-2 hover:text-kit-fg hover:underline\">\n {it.text}\n </button>\n </li>\n ))}\n </ol>\n ) : (\n <p className=\"text-kit-sm text-kit-fg-3\">No headings yet.</p>\n )}\n </nav>\n );\n}\n\n/* ── The block (V2 ArticleBlock, surface \"popover\") ────────────────── */\nexport interface TocBlockProps {\n m: TocModel;\n set: (fn: (m: TocModel) => TocModel, label?: string) => void;\n el: IslandEl;\n /** the editor's live outline rides the island context */\n ctx: IslandCtx & { outline?: OutlineStore };\n autoFocus: boolean;\n}\n\nexport function TocBlock({ m, set, el, ctx, autoFocus }: TocBlockProps) {\n return (\n <ArticlePopoverBlock<TocModel>\n label={TOC_LABEL}\n kind=\"toc\"\n schema={TOC_SCHEMA}\n m={m}\n set={set}\n el={el}\n ctx={ctx}\n autoFocus={autoFocus}\n openOnInsert={false}\n toForm={(x) => ({ title: x.title, depth: x.depth })}\n fromForm={(v) => ({ title: String(v.title ?? \"\"), depth: v.depth === \"2\" ? \"2\" : \"3\" })}\n >\n {() => <TocPreview m={m} outline={ctx.outline ?? NO_OUTLINE} host={el} />}\n </ArticlePopoverBlock>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,YAAY;AACzB,IAAa,oBAA8B;CAAE,OAAO;CAAmB,OAAO;AAAI;;AAGlF,IAAa,aAAyB;CACpC,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ,CACN;EAAE,MAAM;EAAS,OAAO;EAAS,MAAM;EAAU,YAAY,EAAE,KAAK,GAAG;CAAE,GACzE;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ;EACR,cAAc;EACd,SAAS,CACP;GAAE,OAAO;GAAK,OAAO;EAAK,GAC1B;GAAE,OAAO;GAAK,OAAO;EAAY,CACnC;CACF,CACF;AACF;;AASA,IAAa,WAAW,MACtB,EAAE,YAAY,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC,QAAQ,eAAe,GAAG,CAAC,CAAC,QAAQ,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,KAAK;;AAG9H,SAAgB,UAAU,MAAiC;CACzD,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,MAAqB,CAAC;CAC5B,KAAK,iBAAiB,0BAA0B,CAAC,CAAC,SAAS,MAAM;EAC/D,MAAM,QAAQ,EAAE,eAAe,GAAA,CAAI,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK;EAC1D,IAAI,CAAC,MAAM;EACX,IAAI,KAAK,QAAQ,IAAI;EACrB,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG;EAC5D,KAAK,IAAI,EAAE;EACX,IAAI,KAAK;GAAE;GAAI;GAAM,OAAO,EAAE,YAAY,OAAO,IAAI;EAAE,CAAC;CAC1D,CAAC;CACD,OAAO;AACT;AACA,IAAa,cAAc,SAAwB,UAA6B,QAAQ,QAAQ,MAAM,EAAE,UAAU,KAAK,UAAU,GAAG;AAQpI,SAAgB,qBAAmC;CACjD,IAAI,MAAqB,CAAC;CAC1B,MAAM,uBAAO,IAAI,IAAgB;CACjC,OAAO;EACL,WAAW;EACX,YAAY,QAAQ,KAAK,IAAI,EAAE,SAAS,KAAK,KAAK,OAAO,EAAE;EAC3D,MAAM,SAAS;GACb,IAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,GAAG,GAAG;GAClD,MAAM;GACN,KAAK,SAAS,MAAM,EAAE,CAAC;EACzB;CACF;AACF;AACA,IAAa,aAA2B;CAAE,WAAW,CAAC;CAAG,uBAAuB,CAAC;CAAG,WAAW,CAAC;AAAE;;AAIlG,SAAgB,WAAW,EAAE,GAAG,SAAS,QAAmE;CAC1G,MAAM,MAAM,MAAM,qBAAqB,QAAQ,WAAW,QAAQ,KAAK,QAAQ,GAAG;CAClF,MAAM,QAAQ,WAAW,KAAK,EAAE,KAAK;CACrC,MAAM,MAAM,OAAoB;EAC9B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MAAM;EAEX,MAAM,IADK,MAAM,KAAK,KAAK,iBAA8B,0BAA0B,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,eAAe,GAAA,CAAI,QAAQ,MAAM,EAAE,CAAC,CAAC,KAAK,CACvI,CAAA,CAAG,IAAI,QAAQ,EAAE;EAC3B,IAAI,CAAC,GAAG;EACR,EAAE,iBAAiB;GAAE,OAAO;GAAU,UAAU;EAAS,CAAC;EAC1D,KAAK,MAAM,EAAE,eAAe,KAAK,CAAC;EAClC,WAAW,CAAC;CACd;CACA,OACE,qBAAC,OAAD;EAAK,cAAY,EAAE,SAAA;EAAoB,WAAU;EAAjD,UAAA,CACG,EAAE,QACD,oBAAC,KAAD;GAAG,cAAW;GAAQ,WAAU;GAC7B,UAAA,EAAE;EACF,CAAA,IACD,MACH,MAAM,SACL,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,MAAM,KAAK,IAAI,MACd,oBAAC,MAAD;IAA0B,WAAW,GAAG,GAAG,UAAU,KAAK,MAAM;IAC9D,UAAA,oBAAC,UAAD;KAAQ,MAAK;KAAS,UAAU,OAAO,EAAE,gBAAgB,GAAG,GAAG,EAAE;KAAI,WAAU;KAC5E,UAAA,GAAG;IACE,CAAA;GACN,GAJK,GAAG,GAAG,GAAG,GAAG,GAIjB,CACL;EACC,CAAA,IAEJ,oBAAC,KAAD;GAAG,WAAU;GAA4B,UAAA;EAAmB,CAAA,CAE3D;;AAET;AAYA,SAAgB,SAAS,EAAE,GAAG,KAAK,IAAI,KAAK,aAA4B;CACtE,OACE,oBAAC,qBAAD;EACE,OAAO;EACP,MAAK;EACL,QAAQ;EACL;EACE;EACD;EACC;EACM;EACX,cAAc;EACd,SAAS,OAAO;GAAE,OAAO,EAAE;GAAO,OAAO,EAAE;EAAM;EACjD,WAAW,OAAO;GAAE,OAAO,OAAO,EAAE,SAAS,EAAE;GAAG,OAAO,EAAE,UAAU,MAAM,MAAM;EAAI;EAE9E,gBAAA,oBAAC,YAAD;GAAe;GAAG,SAAS,IAAI,WAAW;GAAY,MAAM;EAAK,CAAA;CACrD,CAAA;AAEzB"}
@@ -13,6 +13,8 @@ export interface Fmt {
13
13
  italic: boolean;
14
14
  underline: boolean;
15
15
  strike: boolean;
16
+ sup: boolean;
17
+ sub: boolean;
16
18
  ul: boolean;
17
19
  ol: boolean;
18
20
  /** lower-case tag of the caret's top-level block, or "island" */
@@ -21,7 +23,7 @@ export interface Fmt {
21
23
  onLink: boolean;
22
24
  }
23
25
  export declare const EMPTY_FMT: Fmt;
24
- export type MarkCmd = "bold" | "italic" | "underline" | "strikeThrough";
26
+ export type MarkCmd = "bold" | "italic" | "underline" | "strikeThrough" | "superscript" | "subscript";
25
27
  export declare const MARK_FEATURE: Record<MarkCmd, RichTextFeature>;
26
28
  export declare const STYLES: {
27
29
  tag: string;
@@ -36,7 +38,7 @@ export declare const stylesFor: (allows: (f: RichTextFeature) => boolean) => {
36
38
  short: string;
37
39
  icon: React.ReactNode;
38
40
  }[];
39
- export declare function ToolButton({ label, tip, icon, onClick, active, disabled, shortcut, children, className, }: {
41
+ export declare function ToolButton({ label, tip, icon, onClick, active, disabled, shortcut, children, className, side, }: {
40
42
  label: string;
41
43
  tip?: string;
42
44
  icon: React.ReactNode;
@@ -46,6 +48,8 @@ export declare function ToolButton({ label, tip, icon, onClick, active, disabled
46
48
  shortcut?: string;
47
49
  children?: React.ReactNode;
48
50
  className?: string;
51
+ /** The tooltip's side; the overlay's default (top) when omitted. */
52
+ side?: "top" | "bottom" | "left" | "right";
49
53
  }): import("react/jsx-runtime").JSX.Element;
50
54
  /** "Block style" dropdown. Compact trigger: Text / H1…H6 / Quote. */
51
55
  export declare function StyleMenu({ block, styles, onPick, onOpenChange, disabled, className, }: {
@@ -2,14 +2,16 @@ import { cn } from "../../lib/cn.js";
2
2
  import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
3
3
  import { InsertMenuContent } from "./catalog.js";
4
4
  import "react";
5
- import { IconArrowsMaximize, IconBlockquote, IconBold, IconCheck, IconChevronDown, IconClearFormatting, IconCode, IconH1, IconH2, IconH3, IconH4, IconH5, IconH6, IconItalic, IconLink, IconList, IconListNumbers, IconMarkdown, IconMarkdownOff, IconMessage, IconPilcrow, IconPlus, IconStrikethrough, IconTerminal2, IconUnderline } from "@tabler/icons-react";
6
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
- //#region src/kit/controls/rich-text/toolbar.tsx
6
+ import { IconArrowsMaximize, IconBlockquote, IconBold, IconCheck, IconChevronDown, IconClearFormatting, IconCode, IconH1, IconH2, IconH3, IconH4, IconH5, IconH6, IconItalic, IconLink, IconList, IconListNumbers, IconMarkdown, IconMarkdownOff, IconMessage, IconPilcrow, IconPlus, IconStrikethrough, IconTerminal2, IconUnderline } from "@tabler/icons-react";
7
+ //#region src/controls/rich-text/toolbar.tsx
8
8
  var EMPTY_FMT = {
9
9
  bold: false,
10
10
  italic: false,
11
11
  underline: false,
12
12
  strike: false,
13
+ sup: false,
14
+ sub: false,
13
15
  ul: false,
14
16
  ol: false,
15
17
  block: "p",
@@ -20,7 +22,9 @@ var MARK_FEATURE = {
20
22
  bold: "bold",
21
23
  italic: "italic",
22
24
  underline: "underline",
23
- strikeThrough: "strike"
25
+ strikeThrough: "strike",
26
+ superscript: "sup",
27
+ subscript: "sub"
24
28
  };
25
29
  var STYLES = [
26
30
  {
@@ -75,10 +79,11 @@ var STYLES = [
75
79
  /** The block styles a field accepts (Text always). */
76
80
  var stylesFor = (allows) => STYLES.filter((s) => s.tag === "p" || allows(s.tag));
77
81
  var keepCaret = (e) => e.preventDefault();
78
- function ToolButton({ label, tip, icon, onClick, active, disabled, shortcut, children, className }) {
82
+ function ToolButton({ label, tip, icon, onClick, active, disabled, shortcut, children, className, side }) {
79
83
  return /* @__PURE__ */ jsx(Tooltip, {
80
84
  content: tip ?? label,
81
85
  shortcut,
86
+ side,
82
87
  children: /* @__PURE__ */ jsxs("button", {
83
88
  type: "button",
84
89
  "aria-label": label,
@@ -155,7 +160,7 @@ function FormatToolbar({ open, sticky, stickyTop = 0, width, dense, fmt, md, all
155
160
  const markLabel = (m) => m === "underline" ? "Underline" : "Strikethrough";
156
161
  const more = foldUS && marks.length || foldLists && lists.length || foldClear || foldMd || allows("code") || allows("pre");
157
162
  return /* @__PURE__ */ jsx("div", {
158
- className: cn("overflow-clip rounded-t-kit-lg transition-[height] duration-150 ease-out", open ? "h-8 pointer-coarse:h-11" : "h-0", sticky && open && "sticky z-[4]"),
163
+ className: cn("overflow-clip rounded-t-kit-lg", open ? "h-8 pointer-coarse:h-11" : "h-0", sticky && open && "sticky z-[4]"),
159
164
  style: sticky && open ? { top: stickyTop } : void 0,
160
165
  inert: !open,
161
166
  "aria-hidden": !open,
@@ -165,7 +170,7 @@ function FormatToolbar({ open, sticky, stickyTop = 0, width, dense, fmt, md, all
165
170
  onMouseDown: (e) => {
166
171
  if (!e.target.closest("button")) e.preventDefault();
167
172
  },
168
- className: cn("flex h-full items-center gap-0.5 border-b border-kit-line bg-kit-subtle px-1 transition-opacity duration-[120ms] ease-out", open ? "opacity-100" : "opacity-0"),
173
+ className: cn("flex h-full items-center gap-0.5 border-b border-kit-line bg-kit-subtle px-1 transition-opacity duration-[120ms] ease-out motion-reduce:transition-none", open ? "opacity-100" : "opacity-0"),
169
174
  children: [
170
175
  styles.length > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(StyleMenu, {
171
176
  block: fmt.block,
@@ -333,6 +338,6 @@ function FormatToolbar({ open, sticky, stickyTop = 0, width, dense, fmt, md, all
333
338
  });
334
339
  }
335
340
  //#endregion
336
- export { EMPTY_FMT, FormatToolbar, MARK_FEATURE, StyleMenu, ToolButton, stylesFor };
341
+ export { EMPTY_FMT, FormatToolbar, MARK_FEATURE, STYLES, StyleMenu, ToolButton, stylesFor };
337
342
 
338
343
  //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","names":[],"sources":["../../../src/controls/rich-text/toolbar.tsx"],"sourcesContent":["/**\n * RICH TEXT · the field toolbar (V2 HEAD controls/rich-text/toolbar.tsx, production order):\n * Style ▾ | B I U S | • 1. | Link, Clear formatting, Comment | ▾ more | + Insert ····· Markdown · Open full editor\n * The overflow is a chevron next to the formatting, never a second \"⋯\" (the field's label row owns the one ⋯ menu).\n * It takes no room at rest (h-0, inert, aria-hidden) and slides open to 32px when the field is in use. Items fold into\n * \"More formatting options\" as the field narrows. A control whose element the field does not accept is not drawn.\n */\nimport * as React from \"react\";\nimport {\n IconArrowsMaximize, IconBlockquote, IconBold, IconCheck, IconChevronDown, IconClearFormatting, IconCode, IconH1, IconH2, IconH3, IconH4, IconH5,\n IconH6, IconItalic, IconLink, IconList, IconListNumbers, IconMarkdown, IconMarkdownOff, IconMessage, IconPilcrow, IconPlus, IconStrikethrough,\n IconTerminal2, IconUnderline,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../lib/cn\";\nimport { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverTrigger, Tooltip } from \"../../ui/overlay\";\nimport { InsertMenuContent, type CatalogItem } from \"./catalog\";\nimport type { RichTextFeature } from \"./codec\";\n\nexport interface Fmt {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n sup: boolean;\n sub: boolean;\n ul: boolean;\n ol: boolean;\n /** lower-case tag of the caret's top-level block, or \"island\" */\n block: string;\n hasSel: boolean;\n onLink: boolean;\n}\nexport const EMPTY_FMT: Fmt = { bold: false, italic: false, underline: false, strike: false, sup: false, sub: false, ul: false, ol: false, block: \"p\", hasSel: false, onLink: false };\n\nexport type MarkCmd = \"bold\" | \"italic\" | \"underline\" | \"strikeThrough\" | \"superscript\" | \"subscript\";\nexport const MARK_FEATURE: Record<MarkCmd, RichTextFeature> = { bold: \"bold\", italic: \"italic\", underline: \"underline\", strikeThrough: \"strike\", superscript: \"sup\", subscript: \"sub\" };\n\nexport const STYLES: { tag: string; label: string; short: string; icon: React.ReactNode }[] = [\n { tag: \"p\", label: \"Text\", short: \"Text\", icon: <IconPilcrow stroke={1.5} /> },\n { tag: \"h1\", label: \"Heading 1\", short: \"H1\", icon: <IconH1 stroke={1.5} /> },\n { tag: \"h2\", label: \"Heading 2\", short: \"H2\", icon: <IconH2 stroke={1.5} /> },\n { tag: \"h3\", label: \"Heading 3\", short: \"H3\", icon: <IconH3 stroke={1.5} /> },\n { tag: \"h4\", label: \"Heading 4\", short: \"H4\", icon: <IconH4 stroke={1.5} /> },\n { tag: \"h5\", label: \"Heading 5\", short: \"H5\", icon: <IconH5 stroke={1.5} /> },\n { tag: \"h6\", label: \"Heading 6\", short: \"H6\", icon: <IconH6 stroke={1.5} /> },\n { tag: \"blockquote\", label: \"Quote\", short: \"Quote\", icon: <IconBlockquote stroke={1.5} /> },\n];\n/** The block styles a field accepts (Text always). */\nexport const stylesFor = (allows: (f: RichTextFeature) => boolean) => STYLES.filter((s) => s.tag === \"p\" || allows(s.tag as RichTextFeature));\n\nconst keepCaret = (e: React.MouseEvent) => e.preventDefault();\n\nexport function ToolButton({\n label,\n tip,\n icon,\n onClick,\n active,\n disabled,\n shortcut,\n children,\n className,\n side,\n}: {\n label: string;\n tip?: string;\n icon: React.ReactNode;\n onClick?: () => void;\n active?: boolean;\n disabled?: boolean;\n shortcut?: string;\n children?: React.ReactNode;\n className?: string;\n /** The tooltip's side; the overlay's default (top) when omitted. */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}) {\n return (\n <Tooltip content={tip ?? label} shortcut={shortcut} side={side}>\n <button\n type=\"button\"\n aria-label={label}\n aria-pressed={active}\n aria-disabled={disabled || undefined}\n onMouseDown={keepCaret}\n onClick={() => !disabled && onClick?.()}\n className={cn(\n \"flex h-7 min-w-7 shrink-0 items-center justify-center gap-1 rounded-kit-md px-1.5 text-kit-sm text-kit-fg-2 transition-colors hover:bg-kit-hover hover:text-kit-fg [&_svg]:size-4\",\n active && \"bg-kit-selected text-kit-fg\",\n disabled && \"opacity-40 hover:bg-transparent hover:text-kit-fg-2\",\n className,\n )}\n >\n {icon}\n {children}\n </button>\n </Tooltip>\n );\n}\n\n/** \"Block style\" dropdown. Compact trigger: Text / H1…H6 / Quote. */\nexport function StyleMenu({\n block,\n styles,\n onPick,\n onOpenChange,\n disabled,\n className,\n}: {\n block: string;\n styles: typeof STYLES;\n onPick: (tag: string) => void;\n onOpenChange?: (o: boolean) => void;\n disabled?: boolean;\n className?: string;\n}) {\n const cur = STYLES.find((s) => s.tag === block);\n return (\n <Menu onOpenChange={onOpenChange}>\n <Tooltip content=\"Block style\">\n <MenuTrigger\n disabled={disabled}\n aria-label=\"Block style\"\n onMouseDown={keepCaret}\n className={cn(\n \"flex h-7 shrink-0 items-center gap-1 rounded-kit-md pl-2 pr-1.5 text-kit-sm font-medium text-kit-fg hover:bg-kit-hover disabled:opacity-40 data-[popup-open]:bg-kit-hover\",\n !cur && \"text-kit-fg-2\",\n className,\n )}\n >\n {cur?.short ?? \"Text\"}\n <IconChevronDown className=\"size-3.5 text-kit-fg-3\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n </Tooltip>\n <MenuContent className=\"w-48\" finalFocus={false}>\n {styles.map((s) => (\n <MenuItem key={s.tag} icon={s.icon} onClick={() => onPick(s.tag)}>\n <span className=\"flex w-full items-center justify-between\">\n {s.label}\n {block === s.tag ? <IconCheck className=\"size-3.5 text-kit-fg-2\" stroke={2} aria-hidden /> : null}\n </span>\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n );\n}\n\nconst Sep = () => <span aria-hidden className=\"mx-1 h-4 w-px shrink-0 bg-kit-line\" />;\n\nexport function FormatToolbar({\n open,\n sticky,\n stickyTop = 0,\n width,\n dense,\n fmt,\n md,\n allows,\n hideFullscreen,\n insertOpen,\n setInsertOpen,\n onMenuOpen,\n onStyle,\n onMark,\n onList,\n onLink,\n onClear,\n onComment,\n onInlineCode,\n onCodeBlock,\n onInsert,\n keepFocusOnInsertClose,\n onFullscreen,\n onMarkdown,\n saveSel,\n}: {\n open: boolean;\n sticky: boolean;\n stickyTop?: number;\n width: number;\n dense: boolean;\n fmt: Fmt;\n md: boolean;\n allows: (f: RichTextFeature) => boolean;\n hideFullscreen?: boolean;\n insertOpen: boolean;\n setInsertOpen: (o: boolean) => void;\n onMenuOpen: (name: \"style\" | \"more\", o: boolean) => void;\n onStyle: (tag: string) => void;\n onMark: (cmd: MarkCmd) => void;\n onList: (kind: \"ul\" | \"ol\") => void;\n onLink: () => void;\n onClear: () => void;\n onComment?: () => void;\n onInlineCode: () => void;\n onCodeBlock: () => void;\n onInsert: (it: CatalogItem) => void;\n keepFocusOnInsertClose: () => boolean;\n onFullscreen: () => void;\n onMarkdown: () => void;\n saveSel: () => void;\n}) {\n const w = width - (dense ? 40 : 0);\n const foldUS = w < 430;\n const foldLists = w < 480;\n const foldMd = w < 400;\n const foldClear = w < 360;\n const insertLabel = w >= 590;\n const off = md;\n const styles = stylesFor(allows);\n const marks = ([\"underline\", \"strikeThrough\"] as const).filter((m) => allows(MARK_FEATURE[m]));\n const lists = ([\"ul\", \"ol\"] as const).filter((l) => allows(l));\n const linkTip = fmt.hasSel || fmt.onLink ? \"Link\" : \"Link (select some text first)\";\n const commentTip = fmt.hasSel ? \"Comment\" : \"Comment (select some text first)\";\n const check = (on: boolean) => (on ? <IconCheck className=\"ml-auto size-3.5 text-kit-fg-2\" stroke={2} aria-hidden /> : null);\n const listIcon = (l: \"ul\" | \"ol\") => (l === \"ul\" ? <IconList stroke={1.5} /> : <IconListNumbers stroke={1.5} />);\n const listLabel = (l: \"ul\" | \"ol\") => (l === \"ul\" ? \"Bulleted list\" : \"Numbered list\");\n const markIcon = (m: \"underline\" | \"strikeThrough\") => (m === \"underline\" ? <IconUnderline stroke={1.5} /> : <IconStrikethrough stroke={1.5} />);\n const markLabel = (m: \"underline\" | \"strikeThrough\") => (m === \"underline\" ? \"Underline\" : \"Strikethrough\");\n const more = (foldUS && marks.length) || (foldLists && lists.length) || foldClear || foldMd || allows(\"code\") || allows(\"pre\");\n\n return (\n <div\n // Opens at once: it shows on every focus of the body, and a height animation is layout work every frame.\n className={cn(\"overflow-clip rounded-t-kit-lg\", open ? \"h-8 pointer-coarse:h-11\" : \"h-0\", sticky && open && \"sticky z-[4]\")}\n style={sticky && open ? { top: stickyTop } : undefined}\n inert={!open}\n aria-hidden={!open}\n >\n <div\n role=\"toolbar\"\n aria-label=\"Text formatting\"\n onMouseDown={(e) => {\n if (!(e.target as HTMLElement).closest(\"button\")) e.preventDefault();\n }}\n className={cn(\"flex h-full items-center gap-0.5 border-b border-kit-line bg-kit-subtle px-1 transition-opacity duration-[120ms] ease-out motion-reduce:transition-none\", open ? \"opacity-100\" : \"opacity-0\")}\n >\n {styles.length > 1 ? (\n <>\n <StyleMenu block={fmt.block} styles={styles} onPick={onStyle} disabled={off} onOpenChange={(o) => onMenuOpen(\"style\", o)} />\n <Sep />\n </>\n ) : null}\n {allows(\"bold\") ? <ToolButton label=\"Bold\" icon={<IconBold stroke={1.5} />} shortcut=\"⌘B\" active={fmt.bold} disabled={off} onClick={() => onMark(\"bold\")} /> : null}\n {allows(\"italic\") ? <ToolButton label=\"Italic\" icon={<IconItalic stroke={1.5} />} shortcut=\"⌘I\" active={fmt.italic} disabled={off} onClick={() => onMark(\"italic\")} /> : null}\n {foldUS\n ? null\n : marks.map((m) => (\n <ToolButton key={m} label={markLabel(m)} icon={markIcon(m)} shortcut={m === \"underline\" ? \"⌘U\" : undefined} active={m === \"underline\" ? fmt.underline : fmt.strike} disabled={off} onClick={() => onMark(m)} />\n ))}\n {foldLists || !lists.length ? null : (\n <>\n <Sep />\n {lists.map((l) => (\n <ToolButton key={l} label={listLabel(l)} icon={listIcon(l)} active={fmt[l]} disabled={off} onClick={() => onList(l)} />\n ))}\n </>\n )}\n <Sep />\n {allows(\"link\") ? (\n <ToolButton label=\"Link\" tip={linkTip} icon={<IconLink stroke={1.5} />} shortcut={fmt.hasSel || fmt.onLink ? \"⌘K\" : undefined} active={fmt.onLink} disabled={off || !(fmt.hasSel || fmt.onLink)} onClick={onLink} />\n ) : null}\n {foldClear ? null : <ToolButton label=\"Clear formatting\" icon={<IconClearFormatting stroke={1.5} />} disabled={off} onClick={onClear} />}\n {onComment ? <ToolButton label=\"Comment\" tip={commentTip} icon={<IconMessage stroke={1.5} />} disabled={off || !fmt.hasSel} onClick={onComment} /> : null}\n {more ? (\n <Menu onOpenChange={(o) => onMenuOpen(\"more\", o)}>\n <Tooltip content=\"More formatting\">\n <MenuTrigger\n aria-label=\"More formatting options\"\n onMouseDown={(e) => {\n e.preventDefault();\n saveSel();\n }}\n className=\"flex h-7 w-5 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 data-[popup-open]:text-kit-fg [&_svg]:size-3.5\"\n >\n <IconChevronDown stroke={1.5} aria-hidden />\n </MenuTrigger>\n </Tooltip>\n <MenuContent align=\"start\" className=\"w-56\" finalFocus={false}>\n {foldUS\n ? marks.map((m) => (\n <MenuItem key={m} disabled={off} icon={markIcon(m)} shortcut={m === \"underline\" ? \"⌘U\" : undefined} onClick={() => onMark(m)}>\n <span className=\"flex w-full items-center\">\n {markLabel(m)}\n {check(m === \"underline\" ? fmt.underline : fmt.strike)}\n </span>\n </MenuItem>\n ))\n : null}\n {foldLists\n ? lists.map((l) => (\n <MenuItem key={l} disabled={off} icon={listIcon(l)} onClick={() => onList(l)}>\n {listLabel(l)}\n </MenuItem>\n ))\n : null}\n {foldClear ? (\n <MenuItem disabled={off} icon={<IconClearFormatting stroke={1.5} />} onClick={onClear}>\n Clear formatting\n </MenuItem>\n ) : null}\n {foldMd ? (\n <MenuItem icon={md ? <IconMarkdownOff stroke={1.5} /> : <IconMarkdown stroke={1.5} />} onClick={onMarkdown}>\n {md ? \"Return to rich text\" : \"View and edit as Markdown\"}\n </MenuItem>\n ) : null}\n {(foldUS && marks.length) || (foldLists && lists.length) || foldClear || foldMd ? <MenuSeparator /> : null}\n {allows(\"code\") ? (\n <MenuItem disabled={off} icon={<IconCode stroke={1.5} />} shortcut=\"⌘E\" onClick={onInlineCode}>\n Inline code\n </MenuItem>\n ) : null}\n {allows(\"pre\") ? (\n <MenuItem disabled={off} icon={<IconTerminal2 stroke={1.5} />} onClick={onCodeBlock}>\n Code\n </MenuItem>\n ) : null}\n </MenuContent>\n </Menu>\n ) : null}\n <Sep />\n <Popover open={insertOpen} onOpenChange={setInsertOpen}>\n <Tooltip content=\"Insert a block\">\n <PopoverTrigger\n disabled={off}\n aria-label=\"Insert\"\n onMouseDown={() => saveSel()}\n className=\"flex h-7 shrink-0 items-center gap-1 rounded-kit-md px-1.5 text-kit-sm text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg disabled:opacity-40 data-[popup-open]:bg-kit-hover data-[popup-open]:text-kit-fg [&_svg]:size-4\"\n >\n <IconPlus stroke={1.5} aria-hidden />\n {insertLabel ? \"Insert\" : null}\n </PopoverTrigger>\n </Tooltip>\n {insertOpen ? <InsertMenuContent allows={allows} onInsert={onInsert} keepFocusOnClose={keepFocusOnInsertClose} /> : null}\n </Popover>\n\n <span className=\"min-w-1 flex-1\" />\n\n {foldMd ? null : (\n <ToolButton label={md ? \"Return to rich text\" : \"View and edit as Markdown\"} icon={md ? <IconMarkdownOff stroke={1.5} /> : <IconMarkdown stroke={1.5} />} active={md} onClick={onMarkdown} />\n )}\n {hideFullscreen ? null : <ToolButton label=\"Expand editor\" icon={<IconArrowsMaximize stroke={1.5} />} shortcut=\"⌘↵\" onClick={onFullscreen} />}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}