@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.
- package/ASSET-RIGHTS.md +21 -0
- package/LICENSE +31 -0
- package/README.md +183 -0
- package/SELECTION.md +22 -0
- package/USAGE.md +100 -0
- package/docs/INTEGRATION.md +262 -0
- package/lib/catalog.js +5 -0
- package/lib/catalog.json +7357 -0
- package/lib/cli.js +73 -0
- package/lib/index.d.ts +74 -0
- package/lib/index.js +3 -0
- package/lib/react.d.ts +9 -0
- package/lib/react.js +33 -0
- package/lib/resolve.js +118 -0
- package/lib/styles.d.ts +1 -0
- package/lib/vanilla.js +57 -0
- package/ornaments.css +63 -0
- package/package.json +44 -0
- package/png/128/butterfly-panel-red.png +0 -0
- package/png/128/floral-bird-panel-blue.png +0 -0
- package/png/128/floral-bird-panel-left.png +0 -0
- package/png/128/floral-bird-panel-right.png +0 -0
- package/png/128/gold-leaf-scroll-border.png +0 -0
- package/png/128/gold-leaf-scroll-corner.png +0 -0
- package/png/128/gold-leaf-scroll-rotated.png +0 -0
- package/png/128/gold-leaf-scroll.png +0 -0
- package/png/128/gold-quatrefoil-vine-border.png +0 -0
- package/png/128/gold-quatrefoil-vine-corner.png +0 -0
- package/png/128/gold-quatrefoil-vine-rotated.png +0 -0
- package/png/128/gold-quatrefoil-vine.png +0 -0
- package/png/128/interlocking-ribbon-border.png +0 -0
- package/png/128/interlocking-ribbon-corner.png +0 -0
- package/png/128/interlocking-ribbon-rotated.png +0 -0
- package/png/128/interlocking-ribbon.png +0 -0
- package/png/128/plate-01-linked-scrolls-reference.png +0 -0
- package/png/128/plate-02-stepped-ribbon-border.png +0 -0
- package/png/128/plate-02-stepped-ribbon-reference.png +0 -0
- package/png/128/plate-03-spiral-bands-border.png +0 -0
- package/png/128/plate-03-spiral-bands-reference.png +0 -0
- package/png/128/plate-04-heart-and-diamond-reference.png +0 -0
- package/png/128/plate-05-blue-curls-border.png +0 -0
- package/png/128/plate-05-blue-curls-reference.png +0 -0
- package/png/128/plate-06-paired-red-scrolls-reference.png +0 -0
- package/png/128/plate-06-paired-red-scrolls-rotated.png +0 -0
- package/png/128/plate-06-paired-red-scrolls.png +0 -0
- package/png/128/plate-07-blue-heart-leaves-reference.png +0 -0
- package/png/128/plate-08-diagonal-cross-border.png +0 -0
- package/png/128/plate-09-interlaced-knot-border.png +0 -0
- package/png/128/plate-10-blue-palmettes-reference.png +0 -0
- package/png/128/plate-10-blue-palmettes-rotated.png +0 -0
- package/png/128/plate-10-blue-palmettes.png +0 -0
- package/png/128/plate-11-acanthus-scroll-reference.png +0 -0
- package/png/128/plate-11-acanthus-scroll.png +0 -0
- package/png/128/plate-13-leaf-and-flower-vine-border.png +0 -0
- package/png/128/plate-13-leaf-and-flower-vine-reference.png +0 -0
- package/png/128/plate-13-leaf-and-flower-vine-rotated.png +0 -0
- package/png/128/plate-13-leaf-and-flower-vine.png +0 -0
- package/png/128/plate-14-crossed-diamonds-border.png +0 -0
- package/png/128/plate-14-crossed-diamonds-reference.png +0 -0
- package/png/128/plate-15-diamond-square-border.png +0 -0
- package/png/128/plate-17-stepped-arches-border.png +0 -0
- package/png/128/plate-17-stepped-arches-reference.png +0 -0
- package/png/128/plate-18-fan-palmettes-reference.png +0 -0
- package/png/128/plate-19-cream-scrolls-border.png +0 -0
- package/png/128/plate-23-crossed-ribbon-knots-border.png +0 -0
- package/png/128/plate-26-eight-petal-rosette-border.png +0 -0
- package/png/128/plate-27-blue-flower-medallions-border.png +0 -0
- package/png/128/plate-28-angular-blue-meander-border.png +0 -0
- package/png/128/plate-29-red-acanthus-reference.png +0 -0
- package/png/128/plate-29-red-acanthus-rotated.png +0 -0
- package/png/128/plate-29-red-acanthus.png +0 -0
- package/png/128/plate-30-layered-palmettes-border.png +0 -0
- package/png/128/plate-30-layered-palmettes-reference.png +0 -0
- package/png/128/plate-30-layered-palmettes-rotated.png +0 -0
- package/png/128/plate-30-layered-palmettes.png +0 -0
- package/png/128/plate-31-alternating-florets-reference.png +0 -0
- package/png/128/plate-31-alternating-florets-rotated.png +0 -0
- package/png/128/plate-31-alternating-florets.png +0 -0
- package/png/128/plate-32-linked-ovals-border.png +0 -0
- package/png/128/plate-32-linked-ovals-reference.png +0 -0
- package/png/128/plate-33-leaf-scrolls-reference.png +0 -0
- package/png/128/plate-34-nested-fans-reference.png +0 -0
- package/png/128/plate-35-crossed-white-stems-reference.png +0 -0
- package/png/128/plate-38-diagonal-meander-reference.png +0 -0
- package/png/128/red-berry-vine-border.png +0 -0
- package/png/128/red-berry-vine-corner.png +0 -0
- package/png/128/red-berry-vine-rotated.png +0 -0
- package/png/128/red-berry-vine.png +0 -0
- package/png/128/red-rosette-vine-border.png +0 -0
- package/png/128/red-rosette-vine-corner.png +0 -0
- package/png/128/red-rosette-vine-rotated.png +0 -0
- package/png/128/red-rosette-vine.png +0 -0
- package/png/128/red-trefoil-vine-border.png +0 -0
- package/png/128/red-trefoil-vine-corner.png +0 -0
- package/png/128/red-trefoil-vine-rotated.png +0 -0
- package/png/128/red-trefoil-vine.png +0 -0
- package/png/128/spiral-ribbon-column.png +0 -0
- package/png/256/butterfly-panel-red.png +0 -0
- package/png/256/floral-bird-panel-blue.png +0 -0
- package/png/256/floral-bird-panel-left.png +0 -0
- package/png/256/floral-bird-panel-right.png +0 -0
- package/png/256/gold-leaf-scroll-border.png +0 -0
- package/png/256/gold-leaf-scroll-corner.png +0 -0
- package/png/256/gold-leaf-scroll-rotated.png +0 -0
- package/png/256/gold-leaf-scroll.png +0 -0
- package/png/256/gold-quatrefoil-vine-border.png +0 -0
- package/png/256/gold-quatrefoil-vine-corner.png +0 -0
- package/png/256/gold-quatrefoil-vine-rotated.png +0 -0
- package/png/256/gold-quatrefoil-vine.png +0 -0
- package/png/256/interlocking-ribbon-border.png +0 -0
- package/png/256/interlocking-ribbon-corner.png +0 -0
- package/png/256/interlocking-ribbon-rotated.png +0 -0
- package/png/256/interlocking-ribbon.png +0 -0
- package/png/256/plate-01-linked-scrolls-reference.png +0 -0
- package/png/256/plate-02-stepped-ribbon-reference.png +0 -0
- package/png/256/plate-03-spiral-bands-reference.png +0 -0
- package/png/256/plate-11-acanthus-scroll-reference.png +0 -0
- package/png/256/plate-11-acanthus-scroll.png +0 -0
- package/png/256/plate-13-leaf-and-flower-vine-border.png +0 -0
- package/png/256/plate-13-leaf-and-flower-vine-reference.png +0 -0
- package/png/256/plate-18-fan-palmettes-reference.png +0 -0
- package/png/256/plate-29-red-acanthus-reference.png +0 -0
- package/png/256/plate-30-layered-palmettes-reference.png +0 -0
- package/png/256/plate-31-alternating-florets-reference.png +0 -0
- package/png/256/red-berry-vine-border.png +0 -0
- package/png/256/red-berry-vine-corner.png +0 -0
- package/png/256/red-berry-vine-rotated.png +0 -0
- package/png/256/red-berry-vine.png +0 -0
- package/png/256/red-rosette-vine-border.png +0 -0
- package/png/256/red-rosette-vine-corner.png +0 -0
- package/png/256/red-rosette-vine-rotated.png +0 -0
- package/png/256/red-rosette-vine.png +0 -0
- package/png/256/red-trefoil-vine-border.png +0 -0
- package/png/256/red-trefoil-vine-corner.png +0 -0
- package/png/256/red-trefoil-vine-rotated.png +0 -0
- package/png/256/red-trefoil-vine.png +0 -0
- package/png/256/spiral-ribbon-column.png +0 -0
- package/png/512/butterfly-panel-red.png +0 -0
- package/png/512/floral-bird-panel-blue.png +0 -0
- package/png/512/floral-bird-panel-left.png +0 -0
- package/png/512/floral-bird-panel-right.png +0 -0
- package/png/512/gold-leaf-scroll-border.png +0 -0
- package/png/512/gold-leaf-scroll-corner.png +0 -0
- package/png/512/gold-leaf-scroll-rotated.png +0 -0
- package/png/512/gold-leaf-scroll.png +0 -0
- package/png/512/gold-quatrefoil-vine-border.png +0 -0
- package/png/512/gold-quatrefoil-vine-corner.png +0 -0
- package/png/512/gold-quatrefoil-vine-rotated.png +0 -0
- package/png/512/gold-quatrefoil-vine.png +0 -0
- package/png/512/interlocking-ribbon-border.png +0 -0
- package/png/512/interlocking-ribbon-corner.png +0 -0
- package/png/512/interlocking-ribbon-rotated.png +0 -0
- package/png/512/interlocking-ribbon.png +0 -0
- package/png/512/red-berry-vine-border.png +0 -0
- package/png/512/red-berry-vine-corner.png +0 -0
- package/png/512/red-berry-vine-rotated.png +0 -0
- package/png/512/red-berry-vine.png +0 -0
- package/png/512/red-rosette-vine-border.png +0 -0
- package/png/512/red-rosette-vine-corner.png +0 -0
- package/png/512/red-rosette-vine-rotated.png +0 -0
- package/png/512/red-rosette-vine.png +0 -0
- package/png/512/red-trefoil-vine-border.png +0 -0
- package/png/512/red-trefoil-vine-corner.png +0 -0
- package/png/512/red-trefoil-vine-rotated.png +0 -0
- package/png/512/red-trefoil-vine.png +0 -0
- package/png/512/spiral-ribbon-column.png +0 -0
- package/png/768/gold-leaf-scroll-border.png +0 -0
- package/png/768/gold-leaf-scroll-corner.png +0 -0
- package/png/768/gold-leaf-scroll-rotated.png +0 -0
- package/png/768/gold-leaf-scroll.png +0 -0
- package/png/768/gold-quatrefoil-vine-border.png +0 -0
- package/png/768/gold-quatrefoil-vine-corner.png +0 -0
- package/png/768/gold-quatrefoil-vine-rotated.png +0 -0
- package/png/768/gold-quatrefoil-vine.png +0 -0
- package/png/768/interlocking-ribbon-border.png +0 -0
- package/png/768/interlocking-ribbon-corner.png +0 -0
- package/png/768/interlocking-ribbon-rotated.png +0 -0
- package/png/768/interlocking-ribbon.png +0 -0
- package/png/768/red-berry-vine-border.png +0 -0
- package/png/768/red-berry-vine-corner.png +0 -0
- package/png/768/red-berry-vine-rotated.png +0 -0
- package/png/768/red-berry-vine.png +0 -0
- package/png/768/red-rosette-vine-border.png +0 -0
- package/png/768/red-rosette-vine-corner.png +0 -0
- package/png/768/red-rosette-vine-rotated.png +0 -0
- package/png/768/red-rosette-vine.png +0 -0
- package/png/768/red-trefoil-vine-border.png +0 -0
- package/png/768/red-trefoil-vine-corner.png +0 -0
- package/png/768/red-trefoil-vine-rotated.png +0 -0
- package/png/768/red-trefoil-vine.png +0 -0
- package/png/butterfly-panel-red.png +0 -0
- package/png/floral-bird-panel-blue.png +0 -0
- package/png/floral-bird-panel-left.png +0 -0
- package/png/floral-bird-panel-right.png +0 -0
- package/png/gold-leaf-scroll-border.png +0 -0
- package/png/gold-leaf-scroll-corner.png +0 -0
- package/png/gold-leaf-scroll-rotated.png +0 -0
- package/png/gold-leaf-scroll.png +0 -0
- package/png/gold-quatrefoil-vine-border.png +0 -0
- package/png/gold-quatrefoil-vine-corner.png +0 -0
- package/png/gold-quatrefoil-vine-rotated.png +0 -0
- package/png/gold-quatrefoil-vine.png +0 -0
- package/png/interlocking-ribbon-border.png +0 -0
- package/png/interlocking-ribbon-corner.png +0 -0
- package/png/interlocking-ribbon-rotated.png +0 -0
- package/png/interlocking-ribbon.png +0 -0
- package/png/plate-01-linked-scrolls-border.png +0 -0
- package/png/plate-01-linked-scrolls-corner.png +0 -0
- package/png/plate-01-linked-scrolls-reference.png +0 -0
- package/png/plate-01-linked-scrolls-rotated.png +0 -0
- package/png/plate-01-linked-scrolls.png +0 -0
- package/png/plate-02-stepped-ribbon-border.png +0 -0
- package/png/plate-02-stepped-ribbon-corner.png +0 -0
- package/png/plate-02-stepped-ribbon-reference.png +0 -0
- package/png/plate-02-stepped-ribbon-rotated.png +0 -0
- package/png/plate-02-stepped-ribbon.png +0 -0
- package/png/plate-03-spiral-bands-border.png +0 -0
- package/png/plate-03-spiral-bands-corner.png +0 -0
- package/png/plate-03-spiral-bands-reference.png +0 -0
- package/png/plate-03-spiral-bands-rotated.png +0 -0
- package/png/plate-03-spiral-bands.png +0 -0
- package/png/plate-04-heart-and-diamond-border.png +0 -0
- package/png/plate-04-heart-and-diamond-corner.png +0 -0
- package/png/plate-04-heart-and-diamond-reference.png +0 -0
- package/png/plate-04-heart-and-diamond-rotated.png +0 -0
- package/png/plate-04-heart-and-diamond.png +0 -0
- package/png/plate-05-blue-curls-border.png +0 -0
- package/png/plate-05-blue-curls-corner.png +0 -0
- package/png/plate-05-blue-curls-reference.png +0 -0
- package/png/plate-05-blue-curls-rotated.png +0 -0
- package/png/plate-05-blue-curls.png +0 -0
- package/png/plate-06-paired-red-scrolls-border.png +0 -0
- package/png/plate-06-paired-red-scrolls-corner.png +0 -0
- package/png/plate-06-paired-red-scrolls-reference.png +0 -0
- package/png/plate-06-paired-red-scrolls-rotated.png +0 -0
- package/png/plate-06-paired-red-scrolls.png +0 -0
- package/png/plate-07-blue-heart-leaves-border.png +0 -0
- package/png/plate-07-blue-heart-leaves-corner.png +0 -0
- package/png/plate-07-blue-heart-leaves-reference.png +0 -0
- package/png/plate-07-blue-heart-leaves-rotated.png +0 -0
- package/png/plate-07-blue-heart-leaves.png +0 -0
- package/png/plate-08-diagonal-cross-border.png +0 -0
- package/png/plate-08-diagonal-cross-corner.png +0 -0
- package/png/plate-08-diagonal-cross-reference.png +0 -0
- package/png/plate-08-diagonal-cross-rotated.png +0 -0
- package/png/plate-08-diagonal-cross.png +0 -0
- package/png/plate-09-interlaced-knot-border.png +0 -0
- package/png/plate-09-interlaced-knot-corner.png +0 -0
- package/png/plate-09-interlaced-knot-reference.png +0 -0
- package/png/plate-09-interlaced-knot-rotated.png +0 -0
- package/png/plate-09-interlaced-knot.png +0 -0
- package/png/plate-10-blue-palmettes-border.png +0 -0
- package/png/plate-10-blue-palmettes-corner.png +0 -0
- package/png/plate-10-blue-palmettes-reference.png +0 -0
- package/png/plate-10-blue-palmettes-rotated.png +0 -0
- package/png/plate-10-blue-palmettes.png +0 -0
- package/png/plate-11-acanthus-scroll-reference.png +0 -0
- package/png/plate-11-acanthus-scroll.png +0 -0
- package/png/plate-12-arched-diamonds-border.png +0 -0
- package/png/plate-12-arched-diamonds-corner.png +0 -0
- package/png/plate-12-arched-diamonds-reference.png +0 -0
- package/png/plate-12-arched-diamonds-rotated.png +0 -0
- package/png/plate-12-arched-diamonds.png +0 -0
- package/png/plate-13-leaf-and-flower-vine-border.png +0 -0
- package/png/plate-13-leaf-and-flower-vine-corner.png +0 -0
- package/png/plate-13-leaf-and-flower-vine-reference.png +0 -0
- package/png/plate-13-leaf-and-flower-vine-rotated.png +0 -0
- package/png/plate-13-leaf-and-flower-vine.png +0 -0
- package/png/plate-14-crossed-diamonds-border.png +0 -0
- package/png/plate-14-crossed-diamonds-corner.png +0 -0
- package/png/plate-14-crossed-diamonds-reference.png +0 -0
- package/png/plate-14-crossed-diamonds-rotated.png +0 -0
- package/png/plate-14-crossed-diamonds.png +0 -0
- package/png/plate-15-diamond-square-border.png +0 -0
- package/png/plate-15-diamond-square-corner.png +0 -0
- package/png/plate-15-diamond-square-reference.png +0 -0
- package/png/plate-15-diamond-square-rotated.png +0 -0
- package/png/plate-15-diamond-square.png +0 -0
- package/png/plate-16-stepped-corner-reference.png +0 -0
- package/png/plate-16-stepped-corner.png +0 -0
- package/png/plate-17-stepped-arches-border.png +0 -0
- package/png/plate-17-stepped-arches-corner.png +0 -0
- package/png/plate-17-stepped-arches-reference.png +0 -0
- package/png/plate-17-stepped-arches-rotated.png +0 -0
- package/png/plate-17-stepped-arches.png +0 -0
- package/png/plate-18-fan-palmettes-border.png +0 -0
- package/png/plate-18-fan-palmettes-corner.png +0 -0
- package/png/plate-18-fan-palmettes-reference.png +0 -0
- package/png/plate-18-fan-palmettes-rotated.png +0 -0
- package/png/plate-18-fan-palmettes.png +0 -0
- package/png/plate-19-cream-scrolls-border.png +0 -0
- package/png/plate-19-cream-scrolls-corner.png +0 -0
- package/png/plate-19-cream-scrolls-reference.png +0 -0
- package/png/plate-19-cream-scrolls-rotated.png +0 -0
- package/png/plate-19-cream-scrolls.png +0 -0
- package/png/plate-20-segmented-medallions-border.png +0 -0
- package/png/plate-20-segmented-medallions-corner.png +0 -0
- package/png/plate-20-segmented-medallions-reference.png +0 -0
- package/png/plate-20-segmented-medallions-rotated.png +0 -0
- package/png/plate-20-segmented-medallions.png +0 -0
- package/png/plate-21-green-flower-medallions-border.png +0 -0
- package/png/plate-21-green-flower-medallions-corner.png +0 -0
- package/png/plate-21-green-flower-medallions-reference.png +0 -0
- package/png/plate-21-green-flower-medallions-rotated.png +0 -0
- package/png/plate-21-green-flower-medallions.png +0 -0
- package/png/plate-22-white-petal-grid-border.png +0 -0
- package/png/plate-22-white-petal-grid-corner.png +0 -0
- package/png/plate-22-white-petal-grid-reference.png +0 -0
- package/png/plate-22-white-petal-grid-rotated.png +0 -0
- package/png/plate-22-white-petal-grid.png +0 -0
- package/png/plate-23-crossed-ribbon-knots-border.png +0 -0
- package/png/plate-23-crossed-ribbon-knots-corner.png +0 -0
- package/png/plate-23-crossed-ribbon-knots-reference.png +0 -0
- package/png/plate-23-crossed-ribbon-knots-rotated.png +0 -0
- package/png/plate-23-crossed-ribbon-knots.png +0 -0
- package/png/plate-24-gold-ring-scrolls-border.png +0 -0
- package/png/plate-24-gold-ring-scrolls-corner.png +0 -0
- package/png/plate-24-gold-ring-scrolls-reference.png +0 -0
- package/png/plate-24-gold-ring-scrolls-rotated.png +0 -0
- package/png/plate-24-gold-ring-scrolls.png +0 -0
- package/png/plate-25-greek-crosses-border.png +0 -0
- package/png/plate-25-greek-crosses-corner.png +0 -0
- package/png/plate-25-greek-crosses-reference.png +0 -0
- package/png/plate-25-greek-crosses-rotated.png +0 -0
- package/png/plate-25-greek-crosses.png +0 -0
- package/png/plate-26-eight-petal-rosette-border.png +0 -0
- package/png/plate-26-eight-petal-rosette-corner.png +0 -0
- package/png/plate-26-eight-petal-rosette-reference.png +0 -0
- package/png/plate-26-eight-petal-rosette-rotated.png +0 -0
- package/png/plate-26-eight-petal-rosette.png +0 -0
- package/png/plate-27-blue-flower-medallions-border.png +0 -0
- package/png/plate-27-blue-flower-medallions-corner.png +0 -0
- package/png/plate-27-blue-flower-medallions-reference.png +0 -0
- package/png/plate-27-blue-flower-medallions-rotated.png +0 -0
- package/png/plate-27-blue-flower-medallions.png +0 -0
- package/png/plate-28-angular-blue-meander-border.png +0 -0
- package/png/plate-28-angular-blue-meander-corner.png +0 -0
- package/png/plate-28-angular-blue-meander-reference.png +0 -0
- package/png/plate-28-angular-blue-meander-rotated.png +0 -0
- package/png/plate-28-angular-blue-meander.png +0 -0
- package/png/plate-29-red-acanthus-border.png +0 -0
- package/png/plate-29-red-acanthus-corner.png +0 -0
- package/png/plate-29-red-acanthus-reference.png +0 -0
- package/png/plate-29-red-acanthus-rotated.png +0 -0
- package/png/plate-29-red-acanthus.png +0 -0
- package/png/plate-30-layered-palmettes-border.png +0 -0
- package/png/plate-30-layered-palmettes-corner.png +0 -0
- package/png/plate-30-layered-palmettes-reference.png +0 -0
- package/png/plate-30-layered-palmettes-rotated.png +0 -0
- package/png/plate-30-layered-palmettes.png +0 -0
- package/png/plate-31-alternating-florets-border.png +0 -0
- package/png/plate-31-alternating-florets-corner.png +0 -0
- package/png/plate-31-alternating-florets-reference.png +0 -0
- package/png/plate-31-alternating-florets-rotated.png +0 -0
- package/png/plate-31-alternating-florets.png +0 -0
- package/png/plate-32-linked-ovals-border.png +0 -0
- package/png/plate-32-linked-ovals-corner.png +0 -0
- package/png/plate-32-linked-ovals-reference.png +0 -0
- package/png/plate-32-linked-ovals-rotated.png +0 -0
- package/png/plate-32-linked-ovals.png +0 -0
- package/png/plate-33-leaf-scrolls-border.png +0 -0
- package/png/plate-33-leaf-scrolls-corner.png +0 -0
- package/png/plate-33-leaf-scrolls-reference.png +0 -0
- package/png/plate-33-leaf-scrolls-rotated.png +0 -0
- package/png/plate-33-leaf-scrolls.png +0 -0
- package/png/plate-34-nested-fans-border.png +0 -0
- package/png/plate-34-nested-fans-corner.png +0 -0
- package/png/plate-34-nested-fans-reference.png +0 -0
- package/png/plate-34-nested-fans-rotated.png +0 -0
- package/png/plate-34-nested-fans.png +0 -0
- package/png/plate-35-crossed-white-stems-border.png +0 -0
- package/png/plate-35-crossed-white-stems-corner.png +0 -0
- package/png/plate-35-crossed-white-stems-reference.png +0 -0
- package/png/plate-35-crossed-white-stems-rotated.png +0 -0
- package/png/plate-35-crossed-white-stems.png +0 -0
- package/png/plate-36-greek-key-reference.png +0 -0
- package/png/plate-36-greek-key.png +0 -0
- package/png/plate-37-diamond-scroll-reference.png +0 -0
- package/png/plate-37-diamond-scroll.png +0 -0
- package/png/plate-38-diagonal-meander-border.png +0 -0
- package/png/plate-38-diagonal-meander-corner.png +0 -0
- package/png/plate-38-diagonal-meander-reference.png +0 -0
- package/png/plate-38-diagonal-meander-rotated.png +0 -0
- package/png/plate-38-diagonal-meander.png +0 -0
- package/png/red-berry-vine-border.png +0 -0
- package/png/red-berry-vine-corner.png +0 -0
- package/png/red-berry-vine-rotated.png +0 -0
- package/png/red-berry-vine.png +0 -0
- package/png/red-rosette-vine-border.png +0 -0
- package/png/red-rosette-vine-corner.png +0 -0
- package/png/red-rosette-vine-rotated.png +0 -0
- package/png/red-rosette-vine.png +0 -0
- package/png/red-trefoil-vine-border.png +0 -0
- package/png/red-trefoil-vine-corner.png +0 -0
- package/png/red-trefoil-vine-rotated.png +0 -0
- package/png/red-trefoil-vine.png +0 -0
- package/png/spiral-ribbon-column.png +0 -0
- package/svg/gold-leaf-scroll-border.svg +1 -0
- package/svg/gold-leaf-scroll-corner.svg +1 -0
- package/svg/gold-leaf-scroll-rotated.svg +1 -0
- package/svg/gold-leaf-scroll.svg +1 -0
- package/svg/gold-quatrefoil-vine-border.svg +1 -0
- package/svg/gold-quatrefoil-vine-corner.svg +1 -0
- package/svg/gold-quatrefoil-vine-rotated.svg +1 -0
- package/svg/gold-quatrefoil-vine.svg +1 -0
- package/svg/interlocking-ribbon-border.svg +1 -0
- package/svg/interlocking-ribbon-corner.svg +1 -0
- package/svg/interlocking-ribbon-rotated.svg +1 -0
- package/svg/interlocking-ribbon.svg +1 -0
- package/svg/plate-01-linked-scrolls-border.svg +53 -0
- package/svg/plate-01-linked-scrolls-corner.svg +53 -0
- package/svg/plate-01-linked-scrolls-rotated.svg +53 -0
- package/svg/plate-01-linked-scrolls.svg +53 -0
- package/svg/plate-02-stepped-ribbon-border.svg +64 -0
- package/svg/plate-02-stepped-ribbon-corner.svg +64 -0
- package/svg/plate-02-stepped-ribbon-rotated.svg +64 -0
- package/svg/plate-02-stepped-ribbon.svg +64 -0
- package/svg/plate-03-spiral-bands-border.svg +95 -0
- package/svg/plate-03-spiral-bands-corner.svg +95 -0
- package/svg/plate-03-spiral-bands-rotated.svg +95 -0
- package/svg/plate-03-spiral-bands.svg +95 -0
- package/svg/plate-04-heart-and-diamond-border.svg +66 -0
- package/svg/plate-04-heart-and-diamond-corner.svg +66 -0
- package/svg/plate-04-heart-and-diamond-rotated.svg +66 -0
- package/svg/plate-04-heart-and-diamond.svg +66 -0
- package/svg/plate-05-blue-curls-border.svg +84 -0
- package/svg/plate-05-blue-curls-corner.svg +84 -0
- package/svg/plate-05-blue-curls-rotated.svg +84 -0
- package/svg/plate-05-blue-curls.svg +84 -0
- package/svg/plate-06-paired-red-scrolls-border.svg +228 -0
- package/svg/plate-06-paired-red-scrolls-corner.svg +228 -0
- package/svg/plate-06-paired-red-scrolls-rotated.svg +228 -0
- package/svg/plate-06-paired-red-scrolls.svg +228 -0
- package/svg/plate-07-blue-heart-leaves-border.svg +151 -0
- package/svg/plate-07-blue-heart-leaves-corner.svg +151 -0
- package/svg/plate-07-blue-heart-leaves-rotated.svg +151 -0
- package/svg/plate-07-blue-heart-leaves.svg +151 -0
- package/svg/plate-08-diagonal-cross-border.svg +80 -0
- package/svg/plate-08-diagonal-cross-corner.svg +80 -0
- package/svg/plate-08-diagonal-cross-rotated.svg +80 -0
- package/svg/plate-08-diagonal-cross.svg +80 -0
- package/svg/plate-09-interlaced-knot-border.svg +69 -0
- package/svg/plate-09-interlaced-knot-corner.svg +69 -0
- package/svg/plate-09-interlaced-knot-rotated.svg +69 -0
- package/svg/plate-09-interlaced-knot.svg +69 -0
- package/svg/plate-10-blue-palmettes-border.svg +154 -0
- package/svg/plate-10-blue-palmettes-corner.svg +154 -0
- package/svg/plate-10-blue-palmettes-rotated.svg +154 -0
- package/svg/plate-10-blue-palmettes.svg +154 -0
- package/svg/plate-11-acanthus-scroll.svg +217 -0
- package/svg/plate-12-arched-diamonds-border.svg +76 -0
- package/svg/plate-12-arched-diamonds-corner.svg +76 -0
- package/svg/plate-12-arched-diamonds-rotated.svg +76 -0
- package/svg/plate-12-arched-diamonds.svg +76 -0
- package/svg/plate-13-leaf-and-flower-vine-border.svg +180 -0
- package/svg/plate-13-leaf-and-flower-vine-corner.svg +180 -0
- package/svg/plate-13-leaf-and-flower-vine-rotated.svg +180 -0
- package/svg/plate-13-leaf-and-flower-vine.svg +180 -0
- package/svg/plate-14-crossed-diamonds-border.svg +115 -0
- package/svg/plate-14-crossed-diamonds-corner.svg +115 -0
- package/svg/plate-14-crossed-diamonds-rotated.svg +115 -0
- package/svg/plate-14-crossed-diamonds.svg +115 -0
- package/svg/plate-15-diamond-square-border.svg +69 -0
- package/svg/plate-15-diamond-square-corner.svg +69 -0
- package/svg/plate-15-diamond-square-rotated.svg +69 -0
- package/svg/plate-15-diamond-square.svg +69 -0
- package/svg/plate-16-stepped-corner.svg +70 -0
- package/svg/plate-17-stepped-arches-border.svg +112 -0
- package/svg/plate-17-stepped-arches-corner.svg +112 -0
- package/svg/plate-17-stepped-arches-rotated.svg +112 -0
- package/svg/plate-17-stepped-arches.svg +112 -0
- package/svg/plate-18-fan-palmettes-border.svg +81 -0
- package/svg/plate-18-fan-palmettes-corner.svg +81 -0
- package/svg/plate-18-fan-palmettes-rotated.svg +81 -0
- package/svg/plate-18-fan-palmettes.svg +81 -0
- package/svg/plate-19-cream-scrolls-border.svg +95 -0
- package/svg/plate-19-cream-scrolls-corner.svg +95 -0
- package/svg/plate-19-cream-scrolls-rotated.svg +95 -0
- package/svg/plate-19-cream-scrolls.svg +95 -0
- package/svg/plate-20-segmented-medallions-border.svg +58 -0
- package/svg/plate-20-segmented-medallions-corner.svg +58 -0
- package/svg/plate-20-segmented-medallions-rotated.svg +58 -0
- package/svg/plate-20-segmented-medallions.svg +58 -0
- package/svg/plate-21-green-flower-medallions-border.svg +81 -0
- package/svg/plate-21-green-flower-medallions-corner.svg +81 -0
- package/svg/plate-21-green-flower-medallions-rotated.svg +81 -0
- package/svg/plate-21-green-flower-medallions.svg +81 -0
- package/svg/plate-22-white-petal-grid-border.svg +109 -0
- package/svg/plate-22-white-petal-grid-corner.svg +109 -0
- package/svg/plate-22-white-petal-grid-rotated.svg +109 -0
- package/svg/plate-22-white-petal-grid.svg +109 -0
- package/svg/plate-23-crossed-ribbon-knots-border.svg +79 -0
- package/svg/plate-23-crossed-ribbon-knots-corner.svg +79 -0
- package/svg/plate-23-crossed-ribbon-knots-rotated.svg +79 -0
- package/svg/plate-23-crossed-ribbon-knots.svg +79 -0
- package/svg/plate-24-gold-ring-scrolls-border.svg +100 -0
- package/svg/plate-24-gold-ring-scrolls-corner.svg +100 -0
- package/svg/plate-24-gold-ring-scrolls-rotated.svg +100 -0
- package/svg/plate-24-gold-ring-scrolls.svg +100 -0
- package/svg/plate-25-greek-crosses-border.svg +86 -0
- package/svg/plate-25-greek-crosses-corner.svg +86 -0
- package/svg/plate-25-greek-crosses-rotated.svg +86 -0
- package/svg/plate-25-greek-crosses.svg +86 -0
- package/svg/plate-26-eight-petal-rosette-border.svg +56 -0
- package/svg/plate-26-eight-petal-rosette-corner.svg +56 -0
- package/svg/plate-26-eight-petal-rosette-rotated.svg +56 -0
- package/svg/plate-26-eight-petal-rosette.svg +56 -0
- package/svg/plate-27-blue-flower-medallions-border.svg +86 -0
- package/svg/plate-27-blue-flower-medallions-corner.svg +86 -0
- package/svg/plate-27-blue-flower-medallions-rotated.svg +86 -0
- package/svg/plate-27-blue-flower-medallions.svg +86 -0
- package/svg/plate-28-angular-blue-meander-border.svg +75 -0
- package/svg/plate-28-angular-blue-meander-corner.svg +75 -0
- package/svg/plate-28-angular-blue-meander-rotated.svg +75 -0
- package/svg/plate-28-angular-blue-meander.svg +75 -0
- package/svg/plate-29-red-acanthus-border.svg +212 -0
- package/svg/plate-29-red-acanthus-corner.svg +212 -0
- package/svg/plate-29-red-acanthus-rotated.svg +212 -0
- package/svg/plate-29-red-acanthus.svg +212 -0
- package/svg/plate-30-layered-palmettes-border.svg +128 -0
- package/svg/plate-30-layered-palmettes-corner.svg +128 -0
- package/svg/plate-30-layered-palmettes-rotated.svg +128 -0
- package/svg/plate-30-layered-palmettes.svg +128 -0
- package/svg/plate-31-alternating-florets-border.svg +227 -0
- package/svg/plate-31-alternating-florets-corner.svg +227 -0
- package/svg/plate-31-alternating-florets-rotated.svg +227 -0
- package/svg/plate-31-alternating-florets.svg +227 -0
- package/svg/plate-32-linked-ovals-border.svg +124 -0
- package/svg/plate-32-linked-ovals-corner.svg +124 -0
- package/svg/plate-32-linked-ovals-rotated.svg +124 -0
- package/svg/plate-32-linked-ovals.svg +124 -0
- package/svg/plate-33-leaf-scrolls-border.svg +130 -0
- package/svg/plate-33-leaf-scrolls-corner.svg +130 -0
- package/svg/plate-33-leaf-scrolls-rotated.svg +130 -0
- package/svg/plate-33-leaf-scrolls.svg +130 -0
- package/svg/plate-34-nested-fans-border.svg +157 -0
- package/svg/plate-34-nested-fans-corner.svg +157 -0
- package/svg/plate-34-nested-fans-rotated.svg +157 -0
- package/svg/plate-34-nested-fans.svg +157 -0
- package/svg/plate-35-crossed-white-stems-border.svg +77 -0
- package/svg/plate-35-crossed-white-stems-corner.svg +77 -0
- package/svg/plate-35-crossed-white-stems-rotated.svg +77 -0
- package/svg/plate-35-crossed-white-stems.svg +77 -0
- package/svg/plate-36-greek-key.svg +170 -0
- package/svg/plate-37-diamond-scroll.svg +161 -0
- package/svg/plate-38-diagonal-meander-border.svg +86 -0
- package/svg/plate-38-diagonal-meander-corner.svg +86 -0
- package/svg/plate-38-diagonal-meander-rotated.svg +86 -0
- package/svg/plate-38-diagonal-meander.svg +86 -0
- package/svg/red-berry-vine-border.svg +1 -0
- package/svg/red-berry-vine-corner.svg +1 -0
- package/svg/red-berry-vine-rotated.svg +1 -0
- package/svg/red-berry-vine.svg +1 -0
- package/svg/red-rosette-vine-border.svg +1 -0
- package/svg/red-rosette-vine-corner.svg +1 -0
- package/svg/red-rosette-vine-rotated.svg +1 -0
- package/svg/red-rosette-vine.svg +1 -0
- package/svg/red-trefoil-vine-border.svg +1 -0
- package/svg/red-trefoil-vine-corner.svg +1 -0
- package/svg/red-trefoil-vine-rotated.svg +1 -0
- package/svg/red-trefoil-vine.svg +1 -0
- package/webp/128/butterfly-panel-red.webp +0 -0
- package/webp/128/floral-bird-panel-blue.webp +0 -0
- package/webp/128/floral-bird-panel-left.webp +0 -0
- package/webp/128/floral-bird-panel-right.webp +0 -0
- package/webp/128/gold-leaf-scroll-border.webp +0 -0
- package/webp/128/gold-leaf-scroll-corner.webp +0 -0
- package/webp/128/gold-leaf-scroll-rotated.webp +0 -0
- package/webp/128/gold-leaf-scroll.webp +0 -0
- package/webp/128/gold-quatrefoil-vine-border.webp +0 -0
- package/webp/128/gold-quatrefoil-vine-corner.webp +0 -0
- package/webp/128/gold-quatrefoil-vine-rotated.webp +0 -0
- package/webp/128/gold-quatrefoil-vine.webp +0 -0
- package/webp/128/interlocking-ribbon-border.webp +0 -0
- package/webp/128/interlocking-ribbon-corner.webp +0 -0
- package/webp/128/interlocking-ribbon-rotated.webp +0 -0
- package/webp/128/interlocking-ribbon.webp +0 -0
- package/webp/128/plate-01-linked-scrolls-reference.webp +0 -0
- package/webp/128/plate-02-stepped-ribbon-border.webp +0 -0
- package/webp/128/plate-02-stepped-ribbon-reference.webp +0 -0
- package/webp/128/plate-03-spiral-bands-border.webp +0 -0
- package/webp/128/plate-03-spiral-bands-reference.webp +0 -0
- package/webp/128/plate-04-heart-and-diamond-reference.webp +0 -0
- package/webp/128/plate-05-blue-curls-border.webp +0 -0
- package/webp/128/plate-05-blue-curls-reference.webp +0 -0
- package/webp/128/plate-06-paired-red-scrolls-reference.webp +0 -0
- package/webp/128/plate-06-paired-red-scrolls-rotated.webp +0 -0
- package/webp/128/plate-06-paired-red-scrolls.webp +0 -0
- package/webp/128/plate-07-blue-heart-leaves-reference.webp +0 -0
- package/webp/128/plate-08-diagonal-cross-border.webp +0 -0
- package/webp/128/plate-09-interlaced-knot-border.webp +0 -0
- package/webp/128/plate-10-blue-palmettes-reference.webp +0 -0
- package/webp/128/plate-10-blue-palmettes-rotated.webp +0 -0
- package/webp/128/plate-10-blue-palmettes.webp +0 -0
- package/webp/128/plate-11-acanthus-scroll-reference.webp +0 -0
- package/webp/128/plate-11-acanthus-scroll.webp +0 -0
- package/webp/128/plate-13-leaf-and-flower-vine-border.webp +0 -0
- package/webp/128/plate-13-leaf-and-flower-vine-reference.webp +0 -0
- package/webp/128/plate-13-leaf-and-flower-vine-rotated.webp +0 -0
- package/webp/128/plate-13-leaf-and-flower-vine.webp +0 -0
- package/webp/128/plate-14-crossed-diamonds-border.webp +0 -0
- package/webp/128/plate-14-crossed-diamonds-reference.webp +0 -0
- package/webp/128/plate-15-diamond-square-border.webp +0 -0
- package/webp/128/plate-17-stepped-arches-border.webp +0 -0
- package/webp/128/plate-17-stepped-arches-reference.webp +0 -0
- package/webp/128/plate-18-fan-palmettes-reference.webp +0 -0
- package/webp/128/plate-19-cream-scrolls-border.webp +0 -0
- package/webp/128/plate-23-crossed-ribbon-knots-border.webp +0 -0
- package/webp/128/plate-26-eight-petal-rosette-border.webp +0 -0
- package/webp/128/plate-27-blue-flower-medallions-border.webp +0 -0
- package/webp/128/plate-28-angular-blue-meander-border.webp +0 -0
- package/webp/128/plate-29-red-acanthus-reference.webp +0 -0
- package/webp/128/plate-29-red-acanthus-rotated.webp +0 -0
- package/webp/128/plate-29-red-acanthus.webp +0 -0
- package/webp/128/plate-30-layered-palmettes-border.webp +0 -0
- package/webp/128/plate-30-layered-palmettes-reference.webp +0 -0
- package/webp/128/plate-30-layered-palmettes-rotated.webp +0 -0
- package/webp/128/plate-30-layered-palmettes.webp +0 -0
- package/webp/128/plate-31-alternating-florets-reference.webp +0 -0
- package/webp/128/plate-31-alternating-florets-rotated.webp +0 -0
- package/webp/128/plate-31-alternating-florets.webp +0 -0
- package/webp/128/plate-32-linked-ovals-border.webp +0 -0
- package/webp/128/plate-32-linked-ovals-reference.webp +0 -0
- package/webp/128/plate-33-leaf-scrolls-reference.webp +0 -0
- package/webp/128/plate-34-nested-fans-reference.webp +0 -0
- package/webp/128/plate-35-crossed-white-stems-reference.webp +0 -0
- package/webp/128/plate-38-diagonal-meander-reference.webp +0 -0
- package/webp/128/red-berry-vine-border.webp +0 -0
- package/webp/128/red-berry-vine-corner.webp +0 -0
- package/webp/128/red-berry-vine-rotated.webp +0 -0
- package/webp/128/red-berry-vine.webp +0 -0
- package/webp/128/red-rosette-vine-border.webp +0 -0
- package/webp/128/red-rosette-vine-corner.webp +0 -0
- package/webp/128/red-rosette-vine-rotated.webp +0 -0
- package/webp/128/red-rosette-vine.webp +0 -0
- package/webp/128/red-trefoil-vine-border.webp +0 -0
- package/webp/128/red-trefoil-vine-corner.webp +0 -0
- package/webp/128/red-trefoil-vine-rotated.webp +0 -0
- package/webp/128/red-trefoil-vine.webp +0 -0
- package/webp/128/spiral-ribbon-column.webp +0 -0
- package/webp/256/butterfly-panel-red.webp +0 -0
- package/webp/256/floral-bird-panel-blue.webp +0 -0
- package/webp/256/floral-bird-panel-left.webp +0 -0
- package/webp/256/floral-bird-panel-right.webp +0 -0
- package/webp/256/gold-leaf-scroll-border.webp +0 -0
- package/webp/256/gold-leaf-scroll-corner.webp +0 -0
- package/webp/256/gold-leaf-scroll-rotated.webp +0 -0
- package/webp/256/gold-leaf-scroll.webp +0 -0
- package/webp/256/gold-quatrefoil-vine-border.webp +0 -0
- package/webp/256/gold-quatrefoil-vine-corner.webp +0 -0
- package/webp/256/gold-quatrefoil-vine-rotated.webp +0 -0
- package/webp/256/gold-quatrefoil-vine.webp +0 -0
- package/webp/256/interlocking-ribbon-border.webp +0 -0
- package/webp/256/interlocking-ribbon-corner.webp +0 -0
- package/webp/256/interlocking-ribbon-rotated.webp +0 -0
- package/webp/256/interlocking-ribbon.webp +0 -0
- package/webp/256/plate-01-linked-scrolls-reference.webp +0 -0
- package/webp/256/plate-02-stepped-ribbon-reference.webp +0 -0
- package/webp/256/plate-03-spiral-bands-reference.webp +0 -0
- package/webp/256/plate-11-acanthus-scroll-reference.webp +0 -0
- package/webp/256/plate-11-acanthus-scroll.webp +0 -0
- package/webp/256/plate-13-leaf-and-flower-vine-border.webp +0 -0
- package/webp/256/plate-13-leaf-and-flower-vine-reference.webp +0 -0
- package/webp/256/plate-18-fan-palmettes-reference.webp +0 -0
- package/webp/256/plate-29-red-acanthus-reference.webp +0 -0
- package/webp/256/plate-30-layered-palmettes-reference.webp +0 -0
- package/webp/256/plate-31-alternating-florets-reference.webp +0 -0
- package/webp/256/red-berry-vine-border.webp +0 -0
- package/webp/256/red-berry-vine-corner.webp +0 -0
- package/webp/256/red-berry-vine-rotated.webp +0 -0
- package/webp/256/red-berry-vine.webp +0 -0
- package/webp/256/red-rosette-vine-border.webp +0 -0
- package/webp/256/red-rosette-vine-corner.webp +0 -0
- package/webp/256/red-rosette-vine-rotated.webp +0 -0
- package/webp/256/red-rosette-vine.webp +0 -0
- package/webp/256/red-trefoil-vine-border.webp +0 -0
- package/webp/256/red-trefoil-vine-corner.webp +0 -0
- package/webp/256/red-trefoil-vine-rotated.webp +0 -0
- package/webp/256/red-trefoil-vine.webp +0 -0
- package/webp/256/spiral-ribbon-column.webp +0 -0
- package/webp/512/butterfly-panel-red.webp +0 -0
- package/webp/512/floral-bird-panel-blue.webp +0 -0
- package/webp/512/floral-bird-panel-left.webp +0 -0
- package/webp/512/floral-bird-panel-right.webp +0 -0
- package/webp/512/gold-leaf-scroll-border.webp +0 -0
- package/webp/512/gold-leaf-scroll-corner.webp +0 -0
- package/webp/512/gold-leaf-scroll-rotated.webp +0 -0
- package/webp/512/gold-leaf-scroll.webp +0 -0
- package/webp/512/gold-quatrefoil-vine-border.webp +0 -0
- package/webp/512/gold-quatrefoil-vine-corner.webp +0 -0
- package/webp/512/gold-quatrefoil-vine-rotated.webp +0 -0
- package/webp/512/gold-quatrefoil-vine.webp +0 -0
- package/webp/512/interlocking-ribbon-border.webp +0 -0
- package/webp/512/interlocking-ribbon-corner.webp +0 -0
- package/webp/512/interlocking-ribbon-rotated.webp +0 -0
- package/webp/512/interlocking-ribbon.webp +0 -0
- package/webp/512/red-berry-vine-border.webp +0 -0
- package/webp/512/red-berry-vine-corner.webp +0 -0
- package/webp/512/red-berry-vine-rotated.webp +0 -0
- package/webp/512/red-berry-vine.webp +0 -0
- package/webp/512/red-rosette-vine-border.webp +0 -0
- package/webp/512/red-rosette-vine-corner.webp +0 -0
- package/webp/512/red-rosette-vine-rotated.webp +0 -0
- package/webp/512/red-rosette-vine.webp +0 -0
- package/webp/512/red-trefoil-vine-border.webp +0 -0
- package/webp/512/red-trefoil-vine-corner.webp +0 -0
- package/webp/512/red-trefoil-vine-rotated.webp +0 -0
- package/webp/512/red-trefoil-vine.webp +0 -0
- package/webp/512/spiral-ribbon-column.webp +0 -0
- package/webp/768/gold-leaf-scroll-border.webp +0 -0
- package/webp/768/gold-leaf-scroll-corner.webp +0 -0
- package/webp/768/gold-leaf-scroll-rotated.webp +0 -0
- package/webp/768/gold-leaf-scroll.webp +0 -0
- package/webp/768/gold-quatrefoil-vine-border.webp +0 -0
- package/webp/768/gold-quatrefoil-vine-corner.webp +0 -0
- package/webp/768/gold-quatrefoil-vine-rotated.webp +0 -0
- package/webp/768/gold-quatrefoil-vine.webp +0 -0
- package/webp/768/interlocking-ribbon-border.webp +0 -0
- package/webp/768/interlocking-ribbon-corner.webp +0 -0
- package/webp/768/interlocking-ribbon-rotated.webp +0 -0
- package/webp/768/interlocking-ribbon.webp +0 -0
- package/webp/768/red-berry-vine-border.webp +0 -0
- package/webp/768/red-berry-vine-corner.webp +0 -0
- package/webp/768/red-berry-vine-rotated.webp +0 -0
- package/webp/768/red-berry-vine.webp +0 -0
- package/webp/768/red-rosette-vine-border.webp +0 -0
- package/webp/768/red-rosette-vine-corner.webp +0 -0
- package/webp/768/red-rosette-vine-rotated.webp +0 -0
- package/webp/768/red-rosette-vine.webp +0 -0
- package/webp/768/red-trefoil-vine-border.webp +0 -0
- package/webp/768/red-trefoil-vine-corner.webp +0 -0
- package/webp/768/red-trefoil-vine-rotated.webp +0 -0
- package/webp/768/red-trefoil-vine.webp +0 -0
- package/webp/butterfly-panel-red.webp +0 -0
- package/webp/floral-bird-panel-blue.webp +0 -0
- package/webp/floral-bird-panel-left.webp +0 -0
- package/webp/floral-bird-panel-right.webp +0 -0
- package/webp/gold-leaf-scroll-border.webp +0 -0
- package/webp/gold-leaf-scroll-corner.webp +0 -0
- package/webp/gold-leaf-scroll-rotated.webp +0 -0
- package/webp/gold-leaf-scroll.webp +0 -0
- package/webp/gold-quatrefoil-vine-border.webp +0 -0
- package/webp/gold-quatrefoil-vine-corner.webp +0 -0
- package/webp/gold-quatrefoil-vine-rotated.webp +0 -0
- package/webp/gold-quatrefoil-vine.webp +0 -0
- package/webp/interlocking-ribbon-border.webp +0 -0
- package/webp/interlocking-ribbon-corner.webp +0 -0
- package/webp/interlocking-ribbon-rotated.webp +0 -0
- package/webp/interlocking-ribbon.webp +0 -0
- package/webp/plate-01-linked-scrolls-border.webp +0 -0
- package/webp/plate-01-linked-scrolls-corner.webp +0 -0
- package/webp/plate-01-linked-scrolls-reference.webp +0 -0
- package/webp/plate-01-linked-scrolls-rotated.webp +0 -0
- package/webp/plate-01-linked-scrolls.webp +0 -0
- package/webp/plate-02-stepped-ribbon-border.webp +0 -0
- package/webp/plate-02-stepped-ribbon-corner.webp +0 -0
- package/webp/plate-02-stepped-ribbon-reference.webp +0 -0
- package/webp/plate-02-stepped-ribbon-rotated.webp +0 -0
- package/webp/plate-02-stepped-ribbon.webp +0 -0
- package/webp/plate-03-spiral-bands-border.webp +0 -0
- package/webp/plate-03-spiral-bands-corner.webp +0 -0
- package/webp/plate-03-spiral-bands-reference.webp +0 -0
- package/webp/plate-03-spiral-bands-rotated.webp +0 -0
- package/webp/plate-03-spiral-bands.webp +0 -0
- package/webp/plate-04-heart-and-diamond-border.webp +0 -0
- package/webp/plate-04-heart-and-diamond-corner.webp +0 -0
- package/webp/plate-04-heart-and-diamond-reference.webp +0 -0
- package/webp/plate-04-heart-and-diamond-rotated.webp +0 -0
- package/webp/plate-04-heart-and-diamond.webp +0 -0
- package/webp/plate-05-blue-curls-border.webp +0 -0
- package/webp/plate-05-blue-curls-corner.webp +0 -0
- package/webp/plate-05-blue-curls-reference.webp +0 -0
- package/webp/plate-05-blue-curls-rotated.webp +0 -0
- package/webp/plate-05-blue-curls.webp +0 -0
- package/webp/plate-06-paired-red-scrolls-border.webp +0 -0
- package/webp/plate-06-paired-red-scrolls-corner.webp +0 -0
- package/webp/plate-06-paired-red-scrolls-reference.webp +0 -0
- package/webp/plate-06-paired-red-scrolls-rotated.webp +0 -0
- package/webp/plate-06-paired-red-scrolls.webp +0 -0
- package/webp/plate-07-blue-heart-leaves-border.webp +0 -0
- package/webp/plate-07-blue-heart-leaves-corner.webp +0 -0
- package/webp/plate-07-blue-heart-leaves-reference.webp +0 -0
- package/webp/plate-07-blue-heart-leaves-rotated.webp +0 -0
- package/webp/plate-07-blue-heart-leaves.webp +0 -0
- package/webp/plate-08-diagonal-cross-border.webp +0 -0
- package/webp/plate-08-diagonal-cross-corner.webp +0 -0
- package/webp/plate-08-diagonal-cross-reference.webp +0 -0
- package/webp/plate-08-diagonal-cross-rotated.webp +0 -0
- package/webp/plate-08-diagonal-cross.webp +0 -0
- package/webp/plate-09-interlaced-knot-border.webp +0 -0
- package/webp/plate-09-interlaced-knot-corner.webp +0 -0
- package/webp/plate-09-interlaced-knot-reference.webp +0 -0
- package/webp/plate-09-interlaced-knot-rotated.webp +0 -0
- package/webp/plate-09-interlaced-knot.webp +0 -0
- package/webp/plate-10-blue-palmettes-border.webp +0 -0
- package/webp/plate-10-blue-palmettes-corner.webp +0 -0
- package/webp/plate-10-blue-palmettes-reference.webp +0 -0
- package/webp/plate-10-blue-palmettes-rotated.webp +0 -0
- package/webp/plate-10-blue-palmettes.webp +0 -0
- package/webp/plate-11-acanthus-scroll-reference.webp +0 -0
- package/webp/plate-11-acanthus-scroll.webp +0 -0
- package/webp/plate-12-arched-diamonds-border.webp +0 -0
- package/webp/plate-12-arched-diamonds-corner.webp +0 -0
- package/webp/plate-12-arched-diamonds-reference.webp +0 -0
- package/webp/plate-12-arched-diamonds-rotated.webp +0 -0
- package/webp/plate-12-arched-diamonds.webp +0 -0
- package/webp/plate-13-leaf-and-flower-vine-border.webp +0 -0
- package/webp/plate-13-leaf-and-flower-vine-corner.webp +0 -0
- package/webp/plate-13-leaf-and-flower-vine-reference.webp +0 -0
- package/webp/plate-13-leaf-and-flower-vine-rotated.webp +0 -0
- package/webp/plate-13-leaf-and-flower-vine.webp +0 -0
- package/webp/plate-14-crossed-diamonds-border.webp +0 -0
- package/webp/plate-14-crossed-diamonds-corner.webp +0 -0
- package/webp/plate-14-crossed-diamonds-reference.webp +0 -0
- package/webp/plate-14-crossed-diamonds-rotated.webp +0 -0
- package/webp/plate-14-crossed-diamonds.webp +0 -0
- package/webp/plate-15-diamond-square-border.webp +0 -0
- package/webp/plate-15-diamond-square-corner.webp +0 -0
- package/webp/plate-15-diamond-square-reference.webp +0 -0
- package/webp/plate-15-diamond-square-rotated.webp +0 -0
- package/webp/plate-15-diamond-square.webp +0 -0
- package/webp/plate-16-stepped-corner-reference.webp +0 -0
- package/webp/plate-16-stepped-corner.webp +0 -0
- package/webp/plate-17-stepped-arches-border.webp +0 -0
- package/webp/plate-17-stepped-arches-corner.webp +0 -0
- package/webp/plate-17-stepped-arches-reference.webp +0 -0
- package/webp/plate-17-stepped-arches-rotated.webp +0 -0
- package/webp/plate-17-stepped-arches.webp +0 -0
- package/webp/plate-18-fan-palmettes-border.webp +0 -0
- package/webp/plate-18-fan-palmettes-corner.webp +0 -0
- package/webp/plate-18-fan-palmettes-reference.webp +0 -0
- package/webp/plate-18-fan-palmettes-rotated.webp +0 -0
- package/webp/plate-18-fan-palmettes.webp +0 -0
- package/webp/plate-19-cream-scrolls-border.webp +0 -0
- package/webp/plate-19-cream-scrolls-corner.webp +0 -0
- package/webp/plate-19-cream-scrolls-reference.webp +0 -0
- package/webp/plate-19-cream-scrolls-rotated.webp +0 -0
- package/webp/plate-19-cream-scrolls.webp +0 -0
- package/webp/plate-20-segmented-medallions-border.webp +0 -0
- package/webp/plate-20-segmented-medallions-corner.webp +0 -0
- package/webp/plate-20-segmented-medallions-reference.webp +0 -0
- package/webp/plate-20-segmented-medallions-rotated.webp +0 -0
- package/webp/plate-20-segmented-medallions.webp +0 -0
- package/webp/plate-21-green-flower-medallions-border.webp +0 -0
- package/webp/plate-21-green-flower-medallions-corner.webp +0 -0
- package/webp/plate-21-green-flower-medallions-reference.webp +0 -0
- package/webp/plate-21-green-flower-medallions-rotated.webp +0 -0
- package/webp/plate-21-green-flower-medallions.webp +0 -0
- package/webp/plate-22-white-petal-grid-border.webp +0 -0
- package/webp/plate-22-white-petal-grid-corner.webp +0 -0
- package/webp/plate-22-white-petal-grid-reference.webp +0 -0
- package/webp/plate-22-white-petal-grid-rotated.webp +0 -0
- package/webp/plate-22-white-petal-grid.webp +0 -0
- package/webp/plate-23-crossed-ribbon-knots-border.webp +0 -0
- package/webp/plate-23-crossed-ribbon-knots-corner.webp +0 -0
- package/webp/plate-23-crossed-ribbon-knots-reference.webp +0 -0
- package/webp/plate-23-crossed-ribbon-knots-rotated.webp +0 -0
- package/webp/plate-23-crossed-ribbon-knots.webp +0 -0
- package/webp/plate-24-gold-ring-scrolls-border.webp +0 -0
- package/webp/plate-24-gold-ring-scrolls-corner.webp +0 -0
- package/webp/plate-24-gold-ring-scrolls-reference.webp +0 -0
- package/webp/plate-24-gold-ring-scrolls-rotated.webp +0 -0
- package/webp/plate-24-gold-ring-scrolls.webp +0 -0
- package/webp/plate-25-greek-crosses-border.webp +0 -0
- package/webp/plate-25-greek-crosses-corner.webp +0 -0
- package/webp/plate-25-greek-crosses-reference.webp +0 -0
- package/webp/plate-25-greek-crosses-rotated.webp +0 -0
- package/webp/plate-25-greek-crosses.webp +0 -0
- package/webp/plate-26-eight-petal-rosette-border.webp +0 -0
- package/webp/plate-26-eight-petal-rosette-corner.webp +0 -0
- package/webp/plate-26-eight-petal-rosette-reference.webp +0 -0
- package/webp/plate-26-eight-petal-rosette-rotated.webp +0 -0
- package/webp/plate-26-eight-petal-rosette.webp +0 -0
- package/webp/plate-27-blue-flower-medallions-border.webp +0 -0
- package/webp/plate-27-blue-flower-medallions-corner.webp +0 -0
- package/webp/plate-27-blue-flower-medallions-reference.webp +0 -0
- package/webp/plate-27-blue-flower-medallions-rotated.webp +0 -0
- package/webp/plate-27-blue-flower-medallions.webp +0 -0
- package/webp/plate-28-angular-blue-meander-border.webp +0 -0
- package/webp/plate-28-angular-blue-meander-corner.webp +0 -0
- package/webp/plate-28-angular-blue-meander-reference.webp +0 -0
- package/webp/plate-28-angular-blue-meander-rotated.webp +0 -0
- package/webp/plate-28-angular-blue-meander.webp +0 -0
- package/webp/plate-29-red-acanthus-border.webp +0 -0
- package/webp/plate-29-red-acanthus-corner.webp +0 -0
- package/webp/plate-29-red-acanthus-reference.webp +0 -0
- package/webp/plate-29-red-acanthus-rotated.webp +0 -0
- package/webp/plate-29-red-acanthus.webp +0 -0
- package/webp/plate-30-layered-palmettes-border.webp +0 -0
- package/webp/plate-30-layered-palmettes-corner.webp +0 -0
- package/webp/plate-30-layered-palmettes-reference.webp +0 -0
- package/webp/plate-30-layered-palmettes-rotated.webp +0 -0
- package/webp/plate-30-layered-palmettes.webp +0 -0
- package/webp/plate-31-alternating-florets-border.webp +0 -0
- package/webp/plate-31-alternating-florets-corner.webp +0 -0
- package/webp/plate-31-alternating-florets-reference.webp +0 -0
- package/webp/plate-31-alternating-florets-rotated.webp +0 -0
- package/webp/plate-31-alternating-florets.webp +0 -0
- package/webp/plate-32-linked-ovals-border.webp +0 -0
- package/webp/plate-32-linked-ovals-corner.webp +0 -0
- package/webp/plate-32-linked-ovals-reference.webp +0 -0
- package/webp/plate-32-linked-ovals-rotated.webp +0 -0
- package/webp/plate-32-linked-ovals.webp +0 -0
- package/webp/plate-33-leaf-scrolls-border.webp +0 -0
- package/webp/plate-33-leaf-scrolls-corner.webp +0 -0
- package/webp/plate-33-leaf-scrolls-reference.webp +0 -0
- package/webp/plate-33-leaf-scrolls-rotated.webp +0 -0
- package/webp/plate-33-leaf-scrolls.webp +0 -0
- package/webp/plate-34-nested-fans-border.webp +0 -0
- package/webp/plate-34-nested-fans-corner.webp +0 -0
- package/webp/plate-34-nested-fans-reference.webp +0 -0
- package/webp/plate-34-nested-fans-rotated.webp +0 -0
- package/webp/plate-34-nested-fans.webp +0 -0
- package/webp/plate-35-crossed-white-stems-border.webp +0 -0
- package/webp/plate-35-crossed-white-stems-corner.webp +0 -0
- package/webp/plate-35-crossed-white-stems-reference.webp +0 -0
- package/webp/plate-35-crossed-white-stems-rotated.webp +0 -0
- package/webp/plate-35-crossed-white-stems.webp +0 -0
- package/webp/plate-36-greek-key-reference.webp +0 -0
- package/webp/plate-36-greek-key.webp +0 -0
- package/webp/plate-37-diamond-scroll-reference.webp +0 -0
- package/webp/plate-37-diamond-scroll.webp +0 -0
- package/webp/plate-38-diagonal-meander-border.webp +0 -0
- package/webp/plate-38-diagonal-meander-corner.webp +0 -0
- package/webp/plate-38-diagonal-meander-reference.webp +0 -0
- package/webp/plate-38-diagonal-meander-rotated.webp +0 -0
- package/webp/plate-38-diagonal-meander.webp +0 -0
- package/webp/red-berry-vine-border.webp +0 -0
- package/webp/red-berry-vine-corner.webp +0 -0
- package/webp/red-berry-vine-rotated.webp +0 -0
- package/webp/red-berry-vine.webp +0 -0
- package/webp/red-rosette-vine-border.webp +0 -0
- package/webp/red-rosette-vine-corner.webp +0 -0
- package/webp/red-rosette-vine-rotated.webp +0 -0
- package/webp/red-rosette-vine.webp +0 -0
- package/webp/red-trefoil-vine-border.webp +0 -0
- package/webp/red-trefoil-vine-corner.webp +0 -0
- package/webp/red-trefoil-vine-rotated.webp +0 -0
- package/webp/red-trefoil-vine.webp +0 -0
- 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
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
|
+
}
|
package/lib/styles.d.ts
ADDED
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|