@ranx729/medieval-ornaments 0.1.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 (940) hide show
  1. package/ASSET-RIGHTS.md +21 -0
  2. package/LICENSE +31 -0
  3. package/README.md +183 -0
  4. package/SELECTION.md +22 -0
  5. package/USAGE.md +100 -0
  6. package/docs/INTEGRATION.md +262 -0
  7. package/lib/catalog.js +5 -0
  8. package/lib/catalog.json +7357 -0
  9. package/lib/cli.js +73 -0
  10. package/lib/index.d.ts +74 -0
  11. package/lib/index.js +3 -0
  12. package/lib/react.d.ts +9 -0
  13. package/lib/react.js +33 -0
  14. package/lib/resolve.js +118 -0
  15. package/lib/styles.d.ts +1 -0
  16. package/lib/vanilla.js +57 -0
  17. package/ornaments.css +63 -0
  18. package/package.json +44 -0
  19. package/png/128/butterfly-panel-red.png +0 -0
  20. package/png/128/floral-bird-panel-blue.png +0 -0
  21. package/png/128/floral-bird-panel-left.png +0 -0
  22. package/png/128/floral-bird-panel-right.png +0 -0
  23. package/png/128/gold-leaf-scroll-border.png +0 -0
  24. package/png/128/gold-leaf-scroll-corner.png +0 -0
  25. package/png/128/gold-leaf-scroll-rotated.png +0 -0
  26. package/png/128/gold-leaf-scroll.png +0 -0
  27. package/png/128/gold-quatrefoil-vine-border.png +0 -0
  28. package/png/128/gold-quatrefoil-vine-corner.png +0 -0
  29. package/png/128/gold-quatrefoil-vine-rotated.png +0 -0
  30. package/png/128/gold-quatrefoil-vine.png +0 -0
  31. package/png/128/interlocking-ribbon-border.png +0 -0
  32. package/png/128/interlocking-ribbon-corner.png +0 -0
  33. package/png/128/interlocking-ribbon-rotated.png +0 -0
  34. package/png/128/interlocking-ribbon.png +0 -0
  35. package/png/128/plate-01-linked-scrolls-reference.png +0 -0
  36. package/png/128/plate-02-stepped-ribbon-border.png +0 -0
  37. package/png/128/plate-02-stepped-ribbon-reference.png +0 -0
  38. package/png/128/plate-03-spiral-bands-border.png +0 -0
  39. package/png/128/plate-03-spiral-bands-reference.png +0 -0
  40. package/png/128/plate-04-heart-and-diamond-reference.png +0 -0
  41. package/png/128/plate-05-blue-curls-border.png +0 -0
  42. package/png/128/plate-05-blue-curls-reference.png +0 -0
  43. package/png/128/plate-06-paired-red-scrolls-reference.png +0 -0
  44. package/png/128/plate-06-paired-red-scrolls-rotated.png +0 -0
  45. package/png/128/plate-06-paired-red-scrolls.png +0 -0
  46. package/png/128/plate-07-blue-heart-leaves-reference.png +0 -0
  47. package/png/128/plate-08-diagonal-cross-border.png +0 -0
  48. package/png/128/plate-09-interlaced-knot-border.png +0 -0
  49. package/png/128/plate-10-blue-palmettes-reference.png +0 -0
  50. package/png/128/plate-10-blue-palmettes-rotated.png +0 -0
  51. package/png/128/plate-10-blue-palmettes.png +0 -0
  52. package/png/128/plate-11-acanthus-scroll-reference.png +0 -0
  53. package/png/128/plate-11-acanthus-scroll.png +0 -0
  54. package/png/128/plate-13-leaf-and-flower-vine-border.png +0 -0
  55. package/png/128/plate-13-leaf-and-flower-vine-reference.png +0 -0
  56. package/png/128/plate-13-leaf-and-flower-vine-rotated.png +0 -0
  57. package/png/128/plate-13-leaf-and-flower-vine.png +0 -0
  58. package/png/128/plate-14-crossed-diamonds-border.png +0 -0
  59. package/png/128/plate-14-crossed-diamonds-reference.png +0 -0
  60. package/png/128/plate-15-diamond-square-border.png +0 -0
  61. package/png/128/plate-17-stepped-arches-border.png +0 -0
  62. package/png/128/plate-17-stepped-arches-reference.png +0 -0
  63. package/png/128/plate-18-fan-palmettes-reference.png +0 -0
  64. package/png/128/plate-19-cream-scrolls-border.png +0 -0
  65. package/png/128/plate-23-crossed-ribbon-knots-border.png +0 -0
  66. package/png/128/plate-26-eight-petal-rosette-border.png +0 -0
  67. package/png/128/plate-27-blue-flower-medallions-border.png +0 -0
  68. package/png/128/plate-28-angular-blue-meander-border.png +0 -0
  69. package/png/128/plate-29-red-acanthus-reference.png +0 -0
  70. package/png/128/plate-29-red-acanthus-rotated.png +0 -0
  71. package/png/128/plate-29-red-acanthus.png +0 -0
  72. package/png/128/plate-30-layered-palmettes-border.png +0 -0
  73. package/png/128/plate-30-layered-palmettes-reference.png +0 -0
  74. package/png/128/plate-30-layered-palmettes-rotated.png +0 -0
  75. package/png/128/plate-30-layered-palmettes.png +0 -0
  76. package/png/128/plate-31-alternating-florets-reference.png +0 -0
  77. package/png/128/plate-31-alternating-florets-rotated.png +0 -0
  78. package/png/128/plate-31-alternating-florets.png +0 -0
  79. package/png/128/plate-32-linked-ovals-border.png +0 -0
  80. package/png/128/plate-32-linked-ovals-reference.png +0 -0
  81. package/png/128/plate-33-leaf-scrolls-reference.png +0 -0
  82. package/png/128/plate-34-nested-fans-reference.png +0 -0
  83. package/png/128/plate-35-crossed-white-stems-reference.png +0 -0
  84. package/png/128/plate-38-diagonal-meander-reference.png +0 -0
  85. package/png/128/red-berry-vine-border.png +0 -0
  86. package/png/128/red-berry-vine-corner.png +0 -0
  87. package/png/128/red-berry-vine-rotated.png +0 -0
  88. package/png/128/red-berry-vine.png +0 -0
  89. package/png/128/red-rosette-vine-border.png +0 -0
  90. package/png/128/red-rosette-vine-corner.png +0 -0
  91. package/png/128/red-rosette-vine-rotated.png +0 -0
  92. package/png/128/red-rosette-vine.png +0 -0
  93. package/png/128/red-trefoil-vine-border.png +0 -0
  94. package/png/128/red-trefoil-vine-corner.png +0 -0
  95. package/png/128/red-trefoil-vine-rotated.png +0 -0
  96. package/png/128/red-trefoil-vine.png +0 -0
  97. package/png/128/spiral-ribbon-column.png +0 -0
  98. package/png/256/butterfly-panel-red.png +0 -0
  99. package/png/256/floral-bird-panel-blue.png +0 -0
  100. package/png/256/floral-bird-panel-left.png +0 -0
  101. package/png/256/floral-bird-panel-right.png +0 -0
  102. package/png/256/gold-leaf-scroll-border.png +0 -0
  103. package/png/256/gold-leaf-scroll-corner.png +0 -0
  104. package/png/256/gold-leaf-scroll-rotated.png +0 -0
  105. package/png/256/gold-leaf-scroll.png +0 -0
  106. package/png/256/gold-quatrefoil-vine-border.png +0 -0
  107. package/png/256/gold-quatrefoil-vine-corner.png +0 -0
  108. package/png/256/gold-quatrefoil-vine-rotated.png +0 -0
  109. package/png/256/gold-quatrefoil-vine.png +0 -0
  110. package/png/256/interlocking-ribbon-border.png +0 -0
  111. package/png/256/interlocking-ribbon-corner.png +0 -0
  112. package/png/256/interlocking-ribbon-rotated.png +0 -0
  113. package/png/256/interlocking-ribbon.png +0 -0
  114. package/png/256/plate-01-linked-scrolls-reference.png +0 -0
  115. package/png/256/plate-02-stepped-ribbon-reference.png +0 -0
  116. package/png/256/plate-03-spiral-bands-reference.png +0 -0
  117. package/png/256/plate-11-acanthus-scroll-reference.png +0 -0
  118. package/png/256/plate-11-acanthus-scroll.png +0 -0
  119. package/png/256/plate-13-leaf-and-flower-vine-border.png +0 -0
  120. package/png/256/plate-13-leaf-and-flower-vine-reference.png +0 -0
  121. package/png/256/plate-18-fan-palmettes-reference.png +0 -0
  122. package/png/256/plate-29-red-acanthus-reference.png +0 -0
  123. package/png/256/plate-30-layered-palmettes-reference.png +0 -0
  124. package/png/256/plate-31-alternating-florets-reference.png +0 -0
  125. package/png/256/red-berry-vine-border.png +0 -0
  126. package/png/256/red-berry-vine-corner.png +0 -0
  127. package/png/256/red-berry-vine-rotated.png +0 -0
  128. package/png/256/red-berry-vine.png +0 -0
  129. package/png/256/red-rosette-vine-border.png +0 -0
  130. package/png/256/red-rosette-vine-corner.png +0 -0
  131. package/png/256/red-rosette-vine-rotated.png +0 -0
  132. package/png/256/red-rosette-vine.png +0 -0
  133. package/png/256/red-trefoil-vine-border.png +0 -0
  134. package/png/256/red-trefoil-vine-corner.png +0 -0
  135. package/png/256/red-trefoil-vine-rotated.png +0 -0
  136. package/png/256/red-trefoil-vine.png +0 -0
  137. package/png/256/spiral-ribbon-column.png +0 -0
  138. package/png/512/butterfly-panel-red.png +0 -0
  139. package/png/512/floral-bird-panel-blue.png +0 -0
  140. package/png/512/floral-bird-panel-left.png +0 -0
  141. package/png/512/floral-bird-panel-right.png +0 -0
  142. package/png/512/gold-leaf-scroll-border.png +0 -0
  143. package/png/512/gold-leaf-scroll-corner.png +0 -0
  144. package/png/512/gold-leaf-scroll-rotated.png +0 -0
  145. package/png/512/gold-leaf-scroll.png +0 -0
  146. package/png/512/gold-quatrefoil-vine-border.png +0 -0
  147. package/png/512/gold-quatrefoil-vine-corner.png +0 -0
  148. package/png/512/gold-quatrefoil-vine-rotated.png +0 -0
  149. package/png/512/gold-quatrefoil-vine.png +0 -0
  150. package/png/512/interlocking-ribbon-border.png +0 -0
  151. package/png/512/interlocking-ribbon-corner.png +0 -0
  152. package/png/512/interlocking-ribbon-rotated.png +0 -0
  153. package/png/512/interlocking-ribbon.png +0 -0
  154. package/png/512/red-berry-vine-border.png +0 -0
  155. package/png/512/red-berry-vine-corner.png +0 -0
  156. package/png/512/red-berry-vine-rotated.png +0 -0
  157. package/png/512/red-berry-vine.png +0 -0
  158. package/png/512/red-rosette-vine-border.png +0 -0
  159. package/png/512/red-rosette-vine-corner.png +0 -0
  160. package/png/512/red-rosette-vine-rotated.png +0 -0
  161. package/png/512/red-rosette-vine.png +0 -0
  162. package/png/512/red-trefoil-vine-border.png +0 -0
  163. package/png/512/red-trefoil-vine-corner.png +0 -0
  164. package/png/512/red-trefoil-vine-rotated.png +0 -0
  165. package/png/512/red-trefoil-vine.png +0 -0
  166. package/png/512/spiral-ribbon-column.png +0 -0
  167. package/png/768/gold-leaf-scroll-border.png +0 -0
  168. package/png/768/gold-leaf-scroll-corner.png +0 -0
  169. package/png/768/gold-leaf-scroll-rotated.png +0 -0
  170. package/png/768/gold-leaf-scroll.png +0 -0
  171. package/png/768/gold-quatrefoil-vine-border.png +0 -0
  172. package/png/768/gold-quatrefoil-vine-corner.png +0 -0
  173. package/png/768/gold-quatrefoil-vine-rotated.png +0 -0
  174. package/png/768/gold-quatrefoil-vine.png +0 -0
  175. package/png/768/interlocking-ribbon-border.png +0 -0
  176. package/png/768/interlocking-ribbon-corner.png +0 -0
  177. package/png/768/interlocking-ribbon-rotated.png +0 -0
  178. package/png/768/interlocking-ribbon.png +0 -0
  179. package/png/768/red-berry-vine-border.png +0 -0
  180. package/png/768/red-berry-vine-corner.png +0 -0
  181. package/png/768/red-berry-vine-rotated.png +0 -0
  182. package/png/768/red-berry-vine.png +0 -0
  183. package/png/768/red-rosette-vine-border.png +0 -0
  184. package/png/768/red-rosette-vine-corner.png +0 -0
  185. package/png/768/red-rosette-vine-rotated.png +0 -0
  186. package/png/768/red-rosette-vine.png +0 -0
  187. package/png/768/red-trefoil-vine-border.png +0 -0
  188. package/png/768/red-trefoil-vine-corner.png +0 -0
  189. package/png/768/red-trefoil-vine-rotated.png +0 -0
  190. package/png/768/red-trefoil-vine.png +0 -0
  191. package/png/butterfly-panel-red.png +0 -0
  192. package/png/floral-bird-panel-blue.png +0 -0
  193. package/png/floral-bird-panel-left.png +0 -0
  194. package/png/floral-bird-panel-right.png +0 -0
  195. package/png/gold-leaf-scroll-border.png +0 -0
  196. package/png/gold-leaf-scroll-corner.png +0 -0
  197. package/png/gold-leaf-scroll-rotated.png +0 -0
  198. package/png/gold-leaf-scroll.png +0 -0
  199. package/png/gold-quatrefoil-vine-border.png +0 -0
  200. package/png/gold-quatrefoil-vine-corner.png +0 -0
  201. package/png/gold-quatrefoil-vine-rotated.png +0 -0
  202. package/png/gold-quatrefoil-vine.png +0 -0
  203. package/png/interlocking-ribbon-border.png +0 -0
  204. package/png/interlocking-ribbon-corner.png +0 -0
  205. package/png/interlocking-ribbon-rotated.png +0 -0
  206. package/png/interlocking-ribbon.png +0 -0
  207. package/png/plate-01-linked-scrolls-border.png +0 -0
  208. package/png/plate-01-linked-scrolls-corner.png +0 -0
  209. package/png/plate-01-linked-scrolls-reference.png +0 -0
  210. package/png/plate-01-linked-scrolls-rotated.png +0 -0
  211. package/png/plate-01-linked-scrolls.png +0 -0
  212. package/png/plate-02-stepped-ribbon-border.png +0 -0
  213. package/png/plate-02-stepped-ribbon-corner.png +0 -0
  214. package/png/plate-02-stepped-ribbon-reference.png +0 -0
  215. package/png/plate-02-stepped-ribbon-rotated.png +0 -0
  216. package/png/plate-02-stepped-ribbon.png +0 -0
  217. package/png/plate-03-spiral-bands-border.png +0 -0
  218. package/png/plate-03-spiral-bands-corner.png +0 -0
  219. package/png/plate-03-spiral-bands-reference.png +0 -0
  220. package/png/plate-03-spiral-bands-rotated.png +0 -0
  221. package/png/plate-03-spiral-bands.png +0 -0
  222. package/png/plate-04-heart-and-diamond-border.png +0 -0
  223. package/png/plate-04-heart-and-diamond-corner.png +0 -0
  224. package/png/plate-04-heart-and-diamond-reference.png +0 -0
  225. package/png/plate-04-heart-and-diamond-rotated.png +0 -0
  226. package/png/plate-04-heart-and-diamond.png +0 -0
  227. package/png/plate-05-blue-curls-border.png +0 -0
  228. package/png/plate-05-blue-curls-corner.png +0 -0
  229. package/png/plate-05-blue-curls-reference.png +0 -0
  230. package/png/plate-05-blue-curls-rotated.png +0 -0
  231. package/png/plate-05-blue-curls.png +0 -0
  232. package/png/plate-06-paired-red-scrolls-border.png +0 -0
  233. package/png/plate-06-paired-red-scrolls-corner.png +0 -0
  234. package/png/plate-06-paired-red-scrolls-reference.png +0 -0
  235. package/png/plate-06-paired-red-scrolls-rotated.png +0 -0
  236. package/png/plate-06-paired-red-scrolls.png +0 -0
  237. package/png/plate-07-blue-heart-leaves-border.png +0 -0
  238. package/png/plate-07-blue-heart-leaves-corner.png +0 -0
  239. package/png/plate-07-blue-heart-leaves-reference.png +0 -0
  240. package/png/plate-07-blue-heart-leaves-rotated.png +0 -0
  241. package/png/plate-07-blue-heart-leaves.png +0 -0
  242. package/png/plate-08-diagonal-cross-border.png +0 -0
  243. package/png/plate-08-diagonal-cross-corner.png +0 -0
  244. package/png/plate-08-diagonal-cross-reference.png +0 -0
  245. package/png/plate-08-diagonal-cross-rotated.png +0 -0
  246. package/png/plate-08-diagonal-cross.png +0 -0
  247. package/png/plate-09-interlaced-knot-border.png +0 -0
  248. package/png/plate-09-interlaced-knot-corner.png +0 -0
  249. package/png/plate-09-interlaced-knot-reference.png +0 -0
  250. package/png/plate-09-interlaced-knot-rotated.png +0 -0
  251. package/png/plate-09-interlaced-knot.png +0 -0
  252. package/png/plate-10-blue-palmettes-border.png +0 -0
  253. package/png/plate-10-blue-palmettes-corner.png +0 -0
  254. package/png/plate-10-blue-palmettes-reference.png +0 -0
  255. package/png/plate-10-blue-palmettes-rotated.png +0 -0
  256. package/png/plate-10-blue-palmettes.png +0 -0
  257. package/png/plate-11-acanthus-scroll-reference.png +0 -0
  258. package/png/plate-11-acanthus-scroll.png +0 -0
  259. package/png/plate-12-arched-diamonds-border.png +0 -0
  260. package/png/plate-12-arched-diamonds-corner.png +0 -0
  261. package/png/plate-12-arched-diamonds-reference.png +0 -0
  262. package/png/plate-12-arched-diamonds-rotated.png +0 -0
  263. package/png/plate-12-arched-diamonds.png +0 -0
  264. package/png/plate-13-leaf-and-flower-vine-border.png +0 -0
  265. package/png/plate-13-leaf-and-flower-vine-corner.png +0 -0
  266. package/png/plate-13-leaf-and-flower-vine-reference.png +0 -0
  267. package/png/plate-13-leaf-and-flower-vine-rotated.png +0 -0
  268. package/png/plate-13-leaf-and-flower-vine.png +0 -0
  269. package/png/plate-14-crossed-diamonds-border.png +0 -0
  270. package/png/plate-14-crossed-diamonds-corner.png +0 -0
  271. package/png/plate-14-crossed-diamonds-reference.png +0 -0
  272. package/png/plate-14-crossed-diamonds-rotated.png +0 -0
  273. package/png/plate-14-crossed-diamonds.png +0 -0
  274. package/png/plate-15-diamond-square-border.png +0 -0
  275. package/png/plate-15-diamond-square-corner.png +0 -0
  276. package/png/plate-15-diamond-square-reference.png +0 -0
  277. package/png/plate-15-diamond-square-rotated.png +0 -0
  278. package/png/plate-15-diamond-square.png +0 -0
  279. package/png/plate-16-stepped-corner-reference.png +0 -0
  280. package/png/plate-16-stepped-corner.png +0 -0
  281. package/png/plate-17-stepped-arches-border.png +0 -0
  282. package/png/plate-17-stepped-arches-corner.png +0 -0
  283. package/png/plate-17-stepped-arches-reference.png +0 -0
  284. package/png/plate-17-stepped-arches-rotated.png +0 -0
  285. package/png/plate-17-stepped-arches.png +0 -0
  286. package/png/plate-18-fan-palmettes-border.png +0 -0
  287. package/png/plate-18-fan-palmettes-corner.png +0 -0
  288. package/png/plate-18-fan-palmettes-reference.png +0 -0
  289. package/png/plate-18-fan-palmettes-rotated.png +0 -0
  290. package/png/plate-18-fan-palmettes.png +0 -0
  291. package/png/plate-19-cream-scrolls-border.png +0 -0
  292. package/png/plate-19-cream-scrolls-corner.png +0 -0
  293. package/png/plate-19-cream-scrolls-reference.png +0 -0
  294. package/png/plate-19-cream-scrolls-rotated.png +0 -0
  295. package/png/plate-19-cream-scrolls.png +0 -0
  296. package/png/plate-20-segmented-medallions-border.png +0 -0
  297. package/png/plate-20-segmented-medallions-corner.png +0 -0
  298. package/png/plate-20-segmented-medallions-reference.png +0 -0
  299. package/png/plate-20-segmented-medallions-rotated.png +0 -0
  300. package/png/plate-20-segmented-medallions.png +0 -0
  301. package/png/plate-21-green-flower-medallions-border.png +0 -0
  302. package/png/plate-21-green-flower-medallions-corner.png +0 -0
  303. package/png/plate-21-green-flower-medallions-reference.png +0 -0
  304. package/png/plate-21-green-flower-medallions-rotated.png +0 -0
  305. package/png/plate-21-green-flower-medallions.png +0 -0
  306. package/png/plate-22-white-petal-grid-border.png +0 -0
  307. package/png/plate-22-white-petal-grid-corner.png +0 -0
  308. package/png/plate-22-white-petal-grid-reference.png +0 -0
  309. package/png/plate-22-white-petal-grid-rotated.png +0 -0
  310. package/png/plate-22-white-petal-grid.png +0 -0
  311. package/png/plate-23-crossed-ribbon-knots-border.png +0 -0
  312. package/png/plate-23-crossed-ribbon-knots-corner.png +0 -0
  313. package/png/plate-23-crossed-ribbon-knots-reference.png +0 -0
  314. package/png/plate-23-crossed-ribbon-knots-rotated.png +0 -0
  315. package/png/plate-23-crossed-ribbon-knots.png +0 -0
  316. package/png/plate-24-gold-ring-scrolls-border.png +0 -0
  317. package/png/plate-24-gold-ring-scrolls-corner.png +0 -0
  318. package/png/plate-24-gold-ring-scrolls-reference.png +0 -0
  319. package/png/plate-24-gold-ring-scrolls-rotated.png +0 -0
  320. package/png/plate-24-gold-ring-scrolls.png +0 -0
  321. package/png/plate-25-greek-crosses-border.png +0 -0
  322. package/png/plate-25-greek-crosses-corner.png +0 -0
  323. package/png/plate-25-greek-crosses-reference.png +0 -0
  324. package/png/plate-25-greek-crosses-rotated.png +0 -0
  325. package/png/plate-25-greek-crosses.png +0 -0
  326. package/png/plate-26-eight-petal-rosette-border.png +0 -0
  327. package/png/plate-26-eight-petal-rosette-corner.png +0 -0
  328. package/png/plate-26-eight-petal-rosette-reference.png +0 -0
  329. package/png/plate-26-eight-petal-rosette-rotated.png +0 -0
  330. package/png/plate-26-eight-petal-rosette.png +0 -0
  331. package/png/plate-27-blue-flower-medallions-border.png +0 -0
  332. package/png/plate-27-blue-flower-medallions-corner.png +0 -0
  333. package/png/plate-27-blue-flower-medallions-reference.png +0 -0
  334. package/png/plate-27-blue-flower-medallions-rotated.png +0 -0
  335. package/png/plate-27-blue-flower-medallions.png +0 -0
  336. package/png/plate-28-angular-blue-meander-border.png +0 -0
  337. package/png/plate-28-angular-blue-meander-corner.png +0 -0
  338. package/png/plate-28-angular-blue-meander-reference.png +0 -0
  339. package/png/plate-28-angular-blue-meander-rotated.png +0 -0
  340. package/png/plate-28-angular-blue-meander.png +0 -0
  341. package/png/plate-29-red-acanthus-border.png +0 -0
  342. package/png/plate-29-red-acanthus-corner.png +0 -0
  343. package/png/plate-29-red-acanthus-reference.png +0 -0
  344. package/png/plate-29-red-acanthus-rotated.png +0 -0
  345. package/png/plate-29-red-acanthus.png +0 -0
  346. package/png/plate-30-layered-palmettes-border.png +0 -0
  347. package/png/plate-30-layered-palmettes-corner.png +0 -0
  348. package/png/plate-30-layered-palmettes-reference.png +0 -0
  349. package/png/plate-30-layered-palmettes-rotated.png +0 -0
  350. package/png/plate-30-layered-palmettes.png +0 -0
  351. package/png/plate-31-alternating-florets-border.png +0 -0
  352. package/png/plate-31-alternating-florets-corner.png +0 -0
  353. package/png/plate-31-alternating-florets-reference.png +0 -0
  354. package/png/plate-31-alternating-florets-rotated.png +0 -0
  355. package/png/plate-31-alternating-florets.png +0 -0
  356. package/png/plate-32-linked-ovals-border.png +0 -0
  357. package/png/plate-32-linked-ovals-corner.png +0 -0
  358. package/png/plate-32-linked-ovals-reference.png +0 -0
  359. package/png/plate-32-linked-ovals-rotated.png +0 -0
  360. package/png/plate-32-linked-ovals.png +0 -0
  361. package/png/plate-33-leaf-scrolls-border.png +0 -0
  362. package/png/plate-33-leaf-scrolls-corner.png +0 -0
  363. package/png/plate-33-leaf-scrolls-reference.png +0 -0
  364. package/png/plate-33-leaf-scrolls-rotated.png +0 -0
  365. package/png/plate-33-leaf-scrolls.png +0 -0
  366. package/png/plate-34-nested-fans-border.png +0 -0
  367. package/png/plate-34-nested-fans-corner.png +0 -0
  368. package/png/plate-34-nested-fans-reference.png +0 -0
  369. package/png/plate-34-nested-fans-rotated.png +0 -0
  370. package/png/plate-34-nested-fans.png +0 -0
  371. package/png/plate-35-crossed-white-stems-border.png +0 -0
  372. package/png/plate-35-crossed-white-stems-corner.png +0 -0
  373. package/png/plate-35-crossed-white-stems-reference.png +0 -0
  374. package/png/plate-35-crossed-white-stems-rotated.png +0 -0
  375. package/png/plate-35-crossed-white-stems.png +0 -0
  376. package/png/plate-36-greek-key-reference.png +0 -0
  377. package/png/plate-36-greek-key.png +0 -0
  378. package/png/plate-37-diamond-scroll-reference.png +0 -0
  379. package/png/plate-37-diamond-scroll.png +0 -0
  380. package/png/plate-38-diagonal-meander-border.png +0 -0
  381. package/png/plate-38-diagonal-meander-corner.png +0 -0
  382. package/png/plate-38-diagonal-meander-reference.png +0 -0
  383. package/png/plate-38-diagonal-meander-rotated.png +0 -0
  384. package/png/plate-38-diagonal-meander.png +0 -0
  385. package/png/red-berry-vine-border.png +0 -0
  386. package/png/red-berry-vine-corner.png +0 -0
  387. package/png/red-berry-vine-rotated.png +0 -0
  388. package/png/red-berry-vine.png +0 -0
  389. package/png/red-rosette-vine-border.png +0 -0
  390. package/png/red-rosette-vine-corner.png +0 -0
  391. package/png/red-rosette-vine-rotated.png +0 -0
  392. package/png/red-rosette-vine.png +0 -0
  393. package/png/red-trefoil-vine-border.png +0 -0
  394. package/png/red-trefoil-vine-corner.png +0 -0
  395. package/png/red-trefoil-vine-rotated.png +0 -0
  396. package/png/red-trefoil-vine.png +0 -0
  397. package/png/spiral-ribbon-column.png +0 -0
  398. package/svg/gold-leaf-scroll-border.svg +1 -0
  399. package/svg/gold-leaf-scroll-corner.svg +1 -0
  400. package/svg/gold-leaf-scroll-rotated.svg +1 -0
  401. package/svg/gold-leaf-scroll.svg +1 -0
  402. package/svg/gold-quatrefoil-vine-border.svg +1 -0
  403. package/svg/gold-quatrefoil-vine-corner.svg +1 -0
  404. package/svg/gold-quatrefoil-vine-rotated.svg +1 -0
  405. package/svg/gold-quatrefoil-vine.svg +1 -0
  406. package/svg/interlocking-ribbon-border.svg +1 -0
  407. package/svg/interlocking-ribbon-corner.svg +1 -0
  408. package/svg/interlocking-ribbon-rotated.svg +1 -0
  409. package/svg/interlocking-ribbon.svg +1 -0
  410. package/svg/plate-01-linked-scrolls-border.svg +53 -0
  411. package/svg/plate-01-linked-scrolls-corner.svg +53 -0
  412. package/svg/plate-01-linked-scrolls-rotated.svg +53 -0
  413. package/svg/plate-01-linked-scrolls.svg +53 -0
  414. package/svg/plate-02-stepped-ribbon-border.svg +64 -0
  415. package/svg/plate-02-stepped-ribbon-corner.svg +64 -0
  416. package/svg/plate-02-stepped-ribbon-rotated.svg +64 -0
  417. package/svg/plate-02-stepped-ribbon.svg +64 -0
  418. package/svg/plate-03-spiral-bands-border.svg +95 -0
  419. package/svg/plate-03-spiral-bands-corner.svg +95 -0
  420. package/svg/plate-03-spiral-bands-rotated.svg +95 -0
  421. package/svg/plate-03-spiral-bands.svg +95 -0
  422. package/svg/plate-04-heart-and-diamond-border.svg +66 -0
  423. package/svg/plate-04-heart-and-diamond-corner.svg +66 -0
  424. package/svg/plate-04-heart-and-diamond-rotated.svg +66 -0
  425. package/svg/plate-04-heart-and-diamond.svg +66 -0
  426. package/svg/plate-05-blue-curls-border.svg +84 -0
  427. package/svg/plate-05-blue-curls-corner.svg +84 -0
  428. package/svg/plate-05-blue-curls-rotated.svg +84 -0
  429. package/svg/plate-05-blue-curls.svg +84 -0
  430. package/svg/plate-06-paired-red-scrolls-border.svg +228 -0
  431. package/svg/plate-06-paired-red-scrolls-corner.svg +228 -0
  432. package/svg/plate-06-paired-red-scrolls-rotated.svg +228 -0
  433. package/svg/plate-06-paired-red-scrolls.svg +228 -0
  434. package/svg/plate-07-blue-heart-leaves-border.svg +151 -0
  435. package/svg/plate-07-blue-heart-leaves-corner.svg +151 -0
  436. package/svg/plate-07-blue-heart-leaves-rotated.svg +151 -0
  437. package/svg/plate-07-blue-heart-leaves.svg +151 -0
  438. package/svg/plate-08-diagonal-cross-border.svg +80 -0
  439. package/svg/plate-08-diagonal-cross-corner.svg +80 -0
  440. package/svg/plate-08-diagonal-cross-rotated.svg +80 -0
  441. package/svg/plate-08-diagonal-cross.svg +80 -0
  442. package/svg/plate-09-interlaced-knot-border.svg +69 -0
  443. package/svg/plate-09-interlaced-knot-corner.svg +69 -0
  444. package/svg/plate-09-interlaced-knot-rotated.svg +69 -0
  445. package/svg/plate-09-interlaced-knot.svg +69 -0
  446. package/svg/plate-10-blue-palmettes-border.svg +154 -0
  447. package/svg/plate-10-blue-palmettes-corner.svg +154 -0
  448. package/svg/plate-10-blue-palmettes-rotated.svg +154 -0
  449. package/svg/plate-10-blue-palmettes.svg +154 -0
  450. package/svg/plate-11-acanthus-scroll.svg +217 -0
  451. package/svg/plate-12-arched-diamonds-border.svg +76 -0
  452. package/svg/plate-12-arched-diamonds-corner.svg +76 -0
  453. package/svg/plate-12-arched-diamonds-rotated.svg +76 -0
  454. package/svg/plate-12-arched-diamonds.svg +76 -0
  455. package/svg/plate-13-leaf-and-flower-vine-border.svg +180 -0
  456. package/svg/plate-13-leaf-and-flower-vine-corner.svg +180 -0
  457. package/svg/plate-13-leaf-and-flower-vine-rotated.svg +180 -0
  458. package/svg/plate-13-leaf-and-flower-vine.svg +180 -0
  459. package/svg/plate-14-crossed-diamonds-border.svg +115 -0
  460. package/svg/plate-14-crossed-diamonds-corner.svg +115 -0
  461. package/svg/plate-14-crossed-diamonds-rotated.svg +115 -0
  462. package/svg/plate-14-crossed-diamonds.svg +115 -0
  463. package/svg/plate-15-diamond-square-border.svg +69 -0
  464. package/svg/plate-15-diamond-square-corner.svg +69 -0
  465. package/svg/plate-15-diamond-square-rotated.svg +69 -0
  466. package/svg/plate-15-diamond-square.svg +69 -0
  467. package/svg/plate-16-stepped-corner.svg +70 -0
  468. package/svg/plate-17-stepped-arches-border.svg +112 -0
  469. package/svg/plate-17-stepped-arches-corner.svg +112 -0
  470. package/svg/plate-17-stepped-arches-rotated.svg +112 -0
  471. package/svg/plate-17-stepped-arches.svg +112 -0
  472. package/svg/plate-18-fan-palmettes-border.svg +81 -0
  473. package/svg/plate-18-fan-palmettes-corner.svg +81 -0
  474. package/svg/plate-18-fan-palmettes-rotated.svg +81 -0
  475. package/svg/plate-18-fan-palmettes.svg +81 -0
  476. package/svg/plate-19-cream-scrolls-border.svg +95 -0
  477. package/svg/plate-19-cream-scrolls-corner.svg +95 -0
  478. package/svg/plate-19-cream-scrolls-rotated.svg +95 -0
  479. package/svg/plate-19-cream-scrolls.svg +95 -0
  480. package/svg/plate-20-segmented-medallions-border.svg +58 -0
  481. package/svg/plate-20-segmented-medallions-corner.svg +58 -0
  482. package/svg/plate-20-segmented-medallions-rotated.svg +58 -0
  483. package/svg/plate-20-segmented-medallions.svg +58 -0
  484. package/svg/plate-21-green-flower-medallions-border.svg +81 -0
  485. package/svg/plate-21-green-flower-medallions-corner.svg +81 -0
  486. package/svg/plate-21-green-flower-medallions-rotated.svg +81 -0
  487. package/svg/plate-21-green-flower-medallions.svg +81 -0
  488. package/svg/plate-22-white-petal-grid-border.svg +109 -0
  489. package/svg/plate-22-white-petal-grid-corner.svg +109 -0
  490. package/svg/plate-22-white-petal-grid-rotated.svg +109 -0
  491. package/svg/plate-22-white-petal-grid.svg +109 -0
  492. package/svg/plate-23-crossed-ribbon-knots-border.svg +79 -0
  493. package/svg/plate-23-crossed-ribbon-knots-corner.svg +79 -0
  494. package/svg/plate-23-crossed-ribbon-knots-rotated.svg +79 -0
  495. package/svg/plate-23-crossed-ribbon-knots.svg +79 -0
  496. package/svg/plate-24-gold-ring-scrolls-border.svg +100 -0
  497. package/svg/plate-24-gold-ring-scrolls-corner.svg +100 -0
  498. package/svg/plate-24-gold-ring-scrolls-rotated.svg +100 -0
  499. package/svg/plate-24-gold-ring-scrolls.svg +100 -0
  500. package/svg/plate-25-greek-crosses-border.svg +86 -0
  501. package/svg/plate-25-greek-crosses-corner.svg +86 -0
  502. package/svg/plate-25-greek-crosses-rotated.svg +86 -0
  503. package/svg/plate-25-greek-crosses.svg +86 -0
  504. package/svg/plate-26-eight-petal-rosette-border.svg +56 -0
  505. package/svg/plate-26-eight-petal-rosette-corner.svg +56 -0
  506. package/svg/plate-26-eight-petal-rosette-rotated.svg +56 -0
  507. package/svg/plate-26-eight-petal-rosette.svg +56 -0
  508. package/svg/plate-27-blue-flower-medallions-border.svg +86 -0
  509. package/svg/plate-27-blue-flower-medallions-corner.svg +86 -0
  510. package/svg/plate-27-blue-flower-medallions-rotated.svg +86 -0
  511. package/svg/plate-27-blue-flower-medallions.svg +86 -0
  512. package/svg/plate-28-angular-blue-meander-border.svg +75 -0
  513. package/svg/plate-28-angular-blue-meander-corner.svg +75 -0
  514. package/svg/plate-28-angular-blue-meander-rotated.svg +75 -0
  515. package/svg/plate-28-angular-blue-meander.svg +75 -0
  516. package/svg/plate-29-red-acanthus-border.svg +212 -0
  517. package/svg/plate-29-red-acanthus-corner.svg +212 -0
  518. package/svg/plate-29-red-acanthus-rotated.svg +212 -0
  519. package/svg/plate-29-red-acanthus.svg +212 -0
  520. package/svg/plate-30-layered-palmettes-border.svg +128 -0
  521. package/svg/plate-30-layered-palmettes-corner.svg +128 -0
  522. package/svg/plate-30-layered-palmettes-rotated.svg +128 -0
  523. package/svg/plate-30-layered-palmettes.svg +128 -0
  524. package/svg/plate-31-alternating-florets-border.svg +227 -0
  525. package/svg/plate-31-alternating-florets-corner.svg +227 -0
  526. package/svg/plate-31-alternating-florets-rotated.svg +227 -0
  527. package/svg/plate-31-alternating-florets.svg +227 -0
  528. package/svg/plate-32-linked-ovals-border.svg +124 -0
  529. package/svg/plate-32-linked-ovals-corner.svg +124 -0
  530. package/svg/plate-32-linked-ovals-rotated.svg +124 -0
  531. package/svg/plate-32-linked-ovals.svg +124 -0
  532. package/svg/plate-33-leaf-scrolls-border.svg +130 -0
  533. package/svg/plate-33-leaf-scrolls-corner.svg +130 -0
  534. package/svg/plate-33-leaf-scrolls-rotated.svg +130 -0
  535. package/svg/plate-33-leaf-scrolls.svg +130 -0
  536. package/svg/plate-34-nested-fans-border.svg +157 -0
  537. package/svg/plate-34-nested-fans-corner.svg +157 -0
  538. package/svg/plate-34-nested-fans-rotated.svg +157 -0
  539. package/svg/plate-34-nested-fans.svg +157 -0
  540. package/svg/plate-35-crossed-white-stems-border.svg +77 -0
  541. package/svg/plate-35-crossed-white-stems-corner.svg +77 -0
  542. package/svg/plate-35-crossed-white-stems-rotated.svg +77 -0
  543. package/svg/plate-35-crossed-white-stems.svg +77 -0
  544. package/svg/plate-36-greek-key.svg +170 -0
  545. package/svg/plate-37-diamond-scroll.svg +161 -0
  546. package/svg/plate-38-diagonal-meander-border.svg +86 -0
  547. package/svg/plate-38-diagonal-meander-corner.svg +86 -0
  548. package/svg/plate-38-diagonal-meander-rotated.svg +86 -0
  549. package/svg/plate-38-diagonal-meander.svg +86 -0
  550. package/svg/red-berry-vine-border.svg +1 -0
  551. package/svg/red-berry-vine-corner.svg +1 -0
  552. package/svg/red-berry-vine-rotated.svg +1 -0
  553. package/svg/red-berry-vine.svg +1 -0
  554. package/svg/red-rosette-vine-border.svg +1 -0
  555. package/svg/red-rosette-vine-corner.svg +1 -0
  556. package/svg/red-rosette-vine-rotated.svg +1 -0
  557. package/svg/red-rosette-vine.svg +1 -0
  558. package/svg/red-trefoil-vine-border.svg +1 -0
  559. package/svg/red-trefoil-vine-corner.svg +1 -0
  560. package/svg/red-trefoil-vine-rotated.svg +1 -0
  561. package/svg/red-trefoil-vine.svg +1 -0
  562. package/webp/128/butterfly-panel-red.webp +0 -0
  563. package/webp/128/floral-bird-panel-blue.webp +0 -0
  564. package/webp/128/floral-bird-panel-left.webp +0 -0
  565. package/webp/128/floral-bird-panel-right.webp +0 -0
  566. package/webp/128/gold-leaf-scroll-border.webp +0 -0
  567. package/webp/128/gold-leaf-scroll-corner.webp +0 -0
  568. package/webp/128/gold-leaf-scroll-rotated.webp +0 -0
  569. package/webp/128/gold-leaf-scroll.webp +0 -0
  570. package/webp/128/gold-quatrefoil-vine-border.webp +0 -0
  571. package/webp/128/gold-quatrefoil-vine-corner.webp +0 -0
  572. package/webp/128/gold-quatrefoil-vine-rotated.webp +0 -0
  573. package/webp/128/gold-quatrefoil-vine.webp +0 -0
  574. package/webp/128/interlocking-ribbon-border.webp +0 -0
  575. package/webp/128/interlocking-ribbon-corner.webp +0 -0
  576. package/webp/128/interlocking-ribbon-rotated.webp +0 -0
  577. package/webp/128/interlocking-ribbon.webp +0 -0
  578. package/webp/128/plate-01-linked-scrolls-reference.webp +0 -0
  579. package/webp/128/plate-02-stepped-ribbon-border.webp +0 -0
  580. package/webp/128/plate-02-stepped-ribbon-reference.webp +0 -0
  581. package/webp/128/plate-03-spiral-bands-border.webp +0 -0
  582. package/webp/128/plate-03-spiral-bands-reference.webp +0 -0
  583. package/webp/128/plate-04-heart-and-diamond-reference.webp +0 -0
  584. package/webp/128/plate-05-blue-curls-border.webp +0 -0
  585. package/webp/128/plate-05-blue-curls-reference.webp +0 -0
  586. package/webp/128/plate-06-paired-red-scrolls-reference.webp +0 -0
  587. package/webp/128/plate-06-paired-red-scrolls-rotated.webp +0 -0
  588. package/webp/128/plate-06-paired-red-scrolls.webp +0 -0
  589. package/webp/128/plate-07-blue-heart-leaves-reference.webp +0 -0
  590. package/webp/128/plate-08-diagonal-cross-border.webp +0 -0
  591. package/webp/128/plate-09-interlaced-knot-border.webp +0 -0
  592. package/webp/128/plate-10-blue-palmettes-reference.webp +0 -0
  593. package/webp/128/plate-10-blue-palmettes-rotated.webp +0 -0
  594. package/webp/128/plate-10-blue-palmettes.webp +0 -0
  595. package/webp/128/plate-11-acanthus-scroll-reference.webp +0 -0
  596. package/webp/128/plate-11-acanthus-scroll.webp +0 -0
  597. package/webp/128/plate-13-leaf-and-flower-vine-border.webp +0 -0
  598. package/webp/128/plate-13-leaf-and-flower-vine-reference.webp +0 -0
  599. package/webp/128/plate-13-leaf-and-flower-vine-rotated.webp +0 -0
  600. package/webp/128/plate-13-leaf-and-flower-vine.webp +0 -0
  601. package/webp/128/plate-14-crossed-diamonds-border.webp +0 -0
  602. package/webp/128/plate-14-crossed-diamonds-reference.webp +0 -0
  603. package/webp/128/plate-15-diamond-square-border.webp +0 -0
  604. package/webp/128/plate-17-stepped-arches-border.webp +0 -0
  605. package/webp/128/plate-17-stepped-arches-reference.webp +0 -0
  606. package/webp/128/plate-18-fan-palmettes-reference.webp +0 -0
  607. package/webp/128/plate-19-cream-scrolls-border.webp +0 -0
  608. package/webp/128/plate-23-crossed-ribbon-knots-border.webp +0 -0
  609. package/webp/128/plate-26-eight-petal-rosette-border.webp +0 -0
  610. package/webp/128/plate-27-blue-flower-medallions-border.webp +0 -0
  611. package/webp/128/plate-28-angular-blue-meander-border.webp +0 -0
  612. package/webp/128/plate-29-red-acanthus-reference.webp +0 -0
  613. package/webp/128/plate-29-red-acanthus-rotated.webp +0 -0
  614. package/webp/128/plate-29-red-acanthus.webp +0 -0
  615. package/webp/128/plate-30-layered-palmettes-border.webp +0 -0
  616. package/webp/128/plate-30-layered-palmettes-reference.webp +0 -0
  617. package/webp/128/plate-30-layered-palmettes-rotated.webp +0 -0
  618. package/webp/128/plate-30-layered-palmettes.webp +0 -0
  619. package/webp/128/plate-31-alternating-florets-reference.webp +0 -0
  620. package/webp/128/plate-31-alternating-florets-rotated.webp +0 -0
  621. package/webp/128/plate-31-alternating-florets.webp +0 -0
  622. package/webp/128/plate-32-linked-ovals-border.webp +0 -0
  623. package/webp/128/plate-32-linked-ovals-reference.webp +0 -0
  624. package/webp/128/plate-33-leaf-scrolls-reference.webp +0 -0
  625. package/webp/128/plate-34-nested-fans-reference.webp +0 -0
  626. package/webp/128/plate-35-crossed-white-stems-reference.webp +0 -0
  627. package/webp/128/plate-38-diagonal-meander-reference.webp +0 -0
  628. package/webp/128/red-berry-vine-border.webp +0 -0
  629. package/webp/128/red-berry-vine-corner.webp +0 -0
  630. package/webp/128/red-berry-vine-rotated.webp +0 -0
  631. package/webp/128/red-berry-vine.webp +0 -0
  632. package/webp/128/red-rosette-vine-border.webp +0 -0
  633. package/webp/128/red-rosette-vine-corner.webp +0 -0
  634. package/webp/128/red-rosette-vine-rotated.webp +0 -0
  635. package/webp/128/red-rosette-vine.webp +0 -0
  636. package/webp/128/red-trefoil-vine-border.webp +0 -0
  637. package/webp/128/red-trefoil-vine-corner.webp +0 -0
  638. package/webp/128/red-trefoil-vine-rotated.webp +0 -0
  639. package/webp/128/red-trefoil-vine.webp +0 -0
  640. package/webp/128/spiral-ribbon-column.webp +0 -0
  641. package/webp/256/butterfly-panel-red.webp +0 -0
  642. package/webp/256/floral-bird-panel-blue.webp +0 -0
  643. package/webp/256/floral-bird-panel-left.webp +0 -0
  644. package/webp/256/floral-bird-panel-right.webp +0 -0
  645. package/webp/256/gold-leaf-scroll-border.webp +0 -0
  646. package/webp/256/gold-leaf-scroll-corner.webp +0 -0
  647. package/webp/256/gold-leaf-scroll-rotated.webp +0 -0
  648. package/webp/256/gold-leaf-scroll.webp +0 -0
  649. package/webp/256/gold-quatrefoil-vine-border.webp +0 -0
  650. package/webp/256/gold-quatrefoil-vine-corner.webp +0 -0
  651. package/webp/256/gold-quatrefoil-vine-rotated.webp +0 -0
  652. package/webp/256/gold-quatrefoil-vine.webp +0 -0
  653. package/webp/256/interlocking-ribbon-border.webp +0 -0
  654. package/webp/256/interlocking-ribbon-corner.webp +0 -0
  655. package/webp/256/interlocking-ribbon-rotated.webp +0 -0
  656. package/webp/256/interlocking-ribbon.webp +0 -0
  657. package/webp/256/plate-01-linked-scrolls-reference.webp +0 -0
  658. package/webp/256/plate-02-stepped-ribbon-reference.webp +0 -0
  659. package/webp/256/plate-03-spiral-bands-reference.webp +0 -0
  660. package/webp/256/plate-11-acanthus-scroll-reference.webp +0 -0
  661. package/webp/256/plate-11-acanthus-scroll.webp +0 -0
  662. package/webp/256/plate-13-leaf-and-flower-vine-border.webp +0 -0
  663. package/webp/256/plate-13-leaf-and-flower-vine-reference.webp +0 -0
  664. package/webp/256/plate-18-fan-palmettes-reference.webp +0 -0
  665. package/webp/256/plate-29-red-acanthus-reference.webp +0 -0
  666. package/webp/256/plate-30-layered-palmettes-reference.webp +0 -0
  667. package/webp/256/plate-31-alternating-florets-reference.webp +0 -0
  668. package/webp/256/red-berry-vine-border.webp +0 -0
  669. package/webp/256/red-berry-vine-corner.webp +0 -0
  670. package/webp/256/red-berry-vine-rotated.webp +0 -0
  671. package/webp/256/red-berry-vine.webp +0 -0
  672. package/webp/256/red-rosette-vine-border.webp +0 -0
  673. package/webp/256/red-rosette-vine-corner.webp +0 -0
  674. package/webp/256/red-rosette-vine-rotated.webp +0 -0
  675. package/webp/256/red-rosette-vine.webp +0 -0
  676. package/webp/256/red-trefoil-vine-border.webp +0 -0
  677. package/webp/256/red-trefoil-vine-corner.webp +0 -0
  678. package/webp/256/red-trefoil-vine-rotated.webp +0 -0
  679. package/webp/256/red-trefoil-vine.webp +0 -0
  680. package/webp/256/spiral-ribbon-column.webp +0 -0
  681. package/webp/512/butterfly-panel-red.webp +0 -0
  682. package/webp/512/floral-bird-panel-blue.webp +0 -0
  683. package/webp/512/floral-bird-panel-left.webp +0 -0
  684. package/webp/512/floral-bird-panel-right.webp +0 -0
  685. package/webp/512/gold-leaf-scroll-border.webp +0 -0
  686. package/webp/512/gold-leaf-scroll-corner.webp +0 -0
  687. package/webp/512/gold-leaf-scroll-rotated.webp +0 -0
  688. package/webp/512/gold-leaf-scroll.webp +0 -0
  689. package/webp/512/gold-quatrefoil-vine-border.webp +0 -0
  690. package/webp/512/gold-quatrefoil-vine-corner.webp +0 -0
  691. package/webp/512/gold-quatrefoil-vine-rotated.webp +0 -0
  692. package/webp/512/gold-quatrefoil-vine.webp +0 -0
  693. package/webp/512/interlocking-ribbon-border.webp +0 -0
  694. package/webp/512/interlocking-ribbon-corner.webp +0 -0
  695. package/webp/512/interlocking-ribbon-rotated.webp +0 -0
  696. package/webp/512/interlocking-ribbon.webp +0 -0
  697. package/webp/512/red-berry-vine-border.webp +0 -0
  698. package/webp/512/red-berry-vine-corner.webp +0 -0
  699. package/webp/512/red-berry-vine-rotated.webp +0 -0
  700. package/webp/512/red-berry-vine.webp +0 -0
  701. package/webp/512/red-rosette-vine-border.webp +0 -0
  702. package/webp/512/red-rosette-vine-corner.webp +0 -0
  703. package/webp/512/red-rosette-vine-rotated.webp +0 -0
  704. package/webp/512/red-rosette-vine.webp +0 -0
  705. package/webp/512/red-trefoil-vine-border.webp +0 -0
  706. package/webp/512/red-trefoil-vine-corner.webp +0 -0
  707. package/webp/512/red-trefoil-vine-rotated.webp +0 -0
  708. package/webp/512/red-trefoil-vine.webp +0 -0
  709. package/webp/512/spiral-ribbon-column.webp +0 -0
  710. package/webp/768/gold-leaf-scroll-border.webp +0 -0
  711. package/webp/768/gold-leaf-scroll-corner.webp +0 -0
  712. package/webp/768/gold-leaf-scroll-rotated.webp +0 -0
  713. package/webp/768/gold-leaf-scroll.webp +0 -0
  714. package/webp/768/gold-quatrefoil-vine-border.webp +0 -0
  715. package/webp/768/gold-quatrefoil-vine-corner.webp +0 -0
  716. package/webp/768/gold-quatrefoil-vine-rotated.webp +0 -0
  717. package/webp/768/gold-quatrefoil-vine.webp +0 -0
  718. package/webp/768/interlocking-ribbon-border.webp +0 -0
  719. package/webp/768/interlocking-ribbon-corner.webp +0 -0
  720. package/webp/768/interlocking-ribbon-rotated.webp +0 -0
  721. package/webp/768/interlocking-ribbon.webp +0 -0
  722. package/webp/768/red-berry-vine-border.webp +0 -0
  723. package/webp/768/red-berry-vine-corner.webp +0 -0
  724. package/webp/768/red-berry-vine-rotated.webp +0 -0
  725. package/webp/768/red-berry-vine.webp +0 -0
  726. package/webp/768/red-rosette-vine-border.webp +0 -0
  727. package/webp/768/red-rosette-vine-corner.webp +0 -0
  728. package/webp/768/red-rosette-vine-rotated.webp +0 -0
  729. package/webp/768/red-rosette-vine.webp +0 -0
  730. package/webp/768/red-trefoil-vine-border.webp +0 -0
  731. package/webp/768/red-trefoil-vine-corner.webp +0 -0
  732. package/webp/768/red-trefoil-vine-rotated.webp +0 -0
  733. package/webp/768/red-trefoil-vine.webp +0 -0
  734. package/webp/butterfly-panel-red.webp +0 -0
  735. package/webp/floral-bird-panel-blue.webp +0 -0
  736. package/webp/floral-bird-panel-left.webp +0 -0
  737. package/webp/floral-bird-panel-right.webp +0 -0
  738. package/webp/gold-leaf-scroll-border.webp +0 -0
  739. package/webp/gold-leaf-scroll-corner.webp +0 -0
  740. package/webp/gold-leaf-scroll-rotated.webp +0 -0
  741. package/webp/gold-leaf-scroll.webp +0 -0
  742. package/webp/gold-quatrefoil-vine-border.webp +0 -0
  743. package/webp/gold-quatrefoil-vine-corner.webp +0 -0
  744. package/webp/gold-quatrefoil-vine-rotated.webp +0 -0
  745. package/webp/gold-quatrefoil-vine.webp +0 -0
  746. package/webp/interlocking-ribbon-border.webp +0 -0
  747. package/webp/interlocking-ribbon-corner.webp +0 -0
  748. package/webp/interlocking-ribbon-rotated.webp +0 -0
  749. package/webp/interlocking-ribbon.webp +0 -0
  750. package/webp/plate-01-linked-scrolls-border.webp +0 -0
  751. package/webp/plate-01-linked-scrolls-corner.webp +0 -0
  752. package/webp/plate-01-linked-scrolls-reference.webp +0 -0
  753. package/webp/plate-01-linked-scrolls-rotated.webp +0 -0
  754. package/webp/plate-01-linked-scrolls.webp +0 -0
  755. package/webp/plate-02-stepped-ribbon-border.webp +0 -0
  756. package/webp/plate-02-stepped-ribbon-corner.webp +0 -0
  757. package/webp/plate-02-stepped-ribbon-reference.webp +0 -0
  758. package/webp/plate-02-stepped-ribbon-rotated.webp +0 -0
  759. package/webp/plate-02-stepped-ribbon.webp +0 -0
  760. package/webp/plate-03-spiral-bands-border.webp +0 -0
  761. package/webp/plate-03-spiral-bands-corner.webp +0 -0
  762. package/webp/plate-03-spiral-bands-reference.webp +0 -0
  763. package/webp/plate-03-spiral-bands-rotated.webp +0 -0
  764. package/webp/plate-03-spiral-bands.webp +0 -0
  765. package/webp/plate-04-heart-and-diamond-border.webp +0 -0
  766. package/webp/plate-04-heart-and-diamond-corner.webp +0 -0
  767. package/webp/plate-04-heart-and-diamond-reference.webp +0 -0
  768. package/webp/plate-04-heart-and-diamond-rotated.webp +0 -0
  769. package/webp/plate-04-heart-and-diamond.webp +0 -0
  770. package/webp/plate-05-blue-curls-border.webp +0 -0
  771. package/webp/plate-05-blue-curls-corner.webp +0 -0
  772. package/webp/plate-05-blue-curls-reference.webp +0 -0
  773. package/webp/plate-05-blue-curls-rotated.webp +0 -0
  774. package/webp/plate-05-blue-curls.webp +0 -0
  775. package/webp/plate-06-paired-red-scrolls-border.webp +0 -0
  776. package/webp/plate-06-paired-red-scrolls-corner.webp +0 -0
  777. package/webp/plate-06-paired-red-scrolls-reference.webp +0 -0
  778. package/webp/plate-06-paired-red-scrolls-rotated.webp +0 -0
  779. package/webp/plate-06-paired-red-scrolls.webp +0 -0
  780. package/webp/plate-07-blue-heart-leaves-border.webp +0 -0
  781. package/webp/plate-07-blue-heart-leaves-corner.webp +0 -0
  782. package/webp/plate-07-blue-heart-leaves-reference.webp +0 -0
  783. package/webp/plate-07-blue-heart-leaves-rotated.webp +0 -0
  784. package/webp/plate-07-blue-heart-leaves.webp +0 -0
  785. package/webp/plate-08-diagonal-cross-border.webp +0 -0
  786. package/webp/plate-08-diagonal-cross-corner.webp +0 -0
  787. package/webp/plate-08-diagonal-cross-reference.webp +0 -0
  788. package/webp/plate-08-diagonal-cross-rotated.webp +0 -0
  789. package/webp/plate-08-diagonal-cross.webp +0 -0
  790. package/webp/plate-09-interlaced-knot-border.webp +0 -0
  791. package/webp/plate-09-interlaced-knot-corner.webp +0 -0
  792. package/webp/plate-09-interlaced-knot-reference.webp +0 -0
  793. package/webp/plate-09-interlaced-knot-rotated.webp +0 -0
  794. package/webp/plate-09-interlaced-knot.webp +0 -0
  795. package/webp/plate-10-blue-palmettes-border.webp +0 -0
  796. package/webp/plate-10-blue-palmettes-corner.webp +0 -0
  797. package/webp/plate-10-blue-palmettes-reference.webp +0 -0
  798. package/webp/plate-10-blue-palmettes-rotated.webp +0 -0
  799. package/webp/plate-10-blue-palmettes.webp +0 -0
  800. package/webp/plate-11-acanthus-scroll-reference.webp +0 -0
  801. package/webp/plate-11-acanthus-scroll.webp +0 -0
  802. package/webp/plate-12-arched-diamonds-border.webp +0 -0
  803. package/webp/plate-12-arched-diamonds-corner.webp +0 -0
  804. package/webp/plate-12-arched-diamonds-reference.webp +0 -0
  805. package/webp/plate-12-arched-diamonds-rotated.webp +0 -0
  806. package/webp/plate-12-arched-diamonds.webp +0 -0
  807. package/webp/plate-13-leaf-and-flower-vine-border.webp +0 -0
  808. package/webp/plate-13-leaf-and-flower-vine-corner.webp +0 -0
  809. package/webp/plate-13-leaf-and-flower-vine-reference.webp +0 -0
  810. package/webp/plate-13-leaf-and-flower-vine-rotated.webp +0 -0
  811. package/webp/plate-13-leaf-and-flower-vine.webp +0 -0
  812. package/webp/plate-14-crossed-diamonds-border.webp +0 -0
  813. package/webp/plate-14-crossed-diamonds-corner.webp +0 -0
  814. package/webp/plate-14-crossed-diamonds-reference.webp +0 -0
  815. package/webp/plate-14-crossed-diamonds-rotated.webp +0 -0
  816. package/webp/plate-14-crossed-diamonds.webp +0 -0
  817. package/webp/plate-15-diamond-square-border.webp +0 -0
  818. package/webp/plate-15-diamond-square-corner.webp +0 -0
  819. package/webp/plate-15-diamond-square-reference.webp +0 -0
  820. package/webp/plate-15-diamond-square-rotated.webp +0 -0
  821. package/webp/plate-15-diamond-square.webp +0 -0
  822. package/webp/plate-16-stepped-corner-reference.webp +0 -0
  823. package/webp/plate-16-stepped-corner.webp +0 -0
  824. package/webp/plate-17-stepped-arches-border.webp +0 -0
  825. package/webp/plate-17-stepped-arches-corner.webp +0 -0
  826. package/webp/plate-17-stepped-arches-reference.webp +0 -0
  827. package/webp/plate-17-stepped-arches-rotated.webp +0 -0
  828. package/webp/plate-17-stepped-arches.webp +0 -0
  829. package/webp/plate-18-fan-palmettes-border.webp +0 -0
  830. package/webp/plate-18-fan-palmettes-corner.webp +0 -0
  831. package/webp/plate-18-fan-palmettes-reference.webp +0 -0
  832. package/webp/plate-18-fan-palmettes-rotated.webp +0 -0
  833. package/webp/plate-18-fan-palmettes.webp +0 -0
  834. package/webp/plate-19-cream-scrolls-border.webp +0 -0
  835. package/webp/plate-19-cream-scrolls-corner.webp +0 -0
  836. package/webp/plate-19-cream-scrolls-reference.webp +0 -0
  837. package/webp/plate-19-cream-scrolls-rotated.webp +0 -0
  838. package/webp/plate-19-cream-scrolls.webp +0 -0
  839. package/webp/plate-20-segmented-medallions-border.webp +0 -0
  840. package/webp/plate-20-segmented-medallions-corner.webp +0 -0
  841. package/webp/plate-20-segmented-medallions-reference.webp +0 -0
  842. package/webp/plate-20-segmented-medallions-rotated.webp +0 -0
  843. package/webp/plate-20-segmented-medallions.webp +0 -0
  844. package/webp/plate-21-green-flower-medallions-border.webp +0 -0
  845. package/webp/plate-21-green-flower-medallions-corner.webp +0 -0
  846. package/webp/plate-21-green-flower-medallions-reference.webp +0 -0
  847. package/webp/plate-21-green-flower-medallions-rotated.webp +0 -0
  848. package/webp/plate-21-green-flower-medallions.webp +0 -0
  849. package/webp/plate-22-white-petal-grid-border.webp +0 -0
  850. package/webp/plate-22-white-petal-grid-corner.webp +0 -0
  851. package/webp/plate-22-white-petal-grid-reference.webp +0 -0
  852. package/webp/plate-22-white-petal-grid-rotated.webp +0 -0
  853. package/webp/plate-22-white-petal-grid.webp +0 -0
  854. package/webp/plate-23-crossed-ribbon-knots-border.webp +0 -0
  855. package/webp/plate-23-crossed-ribbon-knots-corner.webp +0 -0
  856. package/webp/plate-23-crossed-ribbon-knots-reference.webp +0 -0
  857. package/webp/plate-23-crossed-ribbon-knots-rotated.webp +0 -0
  858. package/webp/plate-23-crossed-ribbon-knots.webp +0 -0
  859. package/webp/plate-24-gold-ring-scrolls-border.webp +0 -0
  860. package/webp/plate-24-gold-ring-scrolls-corner.webp +0 -0
  861. package/webp/plate-24-gold-ring-scrolls-reference.webp +0 -0
  862. package/webp/plate-24-gold-ring-scrolls-rotated.webp +0 -0
  863. package/webp/plate-24-gold-ring-scrolls.webp +0 -0
  864. package/webp/plate-25-greek-crosses-border.webp +0 -0
  865. package/webp/plate-25-greek-crosses-corner.webp +0 -0
  866. package/webp/plate-25-greek-crosses-reference.webp +0 -0
  867. package/webp/plate-25-greek-crosses-rotated.webp +0 -0
  868. package/webp/plate-25-greek-crosses.webp +0 -0
  869. package/webp/plate-26-eight-petal-rosette-border.webp +0 -0
  870. package/webp/plate-26-eight-petal-rosette-corner.webp +0 -0
  871. package/webp/plate-26-eight-petal-rosette-reference.webp +0 -0
  872. package/webp/plate-26-eight-petal-rosette-rotated.webp +0 -0
  873. package/webp/plate-26-eight-petal-rosette.webp +0 -0
  874. package/webp/plate-27-blue-flower-medallions-border.webp +0 -0
  875. package/webp/plate-27-blue-flower-medallions-corner.webp +0 -0
  876. package/webp/plate-27-blue-flower-medallions-reference.webp +0 -0
  877. package/webp/plate-27-blue-flower-medallions-rotated.webp +0 -0
  878. package/webp/plate-27-blue-flower-medallions.webp +0 -0
  879. package/webp/plate-28-angular-blue-meander-border.webp +0 -0
  880. package/webp/plate-28-angular-blue-meander-corner.webp +0 -0
  881. package/webp/plate-28-angular-blue-meander-reference.webp +0 -0
  882. package/webp/plate-28-angular-blue-meander-rotated.webp +0 -0
  883. package/webp/plate-28-angular-blue-meander.webp +0 -0
  884. package/webp/plate-29-red-acanthus-border.webp +0 -0
  885. package/webp/plate-29-red-acanthus-corner.webp +0 -0
  886. package/webp/plate-29-red-acanthus-reference.webp +0 -0
  887. package/webp/plate-29-red-acanthus-rotated.webp +0 -0
  888. package/webp/plate-29-red-acanthus.webp +0 -0
  889. package/webp/plate-30-layered-palmettes-border.webp +0 -0
  890. package/webp/plate-30-layered-palmettes-corner.webp +0 -0
  891. package/webp/plate-30-layered-palmettes-reference.webp +0 -0
  892. package/webp/plate-30-layered-palmettes-rotated.webp +0 -0
  893. package/webp/plate-30-layered-palmettes.webp +0 -0
  894. package/webp/plate-31-alternating-florets-border.webp +0 -0
  895. package/webp/plate-31-alternating-florets-corner.webp +0 -0
  896. package/webp/plate-31-alternating-florets-reference.webp +0 -0
  897. package/webp/plate-31-alternating-florets-rotated.webp +0 -0
  898. package/webp/plate-31-alternating-florets.webp +0 -0
  899. package/webp/plate-32-linked-ovals-border.webp +0 -0
  900. package/webp/plate-32-linked-ovals-corner.webp +0 -0
  901. package/webp/plate-32-linked-ovals-reference.webp +0 -0
  902. package/webp/plate-32-linked-ovals-rotated.webp +0 -0
  903. package/webp/plate-32-linked-ovals.webp +0 -0
  904. package/webp/plate-33-leaf-scrolls-border.webp +0 -0
  905. package/webp/plate-33-leaf-scrolls-corner.webp +0 -0
  906. package/webp/plate-33-leaf-scrolls-reference.webp +0 -0
  907. package/webp/plate-33-leaf-scrolls-rotated.webp +0 -0
  908. package/webp/plate-33-leaf-scrolls.webp +0 -0
  909. package/webp/plate-34-nested-fans-border.webp +0 -0
  910. package/webp/plate-34-nested-fans-corner.webp +0 -0
  911. package/webp/plate-34-nested-fans-reference.webp +0 -0
  912. package/webp/plate-34-nested-fans-rotated.webp +0 -0
  913. package/webp/plate-34-nested-fans.webp +0 -0
  914. package/webp/plate-35-crossed-white-stems-border.webp +0 -0
  915. package/webp/plate-35-crossed-white-stems-corner.webp +0 -0
  916. package/webp/plate-35-crossed-white-stems-reference.webp +0 -0
  917. package/webp/plate-35-crossed-white-stems-rotated.webp +0 -0
  918. package/webp/plate-35-crossed-white-stems.webp +0 -0
  919. package/webp/plate-36-greek-key-reference.webp +0 -0
  920. package/webp/plate-36-greek-key.webp +0 -0
  921. package/webp/plate-37-diamond-scroll-reference.webp +0 -0
  922. package/webp/plate-37-diamond-scroll.webp +0 -0
  923. package/webp/plate-38-diagonal-meander-border.webp +0 -0
  924. package/webp/plate-38-diagonal-meander-corner.webp +0 -0
  925. package/webp/plate-38-diagonal-meander-reference.webp +0 -0
  926. package/webp/plate-38-diagonal-meander-rotated.webp +0 -0
  927. package/webp/plate-38-diagonal-meander.webp +0 -0
  928. package/webp/red-berry-vine-border.webp +0 -0
  929. package/webp/red-berry-vine-corner.webp +0 -0
  930. package/webp/red-berry-vine-rotated.webp +0 -0
  931. package/webp/red-berry-vine.webp +0 -0
  932. package/webp/red-rosette-vine-border.webp +0 -0
  933. package/webp/red-rosette-vine-corner.webp +0 -0
  934. package/webp/red-rosette-vine-rotated.webp +0 -0
  935. package/webp/red-rosette-vine.webp +0 -0
  936. package/webp/red-trefoil-vine-border.webp +0 -0
  937. package/webp/red-trefoil-vine-corner.webp +0 -0
  938. package/webp/red-trefoil-vine-rotated.webp +0 -0
  939. package/webp/red-trefoil-vine.webp +0 -0
  940. package/webp/spiral-ribbon-column.webp +0 -0
