@brightsideoy/kama 0.1.0-alpha.99 → 1.0.0-alpha.11
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/README.md +169 -0
- package/bin/cli.js +738 -261
- package/content/definitions/blocks/button.yaml +34 -0
- package/content/definitions/blocks/header.yaml +13 -0
- package/content/definitions/blocks/header_image.yaml +21 -0
- package/content/definitions/blocks/hero.yaml +28 -0
- package/content/definitions/blocks/html.yaml +13 -0
- package/content/definitions/blocks/image_card.yaml +56 -0
- package/content/definitions/blocks/node-list.yaml +61 -0
- package/content/definitions/blocks/single_image.yaml +27 -0
- package/content/definitions/blocks/text.yaml +15 -0
- package/content/definitions/channels/ecommerce.yaml +28 -0
- package/content/definitions/channels/website.yaml +41 -0
- package/{defaults → content}/definitions/field-sets/access.yaml +3 -5
- package/content/definitions/field-sets/channel-base.yaml +57 -0
- package/{defaults/definitions/field-sets/page-meta.yaml → content/definitions/field-sets/channel-seo.yaml} +3 -11
- package/content/definitions/field-sets/content-block.yaml +41 -0
- package/content/definitions/field-sets/page-base.yaml +44 -0
- package/content/definitions/field-sets/page-seo.yaml +34 -0
- package/{defaults → content}/definitions/field-sets/page-social.yaml +6 -8
- package/content/definitions/field-sets/schema-type.yaml +43 -0
- package/content/definitions/field-sets/tree-base.yaml +31 -0
- package/content/definitions/node-layouts/content.yml +12 -0
- package/{defaults → content}/definitions/node-layouts/landing-page.yml +8 -3
- package/{defaults → content}/definitions/node-layouts/single-column.yml +10 -5
- package/{defaults → content}/definitions/node-layouts/two-column.yml +14 -6
- package/content/definitions/nodes/address.yaml +40 -0
- package/content/definitions/nodes/article.yaml +65 -0
- package/content/definitions/nodes/event.yaml +55 -0
- package/content/definitions/nodes/external-link.yaml +29 -0
- package/content/definitions/nodes/page-skeleton.yaml +48 -0
- package/{defaults → content}/definitions/nodes/page.yaml +9 -20
- package/content/definitions/nodes/person.yaml +37 -0
- package/content/definitions/nodes/product.yaml +89 -0
- package/content/definitions/taxonomies/categories.yaml +15 -0
- package/content/definitions/taxonomies/tags.yaml +12 -0
- package/content/definitions/trees/navigation.yaml +24 -0
- package/definitions/editor/default.ts +1 -0
- package/dist/assets/index-BVkEzCNs.js +164 -0
- package/dist/assets/index-CGLx9oqF.css +1 -0
- package/dist/build-seed.js +486 -0
- package/dist/dist-kIJlDMvm.js +27162 -0
- package/dist/index.html +4 -2
- package/dist/index.js +26186 -8576
- package/dist/schema-compiler.js +48 -0
- package/documentation/SCHEMAS.md +182 -0
- package/package.json +24 -25
- package/schema.sql +67 -23
- package/templates/astro-starter/astro.config.mjs +27 -0
- package/templates/astro-starter/package.json.template +20 -0
- package/templates/astro-starter/public/robots.txt +23 -0
- package/templates/astro-starter/src/components/blocks/BlockRenderer.astro +143 -0
- package/templates/astro-starter/src/components/blocks/ColumnLayout.astro +67 -0
- package/templates/astro-starter/src/components/blocks/HeaderImage.astro +126 -0
- package/templates/astro-starter/src/components/blocks/Hero.astro +218 -0
- package/templates/astro-starter/src/components/blocks/HtmlBlock.astro +25 -0
- package/templates/astro-starter/src/components/blocks/ImageBlock.astro +91 -0
- package/templates/astro-starter/src/components/blocks/NodeList.astro +278 -0
- package/templates/astro-starter/src/components/blocks/TextBlock.astro +15 -0
- package/templates/astro-starter/src/components/global/Breadcrumb.astro +108 -0
- package/templates/astro-starter/src/components/global/Footer.astro +50 -0
- package/templates/astro-starter/src/components/global/Header.astro +171 -0
- package/templates/astro-starter/src/components/global/MetaHead.astro +266 -0
- package/templates/astro-starter/src/components/global/NavigationMenu.astro +413 -0
- package/templates/astro-starter/src/components/ui/KamaImage.astro +180 -0
- package/templates/astro-starter/src/layouts/SkeletonLayout.astro +56 -0
- package/templates/astro-starter/src/layouts/StandardLayout.astro +63 -0
- package/templates/astro-starter/src/lib/cms.ts +219 -0
- package/templates/astro-starter/src/lib/media/kama-image-service.ts +67 -0
- package/templates/astro-starter/src/lib/media/media-proxy.ts +148 -0
- package/templates/astro-starter/src/lib/media/media-url.ts +112 -0
- package/templates/astro-starter/src/middleware.ts +508 -0
- package/templates/astro-starter/src/pages/404.astro +46 -0
- package/templates/astro-starter/src/pages/[...slug].astro +318 -0
- package/templates/astro-starter/src/pages/api/load-nodes.ts +40 -0
- package/templates/astro-starter/src/pages/llms-full.txt.ts +171 -0
- package/templates/astro-starter/src/pages/llms.txt.ts +113 -0
- package/templates/astro-starter/src/pages/media/[...path].ts +14 -0
- package/templates/astro-starter/src/pages/partials/footer.astro +69 -0
- package/templates/astro-starter/src/pages/partials/nav.astro +141 -0
- package/templates/astro-starter/src/styles/standard-theme.css +157 -0
- package/templates/astro-starter/src/utils/tiptap.ts +113 -0
- package/templates/astro-starter/tsconfig.json +0 -0
- package/templates/kama-worker/index.js +19 -0
- package/templates/kama-worker/server.js +104 -0
- package/wrangler.json +22 -0
- package/defaults/definitions/blocks/button.yaml +0 -15
- package/defaults/definitions/blocks/header.yaml +0 -15
- package/defaults/definitions/blocks/header_image.yaml +0 -22
- package/defaults/definitions/blocks/hero.yaml +0 -27
- package/defaults/definitions/blocks/image_card.yaml +0 -57
- package/defaults/definitions/blocks/single_image.yaml +0 -28
- package/defaults/definitions/blocks/text.yaml +0 -16
- package/defaults/definitions/channels/ecommerce.yaml +0 -24
- package/defaults/definitions/channels/website.yaml +0 -32
- package/defaults/definitions/field-sets/channel-base.yaml +0 -31
- package/defaults/definitions/field-sets/content-block.yaml +0 -46
- package/defaults/definitions/field-sets/page-base.yaml +0 -49
- package/defaults/definitions/field-sets/tree-base.yaml +0 -31
- package/defaults/definitions/node-layouts/three-column.yml +0 -41
- package/defaults/definitions/nodes/address.yaml +0 -32
- package/defaults/definitions/nodes/article.yaml +0 -43
- package/defaults/definitions/nodes/event.yaml +0 -49
- package/defaults/definitions/nodes/external-link.yaml +0 -26
- package/defaults/definitions/nodes/person.yaml +0 -37
- package/defaults/definitions/nodes/product.yaml +0 -86
- package/defaults/definitions/trees/navigation.yaml +0 -29
- package/defaults/definitions/trees/social-links.yaml +0 -9
- package/definitions/_page.yaml +0 -52
- package/dist/assets/index-D6qQsWOj.js +0 -1392
- package/dist/assets/index-TdW5F0pX.css +0 -1
- package/dist/media/kama/2026/08/17a098c92bc54ea4b4441e531a34575b.jpg +0 -0
- package/dist/media/kama/2026/08/3e9ae457dd23461680cc699f42d07cf0.jpg +0 -0
- package/dist/media/kama/2026/08/8e5b3a2fd194459f9b962f8e12928bf0.jpg +0 -0
- package/dist/media/kama/2026/08/8ea5c21026cd4944bdf78c99fe2544a9.jpg +0 -0
- package/scripts/bundle-definitions.js +0 -176
- /package/{defaults → content}/definitions/block-layouts/three-column.yaml +0 -0
- /package/{defaults → content}/definitions/block-layouts/two-column.yaml +0 -0
- /package/{defaults → content}/definitions/field-sets/comments.yaml +0 -0
- /package/{defaults → content}/definitions/field-sets/visibility.yaml +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: button
|
|
2
|
+
label: Button
|
|
3
|
+
group: Content
|
|
4
|
+
|
|
5
|
+
fields:
|
|
6
|
+
buttonText:
|
|
7
|
+
label: Text
|
|
8
|
+
type: text
|
|
9
|
+
public: true
|
|
10
|
+
default: Button
|
|
11
|
+
buttonStyle:
|
|
12
|
+
label: Style
|
|
13
|
+
type: select
|
|
14
|
+
public: true
|
|
15
|
+
position: sidebar
|
|
16
|
+
options:
|
|
17
|
+
- label: Primary
|
|
18
|
+
value: primary
|
|
19
|
+
- label: Regular
|
|
20
|
+
value: regular
|
|
21
|
+
buttonLink:
|
|
22
|
+
label: Link
|
|
23
|
+
type: link
|
|
24
|
+
position: sidebar
|
|
25
|
+
allowedLinkTypes:
|
|
26
|
+
- tree
|
|
27
|
+
- node
|
|
28
|
+
- url
|
|
29
|
+
- file
|
|
30
|
+
- email
|
|
31
|
+
- telephone
|
|
32
|
+
|
|
33
|
+
tabs:
|
|
34
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
id: header_image
|
|
2
|
+
label: Header Image
|
|
3
|
+
group: Media
|
|
4
|
+
description: Image for page header.
|
|
5
|
+
|
|
6
|
+
fields:
|
|
7
|
+
image:
|
|
8
|
+
label: Image
|
|
9
|
+
type: asset
|
|
10
|
+
required: true
|
|
11
|
+
multiple: false
|
|
12
|
+
maxSizeMB: 15
|
|
13
|
+
allowedTypes: ["image/*"]
|
|
14
|
+
crops:
|
|
15
|
+
standard:
|
|
16
|
+
label: "Page header (21:9)"
|
|
17
|
+
aspectRatio: 2.333
|
|
18
|
+
public: true
|
|
19
|
+
|
|
20
|
+
tabs:
|
|
21
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: hero
|
|
2
|
+
label: Hero
|
|
3
|
+
group: Content
|
|
4
|
+
|
|
5
|
+
fields:
|
|
6
|
+
heroBadge:
|
|
7
|
+
type: text
|
|
8
|
+
label: Badge
|
|
9
|
+
public: true
|
|
10
|
+
|
|
11
|
+
heroTitle:
|
|
12
|
+
type: text
|
|
13
|
+
label: Title
|
|
14
|
+
public: true
|
|
15
|
+
|
|
16
|
+
heroSubTitle:
|
|
17
|
+
type: text
|
|
18
|
+
label: Sub-Title
|
|
19
|
+
public: true
|
|
20
|
+
|
|
21
|
+
headline:
|
|
22
|
+
type: richtext
|
|
23
|
+
editor: header
|
|
24
|
+
label: Headline
|
|
25
|
+
public: true
|
|
26
|
+
|
|
27
|
+
tabs:
|
|
28
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
id: image_card
|
|
2
|
+
label: Image Card
|
|
3
|
+
group: Content
|
|
4
|
+
description: A versatile card with an image, text, and a CTA button.
|
|
5
|
+
|
|
6
|
+
fields:
|
|
7
|
+
image:
|
|
8
|
+
label: Card Image
|
|
9
|
+
showLabel: false
|
|
10
|
+
type: asset
|
|
11
|
+
required: true
|
|
12
|
+
multiple: false
|
|
13
|
+
maxSizeMB: 15
|
|
14
|
+
maxPreviewWidth: 300px
|
|
15
|
+
allowedTypes: ["image/*"]
|
|
16
|
+
crops:
|
|
17
|
+
standard:
|
|
18
|
+
label: "Card Header (16:9)"
|
|
19
|
+
aspectRatio: 3.0
|
|
20
|
+
public: true
|
|
21
|
+
|
|
22
|
+
headline:
|
|
23
|
+
label: Headline
|
|
24
|
+
type: text
|
|
25
|
+
required: true
|
|
26
|
+
public: true
|
|
27
|
+
default: "Headline..."
|
|
28
|
+
|
|
29
|
+
summary:
|
|
30
|
+
label: Text
|
|
31
|
+
description: Keep it brief, 2-3 sentences max.
|
|
32
|
+
type: richtext
|
|
33
|
+
editor: minimal
|
|
34
|
+
public: true
|
|
35
|
+
default: "Card text content..."
|
|
36
|
+
|
|
37
|
+
link:
|
|
38
|
+
label: Link
|
|
39
|
+
type: link
|
|
40
|
+
allowedLinkTypes:
|
|
41
|
+
- tree
|
|
42
|
+
- node
|
|
43
|
+
- url
|
|
44
|
+
- file
|
|
45
|
+
- email
|
|
46
|
+
- telephone
|
|
47
|
+
|
|
48
|
+
linkText:
|
|
49
|
+
label: Button Text
|
|
50
|
+
type: text
|
|
51
|
+
description: "e.g., 'Read More' or 'Buy Now'"
|
|
52
|
+
default: "Read More"
|
|
53
|
+
public: true
|
|
54
|
+
|
|
55
|
+
tabs:
|
|
56
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
id: node-list
|
|
2
|
+
label: Node List
|
|
3
|
+
group: Content
|
|
4
|
+
description: Displays a dynamically filtered list of nodes (articles, events, etc.).
|
|
5
|
+
|
|
6
|
+
# 🎯 Blocks use a flat 'fields' list, no tabs/meta/hasCanvas required!
|
|
7
|
+
fields:
|
|
8
|
+
nodeType:
|
|
9
|
+
label: Content Types to Show
|
|
10
|
+
type: pills
|
|
11
|
+
public: true
|
|
12
|
+
multiple: true
|
|
13
|
+
default:
|
|
14
|
+
- article
|
|
15
|
+
options:
|
|
16
|
+
- label: Articles
|
|
17
|
+
value: article
|
|
18
|
+
- label: Events
|
|
19
|
+
value: event
|
|
20
|
+
- label: Products
|
|
21
|
+
value: product
|
|
22
|
+
- label: Addresses
|
|
23
|
+
value: address
|
|
24
|
+
- label: Persons
|
|
25
|
+
value: person
|
|
26
|
+
|
|
27
|
+
authors:
|
|
28
|
+
label: Filter by Authors
|
|
29
|
+
type: relation
|
|
30
|
+
nodeTypes: ["person"]
|
|
31
|
+
multiple: true
|
|
32
|
+
public: true
|
|
33
|
+
|
|
34
|
+
categories:
|
|
35
|
+
label: Filter by Categories
|
|
36
|
+
type: taxonomy
|
|
37
|
+
taxonomy: categories
|
|
38
|
+
multiple: true
|
|
39
|
+
public: true
|
|
40
|
+
|
|
41
|
+
tags:
|
|
42
|
+
label: Filter by Tags
|
|
43
|
+
type: taxonomy
|
|
44
|
+
taxonomy: tags
|
|
45
|
+
multiple: true
|
|
46
|
+
public: true
|
|
47
|
+
|
|
48
|
+
limit:
|
|
49
|
+
label: Number of Items to Show
|
|
50
|
+
type: number
|
|
51
|
+
default: 12
|
|
52
|
+
public: true
|
|
53
|
+
|
|
54
|
+
offset:
|
|
55
|
+
label: Skip First X Items
|
|
56
|
+
type: number
|
|
57
|
+
default: 0
|
|
58
|
+
public: true
|
|
59
|
+
|
|
60
|
+
tabs:
|
|
61
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: single_image
|
|
2
|
+
label: Single Image
|
|
3
|
+
group: Media
|
|
4
|
+
description: Just a single image block.
|
|
5
|
+
|
|
6
|
+
fields:
|
|
7
|
+
image:
|
|
8
|
+
label: Image
|
|
9
|
+
type: asset
|
|
10
|
+
required: true
|
|
11
|
+
multiple: false
|
|
12
|
+
maxSizeMB: 15
|
|
13
|
+
allowedTypes: ["image/*"]
|
|
14
|
+
public: true
|
|
15
|
+
|
|
16
|
+
link:
|
|
17
|
+
label: Link
|
|
18
|
+
type: link
|
|
19
|
+
position: sidebar
|
|
20
|
+
allowedLinkTypes:
|
|
21
|
+
- tree
|
|
22
|
+
- node
|
|
23
|
+
- url
|
|
24
|
+
- file
|
|
25
|
+
|
|
26
|
+
tabs:
|
|
27
|
+
access: !include ../field-sets/access.yaml
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: ecommerce
|
|
2
|
+
label: "E-Commerce"
|
|
3
|
+
|
|
4
|
+
tabs:
|
|
5
|
+
settings:
|
|
6
|
+
label: "Channel"
|
|
7
|
+
fields:
|
|
8
|
+
fieldSet: channel-base
|
|
9
|
+
currency:
|
|
10
|
+
label: Default Currency
|
|
11
|
+
type: select
|
|
12
|
+
default: "EUR"
|
|
13
|
+
options:
|
|
14
|
+
- "EUR"
|
|
15
|
+
- "USD"
|
|
16
|
+
- "GBP"
|
|
17
|
+
checkoutUrl:
|
|
18
|
+
label: Checkout Endpoint URL
|
|
19
|
+
type: text
|
|
20
|
+
public: true
|
|
21
|
+
meta:
|
|
22
|
+
label: "SEO"
|
|
23
|
+
fields:
|
|
24
|
+
fieldSet: channel-seo
|
|
25
|
+
access:
|
|
26
|
+
label: "Access"
|
|
27
|
+
fields:
|
|
28
|
+
fieldSet: access
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: website
|
|
2
|
+
label: "Website"
|
|
3
|
+
|
|
4
|
+
# 🎯 2. Mounts the access tab automatically (engine natively resolves fieldSets into tabs if configured in the field set)
|
|
5
|
+
fieldSets:
|
|
6
|
+
- access
|
|
7
|
+
|
|
8
|
+
tabs:
|
|
9
|
+
settings:
|
|
10
|
+
label: "Channel"
|
|
11
|
+
fields:
|
|
12
|
+
# 🎯 1. Natively merges channel-base fields into this tab
|
|
13
|
+
fieldSet: channel-base
|
|
14
|
+
design:
|
|
15
|
+
label: "Design"
|
|
16
|
+
fields:
|
|
17
|
+
favicon:
|
|
18
|
+
label: "Favicon"
|
|
19
|
+
type: image
|
|
20
|
+
maxPreviewWidth: 200px
|
|
21
|
+
multiple: true
|
|
22
|
+
allowedTypes: ["image/png", "image/x-icon", "image/svg"]
|
|
23
|
+
public: true
|
|
24
|
+
logoText:
|
|
25
|
+
label: Logo Text
|
|
26
|
+
type: text
|
|
27
|
+
required: false
|
|
28
|
+
public: true
|
|
29
|
+
|
|
30
|
+
logoImage:
|
|
31
|
+
label: "Logo Image"
|
|
32
|
+
type: image
|
|
33
|
+
maxPreviewWidth: 300px
|
|
34
|
+
multiple: false
|
|
35
|
+
allowedTypes: ["image/svg"]
|
|
36
|
+
public: true
|
|
37
|
+
|
|
38
|
+
meta:
|
|
39
|
+
label: "SEO"
|
|
40
|
+
fields:
|
|
41
|
+
fieldSet: channel-seo
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
id: channel-base
|
|
2
|
+
label: Channel Base Properties
|
|
3
|
+
|
|
4
|
+
fields:
|
|
5
|
+
id:
|
|
6
|
+
label: Internal ID
|
|
7
|
+
type: hidden
|
|
8
|
+
dbType: integer
|
|
9
|
+
primaryKey: true
|
|
10
|
+
|
|
11
|
+
label:
|
|
12
|
+
label: Channel Name
|
|
13
|
+
type: text
|
|
14
|
+
dbType: text
|
|
15
|
+
public: true
|
|
16
|
+
rules:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
key:
|
|
20
|
+
label: "API Identifier"
|
|
21
|
+
type: slug
|
|
22
|
+
dbType: text
|
|
23
|
+
public: true
|
|
24
|
+
index: true
|
|
25
|
+
linkedTo: label
|
|
26
|
+
placeholder: "e.g. main-site, store-eu"
|
|
27
|
+
rules:
|
|
28
|
+
required: true
|
|
29
|
+
unique: true
|
|
30
|
+
pattern: "^[a-z0-9-_]+$"
|
|
31
|
+
customMessage: "API key must be unique and contain only lowercase letters, numbers, hyphens, or underscores."
|
|
32
|
+
|
|
33
|
+
baseUrl:
|
|
34
|
+
label: Base URL
|
|
35
|
+
type: text
|
|
36
|
+
dbType: text
|
|
37
|
+
public: true
|
|
38
|
+
|
|
39
|
+
defaultLanguage:
|
|
40
|
+
label: Default Language
|
|
41
|
+
type: language-select
|
|
42
|
+
dbType: text
|
|
43
|
+
public: true
|
|
44
|
+
|
|
45
|
+
supportedLanguages:
|
|
46
|
+
label: Supported Languages
|
|
47
|
+
type: language-select
|
|
48
|
+
multiple: true
|
|
49
|
+
dbType: json
|
|
50
|
+
public: true
|
|
51
|
+
|
|
52
|
+
channelRoot:
|
|
53
|
+
label: Channel Root
|
|
54
|
+
type: link
|
|
55
|
+
public: true
|
|
56
|
+
allowedLinkTypes:
|
|
57
|
+
- node
|
|
@@ -1,29 +1,21 @@
|
|
|
1
|
-
tab:
|
|
2
|
-
id: page-meta
|
|
3
|
-
label: "Meta"
|
|
4
|
-
|
|
5
1
|
fields:
|
|
6
2
|
metaDescription:
|
|
7
3
|
label: Meta Description
|
|
8
4
|
type: textarea
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
metaKeywords:
|
|
12
|
-
label: Meta Keywords
|
|
13
|
-
type: textarea
|
|
5
|
+
dbType: text
|
|
14
6
|
required: false
|
|
15
7
|
public: true
|
|
16
8
|
|
|
17
9
|
titlePrefix:
|
|
18
10
|
label: Title Prefix
|
|
19
11
|
type: text
|
|
12
|
+
dbType: text
|
|
20
13
|
required: false
|
|
21
14
|
public: true
|
|
22
|
-
inherits: titlePrefix
|
|
23
15
|
|
|
24
16
|
titleSuffix:
|
|
25
17
|
label: Title Suffix
|
|
26
18
|
type: text
|
|
19
|
+
dbType: text
|
|
27
20
|
required: false
|
|
28
21
|
public: true
|
|
29
|
-
inherits: titleSuffix
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id:
|
|
2
|
+
label: ID
|
|
3
|
+
type: hidden
|
|
4
|
+
dbType: text
|
|
5
|
+
primaryKey: true
|
|
6
|
+
|
|
7
|
+
contentId:
|
|
8
|
+
label: Node ID
|
|
9
|
+
type: text
|
|
10
|
+
dbType: text
|
|
11
|
+
rules:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
sortOrder:
|
|
15
|
+
label: Sort Order
|
|
16
|
+
type: number
|
|
17
|
+
dbType: integer
|
|
18
|
+
rules:
|
|
19
|
+
required: true
|
|
20
|
+
|
|
21
|
+
elementType:
|
|
22
|
+
label: Element Component Type
|
|
23
|
+
type: text
|
|
24
|
+
dbType: text
|
|
25
|
+
rules:
|
|
26
|
+
required: true
|
|
27
|
+
|
|
28
|
+
dataJson:
|
|
29
|
+
label: Content Field Data
|
|
30
|
+
type: json
|
|
31
|
+
dbType: json
|
|
32
|
+
rules:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
region:
|
|
36
|
+
label: Grid Region
|
|
37
|
+
type: text
|
|
38
|
+
dbType: text
|
|
39
|
+
default: "main"
|
|
40
|
+
rules:
|
|
41
|
+
required: true
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
id:
|
|
2
|
+
label: ID
|
|
3
|
+
type: hidden
|
|
4
|
+
dbType: text
|
|
5
|
+
primaryKey: true
|
|
6
|
+
public: true
|
|
7
|
+
|
|
8
|
+
channelId:
|
|
9
|
+
label: Channel ID
|
|
10
|
+
type: hidden
|
|
11
|
+
dbType: text
|
|
12
|
+
public: true
|
|
13
|
+
index: true
|
|
14
|
+
|
|
15
|
+
nodeType:
|
|
16
|
+
label: Type
|
|
17
|
+
type: select
|
|
18
|
+
dbType: text
|
|
19
|
+
default: "page"
|
|
20
|
+
public: true
|
|
21
|
+
position: sidebar
|
|
22
|
+
rules:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
title:
|
|
26
|
+
label: Page Title
|
|
27
|
+
type: text
|
|
28
|
+
dbType: text
|
|
29
|
+
public: true
|
|
30
|
+
rules:
|
|
31
|
+
required: true
|
|
32
|
+
|
|
33
|
+
slug:
|
|
34
|
+
label: URL Slug
|
|
35
|
+
type: slug
|
|
36
|
+
linkedTo: title
|
|
37
|
+
dbType: text
|
|
38
|
+
public: true
|
|
39
|
+
index: true
|
|
40
|
+
rules:
|
|
41
|
+
required: true
|
|
42
|
+
uniqueSibling: true
|
|
43
|
+
pattern: "^[a-z0-9_-]+$"
|
|
44
|
+
customMessage: "Slug can only contain lowercase letters, numbers, hyphens, and underscores."
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
label: "SEO"
|
|
2
|
+
fields:
|
|
3
|
+
# 🎯 1. Include the single field definition file
|
|
4
|
+
- schemaType: !include ./schema-type.yaml
|
|
5
|
+
|
|
6
|
+
# 🎯 2. Override the default for this specific section
|
|
7
|
+
- schemaType:
|
|
8
|
+
default: "WebPage"
|
|
9
|
+
|
|
10
|
+
# 🎯 3. Standard inline fields as sequence array items
|
|
11
|
+
- metaDescription:
|
|
12
|
+
label: Meta Description
|
|
13
|
+
type: textarea
|
|
14
|
+
public: true
|
|
15
|
+
|
|
16
|
+
- metaKeywords:
|
|
17
|
+
label: Meta Keywords
|
|
18
|
+
type: textarea
|
|
19
|
+
required: false
|
|
20
|
+
public: true
|
|
21
|
+
|
|
22
|
+
- titlePrefix:
|
|
23
|
+
label: Title Prefix
|
|
24
|
+
type: text
|
|
25
|
+
required: false
|
|
26
|
+
public: true
|
|
27
|
+
inherits: titlePrefix
|
|
28
|
+
|
|
29
|
+
- titleSuffix:
|
|
30
|
+
label: Title Suffix
|
|
31
|
+
type: text
|
|
32
|
+
required: false
|
|
33
|
+
public: true
|
|
34
|
+
inherits: titleSuffix
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
id: page-social
|
|
3
|
-
label: "Social"
|
|
1
|
+
label: "Social"
|
|
4
2
|
|
|
5
3
|
fields:
|
|
6
4
|
# --- Facebook / Open Graph Texts ---
|
|
@@ -14,7 +12,7 @@ fields:
|
|
|
14
12
|
fbDescription:
|
|
15
13
|
label: "Facebook Description (og:description)"
|
|
16
14
|
type: textarea
|
|
17
|
-
inherits: metaDescription # 🔗
|
|
15
|
+
inherits: metaDescription # 🔗 Syncs from main SEO description
|
|
18
16
|
public: true
|
|
19
17
|
description: "A 2-4 sentence summary of the content."
|
|
20
18
|
|
|
@@ -22,7 +20,7 @@ fields:
|
|
|
22
20
|
xTitle:
|
|
23
21
|
label: "X Title (twitter:title)"
|
|
24
22
|
type: text
|
|
25
|
-
inherits: fbTitle # 🔗 Cascades from Facebook Title
|
|
23
|
+
inherits: fbTitle # 🔗 Cascades from Facebook Title
|
|
26
24
|
public: true
|
|
27
25
|
description: "Keep it concise (under 70 characters is ideal for X)."
|
|
28
26
|
|
|
@@ -51,7 +49,7 @@ fields:
|
|
|
51
49
|
label: "Facebook / LinkedIn Image"
|
|
52
50
|
type: image
|
|
53
51
|
maxPreviewWidth: 620px
|
|
54
|
-
inherits: socialImage
|
|
52
|
+
inherits: socialImage
|
|
55
53
|
public: true
|
|
56
54
|
description: "Auto-cropped to 1.91:1. Drop a new image here to override."
|
|
57
55
|
crops:
|
|
@@ -61,7 +59,7 @@ fields:
|
|
|
61
59
|
label: "X (Twitter) Image"
|
|
62
60
|
type: image
|
|
63
61
|
maxPreviewWidth: 620px
|
|
64
|
-
inherits: socialImage
|
|
62
|
+
inherits: socialImage
|
|
65
63
|
public: true
|
|
66
64
|
description: "Auto-cropped to 2:1. Drop a new image here to override."
|
|
67
65
|
crops:
|
|
@@ -71,7 +69,7 @@ fields:
|
|
|
71
69
|
label: "Messaging / Square Image"
|
|
72
70
|
type: image
|
|
73
71
|
maxPreviewWidth: 620px
|
|
74
|
-
inherits: socialImage
|
|
72
|
+
inherits: socialImage
|
|
75
73
|
public: true
|
|
76
74
|
description: "Auto-cropped to 1:1. Drop a new image here to override."
|
|
77
75
|
crops:
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
type: select
|
|
2
|
+
label: "Schema.org Entity Type"
|
|
3
|
+
default: "WebPage"
|
|
4
|
+
public: true
|
|
5
|
+
options:
|
|
6
|
+
- label: "Standard Pages"
|
|
7
|
+
choices:
|
|
8
|
+
- label: "Standard Web Page"
|
|
9
|
+
value: "WebPage"
|
|
10
|
+
- label: "About Page"
|
|
11
|
+
value: "AboutPage"
|
|
12
|
+
- label: "Contact Page"
|
|
13
|
+
value: "ContactPage"
|
|
14
|
+
- label: "FAQ / Help Page"
|
|
15
|
+
value: "FAQPage"
|
|
16
|
+
- label: "Directory / Collection Page"
|
|
17
|
+
value: "CollectionPage"
|
|
18
|
+
|
|
19
|
+
- label: "Editorial & Articles"
|
|
20
|
+
choices:
|
|
21
|
+
- label: "General Article"
|
|
22
|
+
value: "Article"
|
|
23
|
+
- label: "Blog Post"
|
|
24
|
+
value: "BlogPosting"
|
|
25
|
+
- label: "Technical Docs / Guide"
|
|
26
|
+
value: "TechArticle"
|
|
27
|
+
- label: "News / Press Release"
|
|
28
|
+
value: "NewsArticle"
|
|
29
|
+
- label: "Whitepaper / Report"
|
|
30
|
+
value: "Report"
|
|
31
|
+
|
|
32
|
+
- label: "Commercial & Intent"
|
|
33
|
+
choices:
|
|
34
|
+
- label: "Service / Capability"
|
|
35
|
+
value: "Service"
|
|
36
|
+
- label: "Product / E-commerce Item"
|
|
37
|
+
value: "Product"
|
|
38
|
+
- label: "Educational Course"
|
|
39
|
+
value: "Course"
|
|
40
|
+
- label: "Event / Webinar"
|
|
41
|
+
value: "Event"
|
|
42
|
+
- label: "Job Career Listing"
|
|
43
|
+
value: "JobPosting"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: tree-base
|
|
2
|
+
label: Tree Base Properties
|
|
3
|
+
|
|
4
|
+
fields:
|
|
5
|
+
id:
|
|
6
|
+
label: Internal ID
|
|
7
|
+
type: hidden
|
|
8
|
+
dbType: integer
|
|
9
|
+
primaryKey: true
|
|
10
|
+
|
|
11
|
+
label:
|
|
12
|
+
label: "Label"
|
|
13
|
+
type: text
|
|
14
|
+
dbType: text
|
|
15
|
+
public: true
|
|
16
|
+
rules:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
key:
|
|
20
|
+
label: "API Identifier"
|
|
21
|
+
type: slug
|
|
22
|
+
dbType: text
|
|
23
|
+
index: true
|
|
24
|
+
public: true
|
|
25
|
+
linkedTo: label
|
|
26
|
+
placeholder: "e.g. main-site, store-eu"
|
|
27
|
+
rules:
|
|
28
|
+
required: true
|
|
29
|
+
unique: true
|
|
30
|
+
pattern: "^[a-z0-9-_]+$"
|
|
31
|
+
customMessage: "API key must be unique and contain only lowercase letters, numbers, hyphens, or underscores."
|