create-ginko 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +15 -8
- package/index.mjs +115 -44
- package/package.json +6 -1
- package/presets/gastro/app/pages/index.vue +6 -4
- package/presets/gastro-de/app/pages/index.vue +6 -4
- package/template-files.mjs +377 -0
- package/templates/blog/.env.example +8 -0
- package/templates/blog/.github/screenshots/home-dark.png +0 -0
- package/templates/blog/.github/screenshots/home-light.png +0 -0
- package/templates/blog/.github/workflows/ci.yml +27 -0
- package/templates/blog/DESIGN.md +197 -0
- package/templates/blog/LICENSE +21 -0
- package/templates/blog/MEDIA.md +29 -0
- package/templates/blog/NOTES.md +16 -0
- package/templates/blog/README.md +274 -0
- package/templates/blog/app/app.config.ts +29 -0
- package/templates/blog/app/app.vue +7 -0
- package/templates/blog/app/assets/css/main.css +18 -0
- package/templates/blog/app/assets/css/tokens.css +400 -0
- package/templates/blog/app/components/InitialsAvatar.vue +18 -0
- package/templates/blog/app/components/ProseBody.vue +13 -0
- package/templates/blog/app/components/block/Cards.vue +54 -0
- package/templates/blog/app/components/block/Cta.vue +26 -0
- package/templates/blog/app/components/block/Empty.vue +26 -0
- package/templates/blog/app/components/block/Features.vue +24 -0
- package/templates/blog/app/components/block/Hero.vue +47 -0
- package/templates/blog/app/components/block/PageHeader.vue +21 -0
- package/templates/blog/app/components/block/Section.vue +31 -0
- package/templates/blog/app/components/blog/Byline.vue +22 -0
- package/templates/blog/app/components/blog/PostList.vue +33 -0
- package/templates/blog/app/components/blog/TagList.vue +17 -0
- package/templates/blog/app/components/home/LatestPost.vue +31 -0
- package/templates/blog/app/components/people/List.vue +41 -0
- package/templates/blog/app/components/site/Contact.vue +38 -0
- package/templates/blog/app/components/site/Footer.vue +81 -0
- package/templates/blog/app/components/site/FooterStatus.vue +24 -0
- package/templates/blog/app/components/site/Header.vue +52 -0
- package/templates/blog/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/blog/app/components/site/Logo.vue +17 -0
- package/templates/blog/app/components/site/NavLink.vue +19 -0
- package/templates/blog/app/components/site/NavSheet.vue +63 -0
- package/templates/blog/app/components/site/Notice.vue +21 -0
- package/templates/blog/app/components/site/PageCta.vue +14 -0
- package/templates/blog/app/components/site/SkipLink.vue +15 -0
- package/templates/blog/app/components/site/ThemeToggle.vue +28 -0
- package/templates/blog/app/components/ui/button/Button.vue +30 -0
- package/templates/blog/app/components/ui/button/index.ts +44 -0
- package/templates/blog/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/blog/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/blog/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/blog/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/blog/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/blog/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/blog/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/blog/app/components/ui/sheet/index.ts +7 -0
- package/templates/blog/app/composables/useBlog.ts +103 -0
- package/templates/blog/app/composables/usePageSeo.ts +50 -0
- package/templates/blog/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/blog/app/error.vue +35 -0
- package/templates/blog/app/layouts/default.vue +23 -0
- package/templates/blog/app/lib/utils.ts +26 -0
- package/templates/blog/app/pages/about/[slug].vue +48 -0
- package/templates/blog/app/pages/index.vue +54 -0
- package/templates/blog/app/pages/legal/[slug].vue +46 -0
- package/templates/blog/app/pages/news/[slug].vue +94 -0
- package/templates/blog/app/pages/news/index.vue +54 -0
- package/templates/blog/app/pages/news/tags/[tag].vue +41 -0
- package/templates/blog/app/pages/team.vue +40 -0
- package/templates/blog/app/routes.ts +31 -0
- package/templates/blog/app/utils/telHref.ts +3 -0
- package/templates/blog/components.json +21 -0
- package/templates/blog/content/home.de.md +4 -0
- package/templates/blog/content/home.md +4 -0
- package/templates/blog/content/legal/1.privacy.de.md +30 -0
- package/templates/blog/content/legal/1.privacy.md +30 -0
- package/templates/blog/content/legal/2.terms.de.md +22 -0
- package/templates/blog/content/legal/2.terms.md +23 -0
- package/templates/blog/content/legal/3.imprint.de.md +14 -0
- package/templates/blog/content/legal/3.imprint.md +15 -0
- package/templates/blog/content/notices/1.sample.de.md +3 -0
- package/templates/blog/content/notices/1.sample.md +4 -0
- package/templates/blog/content/people/1.ida-wren.de.md +4 -0
- package/templates/blog/content/people/1.ida-wren.md +5 -0
- package/templates/blog/content/people/2.tom-marsh.de.md +4 -0
- package/templates/blog/content/people/2.tom-marsh.md +5 -0
- package/templates/blog/content/posts/counting-street-trees.de.md +24 -0
- package/templates/blog/content/posts/counting-street-trees.md +25 -0
- package/templates/blog/content/posts/forest-at-the-end-of-the-line.de.md +26 -0
- package/templates/blog/content/posts/forest-at-the-end-of-the-line.md +28 -0
- package/templates/blog/content/posts/lichen-on-the-old-bridge.de.md +11 -0
- package/templates/blog/content/posts/lichen-on-the-old-bridge.md +14 -0
- package/templates/blog/content/posts/owls-in-the-old-cemetery.de.md +22 -0
- package/templates/blog/content/posts/owls-in-the-old-cemetery.md +23 -0
- package/templates/blog/content/posts/rock-pools-at-low-tide.de.md +25 -0
- package/templates/blog/content/posts/rock-pools-at-low-tide.md +26 -0
- package/templates/blog/content/posts/rock-pools.jpg +0 -0
- package/templates/blog/content/posts/swifts-over-the-car-park.de.md +22 -0
- package/templates/blog/content/posts/swifts-over-the-car-park.md +23 -0
- package/templates/blog/content/posts/ten-minute-notebook.de.md +36 -0
- package/templates/blog/content/posts/ten-minute-notebook.md +38 -0
- package/templates/blog/content/posts/why-we-keep-field-notes.de.md +24 -0
- package/templates/blog/content/posts/why-we-keep-field-notes.md +25 -0
- package/templates/blog/content/posts/winter-birds-by-the-bike-shed.de.md +22 -0
- package/templates/blog/content/posts/winter-birds-by-the-bike-shed.md +23 -0
- package/templates/blog/content/site.md +4 -0
- package/templates/blog/eslint.config.mjs +12 -0
- package/templates/blog/eslint.tailwind.mjs +33 -0
- package/templates/blog/ginko.config.ts +59 -0
- package/templates/blog/gitignore +7 -0
- package/templates/blog/i18n/blog/de.json +18 -0
- package/templates/blog/i18n/blog/en.json +18 -0
- package/templates/blog/i18n/de.json +31 -0
- package/templates/blog/i18n/en.json +27 -0
- package/templates/blog/i18n/people/de.json +6 -0
- package/templates/blog/i18n/people/en.json +6 -0
- package/templates/blog/i18n/site/de.json +39 -0
- package/templates/blog/i18n/site/en.json +39 -0
- package/templates/blog/modules/feature-messages.ts +19 -0
- package/templates/blog/modules/feeds/index.ts +22 -0
- package/templates/blog/modules/feeds/routes.ts +13 -0
- package/templates/blog/modules/page-paths/index.ts +26 -0
- package/templates/blog/modules/page-paths/paths.ts +48 -0
- package/templates/blog/nuxt.config.ts +27 -0
- package/templates/blog/package.json +57 -0
- package/templates/blog/pnpm-workspace.yaml +6 -0
- package/templates/blog/public/media/forest-path.jpg +0 -0
- package/templates/blog/public/media/notebook.jpg +0 -0
- package/templates/blog/server/middleware/news-feed.ts +37 -0
- package/templates/blog/server/plugins/font-preload.ts +17 -0
- package/templates/blog/site-url.ts +21 -0
- package/templates/blog/tsconfig.json +9 -0
- package/templates/blog.json +11 -0
- package/templates/company/.env.example +8 -0
- package/templates/company/.github/screenshots/home-dark.png +0 -0
- package/templates/company/.github/screenshots/home-light.png +0 -0
- package/templates/company/.github/workflows/ci.yml +27 -0
- package/templates/company/DESIGN.md +197 -0
- package/templates/company/LICENSE +21 -0
- package/templates/company/MEDIA.md +32 -0
- package/templates/company/NOTES.md +19 -0
- package/templates/company/README.md +254 -0
- package/templates/company/app/app.config.ts +33 -0
- package/templates/company/app/app.vue +7 -0
- package/templates/company/app/assets/css/main.css +22 -0
- package/templates/company/app/assets/css/tokens.css +400 -0
- package/templates/company/app/bricks/logos-quotes.ts +47 -0
- package/templates/company/app/bricks/pages.ts +38 -0
- package/templates/company/app/bricks/services.ts +64 -0
- package/templates/company/app/components/InitialsAvatar.vue +18 -0
- package/templates/company/app/components/ProseBody.vue +13 -0
- package/templates/company/app/components/ServiceLine.vue +15 -0
- package/templates/company/app/components/block/Cards.vue +54 -0
- package/templates/company/app/components/block/Cta.vue +26 -0
- package/templates/company/app/components/block/Empty.vue +26 -0
- package/templates/company/app/components/block/Features.vue +24 -0
- package/templates/company/app/components/block/Hero.vue +47 -0
- package/templates/company/app/components/block/Logos.vue +22 -0
- package/templates/company/app/components/block/PageHeader.vue +21 -0
- package/templates/company/app/components/block/Quote.vue +19 -0
- package/templates/company/app/components/block/Section.vue +31 -0
- package/templates/company/app/components/blog/Byline.vue +22 -0
- package/templates/company/app/components/blog/PostList.vue +33 -0
- package/templates/company/app/components/blog/TagList.vue +17 -0
- package/templates/company/app/components/downloads/FileButton.vue +21 -0
- package/templates/company/app/components/downloads/List.vue +37 -0
- package/templates/company/app/components/event/Upcoming.vue +25 -0
- package/templates/company/app/components/jobs/List.vue +26 -0
- package/templates/company/app/components/people/List.vue +41 -0
- package/templates/company/app/components/people/TeamContact.vue +37 -0
- package/templates/company/app/components/site/Contact.vue +38 -0
- package/templates/company/app/components/site/Footer.vue +81 -0
- package/templates/company/app/components/site/Header.vue +52 -0
- package/templates/company/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/company/app/components/site/Logo.vue +17 -0
- package/templates/company/app/components/site/NavLink.vue +19 -0
- package/templates/company/app/components/site/NavSheet.vue +63 -0
- package/templates/company/app/components/site/Notice.vue +21 -0
- package/templates/company/app/components/site/SkipLink.vue +15 -0
- package/templates/company/app/components/site/ThemeToggle.vue +28 -0
- package/templates/company/app/components/ui/button/Button.vue +30 -0
- package/templates/company/app/components/ui/button/index.ts +44 -0
- package/templates/company/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/company/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/company/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/company/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/company/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/company/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/company/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/company/app/components/ui/sheet/index.ts +7 -0
- package/templates/company/app/composables/useBlog.ts +103 -0
- package/templates/company/app/composables/useDownloads.ts +54 -0
- package/templates/company/app/composables/useEvents.ts +182 -0
- package/templates/company/app/composables/useJobs.ts +108 -0
- package/templates/company/app/composables/usePageSeo.ts +50 -0
- package/templates/company/app/composables/useServiceLine.ts +10 -0
- package/templates/company/app/composables/useServices.ts +93 -0
- package/templates/company/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/company/app/error.vue +35 -0
- package/templates/company/app/layouts/default.vue +23 -0
- package/templates/company/app/lib/utils.ts +26 -0
- package/templates/company/app/pages/[...slug].vue +36 -0
- package/templates/company/app/pages/downloads.vue +20 -0
- package/templates/company/app/pages/events/[slug].vue +106 -0
- package/templates/company/app/pages/events/index.vue +20 -0
- package/templates/company/app/pages/index.vue +84 -0
- package/templates/company/app/pages/jobs/[slug].vue +63 -0
- package/templates/company/app/pages/jobs/index.vue +36 -0
- package/templates/company/app/pages/legal/[slug].vue +46 -0
- package/templates/company/app/pages/news/[slug].vue +94 -0
- package/templates/company/app/pages/news/index.vue +54 -0
- package/templates/company/app/pages/news/tags/[tag].vue +41 -0
- package/templates/company/app/pages/services/[slug].vue +90 -0
- package/templates/company/app/pages/services/index.vue +18 -0
- package/templates/company/app/pages/team.vue +40 -0
- package/templates/company/app/routes.ts +33 -0
- package/templates/company/app/utils/telHref.ts +3 -0
- package/templates/company/components.json +21 -0
- package/templates/company/content/downloads/hk-centrifugal-pumps.de.md +4 -0
- package/templates/company/content/downloads/hk-centrifugal-pumps.md +7 -0
- package/templates/company/content/downloads/pumping-stations.de.md +4 -0
- package/templates/company/content/downloads/pumping-stations.md +7 -0
- package/templates/company/content/downloads/ts-submersible-pumps.de.md +4 -0
- package/templates/company/content/downloads/ts-submersible-pumps.md +7 -0
- package/templates/company/content/events/1.municipal-water-forum.de.md +9 -0
- package/templates/company/content/events/1.municipal-water-forum.md +14 -0
- package/templates/company/content/events/2.pump-days-north.de.md +7 -0
- package/templates/company/content/events/2.pump-days-north.md +12 -0
- package/templates/company/content/events/3.industrial-water-expo.de.md +7 -0
- package/templates/company/content/events/3.industrial-water-expo.md +12 -0
- package/templates/company/content/home.de.md +6 -0
- package/templates/company/content/home.md +7 -0
- package/templates/company/content/jobs/apprenticeship-industrial-mechanic.de.md +22 -0
- package/templates/company/content/jobs/apprenticeship-industrial-mechanic.md +26 -0
- package/templates/company/content/jobs/sales-engineer.de.md +25 -0
- package/templates/company/content/jobs/sales-engineer.md +29 -0
- package/templates/company/content/jobs/service-technician.de.md +25 -0
- package/templates/company/content/jobs/service-technician.md +29 -0
- package/templates/company/content/jobs/summer-internship-assembly.de.md +8 -0
- package/templates/company/content/jobs/summer-internship-assembly.md +14 -0
- package/templates/company/content/legal/1.privacy.de.md +18 -0
- package/templates/company/content/legal/1.privacy.md +20 -0
- package/templates/company/content/legal/2.terms.de.md +19 -0
- package/templates/company/content/legal/2.terms.md +21 -0
- package/templates/company/content/legal/3.imprint.de.md +16 -0
- package/templates/company/content/legal/3.imprint.md +18 -0
- package/templates/company/content/logos/1.public-works.md +6 -0
- package/templates/company/content/logos/2.water-board.md +6 -0
- package/templates/company/content/logos/3.brewery.md +6 -0
- package/templates/company/content/logos/4.treatment-works.md +6 -0
- package/templates/company/content/notices/1.municipal-water-forum.de.md +3 -0
- package/templates/company/content/notices/1.municipal-water-forum.md +4 -0
- package/templates/company/content/pages/1.about.de.md +19 -0
- package/templates/company/content/pages/1.about.md +20 -0
- package/templates/company/content/people/1.katrin-albers.de.md +4 -0
- package/templates/company/content/people/1.katrin-albers.md +7 -0
- package/templates/company/content/people/2.tobias-brandt.de.md +4 -0
- package/templates/company/content/people/2.tobias-brandt.md +7 -0
- package/templates/company/content/people/3.miriam-ostendorf.de.md +4 -0
- package/templates/company/content/people/3.miriam-ostendorf.md +7 -0
- package/templates/company/content/people/4.sabine-krueger.de.md +4 -0
- package/templates/company/content/people/4.sabine-krueger.md +7 -0
- package/templates/company/content/posts/apprentices-start.de.md +12 -0
- package/templates/company/content/posts/apprentices-start.md +14 -0
- package/templates/company/content/posts/saturday-service.de.md +12 -0
- package/templates/company/content/posts/saturday-service.md +14 -0
- package/templates/company/content/posts/treatment-works-pumps.de.md +20 -0
- package/templates/company/content/posts/treatment-works-pumps.md +23 -0
- package/templates/company/content/posts/ts-pumps-atex.de.md +12 -0
- package/templates/company/content/posts/ts-pumps-atex.md +14 -0
- package/templates/company/content/quotes/1.public-works.de.md +4 -0
- package/templates/company/content/quotes/1.public-works.md +5 -0
- package/templates/company/content/quotes/2.brewery.de.md +4 -0
- package/templates/company/content/quotes/2.brewery.md +5 -0
- package/templates/company/content/serviceLine.de.md +3 -0
- package/templates/company/content/serviceLine.md +5 -0
- package/templates/company/content/services/1.hk-centrifugal-pumps.de.md +31 -0
- package/templates/company/content/services/1.hk-centrifugal-pumps.md +35 -0
- package/templates/company/content/services/2.ts-submersible-pumps.de.md +26 -0
- package/templates/company/content/services/2.ts-submersible-pumps.md +30 -0
- package/templates/company/content/services/3.pumping-stations.de.md +29 -0
- package/templates/company/content/services/3.pumping-stations.md +33 -0
- package/templates/company/content/services/4.pump-check.de.md +25 -0
- package/templates/company/content/services/4.pump-check.md +30 -0
- package/templates/company/content/services/5.repair-and-overhaul.de.md +20 -0
- package/templates/company/content/services/5.repair-and-overhaul.md +23 -0
- package/templates/company/content/site.de.md +3 -0
- package/templates/company/content/site.md +12 -0
- package/templates/company/eslint.config.mjs +12 -0
- package/templates/company/eslint.tailwind.mjs +33 -0
- package/templates/company/ginko.config.ts +98 -0
- package/templates/company/gitignore +7 -0
- package/templates/company/i18n/blog/de.json +18 -0
- package/templates/company/i18n/blog/en.json +18 -0
- package/templates/company/i18n/de.json +60 -0
- package/templates/company/i18n/downloads/de.json +6 -0
- package/templates/company/i18n/downloads/en.json +6 -0
- package/templates/company/i18n/en.json +58 -0
- package/templates/company/i18n/events/de.json +20 -0
- package/templates/company/i18n/events/en.json +20 -0
- package/templates/company/i18n/jobs/de.json +35 -0
- package/templates/company/i18n/jobs/en.json +35 -0
- package/templates/company/i18n/people/de.json +6 -0
- package/templates/company/i18n/people/en.json +6 -0
- package/templates/company/i18n/services/de.json +20 -0
- package/templates/company/i18n/services/en.json +20 -0
- package/templates/company/i18n/site/de.json +39 -0
- package/templates/company/i18n/site/en.json +39 -0
- package/templates/company/modules/feature-messages.ts +19 -0
- package/templates/company/modules/feeds/index.ts +22 -0
- package/templates/company/modules/feeds/routes.ts +13 -0
- package/templates/company/modules/page-paths/index.ts +26 -0
- package/templates/company/modules/page-paths/paths.ts +48 -0
- package/templates/company/nuxt.config.ts +29 -0
- package/templates/company/package.json +64 -0
- package/templates/company/pnpm-workspace.yaml +6 -0
- package/templates/company/public/logos/customer-four.svg +6 -0
- package/templates/company/public/logos/customer-one.svg +5 -0
- package/templates/company/public/logos/customer-three.svg +5 -0
- package/templates/company/public/logos/customer-two.svg +4 -0
- package/templates/company/public/media/pipework.jpg +0 -0
- package/templates/company/public/media/process-pumps.jpg +0 -0
- package/templates/company/public/media/pump-check.jpg +0 -0
- package/templates/company/public/media/treatment-works.jpg +0 -0
- package/templates/company/public/media/works-hall.jpg +0 -0
- package/templates/company/public/sheets/hk-centrifugal-pumps.pdf +0 -0
- package/templates/company/public/sheets/pumping-stations.pdf +0 -0
- package/templates/company/public/sheets/ts-submersible-pumps.pdf +0 -0
- package/templates/company/server/middleware/news-feed.ts +37 -0
- package/templates/company/server/plugins/font-preload.ts +17 -0
- package/templates/company/site-url.ts +21 -0
- package/templates/company/tsconfig.json +9 -0
- package/templates/company.json +18 -0
- package/templates/docs/.env.example +9 -0
- package/templates/docs/.github/screenshots/home-light.png +0 -0
- package/templates/docs/.github/screenshots/page-dark.png +0 -0
- package/templates/docs/.github/workflows/ci.yml +27 -0
- package/templates/docs/DESIGN.md +77 -0
- package/templates/docs/LICENSE +21 -0
- package/templates/docs/MEDIA.md +14 -0
- package/templates/docs/NOTES.md +18 -0
- package/templates/docs/README.md +255 -0
- package/templates/docs/app/app.config.ts +26 -0
- package/templates/docs/app/assets/css/main.css +14 -0
- package/templates/docs/content/changelog/v1-6-0.de.md +13 -0
- package/templates/docs/content/changelog/v1-6-0.md +18 -0
- package/templates/docs/content/changelog/v2-0-0.de.md +14 -0
- package/templates/docs/content/changelog/v2-0-0.md +19 -0
- package/templates/docs/content/changelog/v2-1-0.de.md +9 -0
- package/templates/docs/content/changelog/v2-1-0.md +14 -0
- package/templates/docs/content/docs/1.introduction.de.md +32 -0
- package/templates/docs/content/docs/1.introduction.md +31 -0
- package/templates/docs/content/docs/10.incidents-and-checks.de.md +82 -0
- package/templates/docs/content/docs/10.incidents-and-checks.md +81 -0
- package/templates/docs/content/docs/11.error-codes.de.md +36 -0
- package/templates/docs/content/docs/11.error-codes.md +35 -0
- package/templates/docs/content/docs/2.getting-started.de.md +57 -0
- package/templates/docs/content/docs/2.getting-started.md +56 -0
- package/templates/docs/content/docs/3.authentication.de.md +55 -0
- package/templates/docs/content/docs/3.authentication.md +54 -0
- package/templates/docs/content/docs/4.pagination.de.md +45 -0
- package/templates/docs/content/docs/4.pagination.md +44 -0
- package/templates/docs/content/docs/5.errors-and-retries.de.md +69 -0
- package/templates/docs/content/docs/5.errors-and-retries.md +66 -0
- package/templates/docs/content/docs/6.webhooks.de.md +53 -0
- package/templates/docs/content/docs/6.webhooks.md +52 -0
- package/templates/docs/content/docs/7.upgrading-to-v2.md +73 -0
- package/templates/docs/content/docs/8.client.de.md +57 -0
- package/templates/docs/content/docs/8.client.md +56 -0
- package/templates/docs/content/docs/9.monitors.de.md +96 -0
- package/templates/docs/content/docs/9.monitors.md +95 -0
- package/templates/docs/content/home.de.md +47 -0
- package/templates/docs/content/home.md +54 -0
- package/templates/docs/eslint.config.mjs +7 -0
- package/templates/docs/ginko.config.ts +36 -0
- package/templates/docs/gitignore +7 -0
- package/templates/docs/i18n/de.json +5 -0
- package/templates/docs/i18n/en.json +5 -0
- package/templates/docs/nuxt.config.ts +18 -0
- package/templates/docs/package.json +42 -0
- package/templates/docs/pnpm-workspace.yaml +6 -0
- package/templates/docs/public/favicon.svg +1 -0
- package/templates/docs/public/logo-dark.svg +1 -0
- package/templates/docs/public/logo.svg +1 -0
- package/templates/docs/site-url.ts +21 -0
- package/templates/docs/tsconfig.json +9 -0
- package/templates/docs.json +7 -0
- package/templates/events/.env.example +8 -0
- package/templates/events/.github/screenshots/home-dark.png +0 -0
- package/templates/events/.github/screenshots/home-light.png +0 -0
- package/templates/events/.github/workflows/ci.yml +27 -0
- package/templates/events/DESIGN.md +197 -0
- package/templates/events/LICENSE +21 -0
- package/templates/events/MEDIA.md +32 -0
- package/templates/events/NOTES.md +13 -0
- package/templates/events/README.md +247 -0
- package/templates/events/app/app.config.ts +30 -0
- package/templates/events/app/app.vue +7 -0
- package/templates/events/app/assets/css/main.css +22 -0
- package/templates/events/app/assets/css/tokens.css +400 -0
- package/templates/events/app/bricks/logos-quotes.ts +47 -0
- package/templates/events/app/bricks/pages.ts +38 -0
- package/templates/events/app/components/InitialsAvatar.vue +18 -0
- package/templates/events/app/components/ProseBody.vue +13 -0
- package/templates/events/app/components/block/Cards.vue +54 -0
- package/templates/events/app/components/block/Cta.vue +26 -0
- package/templates/events/app/components/block/Empty.vue +26 -0
- package/templates/events/app/components/block/Faq.vue +19 -0
- package/templates/events/app/components/block/Features.vue +24 -0
- package/templates/events/app/components/block/Gallery.vue +81 -0
- package/templates/events/app/components/block/Hero.vue +47 -0
- package/templates/events/app/components/block/Logos.vue +22 -0
- package/templates/events/app/components/block/PageHeader.vue +21 -0
- package/templates/events/app/components/block/Quote.vue +19 -0
- package/templates/events/app/components/block/Section.vue +31 -0
- package/templates/events/app/components/event/Programme.vue +16 -0
- package/templates/events/app/components/event/Upcoming.vue +25 -0
- package/templates/events/app/components/pages/Top.vue +11 -0
- package/templates/events/app/components/session/NowNext.vue +54 -0
- package/templates/events/app/components/session/Programme.vue +40 -0
- package/templates/events/app/components/session/Row.vue +61 -0
- package/templates/events/app/components/session/Speakers.vue +28 -0
- package/templates/events/app/components/site/Contact.vue +38 -0
- package/templates/events/app/components/site/Footer.vue +81 -0
- package/templates/events/app/components/site/Header.vue +52 -0
- package/templates/events/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/events/app/components/site/Lightbox.vue +62 -0
- package/templates/events/app/components/site/Logo.vue +17 -0
- package/templates/events/app/components/site/NavLink.vue +19 -0
- package/templates/events/app/components/site/NavSheet.vue +63 -0
- package/templates/events/app/components/site/Notice.vue +21 -0
- package/templates/events/app/components/site/SkipLink.vue +15 -0
- package/templates/events/app/components/site/ThemeToggle.vue +28 -0
- package/templates/events/app/components/ui/accordion/Accordion.vue +16 -0
- package/templates/events/app/components/ui/accordion/AccordionContent.vue +26 -0
- package/templates/events/app/components/ui/accordion/AccordionItem.vue +24 -0
- package/templates/events/app/components/ui/accordion/AccordionTrigger.vue +35 -0
- package/templates/events/app/components/ui/accordion/index.ts +5 -0
- package/templates/events/app/components/ui/button/Button.vue +30 -0
- package/templates/events/app/components/ui/button/index.ts +44 -0
- package/templates/events/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/events/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/events/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/events/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/events/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/events/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/events/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/events/app/components/ui/sheet/index.ts +7 -0
- package/templates/events/app/composables/useEvents.ts +182 -0
- package/templates/events/app/composables/usePageSeo.ts +50 -0
- package/templates/events/app/composables/useSessions.ts +111 -0
- package/templates/events/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/events/app/error.vue +35 -0
- package/templates/events/app/layouts/default.vue +23 -0
- package/templates/events/app/lib/utils.ts +26 -0
- package/templates/events/app/pages/[...slug].vue +36 -0
- package/templates/events/app/pages/events/[slug].vue +106 -0
- package/templates/events/app/pages/events/index.vue +20 -0
- package/templates/events/app/pages/faq.vue +39 -0
- package/templates/events/app/pages/index.vue +134 -0
- package/templates/events/app/pages/legal/[slug].vue +46 -0
- package/templates/events/app/pages/programme.vue +42 -0
- package/templates/events/app/pages/speakers/[slug].vue +62 -0
- package/templates/events/app/pages/speakers/index.vue +31 -0
- package/templates/events/app/routes.ts +31 -0
- package/templates/events/app/utils/sessions.ts +64 -0
- package/templates/events/app/utils/telHref.ts +3 -0
- package/templates/events/components.json +21 -0
- package/templates/events/content/events/1.open-data-days.de.md +9 -0
- package/templates/events/content/events/1.open-data-days.md +19 -0
- package/templates/events/content/events/2.open-data-meetup.de.md +7 -0
- package/templates/events/content/events/2.open-data-meetup.md +14 -0
- package/templates/events/content/events/3.last-edition.de.md +5 -0
- package/templates/events/content/events/3.last-edition.md +12 -0
- package/templates/events/content/events/4.next-edition.de.md +5 -0
- package/templates/events/content/events/4.next-edition.md +13 -0
- package/templates/events/content/faq/1.getting-there.de.md +4 -0
- package/templates/events/content/faq/1.getting-there.md +4 -0
- package/templates/events/content/faq/2.accessibility.de.md +4 -0
- package/templates/events/content/faq/2.accessibility.md +4 -0
- package/templates/events/content/faq/3.tickets.de.md +4 -0
- package/templates/events/content/faq/3.tickets.md +4 -0
- package/templates/events/content/faq/4.food.de.md +4 -0
- package/templates/events/content/faq/4.food.md +4 -0
- package/templates/events/content/faq/5.code-of-conduct.de.md +4 -0
- package/templates/events/content/faq/5.code-of-conduct.md +4 -0
- package/templates/events/content/faq/6.language.de.md +4 -0
- package/templates/events/content/faq/6.language.md +4 -0
- package/templates/events/content/faq/7.recordings.de.md +4 -0
- package/templates/events/content/faq/7.recordings.md +4 -0
- package/templates/events/content/faq/8.ticket-transfer.de.md +4 -0
- package/templates/events/content/faq/8.ticket-transfer.md +4 -0
- package/templates/events/content/gallery.de.md +9 -0
- package/templates/events/content/gallery.md +12 -0
- package/templates/events/content/home.de.md +6 -0
- package/templates/events/content/home.md +7 -0
- package/templates/events/content/legal/1.privacy.de.md +19 -0
- package/templates/events/content/legal/1.privacy.md +20 -0
- package/templates/events/content/legal/2.terms.de.md +19 -0
- package/templates/events/content/legal/2.terms.md +20 -0
- package/templates/events/content/legal/3.imprint.de.md +19 -0
- package/templates/events/content/legal/3.imprint.md +20 -0
- package/templates/events/content/logos/1.kaltenegger-it.md +6 -0
- package/templates/events/content/logos/2.nordlicht-hosting.md +6 -0
- package/templates/events/content/logos/3.hallgarten-stiftung.md +6 -0
- package/templates/events/content/logos/4.kanalcafe.md +6 -0
- package/templates/events/content/notices/1.ticket-sales.de.md +3 -0
- package/templates/events/content/notices/1.ticket-sales.md +4 -0
- package/templates/events/content/pages/1.venue.de.md +36 -0
- package/templates/events/content/pages/1.venue.md +37 -0
- package/templates/events/content/pages/2.code-of-conduct.de.md +25 -0
- package/templates/events/content/pages/2.code-of-conduct.md +25 -0
- package/templates/events/content/pages/3.sponsoring.de.md +17 -0
- package/templates/events/content/pages/3.sponsoring.md +17 -0
- package/templates/events/content/people/1.lena-hofer.de.md +4 -0
- package/templates/events/content/people/1.lena-hofer.md +6 -0
- package/templates/events/content/people/2.tobias-wagner.de.md +4 -0
- package/templates/events/content/people/2.tobias-wagner.md +6 -0
- package/templates/events/content/people/3.amira-haddad.de.md +4 -0
- package/templates/events/content/people/3.amira-haddad.md +6 -0
- package/templates/events/content/people/4.jonas-leitner.de.md +4 -0
- package/templates/events/content/people/4.jonas-leitner.md +6 -0
- package/templates/events/content/people/5.sophie-brunner.de.md +4 -0
- package/templates/events/content/people/5.sophie-brunner.md +6 -0
- package/templates/events/content/people/6.david-okafor.de.md +4 -0
- package/templates/events/content/people/6.david-okafor.md +6 -0
- package/templates/events/content/people/7.katrin-moser.de.md +4 -0
- package/templates/events/content/people/7.katrin-moser.md +6 -0
- package/templates/events/content/people/8.nina-pichler.de.md +4 -0
- package/templates/events/content/people/8.nina-pichler.md +6 -0
- package/templates/events/content/people/9.felix-gruber.de.md +3 -0
- package/templates/events/content/people/9.felix-gruber.md +5 -0
- package/templates/events/content/sessions/balcony-sensors.de.md +4 -0
- package/templates/events/content/sessions/balcony-sensors.md +10 -0
- package/templates/events/content/sessions/budget-stories.de.md +4 -0
- package/templates/events/content/sessions/budget-stories.md +11 -0
- package/templates/events/content/sessions/closing.de.md +4 -0
- package/templates/events/content/sessions/closing.md +11 -0
- package/templates/events/content/sessions/doors-open.de.md +3 -0
- package/templates/events/content/sessions/doors-open.md +9 -0
- package/templates/events/content/sessions/honest-charts.de.md +4 -0
- package/templates/events/content/sessions/honest-charts.md +11 -0
- package/templates/events/content/sessions/keynote-city.de.md +4 -0
- package/templates/events/content/sessions/keynote-city.md +11 -0
- package/templates/events/content/sessions/lightning-talks.de.md +4 -0
- package/templates/events/content/sessions/lightning-talks.md +10 -0
- package/templates/events/content/sessions/lunch-1.de.md +3 -0
- package/templates/events/content/sessions/lunch-1.md +9 -0
- package/templates/events/content/sessions/lunch-2.de.md +3 -0
- package/templates/events/content/sessions/lunch-2.md +9 -0
- package/templates/events/content/sessions/next-edition-keynote.de.md +3 -0
- package/templates/events/content/sessions/next-edition-keynote.md +9 -0
- package/templates/events/content/sessions/open-data-schools.de.md +4 -0
- package/templates/events/content/sessions/open-data-schools.md +11 -0
- package/templates/events/content/sessions/open-statistics.de.md +4 -0
- package/templates/events/content/sessions/open-statistics.md +11 -0
- package/templates/events/content/sessions/panel-who-pays.de.md +4 -0
- package/templates/events/content/sessions/panel-who-pays.md +11 -0
- package/templates/events/content/sessions/privacy-line.de.md +4 -0
- package/templates/events/content/sessions/privacy-line.md +11 -0
- package/templates/events/content/sessions/readable-metadata.de.md +4 -0
- package/templates/events/content/sessions/readable-metadata.md +11 -0
- package/templates/events/content/sessions/transport-data.de.md +4 -0
- package/templates/events/content/sessions/transport-data.md +11 -0
- package/templates/events/content/sessions/welcome.de.md +3 -0
- package/templates/events/content/sessions/welcome.md +10 -0
- package/templates/events/content/sessions/workshop-charts.de.md +4 -0
- package/templates/events/content/sessions/workshop-charts.md +11 -0
- package/templates/events/content/sessions/workshop-clean-data.de.md +4 -0
- package/templates/events/content/sessions/workshop-clean-data.md +11 -0
- package/templates/events/content/sessions/workshop-portal.de.md +4 -0
- package/templates/events/content/sessions/workshop-portal.md +11 -0
- package/templates/events/content/site.md +10 -0
- package/templates/events/eslint.config.mjs +12 -0
- package/templates/events/eslint.tailwind.mjs +33 -0
- package/templates/events/ginko.config.ts +75 -0
- package/templates/events/gitignore +7 -0
- package/templates/events/i18n/de.json +37 -0
- package/templates/events/i18n/en.json +37 -0
- package/templates/events/i18n/events/de.json +20 -0
- package/templates/events/i18n/events/en.json +20 -0
- package/templates/events/i18n/faq/de.json +6 -0
- package/templates/events/i18n/faq/en.json +6 -0
- package/templates/events/i18n/gallery/de.json +8 -0
- package/templates/events/i18n/gallery/en.json +8 -0
- package/templates/events/i18n/sessions/de.json +33 -0
- package/templates/events/i18n/sessions/en.json +33 -0
- package/templates/events/i18n/site/de.json +39 -0
- package/templates/events/i18n/site/en.json +39 -0
- package/templates/events/modules/feature-messages.ts +19 -0
- package/templates/events/modules/feeds/index.ts +22 -0
- package/templates/events/modules/feeds/routes.ts +13 -0
- package/templates/events/modules/page-paths/index.ts +26 -0
- package/templates/events/modules/page-paths/paths.ts +48 -0
- package/templates/events/nuxt.config.ts +27 -0
- package/templates/events/package.json +61 -0
- package/templates/events/pnpm-workspace.yaml +6 -0
- package/templates/events/public/logos/hallgarten-stiftung.svg +4 -0
- package/templates/events/public/logos/kaltenegger-it.svg +4 -0
- package/templates/events/public/logos/kanalcafe.svg +4 -0
- package/templates/events/public/logos/nordlicht-hosting.svg +4 -0
- package/templates/events/public/media/coffee-break.jpg +0 -0
- package/templates/events/public/media/hero.jpg +0 -0
- package/templates/events/public/media/talk.jpg +0 -0
- package/templates/events/public/media/venue.jpg +0 -0
- package/templates/events/public/media/workshop-tables.jpg +0 -0
- package/templates/events/server/plugins/font-preload.ts +17 -0
- package/templates/events/site-url.ts +21 -0
- package/templates/events/tsconfig.json +9 -0
- package/templates/events.json +18 -0
- package/templates/local-business/.env.example +8 -0
- package/templates/local-business/.github/screenshots/home-dark.png +0 -0
- package/templates/local-business/.github/screenshots/home-light.png +0 -0
- package/templates/local-business/.github/workflows/ci.yml +27 -0
- package/templates/local-business/DESIGN.md +197 -0
- package/templates/local-business/LICENSE +21 -0
- package/templates/local-business/MEDIA.md +27 -0
- package/templates/local-business/NOTES.md +31 -0
- package/templates/local-business/README.md +256 -0
- package/templates/local-business/app/app.config.ts +32 -0
- package/templates/local-business/app/app.vue +7 -0
- package/templates/local-business/app/assets/css/main.css +18 -0
- package/templates/local-business/app/assets/css/tokens.css +400 -0
- package/templates/local-business/app/bricks/pages.ts +38 -0
- package/templates/local-business/app/bricks/services.ts +64 -0
- package/templates/local-business/app/components/InitialsAvatar.vue +18 -0
- package/templates/local-business/app/components/ProseBody.vue +13 -0
- package/templates/local-business/app/components/block/Cards.vue +54 -0
- package/templates/local-business/app/components/block/Cta.vue +26 -0
- package/templates/local-business/app/components/block/Empty.vue +26 -0
- package/templates/local-business/app/components/block/Faq.vue +19 -0
- package/templates/local-business/app/components/block/Features.vue +24 -0
- package/templates/local-business/app/components/block/Gallery.vue +81 -0
- package/templates/local-business/app/components/block/Hero.vue +47 -0
- package/templates/local-business/app/components/block/PageHeader.vue +21 -0
- package/templates/local-business/app/components/block/Section.vue +31 -0
- package/templates/local-business/app/components/hours/Table.vue +119 -0
- package/templates/local-business/app/components/hours/Today.vue +55 -0
- package/templates/local-business/app/components/people/List.vue +41 -0
- package/templates/local-business/app/components/services/Actions.vue +18 -0
- package/templates/local-business/app/components/site/Contact.vue +38 -0
- package/templates/local-business/app/components/site/Footer.vue +81 -0
- package/templates/local-business/app/components/site/FooterStatus.vue +9 -0
- package/templates/local-business/app/components/site/Header.vue +52 -0
- package/templates/local-business/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/local-business/app/components/site/Lightbox.vue +62 -0
- package/templates/local-business/app/components/site/Logo.vue +17 -0
- package/templates/local-business/app/components/site/NavLink.vue +19 -0
- package/templates/local-business/app/components/site/NavSheet.vue +63 -0
- package/templates/local-business/app/components/site/Notice.vue +21 -0
- package/templates/local-business/app/components/site/SkipLink.vue +15 -0
- package/templates/local-business/app/components/site/ThemeToggle.vue +28 -0
- package/templates/local-business/app/components/ui/accordion/Accordion.vue +16 -0
- package/templates/local-business/app/components/ui/accordion/AccordionContent.vue +26 -0
- package/templates/local-business/app/components/ui/accordion/AccordionItem.vue +24 -0
- package/templates/local-business/app/components/ui/accordion/AccordionTrigger.vue +35 -0
- package/templates/local-business/app/components/ui/accordion/index.ts +5 -0
- package/templates/local-business/app/components/ui/button/Button.vue +30 -0
- package/templates/local-business/app/components/ui/button/index.ts +44 -0
- package/templates/local-business/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/local-business/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/local-business/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/local-business/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/local-business/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/local-business/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/local-business/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/local-business/app/components/ui/sheet/index.ts +7 -0
- package/templates/local-business/app/components/visit/Book.vue +46 -0
- package/templates/local-business/app/composables/useHours.ts +81 -0
- package/templates/local-business/app/composables/usePageSeo.ts +50 -0
- package/templates/local-business/app/composables/useServices.ts +93 -0
- package/templates/local-business/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/local-business/app/composables/useVisit.ts +19 -0
- package/templates/local-business/app/error.vue +35 -0
- package/templates/local-business/app/layouts/default.vue +23 -0
- package/templates/local-business/app/lib/utils.ts +26 -0
- package/templates/local-business/app/pages/[...slug].vue +36 -0
- package/templates/local-business/app/pages/contact.vue +62 -0
- package/templates/local-business/app/pages/faq.vue +39 -0
- package/templates/local-business/app/pages/index.vue +114 -0
- package/templates/local-business/app/pages/legal/[slug].vue +46 -0
- package/templates/local-business/app/pages/services/[slug].vue +90 -0
- package/templates/local-business/app/pages/services/index.vue +18 -0
- package/templates/local-business/app/pages/team.vue +40 -0
- package/templates/local-business/app/routes.ts +31 -0
- package/templates/local-business/app/utils/hours.ts +58 -0
- package/templates/local-business/app/utils/telHref.ts +3 -0
- package/templates/local-business/components.json +21 -0
- package/templates/local-business/content/faq/1.prescription.de.md +4 -0
- package/templates/local-business/content/faq/1.prescription.md +4 -0
- package/templates/local-business/content/faq/2.insurance.de.md +4 -0
- package/templates/local-business/content/faq/2.insurance.md +4 -0
- package/templates/local-business/content/faq/3.bring.de.md +4 -0
- package/templates/local-business/content/faq/3.bring.md +4 -0
- package/templates/local-business/content/faq/4.cancel.de.md +4 -0
- package/templates/local-business/content/faq/4.cancel.md +4 -0
- package/templates/local-business/content/faq/5.sessions.de.md +4 -0
- package/templates/local-business/content/faq/5.sessions.md +4 -0
- package/templates/local-business/content/faq/6.payment.de.md +4 -0
- package/templates/local-business/content/faq/6.payment.md +4 -0
- package/templates/local-business/content/gallery.de.md +7 -0
- package/templates/local-business/content/gallery.md +9 -0
- package/templates/local-business/content/home.de.md +5 -0
- package/templates/local-business/content/home.md +7 -0
- package/templates/local-business/content/hourPlans/1.summer-hours.de.md +3 -0
- package/templates/local-business/content/hourPlans/1.summer-hours.md +31 -0
- package/templates/local-business/content/hours.de.md +5 -0
- package/templates/local-business/content/hours.md +40 -0
- package/templates/local-business/content/legal/1.privacy.de.md +39 -0
- package/templates/local-business/content/legal/1.privacy.md +38 -0
- package/templates/local-business/content/legal/2.terms.de.md +22 -0
- package/templates/local-business/content/legal/2.terms.md +22 -0
- package/templates/local-business/content/legal/3.imprint.de.md +17 -0
- package/templates/local-business/content/legal/3.imprint.md +17 -0
- package/templates/local-business/content/notices/1.courtyard-works.de.md +3 -0
- package/templates/local-business/content/notices/1.courtyard-works.md +4 -0
- package/templates/local-business/content/pages/1.about.de.md +23 -0
- package/templates/local-business/content/pages/1.about.md +24 -0
- package/templates/local-business/content/people/1.anna-hofer.de.md +4 -0
- package/templates/local-business/content/people/1.anna-hofer.md +5 -0
- package/templates/local-business/content/people/2.lukas-brandstaetter.de.md +4 -0
- package/templates/local-business/content/people/2.lukas-brandstaetter.md +5 -0
- package/templates/local-business/content/people/3.mira-kovac.de.md +4 -0
- package/templates/local-business/content/people/3.mira-kovac.md +5 -0
- package/templates/local-business/content/people/4.elisabeth-gruber.de.md +4 -0
- package/templates/local-business/content/people/4.elisabeth-gruber.md +5 -0
- package/templates/local-business/content/services/1.physiotherapy.de.md +22 -0
- package/templates/local-business/content/services/1.physiotherapy.md +25 -0
- package/templates/local-business/content/services/2.manual-therapy.de.md +11 -0
- package/templates/local-business/content/services/2.manual-therapy.md +15 -0
- package/templates/local-business/content/services/3.sports-physiotherapy.de.md +18 -0
- package/templates/local-business/content/services/3.sports-physiotherapy.md +22 -0
- package/templates/local-business/content/services/4.lymphatic-drainage.de.md +18 -0
- package/templates/local-business/content/services/4.lymphatic-drainage.md +22 -0
- package/templates/local-business/content/services/5.massage.de.md +11 -0
- package/templates/local-business/content/services/5.massage.md +14 -0
- package/templates/local-business/content/services/6.home-visits.de.md +11 -0
- package/templates/local-business/content/services/6.home-visits.md +12 -0
- package/templates/local-business/content/site.de.md +3 -0
- package/templates/local-business/content/site.md +11 -0
- package/templates/local-business/content/visit.de.md +6 -0
- package/templates/local-business/content/visit.md +7 -0
- package/templates/local-business/eslint.config.mjs +12 -0
- package/templates/local-business/eslint.tailwind.mjs +33 -0
- package/templates/local-business/ginko.config.ts +97 -0
- package/templates/local-business/gitignore +7 -0
- package/templates/local-business/i18n/de.json +49 -0
- package/templates/local-business/i18n/en.json +49 -0
- package/templates/local-business/i18n/faq/de.json +6 -0
- package/templates/local-business/i18n/faq/en.json +6 -0
- package/templates/local-business/i18n/gallery/de.json +8 -0
- package/templates/local-business/i18n/gallery/en.json +8 -0
- package/templates/local-business/i18n/hours/de.json +27 -0
- package/templates/local-business/i18n/hours/en.json +27 -0
- package/templates/local-business/i18n/people/de.json +6 -0
- package/templates/local-business/i18n/people/en.json +6 -0
- package/templates/local-business/i18n/services/de.json +20 -0
- package/templates/local-business/i18n/services/en.json +20 -0
- package/templates/local-business/i18n/site/de.json +39 -0
- package/templates/local-business/i18n/site/en.json +39 -0
- package/templates/local-business/modules/feature-messages.ts +19 -0
- package/templates/local-business/modules/feeds/index.ts +22 -0
- package/templates/local-business/modules/feeds/routes.ts +13 -0
- package/templates/local-business/modules/page-paths/index.ts +26 -0
- package/templates/local-business/modules/page-paths/paths.ts +48 -0
- package/templates/local-business/nuxt.config.ts +29 -0
- package/templates/local-business/package.json +62 -0
- package/templates/local-business/pnpm-workspace.yaml +6 -0
- package/templates/local-business/public/media/massage.jpg +0 -0
- package/templates/local-business/public/media/treatment-room.jpg +0 -0
- package/templates/local-business/server/plugins/font-preload.ts +17 -0
- package/templates/local-business/site-url.ts +21 -0
- package/templates/local-business/tsconfig.json +9 -0
- package/templates/local-business.json +11 -0
- package/templates/nonprofit/.env.example +8 -0
- package/templates/nonprofit/.github/screenshots/home-dark.png +0 -0
- package/templates/nonprofit/.github/screenshots/home-light.png +0 -0
- package/templates/nonprofit/.github/workflows/ci.yml +27 -0
- package/templates/nonprofit/DESIGN.md +197 -0
- package/templates/nonprofit/LICENSE +21 -0
- package/templates/nonprofit/MEDIA.md +34 -0
- package/templates/nonprofit/NOTES.md +18 -0
- package/templates/nonprofit/README.md +227 -0
- package/templates/nonprofit/app/app.config.ts +34 -0
- package/templates/nonprofit/app/app.vue +7 -0
- package/templates/nonprofit/app/assets/css/main.css +35 -0
- package/templates/nonprofit/app/assets/css/tokens.css +400 -0
- package/templates/nonprofit/app/bricks/logos-quotes.ts +47 -0
- package/templates/nonprofit/app/bricks/pages.ts +38 -0
- package/templates/nonprofit/app/bricks/projects.ts +114 -0
- package/templates/nonprofit/app/components/InitialsAvatar.vue +18 -0
- package/templates/nonprofit/app/components/ProseBody.vue +13 -0
- package/templates/nonprofit/app/components/block/Cards.vue +54 -0
- package/templates/nonprofit/app/components/block/Cta.vue +26 -0
- package/templates/nonprofit/app/components/block/Empty.vue +26 -0
- package/templates/nonprofit/app/components/block/Features.vue +24 -0
- package/templates/nonprofit/app/components/block/Hero.vue +47 -0
- package/templates/nonprofit/app/components/block/Logos.vue +22 -0
- package/templates/nonprofit/app/components/block/PageHeader.vue +21 -0
- package/templates/nonprofit/app/components/block/Quote.vue +19 -0
- package/templates/nonprofit/app/components/block/Section.vue +31 -0
- package/templates/nonprofit/app/components/blog/Byline.vue +22 -0
- package/templates/nonprofit/app/components/blog/PostList.vue +33 -0
- package/templates/nonprofit/app/components/blog/TagList.vue +17 -0
- package/templates/nonprofit/app/components/downloads/FileButton.vue +21 -0
- package/templates/nonprofit/app/components/downloads/List.vue +37 -0
- package/templates/nonprofit/app/components/event/Next.vue +24 -0
- package/templates/nonprofit/app/components/event/Upcoming.vue +25 -0
- package/templates/nonprofit/app/components/pages/Top.vue +19 -0
- package/templates/nonprofit/app/components/people/List.vue +41 -0
- package/templates/nonprofit/app/components/people/TeamContact.vue +7 -0
- package/templates/nonprofit/app/components/site/Contact.vue +38 -0
- package/templates/nonprofit/app/components/site/Footer.vue +81 -0
- package/templates/nonprofit/app/components/site/Header.vue +52 -0
- package/templates/nonprofit/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/nonprofit/app/components/site/Logo.vue +17 -0
- package/templates/nonprofit/app/components/site/NavLink.vue +19 -0
- package/templates/nonprofit/app/components/site/NavSheet.vue +63 -0
- package/templates/nonprofit/app/components/site/Notice.vue +21 -0
- package/templates/nonprofit/app/components/site/SkipLink.vue +15 -0
- package/templates/nonprofit/app/components/site/ThemeToggle.vue +28 -0
- package/templates/nonprofit/app/components/ui/button/Button.vue +30 -0
- package/templates/nonprofit/app/components/ui/button/index.ts +44 -0
- package/templates/nonprofit/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/nonprofit/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/nonprofit/app/components/ui/sheet/index.ts +7 -0
- package/templates/nonprofit/app/composables/useBlog.ts +103 -0
- package/templates/nonprofit/app/composables/useDownloads.ts +54 -0
- package/templates/nonprofit/app/composables/useEvents.ts +182 -0
- package/templates/nonprofit/app/composables/usePageSeo.ts +50 -0
- package/templates/nonprofit/app/composables/useProjects.ts +31 -0
- package/templates/nonprofit/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/nonprofit/app/error.vue +35 -0
- package/templates/nonprofit/app/layouts/default.vue +23 -0
- package/templates/nonprofit/app/lib/utils.ts +26 -0
- package/templates/nonprofit/app/pages/[...slug].vue +36 -0
- package/templates/nonprofit/app/pages/downloads.vue +20 -0
- package/templates/nonprofit/app/pages/events/[slug].vue +106 -0
- package/templates/nonprofit/app/pages/events/index.vue +20 -0
- package/templates/nonprofit/app/pages/index.vue +64 -0
- package/templates/nonprofit/app/pages/legal/[slug].vue +46 -0
- package/templates/nonprofit/app/pages/news/[slug].vue +94 -0
- package/templates/nonprofit/app/pages/news/index.vue +54 -0
- package/templates/nonprofit/app/pages/news/tags/[tag].vue +41 -0
- package/templates/nonprofit/app/pages/projects/[slug].vue +49 -0
- package/templates/nonprofit/app/pages/projects/index.vue +24 -0
- package/templates/nonprofit/app/pages/team.vue +40 -0
- package/templates/nonprofit/app/routes.ts +32 -0
- package/templates/nonprofit/app/utils/telHref.ts +3 -0
- package/templates/nonprofit/components.json +21 -0
- package/templates/nonprofit/content/downloads/annual-report.ar.md +4 -0
- package/templates/nonprofit/content/downloads/annual-report.de.md +4 -0
- package/templates/nonprofit/content/downloads/annual-report.fr.md +4 -0
- package/templates/nonprofit/content/downloads/annual-report.md +7 -0
- package/templates/nonprofit/content/events/1.winter-clean-up.ar.md +9 -0
- package/templates/nonprofit/content/events/1.winter-clean-up.de.md +9 -0
- package/templates/nonprofit/content/events/1.winter-clean-up.fr.md +9 -0
- package/templates/nonprofit/content/events/1.winter-clean-up.md +14 -0
- package/templates/nonprofit/content/events/2.members-meeting.ar.md +9 -0
- package/templates/nonprofit/content/events/2.members-meeting.de.md +9 -0
- package/templates/nonprofit/content/events/2.members-meeting.fr.md +9 -0
- package/templates/nonprofit/content/events/2.members-meeting.md +15 -0
- package/templates/nonprofit/content/events/3.spring-clean-up.ar.md +9 -0
- package/templates/nonprofit/content/events/3.spring-clean-up.de.md +9 -0
- package/templates/nonprofit/content/events/3.spring-clean-up.fr.md +9 -0
- package/templates/nonprofit/content/events/3.spring-clean-up.md +14 -0
- package/templates/nonprofit/content/home.ar.md +6 -0
- package/templates/nonprofit/content/home.de.md +6 -0
- package/templates/nonprofit/content/home.fr.md +6 -0
- package/templates/nonprofit/content/home.md +7 -0
- package/templates/nonprofit/content/legal/1.privacy.ar.md +18 -0
- package/templates/nonprofit/content/legal/1.privacy.de.md +18 -0
- package/templates/nonprofit/content/legal/1.privacy.fr.md +18 -0
- package/templates/nonprofit/content/legal/1.privacy.md +20 -0
- package/templates/nonprofit/content/legal/2.terms.ar.md +17 -0
- package/templates/nonprofit/content/legal/2.terms.de.md +17 -0
- package/templates/nonprofit/content/legal/2.terms.fr.md +17 -0
- package/templates/nonprofit/content/legal/2.terms.md +19 -0
- package/templates/nonprofit/content/legal/3.imprint.ar.md +16 -0
- package/templates/nonprofit/content/legal/3.imprint.de.md +16 -0
- package/templates/nonprofit/content/legal/3.imprint.fr.md +16 -0
- package/templates/nonprofit/content/legal/3.imprint.md +18 -0
- package/templates/nonprofit/content/logos/1.partner-one.md +6 -0
- package/templates/nonprofit/content/logos/2.partner-two.md +6 -0
- package/templates/nonprofit/content/logos/3.partner-three.md +6 -0
- package/templates/nonprofit/content/notices/1.annual-report-online.ar.md +3 -0
- package/templates/nonprofit/content/notices/1.annual-report-online.de.md +3 -0
- package/templates/nonprofit/content/notices/1.annual-report-online.fr.md +3 -0
- package/templates/nonprofit/content/notices/1.annual-report-online.md +4 -0
- package/templates/nonprofit/content/pages/1.about.ar.md +21 -0
- package/templates/nonprofit/content/pages/1.about.de.md +21 -0
- package/templates/nonprofit/content/pages/1.about.fr.md +21 -0
- package/templates/nonprofit/content/pages/1.about.md +21 -0
- package/templates/nonprofit/content/pages/2.get-involved.ar.md +19 -0
- package/templates/nonprofit/content/pages/2.get-involved.de.md +19 -0
- package/templates/nonprofit/content/pages/2.get-involved.fr.md +19 -0
- package/templates/nonprofit/content/pages/2.get-involved.md +20 -0
- package/templates/nonprofit/content/pages/3.donate.ar.md +26 -0
- package/templates/nonprofit/content/pages/3.donate.de.md +26 -0
- package/templates/nonprofit/content/pages/3.donate.fr.md +26 -0
- package/templates/nonprofit/content/pages/3.donate.md +27 -0
- package/templates/nonprofit/content/people/1.jana-becker.ar.md +4 -0
- package/templates/nonprofit/content/people/1.jana-becker.de.md +4 -0
- package/templates/nonprofit/content/people/1.jana-becker.fr.md +4 -0
- package/templates/nonprofit/content/people/1.jana-becker.md +5 -0
- package/templates/nonprofit/content/people/2.yusuf-demir.ar.md +4 -0
- package/templates/nonprofit/content/people/2.yusuf-demir.de.md +4 -0
- package/templates/nonprofit/content/people/2.yusuf-demir.fr.md +4 -0
- package/templates/nonprofit/content/people/2.yusuf-demir.md +5 -0
- package/templates/nonprofit/content/people/3.claire-martin.ar.md +4 -0
- package/templates/nonprofit/content/people/3.claire-martin.de.md +4 -0
- package/templates/nonprofit/content/people/3.claire-martin.fr.md +4 -0
- package/templates/nonprofit/content/people/3.claire-martin.md +5 -0
- package/templates/nonprofit/content/people/4.lukas-hoffmann.ar.md +4 -0
- package/templates/nonprofit/content/people/4.lukas-hoffmann.de.md +4 -0
- package/templates/nonprofit/content/people/4.lukas-hoffmann.fr.md +4 -0
- package/templates/nonprofit/content/people/4.lukas-hoffmann.md +6 -0
- package/templates/nonprofit/content/posts/a-home-for-our-tools.ar.md +10 -0
- package/templates/nonprofit/content/posts/a-home-for-our-tools.de.md +10 -0
- package/templates/nonprofit/content/posts/a-home-for-our-tools.fr.md +10 -0
- package/templates/nonprofit/content/posts/a-home-for-our-tools.md +12 -0
- package/templates/nonprofit/content/posts/autumn-clean-up.ar.md +20 -0
- package/templates/nonprofit/content/posts/autumn-clean-up.de.md +20 -0
- package/templates/nonprofit/content/posts/autumn-clean-up.fr.md +20 -0
- package/templates/nonprofit/content/posts/autumn-clean-up.md +23 -0
- package/templates/nonprofit/content/posts/hedge-planting-plan.md +12 -0
- package/templates/nonprofit/content/posts/water-tests-with-schools.ar.md +16 -0
- package/templates/nonprofit/content/posts/water-tests-with-schools.de.md +16 -0
- package/templates/nonprofit/content/posts/water-tests-with-schools.fr.md +16 -0
- package/templates/nonprofit/content/posts/water-tests-with-schools.md +18 -0
- package/templates/nonprofit/content/posts/winter-clean-up.ar.md +14 -0
- package/templates/nonprofit/content/posts/winter-clean-up.de.md +14 -0
- package/templates/nonprofit/content/posts/winter-clean-up.fr.md +14 -0
- package/templates/nonprofit/content/posts/winter-clean-up.md +16 -0
- package/templates/nonprofit/content/projects/1.clean-banks.ar.md +9 -0
- package/templates/nonprofit/content/projects/1.clean-banks.de.md +9 -0
- package/templates/nonprofit/content/projects/1.clean-banks.fr.md +9 -0
- package/templates/nonprofit/content/projects/1.clean-banks.md +10 -0
- package/templates/nonprofit/content/projects/2.water-tests.ar.md +9 -0
- package/templates/nonprofit/content/projects/2.water-tests.de.md +9 -0
- package/templates/nonprofit/content/projects/2.water-tests.fr.md +9 -0
- package/templates/nonprofit/content/projects/2.water-tests.md +10 -0
- package/templates/nonprofit/content/projects/3.hedge-campaign.ar.md +10 -0
- package/templates/nonprofit/content/projects/3.hedge-campaign.de.md +10 -0
- package/templates/nonprofit/content/projects/3.hedge-campaign.fr.md +10 -0
- package/templates/nonprofit/content/projects/3.hedge-campaign.md +13 -0
- package/templates/nonprofit/content/projects/4.gloves-appeal.md +9 -0
- package/templates/nonprofit/content/quotes/1.volunteer.ar.md +4 -0
- package/templates/nonprofit/content/quotes/1.volunteer.de.md +4 -0
- package/templates/nonprofit/content/quotes/1.volunteer.fr.md +4 -0
- package/templates/nonprofit/content/quotes/1.volunteer.md +5 -0
- package/templates/nonprofit/content/quotes/2.teacher.ar.md +4 -0
- package/templates/nonprofit/content/quotes/2.teacher.de.md +4 -0
- package/templates/nonprofit/content/quotes/2.teacher.fr.md +4 -0
- package/templates/nonprofit/content/quotes/2.teacher.md +5 -0
- package/templates/nonprofit/content/site.ar.md +3 -0
- package/templates/nonprofit/content/site.de.md +3 -0
- package/templates/nonprofit/content/site.fr.md +3 -0
- package/templates/nonprofit/content/site.md +11 -0
- package/templates/nonprofit/eslint.config.mjs +12 -0
- package/templates/nonprofit/eslint.tailwind.mjs +33 -0
- package/templates/nonprofit/ginko.config.ts +77 -0
- package/templates/nonprofit/gitignore +7 -0
- package/templates/nonprofit/i18n/ar.json +37 -0
- package/templates/nonprofit/i18n/blog/ar.json +18 -0
- package/templates/nonprofit/i18n/blog/de.json +18 -0
- package/templates/nonprofit/i18n/blog/en.json +18 -0
- package/templates/nonprofit/i18n/blog/fr.json +18 -0
- package/templates/nonprofit/i18n/de.json +37 -0
- package/templates/nonprofit/i18n/downloads/ar.json +6 -0
- package/templates/nonprofit/i18n/downloads/de.json +6 -0
- package/templates/nonprofit/i18n/downloads/en.json +6 -0
- package/templates/nonprofit/i18n/downloads/fr.json +6 -0
- package/templates/nonprofit/i18n/en.json +37 -0
- package/templates/nonprofit/i18n/events/ar.json +20 -0
- package/templates/nonprofit/i18n/events/de.json +20 -0
- package/templates/nonprofit/i18n/events/en.json +20 -0
- package/templates/nonprofit/i18n/events/fr.json +20 -0
- package/templates/nonprofit/i18n/fr.json +37 -0
- package/templates/nonprofit/i18n/people/ar.json +6 -0
- package/templates/nonprofit/i18n/people/de.json +6 -0
- package/templates/nonprofit/i18n/people/en.json +6 -0
- package/templates/nonprofit/i18n/people/fr.json +6 -0
- package/templates/nonprofit/i18n/projects/ar.json +7 -0
- package/templates/nonprofit/i18n/projects/de.json +7 -0
- package/templates/nonprofit/i18n/projects/en.json +7 -0
- package/templates/nonprofit/i18n/projects/fr.json +7 -0
- package/templates/nonprofit/i18n/site/ar.json +39 -0
- package/templates/nonprofit/i18n/site/de.json +39 -0
- package/templates/nonprofit/i18n/site/en.json +39 -0
- package/templates/nonprofit/i18n/site/fr.json +39 -0
- package/templates/nonprofit/modules/feature-messages.ts +19 -0
- package/templates/nonprofit/modules/feeds/index.ts +22 -0
- package/templates/nonprofit/modules/feeds/routes.ts +13 -0
- package/templates/nonprofit/modules/page-paths/index.ts +26 -0
- package/templates/nonprofit/modules/page-paths/paths.ts +48 -0
- package/templates/nonprofit/nuxt.config.ts +36 -0
- package/templates/nonprofit/package.json +63 -0
- package/templates/nonprofit/pnpm-workspace.yaml +6 -0
- package/templates/nonprofit/public/files/annual-report-2025.pdf +0 -0
- package/templates/nonprofit/public/logos/partner-one.svg +5 -0
- package/templates/nonprofit/public/logos/partner-three.svg +5 -0
- package/templates/nonprofit/public/logos/partner-two.svg +4 -0
- package/templates/nonprofit/public/media/bank-clean-up.jpg +0 -0
- package/templates/nonprofit/public/media/forest-stream.jpg +0 -0
- package/templates/nonprofit/public/media/green-bank.jpg +0 -0
- package/templates/nonprofit/public/media/planting.jpg +0 -0
- package/templates/nonprofit/public/media/river-town.jpg +0 -0
- package/templates/nonprofit/public/media/workshop.jpg +0 -0
- package/templates/nonprofit/server/middleware/news-feed.ts +37 -0
- package/templates/nonprofit/server/plugins/font-preload.ts +17 -0
- package/templates/nonprofit/site-url.ts +21 -0
- package/templates/nonprofit/tsconfig.json +9 -0
- package/templates/nonprofit.json +20 -0
- package/templates/portfolio/.env.example +8 -0
- package/templates/portfolio/.github/screenshots/home-dark.png +0 -0
- package/templates/portfolio/.github/screenshots/home-light.png +0 -0
- package/templates/portfolio/.github/workflows/ci.yml +27 -0
- package/templates/portfolio/DESIGN.md +197 -0
- package/templates/portfolio/LICENSE +21 -0
- package/templates/portfolio/MEDIA.md +35 -0
- package/templates/portfolio/NOTES.md +18 -0
- package/templates/portfolio/README.md +267 -0
- package/templates/portfolio/app/app.config.ts +27 -0
- package/templates/portfolio/app/app.vue +7 -0
- package/templates/portfolio/app/assets/css/main.css +56 -0
- package/templates/portfolio/app/assets/css/tokens.css +400 -0
- package/templates/portfolio/app/bricks/pages.ts +38 -0
- package/templates/portfolio/app/bricks/projects.ts +114 -0
- package/templates/portfolio/app/components/InitialsAvatar.vue +18 -0
- package/templates/portfolio/app/components/ProseBody.vue +13 -0
- package/templates/portfolio/app/components/StartProject.vue +15 -0
- package/templates/portfolio/app/components/block/Cards.vue +54 -0
- package/templates/portfolio/app/components/block/Cta.vue +26 -0
- package/templates/portfolio/app/components/block/Empty.vue +26 -0
- package/templates/portfolio/app/components/block/Features.vue +24 -0
- package/templates/portfolio/app/components/block/Gallery.vue +81 -0
- package/templates/portfolio/app/components/block/Hero.vue +47 -0
- package/templates/portfolio/app/components/block/PageHeader.vue +21 -0
- package/templates/portfolio/app/components/block/Section.vue +31 -0
- package/templates/portfolio/app/components/blog/Byline.vue +22 -0
- package/templates/portfolio/app/components/blog/PostList.vue +33 -0
- package/templates/portfolio/app/components/blog/TagList.vue +17 -0
- package/templates/portfolio/app/components/pages/Top.vue +12 -0
- package/templates/portfolio/app/components/people/List.vue +41 -0
- package/templates/portfolio/app/components/people/TeamContact.vue +9 -0
- package/templates/portfolio/app/components/projects/Body.vue +62 -0
- package/templates/portfolio/app/components/projects/List.vue +38 -0
- package/templates/portfolio/app/components/site/Contact.vue +38 -0
- package/templates/portfolio/app/components/site/Footer.vue +81 -0
- package/templates/portfolio/app/components/site/Header.vue +52 -0
- package/templates/portfolio/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/portfolio/app/components/site/Lightbox.vue +62 -0
- package/templates/portfolio/app/components/site/Logo.vue +17 -0
- package/templates/portfolio/app/components/site/NavLink.vue +19 -0
- package/templates/portfolio/app/components/site/NavSheet.vue +63 -0
- package/templates/portfolio/app/components/site/Notice.vue +21 -0
- package/templates/portfolio/app/components/site/SkipLink.vue +15 -0
- package/templates/portfolio/app/components/site/ThemeToggle.vue +28 -0
- package/templates/portfolio/app/components/ui/button/Button.vue +30 -0
- package/templates/portfolio/app/components/ui/button/index.ts +44 -0
- package/templates/portfolio/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/portfolio/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/portfolio/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/portfolio/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/portfolio/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/portfolio/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/portfolio/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/portfolio/app/components/ui/sheet/index.ts +7 -0
- package/templates/portfolio/app/composables/useBlog.ts +103 -0
- package/templates/portfolio/app/composables/usePageSeo.ts +50 -0
- package/templates/portfolio/app/composables/useProjectJsonLd.ts +26 -0
- package/templates/portfolio/app/composables/useProjects.ts +31 -0
- package/templates/portfolio/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/portfolio/app/composables/useStartProject.ts +12 -0
- package/templates/portfolio/app/error.vue +35 -0
- package/templates/portfolio/app/layouts/default.vue +23 -0
- package/templates/portfolio/app/lib/utils.ts +26 -0
- package/templates/portfolio/app/pages/[...slug].vue +36 -0
- package/templates/portfolio/app/pages/index.vue +60 -0
- package/templates/portfolio/app/pages/legal/[slug].vue +46 -0
- package/templates/portfolio/app/pages/news/[slug].vue +94 -0
- package/templates/portfolio/app/pages/news/index.vue +54 -0
- package/templates/portfolio/app/pages/news/tags/[tag].vue +41 -0
- package/templates/portfolio/app/pages/projects/[slug].vue +49 -0
- package/templates/portfolio/app/pages/projects/index.vue +24 -0
- package/templates/portfolio/app/pages/team.vue +40 -0
- package/templates/portfolio/app/routes.ts +30 -0
- package/templates/portfolio/app/utils/telHref.ts +3 -0
- package/templates/portfolio/components.json +21 -0
- package/templates/portfolio/content/home.de.md +4 -0
- package/templates/portfolio/content/home.md +4 -0
- package/templates/portfolio/content/legal/1.privacy.de.md +19 -0
- package/templates/portfolio/content/legal/1.privacy.md +21 -0
- package/templates/portfolio/content/legal/2.imprint.de.md +15 -0
- package/templates/portfolio/content/legal/2.imprint.md +17 -0
- package/templates/portfolio/content/notices/1.holm-chair.de.md +3 -0
- package/templates/portfolio/content/notices/1.holm-chair.md +4 -0
- package/templates/portfolio/content/pages/1.how-we-work.de.md +23 -0
- package/templates/portfolio/content/pages/1.how-we-work.md +23 -0
- package/templates/portfolio/content/people/1.maren-holt.de.md +4 -0
- package/templates/portfolio/content/people/1.maren-holt.md +6 -0
- package/templates/portfolio/content/people/2.ole-petersen.de.md +4 -0
- package/templates/portfolio/content/people/2.ole-petersen.md +6 -0
- package/templates/portfolio/content/posts/full-size-drawings.de.md +11 -0
- package/templates/portfolio/content/posts/full-size-drawings.md +13 -0
- package/templates/portfolio/content/posts/lime-plaster.de.md +11 -0
- package/templates/portfolio/content/posts/lime-plaster.md +13 -0
- package/templates/portfolio/content/projects/1.attic-flat-ottensen.de.md +19 -0
- package/templates/portfolio/content/projects/1.attic-flat-ottensen.md +22 -0
- package/templates/portfolio/content/projects/2.elbsand-vases.de.md +18 -0
- package/templates/portfolio/content/projects/2.elbsand-vases.md +21 -0
- package/templates/portfolio/content/projects/3.werftblick-entrance-hall.de.md +18 -0
- package/templates/portfolio/content/projects/3.werftblick-entrance-hall.md +22 -0
- package/templates/portfolio/content/projects/4.holm-chair.de.md +18 -0
- package/templates/portfolio/content/projects/4.holm-chair.md +21 -0
- package/templates/portfolio/content/site.md +13 -0
- package/templates/portfolio/eslint.config.mjs +12 -0
- package/templates/portfolio/eslint.tailwind.mjs +33 -0
- package/templates/portfolio/ginko.config.ts +70 -0
- package/templates/portfolio/gitignore +7 -0
- package/templates/portfolio/i18n/blog/de.json +18 -0
- package/templates/portfolio/i18n/blog/en.json +18 -0
- package/templates/portfolio/i18n/de.json +47 -0
- package/templates/portfolio/i18n/en.json +47 -0
- package/templates/portfolio/i18n/gallery/de.json +8 -0
- package/templates/portfolio/i18n/gallery/en.json +8 -0
- package/templates/portfolio/i18n/people/de.json +6 -0
- package/templates/portfolio/i18n/people/en.json +6 -0
- package/templates/portfolio/i18n/projects/de.json +7 -0
- package/templates/portfolio/i18n/projects/en.json +7 -0
- package/templates/portfolio/i18n/site/de.json +39 -0
- package/templates/portfolio/i18n/site/en.json +39 -0
- package/templates/portfolio/modules/feature-messages.ts +19 -0
- package/templates/portfolio/modules/feeds/index.ts +22 -0
- package/templates/portfolio/modules/feeds/routes.ts +13 -0
- package/templates/portfolio/modules/page-paths/index.ts +26 -0
- package/templates/portfolio/modules/page-paths/paths.ts +48 -0
- package/templates/portfolio/nuxt.config.ts +30 -0
- package/templates/portfolio/package.json +60 -0
- package/templates/portfolio/pnpm-workspace.yaml +6 -0
- package/templates/portfolio/public/media/attic-light.jpg +0 -0
- package/templates/portfolio/public/media/ceramic-vases.jpg +0 -0
- package/templates/portfolio/public/media/concrete-stair.jpg +0 -0
- package/templates/portfolio/public/media/material-samples.jpg +0 -0
- package/templates/portfolio/public/media/oak-chair.jpg +0 -0
- package/templates/portfolio/public/media/workshop-drawings.jpg +0 -0
- package/templates/portfolio/server/middleware/news-feed.ts +37 -0
- package/templates/portfolio/server/plugins/font-preload.ts +17 -0
- package/templates/portfolio/site-url.ts +21 -0
- package/templates/portfolio/tsconfig.json +9 -0
- package/templates/portfolio.json +11 -0
- package/templates/restaurant/.env.example +8 -0
- package/templates/restaurant/.github/screenshots/home-dark.png +0 -0
- package/templates/restaurant/.github/screenshots/home-light.png +0 -0
- package/templates/restaurant/.github/workflows/ci.yml +27 -0
- package/templates/restaurant/DESIGN.md +197 -0
- package/templates/restaurant/LICENSE +21 -0
- package/templates/restaurant/MEDIA.md +37 -0
- package/templates/restaurant/README.md +249 -0
- package/templates/restaurant/app/app.config.ts +33 -0
- package/templates/restaurant/app/app.vue +7 -0
- package/templates/restaurant/app/assets/css/main.css +20 -0
- package/templates/restaurant/app/assets/css/tokens.css +400 -0
- package/templates/restaurant/app/bricks/pages.ts +38 -0
- package/templates/restaurant/app/components/InitialsAvatar.vue +18 -0
- package/templates/restaurant/app/components/ProseBody.vue +13 -0
- package/templates/restaurant/app/components/block/Cards.vue +54 -0
- package/templates/restaurant/app/components/block/Cta.vue +26 -0
- package/templates/restaurant/app/components/block/Empty.vue +26 -0
- package/templates/restaurant/app/components/block/Features.vue +24 -0
- package/templates/restaurant/app/components/block/Gallery.vue +81 -0
- package/templates/restaurant/app/components/block/Hero.vue +47 -0
- package/templates/restaurant/app/components/block/PageHeader.vue +21 -0
- package/templates/restaurant/app/components/block/Section.vue +31 -0
- package/templates/restaurant/app/components/event/Upcoming.vue +25 -0
- package/templates/restaurant/app/components/hours/Table.vue +119 -0
- package/templates/restaurant/app/components/hours/Today.vue +55 -0
- package/templates/restaurant/app/components/menu/AllergenKey.vue +17 -0
- package/templates/restaurant/app/components/menu/Allergens.vue +24 -0
- package/templates/restaurant/app/components/menu/Diet.vue +16 -0
- package/templates/restaurant/app/components/menu/Dish.vue +30 -0
- package/templates/restaurant/app/components/menu/LunchDays.vue +42 -0
- package/templates/restaurant/app/components/site/Contact.vue +38 -0
- package/templates/restaurant/app/components/site/Footer.vue +81 -0
- package/templates/restaurant/app/components/site/FooterStatus.vue +9 -0
- package/templates/restaurant/app/components/site/Header.vue +52 -0
- package/templates/restaurant/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/restaurant/app/components/site/Lightbox.vue +62 -0
- package/templates/restaurant/app/components/site/Logo.vue +17 -0
- package/templates/restaurant/app/components/site/NavLink.vue +19 -0
- package/templates/restaurant/app/components/site/NavSheet.vue +63 -0
- package/templates/restaurant/app/components/site/Notice.vue +21 -0
- package/templates/restaurant/app/components/site/SkipLink.vue +15 -0
- package/templates/restaurant/app/components/site/ThemeToggle.vue +28 -0
- package/templates/restaurant/app/components/ui/button/Button.vue +30 -0
- package/templates/restaurant/app/components/ui/button/index.ts +44 -0
- package/templates/restaurant/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/restaurant/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/restaurant/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/restaurant/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/restaurant/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/restaurant/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/restaurant/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/restaurant/app/components/ui/sheet/index.ts +7 -0
- package/templates/restaurant/app/composables/useEvents.ts +182 -0
- package/templates/restaurant/app/composables/useHours.ts +81 -0
- package/templates/restaurant/app/composables/useMenu.ts +76 -0
- package/templates/restaurant/app/composables/usePageSeo.ts +50 -0
- package/templates/restaurant/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/restaurant/app/error.vue +35 -0
- package/templates/restaurant/app/layouts/default.vue +23 -0
- package/templates/restaurant/app/layouts/print.vue +9 -0
- package/templates/restaurant/app/lib/utils.ts +26 -0
- package/templates/restaurant/app/pages/[...slug].vue +36 -0
- package/templates/restaurant/app/pages/events/[slug].vue +106 -0
- package/templates/restaurant/app/pages/events/index.vue +20 -0
- package/templates/restaurant/app/pages/gallery.vue +17 -0
- package/templates/restaurant/app/pages/index.vue +163 -0
- package/templates/restaurant/app/pages/legal/[slug].vue +46 -0
- package/templates/restaurant/app/pages/lunch.vue +30 -0
- package/templates/restaurant/app/pages/menu/index.vue +46 -0
- package/templates/restaurant/app/pages/menu/print.vue +69 -0
- package/templates/restaurant/app/pages/reservations.vue +52 -0
- package/templates/restaurant/app/routes.ts +33 -0
- package/templates/restaurant/app/utils/hours.ts +58 -0
- package/templates/restaurant/app/utils/telHref.ts +3 -0
- package/templates/restaurant/components.json +21 -0
- package/templates/restaurant/content/events/1.wine-evening.de.md +10 -0
- package/templates/restaurant/content/events/1.wine-evening.it.md +10 -0
- package/templates/restaurant/content/events/1.wine-evening.md +16 -0
- package/templates/restaurant/content/events/2.cooking-class.de.md +10 -0
- package/templates/restaurant/content/events/2.cooking-class.it.md +10 -0
- package/templates/restaurant/content/events/2.cooking-class.md +16 -0
- package/templates/restaurant/content/gallery.de.md +15 -0
- package/templates/restaurant/content/gallery.it.md +15 -0
- package/templates/restaurant/content/gallery.md +21 -0
- package/templates/restaurant/content/home.de.md +6 -0
- package/templates/restaurant/content/home.it.md +6 -0
- package/templates/restaurant/content/home.md +7 -0
- package/templates/restaurant/content/hourPlans/1.winter-hours.de.md +3 -0
- package/templates/restaurant/content/hourPlans/1.winter-hours.it.md +3 -0
- package/templates/restaurant/content/hourPlans/1.winter-hours.md +41 -0
- package/templates/restaurant/content/hours.de.md +4 -0
- package/templates/restaurant/content/hours.it.md +4 -0
- package/templates/restaurant/content/hours.md +45 -0
- package/templates/restaurant/content/legal/1.privacy.de.md +28 -0
- package/templates/restaurant/content/legal/1.privacy.it.md +28 -0
- package/templates/restaurant/content/legal/1.privacy.md +29 -0
- package/templates/restaurant/content/legal/2.terms.de.md +21 -0
- package/templates/restaurant/content/legal/2.terms.it.md +21 -0
- package/templates/restaurant/content/legal/2.terms.md +22 -0
- package/templates/restaurant/content/legal/3.imprint.de.md +15 -0
- package/templates/restaurant/content/legal/3.imprint.it.md +15 -0
- package/templates/restaurant/content/legal/3.imprint.md +16 -0
- package/templates/restaurant/content/lunch.de.md +3 -0
- package/templates/restaurant/content/lunch.it.md +3 -0
- package/templates/restaurant/content/lunch.md +25 -0
- package/templates/restaurant/content/menu/1.liptauer.de.md +4 -0
- package/templates/restaurant/content/menu/1.liptauer.it.md +4 -0
- package/templates/restaurant/content/menu/1.liptauer.md +8 -0
- package/templates/restaurant/content/menu/10.kaiserschmarrn.de.md +4 -0
- package/templates/restaurant/content/menu/10.kaiserschmarrn.it.md +4 -0
- package/templates/restaurant/content/menu/10.kaiserschmarrn.md +8 -0
- package/templates/restaurant/content/menu/11.apple-strudel.de.md +4 -0
- package/templates/restaurant/content/menu/11.apple-strudel.it.md +4 -0
- package/templates/restaurant/content/menu/11.apple-strudel.md +8 -0
- package/templates/restaurant/content/menu/12.apple-spritzer.de.md +4 -0
- package/templates/restaurant/content/menu/12.apple-spritzer.it.md +4 -0
- package/templates/restaurant/content/menu/12.apple-spritzer.md +8 -0
- package/templates/restaurant/content/menu/13.elderflower-soda.de.md +3 -0
- package/templates/restaurant/content/menu/13.elderflower-soda.it.md +3 -0
- package/templates/restaurant/content/menu/13.elderflower-soda.md +7 -0
- package/templates/restaurant/content/menu/14.melange.de.md +4 -0
- package/templates/restaurant/content/menu/14.melange.it.md +4 -0
- package/templates/restaurant/content/menu/14.melange.md +8 -0
- package/templates/restaurant/content/menu/15.gruener-veltliner.de.md +4 -0
- package/templates/restaurant/content/menu/15.gruener-veltliner.it.md +4 -0
- package/templates/restaurant/content/menu/15.gruener-veltliner.md +8 -0
- package/templates/restaurant/content/menu/16.zweigelt.de.md +4 -0
- package/templates/restaurant/content/menu/16.zweigelt.it.md +4 -0
- package/templates/restaurant/content/menu/16.zweigelt.md +8 -0
- package/templates/restaurant/content/menu/17.maerzen.de.md +4 -0
- package/templates/restaurant/content/menu/17.maerzen.it.md +4 -0
- package/templates/restaurant/content/menu/17.maerzen.md +8 -0
- package/templates/restaurant/content/menu/2.cured-char.de.md +4 -0
- package/templates/restaurant/content/menu/2.cured-char.it.md +4 -0
- package/templates/restaurant/content/menu/2.cured-char.md +8 -0
- package/templates/restaurant/content/menu/3.frittaten-soup.de.md +4 -0
- package/templates/restaurant/content/menu/3.frittaten-soup.it.md +4 -0
- package/templates/restaurant/content/menu/3.frittaten-soup.md +8 -0
- package/templates/restaurant/content/menu/4.pumpkin-soup.de.md +4 -0
- package/templates/restaurant/content/menu/4.pumpkin-soup.it.md +4 -0
- package/templates/restaurant/content/menu/4.pumpkin-soup.md +8 -0
- package/templates/restaurant/content/menu/5.wiener-schnitzel.de.md +4 -0
- package/templates/restaurant/content/menu/5.wiener-schnitzel.it.md +4 -0
- package/templates/restaurant/content/menu/5.wiener-schnitzel.md +8 -0
- package/templates/restaurant/content/menu/6.tafelspitz.de.md +4 -0
- package/templates/restaurant/content/menu/6.tafelspitz.it.md +4 -0
- package/templates/restaurant/content/menu/6.tafelspitz.md +8 -0
- package/templates/restaurant/content/menu/7.roast-pork.de.md +4 -0
- package/templates/restaurant/content/menu/7.roast-pork.it.md +4 -0
- package/templates/restaurant/content/menu/7.roast-pork.md +8 -0
- package/templates/restaurant/content/menu/8.kasnocken.de.md +4 -0
- package/templates/restaurant/content/menu/8.kasnocken.it.md +4 -0
- package/templates/restaurant/content/menu/8.kasnocken.md +8 -0
- package/templates/restaurant/content/menu/9.lentil-goulash.de.md +4 -0
- package/templates/restaurant/content/menu/9.lentil-goulash.it.md +4 -0
- package/templates/restaurant/content/menu/9.lentil-goulash.md +8 -0
- package/templates/restaurant/content/notices/1.cook-wanted.de.md +3 -0
- package/templates/restaurant/content/notices/1.cook-wanted.it.md +3 -0
- package/templates/restaurant/content/notices/1.cook-wanted.md +4 -0
- package/templates/restaurant/content/pages/1.about.de.md +23 -0
- package/templates/restaurant/content/pages/1.about.it.md +23 -0
- package/templates/restaurant/content/pages/1.about.md +24 -0
- package/templates/restaurant/content/reservations.de.md +20 -0
- package/templates/restaurant/content/reservations.it.md +20 -0
- package/templates/restaurant/content/reservations.md +20 -0
- package/templates/restaurant/content/site.de.md +3 -0
- package/templates/restaurant/content/site.it.md +3 -0
- package/templates/restaurant/content/site.md +12 -0
- package/templates/restaurant/eslint.config.mjs +12 -0
- package/templates/restaurant/eslint.tailwind.mjs +33 -0
- package/templates/restaurant/ginko.config.ts +78 -0
- package/templates/restaurant/gitignore +7 -0
- package/templates/restaurant/i18n/de.json +31 -0
- package/templates/restaurant/i18n/en.json +31 -0
- package/templates/restaurant/i18n/events/de.json +20 -0
- package/templates/restaurant/i18n/events/en.json +20 -0
- package/templates/restaurant/i18n/events/it.json +20 -0
- package/templates/restaurant/i18n/gallery/de.json +8 -0
- package/templates/restaurant/i18n/gallery/en.json +8 -0
- package/templates/restaurant/i18n/gallery/it.json +8 -0
- package/templates/restaurant/i18n/hours/de.json +27 -0
- package/templates/restaurant/i18n/hours/en.json +27 -0
- package/templates/restaurant/i18n/hours/it.json +27 -0
- package/templates/restaurant/i18n/it.json +31 -0
- package/templates/restaurant/i18n/menu/de.json +54 -0
- package/templates/restaurant/i18n/menu/en.json +54 -0
- package/templates/restaurant/i18n/menu/it.json +54 -0
- package/templates/restaurant/i18n/site/de.json +39 -0
- package/templates/restaurant/i18n/site/en.json +39 -0
- package/templates/restaurant/i18n/site/it.json +39 -0
- package/templates/restaurant/modules/feature-messages.ts +19 -0
- package/templates/restaurant/modules/feeds/index.ts +22 -0
- package/templates/restaurant/modules/feeds/routes.ts +13 -0
- package/templates/restaurant/modules/page-paths/index.ts +26 -0
- package/templates/restaurant/modules/page-paths/paths.ts +48 -0
- package/templates/restaurant/nuxt.config.ts +27 -0
- package/templates/restaurant/package.json +61 -0
- package/templates/restaurant/pnpm-workspace.yaml +6 -0
- package/templates/restaurant/public/media/garten.jpg +0 -0
- package/templates/restaurant/public/media/gastraum.jpg +0 -0
- package/templates/restaurant/public/media/gaststube.jpg +0 -0
- package/templates/restaurant/public/media/kueche.jpg +0 -0
- package/templates/restaurant/public/media/schnitzel.jpg +0 -0
- package/templates/restaurant/public/media/strudel.jpg +0 -0
- package/templates/restaurant/public/media/weinabend.jpg +0 -0
- package/templates/restaurant/server/plugins/font-preload.ts +17 -0
- package/templates/restaurant/site-url.ts +21 -0
- package/templates/restaurant/tsconfig.json +9 -0
- package/templates/restaurant.json +19 -0
- package/templates/saas/.env.example +8 -0
- package/templates/saas/.github/screenshots/home-dark.png +0 -0
- package/templates/saas/.github/screenshots/home-light.png +0 -0
- package/templates/saas/.github/workflows/ci.yml +27 -0
- package/templates/saas/DESIGN.md +197 -0
- package/templates/saas/LICENSE +21 -0
- package/templates/saas/MEDIA.md +20 -0
- package/templates/saas/NOTES.md +23 -0
- package/templates/saas/README.md +264 -0
- package/templates/saas/app/app.config.ts +37 -0
- package/templates/saas/app/app.vue +7 -0
- package/templates/saas/app/assets/css/main.css +30 -0
- package/templates/saas/app/assets/css/tokens.css +400 -0
- package/templates/saas/app/bricks/logos-quotes.ts +47 -0
- package/templates/saas/app/bricks/pages.ts +38 -0
- package/templates/saas/app/bricks/pricing.ts +60 -0
- package/templates/saas/app/components/DocsPageEnd.vue +8 -0
- package/templates/saas/app/components/InitialsAvatar.vue +18 -0
- package/templates/saas/app/components/ProseBody.vue +13 -0
- package/templates/saas/app/components/block/Cards.vue +54 -0
- package/templates/saas/app/components/block/Cta.vue +26 -0
- package/templates/saas/app/components/block/Empty.vue +26 -0
- package/templates/saas/app/components/block/Faq.vue +19 -0
- package/templates/saas/app/components/block/Features.vue +24 -0
- package/templates/saas/app/components/block/Hero.vue +47 -0
- package/templates/saas/app/components/block/Logos.vue +22 -0
- package/templates/saas/app/components/block/PageHeader.vue +21 -0
- package/templates/saas/app/components/block/Quote.vue +19 -0
- package/templates/saas/app/components/block/Section.vue +31 -0
- package/templates/saas/app/components/blog/Byline.vue +22 -0
- package/templates/saas/app/components/blog/PostList.vue +33 -0
- package/templates/saas/app/components/blog/TagList.vue +17 -0
- package/templates/saas/app/components/changelog/Latest.vue +32 -0
- package/templates/saas/app/components/help/Contact.vue +14 -0
- package/templates/saas/app/components/pages/Top.vue +30 -0
- package/templates/saas/app/components/pricing/More.vue +21 -0
- package/templates/saas/app/components/pricing/Plans.vue +60 -0
- package/templates/saas/app/components/site/Contact.vue +38 -0
- package/templates/saas/app/components/site/Footer.vue +81 -0
- package/templates/saas/app/components/site/Header.vue +52 -0
- package/templates/saas/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/saas/app/components/site/Logo.vue +17 -0
- package/templates/saas/app/components/site/NavLink.vue +19 -0
- package/templates/saas/app/components/site/NavSheet.vue +63 -0
- package/templates/saas/app/components/site/Notice.vue +21 -0
- package/templates/saas/app/components/site/PageCta.vue +12 -0
- package/templates/saas/app/components/site/SkipLink.vue +15 -0
- package/templates/saas/app/components/site/ThemeToggle.vue +28 -0
- package/templates/saas/app/components/ui/accordion/Accordion.vue +16 -0
- package/templates/saas/app/components/ui/accordion/AccordionContent.vue +26 -0
- package/templates/saas/app/components/ui/accordion/AccordionItem.vue +24 -0
- package/templates/saas/app/components/ui/accordion/AccordionTrigger.vue +35 -0
- package/templates/saas/app/components/ui/accordion/index.ts +5 -0
- package/templates/saas/app/components/ui/button/Button.vue +30 -0
- package/templates/saas/app/components/ui/button/index.ts +44 -0
- package/templates/saas/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/saas/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/saas/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/saas/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/saas/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/saas/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/saas/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/saas/app/components/ui/sheet/index.ts +7 -0
- package/templates/saas/app/composables/useBlog.ts +103 -0
- package/templates/saas/app/composables/useChangelog.ts +54 -0
- package/templates/saas/app/composables/usePageSeo.ts +50 -0
- package/templates/saas/app/composables/usePricing.ts +110 -0
- package/templates/saas/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/saas/app/error.vue +35 -0
- package/templates/saas/app/layouts/default.vue +23 -0
- package/templates/saas/app/lib/utils.ts +26 -0
- package/templates/saas/app/pages/[...slug].vue +36 -0
- package/templates/saas/app/pages/changelog.vue +47 -0
- package/templates/saas/app/pages/faq.vue +39 -0
- package/templates/saas/app/pages/help/index.vue +21 -0
- package/templates/saas/app/pages/index.vue +67 -0
- package/templates/saas/app/pages/legal/[slug].vue +46 -0
- package/templates/saas/app/pages/news/[slug].vue +94 -0
- package/templates/saas/app/pages/news/index.vue +54 -0
- package/templates/saas/app/pages/news/tags/[tag].vue +41 -0
- package/templates/saas/app/pages/pricing.vue +27 -0
- package/templates/saas/app/routes.ts +31 -0
- package/templates/saas/app/utils/telHref.ts +3 -0
- package/templates/saas/components.json +21 -0
- package/templates/saas/content/changelog/v4-3-0.de.md +18 -0
- package/templates/saas/content/changelog/v4-3-0.fr.md +18 -0
- package/templates/saas/content/changelog/v4-3-0.md +20 -0
- package/templates/saas/content/changelog/v4-4-0.de.md +15 -0
- package/templates/saas/content/changelog/v4-4-0.fr.md +15 -0
- package/templates/saas/content/changelog/v4-4-0.md +17 -0
- package/templates/saas/content/changelog/v4-4-1.de.md +11 -0
- package/templates/saas/content/changelog/v4-4-1.fr.md +11 -0
- package/templates/saas/content/changelog/v4-4-1.md +13 -0
- package/templates/saas/content/changelog/v4-5-0.de.md +19 -0
- package/templates/saas/content/changelog/v4-5-0.fr.md +19 -0
- package/templates/saas/content/changelog/v4-5-0.md +21 -0
- package/templates/saas/content/changelog/v4-6-0.de.md +19 -0
- package/templates/saas/content/changelog/v4-6-0.fr.md +19 -0
- package/templates/saas/content/changelog/v4-6-0.md +21 -0
- package/templates/saas/content/docs/1.getting-started.de.md +33 -0
- package/templates/saas/content/docs/1.getting-started.fr.md +33 -0
- package/templates/saas/content/docs/1.getting-started.md +32 -0
- package/templates/saas/content/docs/2.shifts.de.md +24 -0
- package/templates/saas/content/docs/2.shifts.fr.md +24 -0
- package/templates/saas/content/docs/2.shifts.md +23 -0
- package/templates/saas/content/docs/3.export.de.md +21 -0
- package/templates/saas/content/docs/3.export.fr.md +21 -0
- package/templates/saas/content/docs/3.export.md +20 -0
- package/templates/saas/content/faq/1.billing.de.md +4 -0
- package/templates/saas/content/faq/1.billing.fr.md +4 -0
- package/templates/saas/content/faq/1.billing.md +4 -0
- package/templates/saas/content/faq/2.cancellation.de.md +4 -0
- package/templates/saas/content/faq/2.cancellation.fr.md +4 -0
- package/templates/saas/content/faq/2.cancellation.md +4 -0
- package/templates/saas/content/faq/3.data-export.de.md +4 -0
- package/templates/saas/content/faq/3.data-export.fr.md +4 -0
- package/templates/saas/content/faq/3.data-export.md +4 -0
- package/templates/saas/content/faq/4.change-plan.de.md +4 -0
- package/templates/saas/content/faq/4.change-plan.fr.md +4 -0
- package/templates/saas/content/faq/4.change-plan.md +4 -0
- package/templates/saas/content/faq/5.trial.de.md +4 -0
- package/templates/saas/content/faq/5.trial.fr.md +4 -0
- package/templates/saas/content/faq/5.trial.md +4 -0
- package/templates/saas/content/faq/6.data-location.de.md +4 -0
- package/templates/saas/content/faq/6.data-location.fr.md +4 -0
- package/templates/saas/content/faq/6.data-location.md +4 -0
- package/templates/saas/content/faq/7.data-processing.de.md +4 -0
- package/templates/saas/content/faq/7.data-processing.fr.md +4 -0
- package/templates/saas/content/faq/7.data-processing.md +4 -0
- package/templates/saas/content/home.de.md +24 -0
- package/templates/saas/content/home.fr.md +24 -0
- package/templates/saas/content/home.md +26 -0
- package/templates/saas/content/legal/1.privacy.de.md +20 -0
- package/templates/saas/content/legal/1.privacy.fr.md +20 -0
- package/templates/saas/content/legal/1.privacy.md +22 -0
- package/templates/saas/content/legal/2.terms.de.md +20 -0
- package/templates/saas/content/legal/2.terms.fr.md +20 -0
- package/templates/saas/content/legal/2.terms.md +22 -0
- package/templates/saas/content/legal/3.imprint.de.md +16 -0
- package/templates/saas/content/legal/3.imprint.fr.md +16 -0
- package/templates/saas/content/legal/3.imprint.md +18 -0
- package/templates/saas/content/logos/1.sonnenlinde.md +6 -0
- package/templates/saas/content/logos/2.elsterau.md +6 -0
- package/templates/saas/content/logos/3.rosental.md +6 -0
- package/templates/saas/content/logos/4.muldental.md +6 -0
- package/templates/saas/content/notices/5.swap-requests.de.md +3 -0
- package/templates/saas/content/notices/5.swap-requests.fr.md +3 -0
- package/templates/saas/content/notices/5.swap-requests.md +4 -0
- package/templates/saas/content/pages/1.security.de.md +25 -0
- package/templates/saas/content/pages/1.security.fr.md +25 -0
- package/templates/saas/content/pages/1.security.md +25 -0
- package/templates/saas/content/pages/2.about.de.md +17 -0
- package/templates/saas/content/pages/2.about.fr.md +17 -0
- package/templates/saas/content/pages/2.about.md +17 -0
- package/templates/saas/content/pages/3.contact.de.md +15 -0
- package/templates/saas/content/pages/3.contact.fr.md +15 -0
- package/templates/saas/content/pages/3.contact.md +15 -0
- package/templates/saas/content/people/1.lena-hartmann.de.md +4 -0
- package/templates/saas/content/people/1.lena-hartmann.fr.md +4 -0
- package/templates/saas/content/people/1.lena-hartmann.md +5 -0
- package/templates/saas/content/people/2.jonas-pohl.de.md +4 -0
- package/templates/saas/content/people/2.jonas-pohl.fr.md +4 -0
- package/templates/saas/content/people/2.jonas-pohl.md +5 -0
- package/templates/saas/content/posts/rest-periods.de.md +20 -0
- package/templates/saas/content/posts/rest-periods.fr.md +20 -0
- package/templates/saas/content/posts/rest-periods.md +22 -0
- package/templates/saas/content/posts/summer-holidays.de.md +16 -0
- package/templates/saas/content/posts/summer-holidays.fr.md +16 -0
- package/templates/saas/content/posts/summer-holidays.md +18 -0
- package/templates/saas/content/posts/swap-requests.de.md +18 -0
- package/templates/saas/content/posts/swap-requests.fr.md +18 -0
- package/templates/saas/content/posts/swap-requests.md +20 -0
- package/templates/saas/content/pricing/1.small.de.md +11 -0
- package/templates/saas/content/pricing/1.small.fr.md +11 -0
- package/templates/saas/content/pricing/1.small.md +15 -0
- package/templates/saas/content/pricing/2.standard.de.md +11 -0
- package/templates/saas/content/pricing/2.standard.fr.md +11 -0
- package/templates/saas/content/pricing/2.standard.md +16 -0
- package/templates/saas/content/pricing/3.group.de.md +11 -0
- package/templates/saas/content/pricing/3.group.fr.md +11 -0
- package/templates/saas/content/pricing/3.group.md +12 -0
- package/templates/saas/content/quotes/1.ward-lead.de.md +4 -0
- package/templates/saas/content/quotes/1.ward-lead.fr.md +4 -0
- package/templates/saas/content/quotes/1.ward-lead.md +5 -0
- package/templates/saas/content/site.de.md +3 -0
- package/templates/saas/content/site.fr.md +3 -0
- package/templates/saas/content/site.md +12 -0
- package/templates/saas/eslint.config.mjs +12 -0
- package/templates/saas/eslint.tailwind.mjs +33 -0
- package/templates/saas/ginko.config.ts +108 -0
- package/templates/saas/gitignore +7 -0
- package/templates/saas/i18n/blog/de.json +18 -0
- package/templates/saas/i18n/blog/en.json +18 -0
- package/templates/saas/i18n/blog/fr.json +18 -0
- package/templates/saas/i18n/changelog/de.json +9 -0
- package/templates/saas/i18n/changelog/en.json +9 -0
- package/templates/saas/i18n/changelog/fr.json +9 -0
- package/templates/saas/i18n/de.json +48 -0
- package/templates/saas/i18n/en.json +48 -0
- package/templates/saas/i18n/faq/de.json +6 -0
- package/templates/saas/i18n/faq/en.json +6 -0
- package/templates/saas/i18n/faq/fr.json +6 -0
- package/templates/saas/i18n/fr.json +48 -0
- package/templates/saas/i18n/pricing/de.json +14 -0
- package/templates/saas/i18n/pricing/en.json +14 -0
- package/templates/saas/i18n/pricing/fr.json +14 -0
- package/templates/saas/i18n/site/de.json +39 -0
- package/templates/saas/i18n/site/en.json +39 -0
- package/templates/saas/i18n/site/fr.json +39 -0
- package/templates/saas/modules/feature-messages.ts +19 -0
- package/templates/saas/modules/feeds/index.ts +22 -0
- package/templates/saas/modules/feeds/routes.ts +13 -0
- package/templates/saas/modules/page-paths/index.ts +26 -0
- package/templates/saas/modules/page-paths/paths.ts +48 -0
- package/templates/saas/nuxt.config.ts +30 -0
- package/templates/saas/package.json +63 -0
- package/templates/saas/pnpm-workspace.yaml +6 -0
- package/templates/saas/public/logos/care-home-four.svg +4 -0
- package/templates/saas/public/logos/care-home-one.svg +4 -0
- package/templates/saas/public/logos/care-home-two.svg +4 -0
- package/templates/saas/public/logos/clinic-three.svg +4 -0
- package/templates/saas/public/media/rota.svg +76 -0
- package/templates/saas/server/middleware/changelog-feed.ts +50 -0
- package/templates/saas/server/middleware/news-feed.ts +37 -0
- package/templates/saas/server/plugins/font-preload.ts +17 -0
- package/templates/saas/shared/utils/changelog.ts +13 -0
- package/templates/saas/site-url.ts +21 -0
- package/templates/saas/tsconfig.json +9 -0
- package/templates/saas.json +12 -0
- package/templates/starter/.env.example +8 -0
- package/templates/starter/.github/screenshots/home-dark.png +0 -0
- package/templates/starter/.github/screenshots/home-light.png +0 -0
- package/templates/starter/.github/workflows/ci.yml +27 -0
- package/templates/starter/DESIGN.md +197 -0
- package/templates/starter/LICENSE +21 -0
- package/templates/starter/MEDIA.md +11 -0
- package/templates/starter/README.md +199 -0
- package/templates/starter/app/app.config.ts +21 -0
- package/templates/starter/app/app.vue +7 -0
- package/templates/starter/app/assets/css/main.css +19 -0
- package/templates/starter/app/assets/css/tokens.css +400 -0
- package/templates/starter/app/bricks/pages.ts +38 -0
- package/templates/starter/app/components/InitialsAvatar.vue +18 -0
- package/templates/starter/app/components/ProseBody.vue +13 -0
- package/templates/starter/app/components/block/Cards.vue +54 -0
- package/templates/starter/app/components/block/Cta.vue +26 -0
- package/templates/starter/app/components/block/Empty.vue +26 -0
- package/templates/starter/app/components/block/Features.vue +24 -0
- package/templates/starter/app/components/block/Hero.vue +47 -0
- package/templates/starter/app/components/block/PageHeader.vue +21 -0
- package/templates/starter/app/components/block/Section.vue +31 -0
- package/templates/starter/app/components/pages/Top.vue +11 -0
- package/templates/starter/app/components/site/Contact.vue +38 -0
- package/templates/starter/app/components/site/Footer.vue +81 -0
- package/templates/starter/app/components/site/Header.vue +52 -0
- package/templates/starter/app/components/site/LanguageSwitch.vue +34 -0
- package/templates/starter/app/components/site/Logo.vue +17 -0
- package/templates/starter/app/components/site/NavLink.vue +19 -0
- package/templates/starter/app/components/site/NavSheet.vue +63 -0
- package/templates/starter/app/components/site/Notice.vue +21 -0
- package/templates/starter/app/components/site/SkipLink.vue +15 -0
- package/templates/starter/app/components/site/ThemeToggle.vue +28 -0
- package/templates/starter/app/components/ui/button/Button.vue +30 -0
- package/templates/starter/app/components/ui/button/index.ts +44 -0
- package/templates/starter/app/components/ui/sheet/Sheet.vue +16 -0
- package/templates/starter/app/components/ui/sheet/SheetClose.vue +13 -0
- package/templates/starter/app/components/ui/sheet/SheetContent.vue +54 -0
- package/templates/starter/app/components/ui/sheet/SheetDescription.vue +23 -0
- package/templates/starter/app/components/ui/sheet/SheetOverlay.vue +22 -0
- package/templates/starter/app/components/ui/sheet/SheetTitle.vue +23 -0
- package/templates/starter/app/components/ui/sheet/SheetTrigger.vue +13 -0
- package/templates/starter/app/components/ui/sheet/index.ts +7 -0
- package/templates/starter/app/composables/usePageSeo.ts +50 -0
- package/templates/starter/app/composables/useSiteAppConfig.ts +79 -0
- package/templates/starter/app/error.vue +35 -0
- package/templates/starter/app/layouts/default.vue +23 -0
- package/templates/starter/app/lib/utils.ts +26 -0
- package/templates/starter/app/pages/[...slug].vue +36 -0
- package/templates/starter/app/pages/index.vue +24 -0
- package/templates/starter/app/pages/legal/[slug].vue +46 -0
- package/templates/starter/app/routes.ts +14 -0
- package/templates/starter/app/utils/telHref.ts +3 -0
- package/templates/starter/components.json +21 -0
- package/templates/starter/content/home.de.md +16 -0
- package/templates/starter/content/home.md +16 -0
- package/templates/starter/content/legal/1.privacy.de.md +28 -0
- package/templates/starter/content/legal/1.privacy.md +29 -0
- package/templates/starter/content/legal/2.terms.de.md +21 -0
- package/templates/starter/content/legal/2.terms.md +22 -0
- package/templates/starter/content/legal/3.imprint.de.md +16 -0
- package/templates/starter/content/legal/3.imprint.md +16 -0
- package/templates/starter/content/notices/1.welcome.de.md +4 -0
- package/templates/starter/content/notices/1.welcome.md +5 -0
- package/templates/starter/content/pages/1.about.de.md +20 -0
- package/templates/starter/content/pages/1.about.md +18 -0
- package/templates/starter/content/pages/2.contact.de.md +17 -0
- package/templates/starter/content/pages/2.contact.md +15 -0
- package/templates/starter/content/site.md +12 -0
- package/templates/starter/eslint.config.mjs +12 -0
- package/templates/starter/eslint.tailwind.mjs +33 -0
- package/templates/starter/ginko.config.ts +42 -0
- package/templates/starter/gitignore +7 -0
- package/templates/starter/i18n/de.json +6 -0
- package/templates/starter/i18n/en.json +6 -0
- package/templates/starter/i18n/site/de.json +39 -0
- package/templates/starter/i18n/site/en.json +39 -0
- package/templates/starter/modules/feature-messages.ts +19 -0
- package/templates/starter/modules/feeds/index.ts +22 -0
- package/templates/starter/modules/feeds/routes.ts +13 -0
- package/templates/starter/modules/page-paths/index.ts +26 -0
- package/templates/starter/modules/page-paths/paths.ts +48 -0
- package/templates/starter/nuxt.config.ts +27 -0
- package/templates/starter/package.json +55 -0
- package/templates/starter/pnpm-workspace.yaml +6 -0
- package/templates/starter/server/plugins/font-preload.ts +17 -0
- package/templates/starter/site-url.ts +21 -0
- package/templates/starter/tsconfig.json +9 -0
- package/templates/starter.json +11 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Design system
|
|
2
|
+
|
|
3
|
+
The rules behind this site's look. Read them before you change colours, type or components, so the site stays
|
|
4
|
+
consistent and accessible (WCAG 2.2 AA, light and dark). The same system runs every Ginko template; only the accent
|
|
5
|
+
and the fonts differ.
|
|
6
|
+
|
|
7
|
+
## Principles
|
|
8
|
+
|
|
9
|
+
- A quiet, neutral base; your content and photos carry the character. One accent colour.
|
|
10
|
+
- Hierarchy from size and weight, not colour. One primary button per view. No gradients, glass, blur or decorative
|
|
11
|
+
shadows. Separate with a 1px border or a background, never both.
|
|
12
|
+
- Phone first. Every page works at 320 px wide with no horizontal scroll; touch targets are at least 44 px.
|
|
13
|
+
- Only tokens. Tailwind's default palette, type scale, radii and shadows are switched off, so `bg-red-500` or
|
|
14
|
+
`text-2xl` do nothing. A new value is a new token in the CSS and a row in this file, in the same change.
|
|
15
|
+
|
|
16
|
+
## Where things live
|
|
17
|
+
|
|
18
|
+
| What | File |
|
|
19
|
+
|---|---|
|
|
20
|
+
| Your accent and fonts | `app/assets/css/main.css` (`--brand`, `--brand-foreground`, `--font-body`, optional `--font-heading`); the light accent again as `seo.color` in `ginko.config.ts` (share cards) |
|
|
21
|
+
| Neutral colours, type scale, spacing, radii, shadow, focus, motion | `app/assets/css/tokens.css` (shared by all templates; do not edit) |
|
|
22
|
+
| Name, logo, navigation, footer links, profiles | `app/app.config.ts` |
|
|
23
|
+
| Components | `app/components/ui/` (shadcn-vue), `app/components/site/`, `app/components/block/` |
|
|
24
|
+
|
|
25
|
+
`tokens.css` and the components are copied from the Ginko repository (`templates/_features/`). You can change them in
|
|
26
|
+
your own site; in the Ginko repository, change the source there instead.
|
|
27
|
+
|
|
28
|
+
## Colours
|
|
29
|
+
|
|
30
|
+
shadcn names, so shadcn-vue components work unchanged. Light / dark:
|
|
31
|
+
|
|
32
|
+
| Token | Light | Dark | Use |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| `--background` | `#ffffff` | `#0b0b0c` | page |
|
|
35
|
+
| `--foreground` | `#18181b` | `#f4f4f5` | text (17.7:1 / 17.0:1) |
|
|
36
|
+
| `--muted` | `#f4f4f5` | `#18181b` | footer, notice bar, image placeholders |
|
|
37
|
+
| `--muted-foreground` | `#52525b` | `#a1a1aa` | secondary text (7.7:1 / 7.9:1) |
|
|
38
|
+
| `--accent` | `#f4f4f5` | `#27272a` | hover of quiet controls |
|
|
39
|
+
| `--border` | `#e4e4e7` | `#27272a` | dividers, never text |
|
|
40
|
+
| `--input` | `#8a8a93` | `#71717a` | borders of controls (3:1 non-text) |
|
|
41
|
+
| `--primary` | `--brand` | `--brand` | primary button, links in text, focus ring |
|
|
42
|
+
| `--primary-foreground` | `--brand-foreground` | `--brand-foreground` | text on the accent |
|
|
43
|
+
| `--ring` | = `--primary` | = `--primary` | focus |
|
|
44
|
+
| `--success` / `--warning` / `--destructive` | `#15803d` / `#a16207` / `#b42318` | `#4ade80` / `#facc15` / `#f87171` | status text, always with an icon or a word |
|
|
45
|
+
| `--scrim` | zinc-950 at 60 % | black at 72 % | behind the nav sheet and dialogs; the lightbox is opaque dark `--background`, so no page text shows behind a photo |
|
|
46
|
+
|
|
47
|
+
**Your accent.** `--brand` and `--brand-foreground` in `main.css`, once in `:root` (light) and once in `.dark`. The
|
|
48
|
+
values and their contrast are written next to them. Rules: text on the accent ≥ 4.5:1; the accent on the background
|
|
49
|
+
≥ 4.5:1 in both modes, because links in text use it; in dark mode use a light tint of the accent. Set the light value
|
|
50
|
+
as `seo.color` in `ginko.config.ts` too: it fills the share cards. The accents of the Ginko templates:
|
|
51
|
+
|
|
52
|
+
| Template | Light | Text on it | Dark | Text on it | Headings |
|
|
53
|
+
|---|---|---|---|---|---|
|
|
54
|
+
| starter | `#18181b` | `#ffffff` | `#f4f4f5` | `#18181b` | Inter |
|
|
55
|
+
| blog | `#4f46e5` | `#ffffff` | `#a5b4fc` | `#1e1b4b` | Inter |
|
|
56
|
+
| portfolio | `#1c1917` | `#ffffff` | `#f5f5f4` | `#1c1917` | Instrument Serif, `text-h3` 22–28 px |
|
|
57
|
+
| company | `#0369a1` | `#ffffff` | `#7dd3fc` | `#082f49` | Inter |
|
|
58
|
+
| saas | `#6d28d9` | `#ffffff` | `#c4b5fd` | `#2e1065` | Inter |
|
|
59
|
+
| restaurant | `#c2410c` | `#ffffff` | `#fdba74` | `#431407` | Fraunces |
|
|
60
|
+
| local-business | `#0f766e` | `#ffffff` | `#5eead4` | `#042f2e` | Inter |
|
|
61
|
+
| nonprofit | `#15803d` | `#ffffff` | `#86efac` | `#052e16` | Inter |
|
|
62
|
+
| events | `#be123c` | `#ffffff` | `#fda4af` | `#4c0519` | Inter |
|
|
63
|
+
|
|
64
|
+
`.surface-primary` turns a band into the accent colour and swaps text, buttons and the focus ring, so everything in
|
|
65
|
+
it keeps its contrast (used by `BlockCta`). A template may give the band its own colour with `--brand-surface` and
|
|
66
|
+
`--brand-surface-foreground` in `main.css` (text on it ≥ 4.5:1). Use it in `.dark` when the dark accent is a light
|
|
67
|
+
tint: a full-width band of it is the loudest surface on a near-black page. nonprofit: `#14532d` with `#f0fdf4`
|
|
68
|
+
(8.7:1) in dark mode; buttons and links keep `#86efac`.
|
|
69
|
+
|
|
70
|
+
Dark mode: `@nuxtjs/color-mode` puts `.dark` on `<html>` (first visit: the system setting); `dark:` utilities and
|
|
71
|
+
`color-scheme` follow it. Printing always uses the light neutrals (paper is white). The navigation, notices, controls and closing band are left
|
|
72
|
+
out (`print:hidden`); the footer prints only the name, address, email and phone, so any page prints as its content
|
|
73
|
+
with whose it is.
|
|
74
|
+
|
|
75
|
+
## Type
|
|
76
|
+
|
|
77
|
+
Inter (variable, latin and latin-ext) through `@nuxt/fonts`, served from the site itself. A display face for headings
|
|
78
|
+
is optional (`--font-heading`); a narrow one may set `--text-h3` larger in an `@theme` block of `main.css`, so titles
|
|
79
|
+
still lead the body text (the portfolio). Right-to-left languages add their own face on `:lang(…)`.
|
|
80
|
+
|
|
81
|
+
| Utility | Size | Line height |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `text-h1` | `clamp(2.25rem, 1.5rem + 3.2vw, 4rem)` | 1.05, tracking −0.025em; one per page |
|
|
84
|
+
| `text-h2` | `clamp(1.75rem, 1.35rem + 1.7vw, 2.75rem)` | 1.1, tracking −0.02em; sentences such as the `BlockCta` title |
|
|
85
|
+
| `text-h3` | `clamp(1.2rem, 1.1rem + 0.45vw, 1.45rem)` | 1.3; section labels and `##` in Markdown |
|
|
86
|
+
| `text-lead` | `clamp(1.125rem, 1.06rem + 0.3vw, 1.3125rem)` | 1.5 |
|
|
87
|
+
| `text-body` | `1.0625rem` | 1.6 |
|
|
88
|
+
| `text-small` | `0.9375rem` | 1.5 |
|
|
89
|
+
| `text-xs` | `0.8125rem` | 1.4; the smallest size |
|
|
90
|
+
|
|
91
|
+
Headings balance their lines and hyphenate (the page sets `lang`). Prices, times and dates use `tabular-nums`
|
|
92
|
+
(`<time>` gets it by default). Text runs at most `max-w-prose` (43.5rem, about 65 characters of body text; in rem so the line width does not
|
|
93
|
+
change when the web font replaces its fallback).
|
|
94
|
+
|
|
95
|
+
## Space, size, radius, shadow
|
|
96
|
+
|
|
97
|
+
| Token | Value | Use |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| `pt-section` (`--spacing-section`) | `clamp(3.5rem, 2.25rem + 5.5vw, 7rem)` | space above each section |
|
|
100
|
+
| `px-gutter` (`--spacing-gutter`) | `clamp(1rem, 0.5rem + 2.4vw, 2rem)` | page edges (16 px on phones) |
|
|
101
|
+
| `max-w-page` | `76rem` | page width |
|
|
102
|
+
| `max-w-prose` | `43.5rem` | text width (about 65 characters) |
|
|
103
|
+
| `rounded-md` (`--radius`) | `0.625rem` | buttons, controls |
|
|
104
|
+
| `rounded-block` | `1rem` | images, cards, the CTA band |
|
|
105
|
+
| `shadow-overlay` | one soft shadow | nav sheet, dialog, menus; nothing else |
|
|
106
|
+
|
|
107
|
+
Tailwind's spacing steps (`p-4`, `gap-6`) stay available.
|
|
108
|
+
|
|
109
|
+
## Focus and motion
|
|
110
|
+
|
|
111
|
+
Every interactive element shows a 2px ring in `--ring`, 3px away (`:focus-visible` in `tokens.css`); components do
|
|
112
|
+
not draw their own. Motion only for a change of state: 150 ms for colours, 200–300 ms for the sheet, accordion and
|
|
113
|
+
dialog, `ease-out`. With `prefers-reduced-motion`, transitions and animations are switched off.
|
|
114
|
+
|
|
115
|
+
## Components
|
|
116
|
+
|
|
117
|
+
`app/components/ui/`: shadcn-vue components, copied with the shadcn-vue CLI and trimmed to these:
|
|
118
|
+
|
|
119
|
+
| Component | Variants |
|
|
120
|
+
|---|---|
|
|
121
|
+
| `Button` | shadcn-vue's names: `default` (the main action), `outline`, `secondary`, `destructive`, `ghost`, `link`; sizes `default` (44 px), `sm` (36 px with a mouse, 44 px on touch), `lg` (48 px), `icon` (44 px), `icon-sm`, `icon-lg` |
|
|
122
|
+
| `Sheet` | `side="start"` (default) or `end`: logical sides, so it opens from the right in right-to-left languages |
|
|
123
|
+
| `Accordion` | as in shadcn-vue, on these tokens; only in templates with questions and answers (`BlockFaq`) |
|
|
124
|
+
|
|
125
|
+
Nothing else until a feature needs it. To add one: `npx shadcn-vue@latest add <name>`, then:
|
|
126
|
+
|
|
127
|
+
1. Change `import { cn } from 'cn'` to `import { cn } from '@/lib/utils'` and remove the `cn` package the CLI adds.
|
|
128
|
+
2. Replace Tailwind default classes (`text-sm`, `shadow-lg`, `rounded-lg`, `bg-black/80`) with the tokens above. In
|
|
129
|
+
the browser they give no error, they just do nothing.
|
|
130
|
+
3. Run `npm run lint` and `npm run typecheck`, and look at the component in light and dark. Lint fails on every class
|
|
131
|
+
the theme does not have (`eslint.tailwind.mjs`, which reads `main.css`). A class that is on purpose not Tailwind
|
|
132
|
+
(a hook for plain CSS) goes into the explicit list at the top of that file, with a comment saying why.
|
|
133
|
+
|
|
134
|
+
Icons come from `@lucide/vue` (what the CLI installs; `lucide-vue-next` is deprecated).
|
|
135
|
+
|
|
136
|
+
`cn` (`app/lib/utils.ts`) joins classes and resolves conflicts with tailwind-merge, as in shadcn: a
|
|
137
|
+
`class="text-small"` on a component that sets `text-h3` wins. tailwind-merge is configured for the theme of
|
|
138
|
+
tokens.css (`text-small`, `p-gutter`, `max-w-page`, `rounded-block`…); a new token in `@theme` gets its line there too.
|
|
139
|
+
|
|
140
|
+
`app/components/site/`: `SiteHeader` (name or logo, up to 6 links, language switch, theme toggle; the links move into
|
|
141
|
+
`SiteNavSheet` below `md`, or below `xl` when there are more than 4), `SiteFooter`, `SiteSkipLink`, `SiteLogo`,
|
|
142
|
+
`SiteNavLink`, `SiteThemeToggle`, `SiteLanguageSwitch` (the same page in each language), `SiteNotice` (up to two
|
|
143
|
+
notices above the header).
|
|
144
|
+
|
|
145
|
+
`app/components/block/` and two more:
|
|
146
|
+
|
|
147
|
+
| Component | Use |
|
|
148
|
+
|---|---|
|
|
149
|
+
| `BlockHero` | home only: the page's h1, a lead, one primary and one secondary action, an optional photo (16:9) |
|
|
150
|
+
| `BlockPageHeader` | every other page: h1, lead, optional meta line |
|
|
151
|
+
| `BlockSection` | a short label as heading (`text-h3`, the size of a Markdown `##`), optional lead, content; from `lg` heading 4 and content 8 of 12 columns, or full width |
|
|
152
|
+
| `BlockCards` | 2–4 per row; the whole card is one link; photos 3:2 |
|
|
153
|
+
| `BlockFeatures` | 2–6 items divided by lines, no cards |
|
|
154
|
+
| `BlockCta` | a closing band on the accent; one per page, not on legal, contact or error pages |
|
|
155
|
+
| `BlockEmpty` | an empty list: what to add, and where (`content/…`) |
|
|
156
|
+
| `ProseBody` | a Markdown body (headings start at `##`); with `@lupinum/ginko-components` installed, its components too |
|
|
157
|
+
| `InitialsAvatar` | a person without a photo: initials, never a stock face |
|
|
158
|
+
|
|
159
|
+
## Page patterns
|
|
160
|
+
|
|
161
|
+
- Home starts with `BlockHero`; other pages with `BlockPageHeader`.
|
|
162
|
+
- Section titles are short labels without a full stop; hero and CTA titles are sentences.
|
|
163
|
+
- Lists show the date or status a visitor needs, in tabular numbers.
|
|
164
|
+
- Every image has a real width, height and alt text, and a fixed ratio per block, so nothing jumps while loading.
|
|
165
|
+
- Right-to-left: only logical utilities (`ms-`, `pe-`, `start-`, `text-start`); arrows get `rtl:-scale-x-100`.
|
|
166
|
+
|
|
167
|
+
## Patterns of the features
|
|
168
|
+
|
|
169
|
+
In templates that have these features (`templates/_features/` in the Ginko repository):
|
|
170
|
+
|
|
171
|
+
- **Open now** (`hours`): `HoursToday` says open or closed in words, the dot only repeats it. It stands above the h1 on
|
|
172
|
+
the home page, under the call and email buttons on a page for getting in touch, and at the top of the footer's
|
|
173
|
+
contact column on every page (`app/components/site/FooterStatus.vue`). Opening times never break inside a span:
|
|
174
|
+
a narrow screen breaks between "11:30–14:00 and" and "17:30–22:00".
|
|
175
|
+
- **Where** (home): one quiet line under the hero's actions: a pin icon, the address, and an "Open in maps" link
|
|
176
|
+
(`text-small`, muted, the link at least 44 px tall). No embedded map.
|
|
177
|
+
- **Getting in touch** (a reservations page): right under `BlockPageHeader`, one primary button (call) and one
|
|
178
|
+
secondary (email), `size="lg"`, full width below `sm`; the open-now line under them; text and the opening hours
|
|
179
|
+
below.
|
|
180
|
+
- **A long list** (the menu): under the header, a row of links to its sections (`text-small`, accent, at least 44 px
|
|
181
|
+
tall), so a phone reaches the desserts in one tap; each section has an `id`.
|
|
182
|
+
- **Reading** (`blog`): a post's date and reading time in one muted line under the lead, the authors with their
|
|
183
|
+
initials under it; tags as quiet bordered links (at least 44 px tall) after the text; the older and the newer post
|
|
184
|
+
as two bordered links side by side (stacked on phones). In a Markdown text, a photo's caption is an emphasised line
|
|
185
|
+
right under the image (``, then `*The caption*` on the next line); long lines in code
|
|
186
|
+
blocks wrap.
|
|
187
|
+
- **Photos on phones** (`gallery`): one column at full width, each photo 3:2; justified rows from `sm`.
|
|
188
|
+
|
|
189
|
+
## Do and don't
|
|
190
|
+
|
|
191
|
+
| Do | Don't |
|
|
192
|
+
|---|---|
|
|
193
|
+
| `text-muted-foreground` for secondary text | pick a grey by hand |
|
|
194
|
+
| add a token to the CSS and this file | arbitrary values (`p-[13px]`, `bg-[#…]`) |
|
|
195
|
+
| one primary button per view, one CTA band per page | the accent behind body text |
|
|
196
|
+
| status with a word or an icon, plus colour | colour alone |
|
|
197
|
+
| initials for people without a photo | stock faces for named people |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Lupinum OG
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Media
|
|
2
|
+
|
|
3
|
+
Photos and other media in this template, with their source and license. The code is MIT (see LICENSE); media keep
|
|
4
|
+
their own license. People are shown with their initials, never with stock photos of faces.
|
|
5
|
+
|
|
6
|
+
## Photos
|
|
7
|
+
|
|
8
|
+
The [Unsplash License](https://unsplash.com/license) allows free use, also commercial, without asking; it does not
|
|
9
|
+
allow selling the photos as they are or building a similar photo service.
|
|
10
|
+
|
|
11
|
+
| File | Used in | What | Source | License |
|
|
12
|
+
|---|---|---|---|---|
|
|
13
|
+
| `public/media/hero.jpg` | home page (`content/home.md`) | a full conference hall seen from the back rows | [purzlbaum on Unsplash](https://unsplash.com/photos/men-and-women-sitting-on-chairs-inside-room-_wDZkpybAfY) | Unsplash License |
|
|
14
|
+
| `public/media/talk.jpg` | last year's photos (`content/gallery.md`) | a speaker in front of a bright screen, the audience in silhouette | [typegon on Unsplash](https://unsplash.com/photos/audience-watching-speaker-on-bright-screen--NXNaE9lu6w) | Unsplash License |
|
|
15
|
+
| `public/media/workshop-tables.jpg` | last year's photos | laptops, notebooks and cups on a long table, from above | [marvelous on Unsplash](https://unsplash.com/photos/people-sitting-down-near-table-with-assorted-laptop-computers-SYTO3xs06fU) | Unsplash License |
|
|
16
|
+
| `public/media/coffee-break.jpg` | last year's photos | glasses of coffee on a wooden table | [john_tuesday on Unsplash](https://unsplash.com/photos/people-sitting-near-brown-wooden-table-xAGBuYFSbC8) | Unsplash License |
|
|
17
|
+
| `public/media/venue.jpg` | page "Venue" (`content/pages/1.venue.md`) | a building with a facade of wooden slats against a blue sky | [mmpixz on Unsplash](https://unsplash.com/photos/brown-concrete-building-during-daytime-3cl6impBd_8) | Unsplash License |
|
|
18
|
+
|
|
19
|
+
## Made for this template
|
|
20
|
+
|
|
21
|
+
| File | What | License |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `public/logos/kaltenegger-it.svg`, `nordlicht-hosting.svg`, `hallgarten-stiftung.svg`, `kanalcafe.svg` | wordmarks of fictional sponsors and partners, no real organisations | MIT, like the code |
|
|
24
|
+
| `.github/screenshots/home-light.png`, `home-dark.png` | screenshots of this template | MIT, like the code |
|
|
25
|
+
|
|
26
|
+
The share cards (1200 × 630) are generated by the site (nuxt-og-image) with Inter
|
|
27
|
+
([SIL Open Font License](https://openfontlicense.org)).
|
|
28
|
+
|
|
29
|
+
When you add a photo, put it in `public/media/`, give it alt text in every language file that shows it, and add a
|
|
30
|
+
row here. The sample photos are stock photos of other events and another building. Replace them with photos of your
|
|
31
|
+
own conference and venue (people only with their permission). A speaker needs no photo: without one the site shows
|
|
32
|
+
their initials.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Notes before release
|
|
2
|
+
|
|
3
|
+
- Sample data that must change before going live: `content/site.md` (the association "Verein Open Data Days" at
|
|
4
|
+
Seidenhofgasse, phone numbers whose local part starts with 0), the venue "Kulturhaus am Kanal, Schiffmeistergasse 12"
|
|
5
|
+
(an invented address), the ticket shop address (`tickets.opendatadays.example`), the email addresses
|
|
6
|
+
(`opendatadays.example`), the speakers (fictional people), the sessions, the sponsor logos (fictional), and the legal texts
|
|
7
|
+
(marked placeholders for Austria).
|
|
8
|
+
- The photos are stock placeholders (Unsplash License, `MEDIA.md`), to be replaced by better-fitting ones before release.
|
|
9
|
+
- The past event `content/events/3.last-edition.md` stays in the content as a record; the site never shows it (an
|
|
10
|
+
event leaves the site after its last day). It shows how a finished event looks in the files and in the Studio.
|
|
11
|
+
- German says "Sie" on every page.
|
|
12
|
+
- The Studio jobs of this template (gate 7: change a session's time, room or status on a phone; post a notice) come
|
|
13
|
+
later in `templates/_studio/events/`.
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Events
|
|
2
|
+
|
|
3
|
+
A complete website for a conference, a festival or a community event over one or more days: the dates, the place
|
|
4
|
+
with a link to the map and the ticket link on the first screen, the programme by day with time, room, speakers and
|
|
5
|
+
"sold out" or "cancelled", a page per speaker, "now and next" on the home page during the event, questions and
|
|
6
|
+
answers, sponsor logos, photos of last year, and legal texts. In English and German, with light and dark mode. Built
|
|
7
|
+
with [Nuxt](https://nuxt.com) and [Ginko](https://github.com/lupinum-dev/ginko). All content is Markdown in
|
|
8
|
+
`content/`; the site needs no account and no database. The sample is "Open Data Days", a two-day community
|
|
9
|
+
conference about open data in Vienna.
|
|
10
|
+
|
|
11
|
+
| Light | Dark |
|
|
12
|
+
|---|---|
|
|
13
|
+
|  |  |
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm create ginko@latest my-site -- --template events
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This copies the template into `my-site`, keeps the languages you choose (`--locales en,de` for English and German,
|
|
22
|
+
`--locales de,en` for German first, `--locales en` for English only), moves the sample dates to this week (the
|
|
23
|
+
conference stays a few weeks ahead), sets the site id and writes a `.env` with a new `NUXT_APP_SECRET`. Then:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd my-site
|
|
27
|
+
npm install
|
|
28
|
+
npm run dev
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Or copy the folder as it is, with both languages, through Nuxt's own command:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm create nuxt@latest my-site -- -t github:lupinum-dev/ginko/templates/events#release
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Copy `.env.example` to `.env` and fill in `NUXT_APP_SECRET` (see below). The `#release` branch follows the latest
|
|
38
|
+
Ginko release, so both commands give you the same files. With this route the sample dates stay as they are: move
|
|
39
|
+
them yourself (see "Dates and times").
|
|
40
|
+
|
|
41
|
+
## Deploy
|
|
42
|
+
|
|
43
|
+
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Flupinum-dev%2Fginko%2Ftree%2Frelease%2Ftemplates%2Fevents&env=NUXT_APP_SECRET&envDescription=Signs%20the%20share%20card%20URLs.%20Any%2032%20or%20more%20random%20characters.)
|
|
44
|
+
|
|
45
|
+
Any host that runs Node works: `npm run build` writes a server to `.output/`, started with
|
|
46
|
+
`node .output/server/index.mjs`. Set these variables where the site runs:
|
|
47
|
+
|
|
48
|
+
| Variable | What |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `NUXT_APP_SECRET` | Signs the URLs of the share cards. 32 or more random characters (`openssl rand -hex 32`). |
|
|
51
|
+
| `NUXT_PUBLIC_SITE_URL` | The address of the live site, for example `https://www.open-data-days.org`. On Vercel the production address is used when this is not set. |
|
|
52
|
+
|
|
53
|
+
A build on Vercel stops with a message while the address is still `example.com`, so search engines never see wrong
|
|
54
|
+
links. Other builds (CI, your computer) only print a warning.
|
|
55
|
+
|
|
56
|
+
The site runs as a server, not as static files: a session leaves the programme the day after it took place, an event
|
|
57
|
+
the day after its last day, a notice the day after its `until`, and "now and next" follows the clock, all with no new
|
|
58
|
+
build. Static files (`npm run generate`) would keep the old state until the next build.
|
|
59
|
+
|
|
60
|
+
## Develop, build, preview
|
|
61
|
+
|
|
62
|
+
| Command | What |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `npm run dev` | the site with live reload on http://localhost:3000 |
|
|
65
|
+
| `npm run check` | Checks the content files in a few seconds: missing or wrong fields, dates, prices, links between pages and files in `public/`. Each problem names the file and the field. |
|
|
66
|
+
| `npm run build` | the production build in `.output/` |
|
|
67
|
+
| `npm run preview` | runs that build locally |
|
|
68
|
+
| `npm run lint` | ESLint |
|
|
69
|
+
| `npm run typecheck` | TypeScript and Vue types |
|
|
70
|
+
|
|
71
|
+
`.github/workflows/ci.yml` runs lint, typecheck and build on every push. It needs no settings.
|
|
72
|
+
|
|
73
|
+
## Edit content
|
|
74
|
+
|
|
75
|
+
Every text is a Markdown file. The main language has no suffix (`welcome.md`); a translation adds the language code
|
|
76
|
+
(`welcome.de.md`) and repeats only the texts: dates, times, rooms, speakers, prices and photos come from the main
|
|
77
|
+
file. The number at the start of a file name sets the order. Files point to other entries by id: the folder and the file
|
|
78
|
+
name without number and language, so `content/people/1.lena-hofer.md` is `people/lena-hofer`. The `slug` is only the
|
|
79
|
+
address on the site: renaming a file breaks the references to it, changing the `slug` does not. Write dates as
|
|
80
|
+
`2026-10-24`, times as `'09:30'`, prices as a plain number in euros (`95` or `12.50`). After each change, run
|
|
81
|
+
`npm run check`.
|
|
82
|
+
|
|
83
|
+
| On the site | File |
|
|
84
|
+
|---|---|
|
|
85
|
+
| Home page: title, lead, photo | `content/home.md` (and `home.de.md`) |
|
|
86
|
+
| The conference and other dates: title, days (`when`), `start` (first day), `end` (last day), `location`, `price`, `booking` (the ticket shop), `bookingUntil` (the last day of ticket sales), `soldOut`, `draft: true` (not on the site yet, with its sessions), the text | `content/events/<n>.<name>.md`; the home page shows the first coming event that has sessions, and an event leaves the site after its last day. `4.next-edition.md` is a sample draft for next year: edit it for your next edition instead of adding a new file |
|
|
87
|
+
| The programme: one file per session with `event` (`events/open-data-days`), `date`, `from`, `to`, `title`, `summary` (one or two sentences: what it is about, who it is for), `room`, `speakers` (`[people/lena-hofer]`), `status` (`open`, `soldOut` or `cancelled`) | `content/sessions/<name>.md`; the translation holds only the `title` and `summary`; "From the programme" on the home page shows the next sessions that have a summary |
|
|
88
|
+
| Speakers: `name`, `slug` (the address), `role`, `bio`, `photo` (optional; without one the site shows initials) | `content/people/<n>.<name>.md`; the number sets the order on the speakers page and the home page (the first four) |
|
|
89
|
+
| Questions and answers | `content/faq/<n>.<name>.md`: `question`, `answer`; the home page shows the first three |
|
|
90
|
+
| Sponsor and partner logos | `content/logos/<n>.<name>.md`: `name`, `image` (an SVG or PNG in `public/logos/`), `url` |
|
|
91
|
+
| Photos of last year | `content/gallery.md` and the alt texts in each translation. A translation lists the rows in the same order as the main file: when you add, remove or move a row in the main file, do the same at the same place in each translation (write `- {}` for a row with nothing to translate). `npm run check` reports a translation with a different number of rows. |
|
|
92
|
+
| Venue, code of conduct, sponsoring and other pages | `content/pages/<n>.<name>.md`; each translation sets its own address with `slug:` |
|
|
93
|
+
| Notices above the header ("Ticket sales end three days before the conference") | `content/notices/<n>.<name>.md`: `text` (at most 140 characters; in quotes when it contains a colon) and `until` (the last day it shows, like `2026-12-31`; without it the notice stays until you delete the file); a translation has only `text` |
|
|
94
|
+
| Name, address, register number, email, phone of the organiser (footer, imprint, search engines) | `content/site.md` |
|
|
95
|
+
| Privacy policy, terms, imprint | `content/legal/` (placeholders for Austria: replace them before you go live) |
|
|
96
|
+
| Site name, description for search engines, time zone, country | `ginko.config.ts` (`name`, `seo.description`, `timeZone`, `country`) |
|
|
97
|
+
| Menu, footer links, the line under the name in the footer | `app/app.config.ts` |
|
|
98
|
+
| Rename the event or move it | the name: `name` and `seo.description` in `ginko.config.ts`, `title` in `content/home*.md`, the titles in `content/events/`, the summary of `content/pages/2.code-of-conduct*.md`; the place: `seo.description`, `lead` in `content/home*.md`, `home.title` in `i18n/<language>.json`, the tagline in `app/app.config.ts`, `location` in every file of `content/events/`, `content/pages/1.venue*.md`, `timeZone` in `ginko.config.ts`. `content/site.md` is the organiser's own address and changes only if the organiser changes. |
|
|
99
|
+
| Texts of the home page sections and the FAQ page; the page titles and leads of the programme, speakers and dates | `i18n/<language>.json`; the features' own texts are in `i18n/<feature>/<language>.json`, and a key set in `i18n/<language>.json` wins (as `events.book` = "Get tickets" there does) |
|
|
100
|
+
|
|
101
|
+
**A session moves or changes.** Change `from`, `to`, `room` or `status` in its main file
|
|
102
|
+
(`content/sessions/<name>.md`). If the session is now the first or the last of the event, also change `start` or `end`
|
|
103
|
+
in the event's file (`content/events/<n>.<name>.md`): the home page shows those times. A room the venue page does not
|
|
104
|
+
list yet goes into `content/pages/1.venue.md` and its translation. The programme, the speaker pages, "now and next",
|
|
105
|
+
the event page and the data for search engines all read that one file, so they cannot disagree. Write a room's name
|
|
106
|
+
only in the main file, never in a translation: a room is a name on a sign (Festsaal, Studio), and a second copy in
|
|
107
|
+
another language would stay behind when the room changes. `status: soldOut` shows "Sold out", `status: cancelled` shows
|
|
108
|
+
"Cancelled"; a cancelled session stays in the programme, so people who planned to go see it, but never shows under
|
|
109
|
+
"now" or "next".
|
|
110
|
+
|
|
111
|
+
**Dates and times.** All times are in the site's time zone (`timeZone: 'Europe/Vienna'` in `ginko.config.ts`), as they
|
|
112
|
+
are on the printed programme; search engines get them with the right offset for summer or winter time. A session leaves
|
|
113
|
+
the programme the day after its `date`. On days that have sessions the home page puts "now and next" right below the
|
|
114
|
+
dates and the place (without the lead and the photo): the sessions running now and the ones that start next, as of the
|
|
115
|
+
minute the page was loaded, and it moves on every minute while the page is open. The programme page then says "Now"
|
|
116
|
+
next to the running sessions and greys out the finished ones. `start` in the event's file is the time of the first day
|
|
117
|
+
and `end` of the last one: a two-day event shows "Thu 09:00 – Fri 16:00". A session's `date` must lie within its
|
|
118
|
+
event's `when`: when you move the event, move its sessions too. `npm run check` does not catch a session outside its
|
|
119
|
+
event yet.
|
|
120
|
+
|
|
121
|
+
**Tickets.** The site sells nothing: `booking` in the event's file is the address of your ticket shop, and "Get
|
|
122
|
+
tickets" leads there: on the home page, in the closing band with the price, on the programme and on the event page.
|
|
123
|
+
`bookingUntil` is the last day of ticket sales; after it the links give way to "Ticket sales have ended", and the
|
|
124
|
+
programme becomes the main button. When the event is full, set `soldOut: true`: the button gives way to "Fully
|
|
125
|
+
booked". An event without `booking` shows the organiser's phone and email instead.
|
|
126
|
+
|
|
127
|
+
Notices show newest first. Give a new notice a smaller number than the others: `0.` works and numbers may have gaps, so
|
|
128
|
+
older notices keep theirs. At most two show at once.
|
|
129
|
+
|
|
130
|
+
## Make it yours
|
|
131
|
+
|
|
132
|
+
- **Name.** `name` in `ginko.config.ts` (header, footer, share cards, search engines). The sample name and place also
|
|
133
|
+
appear as text in other files: "Rename the event or move it" under [Edit content](#edit-content) lists them.
|
|
134
|
+
`legalName` in `content/site.md` is the organiser's legal name (sample: Verein Open Data Days). Search `content/` and
|
|
135
|
+
`i18n/` for the name and the place and replace what is left.
|
|
136
|
+
- **Menu.** `nav` in `app/app.config.ts` holds at most six items: a page of
|
|
137
|
+
`ginko.config.ts` (`{ page: 'programme', label: { … } }`, label per language, the same words as the page's title) or
|
|
138
|
+
a page of `content/pages/` by id (`{ entry: 'pages/venue' }` is `content/pages/1.venue.md`).
|
|
139
|
+
- **Logo.** Put the file in `public/` and set `logo: { src: '/logo.svg', width: 120, height: 32 }` in
|
|
140
|
+
`app/app.config.ts`. Without it, the header shows the name.
|
|
141
|
+
- **Colour.** `--brand` and `--brand-foreground` in `app/assets/css/main.css`, once for light and once for dark
|
|
142
|
+
(`.dark`); in `.dark` also `--brand-surface` and `--brand-surface-foreground` (the closing band); and the light value
|
|
143
|
+
as `seo.color` in `ginko.config.ts` (the background of the share cards). This template uses rose (`#be123c`, dark
|
|
144
|
+
`#fda4af`). Text on the colour needs a contrast of at least 4.5:1 in both modes; check each pair with a contrast
|
|
145
|
+
checker (for example webaim.org/resources/contrastchecker). `DESIGN.md` has the rules.
|
|
146
|
+
- **Fonts.** `--font-body` in `main.css`. `@nuxt/fonts` downloads the fonts at build time and serves them from your
|
|
147
|
+
site.
|
|
148
|
+
- **Organisation type.** `organization: 'Organization'` in `app/app.config.ts` tells search engines what you are;
|
|
149
|
+
address and contact come from `content/site.md`, the country from `country` in `ginko.config.ts`.
|
|
150
|
+
- **Addresses.** The words of the addresses per language (`programme` → `programm`, `speakers` → `vortragende`) are in
|
|
151
|
+
`app/routes.ts`. Change a word there; the pages, the menu and the links follow.
|
|
152
|
+
|
|
153
|
+
`DESIGN.md` explains the tokens and components. The parts in `app/components/ui/` are
|
|
154
|
+
[shadcn-vue](https://www.shadcn-vue.com) components.
|
|
155
|
+
|
|
156
|
+
## Add a page
|
|
157
|
+
|
|
158
|
+
**A text page:** add `content/pages/4.travel-grants.md` with a `title`, an optional `summary` and the text below the
|
|
159
|
+
frontmatter. It appears at `/travel-grants`; each translation sets its own address with `slug:` (`slug: reisekosten`
|
|
160
|
+
in `4.travel-grants.de.md` gives `/de/reisekosten`). Add `{ entry: 'pages/travel-grants' }` to `nav` or `footer` in
|
|
161
|
+
`app/app.config.ts` to link it.
|
|
162
|
+
|
|
163
|
+
**A page with its own layout:** add a Vue file in `app/pages/`, for example `app/pages/workshops.vue`. Start it with
|
|
164
|
+
`<BlockPageHeader>` and call `usePageSeo()`, like `app/pages/faq.vue`. Register it in `ginko.config.ts` under `pages`
|
|
165
|
+
(`workshops: localized('/workshops')`) and add the words of its address per language to `segments` in
|
|
166
|
+
`app/routes.ts` (`workshops: { en: 'workshops', de: 'workshops' }`). It then answers at `/workshops` and
|
|
167
|
+
`/de/workshops`, and `useGinkoPath()('workshops')` links to it.
|
|
168
|
+
|
|
169
|
+
## Add or remove a language
|
|
170
|
+
|
|
171
|
+
The languages are the `locales` list in `app/routes.ts`; the first is the main language, whose addresses have no
|
|
172
|
+
prefix.
|
|
173
|
+
|
|
174
|
+
- **Remove one:** start fresh with `npm create ginko@latest my-site -- --template events --locales en`, or delete it
|
|
175
|
+
from `locales` and from the maps in `app/routes.ts` and `languages` in `ginko.config.ts`, then delete its files
|
|
176
|
+
(`*.de.md`, `i18n/de.json`, `i18n/*/de.json`).
|
|
177
|
+
- **Add one** (for example Italian): add `'it'` to `locales` and a word per address in `app/routes.ts`, its tag to
|
|
178
|
+
`languages` in `ginko.config.ts` (`it: 'it-IT'`), and the Italian labels of `nav`, `footer` and `tagline` in
|
|
179
|
+
`app/app.config.ts` (without them they show in the main language). Add `i18n/it.json` and the texts of every
|
|
180
|
+
`i18n/<feature>/en.json` translated as `i18n/<feature>/it.json`.
|
|
181
|
+
- **Translate the content** as `content/**/*.it.md`. A session needs only its `title`; a speaker their `role` and
|
|
182
|
+
`bio`. A page, legal text or event shows in the new language only once it has its translation file: without one
|
|
183
|
+
it is not on the Italian site, the menu leaves it out, and links to it lead to its page in the main language.
|
|
184
|
+
Translate at least the legal texts (`content/legal/`) before the language goes live.
|
|
185
|
+
|
|
186
|
+
## Tickets, registration and contact forms
|
|
187
|
+
|
|
188
|
+
The site sends no data to other companies, so it has no forms and takes no payments. "Get tickets" leads to your
|
|
189
|
+
ticket shop (`booking` in the event's file); a registration or call for proposals works the same way: link to a form
|
|
190
|
+
service of your choice from a page. Name these services in your privacy policy. The venue page links to OpenStreetMap
|
|
191
|
+
instead of embedding a map, so no map loads from another company.
|
|
192
|
+
|
|
193
|
+
## Remove a feature
|
|
194
|
+
|
|
195
|
+
Links in the content name pages by their key (`[questions page]($page.faq)`). After you remove a page, search
|
|
196
|
+
`content/` for `$page.<key>` and remove or change those links: the build stops on a link that leads nowhere.
|
|
197
|
+
|
|
198
|
+
| Feature | Delete |
|
|
199
|
+
|---|---|
|
|
200
|
+
| Programme and speakers | `content/sessions/`, `content/people/`, the `sessions` and `people` bricks, their imports and `pages.programme` and `pages.speakers` in `ginko.config.ts`, their `nav` items in `app/app.config.ts`; in `app/pages/index.vue` "Now and next", "From the programme" and "Speakers" with `rows`, `state`, `at`, `highlights` and `people`, `onEventDay` (also in the "booking closed" line; the hero then always has its lead and photo) and the hero's "Programme" button (`programme`: the tickets are the main button, else the venue, and the venue is the second button only with tickets), and `event` becomes the first of `events`; the `sessions` block in `i18n/<language>.json` and the `home.programme`, `home.highlights` and `home.speakers` texts, `app/pages/programme.vue`, `app/pages/speakers/`, `app/components/session/`, `app/components/event/Programme.vue`, `app/composables/useSessions.ts`, `app/utils/sessions.ts`, `i18n/sessions/`, and `"sessions"` in `package.json` → `ginko.features`; the home page then shows the next event |
|
|
201
|
+
| Questions and answers | `content/faq/`, the `faq` brick, its import and `pages.faq` in `ginko.config.ts`, its `nav` item in `app/app.config.ts`, "Questions" on the home page, `app/pages/faq.vue`, `app/components/block/Faq.vue`, `app/components/ui/accordion/`, `"faq"` in `ginko.features`; the link to `$page.faq` in `content/pages/1.venue*.md` |
|
|
202
|
+
| Sponsor logos | `content/logos/`, `public/logos/` and its row in `MEDIA.md`, the `logos` brick and its import in `ginko.config.ts`, "Sponsors and partners" on the home page, `app/bricks/logos-quotes.ts`, `app/components/block/Logos.vue`, `Quote.vue`, `"logos-quotes"` in `ginko.features`; and the Sponsoring page (`content/pages/3.sponsoring*.md`, its `footer` item in `app/app.config.ts`) if you want none |
|
|
203
|
+
| Last year's photos | `content/gallery*.md`, `public/media/talk.jpg`, `workshop-tables.jpg`, `coffee-break.jpg` and their rows in `MEDIA.md`, the `gallery` brick and its import in `ginko.config.ts`, "Last year" on the home page, `app/components/block/Gallery.vue`, `app/components/site/Lightbox.vue`, `i18n/gallery/`, `"gallery"` in `ginko.features` |
|
|
204
|
+
| Notices | `content/notices/`, the `notices` brick and its import in `ginko.config.ts`, `<SiteNotice />` in `app/layouts/default.vue`, `app/components/site/Notice.vue` |
|
|
205
|
+
| A language | see "Add or remove a language" |
|
|
206
|
+
| Dark mode | `<SiteThemeToggle />` in `app/components/site/Header.vue`, `app/components/site/ThemeToggle.vue`, and `@nuxtjs/color-mode` with its `colorMode` options in `nuxt.config.ts` and `package.json` |
|
|
207
|
+
| Share cards | `nuxt-og-image` and `@takumi-rs/core` in `nuxt.config.ts` and `package.json`; then `NUXT_APP_SECRET` is not needed |
|
|
208
|
+
|
|
209
|
+
The dates (`content/events/`, the events list and the event pages) are the core of this template: keep them.
|
|
210
|
+
|
|
211
|
+
## Before you deploy
|
|
212
|
+
|
|
213
|
+
- [ ] `NUXT_PUBLIC_SITE_URL` (or `url` in `ginko.config.ts`) is your real address.
|
|
214
|
+
- [ ] `NUXT_APP_SECRET` is set where the site runs.
|
|
215
|
+
- [ ] `content/site.md` shows the organiser's real name, address, register number and contact details.
|
|
216
|
+
- [ ] The event in `content/events/` has your dates, place and the address of your ticket shop in `booking`.
|
|
217
|
+
- [ ] The sample draft `4.next-edition.md` and its session `next-edition-keynote.md` are yours or deleted.
|
|
218
|
+
- [ ] `npm run check` ends with OK.
|
|
219
|
+
- [ ] The sample sessions, speakers, questions, sponsor logos and photos are replaced or deleted; speakers' names,
|
|
220
|
+
roles and photos only with their permission.
|
|
221
|
+
- [ ] The placeholders in `content/legal/` are replaced by your own texts, and the ones you do not need are deleted.
|
|
222
|
+
- [ ] The sample phone numbers and emails are replaced: they reach nobody (the numbers start their local part
|
|
223
|
+
with 0, the emails end in .example), so a forgotten one fails quietly.
|
|
224
|
+
- [ ] Every photo you added has alt text in each language and a source in `MEDIA.md`.
|
|
225
|
+
|
|
226
|
+
## Move to the Studio
|
|
227
|
+
|
|
228
|
+
Ginko Studio is Lupinum's hosted editor: during the event, someone on the team moves a session, changes its room or
|
|
229
|
+
marks it sold out or cancelled from their phone in a few taps, and it is right on every page at once; notices end by
|
|
230
|
+
themselves, and the Today page shows the next event and how many speakers have no bio yet. It is
|
|
231
|
+
open by invitation, and Lupinum moves your content with you. The site stays the same code: each brick in
|
|
232
|
+
`ginko.config.ts` loses its `source: 'files'`, and its content then comes from the Studio. Until then, everything here
|
|
233
|
+
works without it. Ask at [lupinum.com](https://lupinum.com).
|
|
234
|
+
|
|
235
|
+
## Updating
|
|
236
|
+
|
|
237
|
+
Move all Ginko packages to the same version in one step:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
npm install @lupinum/ginko@latest @lupinum/ginko-content@latest @lupinum/ginko-i18n@latest
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
The release notes list "Template files changed": compare those files with yours if you want the changes.
|
|
244
|
+
|
|
245
|
+
## License
|
|
246
|
+
|
|
247
|
+
Code: MIT (see `LICENSE`). Media: see `MEDIA.md`.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SiteAppConfig } from './composables/useSiteAppConfig'
|
|
2
|
+
|
|
3
|
+
// The brand and navigation of the site. The name is `name` in ginko.config.ts; colours and fonts are in
|
|
4
|
+
// app/assets/css/main.css; address and contact are in content/site.md.
|
|
5
|
+
export default defineAppConfig({
|
|
6
|
+
site: {
|
|
7
|
+
// logo: { src: '/logo.svg', width: 120, height: 32 },
|
|
8
|
+
// One line under the name in the footer, per language.
|
|
9
|
+
tagline: {
|
|
10
|
+
en: 'A community conference about open data in Vienna.',
|
|
11
|
+
de: 'Eine Community-Konferenz über offene Daten in Wien.',
|
|
12
|
+
},
|
|
13
|
+
organization: 'Organization',
|
|
14
|
+
// At most 6. A page of ginko.config.ts (`page`, with its label per language; keep it the same as the page's
|
|
15
|
+
// title) or an entry of content/pages/ by id (`pages/<file name without number>`).
|
|
16
|
+
nav: [
|
|
17
|
+
{ page: 'programme', label: { en: 'Programme', de: 'Programm' } },
|
|
18
|
+
{ page: 'speakers', label: { en: 'Speakers', de: 'Vortragende' } },
|
|
19
|
+
{ entry: 'pages/venue' },
|
|
20
|
+
{ page: 'faq', label: { en: 'FAQ', de: 'Fragen' } },
|
|
21
|
+
],
|
|
22
|
+
footer: [
|
|
23
|
+
{ page: 'events', label: { en: 'Dates', de: 'Termine' } },
|
|
24
|
+
{ entry: 'pages/code-of-conduct' },
|
|
25
|
+
{ entry: 'pages/sponsoring' },
|
|
26
|
+
],
|
|
27
|
+
// For example { label: 'Mastodon', url: 'https://mastodon.social/@opendatadays' }.
|
|
28
|
+
socials: [],
|
|
29
|
+
} satisfies SiteAppConfig,
|
|
30
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
@import "./tokens.css";
|
|
4
|
+
|
|
5
|
+
/* This template's accent and fonts (DESIGN.md "Your accent"). Everything else comes from tokens.css.
|
|
6
|
+
events: rose. White on the accent 6.3:1 light; the accent on the page 6.3:1 light; #4c0519 on the dark accent
|
|
7
|
+
8.3:1; the dark accent on the page 10.4:1. The focus ring and links in text use the accent. */
|
|
8
|
+
:root {
|
|
9
|
+
--brand: #be123c;
|
|
10
|
+
--brand-foreground: #ffffff;
|
|
11
|
+
/* @nuxt/fonts serves Inter from the site and adds size-matched fallbacks. */
|
|
12
|
+
--font-body: "Inter", ui-sans-serif, system-ui, sans-serif;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.dark {
|
|
16
|
+
--brand: #fda4af;
|
|
17
|
+
--brand-foreground: #4c0519;
|
|
18
|
+
/* The closing band in dark mode: a deep rose instead of the light accent, so it does not outshine the page.
|
|
19
|
+
#fff1f2 on #881337 8.7:1. */
|
|
20
|
+
--brand-surface: #881337;
|
|
21
|
+
--brand-surface-foreground: #fff1f2;
|
|
22
|
+
}
|