@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/defaults/collections.ts
CHANGED
|
@@ -1,774 +1,774 @@
|
|
|
1
|
-
// What the editor can edit on a site, and the fields of each (the kinds of collection and field:
|
|
2
|
-
// packages/editor/src/schema.ts). The fields mirror src/content.config.ts and the readers of the data files
|
|
3
|
-
// (packages/editor/site/*.ts); keep them in step.
|
|
4
|
-
// markdown: a folder of .md files (front matter + text): blog posts and pages.
|
|
5
|
-
// folder: a folder of .json files, one entry per file: categories, promotions (the testimonials are the standard
|
|
6
|
-
// block "Udtalelser"'s, packages/editor/src/standard/testimonials/list.ts, an app's lists its own,
|
|
7
|
-
// src/apps/<app>/lists.ts).
|
|
8
|
-
// files: single .json files: the settings (the standard pages …), the footer and the menu.
|
|
9
|
-
import { AppWindow, SquareHalfBottom } from '@phosphor-icons/react';
|
|
10
|
-
import type { Collection, Field } from '../src/schema';
|
|
11
|
-
import { fromContactBar } from '../lib/contactBar';
|
|
12
|
-
import { config } from '@site/config';
|
|
13
|
-
import { standardPaths } from '@site/standardPages';
|
|
14
|
-
|
|
15
|
-
// The page Google should count as the original of a page or a post (rel=canonical); empty is itself.
|
|
16
|
-
// Under "Søgemaskiner" with the Google texts (EntryForm.tsx).
|
|
17
|
-
const canonical: Field = {
|
|
18
|
-
name: 'canonical',
|
|
19
|
-
label: 'Canonical URL',
|
|
20
|
-
type: 'relation',
|
|
21
|
-
to: 'pages',
|
|
22
|
-
fixed: true,
|
|
23
|
-
hint: 'Den side, Google skal vise i stedet for denne.',
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
// Not for search engines: noindex, and not in the sitemap. Under "Søgemaskiner" too.
|
|
27
|
-
const noindex: Field = {
|
|
28
|
-
name: 'noindex',
|
|
29
|
-
label: 'Skjul for søgemaskiner (noindex)',
|
|
30
|
-
type: 'boolean',
|
|
31
|
-
hint: 'Siden vises ikke i Google.',
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
// The text of the picture at the top of a post (a page has its pictures in its text): "Dekorativt billede" (drawn with alt="", screen readers skip
|
|
35
|
-
// it), else its alternative text.
|
|
36
|
-
const topImageText: Field[] = [
|
|
37
|
-
{
|
|
38
|
-
name: 'imageDecorative',
|
|
39
|
-
label: 'Dekorativt billede',
|
|
40
|
-
type: 'boolean',
|
|
41
|
-
toggle: ['Til', 'Fra'],
|
|
42
|
-
hint: 'Skærmlæsere springer billedet over.',
|
|
43
|
-
},
|
|
44
|
-
{ name: 'imageAlt', label: 'Alternativ tekst', type: 'string', only: { field: 'imageDecorative', is: ['', 'false'] } },
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
// "Status" at the top of a page or post (EntryForm.tsx): Kladde, Skjult, Udgivet or Planlagt, and for
|
|
48
|
-
// Planlagt when (packages/editor/lib/status.mjs). Udgivet is no `status` in the file. A post's date follows the time.
|
|
49
|
-
const status = (hidden: string): Field[] => [
|
|
50
|
-
{
|
|
51
|
-
name: 'status',
|
|
52
|
-
label: 'Status',
|
|
53
|
-
type: 'select',
|
|
54
|
-
segments: true,
|
|
55
|
-
options: [
|
|
56
|
-
{ value: 'draft', label: 'Kladde', hint: 'Vises ikke på hjemmesiden.' },
|
|
57
|
-
{ value: 'unlisted', label: 'Skjult', hint: hidden },
|
|
58
|
-
{ value: '', label: 'Udgivet', hint: 'Vises på hjemmesiden.' },
|
|
59
|
-
{ value: 'scheduled', label: 'Planlagt', hint: 'Vises på hjemmesiden fra tidspunktet nedenfor.' },
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
name: 'publishAt',
|
|
64
|
-
label: 'Tidspunkt',
|
|
65
|
-
type: 'datetime',
|
|
66
|
-
required: true,
|
|
67
|
-
only: { field: 'status', is: ['scheduled'] },
|
|
68
|
-
hint: 'Udgives senest en time efter.',
|
|
69
|
-
},
|
|
70
|
-
];
|
|
71
|
-
|
|
72
|
-
// The Google texts, and the picture when the page is shared, which the editor shows under "Sociale medier" (SHARE_FIELDS
|
|
73
|
-
// in packages/editor/src/seo.ts).
|
|
74
|
-
const seo: Field[] = [
|
|
75
|
-
{
|
|
76
|
-
name: 'seoTitle',
|
|
77
|
-
label: 'Google-titel',
|
|
78
|
-
type: 'string',
|
|
79
|
-
hint: 'Højst ca. 60 tegn.',
|
|
80
|
-
max: 70,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: 'seoDescription',
|
|
84
|
-
label: 'Google-beskrivelse',
|
|
85
|
-
type: 'text',
|
|
86
|
-
hint: 'Ca. 140-155 tegn.',
|
|
87
|
-
max: 170,
|
|
88
|
-
},
|
|
89
|
-
// og:image (Base.astro), cut to 1200 × 630 by packages/editor/scripts/responsive-images.mjs.
|
|
90
|
-
{
|
|
91
|
-
name: 'shareImage',
|
|
92
|
-
label: 'Billede ved deling',
|
|
93
|
-
type: 'image',
|
|
94
|
-
hint: 'Vises, når siden deles, fx på Facebook.',
|
|
95
|
-
},
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
// The title and description when a page or post is shared (og:title, og:description in Base.astro), under "Sociale
|
|
99
|
-
// medier" with the picture.
|
|
100
|
-
const shareTexts: Field[] = [
|
|
101
|
-
{
|
|
102
|
-
name: 'shareTitle',
|
|
103
|
-
label: 'Titel ved deling',
|
|
104
|
-
type: 'string',
|
|
105
|
-
hint: 'Hvis feltet er tomt, bruges Google-titlen.',
|
|
106
|
-
max: 70,
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
name: 'shareDescription',
|
|
110
|
-
label: 'Beskrivelse ved deling',
|
|
111
|
-
type: 'text',
|
|
112
|
-
hint: 'Hvis feltet er tomt, bruges Google-beskrivelsen.',
|
|
113
|
-
max: 170,
|
|
114
|
-
},
|
|
115
|
-
];
|
|
116
|
-
|
|
117
|
-
// The words that link to a page or post from the others (packages/editor/site/autolinks.mjs). Under
|
|
118
|
-
// "Søgemaskiner" with the Google texts (EntryForm.tsx).
|
|
119
|
-
const keywords: Field[] = [
|
|
120
|
-
{
|
|
121
|
-
name: 'keyword',
|
|
122
|
-
label: 'Primært søgeord',
|
|
123
|
-
type: 'string',
|
|
124
|
-
chips: 'one',
|
|
125
|
-
hint: 'Ordet bliver et link hertil fra andre sider.',
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
name: 'keywords',
|
|
129
|
-
label: 'Sekundære søgeord',
|
|
130
|
-
type: 'string',
|
|
131
|
-
chips: 'many',
|
|
132
|
-
hint: 'Hvert ord bliver et link hertil fra andre sider.',
|
|
133
|
-
},
|
|
134
|
-
];
|
|
135
|
-
|
|
136
|
-
// The business, on "Virksomheden" (CompanyForm.tsx): its name and title, phone, e-mail, address and CVR number
|
|
137
|
-
// (src/data/contact.json), shown at the top and bottom of every page and in the blocks that show them ("Kontakt" and
|
|
138
|
-
// "Adresse"); and the bank details (src/data/payment.json), shown in "Betaling". The calendar
|
|
139
|
-
// is the app Calendly's (src/apps/calendly/).
|
|
140
|
-
export const contactFields: Field[] = [
|
|
141
|
-
{ name: 'name', label: 'Navn', type: 'string', required: true },
|
|
142
|
-
{ name: 'role', label: 'Titel', type: 'string', required: true },
|
|
143
|
-
{
|
|
144
|
-
name: 'phone',
|
|
145
|
-
label: 'Telefon',
|
|
146
|
-
type: 'string',
|
|
147
|
-
required: true,
|
|
148
|
-
digitsInPairs: 8,
|
|
149
|
-
phone: '+45',
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
name: 'email',
|
|
153
|
-
label: 'E-mail',
|
|
154
|
-
type: 'string',
|
|
155
|
-
required: true,
|
|
156
|
-
pattern: [
|
|
157
|
-
'^[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*\\.[A-Za-z]{2,}$',
|
|
158
|
-
'Skriv en gyldig e-mailadresse',
|
|
159
|
-
],
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
name: 'street',
|
|
163
|
-
label: 'Vej og nummer',
|
|
164
|
-
type: 'string',
|
|
165
|
-
required: true,
|
|
166
|
-
},
|
|
167
|
-
{ name: 'city', label: 'Postnummer og by', type: 'string', required: true },
|
|
168
|
-
{
|
|
169
|
-
name: 'cvr',
|
|
170
|
-
label: 'CVR-nummer',
|
|
171
|
-
type: 'string',
|
|
172
|
-
hint: 'Vises nederst på hver side.',
|
|
173
|
-
pattern: ['^\\d{8}$', 'Et CVR-nummer har otte cifre'],
|
|
174
|
-
},
|
|
175
|
-
];
|
|
176
|
-
|
|
177
|
-
// The bank details, a part of its own under "Betaling" (company.ts, src/data/payment.json).
|
|
178
|
-
export const bankFields: Field[] = [
|
|
179
|
-
{ name: 'bank', label: 'Bank', type: 'string', required: true },
|
|
180
|
-
{ name: 'reg', label: 'Reg.nr.', type: 'string', required: true },
|
|
181
|
-
{ name: 'account', label: 'Kontonummer', type: 'string', required: true },
|
|
182
|
-
];
|
|
183
|
-
|
|
184
|
-
// The standard pages (src/data/standard-pages.json, config.standardPages, packages/editor/defaults/standardPages.ts), each a field that
|
|
185
|
-
// picks a page, as rows of a list (Part.rows): the front page, shown at / (packages/editor/site/home.ts), the blog page, shown at
|
|
186
|
-
// /blog/, the page shown for an address that does not exist (packages/editor/site/standardPages.ts) and the contact page under
|
|
187
|
-
// "Udseende" › "Standardsider" (appearance in editor.ts), and the privacy policy and the cookie policy under "Privatliv" ›
|
|
188
|
-
// "Privatlivssider" (privacy.ts). Different pages, but the cookie policy may be the privacy policy (keptBy in rules.ts).
|
|
189
|
-
const standardPageFields: Field[] = [
|
|
190
|
-
{
|
|
191
|
-
name: 'front',
|
|
192
|
-
label: 'Forside',
|
|
193
|
-
type: 'relation',
|
|
194
|
-
to: 'standardPages',
|
|
195
|
-
required: true,
|
|
196
|
-
hint: 'Siden vises på forsiden, og dens egen adresse sender videre dertil.',
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: 'blog',
|
|
200
|
-
label: 'Blogside',
|
|
201
|
-
type: 'relation',
|
|
202
|
-
to: 'standardPages',
|
|
203
|
-
required: true,
|
|
204
|
-
hint: 'Siden vises på /blog/, og dens egen adresse sender videre dertil.',
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
name: 'notFound',
|
|
208
|
-
label: '404-side',
|
|
209
|
-
type: 'relation',
|
|
210
|
-
to: 'standardPages',
|
|
211
|
-
required: true,
|
|
212
|
-
hint: 'Siden vises, når en adresse ikke findes.',
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
name: 'contact',
|
|
216
|
-
label: 'Kontaktside',
|
|
217
|
-
type: 'relation',
|
|
218
|
-
to: 'standardPages',
|
|
219
|
-
required: true,
|
|
220
|
-
hint: 'Linket til vejvisningen går hertil.',
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
name: 'privacy',
|
|
224
|
-
label: 'Privatlivspolitik',
|
|
225
|
-
type: 'relation',
|
|
226
|
-
to: 'standardPages',
|
|
227
|
-
required: true,
|
|
228
|
-
hint: 'Siden, der fortæller, hvilke oplysninger der gemmes, og hvorfor.',
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
name: 'cookies',
|
|
232
|
-
label: 'Cookiepolitik',
|
|
233
|
-
type: 'relation',
|
|
234
|
-
to: 'standardPages',
|
|
235
|
-
required: true,
|
|
236
|
-
hint: 'Cookiebannerets link går hertil; det må være privatlivspolitikken.',
|
|
237
|
-
},
|
|
238
|
-
];
|
|
239
|
-
|
|
240
|
-
/** The fields of the standard pages by their keys, in that order. */
|
|
241
|
-
export const standardPageFieldsOf = (...keys: string[]) => keys.map((key) => standardPageFields.find((f) => f.name === key)!);
|
|
242
|
-
|
|
243
|
-
/** The "Book en tid" box's own heading and text, in a page's text; empty,
|
|
244
|
-
* the shared ones ("Blokke" › "Book en tid", booking.json). */
|
|
245
|
-
export const bookingTexts: Field[] = [
|
|
246
|
-
{
|
|
247
|
-
name: 'heading',
|
|
248
|
-
label: 'Overskrift',
|
|
249
|
-
type: 'string',
|
|
250
|
-
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
251
|
-
placeholder: (site) => site.booking.heading,
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
name: 'text',
|
|
255
|
-
label: 'Tekst',
|
|
256
|
-
type: 'text',
|
|
257
|
-
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
258
|
-
placeholder: (site) => site.booking.text,
|
|
259
|
-
},
|
|
260
|
-
];
|
|
261
|
-
|
|
262
|
-
// The icons the owner picks from on the site's own fields (the same as the standard blocks', iconNames in
|
|
263
|
-
// packages/editor/src/icon.tsx, which draws them).
|
|
264
|
-
export const icons = [
|
|
265
|
-
['Diplom', 'certificate'],
|
|
266
|
-
['Hjerte', 'heart'],
|
|
267
|
-
['Hånd med hjerte', 'hand-heart'],
|
|
268
|
-
['Tre personer', 'users-three'],
|
|
269
|
-
['To personer', 'users'],
|
|
270
|
-
['Studenterhue', 'graduation-cap'],
|
|
271
|
-
['Håndtryk', 'handshake'],
|
|
272
|
-
['Bog', 'book-open'],
|
|
273
|
-
['Bog med tekst', 'book-open-text'],
|
|
274
|
-
['Medalje', 'medal'],
|
|
275
|
-
['Samtale', 'chats'],
|
|
276
|
-
['Lotusblomst', 'flower-lotus'],
|
|
277
|
-
['Blad', 'leaf'],
|
|
278
|
-
['Pære', 'lightbulb'],
|
|
279
|
-
['Tog', 'train'],
|
|
280
|
-
['Bus', 'bus'],
|
|
281
|
-
['Cykel', 'bicycle'],
|
|
282
|
-
['Bil', 'car'],
|
|
283
|
-
['Dør', 'door-open'],
|
|
284
|
-
['Videokamera', 'video-camera'],
|
|
285
|
-
['Redningskrans', 'lifebuoy'],
|
|
286
|
-
['Telefon', 'phone'],
|
|
287
|
-
['Ur', 'clock'],
|
|
288
|
-
['Kortnål', 'map-pin'],
|
|
289
|
-
['Kaffe', 'coffee'],
|
|
290
|
-
['Kørestol', 'wheelchair'],
|
|
291
|
-
['Info', 'info'],
|
|
292
|
-
['Brev', 'envelope-simple'],
|
|
293
|
-
].map(([label, value]) => ({ label, value }));
|
|
294
|
-
|
|
295
|
-
// A link in the menu: any page, the front page and the blog too, stored by its address.
|
|
296
|
-
const menuHref: Field = { name: 'href', label: 'Side', type: 'relation', to: 'pages', fixed: true, required: true };
|
|
297
|
-
|
|
298
|
-
export const collections: Collection[] = [
|
|
299
|
-
{
|
|
300
|
-
kind: 'markdown',
|
|
301
|
-
id: 'blog',
|
|
302
|
-
create: 'Nyt blogindlæg',
|
|
303
|
-
label: 'Blogindlæg',
|
|
304
|
-
singular: 'blogindlæg',
|
|
305
|
-
folder: 'src/content/blog',
|
|
306
|
-
deletable: true,
|
|
307
|
-
fields: [
|
|
308
|
-
...status('Vises ikke på bloggen eller i Google, men kan åbnes på sin adresse.'),
|
|
309
|
-
{ name: 'title', label: 'Titel', type: 'string', required: true },
|
|
310
|
-
{ name: 'date', label: 'Dato', type: 'date', required: true },
|
|
311
|
-
{ name: 'path', label: 'Adresse', type: 'string', address: 'post' },
|
|
312
|
-
{ name: 'description', label: 'Kort beskrivelse', type: 'text' },
|
|
313
|
-
{
|
|
314
|
-
name: 'categories',
|
|
315
|
-
label: 'Tags',
|
|
316
|
-
type: 'relation',
|
|
317
|
-
to: 'categories',
|
|
318
|
-
multiple: true,
|
|
319
|
-
add: 'Tilføj tag',
|
|
320
|
-
edit: { to: 'ny/kategorier', text: 'Opret et tag' },
|
|
321
|
-
},
|
|
322
|
-
{ name: 'image', label: 'Billede øverst', type: 'image' },
|
|
323
|
-
...topImageText,
|
|
324
|
-
...seo,
|
|
325
|
-
...shareTexts,
|
|
326
|
-
...keywords,
|
|
327
|
-
canonical,
|
|
328
|
-
noindex,
|
|
329
|
-
],
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
kind: 'markdown',
|
|
333
|
-
id: 'pages',
|
|
334
|
-
create: 'Ny side',
|
|
335
|
-
label: 'Sider',
|
|
336
|
-
singular: 'side',
|
|
337
|
-
folder: 'src/content/pages',
|
|
338
|
-
fields: [
|
|
339
|
-
...status('Vises ikke i Google, men kan åbnes på sin adresse.'),
|
|
340
|
-
{ name: 'title', label: 'Titel', type: 'string', required: true },
|
|
341
|
-
{ name: 'path', label: 'Adresse', type: 'string', address: 'page' },
|
|
342
|
-
{ name: 'description', label: 'Kort beskrivelse', type: 'text' },
|
|
343
|
-
{
|
|
344
|
-
name: 'wide',
|
|
345
|
-
label: 'Hele bredden',
|
|
346
|
-
type: 'boolean',
|
|
347
|
-
layout: true,
|
|
348
|
-
hint: 'Siden fylder hele bredden uden spalten ved siden af teksten.',
|
|
349
|
-
},
|
|
350
|
-
{
|
|
351
|
-
name: 'review',
|
|
352
|
-
label: 'Til gennemsyn',
|
|
353
|
-
type: 'text',
|
|
354
|
-
hint: 'Vises kun på sider under /ny/.',
|
|
355
|
-
},
|
|
356
|
-
...seo,
|
|
357
|
-
...shareTexts,
|
|
358
|
-
...keywords,
|
|
359
|
-
canonical,
|
|
360
|
-
noindex,
|
|
361
|
-
],
|
|
362
|
-
blocks: true,
|
|
363
|
-
// One "Book en tid" a page (at the very end it goes across the page, PageLayout.astro). A new page
|
|
364
|
-
// starts empty.
|
|
365
|
-
template: { max: { booking: 1 } },
|
|
366
|
-
},
|
|
367
|
-
{
|
|
368
|
-
kind: 'folder',
|
|
369
|
-
id: 'kategorier',
|
|
370
|
-
create: 'Nyt tag',
|
|
371
|
-
label: 'Tags',
|
|
372
|
-
singular: 'tag',
|
|
373
|
-
folder: 'src/data/categories',
|
|
374
|
-
deletable: true,
|
|
375
|
-
slugFrom: 'name',
|
|
376
|
-
summary: (d) => String(d.name ?? ''),
|
|
377
|
-
fields: [
|
|
378
|
-
{ name: 'name', label: 'Navn', type: 'string', required: true },
|
|
379
|
-
...seo,
|
|
380
|
-
{
|
|
381
|
-
name: 'blogCategory',
|
|
382
|
-
label: 'Blogkategori',
|
|
383
|
-
type: 'boolean',
|
|
384
|
-
toggle: ['Vis', 'Skjul'],
|
|
385
|
-
default: true,
|
|
386
|
-
hint: 'Vis tagget på bloggen med sin egen side.',
|
|
387
|
-
},
|
|
388
|
-
],
|
|
389
|
-
},
|
|
390
|
-
{
|
|
391
|
-
// "Promovering": what is laid over the pages to get visitors to book, call or sign up, in
|
|
392
|
-
// src/data/popups/<slug>.json, read by packages/editor/site/popups.ts, on every page or those picked under "Sider".
|
|
393
|
-
// The pop-ups are shown by packages/editor/theme/components/Popup.astro; a kind an app adds without a part
|
|
394
|
-
// in the pop-up (src/apps/<app>/popups/View.tsx) shows itself (the app Calendly's booking sheet,
|
|
395
|
-
// src/apps/calendly/, when a button opens it).
|
|
396
|
-
kind: 'folder',
|
|
397
|
-
id: 'popups',
|
|
398
|
-
create: 'Ny promovering',
|
|
399
|
-
label: 'Promovering',
|
|
400
|
-
singular: 'promovering',
|
|
401
|
-
folder: 'src/data/popups',
|
|
402
|
-
deletable: true,
|
|
403
|
-
// A pop-up by its heading; a kind without one by its name (the app's bar), else by the kind's name
|
|
404
|
-
// (the action bar, DataForm.tsx, Library.tsx).
|
|
405
|
-
slugFrom: ['heading', 'name'],
|
|
406
|
-
summary: (d) => String(d.heading ?? d.name ?? ''),
|
|
407
|
-
shownOn: { pages: 'pages', tags: 'tags', everywhere: { field: 'where', is: 'all' } },
|
|
408
|
-
onOff: 'enabled',
|
|
409
|
-
// Of kinds, picked under "+" when a new one is made: the pop-up, with a button; the action bar (`bookingbar`) at the
|
|
410
|
-
// bottom of a phone's screen (shown by packages/editor/theme/components/ActionBar.astro), without the pop-up's fields
|
|
411
|
-
// (`omit`) and with its own; and those the apps add (src/apps/<app>/popups/, e.g.
|
|
412
|
-
// Mailchimp's with a signup form, and Calendly's booking sheet), with fields of their own and without
|
|
413
|
-
// those of the pop-up they do not have (AppKind.omit).
|
|
414
|
-
kinds: 'type',
|
|
415
|
-
omit: {
|
|
416
|
-
bookingbar: ['image', 'heading', 'text', 'trigger', 'button'],
|
|
417
|
-
},
|
|
418
|
-
// What a button ("Knapper": "Åbn promovering") can open of one: a pop-up itself, the action bar nothing (opens.ts).
|
|
419
|
-
opens: { standard: { label: 'Pop op-vindue' } },
|
|
420
|
-
// A contact bar (`contactbar`, a kind of its own before it became an action bar) is an action bar with its two
|
|
421
|
-
// buttons, to call and to its page, without one the contact page (packages/editor/lib/contactBar.ts).
|
|
422
|
-
upgrade: (data, files) => fromContactBar(data, standardPaths(files.find((f) => f.path === config.standardPages)?.text).contact ?? ''),
|
|
423
|
-
fields: [
|
|
424
|
-
{
|
|
425
|
-
name: 'type',
|
|
426
|
-
label: 'Type',
|
|
427
|
-
type: 'select',
|
|
428
|
-
locked: true,
|
|
429
|
-
// Without one (those made before there were kinds), it is the standard one.
|
|
430
|
-
default: 'standard',
|
|
431
|
-
options: [
|
|
432
|
-
{ label: 'Pop op-vindue', value: 'standard', icon: AppWindow, hint: 'Med billede, tekst og en knap.' },
|
|
433
|
-
{
|
|
434
|
-
label: 'Handlingslinje',
|
|
435
|
-
value: 'bookingbar',
|
|
436
|
-
icon: SquareHalfBottom,
|
|
437
|
-
hint: 'Knapper eller tekst nederst på skærmen på en telefon.',
|
|
438
|
-
},
|
|
439
|
-
],
|
|
440
|
-
},
|
|
441
|
-
{
|
|
442
|
-
name: 'enabled',
|
|
443
|
-
label: 'Aktiveret',
|
|
444
|
-
type: 'boolean',
|
|
445
|
-
toggle: ['Til', 'Fra'],
|
|
446
|
-
default: true,
|
|
447
|
-
},
|
|
448
|
-
// At the top of the box, to its edges in 3:2, as on the cards with a picture ("Kort").
|
|
449
|
-
{ name: 'image', label: 'Billede', type: 'image', hint: 'Vises øverst, skåret til 3:2.' },
|
|
450
|
-
{ name: 'heading', label: 'Overskrift', type: 'string', required: true, max: 80 },
|
|
451
|
-
{ name: 'text', label: 'Tekst', type: 'text' },
|
|
452
|
-
// Where it is shown, for every kind: on every page, on those picked (without `where`, from
|
|
453
|
-
// before, those picked), or on the blog posts with one of the tags picked and those tags' pages.
|
|
454
|
-
{
|
|
455
|
-
name: 'where',
|
|
456
|
-
label: 'Vises på',
|
|
457
|
-
type: 'select',
|
|
458
|
-
default: 'some',
|
|
459
|
-
options: [
|
|
460
|
-
{ label: 'Alle sider', value: 'all' },
|
|
461
|
-
{ label: 'Udvalgte sider', value: 'some' },
|
|
462
|
-
{ label: 'Blogindlæg med tags', value: 'tags' },
|
|
463
|
-
],
|
|
464
|
-
},
|
|
465
|
-
{
|
|
466
|
-
name: 'pages',
|
|
467
|
-
label: 'Sider',
|
|
468
|
-
type: 'relation',
|
|
469
|
-
to: 'pages',
|
|
470
|
-
fixed: true,
|
|
471
|
-
multiple: true,
|
|
472
|
-
required: true,
|
|
473
|
-
add: 'Tilføj side',
|
|
474
|
-
hint: 'Vises kun på disse sider.',
|
|
475
|
-
only: { field: 'where', is: ['some'] },
|
|
476
|
-
},
|
|
477
|
-
{
|
|
478
|
-
name: 'tags',
|
|
479
|
-
label: 'Tags',
|
|
480
|
-
type: 'relation',
|
|
481
|
-
to: 'categories',
|
|
482
|
-
multiple: true,
|
|
483
|
-
required: true,
|
|
484
|
-
add: 'Tilføj tag',
|
|
485
|
-
hint: 'Vises på blogindlæg med et af disse tags og på taggenes sider.',
|
|
486
|
-
only: { field: 'where', is: ['tags'] },
|
|
487
|
-
},
|
|
488
|
-
// When it opens (packages/editor/theme/components/Popup.astro): after `delay`, at `scroll` % down the page, or as the
|
|
489
|
-
// visitor is about to leave it.
|
|
490
|
-
{
|
|
491
|
-
name: 'trigger',
|
|
492
|
-
label: 'Vises',
|
|
493
|
-
type: 'select',
|
|
494
|
-
required: true,
|
|
495
|
-
default: 'time',
|
|
496
|
-
hint: 'Hver besøgende ser det, til de lukker det.',
|
|
497
|
-
options: [
|
|
498
|
-
{ label: 'Efter en tid', value: 'time' },
|
|
499
|
-
{ label: 'Når siden er rullet ned', value: 'scroll' },
|
|
500
|
-
{
|
|
501
|
-
label: 'Når den besøgende vil forlade siden',
|
|
502
|
-
value: 'exit',
|
|
503
|
-
hint: 'På en telefon: når den besøgende ruller hurtigt op.',
|
|
504
|
-
},
|
|
505
|
-
],
|
|
506
|
-
},
|
|
507
|
-
{
|
|
508
|
-
name: 'delay',
|
|
509
|
-
label: 'Vises efter',
|
|
510
|
-
type: 'select',
|
|
511
|
-
required: true,
|
|
512
|
-
default: '5',
|
|
513
|
-
only: { field: 'trigger', is: ['time'] },
|
|
514
|
-
options: [
|
|
515
|
-
{ label: 'Med det samme', value: '0' },
|
|
516
|
-
{ label: '5 sekunder', value: '5' },
|
|
517
|
-
{ label: '10 sekunder', value: '10' },
|
|
518
|
-
{ label: '30 sekunder', value: '30' },
|
|
519
|
-
],
|
|
520
|
-
},
|
|
521
|
-
{
|
|
522
|
-
name: 'scroll',
|
|
523
|
-
label: 'Rullet ned',
|
|
524
|
-
type: 'select',
|
|
525
|
-
required: true,
|
|
526
|
-
default: '25',
|
|
527
|
-
options: [
|
|
528
|
-
{ label: '25 % af siden', value: '25' },
|
|
529
|
-
{ label: '50 % af siden', value: '50' },
|
|
530
|
-
{ label: '75 % af siden', value: '75' },
|
|
531
|
-
{ label: 'Hele siden', value: '100' },
|
|
532
|
-
],
|
|
533
|
-
only: { field: 'trigger', is: ['scroll'] },
|
|
534
|
-
},
|
|
535
|
-
{
|
|
536
|
-
name: 'button',
|
|
537
|
-
label: 'Knap',
|
|
538
|
-
type: 'select',
|
|
539
|
-
required: true,
|
|
540
|
-
default: 'booking',
|
|
541
|
-
options: [
|
|
542
|
-
{ label: 'Book en tid', value: 'booking' },
|
|
543
|
-
{ label: 'Ring', value: 'phone' },
|
|
544
|
-
{ label: 'En side', value: 'page' },
|
|
545
|
-
{ label: 'Download PDF', value: 'file' },
|
|
546
|
-
{ label: 'Ingen knap', value: 'none' },
|
|
547
|
-
],
|
|
548
|
-
},
|
|
549
|
-
{
|
|
550
|
-
name: 'label',
|
|
551
|
-
label: 'Knaptekst',
|
|
552
|
-
type: 'string',
|
|
553
|
-
max: 30,
|
|
554
|
-
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
555
|
-
only: { field: 'button', is: ['booking', 'phone', 'page', 'file'] },
|
|
556
|
-
},
|
|
557
|
-
// A PDF from "Filer" (public/filer/), by its address (/filer/<name>.pdf).
|
|
558
|
-
{
|
|
559
|
-
name: 'file',
|
|
560
|
-
label: 'PDF',
|
|
561
|
-
type: 'relation',
|
|
562
|
-
to: 'files',
|
|
563
|
-
required: true,
|
|
564
|
-
edit: { to: 'filer', text: 'Upload en PDF' },
|
|
565
|
-
only: { field: 'button', is: ['file'] },
|
|
566
|
-
},
|
|
567
|
-
{
|
|
568
|
-
name: 'href',
|
|
569
|
-
label: 'Side (knap)',
|
|
570
|
-
type: 'relation',
|
|
571
|
-
to: 'pages',
|
|
572
|
-
fixed: true,
|
|
573
|
-
required: true,
|
|
574
|
-
only: { field: 'button', is: ['page'] },
|
|
575
|
-
},
|
|
576
|
-
// The action bar's one or two items, each a button or a text (`type`; without one, a button, as before there were
|
|
577
|
-
// texts). The first button is filled, a second with a line. Each button goes where a button of "Knapper" can
|
|
578
|
-
// (Button in packages/editor/src/standard/buttons/fields.ts, the targets of `buttonTargets` in config.ts and a
|
|
579
|
-
// page): "Book en tid" (what books on the page, an app's booking sheet, else the booking page), "Ring", "Åbn
|
|
580
|
-
// promovering" (one shown on every page: a pop-up, or an app's booking sheet) or a page. A text is a list row of
|
|
581
|
-
// two lines, its heading over its text, beside the button (ActionBar.astro).
|
|
582
|
-
{
|
|
583
|
-
name: 'buttons',
|
|
584
|
-
label: 'Knapper og tekst',
|
|
585
|
-
singular: 'punkt',
|
|
586
|
-
type: 'list',
|
|
587
|
-
summary: ['label', 'heading'],
|
|
588
|
-
required: true,
|
|
589
|
-
maxItems: 2,
|
|
590
|
-
hint: 'Højst to punkter.',
|
|
591
|
-
default: [{ type: 'button', label: '', to: 'booking' }],
|
|
592
|
-
only: { field: 'type', is: ['bookingbar'] },
|
|
593
|
-
fields: [
|
|
594
|
-
{
|
|
595
|
-
name: 'type',
|
|
596
|
-
label: 'Type',
|
|
597
|
-
type: 'select',
|
|
598
|
-
segments: true,
|
|
599
|
-
default: 'button',
|
|
600
|
-
options: [
|
|
601
|
-
{ label: 'Knap', value: 'button' },
|
|
602
|
-
{ label: 'Tekst', value: 'text' },
|
|
603
|
-
],
|
|
604
|
-
},
|
|
605
|
-
{
|
|
606
|
-
name: 'heading',
|
|
607
|
-
label: 'Overskrift',
|
|
608
|
-
type: 'string',
|
|
609
|
-
required: true,
|
|
610
|
-
max: 30,
|
|
611
|
-
only: { field: 'type', is: ['text'] },
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
name: 'text',
|
|
615
|
-
label: 'Tekst',
|
|
616
|
-
type: 'string',
|
|
617
|
-
max: 40,
|
|
618
|
-
hint: 'Står under overskriften.',
|
|
619
|
-
only: { field: 'type', is: ['text'] },
|
|
620
|
-
},
|
|
621
|
-
{
|
|
622
|
-
name: 'label',
|
|
623
|
-
label: 'Knaptekst',
|
|
624
|
-
type: 'string',
|
|
625
|
-
max: 30,
|
|
626
|
-
hint: 'Hvis feltet er tomt, bruges standardteksten eller sidens navn.',
|
|
627
|
-
only: { field: 'type', is: ['button'] },
|
|
628
|
-
},
|
|
629
|
-
{
|
|
630
|
-
name: 'to',
|
|
631
|
-
label: 'Fører til',
|
|
632
|
-
type: 'select',
|
|
633
|
-
required: true,
|
|
634
|
-
default: 'booking',
|
|
635
|
-
only: { field: 'type', is: ['button'] },
|
|
636
|
-
options: [
|
|
637
|
-
{ label: 'Book en tid', value: 'booking' },
|
|
638
|
-
{ label: 'Ring', value: 'phone' },
|
|
639
|
-
{ label: 'Åbn promovering', value: 'promotion', onPage: 'promotions' },
|
|
640
|
-
{ label: 'En side', value: 'page' },
|
|
641
|
-
],
|
|
642
|
-
},
|
|
643
|
-
{
|
|
644
|
-
name: 'open',
|
|
645
|
-
label: 'Promovering',
|
|
646
|
-
type: 'relation',
|
|
647
|
-
to: 'promotions',
|
|
648
|
-
onPage: true,
|
|
649
|
-
required: true,
|
|
650
|
-
only: { field: 'to', is: ['promotion'] },
|
|
651
|
-
},
|
|
652
|
-
{
|
|
653
|
-
name: 'href',
|
|
654
|
-
label: 'Side',
|
|
655
|
-
type: 'relation',
|
|
656
|
-
to: 'pages',
|
|
657
|
-
fixed: true,
|
|
658
|
-
required: true,
|
|
659
|
-
only: { field: 'to', is: ['page'] },
|
|
660
|
-
},
|
|
661
|
-
],
|
|
662
|
-
},
|
|
663
|
-
],
|
|
664
|
-
},
|
|
665
|
-
{
|
|
666
|
-
kind: 'files',
|
|
667
|
-
id: 'footer',
|
|
668
|
-
label: 'Footer',
|
|
669
|
-
singular: 'footer',
|
|
670
|
-
files: [
|
|
671
|
-
// src/data/footer.json, read by packages/editor/theme/layouts/Base.astro.
|
|
672
|
-
{
|
|
673
|
-
file: 'src/data/footer.json',
|
|
674
|
-
label: 'Footeren',
|
|
675
|
-
view: '/',
|
|
676
|
-
fields: [
|
|
677
|
-
{ name: 'text', label: 'Tekst (under navnet)', type: 'text', required: true },
|
|
678
|
-
{
|
|
679
|
-
name: 'contactHeading',
|
|
680
|
-
label: 'Overskrift (kontakt)',
|
|
681
|
-
type: 'string',
|
|
682
|
-
required: true,
|
|
683
|
-
edit: { to: 'virksomheden/kontakt', text: 'Rediger telefon, e-mail og adresse' },
|
|
684
|
-
},
|
|
685
|
-
{ name: 'linksHeading', label: 'Overskrift (links)', type: 'string', required: true },
|
|
686
|
-
{
|
|
687
|
-
name: 'links',
|
|
688
|
-
label: 'Links',
|
|
689
|
-
singular: 'link',
|
|
690
|
-
type: 'list',
|
|
691
|
-
summary: 'label',
|
|
692
|
-
required: true,
|
|
693
|
-
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
694
|
-
},
|
|
695
|
-
],
|
|
696
|
-
},
|
|
697
|
-
],
|
|
698
|
-
},
|
|
699
|
-
{
|
|
700
|
-
kind: 'files',
|
|
701
|
-
id: 'menu',
|
|
702
|
-
label: 'Hovedmenu',
|
|
703
|
-
singular: 'hovedmenu',
|
|
704
|
-
files: [
|
|
705
|
-
// src/data/menu.json, read by packages/editor/site/site.ts (nav, navShown) for the header (Header.astro, MobileMenu.tsx).
|
|
706
|
-
{
|
|
707
|
-
file: 'src/data/menu.json',
|
|
708
|
-
label: 'Hovedmenuen',
|
|
709
|
-
view: '/',
|
|
710
|
-
fields: [
|
|
711
|
-
{
|
|
712
|
-
name: 'enabled',
|
|
713
|
-
label: 'Aktiveret',
|
|
714
|
-
type: 'boolean',
|
|
715
|
-
toggle: ['Til', 'Fra'],
|
|
716
|
-
default: true,
|
|
717
|
-
hint: 'Når menuen er fra, har headeren hverken menu eller menuknap.',
|
|
718
|
-
},
|
|
719
|
-
],
|
|
720
|
-
root: {
|
|
721
|
-
name: 'items',
|
|
722
|
-
label: 'Menupunkter',
|
|
723
|
-
singular: 'menupunkt',
|
|
724
|
-
type: 'list',
|
|
725
|
-
summary: 'label',
|
|
726
|
-
fields: [
|
|
727
|
-
{ name: 'label', label: 'Tekst', type: 'string', required: true },
|
|
728
|
-
menuHref,
|
|
729
|
-
{
|
|
730
|
-
name: 'children',
|
|
731
|
-
label: 'Undermenu',
|
|
732
|
-
singular: 'punkt',
|
|
733
|
-
type: 'list',
|
|
734
|
-
summary: 'label',
|
|
735
|
-
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
736
|
-
},
|
|
737
|
-
],
|
|
738
|
-
},
|
|
739
|
-
},
|
|
740
|
-
],
|
|
741
|
-
},
|
|
742
|
-
{
|
|
743
|
-
kind: 'files',
|
|
744
|
-
id: 'mobilmenu',
|
|
745
|
-
label: 'Mobilmenu',
|
|
746
|
-
singular: 'mobilmenu',
|
|
747
|
-
files: [
|
|
748
|
-
// src/data/mobile-menu.json, read by packages/editor/site/site.ts (mobileNav) for the bar under the header (MobileNav.astro).
|
|
749
|
-
{
|
|
750
|
-
file: 'src/data/mobile-menu.json',
|
|
751
|
-
label: 'Mobilmenuen',
|
|
752
|
-
view: '/',
|
|
753
|
-
fields: [
|
|
754
|
-
{
|
|
755
|
-
name: 'enabled',
|
|
756
|
-
label: 'Aktiveret',
|
|
757
|
-
type: 'boolean',
|
|
758
|
-
toggle: ['Til', 'Fra'],
|
|
759
|
-
default: false,
|
|
760
|
-
hint: 'Punkterne står på en linje under headeren på en telefon og kan skubbes til siden.',
|
|
761
|
-
},
|
|
762
|
-
],
|
|
763
|
-
root: {
|
|
764
|
-
name: 'items',
|
|
765
|
-
label: 'Menupunkter',
|
|
766
|
-
singular: 'menupunkt',
|
|
767
|
-
type: 'list',
|
|
768
|
-
summary: 'label',
|
|
769
|
-
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
770
|
-
},
|
|
771
|
-
},
|
|
772
|
-
],
|
|
773
|
-
},
|
|
774
|
-
];
|
|
1
|
+
// What the editor can edit on a site, and the fields of each (the kinds of collection and field:
|
|
2
|
+
// packages/editor/src/schema.ts). The fields mirror src/content.config.ts and the readers of the data files
|
|
3
|
+
// (packages/editor/site/*.ts); keep them in step.
|
|
4
|
+
// markdown: a folder of .md files (front matter + text): blog posts and pages.
|
|
5
|
+
// folder: a folder of .json files, one entry per file: categories, promotions (the testimonials are the standard
|
|
6
|
+
// block "Udtalelser"'s, packages/editor/src/standard/testimonials/list.ts, an app's lists its own,
|
|
7
|
+
// src/apps/<app>/lists.ts).
|
|
8
|
+
// files: single .json files: the settings (the standard pages …), the footer and the menu.
|
|
9
|
+
import { AppWindow, SquareHalfBottom } from '@phosphor-icons/react';
|
|
10
|
+
import type { Collection, Field } from '../src/schema';
|
|
11
|
+
import { fromContactBar } from '../lib/contactBar';
|
|
12
|
+
import { config } from '@site/config';
|
|
13
|
+
import { standardPaths } from '@site/standardPages';
|
|
14
|
+
|
|
15
|
+
// The page Google should count as the original of a page or a post (rel=canonical); empty is itself.
|
|
16
|
+
// Under "Søgemaskiner" with the Google texts (EntryForm.tsx).
|
|
17
|
+
const canonical: Field = {
|
|
18
|
+
name: 'canonical',
|
|
19
|
+
label: 'Canonical URL',
|
|
20
|
+
type: 'relation',
|
|
21
|
+
to: 'pages',
|
|
22
|
+
fixed: true,
|
|
23
|
+
hint: 'Den side, Google skal vise i stedet for denne.',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Not for search engines: noindex, and not in the sitemap. Under "Søgemaskiner" too.
|
|
27
|
+
const noindex: Field = {
|
|
28
|
+
name: 'noindex',
|
|
29
|
+
label: 'Skjul for søgemaskiner (noindex)',
|
|
30
|
+
type: 'boolean',
|
|
31
|
+
hint: 'Siden vises ikke i Google.',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// The text of the picture at the top of a post (a page has its pictures in its text): "Dekorativt billede" (drawn with alt="", screen readers skip
|
|
35
|
+
// it), else its alternative text.
|
|
36
|
+
const topImageText: Field[] = [
|
|
37
|
+
{
|
|
38
|
+
name: 'imageDecorative',
|
|
39
|
+
label: 'Dekorativt billede',
|
|
40
|
+
type: 'boolean',
|
|
41
|
+
toggle: ['Til', 'Fra'],
|
|
42
|
+
hint: 'Skærmlæsere springer billedet over.',
|
|
43
|
+
},
|
|
44
|
+
{ name: 'imageAlt', label: 'Alternativ tekst', type: 'string', only: { field: 'imageDecorative', is: ['', 'false'] } },
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
// "Status" at the top of a page or post (EntryForm.tsx): Kladde, Skjult, Udgivet or Planlagt, and for
|
|
48
|
+
// Planlagt when (packages/editor/lib/status.mjs). Udgivet is no `status` in the file. A post's date follows the time.
|
|
49
|
+
const status = (hidden: string): Field[] => [
|
|
50
|
+
{
|
|
51
|
+
name: 'status',
|
|
52
|
+
label: 'Status',
|
|
53
|
+
type: 'select',
|
|
54
|
+
segments: true,
|
|
55
|
+
options: [
|
|
56
|
+
{ value: 'draft', label: 'Kladde', hint: 'Vises ikke på hjemmesiden.' },
|
|
57
|
+
{ value: 'unlisted', label: 'Skjult', hint: hidden },
|
|
58
|
+
{ value: '', label: 'Udgivet', hint: 'Vises på hjemmesiden.' },
|
|
59
|
+
{ value: 'scheduled', label: 'Planlagt', hint: 'Vises på hjemmesiden fra tidspunktet nedenfor.' },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'publishAt',
|
|
64
|
+
label: 'Tidspunkt',
|
|
65
|
+
type: 'datetime',
|
|
66
|
+
required: true,
|
|
67
|
+
only: { field: 'status', is: ['scheduled'] },
|
|
68
|
+
hint: 'Udgives senest en time efter.',
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
// The Google texts, and the picture when the page is shared, which the editor shows under "Sociale medier" (SHARE_FIELDS
|
|
73
|
+
// in packages/editor/src/seo.ts).
|
|
74
|
+
const seo: Field[] = [
|
|
75
|
+
{
|
|
76
|
+
name: 'seoTitle',
|
|
77
|
+
label: 'Google-titel',
|
|
78
|
+
type: 'string',
|
|
79
|
+
hint: 'Højst ca. 60 tegn.',
|
|
80
|
+
max: 70,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'seoDescription',
|
|
84
|
+
label: 'Google-beskrivelse',
|
|
85
|
+
type: 'text',
|
|
86
|
+
hint: 'Ca. 140-155 tegn.',
|
|
87
|
+
max: 170,
|
|
88
|
+
},
|
|
89
|
+
// og:image (Base.astro), cut to 1200 × 630 by packages/editor/scripts/responsive-images.mjs.
|
|
90
|
+
{
|
|
91
|
+
name: 'shareImage',
|
|
92
|
+
label: 'Billede ved deling',
|
|
93
|
+
type: 'image',
|
|
94
|
+
hint: 'Vises, når siden deles, fx på Facebook.',
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
// The title and description when a page or post is shared (og:title, og:description in Base.astro), under "Sociale
|
|
99
|
+
// medier" with the picture.
|
|
100
|
+
const shareTexts: Field[] = [
|
|
101
|
+
{
|
|
102
|
+
name: 'shareTitle',
|
|
103
|
+
label: 'Titel ved deling',
|
|
104
|
+
type: 'string',
|
|
105
|
+
hint: 'Hvis feltet er tomt, bruges Google-titlen.',
|
|
106
|
+
max: 70,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'shareDescription',
|
|
110
|
+
label: 'Beskrivelse ved deling',
|
|
111
|
+
type: 'text',
|
|
112
|
+
hint: 'Hvis feltet er tomt, bruges Google-beskrivelsen.',
|
|
113
|
+
max: 170,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
// The words that link to a page or post from the others (packages/editor/site/autolinks.mjs). Under
|
|
118
|
+
// "Søgemaskiner" with the Google texts (EntryForm.tsx).
|
|
119
|
+
const keywords: Field[] = [
|
|
120
|
+
{
|
|
121
|
+
name: 'keyword',
|
|
122
|
+
label: 'Primært søgeord',
|
|
123
|
+
type: 'string',
|
|
124
|
+
chips: 'one',
|
|
125
|
+
hint: 'Ordet bliver et link hertil fra andre sider.',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'keywords',
|
|
129
|
+
label: 'Sekundære søgeord',
|
|
130
|
+
type: 'string',
|
|
131
|
+
chips: 'many',
|
|
132
|
+
hint: 'Hvert ord bliver et link hertil fra andre sider.',
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
|
|
136
|
+
// The business, on "Virksomheden" (CompanyForm.tsx): its name and title, phone, e-mail, address and CVR number
|
|
137
|
+
// (src/data/contact.json), shown at the top and bottom of every page and in the blocks that show them ("Kontakt" and
|
|
138
|
+
// "Adresse"); and the bank details (src/data/payment.json), shown in "Betaling". The calendar
|
|
139
|
+
// is the app Calendly's (src/apps/calendly/).
|
|
140
|
+
export const contactFields: Field[] = [
|
|
141
|
+
{ name: 'name', label: 'Navn', type: 'string', required: true },
|
|
142
|
+
{ name: 'role', label: 'Titel', type: 'string', required: true },
|
|
143
|
+
{
|
|
144
|
+
name: 'phone',
|
|
145
|
+
label: 'Telefon',
|
|
146
|
+
type: 'string',
|
|
147
|
+
required: true,
|
|
148
|
+
digitsInPairs: 8,
|
|
149
|
+
phone: '+45',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'email',
|
|
153
|
+
label: 'E-mail',
|
|
154
|
+
type: 'string',
|
|
155
|
+
required: true,
|
|
156
|
+
pattern: [
|
|
157
|
+
'^[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*\\.[A-Za-z]{2,}$',
|
|
158
|
+
'Skriv en gyldig e-mailadresse',
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: 'street',
|
|
163
|
+
label: 'Vej og nummer',
|
|
164
|
+
type: 'string',
|
|
165
|
+
required: true,
|
|
166
|
+
},
|
|
167
|
+
{ name: 'city', label: 'Postnummer og by', type: 'string', required: true },
|
|
168
|
+
{
|
|
169
|
+
name: 'cvr',
|
|
170
|
+
label: 'CVR-nummer',
|
|
171
|
+
type: 'string',
|
|
172
|
+
hint: 'Vises nederst på hver side.',
|
|
173
|
+
pattern: ['^\\d{8}$', 'Et CVR-nummer har otte cifre'],
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
// The bank details, a part of its own under "Betaling" (company.ts, src/data/payment.json).
|
|
178
|
+
export const bankFields: Field[] = [
|
|
179
|
+
{ name: 'bank', label: 'Bank', type: 'string', required: true },
|
|
180
|
+
{ name: 'reg', label: 'Reg.nr.', type: 'string', required: true },
|
|
181
|
+
{ name: 'account', label: 'Kontonummer', type: 'string', required: true },
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
// The standard pages (src/data/standard-pages.json, config.standardPages, packages/editor/defaults/standardPages.ts), each a field that
|
|
185
|
+
// picks a page, as rows of a list (Part.rows): the front page, shown at / (packages/editor/site/home.ts), the blog page, shown at
|
|
186
|
+
// /blog/, the page shown for an address that does not exist (packages/editor/site/standardPages.ts) and the contact page under
|
|
187
|
+
// "Udseende" › "Standardsider" (appearance in editor.ts), and the privacy policy and the cookie policy under "Privatliv" ›
|
|
188
|
+
// "Privatlivssider" (privacy.ts). Different pages, but the cookie policy may be the privacy policy (keptBy in rules.ts).
|
|
189
|
+
const standardPageFields: Field[] = [
|
|
190
|
+
{
|
|
191
|
+
name: 'front',
|
|
192
|
+
label: 'Forside',
|
|
193
|
+
type: 'relation',
|
|
194
|
+
to: 'standardPages',
|
|
195
|
+
required: true,
|
|
196
|
+
hint: 'Siden vises på forsiden, og dens egen adresse sender videre dertil.',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: 'blog',
|
|
200
|
+
label: 'Blogside',
|
|
201
|
+
type: 'relation',
|
|
202
|
+
to: 'standardPages',
|
|
203
|
+
required: true,
|
|
204
|
+
hint: 'Siden vises på /blog/, og dens egen adresse sender videre dertil.',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: 'notFound',
|
|
208
|
+
label: '404-side',
|
|
209
|
+
type: 'relation',
|
|
210
|
+
to: 'standardPages',
|
|
211
|
+
required: true,
|
|
212
|
+
hint: 'Siden vises, når en adresse ikke findes.',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'contact',
|
|
216
|
+
label: 'Kontaktside',
|
|
217
|
+
type: 'relation',
|
|
218
|
+
to: 'standardPages',
|
|
219
|
+
required: true,
|
|
220
|
+
hint: 'Linket til vejvisningen går hertil.',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'privacy',
|
|
224
|
+
label: 'Privatlivspolitik',
|
|
225
|
+
type: 'relation',
|
|
226
|
+
to: 'standardPages',
|
|
227
|
+
required: true,
|
|
228
|
+
hint: 'Siden, der fortæller, hvilke oplysninger der gemmes, og hvorfor.',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: 'cookies',
|
|
232
|
+
label: 'Cookiepolitik',
|
|
233
|
+
type: 'relation',
|
|
234
|
+
to: 'standardPages',
|
|
235
|
+
required: true,
|
|
236
|
+
hint: 'Cookiebannerets link går hertil; det må være privatlivspolitikken.',
|
|
237
|
+
},
|
|
238
|
+
];
|
|
239
|
+
|
|
240
|
+
/** The fields of the standard pages by their keys, in that order. */
|
|
241
|
+
export const standardPageFieldsOf = (...keys: string[]) => keys.map((key) => standardPageFields.find((f) => f.name === key)!);
|
|
242
|
+
|
|
243
|
+
/** The "Book en tid" box's own heading and text, in a page's text; empty,
|
|
244
|
+
* the shared ones ("Blokke" › "Book en tid", booking.json). */
|
|
245
|
+
export const bookingTexts: Field[] = [
|
|
246
|
+
{
|
|
247
|
+
name: 'heading',
|
|
248
|
+
label: 'Overskrift',
|
|
249
|
+
type: 'string',
|
|
250
|
+
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
251
|
+
placeholder: (site) => site.booking.heading,
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: 'text',
|
|
255
|
+
label: 'Tekst',
|
|
256
|
+
type: 'text',
|
|
257
|
+
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
258
|
+
placeholder: (site) => site.booking.text,
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
// The icons the owner picks from on the site's own fields (the same as the standard blocks', iconNames in
|
|
263
|
+
// packages/editor/src/icon.tsx, which draws them).
|
|
264
|
+
export const icons = [
|
|
265
|
+
['Diplom', 'certificate'],
|
|
266
|
+
['Hjerte', 'heart'],
|
|
267
|
+
['Hånd med hjerte', 'hand-heart'],
|
|
268
|
+
['Tre personer', 'users-three'],
|
|
269
|
+
['To personer', 'users'],
|
|
270
|
+
['Studenterhue', 'graduation-cap'],
|
|
271
|
+
['Håndtryk', 'handshake'],
|
|
272
|
+
['Bog', 'book-open'],
|
|
273
|
+
['Bog med tekst', 'book-open-text'],
|
|
274
|
+
['Medalje', 'medal'],
|
|
275
|
+
['Samtale', 'chats'],
|
|
276
|
+
['Lotusblomst', 'flower-lotus'],
|
|
277
|
+
['Blad', 'leaf'],
|
|
278
|
+
['Pære', 'lightbulb'],
|
|
279
|
+
['Tog', 'train'],
|
|
280
|
+
['Bus', 'bus'],
|
|
281
|
+
['Cykel', 'bicycle'],
|
|
282
|
+
['Bil', 'car'],
|
|
283
|
+
['Dør', 'door-open'],
|
|
284
|
+
['Videokamera', 'video-camera'],
|
|
285
|
+
['Redningskrans', 'lifebuoy'],
|
|
286
|
+
['Telefon', 'phone'],
|
|
287
|
+
['Ur', 'clock'],
|
|
288
|
+
['Kortnål', 'map-pin'],
|
|
289
|
+
['Kaffe', 'coffee'],
|
|
290
|
+
['Kørestol', 'wheelchair'],
|
|
291
|
+
['Info', 'info'],
|
|
292
|
+
['Brev', 'envelope-simple'],
|
|
293
|
+
].map(([label, value]) => ({ label, value }));
|
|
294
|
+
|
|
295
|
+
// A link in the menu: any page, the front page and the blog too, stored by its address.
|
|
296
|
+
const menuHref: Field = { name: 'href', label: 'Side', type: 'relation', to: 'pages', fixed: true, required: true };
|
|
297
|
+
|
|
298
|
+
export const collections: Collection[] = [
|
|
299
|
+
{
|
|
300
|
+
kind: 'markdown',
|
|
301
|
+
id: 'blog',
|
|
302
|
+
create: 'Nyt blogindlæg',
|
|
303
|
+
label: 'Blogindlæg',
|
|
304
|
+
singular: 'blogindlæg',
|
|
305
|
+
folder: 'src/content/blog',
|
|
306
|
+
deletable: true,
|
|
307
|
+
fields: [
|
|
308
|
+
...status('Vises ikke på bloggen eller i Google, men kan åbnes på sin adresse.'),
|
|
309
|
+
{ name: 'title', label: 'Titel', type: 'string', required: true },
|
|
310
|
+
{ name: 'date', label: 'Dato', type: 'date', required: true },
|
|
311
|
+
{ name: 'path', label: 'Adresse', type: 'string', address: 'post' },
|
|
312
|
+
{ name: 'description', label: 'Kort beskrivelse', type: 'text' },
|
|
313
|
+
{
|
|
314
|
+
name: 'categories',
|
|
315
|
+
label: 'Tags',
|
|
316
|
+
type: 'relation',
|
|
317
|
+
to: 'categories',
|
|
318
|
+
multiple: true,
|
|
319
|
+
add: 'Tilføj tag',
|
|
320
|
+
edit: { to: 'ny/kategorier', text: 'Opret et tag' },
|
|
321
|
+
},
|
|
322
|
+
{ name: 'image', label: 'Billede øverst', type: 'image' },
|
|
323
|
+
...topImageText,
|
|
324
|
+
...seo,
|
|
325
|
+
...shareTexts,
|
|
326
|
+
...keywords,
|
|
327
|
+
canonical,
|
|
328
|
+
noindex,
|
|
329
|
+
],
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
kind: 'markdown',
|
|
333
|
+
id: 'pages',
|
|
334
|
+
create: 'Ny side',
|
|
335
|
+
label: 'Sider',
|
|
336
|
+
singular: 'side',
|
|
337
|
+
folder: 'src/content/pages',
|
|
338
|
+
fields: [
|
|
339
|
+
...status('Vises ikke i Google, men kan åbnes på sin adresse.'),
|
|
340
|
+
{ name: 'title', label: 'Titel', type: 'string', required: true },
|
|
341
|
+
{ name: 'path', label: 'Adresse', type: 'string', address: 'page' },
|
|
342
|
+
{ name: 'description', label: 'Kort beskrivelse', type: 'text' },
|
|
343
|
+
{
|
|
344
|
+
name: 'wide',
|
|
345
|
+
label: 'Hele bredden',
|
|
346
|
+
type: 'boolean',
|
|
347
|
+
layout: true,
|
|
348
|
+
hint: 'Siden fylder hele bredden uden spalten ved siden af teksten.',
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'review',
|
|
352
|
+
label: 'Til gennemsyn',
|
|
353
|
+
type: 'text',
|
|
354
|
+
hint: 'Vises kun på sider under /ny/.',
|
|
355
|
+
},
|
|
356
|
+
...seo,
|
|
357
|
+
...shareTexts,
|
|
358
|
+
...keywords,
|
|
359
|
+
canonical,
|
|
360
|
+
noindex,
|
|
361
|
+
],
|
|
362
|
+
blocks: true,
|
|
363
|
+
// One "Book en tid" a page (at the very end it goes across the page, PageLayout.astro). A new page
|
|
364
|
+
// starts empty.
|
|
365
|
+
template: { max: { booking: 1 } },
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
kind: 'folder',
|
|
369
|
+
id: 'kategorier',
|
|
370
|
+
create: 'Nyt tag',
|
|
371
|
+
label: 'Tags',
|
|
372
|
+
singular: 'tag',
|
|
373
|
+
folder: 'src/data/categories',
|
|
374
|
+
deletable: true,
|
|
375
|
+
slugFrom: 'name',
|
|
376
|
+
summary: (d) => String(d.name ?? ''),
|
|
377
|
+
fields: [
|
|
378
|
+
{ name: 'name', label: 'Navn', type: 'string', required: true },
|
|
379
|
+
...seo,
|
|
380
|
+
{
|
|
381
|
+
name: 'blogCategory',
|
|
382
|
+
label: 'Blogkategori',
|
|
383
|
+
type: 'boolean',
|
|
384
|
+
toggle: ['Vis', 'Skjul'],
|
|
385
|
+
default: true,
|
|
386
|
+
hint: 'Vis tagget på bloggen med sin egen side.',
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
// "Promovering": what is laid over the pages to get visitors to book, call or sign up, in
|
|
392
|
+
// src/data/popups/<slug>.json, read by packages/editor/site/popups.ts, on every page or those picked under "Sider".
|
|
393
|
+
// The pop-ups are shown by packages/editor/theme/components/Popup.astro; a kind an app adds without a part
|
|
394
|
+
// in the pop-up (src/apps/<app>/popups/View.tsx) shows itself (the app Calendly's booking sheet,
|
|
395
|
+
// src/apps/calendly/, when a button opens it).
|
|
396
|
+
kind: 'folder',
|
|
397
|
+
id: 'popups',
|
|
398
|
+
create: 'Ny promovering',
|
|
399
|
+
label: 'Promovering',
|
|
400
|
+
singular: 'promovering',
|
|
401
|
+
folder: 'src/data/popups',
|
|
402
|
+
deletable: true,
|
|
403
|
+
// A pop-up by its heading; a kind without one by its name (the app's bar), else by the kind's name
|
|
404
|
+
// (the action bar, DataForm.tsx, Library.tsx).
|
|
405
|
+
slugFrom: ['heading', 'name'],
|
|
406
|
+
summary: (d) => String(d.heading ?? d.name ?? ''),
|
|
407
|
+
shownOn: { pages: 'pages', tags: 'tags', everywhere: { field: 'where', is: 'all' } },
|
|
408
|
+
onOff: 'enabled',
|
|
409
|
+
// Of kinds, picked under "+" when a new one is made: the pop-up, with a button; the action bar (`bookingbar`) at the
|
|
410
|
+
// bottom of a phone's screen (shown by packages/editor/theme/components/ActionBar.astro), without the pop-up's fields
|
|
411
|
+
// (`omit`) and with its own; and those the apps add (src/apps/<app>/popups/, e.g.
|
|
412
|
+
// Mailchimp's with a signup form, and Calendly's booking sheet), with fields of their own and without
|
|
413
|
+
// those of the pop-up they do not have (AppKind.omit).
|
|
414
|
+
kinds: 'type',
|
|
415
|
+
omit: {
|
|
416
|
+
bookingbar: ['image', 'heading', 'text', 'trigger', 'button'],
|
|
417
|
+
},
|
|
418
|
+
// What a button ("Knapper": "Åbn promovering") can open of one: a pop-up itself, the action bar nothing (opens.ts).
|
|
419
|
+
opens: { standard: { label: 'Pop op-vindue' } },
|
|
420
|
+
// A contact bar (`contactbar`, a kind of its own before it became an action bar) is an action bar with its two
|
|
421
|
+
// buttons, to call and to its page, without one the contact page (packages/editor/lib/contactBar.ts).
|
|
422
|
+
upgrade: (data, files) => fromContactBar(data, standardPaths(files.find((f) => f.path === config.standardPages)?.text).contact ?? ''),
|
|
423
|
+
fields: [
|
|
424
|
+
{
|
|
425
|
+
name: 'type',
|
|
426
|
+
label: 'Type',
|
|
427
|
+
type: 'select',
|
|
428
|
+
locked: true,
|
|
429
|
+
// Without one (those made before there were kinds), it is the standard one.
|
|
430
|
+
default: 'standard',
|
|
431
|
+
options: [
|
|
432
|
+
{ label: 'Pop op-vindue', value: 'standard', icon: AppWindow, hint: 'Med billede, tekst og en knap.' },
|
|
433
|
+
{
|
|
434
|
+
label: 'Handlingslinje',
|
|
435
|
+
value: 'bookingbar',
|
|
436
|
+
icon: SquareHalfBottom,
|
|
437
|
+
hint: 'Knapper eller tekst nederst på skærmen på en telefon.',
|
|
438
|
+
},
|
|
439
|
+
],
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: 'enabled',
|
|
443
|
+
label: 'Aktiveret',
|
|
444
|
+
type: 'boolean',
|
|
445
|
+
toggle: ['Til', 'Fra'],
|
|
446
|
+
default: true,
|
|
447
|
+
},
|
|
448
|
+
// At the top of the box, to its edges in 3:2, as on the cards with a picture ("Kort").
|
|
449
|
+
{ name: 'image', label: 'Billede', type: 'image', hint: 'Vises øverst, skåret til 3:2.' },
|
|
450
|
+
{ name: 'heading', label: 'Overskrift', type: 'string', required: true, max: 80 },
|
|
451
|
+
{ name: 'text', label: 'Tekst', type: 'text' },
|
|
452
|
+
// Where it is shown, for every kind: on every page, on those picked (without `where`, from
|
|
453
|
+
// before, those picked), or on the blog posts with one of the tags picked and those tags' pages.
|
|
454
|
+
{
|
|
455
|
+
name: 'where',
|
|
456
|
+
label: 'Vises på',
|
|
457
|
+
type: 'select',
|
|
458
|
+
default: 'some',
|
|
459
|
+
options: [
|
|
460
|
+
{ label: 'Alle sider', value: 'all' },
|
|
461
|
+
{ label: 'Udvalgte sider', value: 'some' },
|
|
462
|
+
{ label: 'Blogindlæg med tags', value: 'tags' },
|
|
463
|
+
],
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
name: 'pages',
|
|
467
|
+
label: 'Sider',
|
|
468
|
+
type: 'relation',
|
|
469
|
+
to: 'pages',
|
|
470
|
+
fixed: true,
|
|
471
|
+
multiple: true,
|
|
472
|
+
required: true,
|
|
473
|
+
add: 'Tilføj side',
|
|
474
|
+
hint: 'Vises kun på disse sider.',
|
|
475
|
+
only: { field: 'where', is: ['some'] },
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
name: 'tags',
|
|
479
|
+
label: 'Tags',
|
|
480
|
+
type: 'relation',
|
|
481
|
+
to: 'categories',
|
|
482
|
+
multiple: true,
|
|
483
|
+
required: true,
|
|
484
|
+
add: 'Tilføj tag',
|
|
485
|
+
hint: 'Vises på blogindlæg med et af disse tags og på taggenes sider.',
|
|
486
|
+
only: { field: 'where', is: ['tags'] },
|
|
487
|
+
},
|
|
488
|
+
// When it opens (packages/editor/theme/components/Popup.astro): after `delay`, at `scroll` % down the page, or as the
|
|
489
|
+
// visitor is about to leave it.
|
|
490
|
+
{
|
|
491
|
+
name: 'trigger',
|
|
492
|
+
label: 'Vises',
|
|
493
|
+
type: 'select',
|
|
494
|
+
required: true,
|
|
495
|
+
default: 'time',
|
|
496
|
+
hint: 'Hver besøgende ser det, til de lukker det.',
|
|
497
|
+
options: [
|
|
498
|
+
{ label: 'Efter en tid', value: 'time' },
|
|
499
|
+
{ label: 'Når siden er rullet ned', value: 'scroll' },
|
|
500
|
+
{
|
|
501
|
+
label: 'Når den besøgende vil forlade siden',
|
|
502
|
+
value: 'exit',
|
|
503
|
+
hint: 'På en telefon: når den besøgende ruller hurtigt op.',
|
|
504
|
+
},
|
|
505
|
+
],
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
name: 'delay',
|
|
509
|
+
label: 'Vises efter',
|
|
510
|
+
type: 'select',
|
|
511
|
+
required: true,
|
|
512
|
+
default: '5',
|
|
513
|
+
only: { field: 'trigger', is: ['time'] },
|
|
514
|
+
options: [
|
|
515
|
+
{ label: 'Med det samme', value: '0' },
|
|
516
|
+
{ label: '5 sekunder', value: '5' },
|
|
517
|
+
{ label: '10 sekunder', value: '10' },
|
|
518
|
+
{ label: '30 sekunder', value: '30' },
|
|
519
|
+
],
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
name: 'scroll',
|
|
523
|
+
label: 'Rullet ned',
|
|
524
|
+
type: 'select',
|
|
525
|
+
required: true,
|
|
526
|
+
default: '25',
|
|
527
|
+
options: [
|
|
528
|
+
{ label: '25 % af siden', value: '25' },
|
|
529
|
+
{ label: '50 % af siden', value: '50' },
|
|
530
|
+
{ label: '75 % af siden', value: '75' },
|
|
531
|
+
{ label: 'Hele siden', value: '100' },
|
|
532
|
+
],
|
|
533
|
+
only: { field: 'trigger', is: ['scroll'] },
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
name: 'button',
|
|
537
|
+
label: 'Knap',
|
|
538
|
+
type: 'select',
|
|
539
|
+
required: true,
|
|
540
|
+
default: 'booking',
|
|
541
|
+
options: [
|
|
542
|
+
{ label: 'Book en tid', value: 'booking' },
|
|
543
|
+
{ label: 'Ring', value: 'phone' },
|
|
544
|
+
{ label: 'En side', value: 'page' },
|
|
545
|
+
{ label: 'Download PDF', value: 'file' },
|
|
546
|
+
{ label: 'Ingen knap', value: 'none' },
|
|
547
|
+
],
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
name: 'label',
|
|
551
|
+
label: 'Knaptekst',
|
|
552
|
+
type: 'string',
|
|
553
|
+
max: 30,
|
|
554
|
+
hint: 'Hvis feltet er tomt, bruges standardteksten.',
|
|
555
|
+
only: { field: 'button', is: ['booking', 'phone', 'page', 'file'] },
|
|
556
|
+
},
|
|
557
|
+
// A PDF from "Filer" (public/filer/), by its address (/filer/<name>.pdf).
|
|
558
|
+
{
|
|
559
|
+
name: 'file',
|
|
560
|
+
label: 'PDF',
|
|
561
|
+
type: 'relation',
|
|
562
|
+
to: 'files',
|
|
563
|
+
required: true,
|
|
564
|
+
edit: { to: 'filer', text: 'Upload en PDF' },
|
|
565
|
+
only: { field: 'button', is: ['file'] },
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
name: 'href',
|
|
569
|
+
label: 'Side (knap)',
|
|
570
|
+
type: 'relation',
|
|
571
|
+
to: 'pages',
|
|
572
|
+
fixed: true,
|
|
573
|
+
required: true,
|
|
574
|
+
only: { field: 'button', is: ['page'] },
|
|
575
|
+
},
|
|
576
|
+
// The action bar's one or two items, each a button or a text (`type`; without one, a button, as before there were
|
|
577
|
+
// texts). The first button is filled, a second with a line. Each button goes where a button of "Knapper" can
|
|
578
|
+
// (Button in packages/editor/src/standard/buttons/fields.ts, the targets of `buttonTargets` in config.ts and a
|
|
579
|
+
// page): "Book en tid" (what books on the page, an app's booking sheet, else the booking page), "Ring", "Åbn
|
|
580
|
+
// promovering" (one shown on every page: a pop-up, or an app's booking sheet) or a page. A text is a list row of
|
|
581
|
+
// two lines, its heading over its text, beside the button (ActionBar.astro).
|
|
582
|
+
{
|
|
583
|
+
name: 'buttons',
|
|
584
|
+
label: 'Knapper og tekst',
|
|
585
|
+
singular: 'punkt',
|
|
586
|
+
type: 'list',
|
|
587
|
+
summary: ['label', 'heading'],
|
|
588
|
+
required: true,
|
|
589
|
+
maxItems: 2,
|
|
590
|
+
hint: 'Højst to punkter.',
|
|
591
|
+
default: [{ type: 'button', label: '', to: 'booking' }],
|
|
592
|
+
only: { field: 'type', is: ['bookingbar'] },
|
|
593
|
+
fields: [
|
|
594
|
+
{
|
|
595
|
+
name: 'type',
|
|
596
|
+
label: 'Type',
|
|
597
|
+
type: 'select',
|
|
598
|
+
segments: true,
|
|
599
|
+
default: 'button',
|
|
600
|
+
options: [
|
|
601
|
+
{ label: 'Knap', value: 'button' },
|
|
602
|
+
{ label: 'Tekst', value: 'text' },
|
|
603
|
+
],
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
name: 'heading',
|
|
607
|
+
label: 'Overskrift',
|
|
608
|
+
type: 'string',
|
|
609
|
+
required: true,
|
|
610
|
+
max: 30,
|
|
611
|
+
only: { field: 'type', is: ['text'] },
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
name: 'text',
|
|
615
|
+
label: 'Tekst',
|
|
616
|
+
type: 'string',
|
|
617
|
+
max: 40,
|
|
618
|
+
hint: 'Står under overskriften.',
|
|
619
|
+
only: { field: 'type', is: ['text'] },
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
name: 'label',
|
|
623
|
+
label: 'Knaptekst',
|
|
624
|
+
type: 'string',
|
|
625
|
+
max: 30,
|
|
626
|
+
hint: 'Hvis feltet er tomt, bruges standardteksten eller sidens navn.',
|
|
627
|
+
only: { field: 'type', is: ['button'] },
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
name: 'to',
|
|
631
|
+
label: 'Fører til',
|
|
632
|
+
type: 'select',
|
|
633
|
+
required: true,
|
|
634
|
+
default: 'booking',
|
|
635
|
+
only: { field: 'type', is: ['button'] },
|
|
636
|
+
options: [
|
|
637
|
+
{ label: 'Book en tid', value: 'booking' },
|
|
638
|
+
{ label: 'Ring', value: 'phone' },
|
|
639
|
+
{ label: 'Åbn promovering', value: 'promotion', onPage: 'promotions' },
|
|
640
|
+
{ label: 'En side', value: 'page' },
|
|
641
|
+
],
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
name: 'open',
|
|
645
|
+
label: 'Promovering',
|
|
646
|
+
type: 'relation',
|
|
647
|
+
to: 'promotions',
|
|
648
|
+
onPage: true,
|
|
649
|
+
required: true,
|
|
650
|
+
only: { field: 'to', is: ['promotion'] },
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
name: 'href',
|
|
654
|
+
label: 'Side',
|
|
655
|
+
type: 'relation',
|
|
656
|
+
to: 'pages',
|
|
657
|
+
fixed: true,
|
|
658
|
+
required: true,
|
|
659
|
+
only: { field: 'to', is: ['page'] },
|
|
660
|
+
},
|
|
661
|
+
],
|
|
662
|
+
},
|
|
663
|
+
],
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
kind: 'files',
|
|
667
|
+
id: 'footer',
|
|
668
|
+
label: 'Footer',
|
|
669
|
+
singular: 'footer',
|
|
670
|
+
files: [
|
|
671
|
+
// src/data/footer.json, read by packages/editor/theme/layouts/Base.astro.
|
|
672
|
+
{
|
|
673
|
+
file: 'src/data/footer.json',
|
|
674
|
+
label: 'Footeren',
|
|
675
|
+
view: '/',
|
|
676
|
+
fields: [
|
|
677
|
+
{ name: 'text', label: 'Tekst (under navnet)', type: 'text', required: true },
|
|
678
|
+
{
|
|
679
|
+
name: 'contactHeading',
|
|
680
|
+
label: 'Overskrift (kontakt)',
|
|
681
|
+
type: 'string',
|
|
682
|
+
required: true,
|
|
683
|
+
edit: { to: 'virksomheden/kontakt', text: 'Rediger telefon, e-mail og adresse' },
|
|
684
|
+
},
|
|
685
|
+
{ name: 'linksHeading', label: 'Overskrift (links)', type: 'string', required: true },
|
|
686
|
+
{
|
|
687
|
+
name: 'links',
|
|
688
|
+
label: 'Links',
|
|
689
|
+
singular: 'link',
|
|
690
|
+
type: 'list',
|
|
691
|
+
summary: 'label',
|
|
692
|
+
required: true,
|
|
693
|
+
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
},
|
|
697
|
+
],
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
kind: 'files',
|
|
701
|
+
id: 'menu',
|
|
702
|
+
label: 'Hovedmenu',
|
|
703
|
+
singular: 'hovedmenu',
|
|
704
|
+
files: [
|
|
705
|
+
// src/data/menu.json, read by packages/editor/site/site.ts (nav, navShown) for the header (Header.astro, MobileMenu.tsx).
|
|
706
|
+
{
|
|
707
|
+
file: 'src/data/menu.json',
|
|
708
|
+
label: 'Hovedmenuen',
|
|
709
|
+
view: '/',
|
|
710
|
+
fields: [
|
|
711
|
+
{
|
|
712
|
+
name: 'enabled',
|
|
713
|
+
label: 'Aktiveret',
|
|
714
|
+
type: 'boolean',
|
|
715
|
+
toggle: ['Til', 'Fra'],
|
|
716
|
+
default: true,
|
|
717
|
+
hint: 'Når menuen er fra, har headeren hverken menu eller menuknap.',
|
|
718
|
+
},
|
|
719
|
+
],
|
|
720
|
+
root: {
|
|
721
|
+
name: 'items',
|
|
722
|
+
label: 'Menupunkter',
|
|
723
|
+
singular: 'menupunkt',
|
|
724
|
+
type: 'list',
|
|
725
|
+
summary: 'label',
|
|
726
|
+
fields: [
|
|
727
|
+
{ name: 'label', label: 'Tekst', type: 'string', required: true },
|
|
728
|
+
menuHref,
|
|
729
|
+
{
|
|
730
|
+
name: 'children',
|
|
731
|
+
label: 'Undermenu',
|
|
732
|
+
singular: 'punkt',
|
|
733
|
+
type: 'list',
|
|
734
|
+
summary: 'label',
|
|
735
|
+
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
736
|
+
},
|
|
737
|
+
],
|
|
738
|
+
},
|
|
739
|
+
},
|
|
740
|
+
],
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
kind: 'files',
|
|
744
|
+
id: 'mobilmenu',
|
|
745
|
+
label: 'Mobilmenu',
|
|
746
|
+
singular: 'mobilmenu',
|
|
747
|
+
files: [
|
|
748
|
+
// src/data/mobile-menu.json, read by packages/editor/site/site.ts (mobileNav) for the bar under the header (MobileNav.astro).
|
|
749
|
+
{
|
|
750
|
+
file: 'src/data/mobile-menu.json',
|
|
751
|
+
label: 'Mobilmenuen',
|
|
752
|
+
view: '/',
|
|
753
|
+
fields: [
|
|
754
|
+
{
|
|
755
|
+
name: 'enabled',
|
|
756
|
+
label: 'Aktiveret',
|
|
757
|
+
type: 'boolean',
|
|
758
|
+
toggle: ['Til', 'Fra'],
|
|
759
|
+
default: false,
|
|
760
|
+
hint: 'Punkterne står på en linje under headeren på en telefon og kan skubbes til siden.',
|
|
761
|
+
},
|
|
762
|
+
],
|
|
763
|
+
root: {
|
|
764
|
+
name: 'items',
|
|
765
|
+
label: 'Menupunkter',
|
|
766
|
+
singular: 'menupunkt',
|
|
767
|
+
type: 'list',
|
|
768
|
+
summary: 'label',
|
|
769
|
+
fields: [{ name: 'label', label: 'Tekst', type: 'string', required: true }, menuHref],
|
|
770
|
+
},
|
|
771
|
+
},
|
|
772
|
+
],
|
|
773
|
+
},
|
|
774
|
+
];
|