diff --git a/hugo-modules/core/layouts/storybook/single.stories.js b/hugo-modules/core/layouts/storybook/single.stories.js index 942cc29..0533261 100644 --- a/hugo-modules/core/layouts/storybook/single.stories.js +++ b/hugo-modules/core/layouts/storybook/single.stories.js @@ -109,7 +109,7 @@ {{- $combinations := partial "combinations" (dict "list" $templateParams) }} {{ $params := merge site.Params (dict - "environment" (or (getenv "HUGO_ENVIRONMENT") hugo.Environment) + "environment" (or (getenv "HUGO_ENV") hugo.Environment) ) }} {{- $js := resources.Get "js/main.js" | js.Build (dict "format" "esm" diff --git a/hugo-modules/core/utils/get-category-name.html b/hugo-modules/core/utils/get-category-name.html index 09a0c75..9a90059 100644 --- a/hugo-modules/core/utils/get-category-name.html +++ b/hugo-modules/core/utils/get-category-name.html @@ -9,7 +9,7 @@ {{- $result := "" -}} -{{- if hasPrefix $content_type "t-" -}} +{{- if (or (eq $content_type "page") (hasPrefix $content_type "t-")) -}} {{- $result = "templates" -}} {{- else if hasPrefix $content_type "m-" -}} {{- $result = "modules" -}} diff --git a/hugo-modules/core/utils/get-data.html b/hugo-modules/core/utils/get-data.html index 3ebd960..bd0f1a4 100644 --- a/hugo-modules/core/utils/get-data.html +++ b/hugo-modules/core/utils/get-data.html @@ -1,6 +1,6 @@ {{/* utils/get-data - Get data from contentful data types. + Get data from Contentful data types. @example - Go Template {{ partial "utils/get-data" (dict @@ -23,8 +23,6 @@ {{ $result = or (index $contents (string $entry_id)) (index $contents (print (string $entry_id) "." $folder)) dict }} {{ end }} {{ end }} - - {{ end }} {{ return $result }} diff --git a/hugo-modules/core/utils/get-page.html b/hugo-modules/core/utils/get-page.html index cdf1411..3e79983 100644 --- a/hugo-modules/core/utils/get-page.html +++ b/hugo-modules/core/utils/get-page.html @@ -12,7 +12,7 @@ {{ $content_type := .content_type }} {{ $page := dict }} {{ if and $content_type $entry_id }} - {{ if (eq $content_type "page") }} + {{ if (or (eq $content_type "page") (hasPrefix $content_type "t-")) }} {{ with index (where site.Pages "Params.sys.id" $entry_id) 0 }} {{ $page = . }} {{ end }} diff --git a/hugo-modules/core/utils/get-params.html b/hugo-modules/core/utils/get-params.html index 614a90e..581f4ae 100644 --- a/hugo-modules/core/utils/get-params.html +++ b/hugo-modules/core/utils/get-params.html @@ -14,15 +14,11 @@ {{ $content_type := .content_type }} {{ $params := dict }} -{{ if (eq $content_type "page") }} - {{ $page := partial "utils/get-page" . }} - {{ with $page }} - {{ $params = .Params }} - {{ end }} +{{ $page := partial "utils/get-page" . }} +{{ with $page }} + {{ $params = .Params }} {{ else }} {{ $params = merge . (partial "utils/get-data" . )}} {{ end }} - - {{ return $params }} diff --git a/hugo-modules/core/utils/link.html b/hugo-modules/core/utils/link.html index b15383f..65b6959 100644 --- a/hugo-modules/core/utils/link.html +++ b/hugo-modules/core/utils/link.html @@ -43,7 +43,7 @@ {{ end }} {{/* Page content type */}} - {{ else if eq .content_type "page" }} + {{ else if (or (eq .content_type "page") (hasPrefix .content_type "t-")) }} {{ with partialCached "utils/get-page" . . }} {{ $return = (dict "href" (.Permalink | safeURL) diff --git a/hugo-modules/core/utils/seo/private/get-data.html b/hugo-modules/core/utils/seo/private/get-data.html index 5c80d57..26002d6 100644 --- a/hugo-modules/core/utils/seo/private/get-data.html +++ b/hugo-modules/core/utils/seo/private/get-data.html @@ -14,7 +14,7 @@ TODO: - [ ] Improve type test on "events", `article` seems very opinated. - - [ ] Find a reasonable default image when `site.Params.default_image` is not set. + - [ ] Find a reasonable default image when `$settings.default_share_image` is not set. - [ ] Twitter can sport "author" handle on top of the site's. Devise a test for author? - [ ] Maybe consider another approach to set the twitter_card (summary, etc...) - [ ] Not sure about image size. Following https://docs.imgix.com/best-practices/improving-seo-traffic, we have a @@ -27,9 +27,7 @@ {{/* Adding the seo map to scratch which will recieve SEO key/value pairs. */}} {{ $s := newScratch }} -{{ $s.Set "seo" dict }} - - +{{ $s.Set "seo" dict }} {{ $seo_params := dict }} {{ with .Params.seo }} @@ -38,33 +36,27 @@ {{ $seo_params = . }} {{ end }} {{ end }} -{{ with .Params.content }} - {{ with partialCached "utils/get-params" . . }} - {{ $seo_params = merge . $seo_params }} - {{ end }} -{{ end }} -{{ $config := partialCached "utils/seo/private/get-config" "seo/private/get-config" }} +{{ $settings := partialCached "utils/get-settings" . }} {{/* Dates ----------------------------- */}} - -{{ if not .PublishDate.IsZero }} -{{ $s.SetInMap "seo" "published_time" (.PublishDate.Format "2006-01-02T15:04:05-07:00") }} -{{ else if not .Date.IsZero }} -{{ $s.SetInMap "seo" "published_time" (.Date.Format "2006-01-02T15:04:05-07:00") }} -{{ else }} +{{ if not .PublishDate.IsZero }} +{{ $s.SetInMap "seo" "published_time" (.PublishDate.Format "2006-01-02T15:04:05-07:00") }} +{{ else if not .Date.IsZero }} +{{ $s.SetInMap "seo" "published_time" (.Date.Format "2006-01-02T15:04:05-07:00") }} +{{ else }} {{ with .Params.sys.created_at }} - {{ $s.SetInMap "seo" "published_time" (dateFormat "2006-01-02T15:04:05-07:00" .) }} + {{ $s.SetInMap "seo" "published_time" (dateFormat "2006-01-02T15:04:05-07:00" .) }} {{ end }} -{{ end }} -{{ if not .Lastmod.IsZero }} -{{ $s.SetInMap "seo" "updated_time" (.Lastmod.Format "2006-01-02T15:04:05-07:00") }} +{{ end }} +{{ if not .Lastmod.IsZero }} +{{ $s.SetInMap "seo" "updated_time" (.Lastmod.Format "2006-01-02T15:04:05-07:00") }} {{ else }} {{ with .Params.sys.updated_at }} - {{ $s.SetInMap "seo" "updated_time" (dateFormat "2006-01-02T15:04:05-07:00" .) }} + {{ $s.SetInMap "seo" "updated_time" (dateFormat "2006-01-02T15:04:05-07:00" .) }} {{ end }} -{{ end }} +{{ end }} {{/* Description ---------------------------- @@ -84,7 +76,7 @@ {{/* 3. Summary */}} {{ else if .Summary }} {{ $description = .Summary }} -{{ else }} +{{ else }} {{/* 4. site description */}} {{ $description = site.Params.Description }} {{ end }} @@ -96,63 +88,61 @@ {{ end }} {{ end }} - {{/* Title ---------------------------- We use the following logic - 1. Every pages: `{.Title} | {site.Title}` - 2. Homepage: , only {site.Title} */}} -{{ $title := .Title }} + 1. Every pages: `Page title | Global site title` + 2. Homepage: only `Global site title` */}} +{{ $title := "" }} {{ with $seo_params.title }} {{ $title = . }} {{ end }} {{ if not .IsHome }} - {{/* 1. `{.Title} | {.Site.Title}` */}} - {{ $s.SetInMap "seo" "title" (printf "%s | %s" $title site.Title) }} + {{/* 1. `Page title | Global site title` */}} + {{ $s.SetInMap "seo" "title" (printf "%s | %s" $title $settings.title) }} {{ else }} - {{/* 2. `{.Site.Title}` */}} - {{ $s.SetInMap "seo" "title" site.Title }} + {{/* 2. `Global site title` */}} + {{ $s.SetInMap "seo" "title" $settings.title }} {{ end }} - {{/* Site Name ---------------------------- */}} -{{ with $config.site_name }} - {{ $s.SetInMap "seo" "site_name" . }} +{{ with $settings.site_name }} + {{ $s.SetInMap "seo" "site_name" $settings.site_name }} {{ else }} - {{ $s.SetInMap "seo" "site_name" site.Title }} + {{ $s.SetInMap "seo" "site_name" $settings.title }} {{ end }} {{/* Image ---------------------------- */}} {{ $img := false }} -{{ with $config.default_image }} - {{ $img = . }} -{{ end }} +{{ with $settings.default_share_image }} + {{ $img = .url }} +{{ end }} -{{ with $seo_params.image }} - {{ $img = . }} +{{ with $seo_params.share_image }} + {{ $img = .url }} {{ else }} {{/* If no SEO IMAGE is set, we look for the .Params.images slice and use the first one if it has an `image` key */}} - {{ with .Params.images }} - {{ with index . 0 }} + {{ with .Params.images }} + {{ with index . 0 }} {{ if reflect.IsMap . }} - {{ with .image }} - {{ $img = . }} - {{ end }} + {{ with .image }} + {{ $img = .url }} + {{ end }} {{ else }} - {{ $img = . }} + {{ $img = .url }} {{ end }} - {{ end }} - {{ end }} -{{ end }} + {{ end }} + {{ end }} +{{ end }} {{/* Finally if after all of the conditional above we are not able to find an image for the page, we resolve to looking for the following: */}} {{ if not $img }} - {{ $img_defaults := slice "/static/logo.jpg" "/static/logo.png" "/static/logo.svg" }} + {{ $img_defaults := slice "/static/logo.jpg" "/static/logo.png" "/static/logo.svg" }} {{ range $path := $img_defaults }} {{ if fileExists . }} {{ $img = strings.TrimLeft "/static" $path }} @@ -169,17 +159,16 @@ ---------------------------- */}} {{ with $img }} {{/* Most of the time we should have an image */}} - {{ $s.SetInMap "seo" "twitter_card" "summary_large_image" }} + {{ $s.SetInMap "seo" "twitter_card" "summary_large_image" }} {{ else }} {{/* For edge cases without: */}} - {{ $s.SetInMap "seo" "twitter_card" "summary" }} + {{ $s.SetInMap "seo" "twitter_card" "summary" }} {{ end }} - {{/* We check the site config sports a Social.twitter and use as handle */}} -{{ with .Site.Social.twitter }} - {{ $s.SetInMap "seo" "twitter_handle" (printf "@%s" .) }} -{{ end }} +{{ with .Site.Social.twitter }} + {{ $s.SetInMap "seo" "twitter_handle" (printf "@%s" .) }} +{{ end }} {{/* We check if the page is not set as private */}} {{ with $.Params.seo.private }} @@ -191,28 +180,26 @@ {{/* Type ---------------------------- */}} -{{ $s.SetInMap "seo" "type" "website" }} +{{ $s.SetInMap "seo" "type" "website" }} -{{ if in (slice "blog" "news") .Type }} - {{ $s.SetInMap "seo" "type" "article" }} +{{ if in (slice "blog" "news") .Type }} + {{ $s.SetInMap "seo" "type" "article" }} {{ else if in (slice "article") .Type }} - {{ $s.SetInMap "seo" "type" "event" }} -{{ end }} - + {{ $s.SetInMap "seo" "type" "event" }} +{{ end }} -{{/* robots +{{/* Robots ---------------------------- */}} {{ with $seo_params }} {{ $no_index := .no_index | default false }} {{ $no_follow := .no_follow | default false }} - {{ $s.SetInMap "seo" "no_index" $no_index }} - {{ $s.SetInMap "seo" "no_follow" $no_follow }} +{{ $s.SetInMap "seo" "no_index" $no_index }} +{{ $s.SetInMap "seo" "no_follow" $no_follow }} {{ end -}} - {{/* Locale and translations ---------------------------- */}} -{{ $s.SetInMap "seo" "locale" .Lang }} +{{ $s.SetInMap "seo" "locale" .Lang }} {{ $translations := slice }} {{ if .IsTranslated }} @@ -222,21 +209,15 @@ {{ $s.SetInMap "seo" "translations" $translations }} {{ end }} - {{/* Canonical ---------------------------- */}} -{{ with $seo_params.canonical }} - {{ $s.SetInMap "seo" "canonical" (. | absURL) }} -{{ else }} -{{ $s.SetInMap "seo" "canonical" .Permalink }} -{{ end }} +{{ $s.SetInMap "seo" "canonical" .Permalink }} {{ $seo := $s.Get "seo" }} {{ if templates.Exists "partials/utils/seo/data.html" }} {{ $seo = partial "utils/seo/data" (dict "seo" $seo "Page" $) }} {{ end }} - {{ with $seo }} {{ $s.SetInMap "jsonld" "@context" "https://schema.org" }} {{ $s.SetInMap "jsonld" "@type" .type }} @@ -254,7 +235,4 @@ {{ $seo = merge $seo (dict "jsonld" .) }} {{ end }} - - - {{ return $seo }} diff --git a/packages/contentful-migrations/core/0000000000001-create-d-settings-migration.js b/packages/contentful-migrations/core/0000000000001-create-d-settings-migration.js index 7d68623..9eabb04 100644 --- a/packages/contentful-migrations/core/0000000000001-create-d-settings-migration.js +++ b/packages/contentful-migrations/core/0000000000001-create-d-settings-migration.js @@ -2,21 +2,22 @@ module.exports = function (migration) { const dSettings = migration .createContentType('d-settings') .name('Data: Settings') - .description('') - .displayField('name'); + .description('Global site parameters') + .displayField('internal_name'); + dSettings - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) - .required(false) + .required(true) .validations([]) .disabled(false) .omitted(false); dSettings .createField('title') - .name('Page title') + .name('SEO > Page title') .type('Symbol') .localized(true) .required(false) @@ -25,8 +26,18 @@ module.exports = function (migration) { .omitted(false); dSettings - .createField('logo') - .name('Logo') + .createField('site_name') + .name('SEO > Site name') + .type('Symbol') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false); + + dSettings + .createField('default_share_image') + .name('SEO > Default share image') .type('Link') .localized(false) .required(false) @@ -47,20 +58,28 @@ module.exports = function (migration) { .required(true) .validations([ { - linkContentType: ['page'], + linkContentType: ['t-page'], }, ]) .disabled(false) .omitted(false) .linkType('Entry'); - dSettings.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + dSettings.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Global settings"', }); dSettings.changeFieldControl('title', 'builtin', 'singleLine', { helpText: 'The title in the browser tab', }); + dSettings.changeFieldControl('site_name', 'builtin', 'singleLine', { + helpText: 'Used for the Open Graph meta tag og:site_name', + }); + + dSettings.changeFieldControl('default_share_image', 'builtin', 'assetLinkEditor', { + helpText: 'This will be displayed when you share a page on social media, unless you have explicitly set your own in the page', + }); + dSettings.changeFieldControl('home', 'builtin', 'entryLinkEditor', {}); }; diff --git a/packages/contentful-migrations/core/0000000000002-configure-d-settings-migration.js b/packages/contentful-migrations/core/0000000000002-configure-d-settings-migration.js index 5c8f520..6ac0535 100644 --- a/packages/contentful-migrations/core/0000000000002-configure-d-settings-migration.js +++ b/packages/contentful-migrations/core/0000000000002-configure-d-settings-migration.js @@ -1,17 +1,12 @@ /* eslint-env node */ +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); /** * Migration to generate the d-settings object with id 'settings' so it is available in contentful-ssg */ -module.exports = async function (migration, context) { +module.exports = withHelpers(async (_migration, context, helpers) => { const { makeRequest } = context; - - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); + const defaultLocale = await helpers.locale.getDefaultLocale(); // Create config object await makeRequest({ @@ -20,10 +15,10 @@ module.exports = async function (migration, context) { headers: { 'X-Contentful-Content-Type': 'd-settings' }, data: { fields: { - name: { + internal_name: { [defaultLocale.code]: 'Global settings', }, }, }, }); -}; +}); diff --git a/packages/contentful-migrations/core/0000000000003-create-page-migration.js b/packages/contentful-migrations/core/0000000000003-create-page-migration.js deleted file mode 100644 index 1fcb9fd..0000000 --- a/packages/contentful-migrations/core/0000000000003-create-page-migration.js +++ /dev/null @@ -1,89 +0,0 @@ -module.exports = function (migration) { - const page = migration - .createContentType('page') - .name('Compose: Page') - .description('Represents a web page in Compose. DO NOT DELETE') - .displayField('name'); - page - .createField('name') - .name('Internal name') - .type('Symbol') - .localized(false) - .required(true) - .validations([]) - .disabled(false) - .omitted(false); - page - .createField('title') - .name('Page title') - .type('Symbol') - .localized(true) - .required(true) - .validations([]) - .disabled(false) - .omitted(false); - - page - .createField('slug') - .name('Slug') - .type('Symbol') - .localized(true) - .required(true) - .validations([]) - .disabled(false) - .omitted(false); - - page - .createField('parent_page') - .name('Parent page') - .type('Link') - .localized(false) - .required(false) - .validations([ - { - linkContentType: ['folder', 'page'], - }, - ]) - .disabled(false) - .omitted(false) - .linkType('Entry'); - - page - .createField('seo') - .name('SEO metadata') - .type('Link') - .localized(false) - .required(false) - .validations([ - { - linkContentType: ['seo'], - }, - ]) - .disabled(false) - .omitted(false) - .linkType('Entry'); - - page - .createField('content') - .name('Content') - .type('Link') - .localized(false) - .required(true) - .validations([ - { - linkContentType: ['t-default'], - }, - ]) - .disabled(false) - .omitted(false) - .linkType('Entry'); - - page.changeFieldControl('name', 'builtin', 'singleLine', {}); - page.changeFieldControl('title', 'builtin', 'singleLine', {}); - page.changeFieldControl('parent_page', 'builtin', 'entryLinkEditor', {}); - page.changeFieldControl('slug', 'builtin', 'slugEditor', { - trackingFieldId: 'title', - }); - page.changeFieldControl('seo', 'builtin', 'entryCardEditor', {}); - page.changeFieldControl('content', 'builtin', 'entryCardEditor', {}); -}; diff --git a/packages/contentful-migrations/core/0000000000003-create-t-page-migration.js b/packages/contentful-migrations/core/0000000000003-create-t-page-migration.js new file mode 100644 index 0000000..3fa3780 --- /dev/null +++ b/packages/contentful-migrations/core/0000000000003-create-t-page-migration.js @@ -0,0 +1,168 @@ +/* eslint-env node */ +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context) => { + const tPage = migration + .createContentType('t-page') + .name('Template: Page') + .description('Template for a regular web page') + .displayField('internal_name'); + + tPage + .createField('internal_name') + .name('Internal name') + .type('Symbol') + .localized(false) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + + tPage + .createField('title') + .name('Page title') + .type('Symbol') + .localized(true) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + + tPage + .createField('slug') + .name('Slug') + .type('Symbol') + .localized(true) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + + tPage + .createField('parent_page') + .name('Parent page') + .type('Link') + .localized(false) + .required(false) + .validations([ + { + linkContentType: ['folder', 't-page'], + }, + ]) + .disabled(false) + .omitted(false) + .linkType('Entry'); + + tPage + .createField('seo') + .name('SEO metadata') + .type('Link') + .localized(false) + .required(false) + .validations([ + { + linkContentType: ['d-seo'], + }, + ]) + .disabled(false) + .omitted(false) + .linkType('Entry'); + + tPage + .createField('theme') + .name('Theme') + .type('Symbol') + .localized(false) + .required(false) + .validations([ + { + in: ['light', 'dark'], + }, + ]) + .disabled(true) + .omitted(true); + + tPage + .createField('stage') + .name('Stage') + .type('Link') + .localized(false) + .required(true) + .validations([ + { + linkContentType: ['m-stage'], + }, + ]) + .disabled(false) + .omitted(false) + .linkType('Entry'); + + tPage + .createField('content') + .name('Content') + .type('Array') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false) + .items({ + type: 'Link', + validations: [ + { + linkContentType: ['m-text', 'm-hero', 'm-media', 'm-list', 'm-columns'], + }, + ], + linkType: 'Entry', + }); + + tPage.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page"', + }); + + tPage.changeFieldControl('title', 'builtin', 'singleLine', {}); + + tPage.changeFieldControl('slug', 'builtin', 'slugEditor', { + trackingFieldId: 'title', + }); + + tPage.changeFieldControl('parent_page', 'builtin', 'entryLinkEditor', {}); + + tPage.changeFieldControl('seo', 'builtin', 'entryCardEditor', {}); + + tPage.changeFieldControl('theme', 'builtin', 'radio', {}); + + tPage.changeFieldControl('stage', 'builtin', 'entryLinkEditor', {}); + + tPage.changeFieldControl('content', 'builtin', 'entryLinksEditor', {}); + + // Define page type and components (Compose only) + tPage.setAnnotations(['Contentful:AggregateRoot']); + tPage.editField('stage').setAnnotations(['Contentful:AggregateComponent']); + tPage.editField('content').setAnnotations(['Contentful:AggregateComponent']); + + // Create editor layout (Compose only) + const editorLayout = tPage.createEditorLayout(); + + editorLayout.createFieldGroup('content', { + name: 'Content', + }); + + editorLayout.changeFieldGroupControl('content', 'builtin', 'topLevelTab', { + helpText: 'Main content', + }); + + editorLayout.createFieldGroup('settings').name('Settings'); + + editorLayout.changeFieldGroupControl('settings', 'builtin', 'topLevelTab', { + helpText: 'Page settings', + }); + + editorLayout.moveField('title').toTheTopOfFieldGroup('settings'); + + editorLayout.moveField('slug').afterField('title'); + + editorLayout.moveField('parent_page').afterField('slug'); + + editorLayout.moveField('seo').afterField('parent_page'); +}); diff --git a/packages/contentful-migrations/core/0000000000004-create-seo-migration.js b/packages/contentful-migrations/core/0000000000004-create-d-seo-migration.js similarity index 62% rename from packages/contentful-migrations/core/0000000000004-create-seo-migration.js rename to packages/contentful-migrations/core/0000000000004-create-d-seo-migration.js index 30c4a05..c140cc5 100644 --- a/packages/contentful-migrations/core/0000000000004-create-seo-migration.js +++ b/packages/contentful-migrations/core/0000000000004-create-d-seo-migration.js @@ -1,11 +1,12 @@ module.exports = function (migration) { - const seo = migration - .createContentType('seo') - .name('Compose: SEO') - .description('SEO Metadata for web pages in Compose. DO NOT DELETE') - .displayField('name'); - seo - .createField('name') + const dSeo = migration + .createContentType('d-seo') + .name('Data: SEO') + .description('SEO metadata for web pages') + .displayField('internal_name'); + + dSeo + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -13,16 +14,18 @@ module.exports = function (migration) { .validations([]) .disabled(false) .omitted(false); - seo + + dSeo .createField('title') - .name('SEO title') + .name('Title') .type('Symbol') .localized(true) .required(false) .validations([]) .disabled(false) .omitted(false); - seo + + dSeo .createField('description') .name('Description') .type('Symbol') @@ -31,8 +34,9 @@ module.exports = function (migration) { .validations([]) .disabled(false) .omitted(false); - seo - .createField('image') + + dSeo + .createField('share_image') .name('Share image') .type('Link') .localized(false) @@ -45,16 +49,8 @@ module.exports = function (migration) { .disabled(false) .omitted(false) .linkType('Asset'); - seo - .createField('keywords') - .name('Keywords') - .type('Symbol') - .localized(false) - .required(false) - .validations([]) - .disabled(true) - .omitted(false); - seo + + dSeo .createField('no_index') .name('Hide page from search engines? (noindex)') .type('Boolean') @@ -63,7 +59,8 @@ module.exports = function (migration) { .validations([]) .disabled(false) .omitted(false); - seo + + dSeo .createField('no_follow') .name('Exclude links from search rankings? (nofollow)') .type('Boolean') @@ -73,31 +70,29 @@ module.exports = function (migration) { .disabled(false) .omitted(false); - seo.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "⚠️ Don't edit this field! The Compose will fill it for you.", + dSeo.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > SEO"', }); - seo.changeFieldControl('title', 'builtin', 'singleLine', { + dSeo.changeFieldControl('title', 'builtin', 'singleLine', { helpText: 'This will override the page title in search engine results', }); - seo.changeFieldControl('description', 'builtin', 'singleLine', { + dSeo.changeFieldControl('description', 'builtin', 'singleLine', { helpText: 'This will be displayed in search engine results', }); - seo.changeFieldControl('image', 'builtin', 'assetLinkEditor', { + dSeo.changeFieldControl('share_image', 'builtin', 'assetLinkEditor', { helpText: 'This will be displayed when sharing the page on social media', }); - seo.changeFieldControl('keywords', 'builtin', 'singleLine', {}); - - seo.changeFieldControl('no_index', 'builtin', 'boolean', { + dSeo.changeFieldControl('no_index', 'builtin', 'boolean', { helpText: 'Search engines will not include this page in search results', trueLabel: 'Yes', falseLabel: 'No', }); - seo.changeFieldControl('no_follow', 'builtin', 'boolean', { + dSeo.changeFieldControl('no_follow', 'builtin', 'boolean', { helpText: 'Search engines will not follow the links on your page', trueLabel: 'Yes', falseLabel: 'No', diff --git a/packages/contentful-migrations/core/0000000000005-create-d-i18n-migration.js b/packages/contentful-migrations/core/0000000000005-create-d-i18n-migration.js index d2d74a6..1a1b8e9 100644 --- a/packages/contentful-migrations/core/0000000000005-create-d-i18n-migration.js +++ b/packages/contentful-migrations/core/0000000000005-create-d-i18n-migration.js @@ -40,7 +40,9 @@ module.exports = function (migration) { .omitted(false); dI18n.changeFieldControl('key', 'builtin', 'singleLine', {}); + dI18n.changeFieldControl('other', 'builtin', 'singleLine', {}); + dI18n.changeFieldControl('one', 'builtin', 'singleLine', { helpText: 'Optionally pass a dedicated singular value', }); diff --git a/packages/contentful-migrations/core/0000000000006-create-x-deploy-migration.js b/packages/contentful-migrations/core/0000000000006-create-x-deploy-migration.js index a3384c6..2964937 100644 --- a/packages/contentful-migrations/core/0000000000006-create-x-deploy-migration.js +++ b/packages/contentful-migrations/core/0000000000006-create-x-deploy-migration.js @@ -1,16 +1,13 @@ /* eslint-env node */ - -/** - * Contentful migration to create deploy content type - */ module.exports = function (migration) { const deploy = migration .createContentType('x-deploy') .name('Deploy') .description('Depoy trigger') - .displayField('name'); + .displayField('internal_name'); + deploy - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -18,5 +15,8 @@ module.exports = function (migration) { .validations([]) .disabled(false) .omitted(false); - deploy.changeFieldControl('name', 'builtin', 'singleLine', {}); + + deploy.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Deploy to preview"', + }); }; diff --git a/packages/contentful-migrations/core/0000000000007-configure-x-deploy-migration.js b/packages/contentful-migrations/core/0000000000007-configure-x-deploy-migration.js index 7ed6c8c..839daab 100644 --- a/packages/contentful-migrations/core/0000000000007-configure-x-deploy-migration.js +++ b/packages/contentful-migrations/core/0000000000007-configure-x-deploy-migration.js @@ -1,4 +1,5 @@ /* eslint-env node */ +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); const path = require('path'); const fs = require('fs'); const { promisify } = require('util'); @@ -10,11 +11,12 @@ const readJsonAsync = async (filepath, options) => { }; /** - * Contentful migration + * Contentful migration to configure the deploy content type */ -module.exports = async function (migration, context) { +module.exports = withHelpers(async (migration, context, helpers) => { const { makeRequest } = context; const deploy = migration.editContentType('x-deploy'); + const defaultLocale = await helpers.locale.getDefaultLocale(); // Remove default sidebar widgets const defaultWidgets = [ @@ -70,19 +72,13 @@ module.exports = async function (migration, context) { // Add deploy-with-confirmation sidebar widget deploy.addSidebarWidget('extension', 'deploy-with-confirmation'); - // Add Deploy objects - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); await makeRequest({ method: 'PUT', url: `/entries/deploy-to-preview`, headers: { 'X-Contentful-Content-Type': 'x-deploy' }, data: { fields: { - name: { + internal_name: { [defaultLocale.code]: 'Deploy to preview', }, }, @@ -94,7 +90,7 @@ module.exports = async function (migration, context) { headers: { 'X-Contentful-Content-Type': 'x-deploy' }, data: { fields: { - name: { + internal_name: { [defaultLocale.code]: 'Deploy to staging', }, }, @@ -106,10 +102,10 @@ module.exports = async function (migration, context) { headers: { 'X-Contentful-Content-Type': 'x-deploy' }, data: { fields: { - name: { + internal_name: { [defaultLocale.code]: 'Deploy to production', }, }, }, }); -}; +}); diff --git a/packages/contentful-migrations/core/0000000000008-create-multi-text-extension-migration.js b/packages/contentful-migrations/core/0000000000008-create-multi-text-extension-migration.js index 61c1362..d8d8317 100644 --- a/packages/contentful-migrations/core/0000000000008-create-multi-text-extension-migration.js +++ b/packages/contentful-migrations/core/0000000000008-create-multi-text-extension-migration.js @@ -9,10 +9,7 @@ const readJsonAsync = async (filepath, options) => { return JSON.parse(content); }; -/** - * Contentful migration - */ -module.exports = async function (migration, context) { +module.exports = async function (_migration, context) { const { makeRequest } = context; // Check if deploy-with-confirmation extension is installed const { items: extensions } = await makeRequest({ diff --git a/packages/contentful-migrations/core/0000000000010-create-t-default-migration.js b/packages/contentful-migrations/core/0000000000010-create-t-default-migration.js deleted file mode 100644 index 15d204d..0000000 --- a/packages/contentful-migrations/core/0000000000010-create-t-default-migration.js +++ /dev/null @@ -1,81 +0,0 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); - - const tDefault = migration - .createContentType('t-default') - .name('Template: Default') - .description('Default template with no module restrictions') - .displayField('name'); - - tDefault - .createField('name') - .name('Internal name') - .type('Symbol') - .localized(false) - .required(false) - .validations([]) - .disabled(false) - .omitted(false); - - tDefault - .createField('theme') - .name('Theme') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['light', 'dark'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); - - tDefault - .createField('stage') - .name('Stage') - .type('Link') - .localized(false) - .required(true) - .validations([ - { - linkContentType: ['m-stage'], - }, - ]) - .disabled(false) - .omitted(false) - .linkType('Entry'); - - tDefault - .createField('modules') - .name('Content modules') - .type('Array') - .localized(true) - .required(false) - .validations([]) - .disabled(false) - .omitted(false) - .items({ - type: 'Link', - validations: [ - { - linkContentType: ['m-columns', 'm-editorial', 'm-list', 'm-section', 'm-text'], - }, - ], - linkType: 'Entry', - }); - - tDefault.changeFieldControl('name', 'builtin', 'singleLine', {}); - tDefault.changeFieldControl('theme', 'builtin', 'radio', {}); - tDefault.changeFieldControl('stage', 'builtin', 'entryLinkEditor', {}); - tDefault.changeFieldControl('modules', 'builtin', 'entryLinksEditor', {}); -}; diff --git a/packages/contentful-migrations/ui/1000000000001-create-c-link-migration.js b/packages/contentful-migrations/ui/1000000000001-create-c-link-migration.js index 8591311..0863d63 100644 --- a/packages/contentful-migrations/ui/1000000000001-create-c-link-migration.js +++ b/packages/contentful-migrations/ui/1000000000001-create-c-link-migration.js @@ -3,10 +3,10 @@ module.exports = function (migration) { .createContentType('c-link') .name('Component: Link') .description('Content type for internal & external Links') - .displayField('name'); + .displayField('internal_name'); cLink - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -48,7 +48,7 @@ module.exports = function (migration) { .required(false) .validations([ { - linkContentType: ['page'], + linkContentType: ['t-page'], }, ]) .disabled(false) @@ -131,11 +131,12 @@ module.exports = function (migration) { .disabled(false) .omitted(false); - cLink.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + cLink.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Stage > Link"', }); cLink.changeFieldControl('text', 'builtin', 'singleLine', {}); + cLink.changeFieldControl('query', 'builtin', 'singleLine', {}); cLink.changeFieldControl('icon', 'builtin', 'assetLinkEditor', { @@ -157,6 +158,8 @@ module.exports = function (migration) { cLink.changeFieldControl('link_to_url', 'builtin', 'urlEditor', {}); cLink.changeFieldControl('target_blank', 'builtin', 'boolean', {}); + cLink.changeFieldControl('open_as_download', 'builtin', 'boolean', {}); + cLink.changeFieldControl('appearance', 'builtin', 'dropdown', {}); }; diff --git a/packages/contentful-migrations/ui/1000000000002-create-c-image-migration.js b/packages/contentful-migrations/ui/1000000000002-create-c-image-migration.js index 48428f2..b11c842 100644 --- a/packages/contentful-migrations/ui/1000000000002-create-c-image-migration.js +++ b/packages/contentful-migrations/ui/1000000000002-create-c-image-migration.js @@ -1,23 +1,20 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const cImage = migration .createContentType('c-image') .name('Component: Image') .description('Image type with dedicated fields for mobile & desktop asset') - .displayField('name'); + .displayField('internal_name'); + cImage - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) - .required(false) + .required(true) .validations([]) .disabled(false) .omitted(false); @@ -79,20 +76,25 @@ module.exports = async function (migration, context) { .localized(false) .required(false) .validations([]) - .disabled(false) .defaultValue({ [defaultLocale.code]: true, }) - .omitted(false); + .disabled(true) + .omitted(true); - cImage.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + cImage.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Stage > Image"', }); + cImage.changeFieldControl('alt', 'builtin', 'singleLine', {}); + cImage.changeFieldControl('caption', 'builtin', 'multipleLine', {}); + cImage.changeFieldControl('image_mobile', 'builtin', 'assetLinkEditor', {}); + cImage.changeFieldControl('image_desktop', 'builtin', 'assetLinkEditor', { - helpText: 'Leave emptzy to use the mobile image on all screen sizes', + helpText: 'Leave empty to use the mobile image on all screen sizes', }); + cImage.changeFieldControl('lazy', 'builtin', 'boolean', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1000000000003-create-c-media-migration.js b/packages/contentful-migrations/ui/1000000000003-create-c-media-migration.js index 137cb7f..7c99e65 100644 --- a/packages/contentful-migrations/ui/1000000000003-create-c-media-migration.js +++ b/packages/contentful-migrations/ui/1000000000003-create-c-media-migration.js @@ -1,19 +1,16 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const cMedia = migration .createContentType('c-media') .name('Component: Media') .description('Images / loop videos with predefined ratios') - .displayField('name'); + .displayField('internal_name'); + cMedia - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -21,6 +18,7 @@ module.exports = async function (migration, context) { .validations([]) .disabled(false) .omitted(false); + cMedia .createField('alt') .name('Alt text') @@ -30,6 +28,7 @@ module.exports = async function (migration, context) { .validations([]) .disabled(false) .omitted(false); + cMedia .createField('caption') .name('Caption') @@ -182,14 +181,17 @@ module.exports = async function (migration, context) { .defaultValue({ [defaultLocale.code]: true, }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); - cMedia.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + cMedia.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Stage > Media"', }); + cMedia.changeFieldControl('alt', 'builtin', 'singleLine', {}); + cMedia.changeFieldControl('caption', 'builtin', 'multipleLine', {}); + cMedia.changeFieldControl('media', 'builtin', 'assetLinkEditor', {}); cMedia.changeFieldControl('mobile_ratio', 'builtin', 'dropdown', { @@ -229,4 +231,4 @@ module.exports = async function (migration, context) { }); cMedia.changeFieldControl('lazy', 'builtin', 'boolean', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1000000000004-create-c-editorial-migration.js b/packages/contentful-migrations/ui/1000000000004-create-c-editorial-migration.js index 0311687..09bb500 100644 --- a/packages/contentful-migrations/ui/1000000000004-create-c-editorial-migration.js +++ b/packages/contentful-migrations/ui/1000000000004-create-c-editorial-migration.js @@ -2,10 +2,11 @@ module.exports = async function (migration) { const cEditorial = migration .createContentType('c-editorial') .name('Component: Editorial') - .description('Teaser-like components with text, image & links') - .displayField('name'); + .description('A flexible component that can combine headlines, text, media and links') + .displayField('internal_name'); + cEditorial - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -13,18 +14,30 @@ module.exports = async function (migration) { .validations([]) .disabled(false) .omitted(false); + + cEditorial + .createField('overline') + .name('Overline') + .type('Symbol') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false); + cEditorial - .createField('title') - .name('Title') + .createField('headline') + .name('Headline') .type('Symbol') .localized(true) .required(false) .validations([]) .disabled(false) .omitted(false); + cEditorial - .createField('subtitle') - .name('Subtitle') + .createField('subline') + .name('Subline') .type('Symbol') .localized(true) .required(false) @@ -80,23 +93,27 @@ module.exports = async function (migration) { .omitted(false) .items({ type: 'Link', - validations: [ { - linkContentType: ['c-link', 'page'], + linkContentType: ['c-link', 't-page'], }, ], - linkType: 'Entry', }); - cEditorial.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + cEditorial.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Editorial > Editorial"', }); - cEditorial.changeFieldControl('title', 'builtin', 'singleLine', {}); - cEditorial.changeFieldControl('subtitle', 'builtin', 'singleLine', {}); + cEditorial.changeFieldControl('overline', 'builtin', 'singleLine', {}); + + cEditorial.changeFieldControl('headline', 'builtin', 'singleLine', {}); + + cEditorial.changeFieldControl('subline', 'builtin', 'singleLine', {}); + cEditorial.changeFieldControl('text', 'builtin', 'richTextEditor', {}); + cEditorial.changeFieldControl('media', 'builtin', 'entryLinkEditor', {}); + cEditorial.changeFieldControl('links', 'builtin', 'entryLinksEditor', {}); }; diff --git a/packages/contentful-migrations/ui/1000000000006-create-c-menu-migration.js b/packages/contentful-migrations/ui/1000000000006-create-c-menu-migration.js index ab5c803..890ee1b 100644 --- a/packages/contentful-migrations/ui/1000000000006-create-c-menu-migration.js +++ b/packages/contentful-migrations/ui/1000000000006-create-c-menu-migration.js @@ -3,9 +3,10 @@ module.exports = function (migration) { .createContentType('c-menu') .name('Component: Menu') .description('Content type for specifying menus') - .displayField('name'); + .displayField('internal_name'); + cMenu - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -13,6 +14,17 @@ module.exports = function (migration) { .validations([]) .disabled(false) .omitted(false); + + cMenu + .createField('name') + .name('Name') + .type('Symbol') + .localized(false) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + cMenu .createField('title') .name('Title') @@ -36,18 +48,26 @@ module.exports = function (migration) { type: 'Link', validations: [ { - linkContentType: ['c-link', 'page', 'folder'], + linkContentType: ['c-link', 't-page', 'folder'], }, ], linkType: 'Entry', }); - cMenu.changeFieldControl('name', 'builtin', 'singleLine', {}); + cMenu.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Menu > Main"', + }); + + cMenu.changeFieldControl('name', 'builtin', 'singleLine', { + helpText: 'Used as menu identifier', + }); + cMenu.changeFieldControl('title', 'builtin', 'singleLine', {}); + cMenu.changeFieldControl('entries', 'builtin', 'entryLinksEditor', {}); - const page = migration.editContentType('page'); - page + const tPage = migration.editContentType('t-page'); + tPage .createField('submenu') .name('Submenu') .type('Link') @@ -62,13 +82,10 @@ module.exports = function (migration) { .omitted(false) .linkType('Entry'); - page.moveField('submenu').beforeField('content'); - page.changeFieldControl('submenu', 'builtin', 'entryLinkEditor', {}); - const dSettings = migration.editContentType('d-settings'); dSettings .createField('main_menu') - .name('Main menu') + .name('Menu > Main') .type('Link') .localized(false) .required(false) @@ -83,7 +100,7 @@ module.exports = function (migration) { dSettings .createField('meta_menu') - .name('Meta menu') + .name('Menu > Meta') .type('Link') .localized(false) .required(false) @@ -98,7 +115,7 @@ module.exports = function (migration) { dSettings .createField('social_menu') - .name('Social menu') + .name('Menu > Social') .type('Link') .localized(false) .required(false) @@ -113,7 +130,7 @@ module.exports = function (migration) { dSettings .createField('footer_menus') - .name('Footer menus') + .name('Menu > Footer') .type('Array') .localized(false) .required(false) @@ -139,7 +156,10 @@ module.exports = function (migration) { }); dSettings.changeFieldControl('main_menu', 'builtin', 'entryLinkEditor', {}); + dSettings.changeFieldControl('meta_menu', 'builtin', 'entryLinkEditor', {}); + dSettings.changeFieldControl('social_menu', 'builtin', 'entryLinkEditor', {}); + dSettings.changeFieldControl('footer_menus', 'builtin', 'entryLinksEditor', {}); }; diff --git a/packages/contentful-migrations/ui/1000000000007-move-submenu-field-migration.js b/packages/contentful-migrations/ui/1000000000007-move-submenu-field-migration.js new file mode 100644 index 0000000..b015071 --- /dev/null +++ b/packages/contentful-migrations/ui/1000000000007-move-submenu-field-migration.js @@ -0,0 +1,8 @@ +module.exports = function (migration) { + const tPage = migration.editContentType('t-page'); + tPage.moveField('submenu').afterField('parent_page'); + + // Move field in editor layout (Compose only) + const editorLayout = tPage.editEditorLayout(); + editorLayout.moveField('submenu').afterField('parent_page'); +}; diff --git a/packages/contentful-migrations/ui/1000000000007-create-c-video-migration.js b/packages/contentful-migrations/ui/1000000000008-create-c-video-migration.js similarity index 87% rename from packages/contentful-migrations/ui/1000000000007-create-c-video-migration.js rename to packages/contentful-migrations/ui/1000000000008-create-c-video-migration.js index afaccf2..cfdcdaf 100644 --- a/packages/contentful-migrations/ui/1000000000007-create-c-video-migration.js +++ b/packages/contentful-migrations/ui/1000000000008-create-c-video-migration.js @@ -1,20 +1,16 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const cVideo = migration .createContentType('c-video') .name('Component: Video') .description('Add a video from Contentful or an external source like youtube to your site') - .displayField('name'); + .displayField('internal_name'); cVideo - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -22,6 +18,7 @@ module.exports = async function (migration, context) { .validations([]) .disabled(false) .omitted(false); + cVideo .createField('src') .name('Src') @@ -135,21 +132,29 @@ module.exports = async function (migration, context) { .disabled(false) .omitted(false); - cVideo.changeFieldControl('name', 'builtin', 'singleLine', { - helpText: "This field is for internal use only. It won't appear on the page.", + cVideo.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Stage > Video"', }); + cVideo.changeFieldControl('src', 'builtin', 'singleLine', {}); + cVideo.changeFieldControl('asset', 'builtin', 'assetLinkEditor', {}); + cVideo.changeFieldControl('poster', 'builtin', 'assetLinkEditor', {}); cVideo.changeFieldControl('caption', 'builtin', 'multipleLine', {}); + cVideo.changeFieldControl('track', 'builtin', 'assetLinkEditor', { helpText: 'Simple text file containing the actual subtitle data in the WebVTT format.', showLinkEntityAction: true, showCreateEntityAction: true, }); + cVideo.changeFieldControl('autoplay', 'builtin', 'boolean', {}); + cVideo.changeFieldControl('muted', 'builtin', 'boolean', {}); + cVideo.changeFieldControl('loop', 'builtin', 'boolean', {}); + cVideo.changeFieldControl('controls', 'builtin', 'boolean', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1100000000001-create-m-stage-migration.js b/packages/contentful-migrations/ui/1100000000001-create-m-stage-migration.js index fee9742..d2ee470 100644 --- a/packages/contentful-migrations/ui/1100000000001-create-m-stage-migration.js +++ b/packages/contentful-migrations/ui/1100000000001-create-m-stage-migration.js @@ -1,38 +1,47 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const mStage = migration .createContentType('m-stage') .name('Module: Stage') .description('Stage module is the very first element on every page.') - .displayField('name'); + .displayField('internal_name'); + mStage - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + + mStage + .createField('overline') + .name('Overline') + .type('Symbol') + .localized(true) .required(false) .validations([]) .disabled(false) .omitted(false); + mStage - .createField('title') - .name('Title') + .createField('headline') + .name('Headline') .type('Symbol') .localized(true) .required(false) .validations([]) .disabled(false) .omitted(false); + mStage - .createField('subtitle') - .name('Subtitle') + .createField('subline') + .name('Subline') .type('Symbol') .localized(true) .required(false) @@ -103,7 +112,7 @@ module.exports = async function (migration, context) { validations: [ { - linkContentType: ['c-link', 'page'], + linkContentType: ['c-link', 't-page'], }, ], @@ -134,8 +143,8 @@ module.exports = async function (migration, context) { .localized(true) .required(false) .validations([]) - .disabled(false) - .omitted(false) + .disabled(true) + .omitted(true) .items({ type: 'Link', validations: [ @@ -146,12 +155,23 @@ module.exports = async function (migration, context) { linkType: 'Entry', }); - mStage.changeFieldControl('name', 'builtin', 'singleLine', {}); - mStage.changeFieldControl('title', 'builtin', 'singleLine', {}); - mStage.changeFieldControl('subtitle', 'builtin', 'singleLine', {}); + mStage.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Stage"', + }); + + mStage.changeFieldControl('overline', 'builtin', 'singleLine', {}); + + mStage.changeFieldControl('headline', 'builtin', 'singleLine', {}); + + mStage.changeFieldControl('subline', 'builtin', 'singleLine', {}); + mStage.changeFieldControl('text', 'builtin', 'richTextEditor', {}); + mStage.changeFieldControl('media', 'builtin', 'entryLinkEditor', {}); + mStage.changeFieldControl('links', 'builtin', 'entryLinksEditor', {}); + mStage.changeFieldControl('layout', 'builtin', 'dropdown', {}); + mStage.changeFieldControl('content', 'builtin', 'entryLinksEditor', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1100000000002-create-m-section-migration.js b/packages/contentful-migrations/ui/1100000000002-create-m-section-migration.js deleted file mode 100644 index 31a118f..0000000 --- a/packages/contentful-migrations/ui/1100000000002-create-m-section-migration.js +++ /dev/null @@ -1,99 +0,0 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); - - const mSection = migration - .createContentType('m-section') - .name('Module: Section') - .description('') - .displayField('name'); - - mSection - .createField('name') - .name('Internal name') - .type('Symbol') - .localized(false) - .required(false) - .validations([]) - .disabled(false) - .omitted(false); - - mSection - .createField('theme') - .name('Theme') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['light', 'dark'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); - - mSection - .createField('spacing') - .name('Spacing') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['none', 'sm', 'md', 'lg'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'md', - }) - .disabled(false) - .omitted(false); - - mSection - .createField('layout') - .name('Layout') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['default'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'default', - }) - .disabled(false) - .omitted(false); - - mSection - .createField('body') - .name('Content') - .type('Array') - .localized(false) - .required(false) - .validations([]) - .disabled(false) - .omitted(false) - .items({ - type: 'Link', - validations: [], - linkType: 'Entry', - }); - - mSection.changeFieldControl('name', 'builtin', 'singleLine', {}); - - mSection.changeFieldControl('theme', 'builtin', 'dropdown', {}); - mSection.changeFieldControl('spacing', 'builtin', 'dropdown', {}); - - mSection.changeFieldControl('layout', 'builtin', 'dropdown', {}); - mSection.changeFieldControl('body', 'builtin', 'entryLinksEditor', {}); -}; diff --git a/packages/contentful-migrations/ui/1100000000003-create-m-list-migration.js b/packages/contentful-migrations/ui/1100000000003-create-m-list-migration.js index c105f7d..73f680c 100644 --- a/packages/contentful-migrations/ui/1100000000003-create-m-list-migration.js +++ b/packages/contentful-migrations/ui/1100000000003-create-m-list-migration.js @@ -1,23 +1,20 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const mList = migration .createContentType('m-list') .name('Module: List') .description('Allows placing multiple components in a slider or grid') - .displayField('name'); + .displayField('internal_name'); + mList - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) - .required(false) + .required(true) .validations([]) .disabled(false) .omitted(false); @@ -33,11 +30,8 @@ module.exports = async function (migration, context) { in: ['light', 'dark'], }, ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mList .createField('spacing') @@ -84,19 +78,23 @@ module.exports = async function (migration, context) { .omitted(false) .items({ type: 'Link', - validations: [ { linkContentType: ['c-editorial', 'c-image', 'c-media', 'c-video'], }, ], - linkType: 'Entry', }); - mList.changeFieldControl('name', 'builtin', 'singleLine', {}); + mList.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > List"', + }); + mList.changeFieldControl('layout', 'builtin', 'dropdown', {}); + mList.changeFieldControl('theme', 'builtin', 'dropdown', {}); + mList.changeFieldControl('spacing', 'builtin', 'dropdown', {}); + mList.changeFieldControl('body', 'builtin', 'entryLinksEditor', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1100000000004-create-m-columns-migration.js b/packages/contentful-migrations/ui/1100000000004-create-m-columns-migration.js index 31aeb52..81900bc 100644 --- a/packages/contentful-migrations/ui/1100000000004-create-m-columns-migration.js +++ b/packages/contentful-migrations/ui/1100000000004-create-m-columns-migration.js @@ -1,24 +1,20 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const mColumns = migration .createContentType('m-columns') .name('Module: Columns') .description('Helper for two column layouts') - .displayField('name'); + .displayField('internal_name'); mColumns - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) - .required(false) + .required(true) .validations([]) .disabled(false) .omitted(false); @@ -34,11 +30,8 @@ module.exports = async function (migration, context) { in: ['light', 'dark'], }, ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mColumns .createField('spacing') @@ -76,8 +69,8 @@ module.exports = async function (migration, context) { .defaultValue({ [defaultLocale.code]: 'default', }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mColumns .createField('column_left') @@ -85,14 +78,20 @@ module.exports = async function (migration, context) { .type('Array') .localized(false) .required(false) - .validations([]) + .validations([ + { + size: { + max: 1, + }, + }, + ]) .disabled(false) .omitted(false) .items({ type: 'Link', validations: [ { - linkContentType: ['c-link', 'c-editorial', 'c-image', 'c-media', 'c-video'], + linkContentType: ['c-editorial', 'c-image', 'c-media', 'c-video'], }, ], linkType: 'Entry', @@ -104,23 +103,36 @@ module.exports = async function (migration, context) { .type('Array') .localized(false) .required(false) - .validations([]) + .validations([ + { + size: { + max: 1, + }, + }, + ]) .disabled(false) .omitted(false) .items({ type: 'Link', validations: [ { - linkContentType: ['c-link', 'c-editorial', 'c-image', 'c-media', 'c-video'], + linkContentType: ['c-editorial', 'c-image', 'c-media', 'c-video'], }, ], linkType: 'Entry', }); - mColumns.changeFieldControl('name', 'builtin', 'singleLine', {}); + mColumns.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Columns"', + }); + mColumns.changeFieldControl('theme', 'builtin', 'dropdown', {}); + mColumns.changeFieldControl('spacing', 'builtin', 'dropdown', {}); + mColumns.changeFieldControl('layout', 'builtin', 'dropdown', {}); + mColumns.changeFieldControl('column_left', 'builtin', 'entryLinksEditor', {}); + mColumns.changeFieldControl('column_right', 'builtin', 'entryLinksEditor', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1100000000005-create-m-text-migration.js b/packages/contentful-migrations/ui/1100000000005-create-m-text-migration.js index 718cc6a..180eae5 100644 --- a/packages/contentful-migrations/ui/1100000000005-create-m-text-migration.js +++ b/packages/contentful-migrations/ui/1100000000005-create-m-text-migration.js @@ -1,23 +1,20 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const mText = migration .createContentType('m-text') .name('Module: Text') .description('Content type for placing richtext') - .displayField('name'); + .displayField('internal_name'); + mText - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) - .required(false) + .required(true) .validations([]) .disabled(false) .omitted(false); @@ -33,11 +30,8 @@ module.exports = async function (migration, context) { in: ['light', 'dark'], }, ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mText .createField('spacing') @@ -59,6 +53,7 @@ module.exports = async function (migration, context) { mText.changeFieldControl('theme', 'builtin', 'dropdown', { helpText: 'light: Light background, dark text; dark: Dark background, light text.', }); + mText.changeFieldControl('spacing', 'builtin', 'dropdown', {}); mText @@ -78,26 +73,6 @@ module.exports = async function (migration, context) { .disabled(false) .omitted(false); - mText - .createField('headline') - .name('Headline') - .type('Symbol') - .localized(true) - .required(false) - .validations([]) - .disabled(false) - .omitted(false); - - mText - .createField('subline') - .name('Subline') - .type('Symbol') - .localized(true) - .required(false) - .validations([]) - .disabled(false) - .omitted(false); - mText .createField('body') .name('Text') @@ -117,7 +92,7 @@ module.exports = async function (migration, context) { nodes: { 'entry-hyperlink': [ { - linkContentType: ['page'], + linkContentType: ['t-page'], message: null, }, ], @@ -127,12 +102,15 @@ module.exports = async function (migration, context) { .disabled(false) .omitted(false); - mText.changeFieldControl('name', 'builtin', 'singleLine', {}); + mText.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Text"', + }); + mText.changeFieldControl('theme', 'builtin', 'dropdown', {}); + mText.changeFieldControl('spacing', 'builtin', 'dropdown', {}); + mText.changeFieldControl('layout', 'builtin', 'dropdown', {}); - mText.changeFieldControl('headline', 'builtin', 'singleLine', {}); - mText.changeFieldControl('subline', 'builtin', 'singleLine', {}); mText.changeFieldControl('body', 'builtin', 'richTextEditor', {}); -}; +}); diff --git a/packages/contentful-migrations/ui/1100000000006-create-m-editorial-migration.js b/packages/contentful-migrations/ui/1100000000006-create-m-editorial-migration.js deleted file mode 100644 index 52c9062..0000000 --- a/packages/contentful-migrations/ui/1100000000006-create-m-editorial-migration.js +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); - - const mEditorial = migration - .createContentType('m-editorial') - .name('Module: Editorial') - .description('Module wrapper for the editorial component') - .displayField('name'); - - mEditorial - .createField('name') - .name('Internal name') - .type('Symbol') - .localized(false) - .required(true) - .validations([]) - .disabled(false) - .omitted(false); - - mEditorial - .createField('theme') - .name('Theme') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['light', 'dark'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); - - mEditorial - .createField('spacing') - .name('Spacing') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['none', 'sm', 'md', 'lg'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'md', - }) - .disabled(false) - .omitted(false); - - mEditorial - .createField('layout') - .name('Layout') - .type('Symbol') - .localized(false) - .required(false) - .validations([ - { - in: ['teaser'], - }, - ]) - .defaultValue({ - [defaultLocale.code]: 'teaser', - }) - .disabled(false) - .omitted(false); - - mEditorial - .createField('body') - .name('Content') - .type('Link') - .localized(false) - .required(true) - .validations([ - { - linkContentType: ['c-editorial'], - }, - ]) - .disabled(false) - .omitted(false) - .linkType('Entry'); - - mEditorial.changeFieldControl('name', 'builtin', 'singleLine', {}); - mEditorial.changeFieldControl('theme', 'builtin', 'dropdown', {}); - mEditorial.changeFieldControl('spacing', 'builtin', 'dropdown', {}); - mEditorial.changeFieldControl('layout', 'builtin', 'dropdown', {}); - mEditorial.changeFieldControl('body', 'builtin', 'entryLinkEditor', {}); -}; diff --git a/packages/contentful-migrations/ui/1100000000006-create-m-hero-migration.js b/packages/contentful-migrations/ui/1100000000006-create-m-hero-migration.js new file mode 100644 index 0000000..2a3ccc6 --- /dev/null +++ b/packages/contentful-migrations/ui/1100000000006-create-m-hero-migration.js @@ -0,0 +1,158 @@ +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); + + const mHero = migration + .createContentType('m-hero') + .name('Module: Hero') + .description('A flexible module that can combine headlines, text, media and links') + .displayField('internal_name'); + + mHero + .createField('internal_name') + .name('Internal name') + .type('Symbol') + .localized(false) + .required(true) + .validations([]) + .disabled(false) + .omitted(false); + + mHero + .createField('theme') + .name('Theme') + .type('Symbol') + .localized(false) + .required(false) + .validations([ + { + in: ['light', 'dark'], + }, + ]) + .disabled(true) + .omitted(true); + + mHero + .createField('spacing') + .name('Spacing') + .type('Symbol') + .localized(false) + .required(false) + .validations([ + { + in: ['none', 'sm', 'md', 'lg'], + }, + ]) + .defaultValue({ + [defaultLocale.code]: 'md', + }) + .disabled(false) + .omitted(false); + + mHero + .createField('overline') + .name('Overline') + .type('Symbol') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false); + + mHero + .createField('headline') + .name('Headline') + .type('Symbol') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false); + + mHero + .createField('subline') + .name('Subline') + .type('Symbol') + .localized(true) + .required(false) + .validations([]) + .disabled(false) + .omitted(false); + + mHero + .createField('text') + .name('Text') + .type('RichText') + .localized(true) + .required(false) + .validations([ + { + enabledMarks: ['bold', 'italic', 'underline'], + message: 'Only bold, italic, and underline marks are allowed', + }, + { + enabledNodeTypes: ['blockquote'], + message: 'Only quote nodes are allowed', + }, + { + nodes: {}, + }, + ]) + .disabled(false) + .omitted(false); + + mHero + .createField('media') + .name('Media') + .type('Link') + .localized(false) + .required(false) + .validations([ + { + linkContentType: ['c-image', 'c-media'], + }, + ]) + .disabled(false) + .omitted(false) + .linkType('Entry'); + + mHero + .createField('links') + .name('Links') + .type('Array') + .localized(false) + .required(false) + .validations([]) + .disabled(false) + .omitted(false) + .items({ + type: 'Link', + validations: [ + { + linkContentType: ['c-link', 't-page'], + }, + ], + linkType: 'Entry', + }); + + mHero.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Hero"', + }); + + mHero.changeFieldControl('theme', 'builtin', 'dropdown', {}); + + mHero.changeFieldControl('spacing', 'builtin', 'dropdown', {}); + + mHero.changeFieldControl('overline', 'builtin', 'singleLine', {}); + + mHero.changeFieldControl('headline', 'builtin', 'singleLine', {}); + + mHero.changeFieldControl('subline', 'builtin', 'singleLine', {}); + + mHero.changeFieldControl('text', 'builtin', 'richTextEditor', {}); + + mHero.changeFieldControl('media', 'builtin', 'entryLinkEditor', {}); + + mHero.changeFieldControl('links', 'builtin', 'entryLinksEditor', {}); +}); diff --git a/packages/contentful-migrations/ui/1100000000007-create-m-media-migration.js b/packages/contentful-migrations/ui/1100000000007-create-m-media-migration.js index 90be378..1f3b6ee 100644 --- a/packages/contentful-migrations/ui/1100000000007-create-m-media-migration.js +++ b/packages/contentful-migrations/ui/1100000000007-create-m-media-migration.js @@ -1,19 +1,16 @@ -module.exports = async function (migration, context) { - const { makeRequest } = context; - // Fetch locale - const { items: locales } = await makeRequest({ - method: 'GET', - url: '/locales', - }); - const defaultLocale = locales.find((locale) => locale.default); +const { withHelpers } = require('@jungvonmatt/contentful-migrations'); + +module.exports = withHelpers(async (migration, _context, helpers) => { + const defaultLocale = await helpers.locale.getDefaultLocale(); const mMedia = migration .createContentType('m-media') .name('Module: Media') .description('Module wrapper for media component') - .displayField('name'); + .displayField('internal_name'); + mMedia - .createField('name') + .createField('internal_name') .name('Internal name') .type('Symbol') .localized(false) @@ -33,11 +30,8 @@ module.exports = async function (migration, context) { in: ['light', 'dark'], }, ]) - .defaultValue({ - [defaultLocale.code]: 'light', - }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mMedia .createField('spacing') @@ -70,8 +64,8 @@ module.exports = async function (migration, context) { .defaultValue({ [defaultLocale.code]: 'default', }) - .disabled(false) - .omitted(false); + .disabled(true) + .omitted(true); mMedia .createField('body') @@ -88,9 +82,15 @@ module.exports = async function (migration, context) { .omitted(false) .linkType('Entry'); - mMedia.changeFieldControl('name', 'builtin', 'singleLine', {}); + mMedia.changeFieldControl('internal_name', 'builtin', 'singleLine', { + helpText: 'e.g. "Home page > Media"', + }); + mMedia.changeFieldControl('theme', 'builtin', 'dropdown', {}); + mMedia.changeFieldControl('spacing', 'builtin', 'dropdown', {}); + mMedia.changeFieldControl('layout', 'builtin', 'dropdown', {}); + mMedia.changeFieldControl('body', 'builtin', 'entryLinkEditor', {}); -}; +}); diff --git a/packages/create-wekit-app/create-app.ts b/packages/create-wekit-app/create-app.ts index fafba30..39a9e4d 100644 --- a/packages/create-wekit-app/create-app.ts +++ b/packages/create-wekit-app/create-app.ts @@ -209,7 +209,7 @@ export async function createApp({ appPath }: { appPath: string }): Promise start: 'hugo server --disableFastRender', prebuild: 'npm run content', build: 'hugo --gc --minify --environment production', - 'watch:hugo': 'hugo server --watch --noHTTPCache', + 'watch:hugo': 'hugo server --watch --noHTTPCache', 'watch:content': 'cssg watch', watch: 'run-p watch:content watch:hugo', scaffold: 'node tools/hygen scaffold new', diff --git a/templates/app/config/_default/config.yaml b/templates/app/config/_default/config.yaml index 2cd701f..7d43509 100644 --- a/templates/app/config/_default/config.yaml +++ b/templates/app/config/_default/config.yaml @@ -1,4 +1,3 @@ -title: WEKit disableKinds: - taxonomy - term diff --git a/templates/app/contentful-ssg.config.ts b/templates/app/contentful-ssg.config.ts index f752b56..7f0fb9a 100644 --- a/templates/app/contentful-ssg.config.ts +++ b/templates/app/contentful-ssg.config.ts @@ -5,7 +5,15 @@ const config: Config = { richTextRenderer: false, preview: process.env.CONTENTFUL_USE_PREVIEW === 'true', plugins: [ - '@jungvonmatt/cssg-plugin-hugo', + [ + '@jungvonmatt/cssg-plugin-hugo', + { + menuRootTypes: ['page', 't-page'], + typeConfig: { + content: ['page', 't-*'], + }, + }, + ], [ '@jungvonmatt/cssg-plugin-assets', { diff --git a/templates/app/layouts/_default/baseof.html b/templates/app/layouts/_default/baseof.html index 725fc24..61fe0f8 100644 --- a/templates/app/layouts/_default/baseof.html +++ b/templates/app/layouts/_default/baseof.html @@ -1,10 +1,10 @@ {{- $settings := partial "utils/get-settings" . -}} {{- $params := merge site.Params (dict - "environment" (or (getenv "HUGO_ENVIRONMENT") hugo.Environment) + "environment" (or (getenv "HUGO_ENV") hugo.Environment) ) -}} -{{- with .Params.content -}} +{{- with .Params.sys -}} {{/* Prerender the page so we have the Scratch object available in "structure/head" to apply preload hints */}} {{/* Stored in a variable so we don't render the content to screen */}} {{ $tmp := partialCached "utils/get-partial.html" (dict diff --git a/templates/app/layouts/_default/section.html b/templates/app/layouts/_default/section.html index 711a87d..8a5e9d7 100644 --- a/templates/app/layouts/_default/section.html +++ b/templates/app/layouts/_default/section.html @@ -1,6 +1,6 @@ {{ define "main" }} {{- $pages := .Pages -}} - {{ with .Params.content }} + {{ with .Params.sys }} {{ partialCached "utils/get-partial" (dict "context" . "globals" $ diff --git a/templates/app/layouts/_default/single.html b/templates/app/layouts/_default/single.html index 6890ba7..95c2fa3 100644 --- a/templates/app/layouts/_default/single.html +++ b/templates/app/layouts/_default/single.html @@ -1,5 +1,5 @@ {{ define "main" }} - {{ with .Params.content }} + {{ with .Params.sys }} {{ partialCached "utils/get-partial" (dict "context" . "globals" $ diff --git a/templates/app/layouts/index.html b/templates/app/layouts/index.html index 96ed8d8..f8ac3d3 100644 --- a/templates/app/layouts/index.html +++ b/templates/app/layouts/index.html @@ -1,5 +1,5 @@ {{ define "main" }} - {{ with .Params.content }} + {{ with .Params.sys }} {{ partial "utils/get-partial" (dict "context" . "globals" $ diff --git a/templates/app/layouts/partials/structure/scripts.html b/templates/app/layouts/partials/structure/scripts.html index 96d0a31..70ab5d2 100644 --- a/templates/app/layouts/partials/structure/scripts.html +++ b/templates/app/layouts/partials/structure/scripts.html @@ -1,7 +1,7 @@ {{- $settings := partial "utils/get-settings" . -}} {{ $params := merge site.Params (dict - "environment" (or (getenv "HUGO_ENVIRONMENT") hugo.Environment) + "environment" (or (getenv "HUGO_ENV") hugo.Environment) ) }} {{ $js := resources.Get "js/main.js" | js.Build (dict diff --git a/templates/app/layouts/section.html b/templates/app/layouts/section.html index 6731a36..9adf109 100644 --- a/templates/app/layouts/section.html +++ b/templates/app/layouts/section.html @@ -5,7 +5,7 @@ {{ define "main" }} {{- $pages := .Pages -}} - {{ with .Params.content }} + {{ with .Params.sys }} {{ partial "utils/get-partial" (dict "context" . "globals" $ diff --git a/templates/app/package.json b/templates/app/package.json index f64087c..6bb1744 100644 --- a/templates/app/package.json +++ b/templates/app/package.json @@ -10,6 +10,9 @@ "clean": "del resources public \"data/*\" \"!data/storybook\"", "precontent": "npm run clean", "content": "cssg fetch", + "watch:hugo": "hugo server --watch --noHTTPCache", + "watch:content": "cssg watch", + "watch": "run-p watch:content watch:hugo", "prestart": "npm run content", "start": "hugo server --disableFastRender --log", "prebuild": "npm run content", @@ -47,10 +50,10 @@ "devDependencies": { "@babel/core": "^7.16.12", "@jungvonmatt/contentful-fakes": "^1.7.1", - "@jungvonmatt/contentful-migrations": "^5.3.0", - "@jungvonmatt/contentful-ssg": "^1.7.1", - "@jungvonmatt/cssg-plugin-assets": "^1.6.0", - "@jungvonmatt/cssg-plugin-hugo": "^1.7.2", + "@jungvonmatt/contentful-migrations": "^5.3.2", + "@jungvonmatt/contentful-ssg": "^1.9.0", + "@jungvonmatt/cssg-plugin-assets": "^1.9.0", + "@jungvonmatt/cssg-plugin-hugo": "^1.9.0", "@storybook/addon-a11y": "6.4.14", "@storybook/addon-actions": "6.4.14", "@storybook/addon-docs": "6.4.14", diff --git a/templates/theme-default/assets/scss/base/_fonts.scss b/templates/theme-default/assets/scss/base/_fonts.scss index cc5c845..dcac75b 100644 --- a/templates/theme-default/assets/scss/base/_fonts.scss +++ b/templates/theme-default/assets/scss/base/_fonts.scss @@ -1,5 +1,5 @@ @font-face { font-family: "Carloschi VF"; font-display: swap; - src: url("../fonts/CarloschiVF.woff2") format("woff2"); + src: url("/fonts/CarloschiVF.woff2") format("woff2"); } diff --git a/templates/theme-default/assets/scss/components/_c-editorial.scss b/templates/theme-default/assets/scss/components/_c-editorial.scss index 40a0aab..c205176 100644 --- a/templates/theme-default/assets/scss/components/_c-editorial.scss +++ b/templates/theme-default/assets/scss/components/_c-editorial.scss @@ -24,11 +24,9 @@ padding: var(--#{$spacing}-md) var(--#{$spacing}-md); } - &__title { - margin-top: 0; - } - - &__subtitle { + &__headline, + &__overline, + &__subline { margin-top: 0; } diff --git a/templates/theme-default/assets/scss/main.scss b/templates/theme-default/assets/scss/main.scss index 0683743..bf8d254 100644 --- a/templates/theme-default/assets/scss/main.scss +++ b/templates/theme-default/assets/scss/main.scss @@ -35,8 +35,8 @@ @import "modules/m-stage"; @import "modules/m-columns"; @import "modules/m-list"; -@import "modules/m-section"; @import "modules/m-media"; +@import "modules/m-hero"; // 8. Utilities @import "utilities/u-hidden"; diff --git a/templates/theme-default/assets/scss/modules/_m-footer.scss b/templates/theme-default/assets/scss/modules/_m-footer.scss index f694d8a..006fe0b 100644 --- a/templates/theme-default/assets/scss/modules/_m-footer.scss +++ b/templates/theme-default/assets/scss/modules/_m-footer.scss @@ -1,3 +1,8 @@ .m-footer { $self: &; + + margin-top: var(--#{$spacing}-lg); + padding-top: var(--#{$spacing}-md); + padding-bottom: var(--#{$spacing}-md); + border-top: 1px solid var(--#{$color}-gray-200); } diff --git a/templates/theme-default/assets/scss/modules/_m-hero.scss b/templates/theme-default/assets/scss/modules/_m-hero.scss new file mode 100644 index 0000000..17ec2c6 --- /dev/null +++ b/templates/theme-default/assets/scss/modules/_m-hero.scss @@ -0,0 +1,3 @@ +.m-hero { + $self: &; +} diff --git a/templates/theme-default/assets/scss/modules/_m-section.scss b/templates/theme-default/assets/scss/modules/_m-section.scss deleted file mode 100644 index e69de29..0000000 diff --git a/templates/theme-default/assets/scss/modules/_m-stage.scss b/templates/theme-default/assets/scss/modules/_m-stage.scss index 410f226..edd9e45 100644 --- a/templates/theme-default/assets/scss/modules/_m-stage.scss +++ b/templates/theme-default/assets/scss/modules/_m-stage.scss @@ -36,8 +36,9 @@ margin-bottom: 2rem; } - &__title, - &__subtitle, + &__headline, + &__overline, + &__subline, &__text { max-width: 600px; } diff --git a/templates/theme-default/content/docs/introduction/_index.md b/templates/theme-default/content/docs/introduction/_index.md index 136b1f0..04caf3d 100644 --- a/templates/theme-default/content/docs/introduction/_index.md +++ b/templates/theme-default/content/docs/introduction/_index.md @@ -6,11 +6,11 @@ title: Introduction # Kon'nichiwa 👋 -The WEKit Design System is a reusable component library that helps contributors build UIs faster. +This is the documentation of our component library. ## Design System 🎨 - `design-tokens` are platform-agnostic variables that represent the look and feel of your brand or product. Example: **colors** - `components` are the basic building blocks and the smallest functional unit. They are used in modules and cannot stand alone. Example: **c-button** - `modules` can be used as a full-width section within templates. They can contain components. Example: **m-stage** -- `templates` are the skeleton of a page and may contain modules. Example: **t-article** +- `templates` are the skeleton of a page and may contain modules. Example: **t-page** diff --git a/templates/theme-default/content/stories/t-default/_index.md b/templates/theme-default/content/stories/t-default/_index.md deleted file mode 100644 index 42443d6..0000000 --- a/templates/theme-default/content/stories/t-default/_index.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -type: storybook ---- diff --git a/templates/theme-default/content/stories/t-default/default.md b/templates/theme-default/content/stories/t-default/default.md deleted file mode 100644 index 750d94f..0000000 --- a/templates/theme-default/content/stories/t-default/default.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: storybook -includeInDocs: false -partials: - - id: default - content_type: t-default - ---- diff --git a/templates/theme-default/data/t-default/default.yaml b/templates/theme-default/data/t-default/default.yaml deleted file mode 100644 index 518de7b..0000000 --- a/templates/theme-default/data/t-default/default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -stage: - id: default - content_type: m-stage -sections: - - id: default - content_type: m-text diff --git a/templates/theme-default/layouts/partials/components/c-editorial.html b/templates/theme-default/layouts/partials/components/c-editorial.html index 2e980ba..9582659 100644 --- a/templates/theme-default/layouts/partials/components/c-editorial.html +++ b/templates/theme-default/layouts/partials/components/c-editorial.html @@ -8,13 +8,15 @@ "context" $params ) . -}} -{{- $title := $params.title -}} -{{- $subtitle := $params.subtitle -}} +{{- $overline := $params.overline -}} +{{- $headline := $params.headline -}} +{{- $subline := $params.subline -}} {{- $text := $params.text -}} {{- $media := $params.media -}} {{- $links := $params.links | default dict -}} -{{- $title_tag := $params.title_tag | default "h3" -}} -{{- $subtitle_tag := $params.subtitle_tag | default "h4" -}} +{{- $overline_tag := $params.overline_tag | default "div" -}} +{{- $headline_tag := $params.headline_tag | default "h3" -}} +{{- $subline_tag := $params.subline_tag | default "div" -}} {{- $layout := $params.layout | default "default" -}} {{- $partialPath := printf "components/c-editorial/%s.html" $layout -}} @@ -31,23 +33,34 @@ ) . -}} {{- end -}}
- {{- with $title -}} + {{- with $overline -}} {{- partial "components/c-headline" (dict "globals" $globals "context" (dict - "tag" "h2" - "class_name" "c-editorial__title" + "tag" $overline_tag + "class_name" "c-editorial__overline" "modifier" "" "text" . ) ) -}} {{- end -}} - {{- with $subtitle -}} + {{- with $headline -}} {{- partial "components/c-headline" (dict "globals" $globals "context" (dict - "tag" "h3" - "class_name" "c-editorial__subtitle" + "tag" $headline_tag + "class_name" "c-editorial__headline" + "modifier" "" + "text" . + ) + ) -}} + {{- end -}} + {{- with $subline -}} + {{- partial "components/c-headline" (dict + "globals" $globals + "context" (dict + "tag" $subline_tag + "class_name" "c-editorial__subline" "modifier" "" "text" . ) diff --git a/templates/theme-default/layouts/partials/components/c-link/attributes.html b/templates/theme-default/layouts/partials/components/c-link/attributes.html index 04b8763..8f281d5 100644 --- a/templates/theme-default/layouts/partials/components/c-link/attributes.html +++ b/templates/theme-default/layouts/partials/components/c-link/attributes.html @@ -27,12 +27,12 @@ {{- end -}} {{- with $params.content_type -}} - {{- if eq . "page" }} + {{- if hasPrefix . "t-" }} {{- $link = partial "utils/link" $params -}} {{- end -}} {{- end -}} {{- with $params.sys -}} - {{- if eq .content_type "page" }} + {{- if hasPrefix .content_type "t-" }} {{- $link = partial "utils/link" . -}} {{- end -}} {{- end -}} diff --git a/templates/theme-default/layouts/partials/components/c-module-header.html b/templates/theme-default/layouts/partials/components/c-module-header.html deleted file mode 100644 index 9f4bca7..0000000 --- a/templates/theme-default/layouts/partials/components/c-module-header.html +++ /dev/null @@ -1,46 +0,0 @@ -{{- $globals := .globals -}} -{{- $context := .context | default dict -}} -{{- $options := .options | default dict -}} -{{- $params := (merge $context $options) -}} - -{{- $class_name := partialCached "utils/get-class-names" (dict - "class" "c-module-header" - "context" $params -) . -}} - -{{- $title := $params.title -}} -{{- $subtitle := $params.subtitle -}} -{{- $text := $params.text -}} - - -
- {{- with $title -}} - {{- partial "components/c-headline" (dict - "globals" $globals - "context" (dict - "tag" "h2" - "text" . - "class_name" "c-module-header__title" - ) - ) -}} - {{- end -}} - {{- with $subtitle -}} - {{- partial "components/c-headline" (dict - "globals" $globals - "context" (dict - "tag" "h3" - "text" . - "class_name" "c-module-header__subtitle" - ) - ) -}} - {{- end -}} - {{- with $text -}} - {{- partial "components/c-text" (dict - "globals" $globals - "context" (dict - "text" . - "class_name" "c-module-header__text" - ) - ) -}} - {{- end -}} -
diff --git a/templates/theme-default/layouts/partials/modules/m-columns.html b/templates/theme-default/layouts/partials/modules/m-columns.html index 5748718..ed20f46 100644 --- a/templates/theme-default/layouts/partials/modules/m-columns.html +++ b/templates/theme-default/layouts/partials/modules/m-columns.html @@ -13,7 +13,7 @@ {{- $column_left := $params.column_left | default slice -}} {{- $column_right := $params.column_right | default slice -}} -
+
{{- range (slice $column_left $column_right) -}} diff --git a/templates/theme-default/layouts/partials/modules/m-editorial.html b/templates/theme-default/layouts/partials/modules/m-editorial.html deleted file mode 100644 index 29576d4..0000000 --- a/templates/theme-default/layouts/partials/modules/m-editorial.html +++ /dev/null @@ -1 +0,0 @@ -{{ partial "modules/m-section" . }} diff --git a/templates/theme-default/layouts/partials/modules/m-footer.html b/templates/theme-default/layouts/partials/modules/m-footer.html index fd3e77c..929cefa 100644 --- a/templates/theme-default/layouts/partials/modules/m-footer.html +++ b/templates/theme-default/layouts/partials/modules/m-footer.html @@ -1,19 +1,11 @@ {{- $globals := .globals -}} {{- $context := .context | default dict -}} -{{- $content := $context.content -}} - -{{- $theme := "" -}} -{{- with $content -}} - {{- with partial "utils/get-data" . -}} - {{- $theme = .theme -}} - {{- end -}} -{{- end -}} {{/* {{ partial "utils/dump" $context }} */}} -