@bendyline/squisq 1.2.2 → 1.4.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 (427) hide show
  1. package/dist/{Doc-BfBhiCNr.d.ts → Doc-BeSeH2iX.d.ts} +141 -33
  2. package/dist/ImageEditDoc-BTIvw0oq.d.ts +84 -0
  3. package/dist/__tests__/colorUtils.test.d.ts +2 -0
  4. package/dist/__tests__/colorUtils.test.d.ts.map +1 -0
  5. package/dist/__tests__/colorUtils.test.js +94 -0
  6. package/dist/__tests__/colorUtils.test.js.map +1 -0
  7. package/dist/__tests__/getLayers.test.js +31 -7
  8. package/dist/__tests__/getLayers.test.js.map +1 -1
  9. package/dist/__tests__/iconResolve.test.d.ts +2 -0
  10. package/dist/__tests__/iconResolve.test.d.ts.map +1 -0
  11. package/dist/__tests__/iconResolve.test.js +99 -0
  12. package/dist/__tests__/iconResolve.test.js.map +1 -0
  13. package/dist/__tests__/imageEditState.test.d.ts +2 -0
  14. package/dist/__tests__/imageEditState.test.d.ts.map +1 -0
  15. package/dist/__tests__/imageEditState.test.js +61 -0
  16. package/dist/__tests__/imageEditState.test.js.map +1 -0
  17. package/dist/__tests__/imageEditVersions.test.d.ts +2 -0
  18. package/dist/__tests__/imageEditVersions.test.d.ts.map +1 -0
  19. package/dist/__tests__/imageEditVersions.test.js +141 -0
  20. package/dist/__tests__/imageEditVersions.test.js.map +1 -0
  21. package/dist/__tests__/inferDocumentTitle.test.d.ts +2 -0
  22. package/dist/__tests__/inferDocumentTitle.test.d.ts.map +1 -0
  23. package/dist/__tests__/inferDocumentTitle.test.js +42 -0
  24. package/dist/__tests__/inferDocumentTitle.test.js.map +1 -0
  25. package/dist/__tests__/jsonForm.chooseControl.test.d.ts +2 -0
  26. package/dist/__tests__/jsonForm.chooseControl.test.d.ts.map +1 -0
  27. package/dist/__tests__/jsonForm.chooseControl.test.js +74 -0
  28. package/dist/__tests__/jsonForm.chooseControl.test.js.map +1 -0
  29. package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts +2 -0
  30. package/dist/__tests__/jsonForm.evaluateWhen.test.d.ts.map +1 -0
  31. package/dist/__tests__/jsonForm.evaluateWhen.test.js +51 -0
  32. package/dist/__tests__/jsonForm.evaluateWhen.test.js.map +1 -0
  33. package/dist/__tests__/jsonForm.inferSchema.test.d.ts +2 -0
  34. package/dist/__tests__/jsonForm.inferSchema.test.d.ts.map +1 -0
  35. package/dist/__tests__/jsonForm.inferSchema.test.js +23 -0
  36. package/dist/__tests__/jsonForm.inferSchema.test.js.map +1 -0
  37. package/dist/__tests__/jsonForm.pointer.test.d.ts +2 -0
  38. package/dist/__tests__/jsonForm.pointer.test.d.ts.map +1 -0
  39. package/dist/__tests__/jsonForm.pointer.test.js +94 -0
  40. package/dist/__tests__/jsonForm.pointer.test.js.map +1 -0
  41. package/dist/__tests__/markdown.test.js +40 -0
  42. package/dist/__tests__/markdown.test.js.map +1 -1
  43. package/dist/__tests__/markdownIcons.test.d.ts +2 -0
  44. package/dist/__tests__/markdownIcons.test.d.ts.map +1 -0
  45. package/dist/__tests__/markdownIcons.test.js +93 -0
  46. package/dist/__tests__/markdownIcons.test.js.map +1 -0
  47. package/dist/__tests__/markdownToDoc.test.js +15 -4
  48. package/dist/__tests__/markdownToDoc.test.js.map +1 -1
  49. package/dist/__tests__/recommendTemplates.test.d.ts +2 -0
  50. package/dist/__tests__/recommendTemplates.test.d.ts.map +1 -0
  51. package/dist/__tests__/recommendTemplates.test.js +158 -0
  52. package/dist/__tests__/recommendTemplates.test.js.map +1 -0
  53. package/dist/__tests__/scopedContentContainer.test.d.ts +2 -0
  54. package/dist/__tests__/scopedContentContainer.test.d.ts.map +1 -0
  55. package/dist/__tests__/scopedContentContainer.test.js +74 -0
  56. package/dist/__tests__/scopedContentContainer.test.js.map +1 -0
  57. package/dist/__tests__/slideshowGenerator.test.js +1 -1
  58. package/dist/__tests__/slideshowGenerator.test.js.map +1 -1
  59. package/dist/__tests__/surface.test.d.ts +2 -0
  60. package/dist/__tests__/surface.test.d.ts.map +1 -0
  61. package/dist/__tests__/surface.test.js +57 -0
  62. package/dist/__tests__/surface.test.js.map +1 -0
  63. package/dist/__tests__/templateAnnotationParse.test.d.ts +2 -0
  64. package/dist/__tests__/templateAnnotationParse.test.d.ts.map +1 -0
  65. package/dist/__tests__/templateAnnotationParse.test.js +42 -0
  66. package/dist/__tests__/templateAnnotationParse.test.js.map +1 -0
  67. package/dist/__tests__/templates.test.js +90 -9
  68. package/dist/__tests__/templates.test.js.map +1 -1
  69. package/dist/__tests__/themeCompile.test.d.ts +2 -0
  70. package/dist/__tests__/themeCompile.test.d.ts.map +1 -0
  71. package/dist/__tests__/themeCompile.test.js +134 -0
  72. package/dist/__tests__/themeCompile.test.js.map +1 -0
  73. package/dist/__tests__/themeValidator.test.d.ts +2 -0
  74. package/dist/__tests__/themeValidator.test.d.ts.map +1 -0
  75. package/dist/__tests__/themeValidator.test.js +107 -0
  76. package/dist/__tests__/themeValidator.test.js.map +1 -0
  77. package/dist/__tests__/versions.test.d.ts +2 -0
  78. package/dist/__tests__/versions.test.d.ts.map +1 -0
  79. package/dist/__tests__/versions.test.js +339 -0
  80. package/dist/__tests__/versions.test.js.map +1 -0
  81. package/dist/{chunk-CYQHG27J.js → chunk-2TMAWB4Y.js} +74 -1
  82. package/dist/chunk-2TMAWB4Y.js.map +1 -0
  83. package/dist/{chunk-LAZELBON.js → chunk-3K5OG6KI.js} +165 -17
  84. package/dist/chunk-3K5OG6KI.js.map +1 -0
  85. package/dist/chunk-57CVQCFX.js +193 -0
  86. package/dist/chunk-57CVQCFX.js.map +1 -0
  87. package/dist/{chunk-QM5PKNPW.js → chunk-5WFRKURX.js} +1 -1
  88. package/dist/chunk-5WFRKURX.js.map +1 -0
  89. package/dist/chunk-B4EEON3N.js +1317 -0
  90. package/dist/chunk-B4EEON3N.js.map +1 -0
  91. package/dist/chunk-DBS6RIFL.js +81 -0
  92. package/dist/chunk-DBS6RIFL.js.map +1 -0
  93. package/dist/{chunk-MIBRIRGJ.js → chunk-FR2RBTKO.js} +3 -3
  94. package/dist/{chunk-MIBRIRGJ.js.map → chunk-FR2RBTKO.js.map} +1 -1
  95. package/dist/chunk-H3AXU4MJ.js +179 -0
  96. package/dist/chunk-H3AXU4MJ.js.map +1 -0
  97. package/dist/chunk-JELIRVDP.js +24 -0
  98. package/dist/chunk-JELIRVDP.js.map +1 -0
  99. package/dist/chunk-K32VJONL.js +193 -0
  100. package/dist/chunk-K32VJONL.js.map +1 -0
  101. package/dist/{chunk-GAQLMORN.js → chunk-KSWJR66U.js} +248 -44
  102. package/dist/chunk-KSWJR66U.js.map +1 -0
  103. package/dist/{chunk-TSG2OSE6.js → chunk-MYIH7FWD.js} +3 -3
  104. package/dist/chunk-MYIH7FWD.js.map +1 -0
  105. package/dist/chunk-VLJJHDAC.js +218 -0
  106. package/dist/chunk-VLJJHDAC.js.map +1 -0
  107. package/dist/chunk-WMOI7FN3.js +182 -0
  108. package/dist/chunk-WMOI7FN3.js.map +1 -0
  109. package/dist/chunk-ZTX4PFFT.js +520 -0
  110. package/dist/chunk-ZTX4PFFT.js.map +1 -0
  111. package/dist/doc/audioMapping.d.ts.map +1 -1
  112. package/dist/doc/audioMapping.js +80 -9
  113. package/dist/doc/audioMapping.js.map +1 -1
  114. package/dist/doc/getLayers.d.ts.map +1 -1
  115. package/dist/doc/getLayers.js +29 -18
  116. package/dist/doc/getLayers.js.map +1 -1
  117. package/dist/doc/markdownToDoc.d.ts.map +1 -1
  118. package/dist/doc/markdownToDoc.js +40 -6
  119. package/dist/doc/markdownToDoc.js.map +1 -1
  120. package/dist/doc/templates/featureBlock.d.ts +18 -0
  121. package/dist/doc/templates/featureBlock.d.ts.map +1 -0
  122. package/dist/doc/templates/featureBlock.js +180 -0
  123. package/dist/doc/templates/featureBlock.js.map +1 -0
  124. package/dist/doc/templates/fullBleedQuote.d.ts +12 -0
  125. package/dist/doc/templates/fullBleedQuote.d.ts.map +1 -1
  126. package/dist/doc/templates/fullBleedQuote.js +12 -0
  127. package/dist/doc/templates/fullBleedQuote.js.map +1 -1
  128. package/dist/doc/templates/index.d.ts +28 -4
  129. package/dist/doc/templates/index.d.ts.map +1 -1
  130. package/dist/doc/templates/index.js +45 -12
  131. package/dist/doc/templates/index.js.map +1 -1
  132. package/dist/doc/templates/listBlock.d.ts.map +1 -1
  133. package/dist/doc/templates/listBlock.js +22 -5
  134. package/dist/doc/templates/listBlock.js.map +1 -1
  135. package/dist/doc/templates/statHighlight.d.ts +12 -0
  136. package/dist/doc/templates/statHighlight.d.ts.map +1 -1
  137. package/dist/doc/templates/statHighlight.js +12 -0
  138. package/dist/doc/templates/statHighlight.js.map +1 -1
  139. package/dist/doc/templates/titleBlock.d.ts +11 -0
  140. package/dist/doc/templates/titleBlock.d.ts.map +1 -1
  141. package/dist/doc/templates/titleBlock.js +8 -0
  142. package/dist/doc/templates/titleBlock.js.map +1 -1
  143. package/dist/doc/utils/themeUtils.d.ts +4 -4
  144. package/dist/doc/utils/themeUtils.d.ts.map +1 -1
  145. package/dist/doc/utils/themeUtils.js +8 -7
  146. package/dist/doc/utils/themeUtils.js.map +1 -1
  147. package/dist/generate/slideshowGenerator.js +1 -1
  148. package/dist/generate/slideshowGenerator.js.map +1 -1
  149. package/dist/generate/templateMapper.js +2 -2
  150. package/dist/generate/templateMapper.js.map +1 -1
  151. package/dist/icons/iconData.d.ts +26 -0
  152. package/dist/icons/iconData.d.ts.map +1 -0
  153. package/dist/icons/iconData.js +12 -0
  154. package/dist/icons/iconData.js.map +1 -0
  155. package/dist/icons/index.d.ts +12 -0
  156. package/dist/icons/index.d.ts.map +1 -0
  157. package/dist/icons/index.js +10 -0
  158. package/dist/icons/index.js.map +1 -0
  159. package/dist/icons/resolve.d.ts +61 -0
  160. package/dist/icons/resolve.d.ts.map +1 -0
  161. package/dist/icons/resolve.js +130 -0
  162. package/dist/icons/resolve.js.map +1 -0
  163. package/dist/imageEdit/ImageEditVersionManager.d.ts +31 -0
  164. package/dist/imageEdit/ImageEditVersionManager.d.ts.map +1 -0
  165. package/dist/imageEdit/ImageEditVersionManager.js +39 -0
  166. package/dist/imageEdit/ImageEditVersionManager.js.map +1 -0
  167. package/dist/imageEdit/export.d.ts +33 -0
  168. package/dist/imageEdit/export.d.ts.map +1 -0
  169. package/dist/imageEdit/export.js +253 -0
  170. package/dist/imageEdit/export.js.map +1 -0
  171. package/dist/imageEdit/index.d.ts +14 -0
  172. package/dist/imageEdit/index.d.ts.map +1 -0
  173. package/dist/imageEdit/index.js +22 -0
  174. package/dist/imageEdit/index.js.map +1 -0
  175. package/dist/imageEdit/persistence.d.ts +15 -0
  176. package/dist/imageEdit/persistence.d.ts.map +1 -0
  177. package/dist/imageEdit/persistence.js +49 -0
  178. package/dist/imageEdit/persistence.js.map +1 -0
  179. package/dist/imageEdit/state.d.ts +42 -0
  180. package/dist/imageEdit/state.d.ts.map +1 -0
  181. package/dist/imageEdit/state.js +98 -0
  182. package/dist/imageEdit/state.js.map +1 -0
  183. package/dist/imageEdit/versionPaths.d.ts +27 -0
  184. package/dist/imageEdit/versionPaths.d.ts.map +1 -0
  185. package/dist/imageEdit/versionPaths.js +57 -0
  186. package/dist/imageEdit/versionPaths.js.map +1 -0
  187. package/dist/imageEdit/versions.d.ts +67 -0
  188. package/dist/imageEdit/versions.d.ts.map +1 -0
  189. package/dist/imageEdit/versions.js +161 -0
  190. package/dist/imageEdit/versions.js.map +1 -0
  191. package/dist/index.d.ts +4 -0
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +4 -0
  194. package/dist/index.js.map +1 -1
  195. package/dist/jsonForm/chooseControl.d.ts +20 -0
  196. package/dist/jsonForm/chooseControl.d.ts.map +1 -0
  197. package/dist/jsonForm/chooseControl.js +82 -0
  198. package/dist/jsonForm/chooseControl.js.map +1 -0
  199. package/dist/jsonForm/evaluateWhen.d.ts +12 -0
  200. package/dist/jsonForm/evaluateWhen.d.ts.map +1 -0
  201. package/dist/jsonForm/evaluateWhen.js +65 -0
  202. package/dist/jsonForm/evaluateWhen.js.map +1 -0
  203. package/dist/jsonForm/index.d.ts +14 -0
  204. package/dist/jsonForm/index.d.ts.map +1 -0
  205. package/dist/jsonForm/index.js +12 -0
  206. package/dist/jsonForm/index.js.map +1 -0
  207. package/dist/jsonForm/inferSchema.d.ts +12 -0
  208. package/dist/jsonForm/inferSchema.d.ts.map +1 -0
  209. package/dist/jsonForm/inferSchema.js +15 -0
  210. package/dist/jsonForm/inferSchema.js.map +1 -0
  211. package/dist/jsonForm/pointer.d.ts +26 -0
  212. package/dist/jsonForm/pointer.d.ts.map +1 -0
  213. package/dist/jsonForm/pointer.js +102 -0
  214. package/dist/jsonForm/pointer.js.map +1 -0
  215. package/dist/jsonForm/types.d.ts +120 -0
  216. package/dist/jsonForm/types.d.ts.map +1 -0
  217. package/dist/jsonForm/types.js +10 -0
  218. package/dist/jsonForm/types.js.map +1 -0
  219. package/dist/markdown/convert.d.ts +11 -1
  220. package/dist/markdown/convert.d.ts.map +1 -1
  221. package/dist/markdown/convert.js +235 -15
  222. package/dist/markdown/convert.js.map +1 -1
  223. package/dist/markdown/index.d.ts +2 -2
  224. package/dist/markdown/index.d.ts.map +1 -1
  225. package/dist/markdown/index.js +1 -1
  226. package/dist/markdown/index.js.map +1 -1
  227. package/dist/markdown/types.d.ts +34 -1
  228. package/dist/markdown/types.d.ts.map +1 -1
  229. package/dist/markdown/utils.d.ts +40 -0
  230. package/dist/markdown/utils.d.ts.map +1 -1
  231. package/dist/markdown/utils.js +155 -0
  232. package/dist/markdown/utils.js.map +1 -1
  233. package/dist/recommend/index.d.ts +16 -0
  234. package/dist/recommend/index.d.ts.map +1 -0
  235. package/dist/recommend/index.js +15 -0
  236. package/dist/recommend/index.js.map +1 -0
  237. package/dist/recommend/templates.d.ts +39 -0
  238. package/dist/recommend/templates.d.ts.map +1 -0
  239. package/dist/recommend/templates.js +235 -0
  240. package/dist/recommend/templates.js.map +1 -0
  241. package/dist/schemas/BlockTemplates.d.ts +46 -8
  242. package/dist/schemas/BlockTemplates.d.ts.map +1 -1
  243. package/dist/schemas/BlockTemplates.js +3 -3
  244. package/dist/schemas/BlockTemplates.js.map +1 -1
  245. package/dist/schemas/ImageEditDoc.d.ts +81 -0
  246. package/dist/schemas/ImageEditDoc.d.ts.map +1 -0
  247. package/dist/schemas/ImageEditDoc.js +20 -0
  248. package/dist/schemas/ImageEditDoc.js.map +1 -0
  249. package/dist/schemas/Theme.d.ts +93 -23
  250. package/dist/schemas/Theme.d.ts.map +1 -1
  251. package/dist/schemas/Theme.js +80 -13
  252. package/dist/schemas/Theme.js.map +1 -1
  253. package/dist/schemas/colorUtils.d.ts +51 -0
  254. package/dist/schemas/colorUtils.d.ts.map +1 -0
  255. package/dist/schemas/colorUtils.js +154 -0
  256. package/dist/schemas/colorUtils.js.map +1 -0
  257. package/dist/schemas/fontStacks.d.ts +57 -0
  258. package/dist/schemas/fontStacks.d.ts.map +1 -0
  259. package/dist/schemas/fontStacks.js +227 -0
  260. package/dist/schemas/fontStacks.js.map +1 -0
  261. package/dist/schemas/index.d.ts +5 -0
  262. package/dist/schemas/index.d.ts.map +1 -1
  263. package/dist/schemas/index.js +4 -0
  264. package/dist/schemas/index.js.map +1 -1
  265. package/dist/schemas/themeCompile.d.ts +45 -0
  266. package/dist/schemas/themeCompile.d.ts.map +1 -0
  267. package/dist/schemas/themeCompile.js +160 -0
  268. package/dist/schemas/themeCompile.js.map +1 -0
  269. package/dist/schemas/themeLibrary.d.ts +11 -15
  270. package/dist/schemas/themeLibrary.d.ts.map +1 -1
  271. package/dist/schemas/themeLibrary.js +18 -499
  272. package/dist/schemas/themeLibrary.js.map +1 -1
  273. package/dist/schemas/themeValidator.d.ts +26 -0
  274. package/dist/schemas/themeValidator.d.ts.map +1 -0
  275. package/dist/schemas/themeValidator.js +352 -0
  276. package/dist/schemas/themeValidator.js.map +1 -0
  277. package/dist/schemas/themes/bold.json +48 -0
  278. package/dist/schemas/themes/cinematic.json +54 -0
  279. package/dist/schemas/themes/documentary.json +49 -0
  280. package/dist/schemas/themes/gezellig.json +44 -0
  281. package/dist/schemas/themes/index.d.ts +26 -0
  282. package/dist/schemas/themes/index.d.ts.map +1 -0
  283. package/dist/schemas/themes/index.js +49 -0
  284. package/dist/schemas/themes/index.js.map +1 -0
  285. package/dist/schemas/themes/magazine.json +44 -0
  286. package/dist/schemas/themes/minimalist.json +45 -0
  287. package/dist/schemas/themes/morning-light.json +42 -0
  288. package/dist/schemas/themes/standard-dark.json +50 -0
  289. package/dist/schemas/themes/standard.json +42 -0
  290. package/dist/schemas/themes/tech-dark.json +48 -0
  291. package/dist/schemas/themes/warm-earth.json +50 -0
  292. package/dist/storage/ScopedContentContainer.d.ts +44 -0
  293. package/dist/storage/ScopedContentContainer.d.ts.map +1 -0
  294. package/dist/storage/ScopedContentContainer.js +94 -0
  295. package/dist/storage/ScopedContentContainer.js.map +1 -0
  296. package/dist/storage/index.d.ts +1 -0
  297. package/dist/storage/index.d.ts.map +1 -1
  298. package/dist/storage/index.js +1 -0
  299. package/dist/storage/index.js.map +1 -1
  300. package/dist/story/index.d.ts +53 -13
  301. package/dist/story/index.js +12 -4
  302. package/dist/themeLibrary-BHjJ0Qx6.d.ts +40 -0
  303. package/dist/{types-DYAzisMG.d.ts → types-BdZkdJ3z.d.ts} +35 -2
  304. package/dist/types-D98li1gV.d.ts +93 -0
  305. package/dist/versions/DocumentVersionManager.d.ts +31 -0
  306. package/dist/versions/DocumentVersionManager.d.ts.map +1 -0
  307. package/dist/versions/DocumentVersionManager.js +33 -0
  308. package/dist/versions/DocumentVersionManager.js.map +1 -0
  309. package/dist/versions/index.d.ts +29 -0
  310. package/dist/versions/index.d.ts.map +1 -0
  311. package/dist/versions/index.js +28 -0
  312. package/dist/versions/index.js.map +1 -0
  313. package/dist/versions/operations.d.ts +44 -0
  314. package/dist/versions/operations.d.ts.map +1 -0
  315. package/dist/versions/operations.js +190 -0
  316. package/dist/versions/operations.js.map +1 -0
  317. package/dist/versions/paths.d.ts +29 -0
  318. package/dist/versions/paths.d.ts.map +1 -0
  319. package/dist/versions/paths.js +66 -0
  320. package/dist/versions/paths.js.map +1 -0
  321. package/dist/versions/timestamp.d.ts +22 -0
  322. package/dist/versions/timestamp.d.ts.map +1 -0
  323. package/dist/versions/timestamp.js +44 -0
  324. package/dist/versions/timestamp.js.map +1 -0
  325. package/dist/versions/types.d.ts +92 -0
  326. package/dist/versions/types.d.ts.map +1 -0
  327. package/dist/versions/types.js +11 -0
  328. package/dist/versions/types.js.map +1 -0
  329. package/package.json +28 -1
  330. package/src/__tests__/colorUtils.test.ts +112 -0
  331. package/src/__tests__/getLayers.test.ts +32 -7
  332. package/src/__tests__/iconResolve.test.ts +122 -0
  333. package/src/__tests__/imageEditState.test.ts +74 -0
  334. package/src/__tests__/imageEditVersions.test.ts +169 -0
  335. package/src/__tests__/inferDocumentTitle.test.ts +50 -0
  336. package/src/__tests__/jsonForm.chooseControl.test.ts +86 -0
  337. package/src/__tests__/jsonForm.evaluateWhen.test.ts +59 -0
  338. package/src/__tests__/jsonForm.inferSchema.test.ts +25 -0
  339. package/src/__tests__/jsonForm.pointer.test.ts +103 -0
  340. package/src/__tests__/markdown.test.ts +44 -0
  341. package/src/__tests__/markdownIcons.test.ts +104 -0
  342. package/src/__tests__/markdownToDoc.test.ts +19 -4
  343. package/src/__tests__/recommendTemplates.test.ts +183 -0
  344. package/src/__tests__/scopedContentContainer.test.ts +89 -0
  345. package/src/__tests__/slideshowGenerator.test.ts +1 -1
  346. package/src/__tests__/surface.test.ts +68 -0
  347. package/src/__tests__/templateAnnotationParse.test.ts +42 -0
  348. package/src/__tests__/templates.test.ts +93 -9
  349. package/src/__tests__/themeCompile.test.ts +156 -0
  350. package/src/__tests__/themeValidator.test.ts +125 -0
  351. package/src/__tests__/versions.test.ts +415 -0
  352. package/src/doc/audioMapping.ts +95 -13
  353. package/src/doc/getLayers.ts +32 -21
  354. package/src/doc/markdownToDoc.ts +45 -7
  355. package/src/doc/templates/featureBlock.ts +202 -0
  356. package/src/doc/templates/fullBleedQuote.ts +13 -0
  357. package/src/doc/templates/index.ts +50 -16
  358. package/src/doc/templates/listBlock.ts +24 -5
  359. package/src/doc/templates/statHighlight.ts +13 -0
  360. package/src/doc/templates/titleBlock.ts +9 -0
  361. package/src/doc/utils/themeUtils.ts +8 -7
  362. package/src/generate/slideshowGenerator.ts +1 -1
  363. package/src/generate/templateMapper.ts +2 -2
  364. package/src/icons/iconData.ts +31 -0
  365. package/src/icons/index.ts +18 -0
  366. package/src/icons/resolve.ts +139 -0
  367. package/src/imageEdit/ImageEditVersionManager.ts +73 -0
  368. package/src/imageEdit/export.ts +326 -0
  369. package/src/imageEdit/index.ts +71 -0
  370. package/src/imageEdit/persistence.ts +62 -0
  371. package/src/imageEdit/state.ts +112 -0
  372. package/src/imageEdit/versionPaths.ts +57 -0
  373. package/src/imageEdit/versions.ts +231 -0
  374. package/src/index.ts +4 -0
  375. package/src/jsonForm/chooseControl.ts +88 -0
  376. package/src/jsonForm/evaluateWhen.ts +59 -0
  377. package/src/jsonForm/index.ts +22 -0
  378. package/src/jsonForm/inferSchema.ts +25 -0
  379. package/src/jsonForm/pointer.ts +109 -0
  380. package/src/jsonForm/types.ts +167 -0
  381. package/src/markdown/convert.ts +248 -15
  382. package/src/markdown/index.ts +4 -0
  383. package/src/markdown/types.ts +38 -1
  384. package/src/markdown/utils.ts +159 -0
  385. package/src/recommend/index.ts +16 -0
  386. package/src/recommend/templates.ts +273 -0
  387. package/src/schemas/BlockTemplates.ts +50 -7
  388. package/src/schemas/ImageEditDoc.ts +95 -0
  389. package/src/schemas/Theme.ts +152 -23
  390. package/src/schemas/colorUtils.ts +186 -0
  391. package/src/schemas/fontStacks.ts +257 -0
  392. package/src/schemas/index.ts +12 -0
  393. package/src/schemas/themeCompile.ts +203 -0
  394. package/src/schemas/themeLibrary.ts +18 -524
  395. package/src/schemas/themeValidator.ts +388 -0
  396. package/src/schemas/themes/bold.json +48 -0
  397. package/src/schemas/themes/cinematic.json +54 -0
  398. package/src/schemas/themes/documentary.json +49 -0
  399. package/src/schemas/themes/gezellig.json +44 -0
  400. package/src/schemas/themes/index.ts +53 -0
  401. package/src/schemas/themes/magazine.json +44 -0
  402. package/src/schemas/themes/minimalist.json +45 -0
  403. package/src/schemas/themes/morning-light.json +42 -0
  404. package/src/schemas/themes/standard-dark.json +50 -0
  405. package/src/schemas/themes/standard.json +42 -0
  406. package/src/schemas/themes/tech-dark.json +48 -0
  407. package/src/schemas/themes/warm-earth.json +50 -0
  408. package/src/storage/ScopedContentContainer.ts +113 -0
  409. package/src/storage/index.ts +1 -0
  410. package/src/versions/DocumentVersionManager.ts +70 -0
  411. package/src/versions/index.ts +54 -0
  412. package/src/versions/operations.ts +230 -0
  413. package/src/versions/paths.ts +66 -0
  414. package/src/versions/timestamp.ts +48 -0
  415. package/src/versions/types.ts +91 -0
  416. package/dist/chunk-53TZ2UTL.js +0 -470
  417. package/dist/chunk-53TZ2UTL.js.map +0 -1
  418. package/dist/chunk-7GF6RDED.js +0 -82
  419. package/dist/chunk-7GF6RDED.js.map +0 -1
  420. package/dist/chunk-CYQHG27J.js.map +0 -1
  421. package/dist/chunk-GAQLMORN.js.map +0 -1
  422. package/dist/chunk-LAZELBON.js.map +0 -1
  423. package/dist/chunk-QM5PKNPW.js.map +0 -1
  424. package/dist/chunk-TSG2OSE6.js.map +0 -1
  425. package/dist/chunk-XM4WSOHB.js +0 -92
  426. package/dist/chunk-XM4WSOHB.js.map +0 -1
  427. package/dist/themeLibrary-IP7EdyRq.d.ts +0 -44
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Path conventions for version snapshots.
3
+ *
4
+ * Snapshots live at `<VERSIONS_PREFIX><basename>.<timestamp>[<-suffix>].md`.
5
+ * The optional numeric suffix (`-2`, `-3`, ...) is appended only when two
6
+ * snapshots collide on the same UTC second.
7
+ */
8
+ /** Subfolder (inside the ContentContainer) that holds version snapshots. */
9
+ export declare const VERSIONS_PREFIX = ".versions/";
10
+ /**
11
+ * Strip the directory and extension from a document path to produce the
12
+ * basename used in version filenames. `subdir/index.md` -> `index`.
13
+ */
14
+ export declare function getDocBasename(documentPath: string): string;
15
+ /**
16
+ * Build a version snapshot path. Optionally append a collision suffix
17
+ * (e.g. `2`, `3`) when two saves land on the same UTC second.
18
+ */
19
+ export declare function buildVersionPath(basename: string, date: Date, collision?: number): string;
20
+ /**
21
+ * Parse a version snapshot path. Returns null if it doesn't match the
22
+ * convention (so unrelated files stored under `.versions/` are ignored).
23
+ */
24
+ export declare function parseVersionPath(path: string): {
25
+ basename: string;
26
+ timestamp: Date;
27
+ collision: number;
28
+ } | null;
29
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/versions/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,4EAA4E;AAC5E,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,SAAI,GAAG,MAAM,CAIpF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBjE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Path conventions for version snapshots.
3
+ *
4
+ * Snapshots live at `<VERSIONS_PREFIX><basename>.<timestamp>[<-suffix>].md`.
5
+ * The optional numeric suffix (`-2`, `-3`, ...) is appended only when two
6
+ * snapshots collide on the same UTC second.
7
+ */
8
+ import { formatVersionTimestamp, parseVersionTimestamp } from './timestamp.js';
9
+ /** Subfolder (inside the ContentContainer) that holds version snapshots. */
10
+ export const VERSIONS_PREFIX = '.versions/';
11
+ /**
12
+ * Strip the directory and extension from a document path to produce the
13
+ * basename used in version filenames. `subdir/index.md` -> `index`.
14
+ */
15
+ export function getDocBasename(documentPath) {
16
+ const slash = documentPath.lastIndexOf('/');
17
+ const file = slash >= 0 ? documentPath.slice(slash + 1) : documentPath;
18
+ const dot = file.lastIndexOf('.');
19
+ return dot > 0 ? file.slice(0, dot) : file;
20
+ }
21
+ /**
22
+ * Build a version snapshot path. Optionally append a collision suffix
23
+ * (e.g. `2`, `3`) when two saves land on the same UTC second.
24
+ */
25
+ export function buildVersionPath(basename, date, collision = 0) {
26
+ const stamp = formatVersionTimestamp(date);
27
+ const suffix = collision > 0 ? `-${collision + 1}` : '';
28
+ return `${VERSIONS_PREFIX}${basename}.${stamp}${suffix}.md`;
29
+ }
30
+ /**
31
+ * Parse a version snapshot path. Returns null if it doesn't match the
32
+ * convention (so unrelated files stored under `.versions/` are ignored).
33
+ */
34
+ export function parseVersionPath(path) {
35
+ if (!path.startsWith(VERSIONS_PREFIX))
36
+ return null;
37
+ const rest = path.slice(VERSIONS_PREFIX.length);
38
+ if (!rest.endsWith('.md'))
39
+ return null;
40
+ const stem = rest.slice(0, -'.md'.length);
41
+ // basename can contain dots; the timestamp is always the *last* dot-segment
42
+ // (optionally followed by a `-N` collision suffix).
43
+ const lastDot = stem.lastIndexOf('.');
44
+ if (lastDot <= 0)
45
+ return null;
46
+ const basename = stem.slice(0, lastDot);
47
+ const tail = stem.slice(lastDot + 1);
48
+ const dash = tail.indexOf('-');
49
+ let stamp;
50
+ let collision = 0;
51
+ if (dash >= 0) {
52
+ stamp = tail.slice(0, dash);
53
+ const n = Number(tail.slice(dash + 1));
54
+ if (!Number.isInteger(n) || n < 2)
55
+ return null;
56
+ collision = n - 1;
57
+ }
58
+ else {
59
+ stamp = tail;
60
+ }
61
+ const timestamp = parseVersionTimestamp(stamp);
62
+ if (!timestamp)
63
+ return null;
64
+ return { basename, timestamp, collision };
65
+ }
66
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/versions/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Sortable, human-readable timestamps for version filenames.
3
+ *
4
+ * Format: ISO 8601 basic, UTC, second precision, `Z` suffix —
5
+ * e.g. `20260430T152030Z`. Lexicographic order matches chronological order,
6
+ * so `listFiles` returns versions in time order without parsing.
7
+ */
8
+ /**
9
+ * Format a Date as a sortable, filename-safe UTC timestamp string.
10
+ */
11
+ export declare function formatVersionTimestamp(date: Date): string;
12
+ /**
13
+ * Parse a version timestamp string back to a Date. Returns null if the input
14
+ * doesn't match the expected format.
15
+ */
16
+ export declare function parseVersionTimestamp(stamp: string): Date | null;
17
+ /**
18
+ * The pattern a valid version timestamp matches. Exported so other modules
19
+ * can validate filenames without re-deriving the regex.
20
+ */
21
+ export declare const VERSION_TIMESTAMP_PATTERN: RegExp;
22
+ //# sourceMappingURL=timestamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamp.d.ts","sourceRoot":"","sources":["../../src/versions/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAWzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAOhE;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAAe,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Sortable, human-readable timestamps for version filenames.
3
+ *
4
+ * Format: ISO 8601 basic, UTC, second precision, `Z` suffix —
5
+ * e.g. `20260430T152030Z`. Lexicographic order matches chronological order,
6
+ * so `listFiles` returns versions in time order without parsing.
7
+ */
8
+ const TIMESTAMP_RE = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$/;
9
+ function pad2(n) {
10
+ return n < 10 ? `0${n}` : String(n);
11
+ }
12
+ /**
13
+ * Format a Date as a sortable, filename-safe UTC timestamp string.
14
+ */
15
+ export function formatVersionTimestamp(date) {
16
+ return (String(date.getUTCFullYear()).padStart(4, '0') +
17
+ pad2(date.getUTCMonth() + 1) +
18
+ pad2(date.getUTCDate()) +
19
+ 'T' +
20
+ pad2(date.getUTCHours()) +
21
+ pad2(date.getUTCMinutes()) +
22
+ pad2(date.getUTCSeconds()) +
23
+ 'Z');
24
+ }
25
+ /**
26
+ * Parse a version timestamp string back to a Date. Returns null if the input
27
+ * doesn't match the expected format.
28
+ */
29
+ export function parseVersionTimestamp(stamp) {
30
+ const m = TIMESTAMP_RE.exec(stamp);
31
+ if (!m)
32
+ return null;
33
+ const [, y, mo, d, h, mi, s] = m;
34
+ const ms = Date.UTC(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s));
35
+ if (Number.isNaN(ms))
36
+ return null;
37
+ return new Date(ms);
38
+ }
39
+ /**
40
+ * The pattern a valid version timestamp matches. Exported so other modules
41
+ * can validate filenames without re-deriving the regex.
42
+ */
43
+ export const VERSION_TIMESTAMP_PATTERN = TIMESTAMP_RE;
44
+ //# sourceMappingURL=timestamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../src/versions/timestamp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,YAAY,GAAG,gDAAgD,CAAC;AAEtE,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC/C,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,GAAG;QACH,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Public types for the document version-history feature.
3
+ *
4
+ * Versions are snapshots of the primary markdown document stored alongside
5
+ * the document inside the same {@link ContentContainer}. They live under
6
+ * `.versions/<docBasename>.<sortableTimestamp>.md`. The container is the
7
+ * unit of persistence — when the host serializes the container to a ZIP,
8
+ * a real folder, or anywhere else, the version snapshots ride along.
9
+ */
10
+ /**
11
+ * A single version snapshot record.
12
+ */
13
+ export interface Version {
14
+ /** Container-relative path, e.g. `.versions/index.20260430T152030Z.md`. */
15
+ path: string;
16
+ /** Document basename without extension, e.g. `index`. */
17
+ basename: string;
18
+ /** Parsed timestamp from the filename, in UTC. */
19
+ timestamp: Date;
20
+ /** Snapshot size in bytes. */
21
+ size: number;
22
+ /**
23
+ * Collision suffix index. `0` for a path with no `-N` suffix, `1` for `-2`,
24
+ * `2` for `-3`, and so on. Used as the tie-break for ordering snapshots
25
+ * that share the same UTC second.
26
+ */
27
+ collision: number;
28
+ }
29
+ /**
30
+ * Result of a {@link saveVersion} call.
31
+ */
32
+ export interface SaveVersionResult {
33
+ /** True when a new snapshot file was actually written. */
34
+ saved: boolean;
35
+ /** The newly stamped version (only when `saved` is true). */
36
+ version: Version | null;
37
+ /**
38
+ * Why the save behaved the way it did:
39
+ * - `'saved'` — a new snapshot was written.
40
+ * - `'unchanged'` — current content matches the latest snapshot byte-for-byte.
41
+ * - `'no-document'` — the container has no primary markdown document.
42
+ * - `'empty'` — the resolved content was empty.
43
+ */
44
+ reason: 'saved' | 'unchanged' | 'no-document' | 'empty';
45
+ }
46
+ /**
47
+ * Options for {@link saveVersion}.
48
+ */
49
+ export interface SaveVersionOptions {
50
+ /** Override the document content; otherwise the container's primary doc is read. */
51
+ content?: string;
52
+ /** Override the timestamp; defaults to `new Date()`. Useful for tests. */
53
+ now?: Date;
54
+ /** Skip the diff-vs-latest check and force a write. */
55
+ force?: boolean;
56
+ /** Override the document basename used to build the version filename. */
57
+ basename?: string;
58
+ }
59
+ /**
60
+ * Pruning policy passed to {@link pruneVersions}.
61
+ */
62
+ export type PrunePolicy = {
63
+ type: 'keep-last-n';
64
+ n: number;
65
+ } | {
66
+ type: 'older-than';
67
+ date: Date;
68
+ } | {
69
+ type: 'predicate';
70
+ keep: (v: Version, all: Version[]) => boolean;
71
+ };
72
+ /**
73
+ * Options for {@link revertToVersion}.
74
+ */
75
+ export interface RevertOptions {
76
+ /**
77
+ * Whether to snapshot the current document content before replacing it.
78
+ * Defaults to `true` so a revert is always recoverable.
79
+ */
80
+ snapshotCurrent?: boolean;
81
+ }
82
+ /**
83
+ * Options for {@link coalesceVersions}.
84
+ */
85
+ export interface CoalesceOptions {
86
+ /**
87
+ * Two adjacent snapshots whose timestamps are within `windowMs` collapse
88
+ * to the newer one. Defaults to 60_000 (one minute).
89
+ */
90
+ windowMs?: number;
91
+ }
92
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/versions/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,SAAS,EAAE,IAAI,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Public types for the document version-history feature.
3
+ *
4
+ * Versions are snapshots of the primary markdown document stored alongside
5
+ * the document inside the same {@link ContentContainer}. They live under
6
+ * `.versions/<docBasename>.<sortableTimestamp>.md`. The container is the
7
+ * unit of persistence — when the host serializes the container to a ZIP,
8
+ * a real folder, or anywhere else, the version snapshots ride along.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/versions/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq",
3
- "version": "1.2.2",
3
+ "version": "1.4.0",
4
4
  "description": "Headless utilities for doc/block rendering, spatial math, Markdown, and storage",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -85,13 +85,40 @@