package/lib/cli.js ADDED
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, copyFile, realpath } from 'node:fs/promises';
3
+ import { fileURLToPath } from 'node:url';
4
+ import path from 'node:path';
5
+ import { ornaments } from './catalog.js';
6
+ import { findOrnaments, getOrnament } from './resolve.js';
7
+
8
+ const root = fileURLToPath(new URL('../', import.meta.url));
9
+ const help = `Usage: medieval-ornaments copy-assets <destination> [--design <name>]... [--format svg|png|webp|all]
10
+
11
+ Copies the selected designs and their components/variants, the shared CSS, a
12
+ filtered catalog.json, and rights notices. Without --design, copies all designs.
13
+ Pass the destination's public URL as assetsBase in your application.
14
+ Example: medieval-ornaments copy-assets public/ornaments --design red-berry-vine
15
+ `;
16
+
17
+ export async function main(args) {
18
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) { console.log(help); return; }
19
+ if (args[0] !== 'copy-assets' || !args[1] || args[1].startsWith('--')) throw new Error(help);
20
+ const names = [], formats = ['svg', 'png', 'webp'];
21
+ let format = 'all';
22
+ for (let i = 2; i < args.length; i++) {
23
+ const flag = args[i], value = args[++i];
24
+ if (!value) throw new Error(`Missing value for ${flag}.`);
25
+ if (flag === '--design') names.push(getOrnament(value).name);
26
+ else if (flag === '--format' && [...formats, 'all'].includes(value)) format = value;
27
+ else throw new Error(`Invalid argument: ${flag} ${value}.\n${help}`);
28
+ }
29
+ const items = names.length ? findOrnaments().filter(item => names.includes(item.name)) : ornaments;
30
+ if (format !== 'all' && items.some(item => !item.formats.includes(format))) throw new Error(`Some selected designs do not support ${format}. Select compatible designs with --design or use --format all.`);
31
+ const destination = path.resolve(args[1]);
32
+ await mkdir(destination, { recursive: true });
33
+ const resolved = await realpath(destination);
34
+ // Never overwrite the installed package, its source, or an ancestor of either.
35
+ const packageRoot = await realpath(root);
36
+ if (resolved === packageRoot || packageRoot.startsWith(resolved + path.sep) || resolved.startsWith(packageRoot + path.sep)) throw new Error('Choose a destination outside the package directory.');
37
+ const paths = new Set(['ornaments.css', 'LICENSE', 'ASSET-RIGHTS.md']);
38
+ for (const item of items) for (const component of [item, ...Object.values(item.components)]) {
39
+ for (const asset of [component, ...component.variants]) {
40
+ for (const type of formats) if ((format === 'all' || format === type) && asset[type]) paths.add(asset[type]);
41
+ }
42
+ }
43
+ for (const relative of paths) {
44
+ const target = path.join(destination, relative);
45
+ await mkdir(path.dirname(target), { recursive: true });
46
+ // Resolve existing targets too: an accidental symlink must not redirect writes.
47
+ const parent = await realpath(path.dirname(target));
48
+ if (parent !== resolved && !parent.startsWith(resolved + path.sep)) throw new Error('Destination contains a symlink outside its root.');
49
+ try {
50
+ const existing = await realpath(target);
51
+ if (!existing.startsWith(resolved + path.sep)) throw new Error('Destination file points outside its root.');
52
+ } catch (error) { if (error.code !== 'ENOENT') throw error; }
53
+ await copyFile(path.join(root, relative), target);
54
+ }
55
+ // Write a filtered catalog; omit unavailable formats when only one was copied.
56
+ const catalog = JSON.parse(JSON.stringify(items));
57
+ if (format !== 'all') for (const item of catalog) {
58
+ item.formats = item.formats.filter(type => type === format);
59
+ for (const component of [item, ...Object.values(item.components)]) for (const asset of [component, ...component.variants]) {
60
+ for (const type of formats) if (type !== format) { delete asset[type]; delete asset[type + '_bytes']; }
61
+ }
62
+ }
63
+ const { writeFile } = await import('node:fs/promises');
64
+ const catalogPath = path.join(destination, 'catalog.json');
65
+ try { const existing = await realpath(catalogPath); if (!existing.startsWith(resolved + path.sep)) throw new Error('catalog.json points outside destination.'); }
66
+ catch (error) { if (error.code !== 'ENOENT') throw error; }
67
+ await writeFile(catalogPath, JSON.stringify(catalog, null, 2) + '\n');
68
+ console.log(`Copied ${items.length} designs and ${paths.size} files to ${destination}. Set assetsBase to its public URL.`);
69
+ }
70
+
71
+ if (process.argv[1] && await realpath(process.argv[1]) === fileURLToPath(import.meta.url)) {
72
+ main(process.argv.slice(2)).catch(error => { console.error(error.message); process.exitCode = 1; });
73
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ // Generated design/capability types; edit scripts/build-library.mjs.
2
+ export type DesignName = "butterfly-panel-red" | "floral-bird-panel-blue" | "floral-bird-panel-left" | "floral-bird-panel-right" | "gold-leaf-scroll" | "gold-quatrefoil-vine" | "interlocking-ribbon" | "plate-01-linked-scrolls" | "plate-02-stepped-ribbon" | "plate-03-spiral-bands" | "plate-04-heart-and-diamond" | "plate-05-blue-curls" | "plate-06-paired-red-scrolls" | "plate-07-blue-heart-leaves" | "plate-08-diagonal-cross" | "plate-09-interlaced-knot" | "plate-10-blue-palmettes" | "plate-11-acanthus-scroll" | "plate-12-arched-diamonds" | "plate-13-leaf-and-flower-vine" | "plate-14-crossed-diamonds" | "plate-15-diamond-square" | "plate-16-stepped-corner" | "plate-17-stepped-arches" | "plate-18-fan-palmettes" | "plate-19-cream-scrolls" | "plate-20-segmented-medallions" | "plate-21-green-flower-medallions" | "plate-22-white-petal-grid" | "plate-23-crossed-ribbon-knots" | "plate-24-gold-ring-scrolls" | "plate-25-greek-crosses" | "plate-26-eight-petal-rosette" | "plate-27-blue-flower-medallions" | "plate-28-angular-blue-meander" | "plate-29-red-acanthus" | "plate-30-layered-palmettes" | "plate-31-alternating-florets" | "plate-32-linked-ovals" | "plate-33-leaf-scrolls" | "plate-34-nested-fans" | "plate-35-crossed-white-stems" | "plate-36-greek-key" | "plate-37-diamond-scroll" | "plate-38-diagonal-meander" | "red-berry-vine" | "red-rosette-vine" | "red-trefoil-vine" | "spiral-ribbon-column";
3
+ export type RepeatDesignName = "gold-leaf-scroll" | "gold-quatrefoil-vine" | "interlocking-ribbon" | "plate-01-linked-scrolls" | "plate-02-stepped-ribbon" | "plate-03-spiral-bands" | "plate-04-heart-and-diamond" | "plate-05-blue-curls" | "plate-06-paired-red-scrolls" | "plate-07-blue-heart-leaves" | "plate-08-diagonal-cross" | "plate-09-interlaced-knot" | "plate-10-blue-palmettes" | "plate-12-arched-diamonds" | "plate-13-leaf-and-flower-vine" | "plate-14-crossed-diamonds" | "plate-15-diamond-square" | "plate-17-stepped-arches" | "plate-18-fan-palmettes" | "plate-19-cream-scrolls" | "plate-20-segmented-medallions" | "plate-21-green-flower-medallions" | "plate-22-white-petal-grid" | "plate-23-crossed-ribbon-knots" | "plate-24-gold-ring-scrolls" | "plate-25-greek-crosses" | "plate-26-eight-petal-rosette" | "plate-27-blue-flower-medallions" | "plate-28-angular-blue-meander" | "plate-29-red-acanthus" | "plate-30-layered-palmettes" | "plate-31-alternating-florets" | "plate-32-linked-ovals" | "plate-33-leaf-scrolls" | "plate-34-nested-fans" | "plate-35-crossed-white-stems" | "plate-38-diagonal-meander" | "red-berry-vine" | "red-rosette-vine" | "red-trefoil-vine";
4
+ export type WholeDesignName = "butterfly-panel-red" | "floral-bird-panel-blue" | "floral-bird-panel-left" | "floral-bird-panel-right" | "plate-11-acanthus-scroll" | "plate-16-stepped-corner" | "plate-36-greek-key" | "plate-37-diamond-scroll" | "spiral-ribbon-column";
5
+ export type Category = "animals" | "botanical" | "floral" | "geometric" | "knotwork" | "ribbons" | "scrollwork";
6
+ export type OrnamentUse = 'frame' | 'divider' | 'image';
7
+ export type Format = 'auto' | 'svg' | 'webp' | 'png';
8
+ export type Orientation = 'original' | 'horizontal' | 'vertical';
9
+ export interface RasterVariant {
10
+ readonly png: string; readonly webp: string;
11
+ readonly width: number; readonly height: number;
12
+ readonly max_dimension?: number; readonly rendered_max_dimension?: number;
13
+ readonly png_bytes: number; readonly webp_bytes: number;
14
+ }
15
+ export interface Asset extends RasterVariant {
16
+ readonly svg?: string; readonly viewbox?: readonly number[];
17
+ readonly variants: readonly RasterVariant[];
18
+ readonly repeat_axis?: 'x' | 'y' | 'none';
19
+ readonly repeat_ratio?: number; readonly slice_pixels?: number;
20
+ }
21
+ export interface Ornament extends Asset {
22
+ readonly name: DesignName; readonly description: string;
23
+ readonly categories: readonly Category[]; readonly subjects: readonly string[];
24
+ readonly colors: readonly string[]; readonly facing: string; readonly composition: string;
25
+ readonly kind: 'standalone' | 'repeat-tile'; readonly derivation: string;
26
+ readonly uses: readonly OrnamentUse[]; readonly formats: readonly Exclude<Format, 'auto'>[];
27
+ readonly components: Readonly<Partial<Record<'border_image' | 'corner' | 'rotated_tile' | 'reference_crop', Asset>>>;
28
+ readonly border_image_slice_percent?: number; readonly reference?: string;
29
+ }
30
+ export interface RepeatOrnament extends Ornament {
31
+ readonly name: RepeatDesignName; readonly kind: 'repeat-tile';
32
+ readonly uses: readonly ('frame' | 'divider')[]; readonly repeat_axis: 'x' | 'y';
33
+ readonly repeat_ratio: number; readonly border_image_slice_percent: number;
34
+ }
35
+ export interface WholeOrnament extends Ornament {
36
+ readonly name: WholeDesignName; readonly kind: 'standalone';
37
+ readonly uses: readonly 'image'[]; readonly repeat_axis: 'none';
38
+ }
39
+ export interface CommonOptions {
40
+ size?: number; format?: Format; pixelRatio?: number; assetsBase?: string;
41
+ }
42
+ export interface FrameOptions extends CommonOptions { design: RepeatDesignName; }
43
+ export interface DividerOptions extends CommonOptions { design: RepeatDesignName; orientation?: Orientation; length?: number | string; }
44
+ export interface ImageOptions extends CommonOptions { design: WholeDesignName; alt?: string; }
45
+ export interface SelectionFilters {
46
+ use?: OrnamentUse; categories?: readonly Category[]; subjects?: readonly string[];
47
+ colors?: readonly string[]; query?: string;
48
+ }
49
+ export interface ResolvedOrnament {
50
+ design: DesignName; use: OrnamentUse; axis?: 'x' | 'y'; size: number;
51
+ className: string; style: Record<string, string>; attributes: Record<string, string>;
52
+ asset: { path: string; url: string; format: Exclude<Format, 'auto'>; width: number; height: number; resolutionLimited: boolean; };
53
+ }
54
+ export interface OrnamentController<Options> {
55
+ readonly element: HTMLElement;
56
+ readonly configuration: ResolvedOrnament;
57
+ update(options: Partial<Options>): OrnamentController<Options>;
58
+ destroy(): void;
59
+ }
60
+ export declare const version: string;
61
+ export declare const defaultAssetsBase: string;
62
+ export declare const ornaments: readonly Ornament[];
63
+ export declare function getOrnament(name: RepeatDesignName): RepeatOrnament;
64
+ export declare function getOrnament(name: WholeDesignName): WholeOrnament;
65
+ export declare function getOrnament(name: string): Ornament;
66
+ export declare function findOrnaments(filters: SelectionFilters & { use: 'frame' | 'divider' }): RepeatOrnament[];
67
+ export declare function findOrnaments(filters: SelectionFilters & { use: 'image' }): WholeOrnament[];
68
+ export declare function findOrnaments(filters?: SelectionFilters): Ornament[];
69
+ export declare function resolveOrnament(use: 'frame', options: FrameOptions): ResolvedOrnament;
70
+ export declare function resolveOrnament(use: 'divider', options: DividerOptions): ResolvedOrnament;
71
+ export declare function resolveOrnament(use: 'image', options: ImageOptions): ResolvedOrnament;
72
+ export declare function createFrame(element: HTMLElement, options: FrameOptions): OrnamentController<FrameOptions>;
73
+ export declare function createDivider(element: HTMLElement, options: DividerOptions): OrnamentController<DividerOptions>;
74
+ export declare function createOrnamentImage(element: HTMLImageElement, options: ImageOptions): OrnamentController<ImageOptions>;
package/lib/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { ornaments, version, defaultAssetsBase } from './catalog.js';
2
+ export { getOrnament, findOrnaments, resolveOrnament } from './resolve.js';
3
+ export { createFrame, createDivider, createOrnamentImage } from './vanilla.js';
package/lib/react.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { CSSProperties, ForwardRefExoticComponent, RefAttributes, HTMLAttributes, ImgHTMLAttributes } from 'react';
2
+ import type { FrameOptions, DividerOptions, ImageOptions } from './index.js';
3
+ export type OrnamentStyle = CSSProperties & { [key: `--${string}`]: string | number | undefined };
4
+ export type OrnamentFrameProps = FrameOptions & Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'dangerouslySetInnerHTML'> & { style?: OrnamentStyle };
5
+ export type OrnamentDividerProps = DividerOptions & Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'style' | 'dangerouslySetInnerHTML'> & { style?: OrnamentStyle; children?: never };
6
+ export type OrnamentImageProps = ImageOptions & Omit<ImgHTMLAttributes<HTMLImageElement>, 'src' | 'srcSet' | 'sizes' | 'height' | 'width' | 'alt' | 'children' | 'style' | 'dangerouslySetInnerHTML'> & { style?: OrnamentStyle; children?: never };
7
+ export declare const OrnamentFrame: ForwardRefExoticComponent<OrnamentFrameProps & RefAttributes<HTMLDivElement>>;
8
+ export declare const OrnamentDivider: ForwardRefExoticComponent<OrnamentDividerProps & RefAttributes<HTMLDivElement>>;
9
+ export declare const OrnamentImage: ForwardRefExoticComponent<OrnamentImageProps & RefAttributes<HTMLImageElement>>;
package/lib/react.js ADDED
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { createElement, forwardRef } from 'react';
3
+ import { resolveOrnament } from './resolve.js';
4
+
5
+ const sharedKeys = ['design', 'size', 'format', 'pixelRatio', 'assetsBase'];
6
+ function render(use, tag, props, ref) {
7
+ const options = {}, html = { ...props };
8
+ const keys = [...sharedKeys, ...(use === 'divider' ? ['orientation', 'length'] : use === 'image' ? ['alt'] : [])];
9
+ for (const key of keys) {
10
+ if (Object.hasOwn(html, key)) options[key] = html[key];
11
+ delete html[key];
12
+ }
13
+ // Catch misplaced library props rather than leaking them onto the DOM.
14
+ for (const key of ['orientation', 'length', 'alt']) {
15
+ if (key in html) throw new TypeError(`${key} is not supported by Ornament${use[0].toUpperCase() + use.slice(1)}.`);
16
+ }
17
+ if (use !== 'frame' && html.children != null) throw new TypeError('Only OrnamentFrame accepts children.');
18
+ if (html.dangerouslySetInnerHTML != null) throw new TypeError('Use ordinary children inside OrnamentFrame.');
19
+ if (use === 'image' && ['src', 'srcSet', 'sizes', 'width', 'height'].some(key => key in html)) throw new TypeError('OrnamentImage selects its source and proportions; use design and size.');
20
+ const configuration = resolveOrnament(use, options);
21
+ const className = [configuration.className, html.className].filter(Boolean).join(' ');
22
+ const style = { ...html.style, ...configuration.style };
23
+ const attributes = { ...configuration.attributes };
24
+ if (use === 'divider' && html['aria-hidden'] !== undefined) attributes['aria-hidden'] = html['aria-hidden'];
25
+ return createElement(tag, { ...html, ...attributes, className, style, ref });
26
+ }
27
+
28
+ export const OrnamentFrame = forwardRef((props, ref) => render('frame', 'div', props, ref));
29
+ export const OrnamentDivider = forwardRef((props, ref) => render('divider', 'div', props, ref));
30
+ export const OrnamentImage = forwardRef((props, ref) => render('image', 'img', props, ref));
31
+ OrnamentFrame.displayName = 'OrnamentFrame';
32
+ OrnamentDivider.displayName = 'OrnamentDivider';
33
+ OrnamentImage.displayName = 'OrnamentImage';
package/lib/resolve.js ADDED
@@ -0,0 +1,118 @@
1
+ import { ornaments, defaultAssetsBase } from './catalog.js';
2
+
3
+ const byName = new Map(ornaments.map(item => [item.name, item]));
4
+ const defaults = { frame: 32, divider: 24, image: 256 };
5
+ const optionKeys = {
6
+ frame: new Set(['design', 'size', 'format', 'pixelRatio', 'assetsBase']),
7
+ divider: new Set(['design', 'size', 'format', 'pixelRatio', 'assetsBase', 'orientation', 'length']),
8
+ image: new Set(['design', 'size', 'format', 'pixelRatio', 'assetsBase', 'alt'])
9
+ };
10
+
11
+ export function getOrnament(name) {
12
+ const item = byName.get(name);
13
+ if (!item) throw new RangeError(`Unknown ornament design: ${String(name)}. Use findOrnaments() to select a design.`);
14
+ return item;
15
+ }
16
+
17
+ export function findOrnaments({ use, categories = [], subjects = [], colors = [], query = '' } = {}) {
18
+ if (use !== undefined && !Object.hasOwn(defaults, use)) throw new RangeError('use must be frame, divider, or image.');
19
+ for (const values of [categories, subjects, colors]) {
20
+ if (!Array.isArray(values) || values.some(value => typeof value !== 'string')) throw new TypeError('Selection filters must be arrays of strings.');
21
+ }
22
+ if (typeof query !== 'string') throw new TypeError('query must be a string.');
23
+ const tokens = query.toLowerCase().trim().split(/\s+/).filter(Boolean);
24
+ return ornaments.filter(item => (!use || item.uses.includes(use))
25
+ && categories.every(value => item.categories.includes(value))
26
+ && subjects.every(value => item.subjects.includes(value))
27
+ && colors.every(value => item.colors.includes(value))
28
+ && tokens.every(token => [item.name, item.description, ...item.categories, ...item.subjects, ...item.colors].join(' ').toLowerCase().includes(token)));
29
+ }
30
+
31
+ function positive(value, name) {
32
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) throw new RangeError(`${name} must be a finite positive number.`);
33
+ return value;
34
+ }
35
+
36
+ function lengthValue(value) {
37
+ if (typeof value === 'number') return `${positive(value, 'length')}px`;
38
+ // A deliberately shared browser/server grammar, without browser globals.
39
+ // For container-relative layouts use %, vw/vh, or a supported CSS length.
40
+ if (typeof value !== 'string' || !/^(?:\d+(?:\.\d+)?|\.\d+)(?:px|%|em|rem|vw|vh|vmin|vmax|svw|svh|lvw|lvh|dvw|dvh|ch|ex|cm|mm|in|pt|pc)$/.test(value) || parseFloat(value) <= 0) {
41
+ throw new RangeError('length must be a positive pixel number or CSS length such as "100%", "240px", or "20rem".');
42
+ }
43
+ return value;
44
+ }
45
+
46
+ function imageUrl(path, base) {
47
+ if (typeof base !== 'string' || !base || /[\s?#\\]/.test(base)) throw new TypeError('assetsBase must be an absolute http(s) URL or a root-relative public path without a query or fragment.');
48
+ if (/^https?:\/\//.test(base)) {
49
+ const parsed = new URL(base);
50
+ if (parsed.username || parsed.password) throw new TypeError('assetsBase must not contain credentials.');
51
+ } else if (!base.startsWith('/') || base.startsWith('//')) {
52
+ throw new TypeError('assetsBase must be an absolute http(s) URL or a root-relative public path, such as "/ornaments/".');
53
+ }
54
+ return base.replace(/\/+$/, '') + '/' + path;
55
+ }
56
+
57
+ // Pure and deterministic: used by React, vanilla, SSR and advanced integrations.
58
+ // Does not access the DOM, perform requests, or mutate the catalog/options.
59
+ export function resolveOrnament(use, options) {
60
+ if (!Object.hasOwn(defaults, use)) throw new RangeError('use must be frame, divider, or image.');
61
+ if (!options || typeof options !== 'object' || Array.isArray(options)) throw new TypeError('An options object with a design is required.');
62
+ for (const key of Object.keys(options)) {
63
+ if (!optionKeys[use].has(key)) throw new TypeError(`Unsupported ${use} option: ${key}.`);
64
+ }
65
+ const item = getOrnament(options.design);
66
+ if (!item.uses.includes(use)) throw new RangeError(`${item.name} cannot be used as ${use}; supported uses: ${item.uses.join(', ')}.`);
67
+ const size = positive(options.size === undefined ? defaults[use] : options.size, 'size');
68
+ const density = positive(options.pixelRatio === undefined ? 2 : options.pixelRatio, 'pixelRatio');
69
+ let axis, source = item;
70
+ if (use === 'frame') source = item.components.border_image;
71
+ if (use === 'divider') {
72
+ const orientation = options.orientation === undefined ? 'original' : options.orientation;
73
+ if (!['original', 'horizontal', 'vertical'].includes(orientation)) throw new RangeError('orientation must be original, horizontal, or vertical.');
74
+ axis = orientation === 'original' ? item.repeat_axis : orientation === 'horizontal' ? 'x' : 'y';
75
+ if (axis !== item.repeat_axis) source = item.components.rotated_tile;
76
+ }
77
+ let format = options.format === undefined ? 'auto' : options.format;
78
+ if (format === 'auto') format = item.derivation === 'vector-reconstruction' && source.svg ? 'svg' : 'webp';
79
+ if (!['svg', 'png', 'webp'].includes(format) || !source[format]) throw new RangeError(`${item.name} does not support format ${String(format)} for ${use}. Available: ${item.formats.join(', ')}.`);
80
+ let selected = source, required;
81
+ if (use === 'frame') required = size * 100 / item.border_image_slice_percent * density;
82
+ else if (use === 'divider') required = size * Math.max(1, item.repeat_ratio) * density;
83
+ else required = size * Math.max(1, source.width / source.height) * density;
84
+ if (!Number.isFinite(required)) throw new RangeError('size and pixelRatio produce an invalid resolution.');
85
+ if (format !== 'svg') {
86
+ const candidates = [...source.variants, source].sort((a, b) => Math.max(a.width, a.height) - Math.max(b.width, b.height));
87
+ selected = candidates.find(asset => Math.max(asset.width, asset.height) + 1e-8 >= required) ?? source;
88
+ }
89
+ const path = selected[format];
90
+ const url = imageUrl(path, options.assetsBase === undefined ? defaultAssetsBase : options.assetsBase);
91
+ const style = { '--ornament-size': `${size}px` };
92
+ const attributes = {};
93
+ if (use === 'image') {
94
+ if (options.alt !== undefined && typeof options.alt !== 'string') throw new TypeError('alt must be a string.');
95
+ attributes.src = url;
96
+ attributes.alt = options.alt ?? '';
97
+ } else {
98
+ style['--ornament-image'] = `url(${JSON.stringify(url)})`;
99
+ if (use === 'frame') style['--ornament-slice'] = `${item.border_image_slice_percent}%`;
100
+ else {
101
+ style['--ornament-ratio'] = String(item.repeat_ratio);
102
+ style['--ornament-length'] = lengthValue(options.length === undefined ? (axis === 'x' ? '100%' : 256) : options.length);
103
+ attributes['data-axis'] = axis;
104
+ attributes['aria-hidden'] = 'true';
105
+ }
106
+ }
107
+ return {
108
+ design: item.name, use, axis, size,
109
+ className: use === 'image' ? 'ornament-image' : `ornament-${use}`,
110
+ style, attributes,
111
+ asset: {
112
+ path, url, format,
113
+ width: format === 'svg' ? source.viewbox[2] : selected.width,
114
+ height: format === 'svg' ? source.viewbox[3] : selected.height,
115
+ resolutionLimited: format !== 'svg' && Math.max(selected.width, selected.height) + 1e-8 < required
116
+ }
117
+ };
118
+ }
@@ -0,0 +1 @@
1
+ export {};
package/lib/vanilla.js ADDED
@@ -0,0 +1,57 @@
1
+ import { resolveOrnament } from './resolve.js';
2
+
3
+ const attached = new WeakMap();
4
+
5
+ function attach(element, use, initial) {
6
+ if (!element || element.nodeType !== 1 || element.namespaceURI !== 'http://www.w3.org/1999/xhtml' || !element.style || !element.classList) throw new TypeError('An HTML element is required.');
7
+ if (use === 'image' && element.tagName !== 'IMG') throw new TypeError('createOrnamentImage requires an img element.');
8
+ if (use !== 'image' && ['AREA', 'BASE', 'BR', 'COL', 'EMBED', 'HR', 'IMG', 'INPUT', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR', 'CANVAS', 'IFRAME', 'VIDEO', 'AUDIO'].includes(element.tagName)) throw new TypeError(`${use} requires a container element such as div or article.`);
9
+ if (attached.has(element)) throw new Error('This element already has an ornament controller. Destroy it before attaching another.');
10
+ let options = { ...initial }, current = resolveOrnament(use, initial), destroyed = false;
11
+ const previousClass = element.classList.contains(current.className);
12
+ const styles = new Map(Object.keys(current.style).map(key => [key, { value: element.style.getPropertyValue(key), priority: element.style.getPropertyPriority(key) }]));
13
+ const attributes = new Map(Object.keys(current.attributes).map(key => [key, element.getAttribute(key)]));
14
+ function paint(result) {
15
+ element.classList.add(result.className);
16
+ for (const [key, value] of Object.entries(result.style)) element.style.setProperty(key, value);
17
+ for (const [key, value] of Object.entries(result.attributes)) element.setAttribute(key, value);
18
+ }
19
+ const controller = {
20
+ element,
21
+ get configuration() { return resolveOrnament(use, options); },
22
+ update(patch) {
23
+ if (destroyed) throw new Error('Cannot update a destroyed ornament controller.');
24
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch)) throw new TypeError('update requires a partial options object.');
25
+ const nextOptions = { ...options, ...patch };
26
+ const next = resolveOrnament(use, nextOptions); // Validate completely before touching the DOM.
27
+ paint(next);
28
+ options = nextOptions;
29
+ current = next;
30
+ return controller;
31
+ },
32
+ destroy() {
33
+ if (destroyed) return;
34
+ destroyed = true;
35
+ attached.delete(element);
36
+ // Restore only values still owned by this controller; retain external edits.
37
+ if (!previousClass) element.classList.remove(current.className);
38
+ for (const [key, before] of styles) {
39
+ if (element.style.getPropertyValue(key) !== current.style[key]) continue;
40
+ if (before.value) element.style.setProperty(key, before.value, before.priority);
41
+ else element.style.removeProperty(key);
42
+ }
43
+ for (const [key, before] of attributes) {
44
+ if (element.getAttribute(key) !== current.attributes[key]) continue;
45
+ if (before === null) element.removeAttribute(key);
46
+ else element.setAttribute(key, before);
47
+ }
48
+ }
49
+ };
50
+ attached.set(element, controller);
51
+ paint(current);
52
+ return controller;
53
+ }
54
+
55
+ export const createFrame = (element, options) => attach(element, 'frame', options);
56
+ export const createDivider = (element, options) => attach(element, 'divider', options);
57
+ export const createOrnamentImage = (element, options) => attach(element, 'image', options);
package/ornaments.css ADDED
@@ -0,0 +1,63 @@
1
+ /* Shared usage contract. Use absolute image URLs, or paths relative to this stylesheet. */
2
+ .ornament-frame {
3
+ box-sizing: border-box;
4
+ border: var(--ornament-size, 32px) solid transparent;
5
+ border-image-source: var(--ornament-image, none);
6
+ border-image-slice: var(--ornament-slice, 21.42857142857143%);
7
+ /* Partial periods cannot match a designed corner. Always fit whole units. */
8
+ border-image-repeat: round;
9
+ }
10
+
11
+ .ornament-divider {
12
+ --ornament-period: calc(var(--ornament-size, 24px) * var(--ornament-ratio, 2.6666666666666665));
13
+ display: block;
14
+ position: relative;
15
+ width: var(--ornament-length, 100%);
16
+ height: var(--ornament-size, 24px);
17
+ }
18
+
19
+ .ornament-divider::before {
20
+ content: "";
21
+ position: absolute;
22
+ left: 50%;
23
+ top: 0;
24
+ transform: translateX(-50%);
25
+ width: 100%;
26
+ height: 100%;
27
+ background-image: var(--ornament-image, none);
28
+ /* Older browsers fit complete tiles by adjusting their length. */
29
+ background-repeat: round no-repeat;
30
+ background-size: var(--ornament-period) var(--ornament-size, 24px);
31
+ }
32
+
33
+ .ornament-divider[data-axis="y"] {
34
+ width: var(--ornament-size, 24px);
35
+ height: var(--ornament-length, 256px);
36
+ }
37
+
38
+ .ornament-divider[data-axis="y"]::before {
39
+ left: 0;
40
+ top: 50%;
41
+ transform: translateY(-50%);
42
+ background-repeat: no-repeat round;
43
+ background-size: var(--ornament-size, 24px) var(--ornament-period);
44
+ }
45
+
46
+ @supports (width: round(down, 100%, 64px)) {
47
+ .ornament-divider::before {
48
+ /* Keep contiguous complete units; spare space stays outside the artwork. */
49
+ width: round(down, 100%, var(--ornament-period));
50
+ }
51
+ .ornament-divider[data-axis="y"]::before {
52
+ width: 100%;
53
+ height: round(down, 100%, var(--ornament-period));
54
+ }
55
+ }
56
+
57
+ .ornament-image {
58
+ display: block;
59
+ height: var(--ornament-size, 256px);
60
+ width: auto;
61
+ max-width: 100%;
62
+ object-fit: contain;
63
+ }
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@ranx729/medieval-ornaments",
3
+ "version": "0.1.0",
4
+ "description": "Categorized medieval ornaments with normalized frames, repeating dividers and whole decorations for JavaScript and React",
5
+ "type": "module",
6
+ "license": "SEE LICENSE IN LICENSE",
7
+ "repository": { "type": "git", "url": "git+https://github.com/adrian729/medieval-ornaments.git" },
8
+ "homepage": "https://adrian729.github.io/medieval-ornaments/",
9
+ "bugs": { "url": "https://github.com/adrian729/medieval-ornaments/issues" },
10
+ "keywords": ["medieval", "ornament", "border", "divider", "react", "vanilla", "decoration"],
11
+ "exports": {
12
+ ".": { "types": "./lib/index.d.ts", "import": "./lib/index.js" },
13
+ "./react": { "types": "./lib/react.d.ts", "import": "./lib/react.js" },
14
+ "./styles.css": { "types": "./lib/styles.d.ts", "default": "./ornaments.css" },
15
+ "./catalog.json": "./lib/catalog.json",
16
+ "./svg/*": "./svg/*",
17
+ "./png/*": "./png/*",
18
+ "./webp/*": "./webp/*",
19
+ "./package.json": "./package.json"
20
+ },
21
+ "bin": { "medieval-ornaments": "./lib/cli.js" },
22
+ "files": ["lib", "ornaments.css", "svg", "png", "webp", "docs/INTEGRATION.md", "ASSET-RIGHTS.md", "SELECTION.md", "USAGE.md"],
23
+ "sideEffects": ["**/*.css"],
24
+ "peerDependencies": { "react": ">=18 <20" },
25
+ "peerDependenciesMeta": { "react": { "optional": true } },
26
+ "engines": { "node": ">=18" },
27
+ "scripts": {
28
+ "build": "node scripts/build-library.mjs",
29
+ "build:browser": "node scripts/build-browser.mjs",
30
+ "prepack": "node scripts/build-library.mjs",
31
+ "test": "node --test tests/*.test.mjs",
32
+ "test:types": "tsc --noEmit --strict --noUncheckedSideEffectImports --module nodenext --target es2022 --jsx react-jsx tests/types.tsx",
33
+ "test:integration": "node tests/integration.mjs"
34
+ },
35
+ "publishConfig": { "access": "public" },
36
+ "devDependencies": {
37
+ "@types/react": "19.3.0",
38
+ "@types/react-dom": "19.3.0",
39
+ "react": "19.3.0",
40
+ "react-dom": "19.3.0",
41
+ "typescript": "7.0.2",
42
+ "vite": "8.3.2"
43
+ }
44
+ }
Binary file
Binary file
Binary file
Binary file