create-ginko 0.4.0 → 0.6.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 +34 -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 +99 -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 +98 -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 +79 -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 +109 -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/works-hall.jpg` | page "About us", service "Repair and overhaul" | a long factory hall with a steel roof frame and skylights | [fonsheijnsbroek_amsterdam_photos on Unsplash](https://unsplash.com/photos/green-and-brown-industrial-machine-LyGporh-V5E) | Unsplash License |
|
|
14
|
+
| `public/media/process-pumps.jpg` | product "HK centrifugal pumps" and its sheet | stainless steel pumps with blue motors along a process line | [spacexuan on Unsplash](https://unsplash.com/photos/grey-industrial-equipment-mhUsz2ezlXQ) | Unsplash License |
|
|
15
|
+
| `public/media/pipework.jpg` | product "Pumping stations" and its sheet | grey pipes with flanges and bends along a wall | [samthewam24 on Unsplash](https://unsplash.com/photos/grayscale-photography-of-metal-pipes-scUBcasSvbE) | Unsplash License |
|
|
16
|
+
| `public/media/pump-check.jpg` | service "Pump check on site" | two hands set a measuring gauge on a metal part | [shaikhulud on Unsplash](https://unsplash.com/photos/hands-manipulate-a-metal-device-on-a-table-GU4xHrV0P_o) | Unsplash License |
|
|
17
|
+
| `public/media/treatment-works.jpg` | post "Six new pumps for the Rodenau treatment works", product "TS submersible pumps" and its sheet | aerial view of a treatment works with round clarifier tanks | [federi on Unsplash](https://unsplash.com/photos/aerial-view-of-green-and-brown-basketball-court-_mZrKqrZaTc) | Unsplash License |
|
|
18
|
+
|
|
19
|
+
## Made for this template
|
|
20
|
+
|
|
21
|
+
| File | What | License |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `public/logos/customer-one.svg`, `customer-two.svg`, `customer-three.svg`, `customer-four.svg` | wordmarks of fictional customers in fictional towns (Eschenfeld, Emsquell, Hollenbach, Rodenau), no real organisations | MIT, like the code |
|
|
24
|
+
| `public/sheets/hk-centrifugal-pumps.pdf`, `ts-submersible-pumps.pdf`, `pumping-stations.pdf` | one-page sample product sheets (A4) with the product name, a sample photo from above, key facts, the sample address | MIT, like the code |
|
|
25
|
+
| `.github/screenshots/home-light.png`, `home-dark.png` | screenshots of this template | MIT, like the code |
|
|
26
|
+
|
|
27
|
+
The share cards (1200 × 630) are generated by the site (nuxt-og-image). Inter is under the
|
|
28
|
+
[SIL Open Font License](https://openfontlicense.org).
|
|
29
|
+
|
|
30
|
+
When you add a photo, put it in `public/media/`, give it alt text in every language file that shows it, and add a
|
|
31
|
+
row here. The sample photos show other places and machines. Replace them with photos of your own works, products and
|
|
32
|
+
team (with their permission): buyers trust a maker they can see.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Notes before release
|
|
2
|
+
|
|
3
|
+
- Sample data that must change before going live: `content/site.md` (address in "Bielefeld", VAT and the
|
|
4
|
+
phone numbers, which start their local part with 0 so nobody can be reached), the email addresses (`.example`), the people in `content/people/`, the quotes (invented people), the customer logos (fictional organisations), the product sheet PDFs (sample address), the
|
|
5
|
+
trade fairs (fictional fairs in fictional towns), the prices (`€390` for the pump check) and the legal texts
|
|
6
|
+
(marked placeholders).
|
|
7
|
+
- `content/jobs/summer-internship-assembly.md` is an ad whose last day has passed. It is never shown; it proves that
|
|
8
|
+
an expired job leaves the list, its page, the sitemap and the JSON-LD (gate 3, `_features/jobs/e2e/jobs.spec.ts`).
|
|
9
|
+
The README tells owners to delete it.
|
|
10
|
+
- JobPosting `datePosted` is the day the job's file last changed (`updatedAt`, in the site's time zone), else today:
|
|
11
|
+
basics `jobs()` has no posting date, so fixing a typo moves it. If Ginko adds one, use it in `useJobJsonLd`
|
|
12
|
+
(`_features/jobs`).
|
|
13
|
+
- Script weight (gate 6, gzip): home 147.7 kB, contact 147.3, product list and pages 152.1, jobs and trade fairs
|
|
14
|
+
150.3, news 151.2. `scriptBudget` is 155 kB (the cap for feature templates is 170); the product pages are the
|
|
15
|
+
heaviest because they load the services and downloads code on top of the shared shell.
|
|
16
|
+
- German says "Sie" on every page. Job titles carry "(m/f/d)" / "(m/w/d)", as German job ads do.
|
|
17
|
+
- The trade fair pages reuse the events feature; this template renames "Events" to "Trade fairs", its address
|
|
18
|
+
(`/trade-fairs`, `/de/messen` in `app/routes.ts`) and its texts (stand meeting instead of booking a place) in
|
|
19
|
+
`i18n/en.json` and `i18n/de.json`.
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Company
|
|
2
|
+
|
|
3
|
+
A complete website for a manufacturer or a technical business: what you make in one sentence on the home page,
|
|
4
|
+
products and services with key facts, a price or "on request" and a product sheet, open jobs that leave the site after
|
|
5
|
+
their last day, news with an RSS feed, sales and service contacts, customer logos and a quote, the trade fairs where
|
|
6
|
+
you show, documents to download, and legal texts. In English and German, with light and dark mode. Built with
|
|
7
|
+
[Nuxt](https://nuxt.com) and [Ginko](https://github.com/lupinum-dev/ginko). All content is Markdown in `content/`; the
|
|
8
|
+
site needs no account and no database. The sample is "Halden Pumps", a fictional German maker of industrial pumps and
|
|
9
|
+
pumping stations.
|
|
10
|
+
|
|
11
|
+
| Light | Dark |
|
|
12
|
+
|---|---|
|
|
13
|
+
|  |  |
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm create ginko@latest my-site -- --template company
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This copies the template into `my-site`, keeps the languages you choose (`--locales en` for English only,
|
|
22
|
+
`--locales de,en` for German first), moves the sample dates (jobs, trade fairs, notices) to this week, sets the site
|
|
23
|
+
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/company#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: a sample
|
|
39
|
+
job or trade fair whose day has passed is simply not shown.
|
|
40
|
+
|
|
41
|
+
## Deploy
|
|
42
|
+
|
|
43
|
+
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Flupinum-dev%2Fginko%2Ftree%2Frelease%2Ftemplates%2Fcompany&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.halden-pumps.com`. 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 job leaves the list, its page, the sitemap and search engines the
|
|
57
|
+
day after its `validUntil`, a trade fair the day after it ends and a notice the day after its last day, with no new
|
|
58
|
+
build. Static files (`npm run generate`) would keep them until the next build, so an expired job ad would stay online.
|
|
59
|
+
|
|
60
|
+
## Develop, build, preview
|
|
61
|
+
|
|
62
|
+
| Command | What |
|
|
63
|
+
|---|---|
|
|
64
|
+
| `npm run dev` | the site with live reload on http://localhost:3000; drafts show here |
|
|
65
|
+
| `npm run build` | the production build in `.output/`; drafts are left out |
|
|
66
|
+
| `npm run preview` | runs that build locally |
|
|
67
|
+
| `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. |
|
|
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. After each change, run `npm run check`. The main language has no suffix (`about.md`); a
|
|
76
|
+
translation adds the language code (`about.de.md`) and repeats only what it translates: dates, prices, files and images
|
|
77
|
+
come from the main file. A page (a product, job, post, trade fair, legal text or free page) shows in a language only
|
|
78
|
+
when its translation has every required text (for a job: `title`, `slug`, `description`, `location` and the text). The
|
|
79
|
+
number at the start of a file name sets the order.
|
|
80
|
+
|
|
81
|
+
Files point to other entries by id: the folder and the file name without number and language, so
|
|
82
|
+
`content/people/1.katrin-albers.md` is `people/katrin-albers`. The `slug` is only the address on the site: renaming a
|
|
83
|
+
file breaks the references to it, changing the `slug` does not. A translation lists the `specs` rows of a product in
|
|
84
|
+
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
|
|
85
|
+
each translation (write `- {}` for a row with nothing to translate). `npm run check` reports a translation with a
|
|
86
|
+
different number of rows. Write dates as `2026-10-24`, times as `'09:30'`, prices as a plain number in euros (`95` or
|
|
87
|
+
`12.50`).
|
|
88
|
+
|
|
89
|
+
| On the site | File |
|
|
90
|
+
|---|---|
|
|
91
|
+
| Home page: what you make, lead, photo (optional) | `content/home.md` (and `home.de.md`) |
|
|
92
|
+
| Service line: who answers it (an entry of `content/people/`, with phone and email) and when | `content/serviceLine.md` (`contact`, `hours`; `serviceLine.de.md` translates `hours`) |
|
|
93
|
+
| Products and services | `content/services/<n>.<name>.md`: `title`, `summary`, `pricing` (`price` or `onRequest`, always one of the two), `price` (in euros, `390` or `12.50`, required with `pricing: price`), `duration` (minutes), `specs` (rows of `label` and `value`), `image` (3:2; give every entry one, or none), `contact` (who gets the enquiries, an entry of `content/people/`: `people/<name>`; else the email and phone of `content/site.md`), `sheet` (the product sheet, an entry of `content/downloads/`: `downloads/<name>`), the text |
|
|
94
|
+
| Jobs | `content/jobs/<name>.md`: `title`, `description` (the short text in the list), `location`, `employmentType` (`fullTime`, `partTime`, `freelance`, `internship`, `apprenticeship`), `remote` (`onsite`, `hybrid`, `remote`), `applyEmail` (else the email of `content/site.md`) or `applyUrl` (an application page elsewhere), `validUntil` (required: the last day to apply), the text |
|
|
95
|
+
| News | `content/posts/<name>.md`: `title`, `description` (the summary), `date`, `authors` (people by id, `[people/katrin-albers]`), `tags`, `image` (the cover, 3:2); `draft: true` keeps a post off the site |
|
|
96
|
+
| Contacts (sales, service, human resources) | `content/people/<n>.<name>.md`: `name`, `role`, `bio`, `email`, `phone`; no photo needed, the site shows initials |
|
|
97
|
+
| Trade fairs | `content/events/<n>.<name>.md`: `title`, `when` (`from`, `to`), `start`, `end`, `location` (venue, hall and stand), `booking` (optional: a ticket link), the text |
|
|
98
|
+
| Product sheets and other documents | `content/downloads/<name>.md`: `title`, `summary`, `date`, `file` (a PDF in `public/sheets/`; when you replace a sheet, delete the old PDF, or it stays online at its old address), `language` (`en`, when the file is not in the page's language) |
|
|
99
|
+
| Customer logos | `content/logos/<n>.<name>.md`: `name`, `image` (an SVG or PNG in `public/logos/`), `url` |
|
|
100
|
+
| Quotes on the home page | `content/quotes/<n>.<name>.md`: `text`, `name`, `role`; the home page shows the first |
|
|
101
|
+
| About us and other pages | `content/pages/<n>.<name>.md`; each translation sets its own address with `slug:` |
|
|
102
|
+
| Notices above the header | `content/notices/<n>.<name>.md`: `text` (at most 140 characters; in quotes when it contains a colon), `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` |
|
|
103
|
+
| Name, address, register entry, VAT number, email, phone | `content/site.md` (footer, imprint, enquiry and application emails, search engines) |
|
|
104
|
+
| Privacy policy, terms of sale, imprint | `content/legal/` (placeholders for Germany: replace them before you go live) |
|
|
105
|
+
| Site name, description for search engines, currency | `ginko.config.ts` (`name`, `seo.description`, `currency`) |
|
|
106
|
+
| Menu, footer links, the line under the name in the footer | `app/app.config.ts` |
|
|
107
|
+
| The home page's title in search results and tabs, section titles, the texts of the lists | `i18n/<language>.json` (`home.title` is "Industrial pumps and pumping stations"); the features' own texts are in `i18n/<feature>/<language>.json`, and a key set in `i18n/<language>.json` wins (this template renames "Team" to "Contact" and "Events" to "Trade fairs" that way) |
|
|
108
|
+
|
|
109
|
+
**Prices.** Every product or service says how it is priced: `pricing: price` with a `price`, or `pricing: onRequest`.
|
|
110
|
+
The page shows the price in the visitor's language with tabular numbers ("€390", "390 €"), and search engines get the
|
|
111
|
+
same price; an entry on request shows "On request" and gives search engines no price. A fixed price without an amount
|
|
112
|
+
is a mistake: the build stops on it and names the entry, and the Studio does not save it. An entry with a fixed price
|
|
113
|
+
offers "Ask for a date"; one on request "Request a quote". The labels say "plus VAT" (`vat: 'excluded'` in
|
|
114
|
+
`app/app.config.ts`, which also tells search engines); set `vat: 'included'` if your prices include it, and change
|
|
115
|
+
`services.lead` in `i18n/<language>.json`.
|
|
116
|
+
|
|
117
|
+
**Jobs.** Each job needs `validUntil`. The day after it, the job leaves the list, its page answers "not found", and it
|
|
118
|
+
is gone from the sitemap and the JobPosting data for search engines. `content/jobs/summer-internship-assembly.md`
|
|
119
|
+
shows this: its last day has passed, so it is nowhere on the site. Delete it for your site. With no open job, the jobs
|
|
120
|
+
page invites an open application by email. Applications are emails with the job title in the subject; the site has no
|
|
121
|
+
form.
|
|
122
|
+
|
|
123
|
+
**Contacts.** The contact page shows the service line (`content/serviceLine.md`) and the office (address, main number
|
|
124
|
+
and email from `content/site.md`) first, then `content/people/` in their order. The home page shows the service line
|
|
125
|
+
under its actions, for a visitor whose pump has stopped; the office's number is in the footer of every page and in
|
|
126
|
+
the home page's closing band.
|
|
127
|
+
|
|
128
|
+
Each language has a news feed at `<news page>/rss.xml` (`/news/rss.xml`, `/de/aktuelles/rss.xml`).
|
|
129
|
+
|
|
130
|
+
Notices show newest first: give a new notice a smaller number than the others (`0.` works and numbers may have gaps, so
|
|
131
|
+
older notices keep theirs). At most two show at once.
|
|
132
|
+
|
|
133
|
+
## Make it yours
|
|
134
|
+
|
|
135
|
+
- **Name.** `name` in `ginko.config.ts` (header, footer, page titles, the jobs card of the home page, share cards, search
|
|
136
|
+
engines). The sample name also appears as text in `seo.description` there, `legalName` in `content/site.md`, the
|
|
137
|
+
`lead` in `content/home*.md` and the `summary` in `content/pages/1.about*.md`. Search `content/` and `i18n/` for it
|
|
138
|
+
and replace what is left. On phones the header shows `shortName` in `app/app.config.ts` instead, when you set one.
|
|
139
|
+
- **Menu.** `nav` in `app/app.config.ts` holds at most six items: a page of `ginko.config.ts` (`{ page: 'news', label: {
|
|
140
|
+
… } }`, label per language, the same words as the page's title) or a page of `content/pages/` by id (`{ entry:
|
|
141
|
+
'pages/about' }` is `content/pages/1.about.md`).
|
|
142
|
+
- **Logo.** Put the file in `public/` and set `logo: { src: '/logo.svg', width: 140, height: 32 }` in
|
|
143
|
+
`app/app.config.ts`. Without it, the header shows the name. Search engines get it as the employer's logo of your
|
|
144
|
+
jobs too.
|
|
145
|
+
- **Country, time zone and languages.** `country` in `ginko.config.ts` (ISO code: the public holidays, and the
|
|
146
|
+
country search engines get for your address and every job), `timeZone` (dates and times of fairs and posts) and
|
|
147
|
+
`languages` (the language and region of each locale, for example `de: 'de-AT'` for Austria); `currency` for prices.
|
|
148
|
+
In `content/site.md`, write your own register entry and VAT number in the form of your country, or leave them out.
|
|
149
|
+
- **Colour.** `--brand` and `--brand-foreground` in `app/assets/css/main.css`, once for light and once for dark
|
|
150
|
+
(`.dark`), and the light value as `seo.color` in `ginko.config.ts` (the background of the share cards). In dark mode,
|
|
151
|
+
`--brand-surface` and `--brand-surface-foreground` colour the home page's closing band. This template uses sky blue
|
|
152
|
+
(`#0369a1`, dark `#7dd3fc`, and a deep blue `#0c4a6e` for the closing band in dark mode). Text on the colour needs a
|
|
153
|
+
contrast of at least 4.5:1 in both modes; check each pair with a contrast checker (for example
|
|
154
|
+
webaim.org/resources/contrastchecker). `DESIGN.md` has the rules.
|
|
155
|
+
- **Fonts.** `--font-body` in `main.css`. `@nuxt/fonts` downloads the fonts at build time and serves them from your
|
|
156
|
+
site.
|
|
157
|
+
- **Organisation type.** `organization: 'Organization'` in `app/app.config.ts` tells search engines what you are;
|
|
158
|
+
address and contact come from `content/site.md`, the country from `country` in `ginko.config.ts`.
|
|
159
|
+
- **Addresses.** The words of the addresses per language (`services` → `products`, `produkte`; `jobs` → `karriere`)
|
|
160
|
+
are in `app/routes.ts`. Change a word there; the pages, the menu and the links follow.
|
|
161
|
+
|
|
162
|
+
`DESIGN.md` explains the tokens and components. The parts in `app/components/ui/` are
|
|
163
|
+
[shadcn-vue](https://www.shadcn-vue.com) components.
|
|
164
|
+
|
|
165
|
+
## Add a page
|
|
166
|
+
|
|
167
|
+
**A text page:** add `content/pages/2.quality.md` with a `title`, an optional `summary` and the text below the
|
|
168
|
+
frontmatter. It appears at `/quality`; each translation sets its own address with `slug:` (`slug: qualitaet` in
|
|
169
|
+
`2.quality.de.md` gives `/de/qualitaet`). Add `{ entry: 'pages/quality' }` to `nav` or `footer` in `app/app.config.ts`
|
|
170
|
+
to link it.
|
|
171
|
+
|
|
172
|
+
**A page with its own layout:** add a Vue file in `app/pages/`, for example `app/pages/references.vue`. Start it with
|
|
173
|
+
`<BlockPageHeader>` and call `usePageSeo()`, like `app/pages/downloads.vue`. Register it in `ginko.config.ts` under
|
|
174
|
+
`pages` (`references: localized('/references')`) and add the words of its address per language to `segments` in
|
|
175
|
+
`app/routes.ts` (`references: { en: 'references', de: 'referenzen' }`). It then answers at `/references` and
|
|
176
|
+
`/de/referenzen`, and `useGinkoPath()('references')` links to it.
|
|
177
|
+
|
|
178
|
+
## Add or remove a language
|
|
179
|
+
|
|
180
|
+
The languages are the `locales` list in `app/routes.ts`; the first is the main language, whose addresses have no
|
|
181
|
+
prefix.
|
|
182
|
+
|
|
183
|
+
- **Remove one:** start fresh with `npm create ginko@latest my-site -- --template company --locales en`, or delete it
|
|
184
|
+
from `locales` and from the maps in `app/routes.ts` and `languages` in `ginko.config.ts`, then delete its files
|
|
185
|
+
(`*.de.md`, `i18n/de.json`, `i18n/*/de.json`).
|
|
186
|
+
- **Add one** (for example French): add `'fr'` to `locales` and a word per address in `app/routes.ts`, its tag to
|
|
187
|
+
`languages` in `ginko.config.ts` (`fr: 'fr-FR'`), and the French labels of `nav`, `footer` and `tagline` in
|
|
188
|
+
`app/app.config.ts` (without them they show in the main language). Add `i18n/fr.json` and the texts of every
|
|
189
|
+
`i18n/<feature>/en.json` translated as `i18n/<feature>/fr.json`.
|
|
190
|
+
- **Translate the content** as `content/**/*.fr.md`. A page shows in the new language only once it has its
|
|
191
|
+
translation file: without one it is not on the French site, the menu leaves it out, and links to it lead to its page
|
|
192
|
+
in the main language. Translate at least the legal texts (`content/legal/`) before the language goes live.
|
|
193
|
+
|
|
194
|
+
## Add an enquiry or application form
|
|
195
|
+
|
|
196
|
+
The site sends no data to other companies, so it has no forms: "Request a quote" and "Apply by email" open an email
|
|
197
|
+
with the product or job in the subject. To use an application portal instead, give a job an `applyUrl`; for an
|
|
198
|
+
enquiry form, link to a form service of your choice. Name the service in your privacy policy.
|
|
199
|
+
|
|
200
|
+
## Remove a feature
|
|
201
|
+
|
|
202
|
+
Links in the content name pages by their key (`[contact]($page.team)`). After you remove a page, search `content/` for
|
|
203
|
+
`$page.<key>` and remove or change those links: the build stops on a link that leads nowhere.
|
|
204
|
+
|
|
205
|
+
| Feature | Delete |
|
|
206
|
+
|---|---|
|
|
207
|
+
| Products and services | `content/services/`, the `services` brick and `pages.services` in `ginko.config.ts`, its `nav` item, the "Products and services" section and the hero's second button in `app/pages/index.vue`, `app/pages/services/`, `app/bricks/services.ts`, `app/composables/useServices.ts`, `i18n/services/`, the `services` keys in `i18n/<language>.json`, and `"services"` in `package.json` → `ginko.features` |
|
|
208
|
+
| Jobs | `content/jobs/`, the `jobs` brick and `pages.jobs`, its `nav` item, the jobs card in `app/pages/index.vue` (`next`), `app/pages/jobs/`, `app/components/jobs/`, `app/composables/useJobs.ts`, `i18n/jobs/`, `"jobs"` in `ginko.features`, the `jobs` and `home.jobs` keys in `i18n/<language>.json`, and rename `home.next` ("Jobs and trade fairs") to "Trade fairs" (the section leaves the home page by itself when no fair is coming up); the links to `$page.jobs` in `content/posts/apprentices-start*.md` and `content/pages/1.about*.md` |
|
|
209
|
+
| News | `content/posts/`, the `posts` brick and `pages.news`, its `nav` item, the "News" section on the home page, `app/pages/news/`, `app/components/blog/`, `app/composables/useBlog.ts`, `server/middleware/news-feed.ts`, `i18n/blog/`, `"blog"` in `ginko.features` |
|
|
210
|
+
| Contact page | `pages.team`, its `nav` item, the hero's "Contact sales" button and the closing `<BlockCta>` band (its `action` is required, so delete the whole band, then the unused `site` and `contact` lines of its script) in `app/pages/index.vue`, `app/pages/team.vue`, `app/components/people/`, `i18n/people/`, `"people"` in `ginko.features`; the `$page.team` links in `content/posts/saturday-service*.md` and `content/pages/1.about*.md` (drop the link or the sentence around it); keep the `people` brick while posts, products or the service line name people |
|
|
211
|
+
| Trade fairs | `content/events/`, the `events` brick and `pages.events`, its `nav` item, the fair card in `app/pages/index.vue` (`next`, `useEventText`), `app/pages/events/`, `app/components/event/`, `app/composables/useEvents.ts`, `i18n/events/`, `"events"` in `ginko.features`, the notice about the fair in `content/notices/` |
|
|
212
|
+
| Downloads | `content/downloads/`, `public/sheets/`, the `downloads` brick and `pages.downloads`, its `footer` item, `downloads: 'downloads'` of the `services` brick and the `sheet` lines in `content/services/`, `app/pages/downloads.vue`, `app/components/downloads/`, `i18n/downloads/`, `"downloads"` in `ginko.features`; the links to `$page.downloads` in `content/posts/ts-pumps-atex*.md` |
|
|
213
|
+
| Logos and quotes | `content/logos/`, `content/quotes/`, `public/logos/`, the `logos` and `quotes` bricks, the "References" section on the home page, `app/bricks/logos-quotes.ts`, `app/components/block/Logos.vue`, `Quote.vue`, `"logos-quotes"` in `ginko.features` |
|
|
214
|
+
| Notices | `content/notices/`, the `notices` brick, `<SiteNotice />` in `app/layouts/default.vue`, `app/components/site/Notice.vue` |
|
|
215
|
+
| A language | see "Add or remove a language" |
|
|
216
|
+
| 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` |
|
|
217
|
+
| Share cards | `nuxt-og-image` and `@takumi-rs/core` in `nuxt.config.ts` and `package.json`; then `NUXT_APP_SECRET` is not needed |
|
|
218
|
+
|
|
219
|
+
## Before you deploy
|
|
220
|
+
|
|
221
|
+
- [ ] `NUXT_PUBLIC_SITE_URL` (or `url` in `ginko.config.ts`) is your real address.
|
|
222
|
+
- [ ] `NUXT_APP_SECRET` is set where the site runs.
|
|
223
|
+
- [ ] `content/site.md` shows your real legal name, address, register entry, VAT number and contact details.
|
|
224
|
+
- [ ] Every product and service has your price or `pricing: onRequest`, and the "plus VAT" labels fit your prices.
|
|
225
|
+
- [ ] Every job has the right `validUntil` and application address; the sample jobs and the ended sample
|
|
226
|
+
(`content/jobs/summer-internship-assembly.md`) are deleted or replaced.
|
|
227
|
+
- [ ] The sample phone numbers and emails are replaced: they reach nobody (the numbers start their local part
|
|
228
|
+
with 0, the emails end in .example), so a forgotten one fails quietly.
|
|
229
|
+
- [ ] The placeholders in `content/legal/` are replaced by your own texts, and the ones you do not need are deleted.
|
|
230
|
+
- [ ] The sample quotes, customer logos, product sheets (`public/sheets/`) and photos are replaced or deleted; quotes
|
|
231
|
+
and logos only with the customer's permission.
|
|
232
|
+
- [ ] Every photo you added has alt text in each language file that shows it and a source in `MEDIA.md`.
|
|
233
|
+
|
|
234
|
+
## Move to the Studio
|
|
235
|
+
|
|
236
|
+
Ginko Studio is Lupinum's hosted editor: your team posts a job ad or a news post from the browser, changes a price or
|
|
237
|
+
uploads a new product sheet, and the Today page lists the jobs that end within 7 days (also by email on Sundays) and
|
|
238
|
+
how old the newest post is. It is open by invitation, and Lupinum moves your content with you. The site stays the same
|
|
239
|
+
code: each brick in `ginko.config.ts` loses its `source: 'files'`, and its content then comes from the Studio. Until
|
|
240
|
+
then, everything here works without it. Ask at [lupinum.com](https://lupinum.com).
|
|
241
|
+
|
|
242
|
+
## Updating
|
|
243
|
+
|
|
244
|
+
Move all Ginko packages to the same version in one step:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
npm install @lupinum/ginko@latest @lupinum/ginko-content@latest @lupinum/ginko-i18n@latest
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
The release notes list "Template files changed": compare those files with yours if you want the changes.
|
|
251
|
+
|
|
252
|
+
## License
|
|
253
|
+
|
|
254
|
+
Code: MIT (see `LICENSE`). Media: see `MEDIA.md`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SiteAppConfig } from './composables/useSiteAppConfig'
|
|
2
|
+
|
|
3
|
+
// The brand and navigation of the site. The name (header, footer, page titles) 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
|
+
// shortName: 'Halden', // the name on phones, when the full name is long
|
|
8
|
+
// logo: { src: '/logo.svg', width: 140, height: 32 },
|
|
9
|
+
// One line under the name in the footer, per language.
|
|
10
|
+
tagline: {
|
|
11
|
+
en: 'Pumps and pumping stations for water, wastewater and industry.',
|
|
12
|
+
de: 'Pumpen und Pumpstationen für Wasser, Abwasser und Industrie.',
|
|
13
|
+
},
|
|
14
|
+
organization: 'Organization',
|
|
15
|
+
// At most 6. A page of ginko.config.ts (`page`, with its label per language; keep it the same as the page's
|
|
16
|
+
// title) or an entry of content/pages/ by id (`pages/<file name without number>`).
|
|
17
|
+
nav: [
|
|
18
|
+
{ page: 'services', label: { en: 'Products and services', de: 'Produkte und Leistungen' } },
|
|
19
|
+
{ entry: 'pages/about' },
|
|
20
|
+
{ page: 'news', label: { en: 'News', de: 'Aktuelles' } },
|
|
21
|
+
{ page: 'events', label: { en: 'Trade fairs', de: 'Messen' } },
|
|
22
|
+
{ page: 'jobs', label: { en: 'Jobs', de: 'Karriere' } },
|
|
23
|
+
{ page: 'team', label: { en: 'Contact', de: 'Kontakt' } },
|
|
24
|
+
],
|
|
25
|
+
footer: [
|
|
26
|
+
{ page: 'downloads', label: { en: 'Downloads', de: 'Downloads' } },
|
|
27
|
+
],
|
|
28
|
+
// For example { label: 'LinkedIn', url: 'https://www.linkedin.com/company/halden-pumps' }.
|
|
29
|
+
socials: [],
|
|
30
|
+
// Prices to businesses, plus VAT: the price label says so, and so does the price's JSON-LD.
|
|
31
|
+
vat: 'excluded',
|
|
32
|
+
} satisfies SiteAppConfig,
|
|
33
|
+
})
|
|
@@ -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
|
+
company: sky. White on the accent 5.9:1 light; the accent on the page 5.9:1 light; #082f49 on the dark accent
|
|
7
|
+
8.3:1; the dark accent on the page 11.8:1. The focus ring and links in text use the accent. */
|
|
8
|
+
:root {
|
|
9
|
+
--brand: #0369a1;
|
|
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: #7dd3fc;
|
|
17
|
+
--brand-foreground: #082f49;
|
|
18
|
+
/* The closing band in dark mode: a deep blue instead of the light accent, so it does not outshine the page.
|
|
19
|
+
#f0f9ff on #0c4a6e 8.9:1. */
|
|
20
|
+
--brand-surface: #0c4a6e;
|
|
21
|
+
--brand-surface-foreground: #f0f9ff;
|
|
22
|
+
}
|