85
85
  "types": "./dist/transform/index.d.ts",
86
86
  "import": "./dist/transform/index.js",
87
87
  "default": "./dist/transform/index.js"
88
+ },
89
+ "./versions": {
90
+ "types": "./dist/versions/index.d.ts",
91
+ "import": "./dist/versions/index.js",
92
+ "default": "./dist/versions/index.js"
93
+ },
94
+ "./jsonForm": {
95
+ "types": "./dist/jsonForm/index.d.ts",
96
+ "import": "./dist/jsonForm/index.js",
97
+ "default": "./dist/jsonForm/index.js"
98
+ },
99
+ "./imageEdit": {
100
+ "types": "./dist/imageEdit/index.d.ts",
101
+ "import": "./dist/imageEdit/index.js",
102
+ "default": "./dist/imageEdit/index.js"
103
+ },
104
+ "./icons": {
105
+ "types": "./dist/icons/index.d.ts",
106
+ "import": "./dist/icons/index.js",
107
+ "default": "./dist/icons/index.js"
108
+ },
109
+ "./recommend": {
110
+ "types": "./dist/recommend/index.d.ts",
111
+ "import": "./dist/recommend/index.js",
112
+ "default": "./dist/recommend/index.js"
88
113
  }
89
114
  },
90
115
  "scripts": {
91
116
  "build": "tsup",
117
+ "dev": "concurrently -n js,dts -c blue,gray -r \"tsup --watch --no-dts --no-clean\" \"tsup --watch --dts-only --no-clean\"",
92
118
  "typecheck": "tsc --noEmit"
93
119
  },
