@morphemecms/cms 0.1.0 → 0.2.0-next-20261104150211
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/CHANGELOG.md +12 -0
- package/LICENSE +21 -21
- package/README.md +51 -51
- package/astro.mjs +162 -162
- package/bin/morpheme.mjs +38 -38
- package/client.d.ts +10 -10
- package/defaults/blockTexts.ts +33 -33
- package/defaults/collections.ts +774 -774
- package/defaults/colors.ts +125 -125
- package/defaults/company.ts +20 -20
- package/defaults/editor.ts +178 -178
- package/defaults/internalLinks.ts +30 -30
- package/defaults/opens.ts +18 -18
- package/defaults/popup.tsx +93 -93
- package/defaults/privacy.ts +79 -79
- package/defaults/rules.ts +450 -450
- package/defaults/schema.ts +16 -16
- package/defaults/sitedata.ts +129 -129
- package/defaults/standard.ts +106 -106
- package/defaults/standardPages.ts +87 -87
- package/defaults/texts.ts +481 -481
- package/demo/README.md +26 -26
- package/demo/src/content/blog/build-a-page-from-blocks.md +19 -19
- package/demo/src/content/blog/colors-everyone-can-read.md +19 -19
- package/demo/src/content/blog/edit-your-website-from-your-phone.md +21 -21
- package/demo/src/content/blog/every-save-is-a-version.md +21 -21
- package/demo/src/content/blog/schedule-a-post.md +17 -17
- package/demo/src/content/blog/secure-from-day-one.md +17 -17
- package/demo/src/content/blog/seo-without-the-guesswork.md +23 -23
- package/demo/src/content/blog/switch-themes-without-losing-anything.md +23 -23
- package/demo/src/content/blog/the-app-store.md +21 -21
- package/demo/src/content/pages/about.md +22 -22
- package/demo/src/content/pages/app-store.md +30 -30
- package/demo/src/content/pages/blocks.md +98 -98
- package/demo/src/content/pages/blog-page.md +11 -11
- package/demo/src/content/pages/contact.md +16 -16
- package/demo/src/content/pages/get-started.md +20 -20
- package/demo/src/content/pages/home.md +26 -26
- package/demo/src/content/pages/page-not-found.md +11 -11
- package/demo/src/content/pages/privacy-policy.md +24 -24
- package/demo/src/data/blocks.json +25 -25
- package/demo/src/data/booking.json +6 -6
- package/demo/src/data/categories/apps.json +6 -6
- package/demo/src/data/categories/design.json +6 -6
- package/demo/src/data/categories/editing.json +6 -6
- package/demo/src/data/categories/security.json +6 -6
- package/demo/src/data/categories/seo.json +6 -6
- package/demo/src/data/colors.json +75 -75
- package/demo/src/data/contact.json +8 -8
- package/demo/src/data/cookies.json +21 -21
- package/demo/src/data/footer.json +27 -27
- package/demo/src/data/menu.json +35 -35
- package/demo/src/data/mobile-menu.json +25 -25
- package/demo/src/data/popups/booking-bar.json +13 -13
- package/demo/src/data/popups/try-the-editor.json +16 -16
- package/demo/src/data/standard-pages.json +8 -8
- package/demo/src/data/testimonials/sample-bakery.json +10 -10
- package/demo/src/data/testimonials/sample-clinic.json +10 -10
- package/demo/src/data/testimonials/sample-studio.json +10 -10
- package/demo/src/site/colors.ts +11 -11
- package/demo/src/site/config.ts +19 -19
- package/icons/lucide/LICENSE +43 -43
- package/icons/lucide/address-book.svg +1 -1
- package/icons/lucide/app-window.svg +1 -1
- package/icons/lucide/arrow-counter-clockwise.svg +1 -1
- package/icons/lucide/arrow-down.svg +1 -1
- package/icons/lucide/arrow-left.svg +1 -1
- package/icons/lucide/arrow-right.svg +1 -1
- package/icons/lucide/arrow-square-out.svg +1 -1
- package/icons/lucide/arrow-u-up-left.svg +1 -1
- package/icons/lucide/arrow-u-up-right.svg +1 -1
- package/icons/lucide/arrow-up-right.svg +1 -1
- package/icons/lucide/arrow-up.svg +1 -1
- package/icons/lucide/arrows-down-up.svg +1 -1
- package/icons/lucide/arrows-in-line-horizontal.svg +1 -1
- package/icons/lucide/arrows-out-line-horizontal.svg +1 -1
- package/icons/lucide/article.svg +1 -1
- package/icons/lucide/bank.svg +1 -1
- package/icons/lucide/bell.svg +1 -1
- package/icons/lucide/bicycle.svg +1 -1
- package/icons/lucide/binoculars.svg +1 -1
- package/icons/lucide/book-open-text.svg +1 -1
- package/icons/lucide/book-open.svg +1 -1
- package/icons/lucide/browser.svg +1 -1
- package/icons/lucide/buildings.svg +1 -1
- package/icons/lucide/bus.svg +1 -1
- package/icons/lucide/calendar-blank.svg +1 -1
- package/icons/lucide/calendar-check.svg +1 -1
- package/icons/lucide/car.svg +1 -1
- package/icons/lucide/cards.svg +1 -1
- package/icons/lucide/caret-down.svg +1 -1
- package/icons/lucide/caret-left.svg +1 -1
- package/icons/lucide/caret-right.svg +1 -1
- package/icons/lucide/caret-up.svg +1 -1
- package/icons/lucide/certificate.svg +1 -1
- package/icons/lucide/chart-line-up.svg +1 -1
- package/icons/lucide/chats.svg +1 -1
- package/icons/lucide/check-circle.svg +1 -1
- package/icons/lucide/check.svg +1 -1
- package/icons/lucide/circle-half.svg +1 -1
- package/icons/lucide/circle.svg +1 -1
- package/icons/lucide/clock-counter-clockwise.svg +1 -1
- package/icons/lucide/clock.svg +1 -1
- package/icons/lucide/code.svg +1 -1
- package/icons/lucide/coffee.svg +1 -1
- package/icons/lucide/columns.svg +1 -1
- package/icons/lucide/cookie.svg +1 -1
- package/icons/lucide/copy.svg +1 -1
- package/icons/lucide/credit-card.svg +1 -1
- package/icons/lucide/currency-circle-dollar.svg +1 -1
- package/icons/lucide/cursor-click.svg +1 -1
- package/icons/lucide/database.svg +1 -1
- package/icons/lucide/desktop.svg +1 -1
- package/icons/lucide/device-mobile.svg +1 -1
- package/icons/lucide/door-open.svg +1 -1
- package/icons/lucide/download-simple.svg +1 -1
- package/icons/lucide/envelope-simple.svg +1 -1
- package/icons/lucide/eye-slash.svg +1 -1
- package/icons/lucide/eye.svg +1 -1
- package/icons/lucide/file-pdf.svg +1 -1
- package/icons/lucide/file-text.svg +1 -1
- package/icons/lucide/file-video.svg +1 -1
- package/icons/lucide/file-zip.svg +1 -1
- package/icons/lucide/flower-lotus.svg +1 -1
- package/icons/lucide/folder-simple.svg +1 -1
- package/icons/lucide/funnel.svg +1 -1
- package/icons/lucide/gauge.svg +1 -1
- package/icons/lucide/gear.svg +1 -1
- package/icons/lucide/github-logo.svg +1 -1
- package/icons/lucide/globe.svg +1 -1
- package/icons/lucide/google-logo.svg +1 -1
- package/icons/lucide/graduation-cap.svg +1 -1
- package/icons/lucide/hammer.svg +1 -1
- package/icons/lucide/hand-heart.svg +1 -1
- package/icons/lucide/handshake.svg +1 -1
- package/icons/lucide/hard-drives.svg +1 -1
- package/icons/lucide/heart.svg +1 -1
- package/icons/lucide/house.svg +1 -1
- package/icons/lucide/image-square.svg +1 -1
- package/icons/lucide/image.svg +1 -1
- package/icons/lucide/info.svg +1 -1
- package/icons/lucide/keyboard.svg +1 -1
- package/icons/lucide/leaf.svg +1 -1
- package/icons/lucide/lifebuoy.svg +1 -1
- package/icons/lucide/lightbulb.svg +1 -1
- package/icons/lucide/link-break.svg +1 -1
- package/icons/lucide/link-simple.svg +1 -1
- package/icons/lucide/list-bullets.svg +1 -1
- package/icons/lucide/list-checks.svg +1 -1
- package/icons/lucide/list-numbers.svg +1 -1
- package/icons/lucide/list.svg +1 -1
- package/icons/lucide/lock-simple-open.svg +1 -1
- package/icons/lucide/lock-simple.svg +1 -1
- package/icons/lucide/magnifying-glass.svg +1 -1
- package/icons/lucide/map-pin.svg +1 -1
- package/icons/lucide/map-trifold.svg +1 -1
- package/icons/lucide/medal.svg +1 -1
- package/icons/lucide/megaphone.svg +1 -1
- package/icons/lucide/minus.svg +1 -1
- package/icons/lucide/moon.svg +1 -1
- package/icons/lucide/newspaper.svg +1 -1
- package/icons/lucide/pack.json +23 -23
- package/icons/lucide/paint-brush-broad.svg +1 -1
- package/icons/lucide/palette.svg +1 -1
- package/icons/lucide/paper-plane-tilt.svg +1 -1
- package/icons/lucide/pencil-simple.svg +1 -1
- package/icons/lucide/phone.svg +1 -1
- package/icons/lucide/play-fill.svg +1 -1
- package/icons/lucide/plus.svg +1 -1
- package/icons/lucide/prohibit.svg +1 -1
- package/icons/lucide/puzzle-piece.svg +1 -1
- package/icons/lucide/question.svg +1 -1
- package/icons/lucide/quotes.svg +1 -1
- package/icons/lucide/rows.svg +1 -1
- package/icons/lucide/ruler.svg +1 -1
- package/icons/lucide/scan.svg +1 -1
- package/icons/lucide/shapes.svg +1 -1
- package/icons/lucide/share-network.svg +1 -1
- package/icons/lucide/shield-check.svg +1 -1
- package/icons/lucide/sidebar-simple.svg +1 -1
- package/icons/lucide/sign-out.svg +1 -1
- package/icons/lucide/signpost.svg +1 -1
- package/icons/lucide/sliders-horizontal.svg +1 -1
- package/icons/lucide/smiley.svg +1 -1
- package/icons/lucide/sparkle.svg +1 -1
- package/icons/lucide/square-half-bottom.svg +1 -1
- package/icons/lucide/square.svg +1 -1
- package/icons/lucide/squares-four.svg +1 -1
- package/icons/lucide/sticker.svg +1 -1
- package/icons/lucide/storefront.svg +1 -1
- package/icons/lucide/sun.svg +1 -1
- package/icons/lucide/swatches.svg +1 -1
- package/icons/lucide/tag.svg +1 -1
- package/icons/lucide/text-aa.svg +1 -1
- package/icons/lucide/text-align-left.svg +1 -1
- package/icons/lucide/text-b.svg +1 -1
- package/icons/lucide/text-h-one.svg +1 -1
- package/icons/lucide/text-h-three.svg +1 -1
- package/icons/lucide/text-h-two.svg +1 -1
- package/icons/lucide/text-italic.svg +1 -1
- package/icons/lucide/text-t.svg +1 -1
- package/icons/lucide/ticket.svg +1 -1
- package/icons/lucide/toggle-right.svg +1 -1
- package/icons/lucide/train.svg +1 -1
- package/icons/lucide/trash.svg +1 -1
- package/icons/lucide/upload-simple.svg +1 -1
- package/icons/lucide/user-circle.svg +1 -1
- package/icons/lucide/user.svg +1 -1
- package/icons/lucide/users-three.svg +1 -1
- package/icons/lucide/users.svg +1 -1
- package/icons/lucide/video-camera.svg +1 -1
- package/icons/lucide/warning-circle.svg +1 -1
- package/icons/lucide/warning.svg +1 -1
- package/icons/lucide/wave-sine.svg +1 -1
- package/icons/lucide/wheelchair.svg +1 -1
- package/icons/lucide/wrench.svg +1 -1
- package/icons/lucide/x.svg +1 -1
- package/icons/material-symbols/LICENSE +201 -201
- package/icons/material-symbols/address-book.svg +1 -1
- package/icons/material-symbols/app-window.svg +1 -1
- package/icons/material-symbols/arrow-counter-clockwise.svg +1 -1
- package/icons/material-symbols/arrow-down.svg +1 -1
- package/icons/material-symbols/arrow-left.svg +1 -1
- package/icons/material-symbols/arrow-right.svg +1 -1
- package/icons/material-symbols/arrow-square-out.svg +1 -1
- package/icons/material-symbols/arrow-u-up-left.svg +1 -1
- package/icons/material-symbols/arrow-u-up-right.svg +1 -1
- package/icons/material-symbols/arrow-up-right.svg +1 -1
- package/icons/material-symbols/arrow-up.svg +1 -1
- package/icons/material-symbols/arrows-down-up.svg +1 -1
- package/icons/material-symbols/arrows-in-line-horizontal.svg +1 -1
- package/icons/material-symbols/arrows-out-line-horizontal.svg +1 -1
- package/icons/material-symbols/article.svg +1 -1
- package/icons/material-symbols/bank.svg +1 -1
- package/icons/material-symbols/bell.svg +1 -1
- package/icons/material-symbols/bicycle.svg +1 -1
- package/icons/material-symbols/binoculars.svg +1 -1
- package/icons/material-symbols/book-open-text.svg +1 -1
- package/icons/material-symbols/book-open.svg +1 -1
- package/icons/material-symbols/browser.svg +1 -1
- package/icons/material-symbols/buildings.svg +1 -1
- package/icons/material-symbols/bus.svg +1 -1
- package/icons/material-symbols/calendar-blank.svg +1 -1
- package/icons/material-symbols/calendar-check.svg +1 -1
- package/icons/material-symbols/car.svg +1 -1
- package/icons/material-symbols/cards.svg +1 -1
- package/icons/material-symbols/caret-down.svg +1 -1
- package/icons/material-symbols/caret-left.svg +1 -1
- package/icons/material-symbols/caret-right.svg +1 -1
- package/icons/material-symbols/caret-up.svg +1 -1
- package/icons/material-symbols/certificate.svg +1 -1
- package/icons/material-symbols/chart-line-up.svg +1 -1
- package/icons/material-symbols/chats.svg +1 -1
- package/icons/material-symbols/check-circle.svg +1 -1
- package/icons/material-symbols/check.svg +1 -1
- package/icons/material-symbols/circle-half.svg +1 -1
- package/icons/material-symbols/circle.svg +1 -1
- package/icons/material-symbols/clock-counter-clockwise.svg +1 -1
- package/icons/material-symbols/clock.svg +1 -1
- package/icons/material-symbols/code.svg +1 -1
- package/icons/material-symbols/coffee.svg +1 -1
- package/icons/material-symbols/columns.svg +1 -1
- package/icons/material-symbols/cookie.svg +1 -1
- package/icons/material-symbols/copy.svg +1 -1
- package/icons/material-symbols/credit-card.svg +1 -1
- package/icons/material-symbols/currency-circle-dollar.svg +1 -1
- package/icons/material-symbols/cursor-click.svg +1 -1
- package/icons/material-symbols/database.svg +1 -1
- package/icons/material-symbols/desktop.svg +1 -1
- package/icons/material-symbols/device-mobile.svg +1 -1
- package/icons/material-symbols/door-open.svg +1 -1
- package/icons/material-symbols/download-simple.svg +1 -1
- package/icons/material-symbols/envelope-simple.svg +1 -1
- package/icons/material-symbols/eye-slash.svg +1 -1
- package/icons/material-symbols/eye.svg +1 -1
- package/icons/material-symbols/file-pdf.svg +1 -1
- package/icons/material-symbols/file-text.svg +1 -1
- package/icons/material-symbols/file-video.svg +1 -1
- package/icons/material-symbols/file-zip.svg +1 -1
- package/icons/material-symbols/flower-lotus.svg +1 -1
- package/icons/material-symbols/folder-simple.svg +1 -1
- package/icons/material-symbols/funnel.svg +1 -1
- package/icons/material-symbols/gauge.svg +1 -1
- package/icons/material-symbols/gear.svg +1 -1
- package/icons/material-symbols/github-logo.svg +1 -1
- package/icons/material-symbols/globe.svg +1 -1
- package/icons/material-symbols/google-logo.svg +1 -1
- package/icons/material-symbols/graduation-cap.svg +1 -1
- package/icons/material-symbols/hammer.svg +1 -1
- package/icons/material-symbols/hand-heart.svg +1 -1
- package/icons/material-symbols/handshake.svg +1 -1
- package/icons/material-symbols/hard-drives.svg +1 -1
- package/icons/material-symbols/heart.svg +1 -1
- package/icons/material-symbols/house.svg +1 -1
- package/icons/material-symbols/image-square.svg +1 -1
- package/icons/material-symbols/image.svg +1 -1
- package/icons/material-symbols/info.svg +1 -1
- package/icons/material-symbols/keyboard.svg +1 -1
- package/icons/material-symbols/leaf.svg +1 -1
- package/icons/material-symbols/lifebuoy.svg +1 -1
- package/icons/material-symbols/lightbulb.svg +1 -1
- package/icons/material-symbols/link-break.svg +1 -1
- package/icons/material-symbols/link-simple.svg +1 -1
- package/icons/material-symbols/list-bullets.svg +1 -1
- package/icons/material-symbols/list-checks.svg +1 -1
- package/icons/material-symbols/list-numbers.svg +1 -1
- package/icons/material-symbols/list.svg +1 -1
- package/icons/material-symbols/lock-simple-open.svg +1 -1
- package/icons/material-symbols/lock-simple.svg +1 -1
- package/icons/material-symbols/magnifying-glass.svg +1 -1
- package/icons/material-symbols/map-pin.svg +1 -1
- package/icons/material-symbols/map-trifold.svg +1 -1
- package/icons/material-symbols/medal.svg +1 -1
- package/icons/material-symbols/megaphone.svg +1 -1
- package/icons/material-symbols/minus.svg +1 -1
- package/icons/material-symbols/moon.svg +1 -1
- package/icons/material-symbols/newspaper.svg +1 -1
- package/icons/material-symbols/pack.json +29 -29
- package/icons/material-symbols/paint-brush-broad.svg +1 -1
- package/icons/material-symbols/palette.svg +1 -1
- package/icons/material-symbols/paper-plane-tilt.svg +1 -1
- package/icons/material-symbols/pencil-simple.svg +1 -1
- package/icons/material-symbols/phone.svg +1 -1
- package/icons/material-symbols/play-fill.svg +1 -1
- package/icons/material-symbols/plus.svg +1 -1
- package/icons/material-symbols/prohibit.svg +1 -1
- package/icons/material-symbols/puzzle-piece.svg +1 -1
- package/icons/material-symbols/question.svg +1 -1
- package/icons/material-symbols/quotes.svg +1 -1
- package/icons/material-symbols/rows.svg +1 -1
- package/icons/material-symbols/ruler.svg +1 -1
- package/icons/material-symbols/scan.svg +1 -1
- package/icons/material-symbols/shapes.svg +1 -1
- package/icons/material-symbols/share-network.svg +1 -1
- package/icons/material-symbols/shield-check.svg +1 -1
- package/icons/material-symbols/sidebar-simple.svg +1 -1
- package/icons/material-symbols/sign-out.svg +1 -1
- package/icons/material-symbols/signpost.svg +1 -1
- package/icons/material-symbols/sliders-horizontal.svg +1 -1
- package/icons/material-symbols/smiley.svg +1 -1
- package/icons/material-symbols/sparkle.svg +1 -1
- package/icons/material-symbols/square-half-bottom.svg +1 -1
- package/icons/material-symbols/square.svg +1 -1
- package/icons/material-symbols/squares-four.svg +1 -1
- package/icons/material-symbols/sticker.svg +1 -1
- package/icons/material-symbols/storefront.svg +1 -1
- package/icons/material-symbols/sun.svg +1 -1
- package/icons/material-symbols/swatches.svg +1 -1
- package/icons/material-symbols/tag.svg +1 -1
- package/icons/material-symbols/text-aa.svg +1 -1
- package/icons/material-symbols/text-align-left.svg +1 -1
- package/icons/material-symbols/text-b.svg +1 -1
- package/icons/material-symbols/text-h-one.svg +1 -1
- package/icons/material-symbols/text-h-three.svg +1 -1
- package/icons/material-symbols/text-h-two.svg +1 -1
- package/icons/material-symbols/text-italic.svg +1 -1
- package/icons/material-symbols/text-t.svg +1 -1
- package/icons/material-symbols/ticket.svg +1 -1
- package/icons/material-symbols/toggle-right.svg +1 -1
- package/icons/material-symbols/train.svg +1 -1
- package/icons/material-symbols/trash.svg +1 -1
- package/icons/material-symbols/upload-simple.svg +1 -1
- package/icons/material-symbols/user-circle.svg +1 -1
- package/icons/material-symbols/user.svg +1 -1
- package/icons/material-symbols/users-three.svg +1 -1
- package/icons/material-symbols/users.svg +1 -1
- package/icons/material-symbols/video-camera.svg +1 -1
- package/icons/material-symbols/warning-circle.svg +1 -1
- package/icons/material-symbols/warning.svg +1 -1
- package/icons/material-symbols/wave-sine.svg +1 -1
- package/icons/material-symbols/wheelchair.svg +1 -1
- package/icons/material-symbols/wrench.svg +1 -1
- package/icons/material-symbols/x.svg +1 -1
- package/icons/phosphor/pack.json +8 -8
- package/lib/apps.mjs +142 -139
- package/lib/apps.test.d.mts +1 -0
- package/lib/apps.test.mjs +50 -0
- package/lib/blocks.mjs +90 -90
- package/lib/caseCollisions.d.mts +4 -0
- package/lib/caseCollisions.mjs +62 -0
- package/lib/caseCollisions.test.d.mts +1 -0
- package/lib/caseCollisions.test.mjs +74 -0
- package/lib/colors.ts +86 -86
- package/lib/contactBar.ts +18 -18
- package/lib/contracts.d.mts +15 -0
- package/lib/contracts.mjs +17 -0
- package/lib/cookieCategories.mjs +28 -28
- package/lib/crop.mjs +83 -83
- package/lib/csp.mjs +130 -130
- package/lib/cspSources.mjs +60 -60
- package/lib/dynamic-colors.ts +426 -426
- package/lib/git.mjs +64 -64
- package/lib/hooks.ts +51 -51
- package/lib/inline.ts +20 -20
- package/lib/license-texts/Apache-2.0.txt +190 -190
- package/lib/license-texts/BSD-2-Clause.txt +24 -24
- package/lib/license-texts/BSD-3-Clause.txt +28 -28
- package/lib/license-texts/ISC.txt +15 -15
- package/lib/license-texts/MIT.txt +21 -21
- package/lib/licenses.d.mts +1 -1
- package/lib/licenses.mjs +683 -683
- package/lib/markdown.ts +42 -42
- package/lib/motion-schemes.mjs +5 -5
- package/lib/motion.ts +131 -131
- package/lib/notice.mjs +34 -34
- package/lib/scheduled.mjs +37 -37
- package/lib/snackbar.ts +149 -149
- package/lib/status.mjs +18 -18
- package/lib/storeEntries.d.mts +18 -0
- package/lib/storeEntries.mjs +64 -0
- package/lib/storeEntries.test.d.mts +1 -0
- package/lib/storeEntries.test.mjs +71 -0
- package/lib/svg.mjs +231 -231
- package/lib/text-colors.mjs +43 -43
- package/lib/video-id.mjs +72 -72
- package/lib/video.mjs +91 -91
- package/package.json +136 -131
- package/pages/404.astro +10 -10
- package/pages/[...slug].astro +51 -51
- package/pages/_headers.txt +31 -31
- package/pages/blog/index.astro +10 -10
- package/pages/blog/kategori/[category].astro +18 -18
- package/pages/editor/code-images.json.js +25 -25
- package/pages/editor/index.astro +75 -75
- package/pages/editor/manifest.webmanifest.js +23 -23
- package/pages/editor/sw.js +33 -33
- package/pages/editor/sw.js.js +4 -4
- package/pages/editor/thumbnails.json.js +21 -21
- package/pages/editor/version.json.js +22 -22
- package/pages/headers.js +4 -4
- package/pages/index.astro +10 -10
- package/pages/ny.astro +6 -6
- package/pages/robots.txt.js +3 -3
- package/pages/rss.xml.js +20 -20
- package/scripts/app-screenshots.mjs +164 -164
- package/scripts/app-workers.mjs +6 -6
- package/scripts/bin.mjs +12 -12
- package/scripts/built-site.mjs +134 -99
- package/scripts/check-consent.mjs +113 -113
- package/scripts/check-content.mjs +151 -149
- package/scripts/check-demo.mjs +24 -24
- package/scripts/check-store.mjs +160 -0
- package/scripts/check-themes.mjs +45 -45
- package/scripts/check-worker.mjs +569 -569
- package/scripts/compare-html.mjs +81 -81
- package/scripts/declarations.mjs +10 -0
- package/scripts/declarations.test.mjs +32 -0
- package/scripts/demo-site.mjs +42 -42
- package/scripts/editor-icons.mjs +56 -56
- package/scripts/editor-roundtrip.mjs +134 -134
- package/scripts/editor-screens.mjs +101 -101
- package/scripts/git-env.mjs +9 -9
- package/scripts/icon-packs.mjs +151 -151
- package/scripts/link-counts.mjs +22 -22
- package/scripts/page-colors.mjs +42 -42
- package/scripts/releases.mjs +80 -80
- package/scripts/responsive-images.mjs +94 -94
- package/scripts/scheduled-list.mjs +15 -15
- package/scripts/theme-screenshots.mjs +88 -88
- package/scripts/types.mjs +17 -21
- package/scripts/video-thumbnails.mjs +89 -89
- package/scripts/worker-modules.mjs +34 -34
- package/site/appCookies.mjs +74 -74
- package/site/apps.ts +21 -21
- package/site/autolinks.mjs +200 -200
- package/site/blockScripts.ts +31 -31
- package/site/categories.ts +16 -16
- package/site/consent.ts +26 -26
- package/site/content.config.ts +84 -84
- package/site/content.ts +104 -104
- package/site/cookieList.ts +17 -17
- package/site/defineSite.d.mts +2 -14
- package/site/defineSite.mjs +131 -136
- package/site/directives/interact.mjs +31 -31
- package/site/editor-version.mjs +26 -26
- package/site/fill.ts +13 -13
- package/site/format.ts +11 -11
- package/site/home.ts +66 -66
- package/site/iconPacks.mjs +43 -43
- package/site/icons.mjs +605 -605
- package/site/images.mjs +157 -157
- package/site/motion.ts +13 -13
- package/site/noindex.mjs +21 -21
- package/site/pageColors.ts +110 -110
- package/site/popups.ts +98 -98
- package/site/schema.ts +189 -189
- package/site/sections.ts +3 -3
- package/site/seo.ts +28 -28
- package/site/site.ts +76 -76
- package/site/siteConfig.mjs +8 -8
- package/site/siteCsp.mjs +75 -75
- package/site/siteModules.mjs +27 -27
- package/site/standardPages.ts +59 -59
- package/site/storeTheme.d.mts +6 -0
- package/site/storeTheme.mjs +29 -0
- package/site/storeTheme.test.d.mts +1 -0
- package/site/storeTheme.test.mjs +53 -0
- package/site/testimonials.ts +48 -48
- package/site/text.ts +43 -43
- package/site/theme.mjs +483 -472
- package/site/tracking.client.ts +225 -225
- package/site/tracking.ts +9 -9
- package/src/ActionParts.tsx +205 -205
- package/src/Advanced.tsx +152 -152
- package/src/App.tsx +901 -904
- package/src/AppList.tsx +1362 -1345
- package/src/BlockDialog.tsx +360 -360
- package/src/BlockParts.tsx +652 -652
- package/src/BlockSettings.tsx +533 -533
- package/src/BrandForm.tsx +164 -164
- package/src/Colors.tsx +476 -476
- package/src/CommunicationParts.tsx +199 -199
- package/src/CompanyForm.tsx +209 -209
- package/src/Consents.tsx +175 -175
- package/src/ContainmentParts.tsx +185 -185
- package/src/Crop.tsx +152 -152
- package/src/DataForm.tsx +434 -434
- package/src/Deleted.tsx +177 -177
- package/src/EntryForm.tsx +740 -740
- package/src/FileView.tsx +30 -30
- package/src/FormFrame.tsx +237 -237
- package/src/Keywords.tsx +225 -225
- package/src/Library.tsx +1563 -1563
- package/src/Licenses.tsx +336 -336
- package/src/LinkSheet.tsx +138 -138
- package/src/MarkdownEditor.tsx +1075 -1075
- package/src/Media.tsx +677 -677
- package/src/NavigationParts.tsx +350 -350
- package/src/NavigationRestParts.tsx +247 -247
- package/src/Notifications.tsx +59 -59
- package/src/PagePicker.tsx +136 -136
- package/src/Parts.tsx +991 -991
- package/src/PartsShown.tsx +168 -168
- package/src/PickerParts.tsx +183 -183
- package/src/Redirects.tsx +450 -450
- package/src/Screen.tsx +184 -184
- package/src/SectionsField.tsx +65 -65
- package/src/SelectionParts.tsx +134 -134
- package/src/SeoScores.tsx +184 -184
- package/src/Sheet.tsx +35 -35
- package/src/ThemeStore.tsx +376 -376
- package/src/Tokens.tsx +346 -346
- package/src/Versions.tsx +214 -214
- package/src/addresses.ts +75 -75
- package/src/allIcons.ts +7 -7
- package/src/appFiles.ts +29 -29
- package/src/apps.ts +281 -281
- package/src/ask.tsx +123 -123
- package/src/blocks.ts +251 -251
- package/src/brand.ts +153 -153
- package/src/cache.ts +42 -42
- package/src/check.ts +285 -285
- package/src/checkSite.ts +256 -256
- package/src/{consents.ts → consentData.ts} +26 -26
- package/src/cookieList.ts +70 -70
- package/src/countries.ts +59 -59
- package/src/deploy.ts +155 -155
- package/src/editor.css +602 -602
- package/src/examples.ts +85 -85
- package/src/fields.tsx +942 -942
- package/src/frontmatter.mjs +42 -42
- package/src/github.ts +376 -376
- package/src/i18n/da-DK/advanced.ts +28 -28
- package/src/i18n/da-DK/app.ts +71 -71
- package/src/i18n/da-DK/apps.ts +90 -90
- package/src/i18n/da-DK/blockSettings.ts +38 -38
- package/src/i18n/da-DK/blocks.ts +408 -408
- package/src/i18n/da-DK/check.ts +25 -25
- package/src/i18n/da-DK/colors.ts +64 -64
- package/src/i18n/da-DK/common.ts +118 -118
- package/src/i18n/da-DK/company.ts +24 -24
- package/src/i18n/da-DK/consents.ts +23 -23
- package/src/i18n/da-DK/forms.ts +116 -116
- package/src/i18n/da-DK/history.ts +35 -35
- package/src/i18n/da-DK/index.ts +49 -49
- package/src/i18n/da-DK/keywords.ts +19 -19
- package/src/i18n/da-DK/library.ts +135 -135
- package/src/i18n/da-DK/licenses.ts +25 -25
- package/src/i18n/da-DK/media.ts +79 -79
- package/src/i18n/da-DK/parts.ts +696 -696
- package/src/i18n/da-DK/preview.ts +13 -13
- package/src/i18n/da-DK/redirects.ts +51 -51
- package/src/i18n/da-DK/seo.ts +20 -20
- package/src/i18n/da-DK/text.ts +35 -35
- package/src/i18n/da-DK/theme.ts +41 -41
- package/src/i18n/en-US/advanced.ts +32 -32
- package/src/i18n/en-US/app.ts +84 -84
- package/src/i18n/en-US/apps.ts +134 -134
- package/src/i18n/en-US/blockSettings.ts +48 -48
- package/src/i18n/en-US/blocks.ts +441 -441
- package/src/i18n/en-US/check.ts +31 -31
- package/src/i18n/en-US/colors.ts +82 -82
- package/src/i18n/en-US/common.ts +144 -144
- package/src/i18n/en-US/company.ts +25 -25
- package/src/i18n/en-US/consents.ts +25 -25
- package/src/i18n/en-US/forms.ts +145 -145
- package/src/i18n/en-US/history.ts +43 -43
- package/src/i18n/en-US/index.ts +51 -51
- package/src/i18n/en-US/keywords.ts +24 -24
- package/src/i18n/en-US/library.ts +176 -176
- package/src/i18n/en-US/licenses.ts +36 -36
- package/src/i18n/en-US/media.ts +80 -80
- package/src/i18n/en-US/parts.ts +718 -718
- package/src/i18n/en-US/preview.ts +15 -15
- package/src/i18n/en-US/redirects.ts +66 -66
- package/src/i18n/en-US/seo.ts +26 -26
- package/src/i18n/en-US/text.ts +41 -41
- package/src/i18n/en-US/theme.ts +41 -41
- package/src/i18n/index.ts +124 -124
- package/src/icon.tsx +160 -160
- package/src/iconPacks.ts +89 -89
- package/src/images.ts +163 -163
- package/src/{licenses.ts → licenseData.ts} +79 -79
- package/src/markdown.mjs +204 -204
- package/src/nav.ts +68 -68
- package/src/notFound.ts +28 -28
- package/src/{notifications.ts → notificationData.ts} +223 -223
- package/src/pagePreview.tsx +204 -204
- package/src/r2Caching.ts +55 -55
- package/src/{redirects.ts → redirectData.ts} +149 -149
- package/src/registry.tsx +188 -188
- package/src/schema.ts +417 -417
- package/src/sections.mjs +303 -303
- package/src/seo.ts +333 -333
- package/src/shared.ts +44 -44
- package/src/sidebar.ts +31 -31
- package/src/site.ts +317 -317
- package/src/standard/Block.astro +19 -19
- package/src/standard/BlockSite.astro +18 -18
- package/src/standard/accordion/index.tsx +47 -47
- package/src/standard/accordion/load.ts +23 -23
- package/src/standard/accordion/shared.ts +15 -15
- package/src/standard/accordion/view.ts +32 -32
- package/src/standard/buttons/fields.ts +98 -98
- package/src/standard/buttons/index.tsx +23 -23
- package/src/standard/buttons/load.ts +34 -34
- package/src/standard/buttons/shared.ts +12 -12
- package/src/standard/buttons/view.ts +30 -30
- package/src/standard/cards/index.tsx +71 -71
- package/src/standard/cards/load.ts +17 -17
- package/src/standard/cards/shared.ts +27 -27
- package/src/standard/cards/view.ts +29 -29
- package/src/standard/checklist/index.tsx +27 -27
- package/src/standard/checklist/load.ts +5 -5
- package/src/standard/checklist/view.ts +13 -13
- package/src/standard/cookies/index.tsx +17 -17
- package/src/standard/cookies/list.ts +56 -56
- package/src/standard/cookies/load.ts +11 -11
- package/src/standard/cookies/shared.ts +20 -20
- package/src/standard/cookies/view.ts +28 -28
- package/src/standard/faq/index.tsx +29 -29
- package/src/standard/faq/load.ts +14 -14
- package/src/standard/faq/view.ts +21 -21
- package/src/standard/head.ts +23 -23
- package/src/standard/hero/fields.ts +48 -48
- package/src/standard/hero/index.tsx +57 -57
- package/src/standard/hero/load.ts +23 -23
- package/src/standard/hero/view.ts +38 -38
- package/src/standard/links/index.tsx +41 -41
- package/src/standard/links/load.ts +17 -17
- package/src/standard/links/view.ts +25 -25
- package/src/standard/list/index.tsx +50 -50
- package/src/standard/list/load.ts +5 -5
- package/src/standard/list/view.ts +18 -18
- package/src/standard/load.ts +7 -7
- package/src/standard/notice/index.tsx +30 -30
- package/src/standard/notice/load.ts +16 -16
- package/src/standard/notice/view.ts +10 -10
- package/src/standard/points/index.tsx +42 -42
- package/src/standard/points/load.ts +5 -5
- package/src/standard/points/view.ts +12 -12
- package/src/standard/posts/index.tsx +132 -132
- package/src/standard/posts/load.ts +36 -36
- package/src/standard/posts/shared.ts +21 -21
- package/src/standard/posts/view.ts +63 -63
- package/src/standard/pricecards/index.tsx +57 -57
- package/src/standard/pricecards/load.ts +11 -11
- package/src/standard/pricecards/view.ts +50 -50
- package/src/standard/sharedTexts.ts +6 -6
- package/src/standard/site.ts +124 -124
- package/src/standard/siteLooks.ts +19 -19
- package/src/standard/sites.ts +13 -13
- package/src/standard/steps/index.tsx +28 -28
- package/src/standard/steps/load.ts +5 -5
- package/src/standard/steps/view.ts +11 -11
- package/src/standard/testimonials/index.tsx +87 -87
- package/src/standard/testimonials/list.ts +43 -43
- package/src/standard/testimonials/load.ts +58 -58
- package/src/standard/testimonials/shared.ts +13 -13
- package/src/standard/testimonials/view.ts +76 -76
- package/src/standard/themeBlocks.ts +13 -13
- package/src/standard/video/index.tsx +23 -23
- package/src/standard/video/load.ts +10 -10
- package/src/standard/video/view.ts +42 -42
- package/src/standard/view.tsx +105 -105
- package/src/standard/views.ts +37 -37
- package/src/store.ts +479 -499
- package/src/theme.ts +90 -90
- package/src/themeUi.ts +97 -97
- package/src/themes.ts +91 -91
- package/src/ui.tsx +3402 -3402
- package/src/virtual.d.ts +5 -5
- package/src/when.ts +22 -22
- package/starter/.githooks/pre-push +4 -4
- package/starter/.nvmrc +1 -1
- package/starter/.prettierignore +11 -11
- package/starter/.prettierrc.json +7 -7
- package/starter/README.md +27 -26
- package/starter/astro.config.mjs +5 -5
- package/starter/package.json +67 -67
- package/starter/public/_redirects +1 -1
- package/starter/public/favicon.svg +1 -1
- package/starter/public/logo.svg +1 -1
- package/starter/src/content/pages/blog.md +8 -8
- package/starter/src/content/pages/forside.md +9 -9
- package/starter/src/content/pages/kontakt.md +7 -7
- package/starter/src/content/pages/privatlivspolitik.md +9 -9
- package/starter/src/content/pages/siden-findes-ikke.md +7 -7
- package/starter/src/content.config.ts +2 -2
- package/starter/src/data/apps.json +1 -1
- package/starter/src/data/block-settings.json +3 -3
- package/starter/src/data/blocks.json +1 -1
- package/starter/src/data/booking.json +6 -6
- package/starter/src/data/colors.json +70 -70
- package/starter/src/data/contact.json +8 -8
- package/starter/src/data/cookies.json +21 -21
- package/starter/src/data/csp.json +1 -1
- package/starter/src/data/footer.json +15 -15
- package/starter/src/data/internal-links.json +4 -4
- package/starter/src/data/menu.json +4 -4
- package/starter/src/data/mobile-menu.json +4 -4
- package/starter/src/data/old-addresses.json +1 -1
- package/starter/src/data/redirects.json +1 -1
- package/starter/src/data/standard-pages.json +8 -8
- package/starter/src/data/theme.json +1 -1
- package/starter/src/env.d.ts +2 -2
- package/starter/src/site/config.ts +13 -13
- package/starter/src/site/worker.js +14 -14
- package/starter/tsconfig.json +17 -17
- package/starter/worker/apps.js +6 -6
- package/starter/wrangler.jsonc +39 -39
- package/theme/LICENSE +21 -21
- package/theme/blocks/ArrowLink.tsx +14 -14
- package/theme/blocks/BlockHead.tsx +26 -26
- package/theme/blocks/Panel.tsx +32 -32
- package/theme/blocks/Person.tsx +26 -26
- package/theme/blocks/accordion/PageRow.tsx +25 -25
- package/theme/blocks/accordion/View.tsx +17 -17
- package/theme/blocks/buttons/Buttons.tsx +28 -28
- package/theme/blocks/buttons/View.tsx +12 -12
- package/theme/blocks/cards/LinkCards.tsx +72 -72
- package/theme/blocks/cards/View.tsx +20 -20
- package/theme/blocks/checklist/Checks.tsx +15 -15
- package/theme/blocks/checklist/View.tsx +14 -14
- package/theme/blocks/cookies/View.tsx +36 -36
- package/theme/blocks/faq/Accordion.tsx +34 -34
- package/theme/blocks/faq/View.tsx +16 -16
- package/theme/blocks/faq/script.ts +56 -56
- package/theme/blocks/hero/View.tsx +44 -44
- package/theme/blocks/links/LinkGroups.tsx +24 -24
- package/theme/blocks/links/View.tsx +17 -17
- package/theme/blocks/list/Rows.tsx +24 -24
- package/theme/blocks/list/View.tsx +14 -14
- package/theme/blocks/notice/View.tsx +13 -13
- package/theme/blocks/points/PointList.tsx +34 -34
- package/theme/blocks/points/View.tsx +14 -14
- package/theme/blocks/posts/View.tsx +26 -26
- package/theme/blocks/pricecards/View.tsx +40 -40
- package/theme/blocks/steps/StepList.tsx +23 -23
- package/theme/blocks/steps/View.tsx +14 -14
- package/theme/blocks/testimonials/List.tsx +46 -46
- package/theme/blocks/testimonials/Slider.tsx +44 -44
- package/theme/blocks/testimonials/Testimonial.tsx +124 -124
- package/theme/blocks/testimonials/View.tsx +21 -21
- package/theme/blocks/testimonials/script.ts +52 -52
- package/theme/blocks/video/View.tsx +41 -41
- package/theme/components/ActionBar.astro +63 -63
- package/theme/components/AppSlot.astro +21 -21
- package/theme/components/ArrowLink.tsx +21 -21
- package/theme/components/BlogIndex.astro +48 -48
- package/theme/components/BlogPosts.astro +18 -18
- package/theme/components/BlogPosts.tsx +45 -45
- package/theme/components/BookButton.tsx +22 -22
- package/theme/components/Container.astro +11 -11
- package/theme/components/CookieConsent.astro +121 -121
- package/theme/components/EndBlock.astro +21 -21
- package/theme/components/FontPreload.astro +6 -6
- package/theme/components/Footer.astro +85 -85
- package/theme/components/Header.astro +186 -186
- package/theme/components/Icon.astro +16 -16
- package/theme/components/Img.astro +29 -29
- package/theme/components/Img.tsx +33 -33
- package/theme/components/Inline.astro +11 -11
- package/theme/components/Logo.astro +23 -23
- package/theme/components/LogoMark.astro +10 -10
- package/theme/components/Markdown.astro +17 -17
- package/theme/components/MobileMenu.tsx +224 -224
- package/theme/components/MobileNav.astro +33 -33
- package/theme/components/PageHeader.astro +22 -22
- package/theme/components/PageSection.astro +24 -24
- package/theme/components/PhoneButton.tsx +11 -11
- package/theme/components/Popup.astro +145 -145
- package/theme/components/PopupButton.tsx +24 -24
- package/theme/components/PopupView.tsx +48 -48
- package/theme/components/PostList.tsx +58 -58
- package/theme/components/PostMeta.tsx +17 -17
- package/theme/components/RichText.astro +28 -28
- package/theme/components/Section.astro +29 -29
- package/theme/components/SectionHeading.tsx +8 -8
- package/theme/components/TextSection.astro +16 -16
- package/theme/components/home/PageBlock.astro +19 -19
- package/theme/components/home/Text.astro +13 -13
- package/theme/components/loadPopup.ts +22 -22
- package/theme/components/loadPosts.ts +16 -16
- package/theme/components/posts.ts +15 -15
- package/theme/editor/looks.mjs +7 -7
- package/theme/editor/previews.tsx +56 -56
- package/theme/layouts/Base.astro +273 -273
- package/theme/layouts/PageLayout.astro +126 -126
- package/theme/layouts/PostLayout.astro +137 -137
- package/theme/scripts/motion.ts +29 -29
- package/theme/styles/base.css +320 -320
- package/theme/styles/blocks.css +1808 -1808
- package/theme/styles/components.css +206 -206
- package/theme/styles/global.css +1302 -1302
- package/theme/styles/ui.css +6544 -6544
- package/theme/templates/Blog.astro +38 -38
- package/theme/templates/Category.astro +19 -19
- package/theme/templates/Home.astro +36 -36
- package/theme/templates/New.astro +68 -68
- package/theme/templates/NotFound.astro +117 -117
- package/theme/theme.json +28 -28
- package/theme/ui/Badge.tsx +45 -45
- package/theme/ui/BottomSheet.tsx +148 -148
- package/theme/ui/Button.tsx +79 -79
- package/theme/ui/ButtonGroup.tsx +31 -31
- package/theme/ui/Card.tsx +45 -45
- package/theme/ui/Carousel.tsx +124 -124
- package/theme/ui/Checkbox.tsx +59 -59
- package/theme/ui/Chip.tsx +101 -101
- package/theme/ui/ChipSet.tsx +27 -27
- package/theme/ui/DatePicker.tsx +149 -149
- package/theme/ui/DatePickerContainer.tsx +316 -316
- package/theme/ui/Dialog.tsx +100 -100
- package/theme/ui/Divider.tsx +27 -27
- package/theme/ui/ExposedDropdownMenu.tsx +77 -77
- package/theme/ui/Fab.tsx +88 -88
- package/theme/ui/FabMenu.tsx +67 -67
- package/theme/ui/IconButton.tsx +78 -78
- package/theme/ui/List.tsx +287 -287
- package/theme/ui/LoadingIndicator.tsx +29 -29
- package/theme/ui/Menu.tsx +278 -278
- package/theme/ui/NavigationBar.tsx +62 -62
- package/theme/ui/NavigationDrawer.tsx +80 -80
- package/theme/ui/NavigationRail.tsx +154 -154
- package/theme/ui/ProgressIndicator.tsx +162 -162
- package/theme/ui/RadioButton.tsx +50 -50
- package/theme/ui/Search.tsx +129 -129
- package/theme/ui/SegmentedButton.tsx +49 -49
- package/theme/ui/SideSheet.tsx +54 -54
- package/theme/ui/Slider.tsx +155 -155
- package/theme/ui/Snackbar.tsx +67 -67
- package/theme/ui/SplitButton.tsx +67 -67
- package/theme/ui/Switch.tsx +60 -60
- package/theme/ui/Tabs.tsx +114 -114
- package/theme/ui/TextField.tsx +278 -278
- package/theme/ui/TimePicker.tsx +128 -128
- package/theme/ui/TimePickerContainer.tsx +234 -234
- package/theme/ui/Toolbar.tsx +67 -67
- package/theme/ui/Tooltip.tsx +58 -58
- package/theme/ui/TopAppBar.tsx +77 -77
- package/theme/ui/bottomSheet.script.ts +8 -8
- package/theme/ui/{bottomSheet.ts → bottomSheetControl.ts} +211 -211
- package/theme/ui/carousel.script.ts +28 -28
- package/theme/ui/carouselLayout.ts +229 -229
- package/theme/ui/checkbox.script.ts +8 -8
- package/theme/ui/datePicker.script.ts +302 -302
- package/theme/ui/dates.ts +185 -185
- package/theme/ui/{dialog.ts → dialogControl.ts} +48 -48
- package/theme/ui/dropdownMenu.script.ts +166 -166
- package/theme/ui/fabMenu.script.ts +57 -57
- package/theme/ui/navigationRail.script.ts +47 -47
- package/theme/ui/ripple.script.ts +159 -159
- package/theme/ui/search.script.ts +92 -92
- package/theme/ui/{sideSheet.ts → sideSheetControl.ts} +48 -48
- package/theme/ui/slider.script.ts +12 -12
- package/theme/ui/sliderUpdate.ts +52 -52
- package/theme/ui/snackbar.script.ts +16 -16
- package/theme/ui/splitButton.script.ts +63 -63
- package/theme/ui/tabs.script.ts +48 -48
- package/theme/ui/textField.script.ts +17 -17
- package/theme/ui/textFieldUpdate.ts +44 -44
- package/theme/ui/timePicker.script.ts +248 -248
- package/theme/ui/toolbar.script.ts +43 -43
- package/theme/ui/tooltip.script.ts +68 -68
- package/worker/consent.js +141 -141
- package/worker/editor-github.js +167 -167
- package/worker/editor-host.js +74 -74
- package/worker/files.js +401 -401
- package/worker/github.js +36 -36
- package/worker/index.js +188 -184
- package/worker/not-found.js +97 -97
- package/worker/oauth.js +95 -95
- package/worker/publish.js +52 -52
- package/worker/push.js +270 -270
- package/worker/r2-status.js +50 -50
- package/worker/session.js +58 -58
- package/worker/store.js +46 -0
package/src/i18n/index.ts
CHANGED
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
// The editor's language: its own texts (the buttons, the messages, the lines on the cards) and how it
|
|
2
|
-
// writes dates, numbers and sorts, in one language, by its code with the country (BCP 47: da-DK,
|
|
3
|
-
// en-US), used as it is with Intl. The language is the one picked on "Konto", else the browser's (the
|
|
4
|
-
// same code, else the same language: en-GB is en-US), else the site's (config.locale). Picked once when
|
|
5
|
-
// the editor opens; a new choice reloads it (setLocale). Away from a browser (the check before the
|
|
6
|
-
// build, checkSite.ts) it is the site's.
|
|
7
|
-
// What is the site's own (src/site/, src/apps/<app>/blocks/: the fields, the start screen's groups, the blocks'
|
|
8
|
-
// names) is written in the site's language, and shown in the editor's by the site's own texts
|
|
9
|
-
// (siteText, @site/texts). The blocks' drawings and the commits (siteT) stay in the site's
|
|
10
|
-
// language, so the site looks as it is, and the history is in one language, whoever saved.
|
|
11
|
-
// A language is a folder with the texts by the part of the editor they are in (en-US/index.ts). English is the
|
|
12
|
-
// reference: its texts are written first (Messages is its type), and every other language translates them; a new
|
|
13
|
-
// one is a copy of da-DK with its texts translated from en-US, added to `messages`. TypeScript says when a
|
|
14
|
-
// translation is missing.
|
|
15
|
-
import { config } from '@site/config';
|
|
16
|
-
import { appTexts as appFiles, texts } from '@site/texts';
|
|
17
|
-
import { daDK } from './da-DK';
|
|
18
|
-
import { enUS, type Messages } from './en-US';
|
|
19
|
-
|
|
20
|
-
export type { Messages };
|
|
21
|
-
|
|
22
|
-
export const messages = { 'da-DK': daDK, 'en-US': enUS } satisfies Record<string, Messages>;
|
|
23
|
-
export type Locale = keyof typeof messages;
|
|
24
|
-
export const locales = Object.keys(messages) as Locale[];
|
|
25
|
-
|
|
26
|
-
/** A code as it is written ("da-dk" as "da-DK"), or undefined when it is not one. */
|
|
27
|
-
function canonical(code: string): string | undefined {
|
|
28
|
-
try {
|
|
29
|
-
return Intl.getCanonicalLocales(code)[0];
|
|
30
|
-
} catch {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const language = (code: string) => code.split('-')[0];
|
|
36
|
-
|
|
37
|
-
/** The editor's language for codes, the first that fits: the same code, else the same language. */
|
|
38
|
-
export function matchLocale(codes: readonly (string | null | undefined)[]): Locale | undefined {
|
|
39
|
-
const known = codes.flatMap((c) => (c && canonical(c)) || []);
|
|
40
|
-
return (
|
|
41
|
-
known.map((c) => locales.find((l) => l === c)).find(Boolean) ??
|
|
42
|
-
known.map((c) => locales.find((l) => language(l) === language(c))).find(Boolean)
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** The site's language, for what is the site's (the commits); da-DK when the editor does not have it. */
|
|
47
|
-
export const siteLocale: Locale = matchLocale([config.locale]) ?? 'da-DK';
|
|
48
|
-
|
|
49
|
-
const KEY = 'editor-locale';
|
|
50
|
-
const inBrowser = typeof window !== 'undefined' && typeof navigator !== 'undefined';
|
|
51
|
-
|
|
52
|
-
/** The language picked on "Konto" in this browser, or 'auto' (the browser's, else the site's). */
|
|
53
|
-
export function savedLocale(): Locale | 'auto' {
|
|
54
|
-
try {
|
|
55
|
-
return matchLocale([localStorage.getItem(KEY)]) ?? 'auto';
|
|
56
|
-
} catch {
|
|
57
|
-
return 'auto';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Picks the language in this browser ('auto': none) and opens the editor again in it. */
|
|
62
|
-
export function setLocale(pick: Locale | 'auto') {
|
|
63
|
-
try {
|
|
64
|
-
if (pick === 'auto') localStorage.removeItem(KEY);
|
|
65
|
-
else localStorage.setItem(KEY, pick);
|
|
66
|
-
} catch {}
|
|
67
|
-
location.reload();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** The language the browser asks for, when the editor has it. */
|
|
71
|
-
export const browserLocale = (): Locale | undefined => (inBrowser ? matchLocale(navigator.languages ?? [navigator.language]) : undefined);
|
|
72
|
-
|
|
73
|
-
const saved = inBrowser ? savedLocale() : 'auto';
|
|
74
|
-
|
|
75
|
-
/** The editor's language, and its texts. */
|
|
76
|
-
export const locale: Locale = (saved !== 'auto' && saved) || browserLocale() || siteLocale;
|
|
77
|
-
export const t: Messages = messages[locale];
|
|
78
|
-
|
|
79
|
-
/** The texts in the site's language: the commits. */
|
|
80
|
-
export const siteT: Messages = messages[siteLocale];
|
|
81
|
-
|
|
82
|
-
/** The language the package's standard parts (defaults/) are written in, whatever the site's language is. */
|
|
83
|
-
export const DEFAULTS_LOCALE: Locale = 'da-DK';
|
|
84
|
-
|
|
85
|
-
/** Whether the site's own texts (written in the site's language) or the package's standard parts (written in
|
|
86
|
-
* DEFAULTS_LOCALE) may be shown in another language than they are written in. */
|
|
87
|
-
export const translatingSite = locale !== siteLocale || locale !== DEFAULTS_LOCALE;
|
|
88
|
-
|
|
89
|
-
/** The site's own texts in the editor's other languages: by language, by the text as it is written. */
|
|
90
|
-
export type Texts = Partial<Record<string, Record<string, string>>>;
|
|
91
|
-
|
|
92
|
-
/** The texts of each app and its blocks (src/apps/<app>/texts.ts, blocks/<type>/texts.ts), by the app's id or
|
|
93
|
-
* by "blocks/" and the block's type (an app and its block can have the same name, as MobilePay's). */
|
|
94
|
-
export const appTexts: Record<string, Texts> = Object.fromEntries(
|
|
95
|
-
Object.entries(appFiles).map(([path, m]) => {
|
|
96
|
-
const [folder, name] = path.split('/').slice(-3, -1);
|
|
97
|
-
return [folder === 'blocks' ? `blocks/${name}` : name!, m.texts];
|
|
98
|
-
}),
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
const own: Record<string, string> = translatingSite
|
|
102
|
-
? Object.assign({}, ...Object.values(appTexts).map((a) => a[locale]), (texts as Texts)[locale])
|
|
103
|
-
: {};
|
|
104
|
-
|
|
105
|
-
/** One of the site's own texts (src/site/, src/themes/<theme>/blocks/, src/apps/), written in the site's language, in the editor's:
|
|
106
|
-
* its translation in @site/texts or in a block's texts.ts, else as it is written. `values` fill in
|
|
107
|
-
* its {name}s, after. */
|
|
108
|
-
export function siteText(text: string, values?: Record<string, string | number>): string {
|
|
109
|
-
const said = own[text] ?? text;
|
|
110
|
-
return values ? said.replace(/\{(\w+)\}/g, (all, name: string) => (name in values ? String(values[name]) : all)) : said;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/** A language by its own name ("Dansk (Danmark)", "English (United States)"), or by its name in another
|
|
114
|
-
* (`inLanguage`: "Danish (Denmark)" in en-US). */
|
|
115
|
-
export function localeName(code: Locale, inLanguage: Locale = code): string {
|
|
116
|
-
try {
|
|
117
|
-
const name = new Intl.DisplayNames([inLanguage], { type: 'language', languageDisplay: 'standard' }).of(code) ?? code;
|
|
118
|
-
return name.charAt(0).toLocaleUpperCase(inLanguage) + name.slice(1);
|
|
119
|
-
} catch {
|
|
120
|
-
return code;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (typeof document !== 'undefined') document.documentElement.lang = locale;
|
|
1
|
+
// The editor's language: its own texts (the buttons, the messages, the lines on the cards) and how it
|
|
2
|
+
// writes dates, numbers and sorts, in one language, by its code with the country (BCP 47: da-DK,
|
|
3
|
+
// en-US), used as it is with Intl. The language is the one picked on "Konto", else the browser's (the
|
|
4
|
+
// same code, else the same language: en-GB is en-US), else the site's (config.locale). Picked once when
|
|
5
|
+
// the editor opens; a new choice reloads it (setLocale). Away from a browser (the check before the
|
|
6
|
+
// build, checkSite.ts) it is the site's.
|
|
7
|
+
// What is the site's own (src/site/, src/apps/<app>/blocks/: the fields, the start screen's groups, the blocks'
|
|
8
|
+
// names) is written in the site's language, and shown in the editor's by the site's own texts
|
|
9
|
+
// (siteText, @site/texts). The blocks' drawings and the commits (siteT) stay in the site's
|
|
10
|
+
// language, so the site looks as it is, and the history is in one language, whoever saved.
|
|
11
|
+
// A language is a folder with the texts by the part of the editor they are in (en-US/index.ts). English is the
|
|
12
|
+
// reference: its texts are written first (Messages is its type), and every other language translates them; a new
|
|
13
|
+
// one is a copy of da-DK with its texts translated from en-US, added to `messages`. TypeScript says when a
|
|
14
|
+
// translation is missing.
|
|
15
|
+
import { config } from '@site/config';
|
|
16
|
+
import { appTexts as appFiles, texts } from '@site/texts';
|
|
17
|
+
import { daDK } from './da-DK';
|
|
18
|
+
import { enUS, type Messages } from './en-US';
|
|
19
|
+
|
|
20
|
+
export type { Messages };
|
|
21
|
+
|
|
22
|
+
export const messages = { 'da-DK': daDK, 'en-US': enUS } satisfies Record<string, Messages>;
|
|
23
|
+
export type Locale = keyof typeof messages;
|
|
24
|
+
export const locales = Object.keys(messages) as Locale[];
|
|
25
|
+
|
|
26
|
+
/** A code as it is written ("da-dk" as "da-DK"), or undefined when it is not one. */
|
|
27
|
+
function canonical(code: string): string | undefined {
|
|
28
|
+
try {
|
|
29
|
+
return Intl.getCanonicalLocales(code)[0];
|
|
30
|
+
} catch {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const language = (code: string) => code.split('-')[0];
|
|
36
|
+
|
|
37
|
+
/** The editor's language for codes, the first that fits: the same code, else the same language. */
|
|
38
|
+
export function matchLocale(codes: readonly (string | null | undefined)[]): Locale | undefined {
|
|
39
|
+
const known = codes.flatMap((c) => (c && canonical(c)) || []);
|
|
40
|
+
return (
|
|
41
|
+
known.map((c) => locales.find((l) => l === c)).find(Boolean) ??
|
|
42
|
+
known.map((c) => locales.find((l) => language(l) === language(c))).find(Boolean)
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The site's language, for what is the site's (the commits); da-DK when the editor does not have it. */
|
|
47
|
+
export const siteLocale: Locale = matchLocale([config.locale]) ?? 'da-DK';
|
|
48
|
+
|
|
49
|
+
const KEY = 'editor-locale';
|
|
50
|
+
const inBrowser = typeof window !== 'undefined' && typeof navigator !== 'undefined';
|
|
51
|
+
|
|
52
|
+
/** The language picked on "Konto" in this browser, or 'auto' (the browser's, else the site's). */
|
|
53
|
+
export function savedLocale(): Locale | 'auto' {
|
|
54
|
+
try {
|
|
55
|
+
return matchLocale([localStorage.getItem(KEY)]) ?? 'auto';
|
|
56
|
+
} catch {
|
|
57
|
+
return 'auto';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Picks the language in this browser ('auto': none) and opens the editor again in it. */
|
|
62
|
+
export function setLocale(pick: Locale | 'auto') {
|
|
63
|
+
try {
|
|
64
|
+
if (pick === 'auto') localStorage.removeItem(KEY);
|
|
65
|
+
else localStorage.setItem(KEY, pick);
|
|
66
|
+
} catch {}
|
|
67
|
+
location.reload();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The language the browser asks for, when the editor has it. */
|
|
71
|
+
export const browserLocale = (): Locale | undefined => (inBrowser ? matchLocale(navigator.languages ?? [navigator.language]) : undefined);
|
|
72
|
+
|
|
73
|
+
const saved = inBrowser ? savedLocale() : 'auto';
|
|
74
|
+
|
|
75
|
+
/** The editor's language, and its texts. */
|
|
76
|
+
export const locale: Locale = (saved !== 'auto' && saved) || browserLocale() || siteLocale;
|
|
77
|
+
export const t: Messages = messages[locale];
|
|
78
|
+
|
|
79
|
+
/** The texts in the site's language: the commits. */
|
|
80
|
+
export const siteT: Messages = messages[siteLocale];
|
|
81
|
+
|
|
82
|
+
/** The language the package's standard parts (defaults/) are written in, whatever the site's language is. */
|
|
83
|
+
export const DEFAULTS_LOCALE: Locale = 'da-DK';
|
|
84
|
+
|
|
85
|
+
/** Whether the site's own texts (written in the site's language) or the package's standard parts (written in
|
|
86
|
+
* DEFAULTS_LOCALE) may be shown in another language than they are written in. */
|
|
87
|
+
export const translatingSite = locale !== siteLocale || locale !== DEFAULTS_LOCALE;
|
|
88
|
+
|
|
89
|
+
/** The site's own texts in the editor's other languages: by language, by the text as it is written. */
|
|
90
|
+
export type Texts = Partial<Record<string, Record<string, string>>>;
|
|
91
|
+
|
|
92
|
+
/** The texts of each app and its blocks (src/apps/<app>/texts.ts, blocks/<type>/texts.ts), by the app's id or
|
|
93
|
+
* by "blocks/" and the block's type (an app and its block can have the same name, as MobilePay's). */
|
|
94
|
+
export const appTexts: Record<string, Texts> = Object.fromEntries(
|
|
95
|
+
Object.entries(appFiles).map(([path, m]) => {
|
|
96
|
+
const [folder, name] = path.split('/').slice(-3, -1);
|
|
97
|
+
return [folder === 'blocks' ? `blocks/${name}` : name!, m.texts];
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const own: Record<string, string> = translatingSite
|
|
102
|
+
? Object.assign({}, ...Object.values(appTexts).map((a) => a[locale]), (texts as Texts)[locale])
|
|
103
|
+
: {};
|
|
104
|
+
|
|
105
|
+
/** One of the site's own texts (src/site/, src/themes/<theme>/blocks/, src/apps/), written in the site's language, in the editor's:
|
|
106
|
+
* its translation in @site/texts or in a block's texts.ts, else as it is written. `values` fill in
|
|
107
|
+
* its {name}s, after. */
|
|
108
|
+
export function siteText(text: string, values?: Record<string, string | number>): string {
|
|
109
|
+
const said = own[text] ?? text;
|
|
110
|
+
return values ? said.replace(/\{(\w+)\}/g, (all, name: string) => (name in values ? String(values[name]) : all)) : said;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** A language by its own name ("Dansk (Danmark)", "English (United States)"), or by its name in another
|
|
114
|
+
* (`inLanguage`: "Danish (Denmark)" in en-US). */
|
|
115
|
+
export function localeName(code: Locale, inLanguage: Locale = code): string {
|
|
116
|
+
try {
|
|
117
|
+
const name = new Intl.DisplayNames([inLanguage], { type: 'language', languageDisplay: 'standard' }).of(code) ?? code;
|
|
118
|
+
return name.charAt(0).toLocaleUpperCase(inLanguage) + name.slice(1);
|
|
119
|
+
} catch {
|
|
120
|
+
return code;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (typeof document !== 'undefined') document.documentElement.lang = locale;
|
package/src/icon.tsx
CHANGED
|
@@ -1,160 +1,160 @@
|
|
|
1
|
-
// Every icon the site draws, on the site and in the editor alike, by its name: Phosphor's (regular, and a filled one as
|
|
2
|
-
// `<name>-fill`), which the site's build puts the theme's own in place of (its icons/<name>.svg, else the icon pack in
|
|
3
|
-
// use's, packages/editor/site/iconPacks.mjs: themePlugin in packages/editor/site/theme.mjs, which answers the imports below with them). The names are Phosphor's, as
|
|
4
|
-
// the content stores them (a card's `icon: certificate`), so a theme without one still draws it.
|
|
5
|
-
// Phosphor's here are those the site draws: the blocks' (src/themes/<theme>/blocks/, src/apps/<app>/blocks/), the
|
|
6
|
-
// theme's parts' (Icon.astro, MobileMenu.tsx …) and those to pick from (iconNames, and `icons` in collections.ts,
|
|
7
|
-
// shown as icons by fields.tsx). A name that is not among them is drawn as MISSING, the question mark, marked with
|
|
8
|
-
// data-icon-missing (its name), which check:screens finds on the built site's pages and the editor's screens.
|
|
9
|
-
import { cloneElement, isValidElement, useEffect, useState, type ReactElement } from 'react';
|
|
10
|
-
import { svgParts } from '../lib/svg.mjs';
|
|
11
|
-
|
|
12
|
-
const PHOSPHOR = '/node_modules/@phosphor-icons/core/assets/';
|
|
13
|
-
const regular = import.meta.glob<string>(
|
|
14
|
-
'/node_modules/@phosphor-icons/core/assets/regular/{arrow-left,arrow-right,arrow-square-out,arrow-up-right,bank,bicycle,book-open,book-open-text,bus,calendar-blank,car,caret-down,caret-left,caret-right,certificate,chats,check,clock,coffee,cookie,copy,device-mobile,door-open,download-simple,envelope-simple,eye,eye-slash,flower-lotus,graduation-cap,hand-heart,handshake,heart,house,info,keyboard,leaf,lifebuoy,lightbulb,list,magnifying-glass,map-pin,map-trifold,medal,minus,moon,pencil-simple,phone,question,sun,ticket,train,trash,user,users,users-three,video-camera,warning-circle,wheelchair,x}.svg',
|
|
15
|
-
{ query: '?raw', import: 'default', eager: true },
|
|
16
|
-
);
|
|
17
|
-
// The filled ones ("Video": its play button).
|
|
18
|
-
const fills = import.meta.glob<string>('/node_modules/@phosphor-icons/core/assets/fill/{play-fill}.svg', {
|
|
19
|
-
query: '?raw',
|
|
20
|
-
import: 'default',
|
|
21
|
-
eager: true,
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
/** The icon drawn for one that is not found (a name the site does not draw, one Phosphor does not have): a question
|
|
25
|
-
* mark, the icon pack's as the others. */
|
|
26
|
-
export const MISSING = 'question';
|
|
27
|
-
|
|
28
|
-
/** An icon's SVG file by its name: the theme's, else Phosphor's; undefined for one the site does not draw. */
|
|
29
|
-
export function iconFile(name: string, weight?: 'fill'): string | undefined {
|
|
30
|
-
return weight ? fills[`${PHOSPHOR}fill/${name}-${weight}.svg`] : regular[`${PHOSPHOR}regular/${name}.svg`];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** An icon by name as the site and the editor draw it (the theme's View.tsx and its parts, Icon.astro, the editor's
|
|
34
|
-
* fields): the bare <svg> in its file's viewBox, at the size given, in the text's colour, hidden from screen readers
|
|
35
|
-
* (or named by `label`). A filled one the site does not draw is the regular one, and an icon it does not draw MISSING. */
|
|
36
|
-
export function Svg({
|
|
37
|
-
name,
|
|
38
|
-
size = 20,
|
|
39
|
-
weight,
|
|
40
|
-
className,
|
|
41
|
-
label,
|
|
42
|
-
}: {
|
|
43
|
-
name: string;
|
|
44
|
-
size?: number;
|
|
45
|
-
weight?: 'fill';
|
|
46
|
-
className?: string;
|
|
47
|
-
label?: string;
|
|
48
|
-
}) {
|
|
49
|
-
const file = iconFile(name, weight) ?? iconFile(name);
|
|
50
|
-
return <Drawn file={file} missing={file ? undefined : name} size={size} className={className} label={label} />;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** An icon by its name of all Phosphor's, not only those the site draws (an app's in the app store, store.ts): one the
|
|
54
|
-
* site draws at once, another from all Phosphor's (allIcons.ts, loaded the first time one is drawn), the theme's in
|
|
55
|
-
* their place as Svg's. Nothing while it loads, and MISSING for a name Phosphor does not have. */
|
|
56
|
-
export function AnyIcon({ name, size = 20 }: { name: string; size?: number }) {
|
|
57
|
-
// null: not found.
|
|
58
|
-
const [file, setFile] = useState<string | null | undefined>(() => iconFile(name));
|
|
59
|
-
useEffect(() => {
|
|
60
|
-
if (iconFile(name)) return setFile(iconFile(name));
|
|
61
|
-
setFile(undefined);
|
|
62
|
-
let on = true;
|
|
63
|
-
import('./allIcons').then((m) => on && setFile(m.allIcons[`${PHOSPHOR}regular/${name}.svg`] ?? null));
|
|
64
|
-
return () => {
|
|
65
|
-
on = false;
|
|
66
|
-
};
|
|
67
|
-
}, [name]);
|
|
68
|
-
if (file === undefined) return null;
|
|
69
|
-
return <Drawn file={file ?? undefined} missing={file ? undefined : name} size={size} />;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** An icon's SVG file drawn as it is, as Svg draws one, not the theme's in its place: an icon pack's own, to show what the
|
|
73
|
-
* pack looks like (IconSwatches in ui.tsx, "Ikonpakker"). */
|
|
74
|
-
export function SvgFile({ file, size = 20 }: { file: string; size?: number }) {
|
|
75
|
-
return <Drawn file={file} size={size} />;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** An SVG file drawn; MISSING in its place when there is none, or it is not an SVG (`missing`: the name asked for). */
|
|
79
|
-
function Drawn({
|
|
80
|
-
file,
|
|
81
|
-
missing,
|
|
82
|
-
size,
|
|
83
|
-
className,
|
|
84
|
-
label,
|
|
85
|
-
}: {
|
|
86
|
-
file: string | undefined;
|
|
87
|
-
missing?: string;
|
|
88
|
-
size: number;
|
|
89
|
-
className?: string;
|
|
90
|
-
label?: string;
|
|
91
|
-
}) {
|
|
92
|
-
const parts = svgParts(file);
|
|
93
|
-
const shown = parts ?? svgParts(iconFile(MISSING));
|
|
94
|
-
if (!shown) return null;
|
|
95
|
-
return (
|
|
96
|
-
<svg
|
|
97
|
-
width={size}
|
|
98
|
-
height={size}
|
|
99
|
-
fill="currentColor"
|
|
100
|
-
{...(label ? { role: 'img', 'aria-label': label } : { 'aria-hidden': true })}
|
|
101
|
-
{...(parts ? {} : { 'data-icon-missing': missing ?? '' })}
|
|
102
|
-
className={className}
|
|
103
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
104
|
-
viewBox={shown.viewBox}
|
|
105
|
-
dangerouslySetInnerHTML={{ __html: shown.inner }}
|
|
106
|
-
/>
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/** An icon as the theme's UI parts take it (packages/editor/theme/ui/): its name, as the site gives it, or an icon already
|
|
111
|
-
* made, as the editor gives it (a React icon from @phosphor-icons/react, the theme's in its place: <Plus />). */
|
|
112
|
-
export type IconRef = string | ReactElement<{ size?: number; className?: string }>;
|
|
113
|
-
|
|
114
|
-
/** An IconRef drawn: a name as Svg draws it, an icon made with this size and class. */
|
|
115
|
-
export function Glyph({ icon, size = 20, className }: { icon: IconRef; size?: number; className?: string }) {
|
|
116
|
-
if (typeof icon === 'string') return <Svg name={icon} size={size} className={className} />;
|
|
117
|
-
return isValidElement(icon)
|
|
118
|
-
? cloneElement(icon, { size, className: [icon.props.className, className].filter(Boolean).join(' ') || undefined })
|
|
119
|
-
: null;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** The same as Svg (the editor's fields and the site's promotions draw their icons with it). */
|
|
123
|
-
export const Icon = Svg;
|
|
124
|
-
|
|
125
|
-
/** The icons to pick from on the standard blocks (a field with `icons`: Kort); this site's own
|
|
126
|
-
* fields have the same (`icons` in packages/editor/defaults/collections.ts). */
|
|
127
|
-
export const iconNames = [
|
|
128
|
-
'certificate',
|
|
129
|
-
'heart',
|
|
130
|
-
'hand-heart',
|
|
131
|
-
'users-three',
|
|
132
|
-
'users',
|
|
133
|
-
'graduation-cap',
|
|
134
|
-
'handshake',
|
|
135
|
-
'book-open',
|
|
136
|
-
'book-open-text',
|
|
137
|
-
'medal',
|
|
138
|
-
'chats',
|
|
139
|
-
'flower-lotus',
|
|
140
|
-
'leaf',
|
|
141
|
-
'lightbulb',
|
|
142
|
-
'train',
|
|
143
|
-
'bus',
|
|
144
|
-
'bicycle',
|
|
145
|
-
'car',
|
|
146
|
-
'door-open',
|
|
147
|
-
'video-camera',
|
|
148
|
-
'lifebuoy',
|
|
149
|
-
'phone',
|
|
150
|
-
'clock',
|
|
151
|
-
'map-pin',
|
|
152
|
-
'coffee',
|
|
153
|
-
'wheelchair',
|
|
154
|
-
'info',
|
|
155
|
-
'envelope-simple',
|
|
156
|
-
] as const;
|
|
157
|
-
|
|
158
|
-
/** The icons to pick from as the options of a field, with their names (t.blocks.icons). */
|
|
159
|
-
export const iconOptions = (names: Record<(typeof iconNames)[number], string>) =>
|
|
160
|
-
iconNames.map((value) => ({ label: names[value], value }));
|
|
1
|
+
// Every icon the site draws, on the site and in the editor alike, by its name: Phosphor's (regular, and a filled one as
|
|
2
|
+
// `<name>-fill`), which the site's build puts the theme's own in place of (its icons/<name>.svg, else the icon pack in
|
|
3
|
+
// use's, packages/editor/site/iconPacks.mjs: themePlugin in packages/editor/site/theme.mjs, which answers the imports below with them). The names are Phosphor's, as
|
|
4
|
+
// the content stores them (a card's `icon: certificate`), so a theme without one still draws it.
|
|
5
|
+
// Phosphor's here are those the site draws: the blocks' (src/themes/<theme>/blocks/, src/apps/<app>/blocks/), the
|
|
6
|
+
// theme's parts' (Icon.astro, MobileMenu.tsx …) and those to pick from (iconNames, and `icons` in collections.ts,
|
|
7
|
+
// shown as icons by fields.tsx). A name that is not among them is drawn as MISSING, the question mark, marked with
|
|
8
|
+
// data-icon-missing (its name), which check:screens finds on the built site's pages and the editor's screens.
|
|
9
|
+
import { cloneElement, isValidElement, useEffect, useState, type ReactElement } from 'react';
|
|
10
|
+
import { svgParts } from '../lib/svg.mjs';
|
|
11
|
+
|
|
12
|
+
const PHOSPHOR = '/node_modules/@phosphor-icons/core/assets/';
|
|
13
|
+
const regular = import.meta.glob<string>(
|
|
14
|
+
'/node_modules/@phosphor-icons/core/assets/regular/{arrow-left,arrow-right,arrow-square-out,arrow-up-right,bank,bicycle,book-open,book-open-text,bus,calendar-blank,car,caret-down,caret-left,caret-right,certificate,chats,check,clock,coffee,cookie,copy,device-mobile,door-open,download-simple,envelope-simple,eye,eye-slash,flower-lotus,graduation-cap,hand-heart,handshake,heart,house,info,keyboard,leaf,lifebuoy,lightbulb,list,magnifying-glass,map-pin,map-trifold,medal,minus,moon,pencil-simple,phone,question,sun,ticket,train,trash,user,users,users-three,video-camera,warning-circle,wheelchair,x}.svg',
|
|
15
|
+
{ query: '?raw', import: 'default', eager: true },
|
|
16
|
+
);
|
|
17
|
+
// The filled ones ("Video": its play button).
|
|
18
|
+
const fills = import.meta.glob<string>('/node_modules/@phosphor-icons/core/assets/fill/{play-fill}.svg', {
|
|
19
|
+
query: '?raw',
|
|
20
|
+
import: 'default',
|
|
21
|
+
eager: true,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/** The icon drawn for one that is not found (a name the site does not draw, one Phosphor does not have): a question
|
|
25
|
+
* mark, the icon pack's as the others. */
|
|
26
|
+
export const MISSING = 'question';
|
|
27
|
+
|
|
28
|
+
/** An icon's SVG file by its name: the theme's, else Phosphor's; undefined for one the site does not draw. */
|
|
29
|
+
export function iconFile(name: string, weight?: 'fill'): string | undefined {
|
|
30
|
+
return weight ? fills[`${PHOSPHOR}fill/${name}-${weight}.svg`] : regular[`${PHOSPHOR}regular/${name}.svg`];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** An icon by name as the site and the editor draw it (the theme's View.tsx and its parts, Icon.astro, the editor's
|
|
34
|
+
* fields): the bare <svg> in its file's viewBox, at the size given, in the text's colour, hidden from screen readers
|
|
35
|
+
* (or named by `label`). A filled one the site does not draw is the regular one, and an icon it does not draw MISSING. */
|
|
36
|
+
export function Svg({
|
|
37
|
+
name,
|
|
38
|
+
size = 20,
|
|
39
|
+
weight,
|
|
40
|
+
className,
|
|
41
|
+
label,
|
|
42
|
+
}: {
|
|
43
|
+
name: string;
|
|
44
|
+
size?: number;
|
|
45
|
+
weight?: 'fill';
|
|
46
|
+
className?: string;
|
|
47
|
+
label?: string;
|
|
48
|
+
}) {
|
|
49
|
+
const file = iconFile(name, weight) ?? iconFile(name);
|
|
50
|
+
return <Drawn file={file} missing={file ? undefined : name} size={size} className={className} label={label} />;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** An icon by its name of all Phosphor's, not only those the site draws (an app's in the app store, store.ts): one the
|
|
54
|
+
* site draws at once, another from all Phosphor's (allIcons.ts, loaded the first time one is drawn), the theme's in
|
|
55
|
+
* their place as Svg's. Nothing while it loads, and MISSING for a name Phosphor does not have. */
|
|
56
|
+
export function AnyIcon({ name, size = 20 }: { name: string; size?: number }) {
|
|
57
|
+
// null: not found.
|
|
58
|
+
const [file, setFile] = useState<string | null | undefined>(() => iconFile(name));
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (iconFile(name)) return setFile(iconFile(name));
|
|
61
|
+
setFile(undefined);
|
|
62
|
+
let on = true;
|
|
63
|
+
import('./allIcons').then((m) => on && setFile(m.allIcons[`${PHOSPHOR}regular/${name}.svg`] ?? null));
|
|
64
|
+
return () => {
|
|
65
|
+
on = false;
|
|
66
|
+
};
|
|
67
|
+
}, [name]);
|
|
68
|
+
if (file === undefined) return null;
|
|
69
|
+
return <Drawn file={file ?? undefined} missing={file ? undefined : name} size={size} />;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** An icon's SVG file drawn as it is, as Svg draws one, not the theme's in its place: an icon pack's own, to show what the
|
|
73
|
+
* pack looks like (IconSwatches in ui.tsx, "Ikonpakker"). */
|
|
74
|
+
export function SvgFile({ file, size = 20 }: { file: string; size?: number }) {
|
|
75
|
+
return <Drawn file={file} size={size} />;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** An SVG file drawn; MISSING in its place when there is none, or it is not an SVG (`missing`: the name asked for). */
|
|
79
|
+
function Drawn({
|
|
80
|
+
file,
|
|
81
|
+
missing,
|
|
82
|
+
size,
|
|
83
|
+
className,
|
|
84
|
+
label,
|
|
85
|
+
}: {
|
|
86
|
+
file: string | undefined;
|
|
87
|
+
missing?: string;
|
|
88
|
+
size: number;
|
|
89
|
+
className?: string;
|
|
90
|
+
label?: string;
|
|
91
|
+
}) {
|
|
92
|
+
const parts = svgParts(file);
|
|
93
|
+
const shown = parts ?? svgParts(iconFile(MISSING));
|
|
94
|
+
if (!shown) return null;
|
|
95
|
+
return (
|
|
96
|
+
<svg
|
|
97
|
+
width={size}
|
|
98
|
+
height={size}
|
|
99
|
+
fill="currentColor"
|
|
100
|
+
{...(label ? { role: 'img', 'aria-label': label } : { 'aria-hidden': true })}
|
|
101
|
+
{...(parts ? {} : { 'data-icon-missing': missing ?? '' })}
|
|
102
|
+
className={className}
|
|
103
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
104
|
+
viewBox={shown.viewBox}
|
|
105
|
+
dangerouslySetInnerHTML={{ __html: shown.inner }}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** An icon as the theme's UI parts take it (packages/editor/theme/ui/): its name, as the site gives it, or an icon already
|
|
111
|
+
* made, as the editor gives it (a React icon from @phosphor-icons/react, the theme's in its place: <Plus />). */
|
|
112
|
+
export type IconRef = string | ReactElement<{ size?: number; className?: string }>;
|
|
113
|
+
|
|
114
|
+
/** An IconRef drawn: a name as Svg draws it, an icon made with this size and class. */
|
|
115
|
+
export function Glyph({ icon, size = 20, className }: { icon: IconRef; size?: number; className?: string }) {
|
|
116
|
+
if (typeof icon === 'string') return <Svg name={icon} size={size} className={className} />;
|
|
117
|
+
return isValidElement(icon)
|
|
118
|
+
? cloneElement(icon, { size, className: [icon.props.className, className].filter(Boolean).join(' ') || undefined })
|
|
119
|
+
: null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** The same as Svg (the editor's fields and the site's promotions draw their icons with it). */
|
|
123
|
+
export const Icon = Svg;
|
|
124
|
+
|
|
125
|
+
/** The icons to pick from on the standard blocks (a field with `icons`: Kort); this site's own
|
|
126
|
+
* fields have the same (`icons` in packages/editor/defaults/collections.ts). */
|
|
127
|
+
export const iconNames = [
|
|
128
|
+
'certificate',
|
|
129
|
+
'heart',
|
|
130
|
+
'hand-heart',
|
|
131
|
+
'users-three',
|
|
132
|
+
'users',
|
|
133
|
+
'graduation-cap',
|
|
134
|
+
'handshake',
|
|
135
|
+
'book-open',
|
|
136
|
+
'book-open-text',
|
|
137
|
+
'medal',
|
|
138
|
+
'chats',
|
|
139
|
+
'flower-lotus',
|
|
140
|
+
'leaf',
|
|
141
|
+
'lightbulb',
|
|
142
|
+
'train',
|
|
143
|
+
'bus',
|
|
144
|
+
'bicycle',
|
|
145
|
+
'car',
|
|
146
|
+
'door-open',
|
|
147
|
+
'video-camera',
|
|
148
|
+
'lifebuoy',
|
|
149
|
+
'phone',
|
|
150
|
+
'clock',
|
|
151
|
+
'map-pin',
|
|
152
|
+
'coffee',
|
|
153
|
+
'wheelchair',
|
|
154
|
+
'info',
|
|
155
|
+
'envelope-simple',
|
|
156
|
+
] as const;
|
|
157
|
+
|
|
158
|
+
/** The icons to pick from as the options of a field, with their names (t.blocks.icons). */
|
|
159
|
+
export const iconOptions = (names: Record<(typeof iconNames)[number], string>) =>
|
|
160
|
+
iconNames.map((value) => ({ label: names[value], value }));
|