@bettercms-ai/kit 0.1.1 → 2.0.0

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 (1100) hide show
  1. package/README.md +22 -16
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/adapters/dock-values.d.ts +28 -0
  4. package/dist/adapters/dock-values.js +41 -0
  5. package/dist/adapters/dock-values.js.map +1 -0
  6. package/dist/adapters/icons.d.ts +15 -0
  7. package/dist/adapters/icons.js +27 -0
  8. package/dist/adapters/icons.js.map +1 -0
  9. package/dist/adapters/lossy.d.ts +326 -0
  10. package/dist/adapters/lossy.js +414 -0
  11. package/dist/adapters/lossy.js.map +1 -0
  12. package/dist/adapters/prod-types.d.ts +546 -0
  13. package/dist/adapters/prod-types.js +714 -0
  14. package/dist/adapters/prod-types.js.map +1 -0
  15. package/dist/adapters/schema.d.ts +154 -0
  16. package/dist/adapters/schema.js +3020 -0
  17. package/dist/adapters/schema.js.map +1 -0
  18. package/dist/adapters/values.d.ts +221 -0
  19. package/dist/adapters/values.js +623 -0
  20. package/dist/adapters/values.js.map +1 -0
  21. package/dist/brand/logo.d.ts +17 -0
  22. package/dist/brand/logo.js +96 -0
  23. package/dist/brand/logo.js.map +1 -0
  24. package/dist/context.d.ts +359 -0
  25. package/dist/context.js +217 -0
  26. package/dist/context.js.map +1 -0
  27. package/dist/controls/button.d.ts +72 -0
  28. package/dist/controls/button.js +578 -0
  29. package/dist/controls/button.js.map +1 -0
  30. package/dist/controls/c1.d.ts +11 -0
  31. package/dist/controls/c1.js +24 -0
  32. package/dist/controls/c1.js.map +1 -0
  33. package/dist/controls/c2.d.ts +10 -0
  34. package/dist/controls/c2.js +19 -0
  35. package/dist/controls/c2.js.map +1 -0
  36. package/dist/controls/choice.d.ts +44 -0
  37. package/dist/controls/choice.js +463 -0
  38. package/dist/controls/choice.js.map +1 -0
  39. package/dist/controls/code-register.d.ts +1 -0
  40. package/dist/controls/code-register.js +8 -0
  41. package/dist/controls/code-register.js.map +1 -0
  42. package/dist/controls/code.d.ts +42 -0
  43. package/dist/controls/code.js +397 -0
  44. package/dist/controls/code.js.map +1 -0
  45. package/dist/controls/color.d.ts +5 -0
  46. package/dist/controls/color.js +130 -0
  47. package/dist/controls/color.js.map +1 -0
  48. package/dist/controls/component-services.d.ts +156 -0
  49. package/dist/controls/component-services.js +7 -0
  50. package/dist/controls/component-services.js.map +1 -0
  51. package/dist/controls/date-register.d.ts +1 -0
  52. package/dist/controls/date-register.js +9 -0
  53. package/dist/controls/date-register.js.map +1 -0
  54. package/dist/controls/date-zone.d.ts +104 -0
  55. package/dist/controls/date-zone.js +278 -0
  56. package/dist/controls/date-zone.js.map +1 -0
  57. package/dist/controls/date.d.ts +7 -0
  58. package/dist/controls/date.js +466 -0
  59. package/dist/controls/date.js.map +1 -0
  60. package/dist/controls/form-picker-register.d.ts +1 -0
  61. package/dist/controls/form-picker-register.js +19 -0
  62. package/dist/controls/form-picker-register.js.map +1 -0
  63. package/dist/controls/form-picker.d.ts +43 -0
  64. package/dist/controls/form-picker.js +85 -0
  65. package/dist/controls/form-picker.js.map +1 -0
  66. package/dist/controls/icon-register.d.ts +1 -0
  67. package/dist/controls/icon-register.js +8 -0
  68. package/dist/controls/icon-register.js.map +1 -0
  69. package/dist/controls/icon.d.ts +40 -0
  70. package/dist/controls/icon.js +360 -0
  71. package/dist/controls/icon.js.map +1 -0
  72. package/dist/controls/index.d.ts +5 -0
  73. package/dist/controls/index.js +38 -0
  74. package/dist/controls/index.js.map +1 -0
  75. package/dist/controls/json-register.d.ts +1 -0
  76. package/dist/controls/json-register.js +8 -0
  77. package/dist/controls/json-register.js.map +1 -0
  78. package/dist/controls/json.d.ts +2 -0
  79. package/dist/controls/json.js +82 -0
  80. package/dist/controls/json.js.map +1 -0
  81. package/dist/controls/link.d.ts +260 -0
  82. package/dist/controls/link.js +1186 -0
  83. package/dist/controls/link.js.map +1 -0
  84. package/dist/controls/location-register.d.ts +1 -0
  85. package/dist/controls/location-register.js +8 -0
  86. package/dist/controls/location-register.js.map +1 -0
  87. package/dist/controls/location.d.ts +16 -0
  88. package/dist/controls/location.js +221 -0
  89. package/dist/controls/location.js.map +1 -0
  90. package/dist/controls/media-register.d.ts +1 -0
  91. package/dist/controls/media-register.js +12 -0
  92. package/dist/controls/media-register.js.map +1 -0
  93. package/dist/controls/media-services.d.ts +46 -0
  94. package/dist/controls/media-services.js +0 -0
  95. package/dist/controls/media.d.ts +104 -0
  96. package/dist/controls/media.js +1396 -0
  97. package/dist/controls/media.js.map +1 -0
  98. package/dist/controls/number.d.ts +22 -0
  99. package/dist/controls/number.js +196 -0
  100. package/dist/controls/number.js.map +1 -0
  101. package/dist/controls/reference-register.d.ts +1 -0
  102. package/dist/controls/reference-register.js +10 -0
  103. package/dist/controls/reference-register.js.map +1 -0
  104. package/dist/controls/reference-services.d.ts +58 -0
  105. package/dist/controls/reference-services.js +0 -0
  106. package/dist/controls/reference.d.ts +23 -0
  107. package/dist/controls/reference.js +777 -0
  108. package/dist/controls/reference.js.map +1 -0
  109. package/dist/controls/rich-text/blocks.d.ts +49 -0
  110. package/dist/controls/rich-text/blocks.js +1859 -0
  111. package/dist/controls/rich-text/blocks.js.map +1 -0
  112. package/dist/controls/rich-text/catalog.d.ts +101 -0
  113. package/dist/controls/rich-text/catalog.js +623 -0
  114. package/dist/controls/rich-text/catalog.js.map +1 -0
  115. package/dist/controls/rich-text/codec.d.ts +64 -0
  116. package/dist/controls/rich-text/codec.js +34 -0
  117. package/dist/controls/rich-text/codec.js.map +1 -0
  118. package/dist/controls/rich-text/component-card.d.ts +14 -0
  119. package/dist/controls/rich-text/component-card.js +1024 -0
  120. package/dist/controls/rich-text/component-card.js.map +1 -0
  121. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  122. package/dist/controls/rich-text/component-panel.js +141 -0
  123. package/dist/controls/rich-text/component-panel.js.map +1 -0
  124. package/dist/controls/rich-text/control.d.ts +20 -0
  125. package/dist/controls/rich-text/control.js +296 -0
  126. package/dist/controls/rich-text/control.js.map +1 -0
  127. package/dist/controls/rich-text/dom.d.ts +233 -0
  128. package/dist/controls/rich-text/dom.js +1019 -0
  129. package/dist/controls/rich-text/dom.js.map +1 -0
  130. package/dist/controls/rich-text/editor.d.ts +57 -0
  131. package/dist/controls/rich-text/editor.js +1630 -0
  132. package/dist/controls/rich-text/editor.js.map +1 -0
  133. package/dist/controls/rich-text/floating.d.ts +28 -0
  134. package/dist/controls/rich-text/floating.js +154 -0
  135. package/dist/controls/rich-text/floating.js.map +1 -0
  136. package/dist/controls/rich-text/index.d.ts +1 -0
  137. package/dist/controls/rich-text/index.js +12 -0
  138. package/dist/controls/rich-text/index.js.map +1 -0
  139. package/dist/controls/rich-text/link-form.d.ts +13 -0
  140. package/dist/controls/rich-text/link-form.js +147 -0
  141. package/dist/controls/rich-text/link-form.js.map +1 -0
  142. package/dist/controls/rich-text/markdown.d.ts +6 -0
  143. package/dist/controls/rich-text/markdown.js +181 -0
  144. package/dist/controls/rich-text/markdown.js.map +1 -0
  145. package/dist/controls/rich-text/ops.d.ts +35 -0
  146. package/dist/controls/rich-text/ops.js +316 -0
  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/toolbar.d.ts +89 -0
  152. package/dist/controls/rich-text/toolbar.js +343 -0
  153. package/dist/controls/rich-text/toolbar.js.map +1 -0
  154. package/dist/controls/scale.d.ts +56 -0
  155. package/dist/controls/scale.js +563 -0
  156. package/dist/controls/scale.js.map +1 -0
  157. package/dist/controls/slot-register.d.ts +1 -0
  158. package/dist/controls/slot-register.js +16 -0
  159. package/dist/controls/slot-register.js.map +1 -0
  160. package/dist/controls/slot-services.d.ts +122 -0
  161. package/dist/controls/slot-services.js +155 -0
  162. package/dist/controls/slot-services.js.map +1 -0
  163. package/dist/controls/slot.d.ts +33 -0
  164. package/dist/controls/slot.js +366 -0
  165. package/dist/controls/slot.js.map +1 -0
  166. package/dist/controls/table/index.d.ts +1 -0
  167. package/dist/controls/table/index.js +12 -0
  168. package/dist/controls/table/index.js.map +1 -0
  169. package/dist/controls/table/prod.d.ts +21 -0
  170. package/dist/controls/table/prod.js +79 -0
  171. package/dist/controls/table/prod.js.map +1 -0
  172. package/dist/controls/table/refs.d.ts +50 -0
  173. package/dist/controls/table/refs.js +79 -0
  174. package/dist/controls/table/refs.js.map +1 -0
  175. package/dist/controls/table/stored.d.ts +15 -0
  176. package/dist/controls/table/stored.js +44 -0
  177. package/dist/controls/table/stored.js.map +1 -0
  178. package/dist/controls/table/table-editor.d.ts +103 -0
  179. package/dist/controls/table/table-editor.js +2725 -0
  180. package/dist/controls/table/table-editor.js.map +1 -0
  181. package/dist/controls/table/table-link.d.ts +24 -0
  182. package/dist/controls/table/table-link.js +180 -0
  183. package/dist/controls/table/table-link.js.map +1 -0
  184. package/dist/controls/table/table.d.ts +9 -0
  185. package/dist/controls/table/table.js +103 -0
  186. package/dist/controls/table/table.js.map +1 -0
  187. package/dist/controls/text.d.ts +17 -0
  188. package/dist/controls/text.js +322 -0
  189. package/dist/controls/text.js.map +1 -0
  190. package/dist/controls/unknown-value.d.ts +17 -0
  191. package/dist/controls/unknown-value.js +66 -0
  192. package/dist/controls/unknown-value.js.map +1 -0
  193. package/dist/core/core.d.ts +63 -0
  194. package/dist/core/core.js +171 -0
  195. package/dist/core/core.js.map +1 -0
  196. package/dist/core/facets.d.ts +347 -0
  197. package/dist/core/facets.js +334 -0
  198. package/dist/core/facets.js.map +1 -0
  199. package/dist/core/index.d.ts +3 -0
  200. package/dist/core/index.js +3 -0
  201. package/dist/engine/array.d.ts +101 -0
  202. package/dist/engine/array.js +906 -0
  203. package/dist/engine/array.js.map +1 -0
  204. package/dist/engine/bits.d.ts +24 -0
  205. package/dist/engine/bits.js +60 -0
  206. package/dist/engine/bits.js.map +1 -0
  207. package/dist/engine/breadcrumb.d.ts +45 -0
  208. package/dist/engine/breadcrumb.js +63 -0
  209. package/dist/engine/breadcrumb.js.map +1 -0
  210. package/dist/engine/expand.d.ts +66 -0
  211. package/dist/engine/expand.js +153 -0
  212. package/dist/engine/expand.js.map +1 -0
  213. package/dist/engine/field-list.d.ts +20 -0
  214. package/dist/engine/field-list.js +19 -0
  215. package/dist/engine/field-list.js.map +1 -0
  216. package/dist/engine/field-shell.d.ts +49 -0
  217. package/dist/engine/field-shell.js +988 -0
  218. package/dist/engine/field-shell.js.map +1 -0
  219. package/dist/engine/frame.d.ts +122 -0
  220. package/dist/engine/frame.js +601 -0
  221. package/dist/engine/frame.js.map +1 -0
  222. package/dist/engine/group-summary.d.ts +5 -0
  223. package/dist/engine/group-summary.js +70 -0
  224. package/dist/engine/group-summary.js.map +1 -0
  225. package/dist/engine/grouping.d.ts +238 -0
  226. package/dist/engine/grouping.js +996 -0
  227. package/dist/engine/grouping.js.map +1 -0
  228. package/dist/engine/item-list.d.ts +99 -0
  229. package/dist/engine/item-list.js +725 -0
  230. package/dist/engine/item-list.js.map +1 -0
  231. package/dist/engine/kit-field.d.ts +72 -0
  232. package/dist/engine/kit-field.js +558 -0
  233. package/dist/engine/kit-field.js.map +1 -0
  234. package/dist/engine/schema-form.d.ts +116 -0
  235. package/dist/engine/schema-form.js +462 -0
  236. package/dist/engine/schema-form.js.map +1 -0
  237. package/dist/engine/slot.d.ts +13 -0
  238. package/dist/engine/slot.js +216 -0
  239. package/dist/engine/slot.js.map +1 -0
  240. package/dist/index.d.ts +45 -3139
  241. package/dist/index.js +47 -2036
  242. package/dist/index.js.map +1 -0
  243. package/dist/kit.css +75 -0
  244. package/dist/lib/cn.d.ts +4 -0
  245. package/dist/lib/cn.js +56 -0
  246. package/dist/lib/cn.js.map +1 -0
  247. package/dist/lib/columns.d.ts +14 -0
  248. package/dist/lib/columns.js +30 -0
  249. package/dist/lib/columns.js.map +1 -0
  250. package/dist/lib/frames.d.ts +36 -0
  251. package/dist/lib/frames.js +214 -0
  252. package/dist/lib/frames.js.map +1 -0
  253. package/dist/lib/icon-image.d.ts +10 -0
  254. package/dist/lib/icon-image.js +8 -0
  255. package/dist/lib/icon-image.js.map +1 -0
  256. package/dist/lib/icons.d.ts +16 -0
  257. package/dist/lib/icons.js +173 -0
  258. package/dist/lib/icons.js.map +1 -0
  259. package/dist/lib/input-modality.d.ts +11 -0
  260. package/dist/lib/input-modality.js +47 -0
  261. package/dist/lib/input-modality.js.map +1 -0
  262. package/dist/lib/key-event.d.ts +11 -0
  263. package/dist/lib/key-event.js +16 -0
  264. package/dist/lib/key-event.js.map +1 -0
  265. package/dist/lib/path.d.ts +29 -0
  266. package/dist/lib/path.js +66 -0
  267. package/dist/lib/path.js.map +1 -0
  268. package/dist/lib/schema.d.ts +80 -0
  269. package/dist/lib/schema.js +384 -0
  270. package/dist/lib/schema.js.map +1 -0
  271. package/dist/lib/utils.d.ts +7 -0
  272. package/dist/lib/utils.js +37 -0
  273. package/dist/lib/utils.js.map +1 -0
  274. package/dist/lib/validate.d.ts +30 -0
  275. package/dist/lib/validate.js +224 -0
  276. package/dist/lib/validate.js.map +1 -0
  277. package/dist/library/analysis.d.ts +23 -0
  278. package/dist/library/analysis.js +160 -0
  279. package/dist/library/analysis.js.map +1 -0
  280. package/dist/library/catalog.d.ts +57 -0
  281. package/dist/library/catalog.js +307 -0
  282. package/dist/library/catalog.js.map +1 -0
  283. package/dist/library/coreNotes.d.ts +8 -0
  284. package/dist/library/coreNotes.js +111 -0
  285. package/dist/library/coreNotes.js.map +1 -0
  286. package/dist/library/coverage.d.ts +40 -0
  287. package/dist/library/coverage.js +59 -0
  288. package/dist/library/coverage.js.map +1 -0
  289. package/dist/library/entries/advanced.entries.d.ts +2 -0
  290. package/dist/library/entries/advanced.entries.js +6579 -0
  291. package/dist/library/entries/advanced.entries.js.map +1 -0
  292. package/dist/library/entries/commerce.entries.d.ts +2 -0
  293. package/dist/library/entries/commerce.entries.js +4140 -0
  294. package/dist/library/entries/commerce.entries.js.map +1 -0
  295. package/dist/library/entries/company.entries.d.ts +2 -0
  296. package/dist/library/entries/company.entries.js +2731 -0
  297. package/dist/library/entries/company.entries.js.map +1 -0
  298. package/dist/library/entries/conversion.entries.d.ts +2 -0
  299. package/dist/library/entries/conversion.entries.js +3707 -0
  300. package/dist/library/entries/conversion.entries.js.map +1 -0
  301. package/dist/library/entries/data.entries.d.ts +7 -0
  302. package/dist/library/entries/data.entries.js +4613 -0
  303. package/dist/library/entries/data.entries.js.map +1 -0
  304. package/dist/library/entries/events.entries.d.ts +2 -0
  305. package/dist/library/entries/events.entries.js +3428 -0
  306. package/dist/library/entries/events.entries.js.map +1 -0
  307. package/dist/library/entries/features.entries.d.ts +2 -0
  308. package/dist/library/entries/features.entries.js +3157 -0
  309. package/dist/library/entries/features.entries.js.map +1 -0
  310. package/dist/library/entries/heroes.entries.d.ts +2 -0
  311. package/dist/library/entries/heroes.entries.js +3401 -0
  312. package/dist/library/entries/heroes.entries.js.map +1 -0
  313. package/dist/library/entries/index.d.ts +3 -0
  314. package/dist/library/entries/index.js +35 -0
  315. package/dist/library/entries/index.js.map +1 -0
  316. package/dist/library/entries/listings.entries.d.ts +2 -0
  317. package/dist/library/entries/listings.entries.js +2976 -0
  318. package/dist/library/entries/listings.entries.js.map +1 -0
  319. package/dist/library/entries/longform.entries.d.ts +2 -0
  320. package/dist/library/entries/longform.entries.js +4227 -0
  321. package/dist/library/entries/longform.entries.js.map +1 -0
  322. package/dist/library/entries/media.entries.d.ts +2 -0
  323. package/dist/library/entries/media.entries.js +2781 -0
  324. package/dist/library/entries/media.entries.js.map +1 -0
  325. package/dist/library/entries/navigation.entries.d.ts +2 -0
  326. package/dist/library/entries/navigation.entries.js +4011 -0
  327. package/dist/library/entries/navigation.entries.js.map +1 -0
  328. package/dist/library/entries/pricing.entries.d.ts +2 -0
  329. package/dist/library/entries/pricing.entries.js +2383 -0
  330. package/dist/library/entries/pricing.entries.js.map +1 -0
  331. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  332. package/dist/library/entries/social-proof.entries.js +2297 -0
  333. package/dist/library/entries/social-proof.entries.js.map +1 -0
  334. package/dist/library/examples/bento.d.ts +92 -0
  335. package/dist/library/examples/bento.js +201 -0
  336. package/dist/library/examples/bento.js.map +1 -0
  337. package/dist/library/examples/blocks.d.ts +14 -0
  338. package/dist/library/examples/blocks.js +313 -0
  339. package/dist/library/examples/blocks.js.map +1 -0
  340. package/dist/library/examples/faq.d.ts +28 -0
  341. package/dist/library/examples/faq.js +230 -0
  342. package/dist/library/examples/faq.js.map +1 -0
  343. package/dist/library/examples/hero.d.ts +43 -0
  344. package/dist/library/examples/hero.js +222 -0
  345. package/dist/library/examples/hero.js.map +1 -0
  346. package/dist/library/examples/index.d.ts +36 -0
  347. package/dist/library/examples/index.js +109 -0
  348. package/dist/library/examples/index.js.map +1 -0
  349. package/dist/library/examples/journalStory.d.ts +93 -0
  350. package/dist/library/examples/journalStory.js +338 -0
  351. package/dist/library/examples/journalStory.js.map +1 -0
  352. package/dist/library/examples/megaMenu.d.ts +134 -0
  353. package/dist/library/examples/megaMenu.js +442 -0
  354. package/dist/library/examples/megaMenu.js.map +1 -0
  355. package/dist/library/examples/pricing.d.ts +103 -0
  356. package/dist/library/examples/pricing.js +479 -0
  357. package/dist/library/examples/pricing.js.map +1 -0
  358. package/dist/library/examples/tabs.d.ts +87 -0
  359. package/dist/library/examples/tabs.js +180 -0
  360. package/dist/library/examples/tabs.js.map +1 -0
  361. package/dist/library/export.d.ts +42 -0
  362. package/dist/library/export.js +80 -0
  363. package/dist/library/export.js.map +1 -0
  364. package/dist/library/index.d.ts +13 -0
  365. package/dist/library/index.js +6 -0
  366. package/dist/library/kit-catalog.json +1510 -0
  367. package/dist/library/types.d.ts +42 -0
  368. package/dist/library/types.js +0 -0
  369. package/dist/schema/adapters.d.ts +28 -0
  370. package/dist/schema/adapters.js +492 -0
  371. package/dist/schema/adapters.js.map +1 -0
  372. package/dist/schema/help.d.ts +27 -0
  373. package/dist/schema/help.js +56 -0
  374. package/dist/schema/help.js.map +1 -0
  375. package/dist/schema/scale.d.ts +69 -0
  376. package/dist/schema/scale.js +250 -0
  377. package/dist/schema/scale.js.map +1 -0
  378. package/dist/schema/sources.d.ts +103 -0
  379. package/dist/schema/sources.js +65 -0
  380. package/dist/schema/sources.js.map +1 -0
  381. package/dist/schema/table.d.ts +319 -0
  382. package/dist/schema/table.js +1199 -0
  383. package/dist/schema/table.js.map +1 -0
  384. package/dist/schema/types.d.ts +297 -0
  385. package/dist/schema/types.js +14 -0
  386. package/dist/schema/types.js.map +1 -0
  387. package/dist/styles.css +2 -0
  388. package/dist/table/table-view.d.ts +14 -0
  389. package/dist/table/table-view.js +140 -0
  390. package/dist/table/table-view.js.map +1 -0
  391. package/dist/table/table.css +73 -0
  392. package/dist/testing/corpus.d.ts +63 -0
  393. package/dist/testing/corpus.js +129 -0
  394. package/dist/testing/corpus.js.map +1 -0
  395. package/dist/testing/test-form.d.ts +11 -0
  396. package/dist/testing/test-form.js +38 -0
  397. package/dist/testing/test-form.js.map +1 -0
  398. package/dist/theme.css +345 -0
  399. package/dist/theme.d.ts +20 -1504
  400. package/dist/theme.js +43 -4126
  401. package/dist/theme.js.map +1 -0
  402. package/dist/tokens.css +542 -0
  403. package/dist/types.d.ts +17 -0
  404. package/dist/types.js +0 -0
  405. package/dist/ui/action-tray.d.ts +54 -0
  406. package/dist/ui/action-tray.js +154 -0
  407. package/dist/ui/action-tray.js.map +1 -0
  408. package/dist/ui/autocomplete.d.ts +30 -0
  409. package/dist/ui/autocomplete.js +139 -0
  410. package/dist/ui/autocomplete.js.map +1 -0
  411. package/dist/ui/button.d.ts +57 -0
  412. package/dist/ui/button.js +201 -0
  413. package/dist/ui/button.js.map +1 -0
  414. package/dist/ui/choice-switch.d.ts +36 -0
  415. package/dist/ui/choice-switch.js +57 -0
  416. package/dist/ui/choice-switch.js.map +1 -0
  417. package/dist/ui/controls.d.ts +83 -0
  418. package/dist/ui/controls.js +331 -0
  419. package/dist/ui/controls.js.map +1 -0
  420. package/dist/ui/display.d.ts +163 -0
  421. package/dist/ui/display.js +455 -0
  422. package/dist/ui/display.js.map +1 -0
  423. package/dist/ui/expanded-editor-modal.d.ts +26 -0
  424. package/dist/ui/expanded-editor-modal.js +140 -0
  425. package/dist/ui/expanded-editor-modal.js.map +1 -0
  426. package/dist/ui/field-context.d.ts +12 -0
  427. package/dist/ui/field-context.js +23 -0
  428. package/dist/ui/field-context.js.map +1 -0
  429. package/dist/ui/floating-panel.d.ts +152 -0
  430. package/dist/ui/floating-panel.js +928 -0
  431. package/dist/ui/floating-panel.js.map +1 -0
  432. package/dist/ui/index.d.ts +16 -0
  433. package/dist/ui/index.js +18 -0
  434. package/dist/ui/input.d.ts +78 -0
  435. package/dist/ui/input.js +250 -0
  436. package/dist/ui/input.js.map +1 -0
  437. package/dist/ui/mode-bar.d.ts +31 -0
  438. package/dist/ui/mode-bar.js +65 -0
  439. package/dist/ui/mode-bar.js.map +1 -0
  440. package/dist/ui/overlay.d.ts +195 -0
  441. package/dist/ui/overlay.js +697 -0
  442. package/dist/ui/overlay.js.map +1 -0
  443. package/dist/ui/path-crumbs.d.ts +90 -0
  444. package/dist/ui/path-crumbs.js +566 -0
  445. package/dist/ui/path-crumbs.js.map +1 -0
  446. package/dist/ui/presence.d.ts +16 -0
  447. package/dist/ui/presence.js +65 -0
  448. package/dist/ui/presence.js.map +1 -0
  449. package/dist/ui/select.d.ts +66 -0
  450. package/dist/ui/select.js +407 -0
  451. package/dist/ui/select.js.map +1 -0
  452. package/dist/ui/shortcut-hint.d.ts +14 -0
  453. package/dist/ui/shortcut-hint.js +35 -0
  454. package/dist/ui/shortcut-hint.js.map +1 -0
  455. package/dist/ui/spinner.d.ts +24 -0
  456. package/dist/ui/spinner.js +42 -0
  457. package/dist/ui/spinner.js.map +1 -0
  458. package/dist/ui/split-button.d.ts +32 -0
  459. package/dist/ui/split-button.js +60 -0
  460. package/dist/ui/split-button.js.map +1 -0
  461. package/dist/ui/surfaces.d.ts +23 -0
  462. package/dist/ui/surfaces.js +26 -0
  463. package/dist/ui/surfaces.js.map +1 -0
  464. package/dist/ui/tab.d.ts +38 -0
  465. package/dist/ui/tab.js +87 -0
  466. package/dist/ui/tab.js.map +1 -0
  467. package/dist/ui/toast.d.ts +20 -0
  468. package/dist/ui/toast.js +115 -0
  469. package/dist/ui/toast.js.map +1 -0
  470. package/dist/ui/tooltip-root.d.ts +13 -0
  471. package/dist/ui/tooltip-root.js +77 -0
  472. package/dist/ui/tooltip-root.js.map +1 -0
  473. package/dist/ui/variants.d.ts +15 -0
  474. package/dist/ui/variants.js +14 -0
  475. package/dist/ui/variants.js.map +1 -0
  476. package/package.json +76 -50
  477. package/LICENSE +0 -21
  478. package/dist/_chunks-cjs/_visual-editing.js +0 -5898
  479. package/dist/_chunks-cjs/refractor.js +0 -22
  480. package/dist/_chunks-es/_visual-editing.mjs +0 -5904
  481. package/dist/_chunks-es/refractor.mjs +0 -25
  482. package/dist/_color.d.mts +0 -119
  483. package/dist/_color.d.ts +0 -119
  484. package/dist/_color.js +0 -1412
  485. package/dist/_color.mjs +0 -1411
  486. package/dist/_visual-editing.d.mts +0 -1126
  487. package/dist/_visual-editing.d.ts +0 -1126
  488. package/dist/_visual-editing.js +0 -30
  489. package/dist/_visual-editing.mjs +0 -30
  490. package/dist/index.d.mts +0 -3140
  491. package/dist/index.mjs +0 -2044
  492. package/dist/theme.d.mts +0 -1506
  493. package/dist/theme.mjs +0 -4126
  494. package/exports/_visual-editing.ts +0 -31
  495. package/exports/index.ts +0 -1
  496. package/exports/theme.ts +0 -1
  497. package/src/color/index.d.mts +0 -119
  498. package/src/color/index.mjs +0 -1411
  499. package/src/core/__workshop__/constants.ts +0 -293
  500. package/src/core/_compat.ts +0 -264
  501. package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
  502. package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
  503. package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
  504. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
  505. package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
  506. package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
  507. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
  508. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
  509. package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
  510. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  511. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  512. package/src/core/components/autocomplete/autocomplete.tsx +0 -767
  513. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
  514. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  515. package/src/core/components/autocomplete/constants.ts +0 -28
  516. package/src/core/components/autocomplete/index.ts +0 -2
  517. package/src/core/components/autocomplete/types.ts +0 -108
  518. package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
  519. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
  520. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  521. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
  522. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
  523. package/src/core/components/breadcrumbs/index.ts +0 -1
  524. package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
  525. package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
  526. package/src/core/components/dialog/__workshop__/index.ts +0 -19
  527. package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
  528. package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
  529. package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
  530. package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
  531. package/src/core/components/dialog/__workshop__/position.tsx +0 -30
  532. package/src/core/components/dialog/__workshop__/props.tsx +0 -75
  533. package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
  534. package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
  535. package/src/core/components/dialog/dialog.tsx +0 -430
  536. package/src/core/components/dialog/dialogContext.ts +0 -20
  537. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  538. package/src/core/components/dialog/index.ts +0 -4
  539. package/src/core/components/dialog/styles.ts +0 -77
  540. package/src/core/components/dialog/useDialog.ts +0 -11
  541. package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
  542. package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
  543. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
  544. package/src/core/components/hotkeys/hotkeys.tsx +0 -66
  545. package/src/core/components/hotkeys/index.ts +0 -1
  546. package/src/core/components/index.ts +0 -9
  547. package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
  548. package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
  549. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
  550. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
  551. package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
  552. package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
  553. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
  554. package/src/core/components/menu/__workshop__/groups.tsx +0 -156
  555. package/src/core/components/menu/__workshop__/index.ts +0 -89
  556. package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
  557. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
  558. package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
  559. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
  560. package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
  561. package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
  562. package/src/core/components/menu/__workshop__/tones.tsx +0 -25
  563. package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
  564. package/src/core/components/menu/helpers.ts +0 -82
  565. package/src/core/components/menu/index.ts +0 -5
  566. package/src/core/components/menu/menu.spacing.test.tsx +0 -63
  567. package/src/core/components/menu/menu.test.tsx +0 -125
  568. package/src/core/components/menu/menu.tsx +0 -178
  569. package/src/core/components/menu/menuButton.tsx +0 -268
  570. package/src/core/components/menu/menuContext.ts +0 -18
  571. package/src/core/components/menu/menuDivider.ts +0 -23
  572. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
  573. package/src/core/components/menu/menuGroup.tsx +0 -233
  574. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
  575. package/src/core/components/menu/menuItem.tsx +0 -197
  576. package/src/core/components/menu/useMenu.ts +0 -21
  577. package/src/core/components/menu/useMenuController.ts +0 -231
  578. package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
  579. package/src/core/components/skeleton/__workshop__/index.ts +0 -11
  580. package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
  581. package/src/core/components/skeleton/index.ts +0 -2
  582. package/src/core/components/skeleton/skeleton.tsx +0 -57
  583. package/src/core/components/skeleton/styles.ts +0 -50
  584. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  585. package/src/core/components/tab/__workshop__/example.tsx +0 -79
  586. package/src/core/components/tab/__workshop__/index.ts +0 -14
  587. package/src/core/components/tab/index.ts +0 -3
  588. package/src/core/components/tab/tab.tsx +0 -101
  589. package/src/core/components/tab/tabList.test.tsx +0 -48
  590. package/src/core/components/tab/tabList.tsx +0 -70
  591. package/src/core/components/tab/tabPanel.tsx +0 -39
  592. package/src/core/components/toast/__workshop__/hook.tsx +0 -71
  593. package/src/core/components/toast/__workshop__/index.ts +0 -19
  594. package/src/core/components/toast/__workshop__/toast.tsx +0 -26
  595. package/src/core/components/toast/index.ts +0 -4
  596. package/src/core/components/toast/styles.ts +0 -77
  597. package/src/core/components/toast/toast.test.tsx +0 -101
  598. package/src/core/components/toast/toast.tsx +0 -198
  599. package/src/core/components/toast/toastContext.ts +0 -7
  600. package/src/core/components/toast/toastLayer.tsx +0 -51
  601. package/src/core/components/toast/toastProvider.tsx +0 -113
  602. package/src/core/components/toast/toastState.ts +0 -6
  603. package/src/core/components/toast/types.ts +0 -26
  604. package/src/core/components/toast/useToast.ts +0 -25
  605. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  606. package/src/core/components/tree/__workshop__/basic.tsx +0 -105
  607. package/src/core/components/tree/__workshop__/index.ts +0 -21
  608. package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
  609. package/src/core/components/tree/helpers.ts +0 -105
  610. package/src/core/components/tree/index.ts +0 -4
  611. package/src/core/components/tree/style.ts +0 -105
  612. package/src/core/components/tree/tree.test.tsx +0 -55
  613. package/src/core/components/tree/tree.tsx +0 -240
  614. package/src/core/components/tree/treeContext.ts +0 -10
  615. package/src/core/components/tree/treeGroup.tsx +0 -28
  616. package/src/core/components/tree/treeItem.test.tsx +0 -65
  617. package/src/core/components/tree/treeItem.tsx +0 -224
  618. package/src/core/components/tree/types.ts +0 -25
  619. package/src/core/components/tree/useTree.ts +0 -17
  620. package/src/core/constants.ts +0 -79
  621. package/src/core/helpers/animation.ts +0 -27
  622. package/src/core/helpers/element.ts +0 -55
  623. package/src/core/helpers/focus.ts +0 -100
  624. package/src/core/helpers/index.ts +0 -4
  625. package/src/core/helpers/scroll.ts +0 -15
  626. package/src/core/hooks/index.ts +0 -12
  627. package/src/core/hooks/useArrayProp.ts +0 -17
  628. package/src/core/hooks/useClickOutside.test.tsx +0 -482
  629. package/src/core/hooks/useClickOutside.ts +0 -118
  630. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
  631. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  632. package/src/core/hooks/useCustomValidity.ts +0 -13
  633. package/src/core/hooks/useDelayed.test.ts +0 -88
  634. package/src/core/hooks/useDelayedState.ts +0 -36
  635. package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
  636. package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
  637. package/src/core/hooks/useElementRect/index.ts +0 -1
  638. package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
  639. package/src/core/hooks/useElementSize.ts +0 -19
  640. package/src/core/hooks/useForwardedRef.ts +0 -19
  641. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  642. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  643. package/src/core/hooks/useMatchMedia.ts +0 -28
  644. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
  645. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
  646. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  647. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
  648. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  649. package/src/core/hooks/useMounted.ts +0 -15
  650. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  651. package/src/core/hooks/usePrefersDark.test.tsx +0 -19
  652. package/src/core/hooks/usePrefersDark.ts +0 -16
  653. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  654. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
  655. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  656. package/src/core/index.ts +0 -10
  657. package/src/core/lib/createGlobalScopedContext.ts +0 -36
  658. package/src/core/lib/globalScope.ts +0 -19
  659. package/src/core/lib/isRecord.ts +0 -3
  660. package/src/core/middleware/origin.ts +0 -47
  661. package/src/core/observers/elementSizeObserver.ts +0 -116
  662. package/src/core/observers/index.ts +0 -2
  663. package/src/core/observers/resizeObserver.ts +0 -9
  664. package/src/core/primitives/_selectable/index.ts +0 -1
  665. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  666. package/src/core/primitives/_selectable/style.ts +0 -115
  667. package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
  668. package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
  669. package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
  670. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
  671. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
  672. package/src/core/primitives/avatar/avatar.tsx +0 -200
  673. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  674. package/src/core/primitives/avatar/avatarStack.tsx +0 -100
  675. package/src/core/primitives/avatar/index.ts +0 -4
  676. package/src/core/primitives/avatar/styles.ts +0 -167
  677. package/src/core/primitives/avatar/types.ts +0 -17
  678. package/src/core/primitives/badge/__workshop__/index.ts +0 -19
  679. package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
  680. package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
  681. package/src/core/primitives/badge/badge.test.tsx +0 -16
  682. package/src/core/primitives/badge/badge.tsx +0 -70
  683. package/src/core/primitives/badge/index.ts +0 -1
  684. package/src/core/primitives/badge/styles.ts +0 -20
  685. package/src/core/primitives/badge/types.ts +0 -8
  686. package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
  687. package/src/core/primitives/box/__workshop__/index.ts +0 -24
  688. package/src/core/primitives/box/__workshop__/props.tsx +0 -20
  689. package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
  690. package/src/core/primitives/box/box.test.tsx +0 -142
  691. package/src/core/primitives/box/box.tsx +0 -154
  692. package/src/core/primitives/box/index.ts +0 -1
  693. package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
  694. package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
  695. package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
  696. package/src/core/primitives/button/__workshop__/index.ts +0 -59
  697. package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
  698. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
  699. package/src/core/primitives/button/__workshop__/props.tsx +0 -55
  700. package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
  701. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  702. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  703. package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
  704. package/src/core/primitives/button/button.test.tsx +0 -82
  705. package/src/core/primitives/button/button.tsx +0 -210
  706. package/src/core/primitives/button/index.ts +0 -1
  707. package/src/core/primitives/button/styles.ts +0 -117
  708. package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
  709. package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
  710. package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
  711. package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
  712. package/src/core/primitives/card/__workshop__/index.ts +0 -18
  713. package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
  714. package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
  715. package/src/core/primitives/card/__workshop__/props.tsx +0 -53
  716. package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
  717. package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
  718. package/src/core/primitives/card/card.tsx +0 -128
  719. package/src/core/primitives/card/index.ts +0 -2
  720. package/src/core/primitives/card/styles.ts +0 -147
  721. package/src/core/primitives/card/types.ts +0 -11
  722. package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
  723. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
  724. package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
  725. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
  726. package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
  727. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  728. package/src/core/primitives/checkbox/index.ts +0 -1
  729. package/src/core/primitives/checkbox/styles.ts +0 -128
  730. package/src/core/primitives/code/__workshop__/index.ts +0 -19
  731. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
  732. package/src/core/primitives/code/__workshop__/props.tsx +0 -21
  733. package/src/core/primitives/code/code.tsx +0 -55
  734. package/src/core/primitives/code/index.ts +0 -1
  735. package/src/core/primitives/code/refractor.tsx +0 -20
  736. package/src/core/primitives/code/styles.ts +0 -77
  737. package/src/core/primitives/container/__workshop__/example.tsx +0 -20
  738. package/src/core/primitives/container/__workshop__/index.ts +0 -8
  739. package/src/core/primitives/container/container.tsx +0 -54
  740. package/src/core/primitives/container/index.ts +0 -2
  741. package/src/core/primitives/container/styles.ts +0 -23
  742. package/src/core/primitives/container/types.ts +0 -6
  743. package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
  744. package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
  745. package/src/core/primitives/flex/__workshop__/index.ts +0 -11
  746. package/src/core/primitives/flex/flex.tsx +0 -64
  747. package/src/core/primitives/flex/index.ts +0 -1
  748. package/src/core/primitives/grid/__workshop__/index.ts +0 -10
  749. package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
  750. package/src/core/primitives/grid/grid.test.tsx +0 -80
  751. package/src/core/primitives/grid/grid.tsx +0 -74
  752. package/src/core/primitives/grid/index.ts +0 -1
  753. package/src/core/primitives/heading/__workshop__/index.ts +0 -19
  754. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
  755. package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
  756. package/src/core/primitives/heading/heading.tsx +0 -88
  757. package/src/core/primitives/heading/index.ts +0 -1
  758. package/src/core/primitives/heading/styles.ts +0 -64
  759. package/src/core/primitives/heading/types.ts +0 -7
  760. package/src/core/primitives/index.ts +0 -27
  761. package/src/core/primitives/inline/__workshop__/index.ts +0 -8
  762. package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
  763. package/src/core/primitives/inline/index.ts +0 -1
  764. package/src/core/primitives/inline/inline.test.tsx +0 -51
  765. package/src/core/primitives/inline/inline.tsx +0 -63
  766. package/src/core/primitives/inline/styles.ts +0 -32
  767. package/src/core/primitives/inline/types.ts +0 -6
  768. package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
  769. package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
  770. package/src/core/primitives/kbd/index.ts +0 -1
  771. package/src/core/primitives/kbd/kbd.tsx +0 -69
  772. package/src/core/primitives/label/__workshop__/index.ts +0 -19
  773. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
  774. package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
  775. package/src/core/primitives/label/index.ts +0 -1
  776. package/src/core/primitives/label/label.tsx +0 -87
  777. package/src/core/primitives/label/styles.ts +0 -45
  778. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
  779. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  780. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  781. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  782. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
  783. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
  784. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
  785. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
  786. package/src/core/primitives/popover/__workshop__/index.ts +0 -49
  787. package/src/core/primitives/popover/constants.ts +0 -22
  788. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  789. package/src/core/primitives/popover/helpers.ts +0 -31
  790. package/src/core/primitives/popover/index.ts +0 -2
  791. package/src/core/primitives/popover/popover.tsx +0 -511
  792. package/src/core/primitives/popover/popoverCard.tsx +0 -166
  793. package/src/core/primitives/popover/types.ts +0 -7
  794. package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
  795. package/src/core/primitives/radio/__workshop__/index.ts +0 -11
  796. package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
  797. package/src/core/primitives/radio/index.ts +0 -1
  798. package/src/core/primitives/radio/radio.tsx +0 -51
  799. package/src/core/primitives/radio/styles.ts +0 -117
  800. package/src/core/primitives/select/__workshop__/index.ts +0 -11
  801. package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
  802. package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
  803. package/src/core/primitives/select/index.ts +0 -1
  804. package/src/core/primitives/select/select.test.tsx +0 -52
  805. package/src/core/primitives/select/select.tsx +0 -94
  806. package/src/core/primitives/select/styles.ts +0 -166
  807. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
  808. package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
  809. package/src/core/primitives/spinner/index.ts +0 -1
  810. package/src/core/primitives/spinner/spinner.tsx +0 -46
  811. package/src/core/primitives/stack/__workshop__/index.ts +0 -14
  812. package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
  813. package/src/core/primitives/stack/index.ts +0 -1
  814. package/src/core/primitives/stack/stack.test.tsx +0 -57
  815. package/src/core/primitives/stack/stack.tsx +0 -57
  816. package/src/core/primitives/stack/styles.ts +0 -32
  817. package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
  818. package/src/core/primitives/switch/__workshop__/index.ts +0 -11
  819. package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
  820. package/src/core/primitives/switch/index.ts +0 -1
  821. package/src/core/primitives/switch/styles.ts +0 -173
  822. package/src/core/primitives/switch/switch.tsx +0 -68
  823. package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
  824. package/src/core/primitives/text/__workshop__/example.tsx +0 -39
  825. package/src/core/primitives/text/__workshop__/index.ts +0 -24
  826. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
  827. package/src/core/primitives/text/index.ts +0 -1
  828. package/src/core/primitives/text/styles.ts +0 -74
  829. package/src/core/primitives/text/text.tsx +0 -89
  830. package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
  831. package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
  832. package/src/core/primitives/textArea/index.ts +0 -1
  833. package/src/core/primitives/textArea/textArea.tsx +0 -120
  834. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
  835. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
  836. package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
  837. package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
  838. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
  839. package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
  840. package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
  841. package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
  842. package/src/core/primitives/textInput/index.ts +0 -1
  843. package/src/core/primitives/textInput/textInput.test.tsx +0 -48
  844. package/src/core/primitives/textInput/textInput.tsx +0 -395
  845. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
  846. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
  847. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
  848. package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
  849. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
  850. package/src/core/primitives/tooltip/constants.ts +0 -23
  851. package/src/core/primitives/tooltip/index.ts +0 -2
  852. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
  853. package/src/core/primitives/tooltip/tooltip.tsx +0 -495
  854. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
  855. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  856. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  857. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  858. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  859. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  860. package/src/core/primitives/types.ts +0 -179
  861. package/src/core/styles/border/borderStyle.ts +0 -56
  862. package/src/core/styles/border/index.ts +0 -2
  863. package/src/core/styles/border/types.ts +0 -10
  864. package/src/core/styles/box/boxStyle.ts +0 -69
  865. package/src/core/styles/box/index.ts +0 -2
  866. package/src/core/styles/box/types.ts +0 -11
  867. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  868. package/src/core/styles/card/index.ts +0 -1
  869. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  870. package/src/core/styles/flex/flexStyle.ts +0 -70
  871. package/src/core/styles/flex/index.ts +0 -3
  872. package/src/core/styles/flex/types.ts +0 -25
  873. package/src/core/styles/focusRing/index.ts +0 -25
  874. package/src/core/styles/font/codeFontStyle.ts +0 -13
  875. package/src/core/styles/font/headingFontStyle.ts +0 -13
  876. package/src/core/styles/font/index.ts +0 -6
  877. package/src/core/styles/font/labelFontStyle.ts +0 -13
  878. package/src/core/styles/font/responsiveFont.ts +0 -103
  879. package/src/core/styles/font/textAlignStyle.ts +0 -19
  880. package/src/core/styles/font/textFontStyle.ts +0 -13
  881. package/src/core/styles/font/types.ts +0 -35
  882. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  883. package/src/core/styles/grid/gridStyle.ts +0 -108
  884. package/src/core/styles/grid/index.ts +0 -3
  885. package/src/core/styles/grid/types.ts +0 -37
  886. package/src/core/styles/helpers.ts +0 -72
  887. package/src/core/styles/index.ts +0 -5
  888. package/src/core/styles/input/index.ts +0 -2
  889. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  890. package/src/core/styles/input/textInputStyle.ts +0 -263
  891. package/src/core/styles/internal.ts +0 -12
  892. package/src/core/styles/margin/index.ts +0 -2
  893. package/src/core/styles/margin/marginStyle.ts +0 -21
  894. package/src/core/styles/margin/marginsStyle.test.ts +0 -33
  895. package/src/core/styles/margin/types.ts +0 -9
  896. package/src/core/styles/padding/index.ts +0 -2
  897. package/src/core/styles/padding/paddingStyle.test.ts +0 -33
  898. package/src/core/styles/padding/paddingStyle.ts +0 -21
  899. package/src/core/styles/padding/types.ts +0 -12
  900. package/src/core/styles/radius/index.ts +0 -2
  901. package/src/core/styles/radius/radiusStyle.ts +0 -23
  902. package/src/core/styles/radius/types.ts +0 -8
  903. package/src/core/styles/shadow/index.ts +0 -2
  904. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  905. package/src/core/styles/shadow/types.ts +0 -6
  906. package/src/core/styles/types.ts +0 -8
  907. package/src/core/theme/__workshop__/build/Root.tsx +0 -367
  908. package/src/core/theme/__workshop__/build/helpers.ts +0 -46
  909. package/src/core/theme/__workshop__/build/story.tsx +0 -465
  910. package/src/core/theme/__workshop__/canvas.tsx +0 -352
  911. package/src/core/theme/__workshop__/color.tsx +0 -62
  912. package/src/core/theme/__workshop__/debug/story.tsx +0 -408
  913. package/src/core/theme/__workshop__/index.ts +0 -39
  914. package/src/core/theme/__workshop__/layer.tsx +0 -78
  915. package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
  916. package/src/core/theme/index.ts +0 -5
  917. package/src/core/theme/theme.test.tsx +0 -73
  918. package/src/core/theme/themeColorProvider.tsx +0 -29
  919. package/src/core/theme/themeContext.ts +0 -10
  920. package/src/core/theme/themeProvider.tsx +0 -62
  921. package/src/core/theme/types.ts +0 -12
  922. package/src/core/theme/useRootTheme.ts +0 -17
  923. package/src/core/theme/useTheme.ts +0 -16
  924. package/src/core/types/avatar.ts +0 -14
  925. package/src/core/types/badge.ts +0 -12
  926. package/src/core/types/box.ts +0 -19
  927. package/src/core/types/button.ts +0 -21
  928. package/src/core/types/card.ts +0 -6
  929. package/src/core/types/component.ts +0 -32
  930. package/src/core/types/dialog.ts +0 -4
  931. package/src/core/types/flex.ts +0 -30
  932. package/src/core/types/grid.ts +0 -14
  933. package/src/core/types/gridItem.ts +0 -29
  934. package/src/core/types/index.ts +0 -15
  935. package/src/core/types/placement.ts +0 -18
  936. package/src/core/types/popover.ts +0 -4
  937. package/src/core/types/radius.ts +0 -4
  938. package/src/core/types/selectable.ts +0 -6
  939. package/src/core/types/text.ts +0 -4
  940. package/src/core/utils/arrow/arrow.tsx +0 -123
  941. package/src/core/utils/arrow/cmds.ts +0 -91
  942. package/src/core/utils/arrow/index.ts +0 -1
  943. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
  944. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
  945. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
  946. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  947. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  948. package/src/core/utils/boundaryElement/index.ts +0 -3
  949. package/src/core/utils/boundaryElement/types.ts +0 -7
  950. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  951. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
  952. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  953. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
  954. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
  955. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  956. package/src/core/utils/elementQuery/helpers.ts +0 -27
  957. package/src/core/utils/elementQuery/index.ts +0 -1
  958. package/src/core/utils/errorBoundary.tsx +0 -48
  959. package/src/core/utils/getElementRef.ts +0 -26
  960. package/src/core/utils/index.ts +0 -9
  961. package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
  962. package/src/core/utils/layer/__workshop__/index.ts +0 -24
  963. package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
  964. package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
  965. package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
  966. package/src/core/utils/layer/getLayerContext.test.ts +0 -30
  967. package/src/core/utils/layer/getLayerContext.ts +0 -21
  968. package/src/core/utils/layer/index.ts +0 -4
  969. package/src/core/utils/layer/layer.test.tsx +0 -108
  970. package/src/core/utils/layer/layer.tsx +0 -98
  971. package/src/core/utils/layer/layerContext.ts +0 -7
  972. package/src/core/utils/layer/layerProvider.tsx +0 -111
  973. package/src/core/utils/layer/types.ts +0 -9
  974. package/src/core/utils/layer/useLayer.ts +0 -26
  975. package/src/core/utils/portal/__workshop__/index.ts +0 -14
  976. package/src/core/utils/portal/__workshop__/named.tsx +0 -63
  977. package/src/core/utils/portal/index.ts +0 -4
  978. package/src/core/utils/portal/portal.test.tsx +0 -103
  979. package/src/core/utils/portal/portal.ts +0 -32
  980. package/src/core/utils/portal/portalContext.ts +0 -31
  981. package/src/core/utils/portal/portalProvider.tsx +0 -47
  982. package/src/core/utils/portal/types.ts +0 -9
  983. package/src/core/utils/portal/usePortal.ts +0 -25
  984. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  985. package/src/core/utils/srOnly/index.ts +0 -1
  986. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  987. package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
  988. package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
  989. package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
  990. package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
  991. package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
  992. package/src/core/utils/virtualList/index.ts +0 -1
  993. package/src/core/utils/virtualList/virtualList.tsx +0 -200
  994. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
  995. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
  996. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
  997. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
  998. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
  999. package/src/theme/build/_deprecated/color/color.test.ts +0 -63
  1000. package/src/theme/build/_deprecated/color/defaults.ts +0 -390
  1001. package/src/theme/build/_deprecated/color/factory.ts +0 -142
  1002. package/src/theme/build/_deprecated/color/index.ts +0 -1
  1003. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
  1004. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
  1005. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
  1006. package/src/theme/build/buildColorTheme.test.ts +0 -183
  1007. package/src/theme/build/buildColorTheme.ts +0 -499
  1008. package/src/theme/build/buildTheme.test.ts +0 -87
  1009. package/src/theme/build/buildTheme.ts +0 -36
  1010. package/src/theme/build/colorToken/colorToken.ts +0 -19
  1011. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  1012. package/src/theme/build/colorToken/index.ts +0 -2
  1013. package/src/theme/build/colorToken/types.ts +0 -6
  1014. package/src/theme/build/index.ts +0 -3
  1015. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  1016. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  1017. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  1018. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  1019. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
  1020. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  1021. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  1022. package/src/theme/build/lib/color-fns/index.ts +0 -6
  1023. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  1024. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  1025. package/src/theme/build/lib/color-fns/types.ts +0 -28
  1026. package/src/theme/build/lib/isRecord.ts +0 -3
  1027. package/src/theme/build/lib/lazy.ts +0 -30
  1028. package/src/theme/build/lib/utils.ts +0 -19
  1029. package/src/theme/build/merge.ts +0 -26
  1030. package/src/theme/build/mixThemeColor.test.ts +0 -21
  1031. package/src/theme/build/mixThemeColor.ts +0 -53
  1032. package/src/theme/build/renderColorTheme.ts +0 -532
  1033. package/src/theme/build/renderColorValue.ts +0 -85
  1034. package/src/theme/build/resolveColorTokens.ts +0 -268
  1035. package/src/theme/build/theme.test.ts +0 -27
  1036. package/src/theme/config/helpers.ts +0 -55
  1037. package/src/theme/config/index.ts +0 -4
  1038. package/src/theme/config/system.ts +0 -115
  1039. package/src/theme/config/tokens/color/index.ts +0 -1
  1040. package/src/theme/config/tokens/color/types.ts +0 -133
  1041. package/src/theme/config/tokens/index.ts +0 -4
  1042. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
  1043. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  1044. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
  1045. package/src/theme/config/tokens/parseTokenValue.ts +0 -133
  1046. package/src/theme/config/tokens/types.ts +0 -53
  1047. package/src/theme/config/types.ts +0 -46
  1048. package/src/theme/defaults/colorPalette.ts +0 -5
  1049. package/src/theme/defaults/colorTokens.ts +0 -648
  1050. package/src/theme/defaults/config.ts +0 -84
  1051. package/src/theme/defaults/fonts.ts +0 -227
  1052. package/src/theme/getScopedTheme.ts +0 -98
  1053. package/src/theme/index.ts +0 -5
  1054. package/src/theme/system/avatar.ts +0 -14
  1055. package/src/theme/system/color/_constants.ts +0 -45
  1056. package/src/theme/system/color/_helpers.ts +0 -24
  1057. package/src/theme/system/color/_system.ts +0 -40
  1058. package/src/theme/system/color/avatar.ts +0 -15
  1059. package/src/theme/system/color/badge.ts +0 -16
  1060. package/src/theme/system/color/button.ts +0 -17
  1061. package/src/theme/system/color/color.ts +0 -34
  1062. package/src/theme/system/color/index.ts +0 -13
  1063. package/src/theme/system/color/input.ts +0 -25
  1064. package/src/theme/system/color/kbd.ts +0 -8
  1065. package/src/theme/system/color/selectable.ts +0 -12
  1066. package/src/theme/system/color/shadow.ts +0 -7
  1067. package/src/theme/system/color/state.ts +0 -43
  1068. package/src/theme/system/color/syntax.ts +0 -41
  1069. package/src/theme/system/css.ts +0 -14
  1070. package/src/theme/system/focusRing.ts +0 -7
  1071. package/src/theme/system/font.ts +0 -52
  1072. package/src/theme/system/index.ts +0 -11
  1073. package/src/theme/system/input.ts +0 -33
  1074. package/src/theme/system/layer.ts +0 -8
  1075. package/src/theme/system/shadow.ts +0 -19
  1076. package/src/theme/system/styles.ts +0 -13
  1077. package/src/theme/system/theme.ts +0 -138
  1078. package/src/theme/system/v0/avatar.ts +0 -10
  1079. package/src/theme/system/v0/color/_generic.ts +0 -35
  1080. package/src/theme/system/v0/color/_system.ts +0 -17
  1081. package/src/theme/system/v0/color/base.ts +0 -21
  1082. package/src/theme/system/v0/color/button.ts +0 -42
  1083. package/src/theme/system/v0/color/card.ts +0 -19
  1084. package/src/theme/system/v0/color/color.ts +0 -40
  1085. package/src/theme/system/v0/color/index.ts +0 -11
  1086. package/src/theme/system/v0/color/input.ts +0 -34
  1087. package/src/theme/system/v0/color/muted.ts +0 -26
  1088. package/src/theme/system/v0/color/selectable.ts +0 -31
  1089. package/src/theme/system/v0/color/solid.ts +0 -26
  1090. package/src/theme/system/v0/color/spot.ts +0 -13
  1091. package/src/theme/system/v0/index.ts +0 -3
  1092. package/src/theme/system/v0/input.ts +0 -23
  1093. package/src/theme/versioning/getTheme_v2.ts +0 -57
  1094. package/src/theme/versioning/index.ts +0 -5
  1095. package/src/theme/versioning/is_v0.ts +0 -6
  1096. package/src/theme/versioning/is_v2.ts +0 -6
  1097. package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
  1098. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
  1099. package/src/theme/versioning/v0_v2.ts +0 -94
  1100. package/src/theme/versioning/v2_v0.ts +0 -135