94
120
  "dependencies": {
121
+ "genson-js": "0.0.8",
95
122
  "hast-util-from-html": "2.0.3",
96
123
  "localforage": "1.10.0",
97
124
  "ngeohash": "0.6.3",
@@ -0,0 +1,112 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ isHex,
4
+ oklchLighten,
5
+ oklchDarken,
6
+ oklchSetChroma,
7
+ contrastRatio,
8
+ pickContrastingText,
9
+ deriveScale,
10
+ relativeLuminance,
11
+ } from '../schemas/colorUtils.js';
12
+
13
+ describe('isHex', () => {
14
+ it('accepts #rgb and #rrggbb', () => {
15
+ expect(isHex('#fff')).toBe(true);
16
+ expect(isHex('#123abc')).toBe(true);
17
+ expect(isHex('#FF0080')).toBe(true);
18
+ });
19
+ it('rejects malformed strings', () => {
20
+ expect(isHex('fff')).toBe(false);
21
+ expect(isHex('#1234')).toBe(false);
22
+ expect(isHex('#xyz')).toBe(false);
23
+ expect(isHex('rgb(0,0,0)')).toBe(false);
24
+ });
25
+ });
26
+
27
+ describe('oklchLighten / oklchDarken', () => {
28
+ it('lighten produces a lighter color (higher luminance)', () => {
29
+ const dark = '#101010';
30
+ const lighter = oklchLighten(dark, 0.2);
31
+ expect(relativeLuminance(lighter)).toBeGreaterThan(relativeLuminance(dark));
32
+ });
33
+
34
+ it('darken produces a darker color (lower luminance)', () => {
35
+ const light = '#e0e0e0';
36
+ const darker = oklchDarken(light, 0.2);
37
+ expect(relativeLuminance(darker)).toBeLessThan(relativeLuminance(light));
38
+ });
39
+
40
+ it('round-trips approximately stable for moderate adjustments', () => {
41
+ const seed = '#3182ce';
42
+ const round = oklchDarken(oklchLighten(seed, 0.1), 0.1);
43
+ // sRGB gamut clamping prevents perfect round-trip; expect within a small epsilon.
44
+ expect(round).toMatch(/^#[0-9a-f]{6}$/);
45
+ const lumDiff = Math.abs(relativeLuminance(seed) - relativeLuminance(round));
46
+ expect(lumDiff).toBeLessThan(0.05);
47
+ });
48
+
49
+ it('returns a hex string', () => {
50
+ expect(oklchLighten('#3182ce', 0.1)).toMatch(/^#[0-9a-f]{6}$/);
51
+ expect(oklchDarken('#3182ce', 0.1)).toMatch(/^#[0-9a-f]{6}$/);
52
+ });
53
+
54
+ it('falls back to input on parse failure', () => {
55
+ expect(oklchLighten('not-a-color', 0.1)).toBe('not-a-color');
56
+ });
57
+ });
58
+
59
+ describe('oklchSetChroma', () => {
60
+ it('reducing chroma toward 0 desaturates a color', () => {
61
+ const vivid = '#ff3366';
62
+ const muted = oklchSetChroma(vivid, 0.1);
63
+ // Muted version's R/G/B channels should be much closer to each other than vivid.
64
+ const parse = (h: string) => [
65
+ parseInt(h.slice(1, 3), 16),
66
+ parseInt(h.slice(3, 5), 16),
67
+ parseInt(h.slice(5, 7), 16),
68
+ ];
69
+ const [vr, vg, vb] = parse(vivid);
70
+ const [mr, mg, mb] = parse(muted);
71
+ const vSpread = Math.max(vr, vg, vb) - Math.min(vr, vg, vb);
72
+ const mSpread = Math.max(mr, mg, mb) - Math.min(mr, mg, mb);
73
+ expect(mSpread).toBeLessThan(vSpread);
74
+ });
75
+ });
76
+
77
+ describe('contrastRatio', () => {
78
+ it('white-on-black is the maximum (≈21)', () => {
79
+ expect(contrastRatio('#ffffff', '#000000')).toBeCloseTo(21, 0);
80
+ });
81
+ it('same-color is 1', () => {
82
+ expect(contrastRatio('#aabbcc', '#aabbcc')).toBeCloseTo(1, 5);
83
+ });
84
+ it('is symmetric', () => {
85
+ expect(contrastRatio('#222', '#ddd')).toBeCloseTo(contrastRatio('#ddd', '#222'), 5);
86
+ });
87
+ });
88
+
89
+ describe('pickContrastingText', () => {
90
+ it('returns dark text for light backgrounds', () => {
91
+ expect(pickContrastingText('#ffffff')).toBe('#1a202c');
92
+ expect(pickContrastingText('#f7fafc')).toBe('#1a202c');
93
+ });
94
+ it('returns light text for dark backgrounds', () => {
95
+ expect(pickContrastingText('#000000')).toBe('#f7fafc');
96
+ expect(pickContrastingText('#1a202c')).toBe('#f7fafc');
97
+ });
98
+ it('respects custom light/dark options', () => {
99
+ expect(pickContrastingText('#000000', '#fefefe', '#020202')).toBe('#fefefe');
100
+ });
101
+ });
102
+
103
+ describe('deriveScale', () => {
104
+ it('produces 5 stops with base in the middle', () => {
105
+ const scale = deriveScale('#3182ce', 0.15);
106
+ expect(scale.base).toBe('#3182ce');
107
+ expect(relativeLuminance(scale.lighter2)).toBeGreaterThan(relativeLuminance(scale.lighter1));
108
+ expect(relativeLuminance(scale.lighter1)).toBeGreaterThan(relativeLuminance(scale.base));
109
+ expect(relativeLuminance(scale.base)).toBeGreaterThan(relativeLuminance(scale.darker1));
110
+ expect(relativeLuminance(scale.darker1)).toBeGreaterThan(relativeLuminance(scale.darker2));
111
+ });
112
+ });
@@ -11,7 +11,7 @@ import type { Block, Layer, TextLayer, ShapeLayer } from '../schemas/Doc.js';
11
11
 
12
12
  function makeTemplateBlock(overrides: Partial<TemplateBlock> = {}): TemplateBlock {
13
13
  return {
14
- template: 'titleBlock',
14
+ template: 'title',
15
15
  id: 'test-title-1',
16
16
  duration: 5,
17
17
  audioSegment: 0,
@@ -43,7 +43,7 @@ const defaultContext: RenderContext = {
43
43
 
44
44
  describe('getLayers', () => {
45
45
  it('generates layers for a known template block', () => {
46
- const block = makeTemplateBlock({ template: 'titleBlock', title: 'Test Title' });
46
+ const block = makeTemplateBlock({ template: 'title', title: 'Test Title' });
47
47
  const layers = getLayers(block, defaultContext);
48
48
 
49
49
  expect(Array.isArray(layers)).toBe(true);
@@ -83,6 +83,31 @@ describe('getLayers', () => {
83
83
  expect(layers).toEqual(existingLayers);
84
84
  });
85
85
 
86
+ it('resolves legacy template aliases through TEMPLATE_ALIASES', () => {
87
+ // Regression: `getLayers` previously did `block.template in templateRegistry`
88
+ // without alias resolution, so docs authored with the legacy long ids
89
+ // (`titleBlock`, `quoteBlock`, `mapBlock`, `listBlock`) rendered as
90
+ // empty SVG cards in the linear/document view — `hasTemplate()` accepts
91
+ // the alias, so `isAnnotatedBlock` returns true and the card wrapper
92
+ // renders, but the registry lookup below would miss the alias and the
93
+ // layer array came back empty.
94
+ const aliasedToCanonical: Array<[string, string]> = [
95
+ ['titleBlock', 'title'],
96
+ ['quoteBlock', 'quote'],
97
+ ['listBlock', 'list'],
98
+ ];
99
+ for (const [alias] of aliasedToCanonical) {
100
+ const block = makeTemplateBlock({
101
+ template: alias as TemplateBlock['template'],
102
+ title: 'Aliased',
103
+ items: ['a', 'b', 'c'],
104
+ quote: 'q',
105
+ } as Partial<TemplateBlock>);
106
+ const layers = getLayers(block, defaultContext);
107
+ expect(layers.length).toBeGreaterThan(0);
108
+ }
109
+ });
110
+
86
111
  it('returns empty array for unknown template', () => {
87
112
  const block = {
88
113
  template: 'totally_nonexistent',
@@ -103,7 +128,7 @@ describe('getLayers', () => {
103
128
  });
104
129
 
105
130
  it('uses default context values when context is omitted', () => {
106
- const block = makeTemplateBlock({ template: 'titleBlock', title: 'Defaults' });
131
+ const block = makeTemplateBlock({ template: 'title', title: 'Defaults' });
107
132
  const layers = getLayers(block);
108
133
 
109
134
  expect(Array.isArray(layers)).toBe(true);
@@ -147,7 +172,7 @@ describe('getLayers', () => {
147
172
  };
148
173
 
149
174
  it('injects persistent bottom and top layers around block layers', () => {
150
- const block = makeTemplateBlock({ template: 'titleBlock', title: 'With Persistent' });
175
+ const block = makeTemplateBlock({ template: 'title', title: 'With Persistent' });
151
176
  const layers = getLayers(block, { ...defaultContext, persistentLayers: persistentConfig });
152
177
 
153
178
  // First layer should be the bottom persistent layer
@@ -160,7 +185,7 @@ describe('getLayers', () => {
160
185
 
161
186
  it('respects useBottomLayer: false opt-out', () => {
162
187
  const block = makeTemplateBlock({
163
- template: 'titleBlock',
188
+ template: 'title',
164
189
  title: 'No Bottom',
165
190
  useBottomLayer: false,
166
191
  });
@@ -174,7 +199,7 @@ describe('getLayers', () => {
174
199
 
175
200
  it('respects useTopLayer: false opt-out', () => {
176
201
  const block = makeTemplateBlock({
177
- template: 'titleBlock',
202
+ template: 'title',
178
203
  title: 'No Top',
179
204
  useTopLayer: false,
180
205
  });
@@ -187,7 +212,7 @@ describe('getLayers', () => {
187
212
  });
188
213
 
189
214
  it('skips injection when no persistent layers are configured', () => {
190
- const block = makeTemplateBlock({ template: 'titleBlock', title: 'No Persistent' });
215
+ const block = makeTemplateBlock({ template: 'title', title: 'No Persistent' });
191
216
  const withoutPersistent = getLayers(block, defaultContext);
192
217
  const withEmptyPersistent = getLayers(block, {
193
218
  ...defaultContext,