@@ -0,0 +1,2976 @@
1
+ //#region src/library/entries/listings.entries.ts
2
+ var pic = (seed, w = 1600, h = 1e3) => `https://picsum.photos/seed/${seed}/${w}/${h}`;
3
+ var image = (seed, alt, w = 1600, h = 1e3) => ({
4
+ url: pic(seed, w, h),
5
+ alt,
6
+ name: `${seed}.jpg`,
7
+ width: w * 2,
8
+ height: h * 2
9
+ });
10
+ var CONTENT = {
11
+ name: "content",
12
+ title: "Content",
13
+ icon: "file-text",
14
+ default: true
15
+ };
16
+ var QUERY = {
17
+ name: "query",
18
+ title: "Items",
19
+ icon: "database"
20
+ };
21
+ var DESIGN = {
22
+ name: "design",
23
+ title: "Design",
24
+ icon: "palette"
25
+ };
26
+ /** The collection a listing reads from. Wired in code — marketers see it, can't change it. */
27
+ var collectionField = (id, label) => ({
28
+ name: "collection",
29
+ title: "Collection",
30
+ type: "select",
31
+ access: { edit: "schema.manage" },
32
+ lockReason: "The collection is wired to the page template in code.",
33
+ initialValue: id,
34
+ options: [{
35
+ value: id,
36
+ label
37
+ }],
38
+ description: ""
39
+ });
40
+ var ENTRIES = [
41
+ {
42
+ id: "blog-index",
43
+ label: "Blog index",
44
+ category: "Listings & feeds",
45
+ brand: "Caldera",
46
+ previewLayout: "grid-3",
47
+ tags: [
48
+ "dynamic-query",
49
+ "references",
50
+ "conditional",
51
+ "variants",
52
+ "validation"
53
+ ],
54
+ proves: "A listing stores a query, not copies · featured pick as a conditional reference · pagination modes",
55
+ docTitle: "Journal",
56
+ urlPrefix: "caldera.bettercms.site/",
57
+ schema: {
58
+ name: "blogIndex",
59
+ title: "Blog index",
60
+ kind: "block",
61
+ icon: "news",
62
+ category: "Listings & feeds",
63
+ description: "A featured story, then a paged grid of Journal posts",
64
+ variants: [
65
+ {
66
+ id: "featured-grid",
67
+ name: "Featured + grid",
68
+ description: "One large card, then a 3-column grid"
69
+ },
70
+ {
71
+ id: "list",
72
+ name: "List",
73
+ description: "Rows with a thumbnail on the left"
74
+ },
75
+ {
76
+ id: "magazine",
77
+ name: "Magazine",
78
+ description: "Two large cards, then a dense grid"
79
+ }
80
+ ],
81
+ groups: [
82
+ CONTENT,
83
+ QUERY,
84
+ DESIGN
85
+ ],
86
+ fieldsets: [{
87
+ name: "featured",
88
+ title: "Featured story",
89
+ description: "The large card above the grid."
90
+ }, {
91
+ name: "empty",
92
+ title: "When nothing matches",
93
+ collapsed: true
94
+ }],
95
+ preview: {
96
+ title: "heading",
97
+ subtitle: "intro",
98
+ icon: "layout-grid"
99
+ },
100
+ fields: [
101
+ {
102
+ name: "eyebrow",
103
+ title: "Eyebrow",
104
+ type: "string",
105
+ group: "content",
106
+ validation: { max: 40 },
107
+ placeholder: "The Journal"
108
+ },
109
+ {
110
+ name: "heading",
111
+ title: "Heading",
112
+ type: "string",
113
+ group: "content",
114
+ validation: {
115
+ required: true,
116
+ recommendedMax: 48
117
+ },
118
+ ai: true,
119
+ localized: true
120
+ },
121
+ {
122
+ name: "intro",
123
+ title: "Intro",
124
+ type: "text",
125
+ rows: 2,
126
+ group: "content",
127
+ validation: { recommendedMax: 200 },
128
+ ai: true,
129
+ localized: true
130
+ },
131
+ {
132
+ name: "featuredMode",
133
+ title: "Featured story",
134
+ type: "select",
135
+ group: "content",
136
+ fieldset: "featured",
137
+ layout: "segmented",
138
+ initialValue: "latest",
139
+ options: [
140
+ {
141
+ value: "latest",
142
+ label: "Newest featured",
143
+ description: "The newest post marked Featured"
144
+ },
145
+ {
146
+ value: "pick",
147
+ label: "Pick one"
148
+ },
149
+ {
150
+ value: "none",
151
+ label: "None"
152
+ }
153
+ ],
154
+ description: "Newest featured updates itself when a new featured post goes live."
155
+ },
156
+ {
157
+ name: "featuredPost",
158
+ title: "Post to feature",
159
+ type: "reference",
160
+ group: "content",
161
+ fieldset: "featured",
162
+ reference: { to: ["col_journal"] },
163
+ hidden: {
164
+ field: "featuredMode",
165
+ equals: "pick"
166
+ },
167
+ validation: { required: true }
168
+ },
169
+ {
170
+ name: "posts",
171
+ title: "Posts to list",
172
+ type: "object",
173
+ group: "query",
174
+ icon: "database",
175
+ description: "New posts that match appear on their own.",
176
+ fields: [
177
+ collectionField("col_journal", "Journal"),
178
+ {
179
+ name: "topics",
180
+ title: "Only these topics",
181
+ type: "array",
182
+ validation: { max: 6 },
183
+ description: "Leave empty for every post.",
184
+ of: [{
185
+ name: "topic",
186
+ title: "Topic",
187
+ type: "reference",
188
+ reference: { to: ["col_topics"] }
189
+ }]
190
+ },
191
+ {
192
+ name: "authors",
193
+ title: "Only these authors",
194
+ type: "array",
195
+ validation: { max: 6 },
196
+ description: "Leave empty for every author.",
197
+ of: [{
198
+ name: "author",
199
+ title: "Author",
200
+ type: "reference",
201
+ reference: { to: ["col_authors"] }
202
+ }]
203
+ },
204
+ {
205
+ name: "hideFeatured",
206
+ title: "Skip the featured post",
207
+ type: "boolean",
208
+ initialValue: true
209
+ },
210
+ {
211
+ name: "sort",
212
+ title: "Order",
213
+ type: "select",
214
+ initialValue: "newest",
215
+ options: [
216
+ {
217
+ value: "newest",
218
+ label: "Newest first"
219
+ },
220
+ {
221
+ value: "oldest",
222
+ label: "Oldest first"
223
+ },
224
+ {
225
+ value: "updated",
226
+ label: "Recently updated",
227
+ description: "Uses the Updated date, then the publish date"
228
+ },
229
+ {
230
+ value: "title",
231
+ label: "A to Z"
232
+ }
233
+ ],
234
+ description: ""
235
+ },
236
+ {
237
+ name: "pageSize",
238
+ title: "Posts per page",
239
+ type: "number",
240
+ layout: "slider",
241
+ numeric: {
242
+ min: 3,
243
+ max: 24,
244
+ step: 3
245
+ },
246
+ initialValue: 9
247
+ }
248
+ ]
249
+ },
250
+ {
251
+ name: "pagination",
252
+ title: "More posts",
253
+ type: "select",
254
+ group: "query",
255
+ layout: "radio",
256
+ initialValue: "numbered",
257
+ options: [
258
+ {
259
+ value: "numbered",
260
+ label: "Numbered pages",
261
+ description: "Each page gets its own address, /journal/page/2"
262
+ },
263
+ {
264
+ value: "loadMore",
265
+ label: "Load more button"
266
+ },
267
+ {
268
+ value: "infinite",
269
+ label: "Infinite scroll"
270
+ },
271
+ {
272
+ value: "none",
273
+ label: "First page only"
274
+ }
275
+ ],
276
+ description: ""
277
+ },
278
+ {
279
+ name: "loadMoreLabel",
280
+ title: "Button label",
281
+ type: "string",
282
+ group: "query",
283
+ hidden: {
284
+ field: "pagination",
285
+ equals: "loadMore"
286
+ },
287
+ initialValue: "Load more stories",
288
+ validation: { max: 32 },
289
+ description: ""
290
+ },
291
+ {
292
+ name: "emptyHeading",
293
+ title: "Empty heading",
294
+ type: "string",
295
+ group: "query",
296
+ fieldset: "empty",
297
+ initialValue: "Nothing here yet",
298
+ validation: { max: 60 },
299
+ description: "Shown when the filters match no posts."
300
+ },
301
+ {
302
+ name: "emptyButton",
303
+ title: "Empty button",
304
+ type: "button",
305
+ group: "query",
306
+ fieldset: "empty"
307
+ },
308
+ {
309
+ name: "columns",
310
+ title: "Columns on desktop",
311
+ type: "number",
312
+ group: "design",
313
+ layout: "slider",
314
+ numeric: {
315
+ min: 2,
316
+ max: 4,
317
+ step: 1
318
+ },
319
+ initialValue: 3,
320
+ description: ""
321
+ },
322
+ {
323
+ name: "imageRatio",
324
+ title: "Card image",
325
+ type: "select",
326
+ group: "design",
327
+ layout: "segmented",
328
+ initialValue: "4:3",
329
+ options: [
330
+ {
331
+ value: "16:9",
332
+ label: "16:9"
333
+ },
334
+ {
335
+ value: "4:3",
336
+ label: "4:3"
337
+ },
338
+ {
339
+ value: "1:1",
340
+ label: "Square"
341
+ },
342
+ {
343
+ value: "none",
344
+ label: "No image"
345
+ }
346
+ ]
347
+ },
348
+ {
349
+ name: "cardShows",
350
+ title: "Card shows",
351
+ type: "multiselect",
352
+ group: "design",
353
+ layout: "checkbox",
354
+ initialValue: [
355
+ "excerpt",
356
+ "date",
357
+ "topic"
358
+ ],
359
+ options: [
360
+ {
361
+ value: "excerpt",
362
+ label: "Excerpt"
363
+ },
364
+ {
365
+ value: "date",
366
+ label: "Date"
367
+ },
368
+ {
369
+ value: "author",
370
+ label: "Author"
371
+ },
372
+ {
373
+ value: "readingTime",
374
+ label: "Reading time"
375
+ },
376
+ {
377
+ value: "topic",
378
+ label: "First topic"
379
+ }
380
+ ],
381
+ description: ""
382
+ },
383
+ {
384
+ name: "anchor",
385
+ title: "Anchor",
386
+ type: "string",
387
+ group: "design",
388
+ advanced: true,
389
+ validation: {
390
+ pattern: "^[a-z0-9-]+$",
391
+ patternMessage: "Use lowercase letters, numbers and hyphens, like our-story."
392
+ }
393
+ }
394
+ ]
395
+ },
396
+ value: {
397
+ _variant: "featured-grid",
398
+ eyebrow: "The Journal",
399
+ heading: "Notes from the fire",
400
+ intro: "Field tests, recipes and the long way round to a well-seasoned pan. New stories every Thursday.",
401
+ featuredMode: "pick",
402
+ featuredPost: "en_1",
403
+ posts: {
404
+ collection: "col_journal",
405
+ topics: ["tp_cast-iron", "tp_camp"],
406
+ authors: [],
407
+ hideFeatured: true,
408
+ sort: "newest",
409
+ pageSize: 9
410
+ },
411
+ pagination: "numbered",
412
+ loadMoreLabel: "Load more stories",
413
+ emptyHeading: "No stories in this topic yet",
414
+ emptyButton: {
415
+ label: "Browse every story",
416
+ href: "/journal",
417
+ type: "page",
418
+ title: "Journal",
419
+ style: "secondary"
420
+ },
421
+ columns: 3,
422
+ imageRatio: "4:3",
423
+ cardShows: [
424
+ "excerpt",
425
+ "date",
426
+ "topic",
427
+ "readingTime"
428
+ ],
429
+ anchor: "stories"
430
+ },
431
+ notes: {
432
+ why: "Posts are Journal entries; the index is a section on the Journal static page that holds only a query (topics, authors, order, page size), so a new post appears without anyone editing the page. The collection is developer-locked because the card template is wired to that collection's fields. The editorial pick is the one exception — a single optional reference shown only when Featured story = Pick one — and excludeFeatured stops it showing twice. Card visibility and image ratio are design, so they live in the Design group, not on each post.",
433
+ sanity: "object `blogIndex` { featuredPost: reference→post, topics: array<reference→category>, pageSize: number }. The query itself is GROQ in the frontend (`*[_type=='post' && count((categories[]._ref)[@ in $topics])>0] | order(publishedAt desc)[$from...$to]`) — Sanity has no field type for it. Ours keeps the query in the content so editors can see and change it.",
434
+ htmlSignals: [
435
+ "Three or more sibling <article> cards with the same shape: image, h2/h3 link, <time>, short paragraph",
436
+ "Card hrefs share a prefix (/blog/, /journal/, /news/) — that prefix names the collection",
437
+ "One card visibly larger or first in its own row before the grid (featured)",
438
+ "<nav aria-label=\"Pagination\"> with numbered links or rel=\"next\", or a 'Load more' button",
439
+ "Category chips or a 'Filed under' label on each card (topics reference)"
440
+ ],
441
+ mcp: "1) Find or create the collection from the card shape: title (card heading), slug (last href segment), excerpt (card paragraph), coverImage (card image + alt), publishedAt (<time datetime>), author, topics. 2) Import each card as an entry; follow the href for the body. 3) Create ONE blogIndex section with posts.collection = that collection. Set topics only when the page URL or heading scopes it (/blog/category/camp → topic 'camp'). 4) featuredMode: 'pick' + featuredPost when the first card is larger, else 'latest'. 5) pagination from the DOM (numbered nav → numbered; 'Load more' → loadMore; none visible → none). pageSize = cards on page 1 minus the featured card, rounded to columns. Never write card titles into the section.",
442
+ pitfalls: [
443
+ "Copying the 9 visible cards into an inline array freezes the list — new posts never appear.",
444
+ "Featured post listed again in the grid when excludeFeatured is off.",
445
+ "Infinite scroll with no numbered fallback leaves old posts unreachable for crawlers.",
446
+ "pageSize that isn't a multiple of columns leaves a ragged last row.",
447
+ "A topic-scoped index (/journal/topic/camp) is a page template on the Topics collection, not a copy of this section per topic."
448
+ ]
449
+ }
450
+ },
451
+ {
452
+ id: "category-filter-bar",
453
+ label: "Category filter bar",
454
+ category: "Listings & feeds",
455
+ brand: "Caldera",
456
+ previewLayout: "nav",
457
+ tags: [
458
+ "references",
459
+ "dynamic-query",
460
+ "conditional",
461
+ "variants",
462
+ "responsive-layout",
463
+ "a11y"
464
+ ],
465
+ proves: "Chips from a taxonomy collection (all or picked) · filters a list on the page or navigates · mobile behavior per breakpoint",
466
+ schema: {
467
+ name: "categoryFilter",
468
+ title: "Category filter bar",
469
+ kind: "block",
470
+ icon: "filter",
471
+ category: "Listings & feeds",
472
+ description: "Topic chips that filter a list or link to topic pages",
473
+ variants: [
474
+ {
475
+ id: "pills",
476
+ name: "Pills"
477
+ },
478
+ {
479
+ id: "underline",
480
+ name: "Underline tabs"
481
+ },
482
+ {
483
+ id: "dropdown",
484
+ name: "Dropdown",
485
+ description: "One select, good for 10+ topics"
486
+ }
487
+ ],
488
+ groups: [CONTENT, DESIGN],
489
+ preview: {
490
+ title: "allLabel",
491
+ subtitle: "targetList",
492
+ icon: "filter"
493
+ },
494
+ fields: [
495
+ {
496
+ name: "source",
497
+ title: "Chips",
498
+ type: "select",
499
+ layout: "segmented",
500
+ group: "content",
501
+ initialValue: "all",
502
+ options: [{
503
+ value: "all",
504
+ label: "Every topic"
505
+ }, {
506
+ value: "pick",
507
+ label: "Pick topics"
508
+ }],
509
+ description: "Every topic, new ones included, A to Z."
510
+ },
511
+ {
512
+ name: "topics",
513
+ title: "Topics",
514
+ type: "array",
515
+ group: "content",
516
+ hidden: {
517
+ field: "source",
518
+ equals: "pick"
519
+ },
520
+ validation: {
521
+ min: 2,
522
+ max: 10
523
+ },
524
+ of: [{
525
+ name: "topic",
526
+ title: "Topic",
527
+ type: "reference",
528
+ reference: { to: ["col_topics"] }
529
+ }]
530
+ },
531
+ {
532
+ name: "allLabel",
533
+ title: "First chip",
534
+ type: "string",
535
+ group: "content",
536
+ initialValue: "All",
537
+ validation: { max: 20 },
538
+ localized: true,
539
+ description: "Leave empty to drop the chip."
540
+ },
541
+ {
542
+ name: "hideEmpty",
543
+ title: "Hide empty topics",
544
+ type: "boolean",
545
+ group: "content",
546
+ initialValue: true
547
+ },
548
+ {
549
+ name: "showCounts",
550
+ title: "Show counts",
551
+ type: "boolean",
552
+ group: "content"
553
+ },
554
+ {
555
+ name: "action",
556
+ title: "Clicking a chip",
557
+ type: "select",
558
+ layout: "radio",
559
+ group: "content",
560
+ initialValue: "filter",
561
+ options: [{
562
+ value: "filter",
563
+ label: "Filters the list on this page",
564
+ description: "No page load; the URL keeps the choice"
565
+ }, {
566
+ value: "navigate",
567
+ label: "Opens the topic's page",
568
+ description: "/journal/topic/camp"
569
+ }],
570
+ description: ""
571
+ },
572
+ {
573
+ name: "targetList",
574
+ title: "List to filter",
575
+ type: "string",
576
+ group: "content",
577
+ hidden: {
578
+ field: "action",
579
+ equals: "filter"
580
+ },
581
+ validation: {
582
+ required: true,
583
+ pattern: "^[a-z0-9-]+$",
584
+ patternMessage: "Use the list section's anchor, like stories."
585
+ },
586
+ description: "The anchor of the list section below, e.g. stories."
587
+ },
588
+ {
589
+ name: "param",
590
+ title: "URL parameter",
591
+ type: "string",
592
+ group: "content",
593
+ hidden: {
594
+ field: "action",
595
+ equals: "filter"
596
+ },
597
+ access: {
598
+ view: "schema.view",
599
+ edit: "schema.manage"
600
+ },
601
+ initialValue: "topic",
602
+ advanced: true,
603
+ description: "Keeps the filter in shared links, e.g. ?topic=camp."
604
+ },
605
+ {
606
+ name: "ariaLabel",
607
+ title: "Name for screen readers",
608
+ type: "string",
609
+ group: "content",
610
+ initialValue: "Filter stories by topic",
611
+ validation: {
612
+ required: true,
613
+ max: 60
614
+ },
615
+ description: "Not shown. Read by screen readers before the chips."
616
+ },
617
+ {
618
+ name: "mobile",
619
+ title: "On phones",
620
+ type: "select",
621
+ layout: "segmented",
622
+ group: "design",
623
+ initialValue: "scroll",
624
+ options: [
625
+ {
626
+ value: "scroll",
627
+ label: "Scroll sideways"
628
+ },
629
+ {
630
+ value: "wrap",
631
+ label: "Wrap"
632
+ },
633
+ {
634
+ value: "dropdown",
635
+ label: "Dropdown"
636
+ }
637
+ ]
638
+ },
639
+ {
640
+ name: "isSticky",
641
+ title: "Stick under the header",
642
+ type: "boolean",
643
+ group: "design"
644
+ },
645
+ {
646
+ name: "alignment",
647
+ title: "Alignment",
648
+ type: "select",
649
+ layout: "segmented",
650
+ group: "design",
651
+ initialValue: "start",
652
+ options: [{
653
+ value: "start",
654
+ label: "Left"
655
+ }, {
656
+ value: "center",
657
+ label: "Center"
658
+ }],
659
+ description: ""
660
+ }
661
+ ]
662
+ },
663
+ value: {
664
+ _variant: "pills",
665
+ source: "pick",
666
+ topics: [
667
+ "tp_cast-iron",
668
+ "tp_camp",
669
+ "tp_recipes",
670
+ "tp_trips",
671
+ "tp_care"
672
+ ],
673
+ allLabel: "All stories",
674
+ hideEmpty: true,
675
+ showCounts: false,
676
+ action: "filter",
677
+ targetList: "stories",
678
+ param: "topic",
679
+ ariaLabel: "Filter stories by topic",
680
+ mobile: "scroll",
681
+ isSticky: true,
682
+ alignment: "start"
683
+ },
684
+ notes: {
685
+ why: "The chips are a projection of the Topics collection, so the section holds either 'every topic' (a query) or an ordered list of topic references — never typed labels, which drift from the real taxonomy. Whether a chip filters in place or navigates is behavior the marketer chooses; the URL parameter is wired in code (locked). It points at the list it filters by anchor because the schema has no 'section on this page' reference. Mobile treatment is per-breakpoint design.",
686
+ sanity: "object `categoryFilter` { mode: string, categories: array<reference→category> }. Sanity renders the chips from a GROQ `*[_type=='category']`; filtering is pure frontend.",
687
+ htmlSignals: [
688
+ "<nav> or role=\"tablist\" of 3–15 short links/buttons just above a card grid",
689
+ "First item reads 'All' / 'Everything' and has aria-current or an active class",
690
+ "Hrefs like ?category=x, ?topic=x or /category/x/",
691
+ "Horizontal overflow-x: auto on small screens (scroll), or a <select> fallback"
692
+ ],
693
+ mcp: "Map each chip label to an existing taxonomy entry (create Topics if missing; slug from the href). If the chips equal the full taxonomy, set source 'all'; otherwise 'pick' in DOM order. action = 'filter' when hrefs are query strings or buttons, 'navigate' when they are /category/x paths. targetList = anchor of the next listing section (add one to it if missing). Don't store chip labels as strings.",
694
+ pitfalls: [
695
+ "Typed chip labels drift from topic names after a rename — always references.",
696
+ "A filter bar with no targetList silently does nothing.",
697
+ "Counts that include drafts or future posts — counts must use the published query.",
698
+ "Wrapping 12 chips on a phone pushes the list below the fold."
699
+ ]
700
+ }
701
+ },
702
+ {
703
+ id: "related-posts",
704
+ label: "Related posts",
705
+ category: "Listings & feeds",
706
+ brand: "Caldera",
707
+ previewLayout: "grid-3",
708
+ tags: [
709
+ "conditional",
710
+ "references",
711
+ "dynamic-query",
712
+ "validation",
713
+ "variants"
714
+ ],
715
+ proves: "Automatic, hand-picked or mixed (pins first, then auto) · match rules · fallback when nothing matches",
716
+ schema: {
717
+ name: "relatedPosts",
718
+ title: "Related posts",
719
+ kind: "block",
720
+ icon: "arrows-shuffle",
721
+ category: "Listings & feeds",
722
+ description: "More stories at the end of a post, matched or picked",
723
+ variants: [
724
+ {
725
+ id: "cards",
726
+ name: "Cards"
727
+ },
728
+ {
729
+ id: "compact",
730
+ name: "Compact list"
731
+ },
732
+ {
733
+ id: "carousel",
734
+ name: "Carousel"
735
+ }
736
+ ],
737
+ groups: [CONTENT, DESIGN],
738
+ preview: {
739
+ title: "heading",
740
+ subtitle: "mode",
741
+ icon: "arrows-shuffle"
742
+ },
743
+ fields: [
744
+ {
745
+ name: "heading",
746
+ title: "Heading",
747
+ type: "string",
748
+ group: "content",
749
+ initialValue: "Keep reading",
750
+ validation: { max: 48 },
751
+ localized: true
752
+ },
753
+ {
754
+ name: "mode",
755
+ title: "Which posts",
756
+ type: "select",
757
+ layout: "radio",
758
+ group: "content",
759
+ initialValue: "auto",
760
+ options: [
761
+ {
762
+ value: "auto",
763
+ label: "Automatic",
764
+ description: "Shares topics with this post, newest first"
765
+ },
766
+ {
767
+ value: "manual",
768
+ label: "Pick them"
769
+ },
770
+ {
771
+ value: "mixed",
772
+ label: "Pick some, fill the rest",
773
+ description: "Your picks first, then automatic"
774
+ }
775
+ ],
776
+ description: ""
777
+ },
778
+ {
779
+ name: "picks",
780
+ title: "Posts",
781
+ type: "array",
782
+ group: "content",
783
+ hidden: {
784
+ field: "mode",
785
+ equals: ["manual", "mixed"]
786
+ },
787
+ validation: {
788
+ min: 1,
789
+ max: 4,
790
+ unique: true
791
+ },
792
+ description: "The current post is skipped.",
793
+ of: [{
794
+ name: "post",
795
+ title: "Post",
796
+ type: "reference",
797
+ reference: { to: ["col_journal", "col_recipes"] }
798
+ }]
799
+ },
800
+ {
801
+ name: "matchOn",
802
+ title: "Match on",
803
+ type: "multiselect",
804
+ layout: "checkbox",
805
+ group: "content",
806
+ hidden: {
807
+ field: "mode",
808
+ equals: ["auto", "mixed"]
809
+ },
810
+ initialValue: ["topics"],
811
+ options: [
812
+ {
813
+ value: "topics",
814
+ label: "Topics"
815
+ },
816
+ {
817
+ value: "authors",
818
+ label: "Authors"
819
+ },
820
+ {
821
+ value: "product",
822
+ label: "Reviewed product"
823
+ }
824
+ ],
825
+ description: "More shared values rank higher. Ties go to the newest."
826
+ },
827
+ {
828
+ name: "showRecipes",
829
+ title: "Include recipes",
830
+ type: "boolean",
831
+ group: "content",
832
+ hidden: {
833
+ field: "mode",
834
+ equals: ["auto", "mixed"]
835
+ }
836
+ },
837
+ {
838
+ name: "count",
839
+ title: "How many",
840
+ type: "number",
841
+ group: "content",
842
+ layout: "slider",
843
+ numeric: {
844
+ min: 2,
845
+ max: 6,
846
+ step: 1
847
+ },
848
+ initialValue: 3,
849
+ description: ""
850
+ },
851
+ {
852
+ name: "fallback",
853
+ title: "When nothing matches",
854
+ type: "select",
855
+ group: "content",
856
+ hidden: {
857
+ field: "mode",
858
+ equals: ["auto", "mixed"]
859
+ },
860
+ initialValue: "newest",
861
+ options: [{
862
+ value: "newest",
863
+ label: "Show the newest posts"
864
+ }, {
865
+ value: "hide",
866
+ label: "Hide the section"
867
+ }],
868
+ description: ""
869
+ },
870
+ {
871
+ name: "showImages",
872
+ title: "Show images",
873
+ type: "boolean",
874
+ group: "design",
875
+ initialValue: true,
876
+ description: ""
877
+ },
878
+ {
879
+ name: "showDivider",
880
+ title: "Line above",
881
+ type: "boolean",
882
+ group: "design"
883
+ }
884
+ ]
885
+ },
886
+ value: {
887
+ _variant: "cards",
888
+ heading: "Keep reading",
889
+ mode: "mixed",
890
+ picks: ["en_2"],
891
+ matchOn: ["topics", "product"],
892
+ showRecipes: true,
893
+ count: 3,
894
+ fallback: "newest",
895
+ showImages: true,
896
+ showDivider: true
897
+ },
898
+ notes: {
899
+ why: "Related posts live on the post template (one placement for every post), so the default must work with zero editing: automatic matching on shared topics. Editors who care can pin a few (mixed) or hand-pick all (manual). The three-way mode is the condition that shows picks vs. match rules — the same field never means two things. References carry the picks so a renamed post stays linked; the current post is excluded by the renderer, not by validation.",
900
+ sanity: "In Sanity this is usually `related: array<reference→post>` on the post document plus a frontend GROQ fallback (`*[_type=='post' && _id != ^._id && count(categories[@._ref in ^.^.categories[]._ref]) > 0]`). Our section makes the rule visible and editable.",
901
+ htmlSignals: [
902
+ "Heading like 'Related', 'Keep reading', 'You might also like', 'More from' near the article end",
903
+ "2–4 small cards after </article> or before the comments/footer",
904
+ "Cards link to the same URL prefix as the current page",
905
+ "Sometimes inside <aside> with a smaller heading level (h2/h3)"
906
+ ],
907
+ mcp: "Place one relatedPosts on the post TEMPLATE, not per post. If the source CMS shows the same cards for posts with the same category, use mode 'auto' with matchOn ['topics']. If a post shows cards that don't share its topics, convert those to picks on that post's instance (mode 'mixed'). count = cards shown.",
908
+ pitfalls: [
909
+ "Manual picks on a template apply to every post — picks belong on the post's own instance.",
910
+ "Auto with no fallback renders an empty heading on a post with a unique topic.",
911
+ "Picking the current post (self-reference) — the renderer must skip it.",
912
+ "Unpublished picks: the reference resolves only to published entries on the live site."
913
+ ]
914
+ }
915
+ },
916
+ {
917
+ id: "resource-library",
918
+ label: "Resource library",
919
+ category: "Listings & feeds",
920
+ brand: "Ledgerline",
921
+ previewLayout: "grid-3",
922
+ tags: [
923
+ "dynamic-query",
924
+ "repeater",
925
+ "conditional",
926
+ "references",
927
+ "form",
928
+ "validation",
929
+ "responsive-layout"
930
+ ],
931
+ proves: "Multi-facet filters defined as data (field · control · order) · gated downloads by type · pinned items above the query",
932
+ docTitle: "Resources",
933
+ urlPrefix: "ledgerline.com/",
934
+ schema: {
935
+ name: "resourceLibrary",
936
+ title: "Resource library",
937
+ kind: "block",
938
+ icon: "books",
939
+ category: "Listings & feeds",
940
+ description: "Guides, reports and templates with search and filters",
941
+ variants: [{
942
+ id: "sidebar",
943
+ name: "Filters on the left"
944
+ }, {
945
+ id: "top",
946
+ name: "Filters on top"
947
+ }],
948
+ groups: [
949
+ CONTENT,
950
+ QUERY,
951
+ {
952
+ name: "filters",
953
+ title: "Filters",
954
+ icon: "adjustments"
955
+ },
956
+ DESIGN
957
+ ],
958
+ preview: {
959
+ title: "heading",
960
+ subtitle: "intro",
961
+ icon: "books"
962
+ },
963
+ fields: [
964
+ {
965
+ name: "heading",
966
+ title: "Heading",
967
+ type: "string",
968
+ group: "content",
969
+ validation: {
970
+ required: true,
971
+ recommendedMax: 48
972
+ },
973
+ ai: true,
974
+ localized: true
975
+ },
976
+ {
977
+ name: "intro",
978
+ title: "Intro",
979
+ type: "text",
980
+ rows: 2,
981
+ group: "content",
982
+ ai: true,
983
+ localized: true,
984
+ description: ""
985
+ },
986
+ {
987
+ name: "pinned",
988
+ title: "Pinned",
989
+ type: "array",
990
+ group: "content",
991
+ validation: {
992
+ max: 3,
993
+ unique: true
994
+ },
995
+ of: [{
996
+ name: "resource",
997
+ title: "Resource",
998
+ type: "reference",
999
+ reference: { to: ["col_resources"] }
1000
+ }]
1001
+ },
1002
+ {
1003
+ name: "query",
1004
+ title: "Resources to list",
1005
+ type: "object",
1006
+ group: "query",
1007
+ fields: [
1008
+ collectionField("col_resources", "Resources"),
1009
+ {
1010
+ name: "types",
1011
+ title: "Only these types",
1012
+ type: "multiselect",
1013
+ options: [
1014
+ {
1015
+ value: "guide",
1016
+ label: "Guides"
1017
+ },
1018
+ {
1019
+ value: "report",
1020
+ label: "Reports"
1021
+ },
1022
+ {
1023
+ value: "template",
1024
+ label: "Templates"
1025
+ },
1026
+ {
1027
+ value: "webinar",
1028
+ label: "Webinars"
1029
+ },
1030
+ {
1031
+ value: "case-study",
1032
+ label: "Case studies"
1033
+ }
1034
+ ],
1035
+ description: "Leave empty for every type."
1036
+ },
1037
+ {
1038
+ name: "sort",
1039
+ title: "Order",
1040
+ type: "select",
1041
+ initialValue: "newest",
1042
+ options: [
1043
+ {
1044
+ value: "newest",
1045
+ label: "Newest first"
1046
+ },
1047
+ {
1048
+ value: "popular",
1049
+ label: "Most downloaded"
1050
+ },
1051
+ {
1052
+ value: "title",
1053
+ label: "A to Z"
1054
+ }
1055
+ ],
1056
+ description: "Most downloaded uses the last 90 days."
1057
+ },
1058
+ {
1059
+ name: "pageSize",
1060
+ title: "Per page",
1061
+ type: "number",
1062
+ layout: "slider",
1063
+ numeric: {
1064
+ min: 6,
1065
+ max: 36,
1066
+ step: 6
1067
+ },
1068
+ initialValue: 12,
1069
+ description: ""
1070
+ }
1071
+ ]
1072
+ },
1073
+ {
1074
+ name: "showSearch",
1075
+ title: "Show search box",
1076
+ type: "boolean",
1077
+ group: "filters",
1078
+ initialValue: true
1079
+ },
1080
+ {
1081
+ name: "searchPlaceholder",
1082
+ title: "Search placeholder",
1083
+ type: "string",
1084
+ group: "filters",
1085
+ hidden: {
1086
+ field: "showSearch",
1087
+ equals: true
1088
+ },
1089
+ initialValue: "Search guides, reports and templates",
1090
+ validation: { max: 48 },
1091
+ description: ""
1092
+ },
1093
+ {
1094
+ name: "facets",
1095
+ title: "Filters",
1096
+ type: "array",
1097
+ group: "filters",
1098
+ itemNoun: "filter",
1099
+ validation: { max: 5 },
1100
+ description: "Each filter reads one field of the Resources collection.",
1101
+ of: [{
1102
+ name: "facet",
1103
+ title: "Filter",
1104
+ type: "object",
1105
+ icon: "adjustments",
1106
+ preview: {
1107
+ title: "label",
1108
+ subtitle: "field",
1109
+ fallback: "Untitled filter"
1110
+ },
1111
+ fields: [
1112
+ {
1113
+ name: "label",
1114
+ title: "Label",
1115
+ type: "string",
1116
+ validation: {
1117
+ required: true,
1118
+ max: 24
1119
+ },
1120
+ localized: true
1121
+ },
1122
+ {
1123
+ name: "field",
1124
+ title: "Filters by",
1125
+ type: "select",
1126
+ access: { edit: "schema.manage" },
1127
+ lockReason: "Facets map to indexed fields; the developer adds new ones.",
1128
+ options: [
1129
+ {
1130
+ value: "type",
1131
+ label: "Type"
1132
+ },
1133
+ {
1134
+ value: "topics",
1135
+ label: "Topic"
1136
+ },
1137
+ {
1138
+ value: "industry",
1139
+ label: "Industry"
1140
+ },
1141
+ {
1142
+ value: "role",
1143
+ label: "Role"
1144
+ },
1145
+ {
1146
+ value: "format",
1147
+ label: "Format"
1148
+ }
1149
+ ],
1150
+ validation: { required: true },
1151
+ description: ""
1152
+ },
1153
+ {
1154
+ name: "control",
1155
+ title: "Shown as",
1156
+ type: "select",
1157
+ layout: "segmented",
1158
+ initialValue: "checkbox",
1159
+ options: [
1160
+ {
1161
+ value: "checkbox",
1162
+ label: "Checkboxes"
1163
+ },
1164
+ {
1165
+ value: "chips",
1166
+ label: "Chips"
1167
+ },
1168
+ {
1169
+ value: "dropdown",
1170
+ label: "Dropdown"
1171
+ }
1172
+ ],
1173
+ description: ""
1174
+ },
1175
+ {
1176
+ name: "allowMultiple",
1177
+ title: "Allow several",
1178
+ type: "boolean",
1179
+ initialValue: true,
1180
+ description: "Results match any of the ticked values."
1181
+ },
1182
+ {
1183
+ name: "order",
1184
+ title: "Value order",
1185
+ type: "select",
1186
+ initialValue: "count",
1187
+ options: [{
1188
+ value: "count",
1189
+ label: "Most results first"
1190
+ }, {
1191
+ value: "alpha",
1192
+ label: "A to Z"
1193
+ }],
1194
+ description: ""
1195
+ },
1196
+ {
1197
+ name: "isCollapsed",
1198
+ title: "Start collapsed",
1199
+ type: "boolean"
1200
+ }
1201
+ ]
1202
+ }]
1203
+ },
1204
+ {
1205
+ name: "useUrlSync",
1206
+ title: "Keep filters in the URL",
1207
+ type: "boolean",
1208
+ group: "filters",
1209
+ initialValue: true
1210
+ },
1211
+ {
1212
+ name: "gate",
1213
+ title: "Downloads",
1214
+ type: "select",
1215
+ group: "content",
1216
+ layout: "radio",
1217
+ initialValue: "open",
1218
+ options: [{
1219
+ value: "open",
1220
+ label: "Open to everyone"
1221
+ }, {
1222
+ value: "form",
1223
+ label: "Ask for details first",
1224
+ description: "Shows a form before the file"
1225
+ }],
1226
+ description: ""
1227
+ },
1228
+ {
1229
+ name: "gateForm",
1230
+ title: "Form",
1231
+ type: "reference",
1232
+ group: "content",
1233
+ reference: { to: ["form"] },
1234
+ hidden: {
1235
+ field: "gate",
1236
+ equals: "form"
1237
+ },
1238
+ validation: { required: true },
1239
+ description: "Visitors fill it once; later downloads skip it."
1240
+ },
1241
+ {
1242
+ name: "gateTypes",
1243
+ title: "Ask only for",
1244
+ type: "multiselect",
1245
+ group: "content",
1246
+ hidden: {
1247
+ field: "gate",
1248
+ equals: "form"
1249
+ },
1250
+ options: [
1251
+ {
1252
+ value: "guide",
1253
+ label: "Guides"
1254
+ },
1255
+ {
1256
+ value: "report",
1257
+ label: "Reports"
1258
+ },
1259
+ {
1260
+ value: "template",
1261
+ label: "Templates"
1262
+ }
1263
+ ],
1264
+ description: "Leave empty to gate every type."
1265
+ },
1266
+ {
1267
+ name: "columns",
1268
+ title: "Columns on desktop",
1269
+ type: "number",
1270
+ group: "design",
1271
+ layout: "slider",
1272
+ numeric: {
1273
+ min: 2,
1274
+ max: 4,
1275
+ step: 1
1276
+ },
1277
+ initialValue: 3,
1278
+ description: ""
1279
+ },
1280
+ {
1281
+ name: "mobileFilters",
1282
+ title: "Filters on phones",
1283
+ type: "select",
1284
+ group: "design",
1285
+ layout: "segmented",
1286
+ initialValue: "sheet",
1287
+ options: [{
1288
+ value: "sheet",
1289
+ label: "Bottom sheet"
1290
+ }, {
1291
+ value: "inline",
1292
+ label: "Above results"
1293
+ }]
1294
+ }
1295
+ ]
1296
+ },
1297
+ value: {
1298
+ _variant: "sidebar",
1299
+ heading: "Guides for finance teams that close fast",
1300
+ intro: "Playbooks, benchmarks and templates from 1,400 finance teams on Ledgerline.",
1301
+ pinned: ["en_res_close-benchmark-2026"],
1302
+ query: {
1303
+ collection: "col_resources",
1304
+ types: [],
1305
+ sort: "newest",
1306
+ pageSize: 12
1307
+ },
1308
+ showSearch: true,
1309
+ searchPlaceholder: "Search guides, reports and templates",
1310
+ facets: [
1311
+ {
1312
+ _key: "f1",
1313
+ label: "Type",
1314
+ field: "type",
1315
+ control: "checkbox",
1316
+ allowMultiple: true,
1317
+ order: "count",
1318
+ isCollapsed: false
1319
+ },
1320
+ {
1321
+ _key: "f2",
1322
+ label: "Topic",
1323
+ field: "topics",
1324
+ control: "chips",
1325
+ allowMultiple: true,
1326
+ order: "alpha",
1327
+ isCollapsed: false
1328
+ },
1329
+ {
1330
+ _key: "f3",
1331
+ label: "Industry",
1332
+ field: "industry",
1333
+ control: "dropdown",
1334
+ allowMultiple: false,
1335
+ order: "alpha",
1336
+ isCollapsed: true
1337
+ }
1338
+ ],
1339
+ useUrlSync: true,
1340
+ gate: "form",
1341
+ gateForm: "form_resource-download",
1342
+ gateTypes: ["report", "template"],
1343
+ columns: 3,
1344
+ mobileFilters: "sheet"
1345
+ },
1346
+ notes: {
1347
+ why: "Resources are a collection; the library is a query plus a list of facets. Facets are DATA (label · which field · control · order) so marketers can add 'Industry' without code — but the field each facet reads is developer-locked, because it must be an indexed field. Gating is a page-level decision by resource type, not a flag copied onto every resource, and the form is a reference so submissions land in one place.",
1348
+ sanity: "Sanity would hold `resource` documents and a `resourceLibrary` object with `featured: array<reference>`; facets are almost always hard-coded in the frontend or an Algolia config. Gating is typically a boolean on each resource.",
1349
+ htmlSignals: [
1350
+ "A left column (or top bar) of <fieldset>/<details> groups with checkboxes and counts in parentheses",
1351
+ "A search <input type=search> above a card grid",
1352
+ "Cards with a type badge (Guide, Report, Template) and a 'Download' or 'Read' action",
1353
+ "URL query like ?type=guide&topic=close updating as filters change",
1354
+ "A modal or redirect with a form before a PDF opens (gated)"
1355
+ ],
1356
+ mcp: "Create col_resources with fields title, summary, type (select from the badges), topics, industry, file/url, cover. Import every card. Each filter group becomes one facet: label = group legend; field = the collection field whose values match the checkbox labels (create the field if missing, then ask the developer to index it); control from the DOM (checkbox list → checkbox, pill buttons → chips, <select> → dropdown). If downloads open a form, set gate 'form' and create/attach the form; restrict gateTypes to the badges that trigger it.",
1357
+ pitfalls: [
1358
+ "Facet values typed into the section drift from entry values — values always come from the collection.",
1359
+ "A facet on a non-indexed field works in the demo, then times out at 5,000 resources.",
1360
+ "Gating every type (including blog-like guides) hurts organic traffic; gate by type.",
1361
+ "Pinned items that also match the filters appear twice unless the renderer de-duplicates."
1362
+ ]
1363
+ }
1364
+ },
1365
+ {
1366
+ id: "podcast-episode-list",
1367
+ label: "Podcast episode list",
1368
+ category: "Listings & feeds",
1369
+ brand: "Caldera",
1370
+ previewLayout: "list",
1371
+ tags: [
1372
+ "dynamic-query",
1373
+ "media-heavy",
1374
+ "references",
1375
+ "conditional",
1376
+ "repeater",
1377
+ "embed",
1378
+ "a11y"
1379
+ ],
1380
+ proves: "Show-level details + platform links (repeater) · episodes by query with season filter · inline player vs episode page",
1381
+ docTitle: "Low & Slow — the Caldera podcast",
1382
+ urlPrefix: "caldera.bettercms.site/",
1383
+ schema: {
1384
+ name: "podcastEpisodes",
1385
+ title: "Podcast episodes",
1386
+ kind: "block",
1387
+ icon: "microphone",
1388
+ category: "Listings & feeds",
1389
+ description: "The show, where to listen, and its latest episodes",
1390
+ variants: [{
1391
+ id: "list",
1392
+ name: "List with player"
1393
+ }, {
1394
+ id: "cards",
1395
+ name: "Cards"
1396
+ }],
1397
+ groups: [
1398
+ CONTENT,
1399
+ QUERY,
1400
+ DESIGN
1401
+ ],
1402
+ fieldsets: [{
1403
+ name: "show",
1404
+ title: "The show",
1405
+ description: "Shown above the episode list."
1406
+ }],
1407
+ preview: {
1408
+ title: "showTitle",
1409
+ subtitle: "showDescription",
1410
+ media: "showArt"
1411
+ },
1412
+ fields: [
1413
+ {
1414
+ name: "showTitle",
1415
+ title: "Show name",
1416
+ type: "string",
1417
+ group: "content",
1418
+ fieldset: "show",
1419
+ validation: {
1420
+ required: true,
1421
+ max: 60
1422
+ }
1423
+ },
1424
+ {
1425
+ name: "showDescription",
1426
+ title: "About the show",
1427
+ type: "text",
1428
+ rows: 3,
1429
+ group: "content",
1430
+ fieldset: "show",
1431
+ validation: { recommendedMax: 280 },
1432
+ localized: true,
1433
+ description: "Podcast apps show the same text."
1434
+ },
1435
+ {
1436
+ name: "showArt",
1437
+ title: "Show art",
1438
+ type: "image",
1439
+ group: "content",
1440
+ fieldset: "show",
1441
+ validation: { required: true },
1442
+ description: "Square, 3000 × 3000. Apps reject anything under 1400."
1443
+ },
1444
+ {
1445
+ name: "hosts",
1446
+ title: "Hosts",
1447
+ type: "array",
1448
+ group: "content",
1449
+ fieldset: "show",
1450
+ validation: { max: 3 },
1451
+ description: "",
1452
+ of: [{
1453
+ name: "host",
1454
+ title: "Host",
1455
+ type: "reference",
1456
+ reference: { to: ["col_authors"] }
1457
+ }]
1458
+ },
1459
+ {
1460
+ name: "platforms",
1461
+ title: "Listen on",
1462
+ type: "array",
1463
+ group: "content",
1464
+ itemNoun: "platform",
1465
+ openMode: "inline",
1466
+ validation: { max: 7 },
1467
+ of: [{
1468
+ name: "platform",
1469
+ title: "Platform",
1470
+ type: "object",
1471
+ icon: "headphones",
1472
+ preview: {
1473
+ title: "service",
1474
+ subtitle: "link.href"
1475
+ },
1476
+ fields: [{
1477
+ name: "service",
1478
+ title: "Service",
1479
+ type: "select",
1480
+ validation: { required: true },
1481
+ options: [
1482
+ {
1483
+ value: "apple",
1484
+ label: "Apple Podcasts"
1485
+ },
1486
+ {
1487
+ value: "spotify",
1488
+ label: "Spotify"
1489
+ },
1490
+ {
1491
+ value: "youtube",
1492
+ label: "YouTube"
1493
+ },
1494
+ {
1495
+ value: "overcast",
1496
+ label: "Overcast"
1497
+ },
1498
+ {
1499
+ value: "pocketcasts",
1500
+ label: "Pocket Casts"
1501
+ },
1502
+ {
1503
+ value: "rss",
1504
+ label: "RSS feed"
1505
+ }
1506
+ ],
1507
+ description: ""
1508
+ }, {
1509
+ name: "link",
1510
+ title: "Link",
1511
+ type: "link",
1512
+ validation: { required: true }
1513
+ }]
1514
+ }]
1515
+ },
1516
+ {
1517
+ name: "episodes",
1518
+ title: "Episodes to list",
1519
+ type: "object",
1520
+ group: "query",
1521
+ fields: [
1522
+ collectionField("col_episodes", "Podcast episodes"),
1523
+ {
1524
+ name: "season",
1525
+ title: "Season",
1526
+ type: "number",
1527
+ numeric: {
1528
+ min: 1,
1529
+ step: 1
1530
+ },
1531
+ description: "Leave empty for every season."
1532
+ },
1533
+ {
1534
+ name: "types",
1535
+ title: "Episode types",
1536
+ type: "multiselect",
1537
+ initialValue: ["full", "bonus"],
1538
+ options: [
1539
+ {
1540
+ value: "full",
1541
+ label: "Full"
1542
+ },
1543
+ {
1544
+ value: "bonus",
1545
+ label: "Bonus"
1546
+ },
1547
+ {
1548
+ value: "trailer",
1549
+ label: "Trailer"
1550
+ }
1551
+ ],
1552
+ description: ""
1553
+ },
1554
+ {
1555
+ name: "sort",
1556
+ title: "Order",
1557
+ type: "select",
1558
+ initialValue: "newest",
1559
+ options: [{
1560
+ value: "newest",
1561
+ label: "Newest first"
1562
+ }, {
1563
+ value: "episode",
1564
+ label: "Episode number"
1565
+ }]
1566
+ },
1567
+ {
1568
+ name: "limit",
1569
+ title: "How many",
1570
+ type: "number",
1571
+ layout: "slider",
1572
+ numeric: {
1573
+ min: 3,
1574
+ max: 30,
1575
+ step: 1
1576
+ },
1577
+ initialValue: 10,
1578
+ description: ""
1579
+ }
1580
+ ]
1581
+ },
1582
+ {
1583
+ name: "highlight",
1584
+ title: "Highlight",
1585
+ type: "select",
1586
+ group: "query",
1587
+ layout: "segmented",
1588
+ initialValue: "latest",
1589
+ options: [
1590
+ {
1591
+ value: "latest",
1592
+ label: "Latest episode"
1593
+ },
1594
+ {
1595
+ value: "pick",
1596
+ label: "Pick one"
1597
+ },
1598
+ {
1599
+ value: "none",
1600
+ label: "None"
1601
+ }
1602
+ ]
1603
+ },
1604
+ {
1605
+ name: "featuredEpisode",
1606
+ title: "Episode",
1607
+ type: "reference",
1608
+ group: "query",
1609
+ reference: { to: ["col_episodes"] },
1610
+ hidden: {
1611
+ field: "highlight",
1612
+ equals: "pick"
1613
+ },
1614
+ validation: { required: true }
1615
+ },
1616
+ {
1617
+ name: "play",
1618
+ title: "Play button",
1619
+ type: "select",
1620
+ group: "design",
1621
+ layout: "radio",
1622
+ initialValue: "inline",
1623
+ options: [{
1624
+ value: "inline",
1625
+ label: "Plays here",
1626
+ description: "A sticky mini player keeps playing across pages"
1627
+ }, {
1628
+ value: "page",
1629
+ label: "Opens the episode page"
1630
+ }],
1631
+ description: ""
1632
+ },
1633
+ {
1634
+ name: "showNotesPreview",
1635
+ title: "Show notes preview",
1636
+ type: "boolean",
1637
+ group: "design",
1638
+ initialValue: true
1639
+ },
1640
+ {
1641
+ name: "showDuration",
1642
+ title: "Show length",
1643
+ type: "boolean",
1644
+ group: "design",
1645
+ initialValue: true,
1646
+ description: ""
1647
+ },
1648
+ {
1649
+ name: "subscribeButton",
1650
+ title: "Subscribe button",
1651
+ type: "button",
1652
+ group: "content"
1653
+ }
1654
+ ]
1655
+ },
1656
+ value: {
1657
+ _variant: "list",
1658
+ showTitle: "Low & Slow",
1659
+ showDescription: "Conversations with the people who cook outside for a living — guides, pitmasters, foragers and the occasional blacksmith. Every other Tuesday.",
1660
+ showArt: image("lowandslow-art", "Low & Slow podcast cover: a skillet over embers with the show name in cream type", 1500, 1500),
1661
+ hosts: ["au_mei", "en_a1"],
1662
+ platforms: [
1663
+ {
1664
+ _key: "p1",
1665
+ service: "apple",
1666
+ link: {
1667
+ type: "url",
1668
+ href: "https://podcasts.apple.com/us/podcast/low-slow/id1742210981",
1669
+ newTab: true
1670
+ }
1671
+ },
1672
+ {
1673
+ _key: "p2",
1674
+ service: "spotify",
1675
+ link: {
1676
+ type: "url",
1677
+ href: "https://open.spotify.com/show/4kT9pQvZ2mRuLowSlow",
1678
+ newTab: true
1679
+ }
1680
+ },
1681
+ {
1682
+ _key: "p3",
1683
+ service: "youtube",
1684
+ link: {
1685
+ type: "url",
1686
+ href: "https://www.youtube.com/@calderacooks/podcasts",
1687
+ newTab: true
1688
+ }
1689
+ },
1690
+ {
1691
+ _key: "p4",
1692
+ service: "rss",
1693
+ link: {
1694
+ type: "url",
1695
+ href: "https://caldera.bettercms.site/podcast/feed.xml"
1696
+ }
1697
+ }
1698
+ ],
1699
+ episodes: {
1700
+ collection: "col_episodes",
1701
+ types: ["full", "bonus"],
1702
+ sort: "newest",
1703
+ limit: 10
1704
+ },
1705
+ highlight: "latest",
1706
+ play: "inline",
1707
+ showNotesPreview: true,
1708
+ showDuration: true,
1709
+ subscribeButton: {
1710
+ label: "Subscribe free",
1711
+ href: "https://podcasts.apple.com/us/podcast/low-slow/id1742210981",
1712
+ type: "url",
1713
+ style: "primary",
1714
+ newTab: true
1715
+ }
1716
+ },
1717
+ notes: {
1718
+ why: "Episodes are entries (they have their own page, audio file, show notes, transcript — see the Podcast episode entry), so the list is a query with a season and type filter. Show-level facts (name, art, hosts, platforms) are said once on the section because there is one show per page; if a brand runs several shows, promote them to a Shows collection and swap these fields for a show reference. Platform links are a small repeater of service + link so badges render with the right logo and order.",
1719
+ sanity: "Sanity: `podcastShow` document + `episode` documents (`audio: file`, `season: number`); the listing is GROQ `*[_type=='episode' && show._ref==$show] | order(publishedAt desc)`. Platforms usually an array of {platform, url} objects.",
1720
+ htmlSignals: [
1721
+ "A square cover image next to 'Listen on' badges (Apple Podcasts, Spotify, YouTube logos)",
1722
+ "Repeated rows with episode number, date, duration (e.g. 48 min) and a play button",
1723
+ "<audio> elements or an embedded player iframe (Transistor, Buzzsprout, Simplecast, Spotify)",
1724
+ "A link to an RSS feed (application/rss+xml) or 'Subscribe' button"
1725
+ ],
1726
+ mcp: "Read the show's RSS feed if linked — it is the cleanest source: channel → show fields; each <item> → an episode entry (enclosure url → audio, itunes:duration, itunes:episode/season, content:encoded → show notes). Badges → platforms (match by logo alt/href host). Place one podcastEpisodes section with the collection query; set featured 'latest' when the top episode is larger.",
1727
+ pitfalls: [
1728
+ "Copying the embed iframe as the 'episode' loses the audio file and show notes — import from RSS.",
1729
+ "Show art under 1400 px is rejected by Apple Podcasts.",
1730
+ "Two players playing at once when several inline players exist — the renderer must use one shared player.",
1731
+ "Trailers at the top of a 'newest' list unless types excludes them."
1732
+ ]
1733
+ }
1734
+ },
1735
+ {
1736
+ id: "changelog",
1737
+ label: "Changelog",
1738
+ category: "Listings & feeds",
1739
+ brand: "Ledgerline",
1740
+ previewLayout: "timeline",
1741
+ tags: [
1742
+ "deep-nesting",
1743
+ "repeater",
1744
+ "conditional",
1745
+ "rich-text",
1746
+ "validation",
1747
+ "dynamic-query",
1748
+ "variants"
1749
+ ],
1750
+ proves: "Releases → changes → type tags · breaking/deprecated changes reveal a migration note · collection or written-here source",
1751
+ docTitle: "Changelog",
1752
+ urlPrefix: "ledgerline.com/",
1753
+ schema: {
1754
+ name: "changelog",
1755
+ title: "Changelog",
1756
+ kind: "block",
1757
+ icon: "history",
1758
+ category: "Listings & feeds",
1759
+ description: "Versions and what changed in each",
1760
+ variants: [{
1761
+ id: "timeline",
1762
+ name: "Timeline"
1763
+ }, {
1764
+ id: "compact",
1765
+ name: "Compact"
1766
+ }],
1767
+ groups: [CONTENT, DESIGN],
1768
+ preview: {
1769
+ title: "heading",
1770
+ subtitle: "intro",
1771
+ icon: "history"
1772
+ },
1773
+ fields: [
1774
+ {
1775
+ name: "heading",
1776
+ title: "Heading",
1777
+ type: "string",
1778
+ group: "content",
1779
+ validation: {
1780
+ required: true,
1781
+ max: 48
1782
+ },
1783
+ localized: true
1784
+ },
1785
+ {
1786
+ name: "intro",
1787
+ title: "Intro",
1788
+ type: "text",
1789
+ rows: 2,
1790
+ group: "content",
1791
+ description: ""
1792
+ },
1793
+ {
1794
+ name: "source",
1795
+ title: "Releases come from",
1796
+ type: "select",
1797
+ group: "content",
1798
+ layout: "segmented",
1799
+ initialValue: "collection",
1800
+ options: [{
1801
+ value: "collection",
1802
+ label: "Releases collection"
1803
+ }, {
1804
+ value: "inline",
1805
+ label: "Written here"
1806
+ }]
1807
+ },
1808
+ {
1809
+ name: "query",
1810
+ title: "Releases to list",
1811
+ type: "object",
1812
+ group: "content",
1813
+ openMode: "inline",
1814
+ hidden: {
1815
+ field: "source",
1816
+ equals: "collection"
1817
+ },
1818
+ fields: [
1819
+ collectionField("col_releases", "Releases"),
1820
+ {
1821
+ name: "products",
1822
+ title: "Products",
1823
+ type: "multiselect",
1824
+ options: [
1825
+ {
1826
+ value: "api",
1827
+ label: "API"
1828
+ },
1829
+ {
1830
+ value: "dashboard",
1831
+ label: "Dashboard"
1832
+ },
1833
+ {
1834
+ value: "sdk",
1835
+ label: "SDKs"
1836
+ }
1837
+ ],
1838
+ description: "Leave empty for every product."
1839
+ },
1840
+ {
1841
+ name: "limit",
1842
+ title: "How many",
1843
+ type: "number",
1844
+ layout: "slider",
1845
+ numeric: {
1846
+ min: 5,
1847
+ max: 50,
1848
+ step: 5
1849
+ },
1850
+ initialValue: 10,
1851
+ description: ""
1852
+ }
1853
+ ]
1854
+ },
1855
+ {
1856
+ name: "releases",
1857
+ title: "Releases",
1858
+ type: "array",
1859
+ group: "content",
1860
+ itemNoun: "release",
1861
+ hidden: {
1862
+ field: "source",
1863
+ equals: "inline"
1864
+ },
1865
+ validation: { max: 60 },
1866
+ of: [{
1867
+ name: "release",
1868
+ title: "Release",
1869
+ type: "object",
1870
+ icon: "tag",
1871
+ preview: {
1872
+ title: "version",
1873
+ subtitle: "title",
1874
+ fallback: "Untitled release"
1875
+ },
1876
+ fields: [
1877
+ {
1878
+ name: "version",
1879
+ title: "Version",
1880
+ type: "string",
1881
+ validation: {
1882
+ required: true,
1883
+ pattern: "^v?\\d+\\.\\d+(\\.\\d+)?(-[a-z0-9.]+)?$",
1884
+ patternMessage: "Use a version like 2.14.0 or v2.14.0-beta.1.",
1885
+ unique: true
1886
+ },
1887
+ placeholder: "2.14.0",
1888
+ description: "Also becomes the anchor, e.g. #v2-14-0."
1889
+ },
1890
+ {
1891
+ name: "date",
1892
+ title: "Release date",
1893
+ type: "date",
1894
+ validation: { required: true },
1895
+ description: ""
1896
+ },
1897
+ {
1898
+ name: "title",
1899
+ title: "Headline",
1900
+ type: "string",
1901
+ validation: { recommendedMax: 70 }
1902
+ },
1903
+ {
1904
+ name: "screenshot",
1905
+ title: "Screenshot",
1906
+ type: "image"
1907
+ },
1908
+ {
1909
+ name: "changes",
1910
+ title: "Changes",
1911
+ type: "array",
1912
+ itemNoun: "change",
1913
+ validation: {
1914
+ min: 1,
1915
+ max: 40
1916
+ },
1917
+ of: [{
1918
+ name: "change",
1919
+ title: "Change",
1920
+ type: "object",
1921
+ icon: "point",
1922
+ preview: {
1923
+ title: "title",
1924
+ subtitle: "type",
1925
+ fallback: "Untitled change"
1926
+ },
1927
+ fields: [
1928
+ {
1929
+ name: "type",
1930
+ title: "Type",
1931
+ type: "select",
1932
+ layout: "segmented",
1933
+ validation: { required: true },
1934
+ options: [
1935
+ {
1936
+ value: "new",
1937
+ label: "New"
1938
+ },
1939
+ {
1940
+ value: "improved",
1941
+ label: "Improved"
1942
+ },
1943
+ {
1944
+ value: "fixed",
1945
+ label: "Fixed"
1946
+ },
1947
+ {
1948
+ value: "deprecated",
1949
+ label: "Deprecated"
1950
+ },
1951
+ {
1952
+ value: "breaking",
1953
+ label: "Breaking"
1954
+ },
1955
+ {
1956
+ value: "security",
1957
+ label: "Security"
1958
+ }
1959
+ ],
1960
+ description: ""
1961
+ },
1962
+ {
1963
+ name: "title",
1964
+ title: "What changed",
1965
+ type: "string",
1966
+ validation: {
1967
+ required: true,
1968
+ recommendedMax: 90
1969
+ }
1970
+ },
1971
+ {
1972
+ name: "details",
1973
+ title: "Details",
1974
+ type: "richtext"
1975
+ },
1976
+ {
1977
+ name: "areas",
1978
+ title: "Areas",
1979
+ type: "multiselect",
1980
+ options: [
1981
+ {
1982
+ value: "payments",
1983
+ label: "Payments"
1984
+ },
1985
+ {
1986
+ value: "ledger",
1987
+ label: "Ledger"
1988
+ },
1989
+ {
1990
+ value: "reports",
1991
+ label: "Reports"
1992
+ },
1993
+ {
1994
+ value: "auth",
1995
+ label: "Auth"
1996
+ },
1997
+ {
1998
+ value: "webhooks",
1999
+ label: "Webhooks"
2000
+ }
2001
+ ],
2002
+ description: ""
2003
+ },
2004
+ {
2005
+ name: "migration",
2006
+ title: "How to migrate",
2007
+ type: "richtext",
2008
+ hidden: {
2009
+ field: "type",
2010
+ equals: ["breaking", "deprecated"]
2011
+ },
2012
+ validation: { required: true }
2013
+ },
2014
+ {
2015
+ name: "removalDate",
2016
+ title: "Removed on",
2017
+ type: "date",
2018
+ hidden: {
2019
+ field: "type",
2020
+ equals: "deprecated"
2021
+ },
2022
+ description: "When the deprecated behavior stops working."
2023
+ },
2024
+ {
2025
+ name: "docs",
2026
+ title: "Docs link",
2027
+ type: "link"
2028
+ }
2029
+ ]
2030
+ }]
2031
+ }
2032
+ ]
2033
+ }]
2034
+ },
2035
+ {
2036
+ name: "hasRssFeed",
2037
+ title: "Publish an RSS feed",
2038
+ type: "boolean",
2039
+ group: "content",
2040
+ initialValue: true,
2041
+ description: "Publishes /changelog/feed.xml."
2042
+ },
2043
+ {
2044
+ name: "subscribeForm",
2045
+ title: "Email updates",
2046
+ type: "reference",
2047
+ group: "content",
2048
+ reference: { to: ["form"] }
2049
+ },
2050
+ {
2051
+ name: "showTypeFilter",
2052
+ title: "Show type filter",
2053
+ type: "boolean",
2054
+ group: "design",
2055
+ initialValue: true
2056
+ },
2057
+ {
2058
+ name: "groupBy",
2059
+ title: "Group by",
2060
+ type: "select",
2061
+ group: "design",
2062
+ layout: "segmented",
2063
+ initialValue: "release",
2064
+ options: [{
2065
+ value: "release",
2066
+ label: "Release"
2067
+ }, {
2068
+ value: "month",
2069
+ label: "Month"
2070
+ }],
2071
+ description: ""
2072
+ }
2073
+ ]
2074
+ },
2075
+ value: {
2076
+ _variant: "timeline",
2077
+ heading: "Changelog",
2078
+ intro: "Every change to the Ledgerline API, dashboard and SDKs. Breaking changes come with 90 days' notice.",
2079
+ source: "inline",
2080
+ query: {
2081
+ collection: "col_releases",
2082
+ products: [],
2083
+ limit: 10
2084
+ },
2085
+ releases: [{
2086
+ _key: "r1",
2087
+ version: "2.14.0",
2088
+ date: "2026-09-29",
2089
+ title: "Multi-entity close and faster ledger exports",
2090
+ screenshot: image("ledgerline-multientity", "The close checklist showing three entities side by side", 1600, 1e3),
2091
+ changes: [
2092
+ {
2093
+ _key: "c1",
2094
+ type: "new",
2095
+ title: "Close several entities in one checklist",
2096
+ details: "<p>Group subsidiaries under a parent and close them together. Intercompany eliminations post automatically.</p>",
2097
+ areas: ["ledger", "reports"],
2098
+ docs: {
2099
+ type: "url",
2100
+ href: "https://docs.ledgerline.com/guides/multi-entity-close"
2101
+ }
2102
+ },
2103
+ {
2104
+ _key: "c2",
2105
+ type: "improved",
2106
+ title: "Ledger CSV exports are 6× faster on books over 1M lines",
2107
+ areas: ["reports"]
2108
+ },
2109
+ {
2110
+ _key: "c3",
2111
+ type: "fixed",
2112
+ title: "Webhook retries no longer duplicate journal.posted events",
2113
+ areas: ["webhooks"]
2114
+ }
2115
+ ]
2116
+ }, {
2117
+ _key: "r2",
2118
+ version: "2.13.0",
2119
+ date: "2026-09-08",
2120
+ title: "API versioning by date",
2121
+ changes: [{
2122
+ _key: "c4",
2123
+ type: "deprecated",
2124
+ title: "The /v1/transactions list endpoint",
2125
+ details: "<p>Replaced by <code>GET /v2/journal-lines</code>, which paginates with cursors.</p>",
2126
+ areas: ["ledger"],
2127
+ migration: "<p>Switch to <code>GET /v2/journal-lines</code>. Replace <code>page</code> with the <code>cursor</code> from the previous response. Field names are unchanged.</p>",
2128
+ removalDate: "2026-12-08",
2129
+ docs: {
2130
+ type: "url",
2131
+ href: "https://docs.ledgerline.com/api/journal-lines"
2132
+ }
2133
+ }, {
2134
+ _key: "c5",
2135
+ type: "security",
2136
+ title: "API keys can now be scoped to read-only",
2137
+ areas: ["auth"]
2138
+ }]
2139
+ }],
2140
+ hasRssFeed: true,
2141
+ subscribeForm: "form_changelog-updates",
2142
+ showTypeFilter: true,
2143
+ groupBy: "release"
2144
+ },
2145
+ notes: {
2146
+ why: "A changelog is releases → changes, and each change carries a TYPE that drives its badge, the type filter and — for Breaking/Deprecated only — a required migration note and removal date (conditional on the change's own type). Small products write releases right in the section; once releases need their own URLs, an RSS feed or reuse in the dashboard, switch the source to the Releases collection (same item shape) and the section becomes a query. Version is validated and unique because it doubles as the anchor.",
2147
+ sanity: "Sanity: `release` document { version, date, changes: array<object change{type, title, body: portableText}> }; a listing GROQ orders by date. Conditional migration fields use `hidden: ({parent}) => !['breaking','deprecated'].includes(parent.type)`.",
2148
+ htmlSignals: [
2149
+ "Repeated date + version headings (h2/h3 like 'v2.14.0' or 'September 29, 2026')",
2150
+ "Colored badges per line: New, Improved, Fixed, Deprecated, Breaking",
2151
+ "A vertical line/timeline down the left with dots per release",
2152
+ "Links to an RSS/Atom feed or 'Subscribe to updates'",
2153
+ "Anchors per version (#v2-14-0) for deep links"
2154
+ ],
2155
+ mcp: "Split on version/date headings → releases. Within each, every list item or sub-heading → a change; type from its badge text (map 'Added'→new, 'Changed'→improved, 'Removed'→breaking); the first sentence → title, the rest → details. If a change says 'deprecated'/'breaking' and names a replacement, put that sentence in migration. Use source 'collection' when the old site gives each release its own URL; otherwise 'inline'.",
2156
+ pitfalls: [
2157
+ "Free-text badges ('Bugfix', 'Fix', 'Fixed') break the type filter — always map to the select.",
2158
+ "Breaking changes without a migration note — validation must block publish.",
2159
+ "Version strings with spaces or dates as versions collide as anchors.",
2160
+ "60+ releases inline makes the section slow to edit — move to the collection."
2161
+ ]
2162
+ }
2163
+ },
2164
+ {
2165
+ id: "public-roadmap",
2166
+ label: "Public roadmap",
2167
+ category: "Listings & feeds",
2168
+ brand: "Ledgerline",
2169
+ previewLayout: "grid-3",
2170
+ tags: [
2171
+ "deep-nesting",
2172
+ "repeater",
2173
+ "conditional",
2174
+ "references",
2175
+ "form",
2176
+ "validation"
2177
+ ],
2178
+ proves: "Columns → items with status, quarter and read-only vote counts · shipped items link to a release · voting + suggestion form",
2179
+ schema: {
2180
+ name: "roadmap",
2181
+ title: "Public roadmap",
2182
+ kind: "block",
2183
+ icon: "map-2",
2184
+ category: "Listings & feeds",
2185
+ description: "What's planned, in progress and shipped, with votes",
2186
+ variants: [{
2187
+ id: "board",
2188
+ name: "Board"
2189
+ }, {
2190
+ id: "list",
2191
+ name: "Grouped list"
2192
+ }],
2193
+ groups: [
2194
+ CONTENT,
2195
+ {
2196
+ name: "feedback",
2197
+ title: "Feedback",
2198
+ icon: "message-plus"
2199
+ },
2200
+ DESIGN
2201
+ ],
2202
+ preview: {
2203
+ title: "heading",
2204
+ subtitle: "intro",
2205
+ icon: "map-2"
2206
+ },
2207
+ fields: [
2208
+ {
2209
+ name: "heading",
2210
+ title: "Heading",
2211
+ type: "string",
2212
+ group: "content",
2213
+ validation: {
2214
+ required: true,
2215
+ max: 48
2216
+ }
2217
+ },
2218
+ {
2219
+ name: "intro",
2220
+ title: "Intro",
2221
+ type: "text",
2222
+ rows: 2,
2223
+ group: "content",
2224
+ description: ""
2225
+ },
2226
+ {
2227
+ name: "columns",
2228
+ title: "Columns",
2229
+ type: "array",
2230
+ group: "content",
2231
+ itemNoun: "column",
2232
+ validation: {
2233
+ min: 2,
2234
+ max: 5
2235
+ },
2236
+ of: [{
2237
+ name: "column",
2238
+ title: "Column",
2239
+ type: "object",
2240
+ icon: "layout-columns",
2241
+ preview: {
2242
+ title: "title",
2243
+ subtitle: "stage"
2244
+ },
2245
+ fields: [
2246
+ {
2247
+ name: "title",
2248
+ title: "Title",
2249
+ type: "string",
2250
+ validation: {
2251
+ required: true,
2252
+ max: 24
2253
+ }
2254
+ },
2255
+ {
2256
+ name: "stage",
2257
+ title: "Stage",
2258
+ type: "select",
2259
+ validation: { required: true },
2260
+ options: [
2261
+ {
2262
+ value: "considering",
2263
+ label: "Considering"
2264
+ },
2265
+ {
2266
+ value: "planned",
2267
+ label: "Planned"
2268
+ },
2269
+ {
2270
+ value: "building",
2271
+ label: "In progress"
2272
+ },
2273
+ {
2274
+ value: "beta",
2275
+ label: "In beta"
2276
+ },
2277
+ {
2278
+ value: "shipped",
2279
+ label: "Shipped"
2280
+ }
2281
+ ]
2282
+ },
2283
+ {
2284
+ name: "description",
2285
+ title: "Description",
2286
+ type: "string",
2287
+ validation: { max: 90 }
2288
+ },
2289
+ {
2290
+ name: "items",
2291
+ title: "Items",
2292
+ type: "array",
2293
+ itemNoun: "item",
2294
+ validation: { max: 25 },
2295
+ of: [{
2296
+ name: "item",
2297
+ title: "Item",
2298
+ type: "object",
2299
+ icon: "point",
2300
+ preview: {
2301
+ title: "title",
2302
+ subtitle: "quarter",
2303
+ fallback: "Untitled item"
2304
+ },
2305
+ fields: [
2306
+ {
2307
+ name: "title",
2308
+ title: "Title",
2309
+ type: "string",
2310
+ validation: {
2311
+ required: true,
2312
+ recommendedMax: 60
2313
+ }
2314
+ },
2315
+ {
2316
+ name: "summary",
2317
+ title: "Summary",
2318
+ type: "text",
2319
+ rows: 3,
2320
+ validation: { recommendedMax: 240 }
2321
+ },
2322
+ {
2323
+ name: "area",
2324
+ title: "Area",
2325
+ type: "select",
2326
+ options: [
2327
+ {
2328
+ value: "payments",
2329
+ label: "Payments"
2330
+ },
2331
+ {
2332
+ value: "ledger",
2333
+ label: "Ledger"
2334
+ },
2335
+ {
2336
+ value: "reports",
2337
+ label: "Reports"
2338
+ },
2339
+ {
2340
+ value: "integrations",
2341
+ label: "Integrations"
2342
+ }
2343
+ ],
2344
+ description: ""
2345
+ },
2346
+ {
2347
+ name: "quarter",
2348
+ title: "Target",
2349
+ type: "string",
2350
+ validation: {
2351
+ pattern: "^(Q[1-4] 20\\d\\d|H[12] 20\\d\\d|Later)$",
2352
+ patternMessage: "Use a quarter or half, like Q3 2026, H1 2027 or Later."
2353
+ },
2354
+ placeholder: "Q1 2027",
2355
+ description: "Shown as a rough target, never a promise."
2356
+ },
2357
+ {
2358
+ name: "isShipped",
2359
+ title: "Shipped",
2360
+ type: "boolean",
2361
+ description: "Links the card to its release notes."
2362
+ },
2363
+ {
2364
+ name: "release",
2365
+ title: "Release",
2366
+ type: "reference",
2367
+ reference: { to: ["col_releases"] },
2368
+ hidden: {
2369
+ field: "isShipped",
2370
+ equals: true
2371
+ },
2372
+ validation: { required: true }
2373
+ },
2374
+ {
2375
+ name: "votes",
2376
+ title: "Votes",
2377
+ type: "number",
2378
+ readOnly: true,
2379
+ description: "Counted from visitor votes. Not editable."
2380
+ },
2381
+ {
2382
+ name: "discussion",
2383
+ title: "Discussion link",
2384
+ type: "link"
2385
+ }
2386
+ ]
2387
+ }]
2388
+ }
2389
+ ]
2390
+ }]
2391
+ },
2392
+ {
2393
+ name: "allowVoting",
2394
+ title: "Let visitors vote",
2395
+ type: "boolean",
2396
+ group: "feedback",
2397
+ initialValue: true
2398
+ },
2399
+ {
2400
+ name: "useEmailToVote",
2401
+ title: "Ask for an email to vote",
2402
+ type: "boolean",
2403
+ group: "feedback",
2404
+ hidden: {
2405
+ field: "allowVoting",
2406
+ equals: true
2407
+ },
2408
+ description: "One vote per email."
2409
+ },
2410
+ {
2411
+ name: "suggest",
2412
+ title: "Suggestion form",
2413
+ type: "reference",
2414
+ group: "feedback",
2415
+ reference: { to: ["form"] }
2416
+ },
2417
+ {
2418
+ name: "suggestButton",
2419
+ title: "Suggestion button",
2420
+ type: "button",
2421
+ group: "feedback",
2422
+ hidden: {
2423
+ field: "suggest",
2424
+ notEmpty: true
2425
+ }
2426
+ },
2427
+ {
2428
+ name: "sortItems",
2429
+ title: "Sort items by",
2430
+ type: "select",
2431
+ group: "design",
2432
+ layout: "segmented",
2433
+ initialValue: "votes",
2434
+ options: [{
2435
+ value: "votes",
2436
+ label: "Votes"
2437
+ }, {
2438
+ value: "manual",
2439
+ label: "Your order"
2440
+ }],
2441
+ description: ""
2442
+ },
2443
+ {
2444
+ name: "showVotes",
2445
+ title: "Show vote counts",
2446
+ type: "boolean",
2447
+ group: "design",
2448
+ initialValue: true,
2449
+ description: "Off still lets people vote; the number stays private."
2450
+ }
2451
+ ]
2452
+ },
2453
+ value: {
2454
+ _variant: "board",
2455
+ heading: "Roadmap",
2456
+ intro: "What we're building next. Vote for what matters to your team — the top items shape every quarter.",
2457
+ columns: [
2458
+ {
2459
+ _key: "col1",
2460
+ title: "Planned",
2461
+ stage: "planned",
2462
+ description: "Scoped and scheduled.",
2463
+ items: [{
2464
+ _key: "i1",
2465
+ title: "NetSuite two-way sync",
2466
+ summary: "Push journal entries to NetSuite and pull back vendor bills without CSVs.",
2467
+ area: "integrations",
2468
+ quarter: "Q1 2027",
2469
+ isShipped: false,
2470
+ votes: 412,
2471
+ discussion: {
2472
+ type: "url",
2473
+ href: "https://community.ledgerline.com/t/netsuite-two-way/1882"
2474
+ }
2475
+ }, {
2476
+ _key: "i2",
2477
+ title: "Accrual schedules",
2478
+ summary: "Spread prepaid expenses and deferred revenue over months automatically.",
2479
+ area: "ledger",
2480
+ quarter: "Q1 2027",
2481
+ isShipped: false,
2482
+ votes: 287
2483
+ }]
2484
+ },
2485
+ {
2486
+ _key: "col2",
2487
+ title: "In progress",
2488
+ stage: "building",
2489
+ items: [{
2490
+ _key: "i3",
2491
+ title: "Bank rules with AI suggestions",
2492
+ summary: "Rules that learn from how you categorise and propose new ones.",
2493
+ area: "payments",
2494
+ quarter: "Q4 2026",
2495
+ isShipped: false,
2496
+ votes: 655
2497
+ }]
2498
+ },
2499
+ {
2500
+ _key: "col3",
2501
+ title: "Shipped",
2502
+ stage: "shipped",
2503
+ items: [{
2504
+ _key: "i4",
2505
+ title: "Multi-entity close",
2506
+ summary: "Close several entities in one checklist with automatic eliminations.",
2507
+ area: "ledger",
2508
+ quarter: "Q3 2026",
2509
+ isShipped: true,
2510
+ release: "en_rel_2-14-0",
2511
+ votes: 903
2512
+ }]
2513
+ }
2514
+ ],
2515
+ allowVoting: true,
2516
+ useEmailToVote: true,
2517
+ suggest: "form_roadmap-idea",
2518
+ suggestButton: {
2519
+ label: "Suggest a feature",
2520
+ href: "#suggest",
2521
+ type: "section",
2522
+ style: "secondary"
2523
+ },
2524
+ sortItems: "votes",
2525
+ showVotes: true
2526
+ },
2527
+ notes: {
2528
+ why: "A board is columns → items, three levels deep (section → column → item → its release). Each column has a STAGE (a select, not just a title) so styling and filtering don't depend on wording. Votes are read-only data the site writes — editors see them but can't fake them. A shipped item must link to its release, which is a reference so it follows renames. Feedback settings sit in their own group because they are a different job from editing the plan.",
2529
+ sanity: "Sanity: `roadmapItem` documents with `status` string and `votes` (written by a function), listed per status with GROQ. Columns are usually hard-coded. Our inline columns trade queryability for editorial order; at 100+ items move items to a collection and make each column a query by stage.",
2530
+ htmlSignals: [
2531
+ "3–5 side-by-side columns headed Planned / In progress / Shipped (kanban)",
2532
+ "Cards with an upvote arrow and a number",
2533
+ "Quarter labels like 'Q1 2027' or 'Later'",
2534
+ "A 'Suggest a feature' / 'Submit an idea' button opening a form",
2535
+ "Often an embedded Canny / Productboard / Featurebase widget (iframe) — import its items as data"
2536
+ ],
2537
+ mcp: "Columns from the board headers (stage from the header text). Each card → item: title, summary (first paragraph), area (tag), quarter, votes (read-only — import the number once, then the site owns it). Cards in a 'Done/Shipped' column get shipped=true; try to match them to a release by name, else leave release empty and flag it. A Canny-style iframe: fetch its public JSON if available, otherwise keep it as an embed and say so.",
2538
+ pitfalls: [
2539
+ "Item stage inferred from column title text ('Now', 'Next', 'Later') — map it to the stage select explicitly.",
2540
+ "The release condition lives on the item (shipped flag) because a field can't see its parent column's stage.",
2541
+ "Editable vote counts invite fake numbers — keep votes read-only.",
2542
+ "Dates as promises ('Ships Oct 3') — use quarters."
2543
+ ]
2544
+ }
2545
+ },
2546
+ {
2547
+ id: "search-results-page",
2548
+ label: "Search results page",
2549
+ category: "Listings & feeds",
2550
+ brand: "Caldera",
2551
+ previewLayout: "list",
2552
+ tags: [
2553
+ "dynamic-query",
2554
+ "references",
2555
+ "conditional",
2556
+ "repeater",
2557
+ "validation",
2558
+ "a11y"
2559
+ ],
2560
+ proves: "Configure search, don't store results · sources with weights · pinned results per keyword · empty states",
2561
+ docTitle: "Search",
2562
+ urlPrefix: "caldera.bettercms.site/",
2563
+ schema: {
2564
+ name: "searchResults",
2565
+ title: "Search results",
2566
+ kind: "block",
2567
+ icon: "search",
2568
+ category: "Listings & feeds",
2569
+ description: "The /search page: what's searched, how results look, what shows when nothing matches",
2570
+ variants: [{
2571
+ id: "tabs",
2572
+ name: "Tabs per type"
2573
+ }, {
2574
+ id: "mixed",
2575
+ name: "One mixed list"
2576
+ }],
2577
+ groups: [
2578
+ CONTENT,
2579
+ {
2580
+ name: "ranking",
2581
+ title: "Ranking",
2582
+ icon: "sort-descending"
2583
+ },
2584
+ {
2585
+ name: "empty",
2586
+ title: "No results",
2587
+ icon: "mood-empty"
2588
+ },
2589
+ DESIGN
2590
+ ],
2591
+ preview: {
2592
+ title: "placeholder",
2593
+ icon: "search"
2594
+ },
2595
+ fields: [
2596
+ {
2597
+ name: "placeholder",
2598
+ title: "Search placeholder",
2599
+ type: "string",
2600
+ group: "content",
2601
+ initialValue: "Search recipes, gear and stories",
2602
+ validation: { max: 48 },
2603
+ localized: true,
2604
+ description: ""
2605
+ },
2606
+ {
2607
+ name: "label",
2608
+ title: "Name for screen readers",
2609
+ type: "string",
2610
+ group: "content",
2611
+ initialValue: "Search Caldera",
2612
+ validation: {
2613
+ required: true,
2614
+ max: 40
2615
+ },
2616
+ description: "Not shown. Read by screen readers."
2617
+ },
2618
+ {
2619
+ name: "popularSearches",
2620
+ title: "Popular searches",
2621
+ type: "array",
2622
+ itemNoun: "search",
2623
+ of: [{
2624
+ name: "search",
2625
+ title: "Search",
2626
+ type: "string"
2627
+ }],
2628
+ group: "content",
2629
+ validation: { max: 8 }
2630
+ },
2631
+ {
2632
+ name: "sources",
2633
+ title: "What's searched",
2634
+ type: "array",
2635
+ group: "ranking",
2636
+ itemNoun: "source",
2637
+ validation: {
2638
+ min: 1,
2639
+ max: 6
2640
+ },
2641
+ of: [{
2642
+ name: "source",
2643
+ title: "Source",
2644
+ type: "object",
2645
+ icon: "database",
2646
+ preview: {
2647
+ title: "tabLabel",
2648
+ subtitle: "collection"
2649
+ },
2650
+ fields: [
2651
+ {
2652
+ name: "collection",
2653
+ title: "Collection",
2654
+ type: "select",
2655
+ access: { edit: "schema.manage" },
2656
+ lockReason: "Search indexes are built per collection in code.",
2657
+ options: [
2658
+ {
2659
+ value: "shopify",
2660
+ label: "Products"
2661
+ },
2662
+ {
2663
+ value: "col_recipes",
2664
+ label: "Recipes"
2665
+ },
2666
+ {
2667
+ value: "col_journal",
2668
+ label: "Journal"
2669
+ },
2670
+ {
2671
+ value: "col_faq",
2672
+ label: "FAQs"
2673
+ },
2674
+ {
2675
+ value: "page",
2676
+ label: "Pages"
2677
+ }
2678
+ ],
2679
+ validation: { required: true },
2680
+ description: ""
2681
+ },
2682
+ {
2683
+ name: "tabLabel",
2684
+ title: "Tab label",
2685
+ type: "string",
2686
+ validation: {
2687
+ required: true,
2688
+ max: 20
2689
+ },
2690
+ localized: true
2691
+ },
2692
+ {
2693
+ name: "weight",
2694
+ title: "Boost",
2695
+ type: "number",
2696
+ layout: "slider",
2697
+ numeric: {
2698
+ min: 1,
2699
+ max: 5,
2700
+ step: 1
2701
+ },
2702
+ initialValue: 3,
2703
+ description: "Higher ranks this source's matches first."
2704
+ },
2705
+ {
2706
+ name: "perPage",
2707
+ title: "Results per page",
2708
+ type: "number",
2709
+ numeric: {
2710
+ min: 4,
2711
+ max: 40,
2712
+ step: 4
2713
+ },
2714
+ initialValue: 12,
2715
+ description: ""
2716
+ }
2717
+ ]
2718
+ }]
2719
+ },
2720
+ {
2721
+ name: "pinned",
2722
+ title: "Pinned results",
2723
+ type: "array",
2724
+ group: "ranking",
2725
+ itemNoun: "pin",
2726
+ validation: { max: 20 },
2727
+ of: [{
2728
+ name: "pin",
2729
+ title: "Pin",
2730
+ type: "object",
2731
+ icon: "pin",
2732
+ preview: {
2733
+ title: "keywords",
2734
+ subtitle: "result"
2735
+ },
2736
+ fields: [
2737
+ {
2738
+ name: "keywords",
2739
+ title: "When someone searches",
2740
+ type: "tags",
2741
+ validation: {
2742
+ required: true,
2743
+ min: 1,
2744
+ max: 10
2745
+ },
2746
+ description: "Exact searches, any case. Add plurals and misspellings."
2747
+ },
2748
+ {
2749
+ name: "result",
2750
+ title: "Show first",
2751
+ type: "reference",
2752
+ reference: { to: [
2753
+ "shopify",
2754
+ "col_recipes",
2755
+ "col_journal",
2756
+ "page"
2757
+ ] },
2758
+ validation: { required: true }
2759
+ },
2760
+ {
2761
+ name: "until",
2762
+ title: "Until",
2763
+ type: "date",
2764
+ description: "The pin stops after this date."
2765
+ }
2766
+ ]
2767
+ }]
2768
+ },
2769
+ {
2770
+ name: "typos",
2771
+ title: "Forgive typos",
2772
+ type: "select",
2773
+ group: "ranking",
2774
+ layout: "segmented",
2775
+ initialValue: "1",
2776
+ options: [
2777
+ {
2778
+ value: "0",
2779
+ label: "Off"
2780
+ },
2781
+ {
2782
+ value: "1",
2783
+ label: "1 letter"
2784
+ },
2785
+ {
2786
+ value: "2",
2787
+ label: "2 letters"
2788
+ }
2789
+ ],
2790
+ description: "Lets \"skilet\" find skillet."
2791
+ },
2792
+ {
2793
+ name: "emptyHeading",
2794
+ title: "Heading",
2795
+ type: "string",
2796
+ group: "empty",
2797
+ initialValue: "Nothing for “{query}”",
2798
+ validation: { max: 60 },
2799
+ description: "{query} becomes what they typed."
2800
+ },
2801
+ {
2802
+ name: "emptyBody",
2803
+ title: "Text",
2804
+ type: "text",
2805
+ rows: 2,
2806
+ group: "empty",
2807
+ description: ""
2808
+ },
2809
+ {
2810
+ name: "emptyShow",
2811
+ title: "Suggest instead",
2812
+ type: "select",
2813
+ group: "empty",
2814
+ layout: "radio",
2815
+ initialValue: "popular",
2816
+ options: [
2817
+ {
2818
+ value: "popular",
2819
+ label: "Popular searches"
2820
+ },
2821
+ {
2822
+ value: "links",
2823
+ label: "Links you choose"
2824
+ },
2825
+ {
2826
+ value: "none",
2827
+ label: "Nothing"
2828
+ }
2829
+ ],
2830
+ description: ""
2831
+ },
2832
+ {
2833
+ name: "emptyLinks",
2834
+ title: "Links",
2835
+ type: "array",
2836
+ group: "empty",
2837
+ hidden: {
2838
+ field: "emptyShow",
2839
+ equals: "links"
2840
+ },
2841
+ validation: { max: 4 },
2842
+ of: [{
2843
+ name: "link",
2844
+ title: "Link",
2845
+ type: "link"
2846
+ }]
2847
+ },
2848
+ {
2849
+ name: "emptyButton",
2850
+ title: "Empty button",
2851
+ type: "button",
2852
+ group: "empty"
2853
+ },
2854
+ {
2855
+ name: "showMatchHighlights",
2856
+ title: "Highlight matches",
2857
+ type: "boolean",
2858
+ group: "design",
2859
+ initialValue: true
2860
+ },
2861
+ {
2862
+ name: "showCounts",
2863
+ title: "Count on tabs",
2864
+ type: "boolean",
2865
+ group: "design",
2866
+ initialValue: true,
2867
+ description: ""
2868
+ }
2869
+ ]
2870
+ },
2871
+ value: {
2872
+ _variant: "tabs",
2873
+ placeholder: "Search recipes, gear and stories",
2874
+ label: "Search Caldera",
2875
+ popularSearches: [
2876
+ "dutch oven",
2877
+ "seasoning",
2878
+ "cable fold",
2879
+ "campfire paella",
2880
+ "warranty"
2881
+ ],
2882
+ sources: [
2883
+ {
2884
+ _key: "s1",
2885
+ collection: "shopify",
2886
+ tabLabel: "Gear",
2887
+ weight: 5,
2888
+ perPage: 12
2889
+ },
2890
+ {
2891
+ _key: "s2",
2892
+ collection: "col_recipes",
2893
+ tabLabel: "Recipes",
2894
+ weight: 4,
2895
+ perPage: 12
2896
+ },
2897
+ {
2898
+ _key: "s3",
2899
+ collection: "col_journal",
2900
+ tabLabel: "Stories",
2901
+ weight: 3,
2902
+ perPage: 8
2903
+ },
2904
+ {
2905
+ _key: "s4",
2906
+ collection: "col_faq",
2907
+ tabLabel: "Help",
2908
+ weight: 2,
2909
+ perPage: 8
2910
+ }
2911
+ ],
2912
+ pinned: [
2913
+ {
2914
+ _key: "pn1",
2915
+ keywords: [
2916
+ "seasoning",
2917
+ "season",
2918
+ "how to season"
2919
+ ],
2920
+ result: "en_1"
2921
+ },
2922
+ {
2923
+ _key: "pn2",
2924
+ keywords: [
2925
+ "grill grate",
2926
+ "grate",
2927
+ "cable fold"
2928
+ ],
2929
+ result: "gid://shopify/Product/8812"
2930
+ },
2931
+ {
2932
+ _key: "pn3",
2933
+ keywords: ["spring sale", "spring"],
2934
+ result: "pg_spring",
2935
+ until: "2027-05-31"
2936
+ }
2937
+ ],
2938
+ typos: "1",
2939
+ emptyHeading: "Nothing for “{query}”",
2940
+ emptyBody: "Check the spelling, or try a broader word like “skillet” or “bread”.",
2941
+ emptyShow: "popular",
2942
+ emptyLinks: [],
2943
+ emptyButton: {
2944
+ label: "Ask our cooks",
2945
+ href: "/contact",
2946
+ type: "page",
2947
+ pageId: "pg_contact",
2948
+ title: "Contact",
2949
+ style: "secondary"
2950
+ },
2951
+ showMatchHighlights: true,
2952
+ showCounts: true
2953
+ },
2954
+ notes: {
2955
+ why: "A results page never stores results; it stores how search behaves on this site. Sources map to indexes that are built in code, so the collection is locked while the label, boost and page size are editorial. Pinned results are the one hand-curated part — keyword tags → a reference — with an optional end date so seasonal pins don't rot. The empty state is its own group because it is what most people judge search by.",
2956
+ sanity: "No Sanity equivalent in-schema: search config usually lives in Algolia/Typesense dashboards. A `searchSettings` singleton with `promoted: array<{terms: array<string>, doc: reference}>` is the closest pattern.",
2957
+ htmlSignals: [
2958
+ "A page at /search with ?q= or ?query= in the URL and a prominent <input type=search>",
2959
+ "Result tabs or filters by type (All, Products, Recipes, Articles) with counts",
2960
+ "Highlighted <mark> or <em> around matching words in snippets",
2961
+ "A 'No results for …' message with suggestions"
2962
+ ],
2963
+ mcp: "Don't import results. Create one searchResults section on the /search page. Tabs → sources (match each tab to a collection; ask the developer to index any that aren't). Popular or suggested chips → popularSearches. Visible 'Featured' or 'Top result' cards for a query you can reproduce → pinned. Copy the no-results text into the empty group with {query} for the echoed term.",
2964
+ pitfalls: [
2965
+ "Pins pointing at unpublished items show nothing — validate on publish.",
2966
+ "Typo tolerance 2 on short words (≤4 letters) returns noise.",
2967
+ "A label-less search input fails WCAG 1.3.1 / 4.1.2 — label is required.",
2968
+ "Search pages must be noindex — the platform does it natively; never add a field for it."
2969
+ ]
2970
+ }
2971
+ }
2972
+ ];
2973
+ //#endregion
2974
+ export { ENTRIES };
2975
+
2976
+ //# sourceMappingURL=listings.entries.js.map