@brightsideoy/kama 0.1.0-alpha.99 → 1.0.0-alpha.3

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.
Files changed (116) hide show
  1. package/README.md +169 -0
  2. package/bin/cli.js +775 -251
  3. package/content/definitions/blocks/button.yaml +24 -0
  4. package/content/definitions/blocks/header.yaml +13 -0
  5. package/content/definitions/blocks/header_image.yaml +21 -0
  6. package/content/definitions/blocks/hero.yaml +28 -0
  7. package/content/definitions/blocks/html.yaml +13 -0
  8. package/content/definitions/blocks/image_card.yaml +56 -0
  9. package/content/definitions/blocks/single_image.yaml +27 -0
  10. package/content/definitions/blocks/text.yaml +15 -0
  11. package/content/definitions/channels/ecommerce.yaml +28 -0
  12. package/content/definitions/channels/website.yaml +41 -0
  13. package/{defaults → content}/definitions/field-sets/access.yaml +3 -5
  14. package/content/definitions/field-sets/channel-base.yaml +57 -0
  15. package/{defaults/definitions/field-sets/page-meta.yaml → content/definitions/field-sets/channel-seo.yaml} +3 -11
  16. package/content/definitions/field-sets/content-block.yaml +41 -0
  17. package/content/definitions/field-sets/page-base.yaml +44 -0
  18. package/content/definitions/field-sets/page-seo.yaml +34 -0
  19. package/{defaults → content}/definitions/field-sets/page-social.yaml +6 -8
  20. package/content/definitions/field-sets/schema-type.yaml +43 -0
  21. package/content/definitions/field-sets/tree-base.yaml +31 -0
  22. package/content/definitions/node-layouts/content.yml +12 -0
  23. package/{defaults → content}/definitions/node-layouts/landing-page.yml +8 -3
  24. package/{defaults → content}/definitions/node-layouts/single-column.yml +10 -5
  25. package/{defaults → content}/definitions/node-layouts/two-column.yml +14 -6
  26. package/content/definitions/nodes/address.yaml +40 -0
  27. package/content/definitions/nodes/article.yaml +49 -0
  28. package/content/definitions/nodes/event.yaml +55 -0
  29. package/content/definitions/nodes/external-link.yaml +29 -0
  30. package/content/definitions/nodes/page-skeleton.yaml +48 -0
  31. package/{defaults → content}/definitions/nodes/page.yaml +9 -20
  32. package/content/definitions/nodes/person.yaml +37 -0
  33. package/content/definitions/nodes/product.yaml +89 -0
  34. package/content/definitions/taxonomies/categories.yaml +15 -0
  35. package/content/definitions/taxonomies/tags.yaml +12 -0
  36. package/content/definitions/trees/navigation.yaml +24 -0
  37. package/definitions/editor/default.ts +1 -0
  38. package/dist/assets/index-C3LzwJjY.css +1 -0
  39. package/dist/assets/index-DhguVxzs.js +164 -0
  40. package/dist/dist-cK3xGnBZ.js +26457 -0
  41. package/dist/index.html +4 -2
  42. package/dist/index.js +24028 -7125
  43. package/dist/schema-compiler.js +48 -0
  44. package/documentation/SCHEMAS.md +182 -0
  45. package/package.json +20 -24
  46. package/schema.sql +55 -23
  47. package/templates/astro-starter/astro.config.mjs +27 -0
  48. package/templates/astro-starter/package.json.template +20 -0
  49. package/templates/astro-starter/public/robots.txt +23 -0
  50. package/templates/astro-starter/src/components/blocks/BlockRenderer.astro +134 -0
  51. package/templates/astro-starter/src/components/blocks/ColumnLayout.astro +67 -0
  52. package/templates/astro-starter/src/components/blocks/HeaderImage.astro +132 -0
  53. package/templates/astro-starter/src/components/blocks/Hero.astro +218 -0
  54. package/templates/astro-starter/src/components/blocks/HtmlBlock.astro +25 -0
  55. package/templates/astro-starter/src/components/blocks/ImageBlock.astro +92 -0
  56. package/templates/astro-starter/src/components/blocks/TextBlock.astro +15 -0
  57. package/templates/astro-starter/src/components/global/Breadcrumb.astro +108 -0
  58. package/templates/astro-starter/src/components/global/Footer.astro +50 -0
  59. package/templates/astro-starter/src/components/global/Header.astro +171 -0
  60. package/templates/astro-starter/src/components/global/MetaHead.astro +266 -0
  61. package/templates/astro-starter/src/components/global/NavigationMenu.astro +413 -0
  62. package/templates/astro-starter/src/components/ui/KamaImage.astro +172 -0
  63. package/templates/astro-starter/src/layouts/SkeletonLayout.astro +56 -0
  64. package/templates/astro-starter/src/layouts/StandardLayout.astro +62 -0
  65. package/templates/astro-starter/src/lib/cms.ts +217 -0
  66. package/templates/astro-starter/src/lib/media/kama-image-service.ts +56 -0
  67. package/templates/astro-starter/src/lib/media/media-proxy.ts +129 -0
  68. package/templates/astro-starter/src/lib/media/media-url.ts +98 -0
  69. package/templates/astro-starter/src/middleware.ts +435 -0
  70. package/templates/astro-starter/src/pages/404.astro +46 -0
  71. package/templates/astro-starter/src/pages/[...slug].astro +243 -0
  72. package/templates/astro-starter/src/pages/llms-full.txt.ts +171 -0
  73. package/templates/astro-starter/src/pages/llms.txt.ts +113 -0
  74. package/templates/astro-starter/src/pages/media/[...path].ts +14 -0
  75. package/templates/astro-starter/src/pages/partials/footer.astro +69 -0
  76. package/templates/astro-starter/src/pages/partials/nav.astro +141 -0
  77. package/templates/astro-starter/src/styles/standard-theme.css +157 -0
  78. package/templates/astro-starter/src/utils/tiptap.ts +113 -0
  79. package/templates/astro-starter/tsconfig.json +0 -0
  80. package/templates/kama-worker/index.js +19 -0
  81. package/templates/kama-worker/server.js +104 -0
  82. package/wrangler.json +22 -0
  83. package/defaults/definitions/blocks/button.yaml +0 -15
  84. package/defaults/definitions/blocks/header.yaml +0 -15
  85. package/defaults/definitions/blocks/header_image.yaml +0 -22
  86. package/defaults/definitions/blocks/hero.yaml +0 -27
  87. package/defaults/definitions/blocks/image_card.yaml +0 -57
  88. package/defaults/definitions/blocks/single_image.yaml +0 -28
  89. package/defaults/definitions/blocks/text.yaml +0 -16
  90. package/defaults/definitions/channels/ecommerce.yaml +0 -24
  91. package/defaults/definitions/channels/website.yaml +0 -32
  92. package/defaults/definitions/field-sets/channel-base.yaml +0 -31
  93. package/defaults/definitions/field-sets/content-block.yaml +0 -46
  94. package/defaults/definitions/field-sets/page-base.yaml +0 -49
  95. package/defaults/definitions/field-sets/tree-base.yaml +0 -31
  96. package/defaults/definitions/node-layouts/three-column.yml +0 -41
  97. package/defaults/definitions/nodes/address.yaml +0 -32
  98. package/defaults/definitions/nodes/article.yaml +0 -43
  99. package/defaults/definitions/nodes/event.yaml +0 -49
  100. package/defaults/definitions/nodes/external-link.yaml +0 -26
  101. package/defaults/definitions/nodes/person.yaml +0 -37
  102. package/defaults/definitions/nodes/product.yaml +0 -86
  103. package/defaults/definitions/trees/navigation.yaml +0 -29
  104. package/defaults/definitions/trees/social-links.yaml +0 -9
  105. package/definitions/_page.yaml +0 -52
  106. package/dist/assets/index-D6qQsWOj.js +0 -1392
  107. package/dist/assets/index-TdW5F0pX.css +0 -1
  108. package/dist/media/kama/2026/08/17a098c92bc54ea4b4441e531a34575b.jpg +0 -0
  109. package/dist/media/kama/2026/08/3e9ae457dd23461680cc699f42d07cf0.jpg +0 -0
  110. package/dist/media/kama/2026/08/8e5b3a2fd194459f9b962f8e12928bf0.jpg +0 -0
  111. package/dist/media/kama/2026/08/8ea5c21026cd4944bdf78c99fe2544a9.jpg +0 -0
  112. package/scripts/bundle-definitions.js +0 -176
  113. /package/{defaults → content}/definitions/block-layouts/three-column.yaml +0 -0
  114. /package/{defaults → content}/definitions/block-layouts/two-column.yaml +0 -0
  115. /package/{defaults → content}/definitions/field-sets/comments.yaml +0 -0
  116. /package/{defaults → content}/definitions/field-sets/visibility.yaml +0 -0
@@ -0,0 +1,24 @@
1
+ id: button
2
+ label: Button
3
+ group: Content
4
+ description: A customizable button link.
5
+
6
+ fields:
7
+ text:
8
+ label: Text
9
+ type: richtext
10
+ editor: button
11
+ public: true
12
+ link:
13
+ label: Link
14
+ type: link
15
+ position: sidebar
16
+ allowedLinkTypes:
17
+ - tree
18
+ - node
19
+ - url
20
+ - file
21
+ - email
22
+ - telephone
23
+ tabs:
24
+ access: !include ../field-sets/access.yaml
@@ -0,0 +1,13 @@
1
+ id: header
2
+ label: Header
3
+ group: Content
4
+
5
+ fields:
6
+ headline:
7
+ type: richtext
8
+ editor: header
9
+ label: Headline
10
+ public: true
11
+
12
+ tabs:
13
+ 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,13 @@
1
+ id: html
2
+ label: HTML
3
+ group: Content
4
+
5
+ fields:
6
+ body:
7
+ label: HTML
8
+ type: textarea
9
+ public: true
10
+ editor: false
11
+
12
+ tabs:
13
+ 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,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,15 @@
1
+ id: text
2
+ label: Text
3
+ group: Content
4
+ description: Paragraph body
5
+
6
+ # Main content fields
7
+ fields:
8
+ body:
9
+ label: Text
10
+ type: richtext
11
+ editor: default
12
+ allowSplit: true
13
+ public: true
14
+
15
+ 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
@@ -1,9 +1,7 @@
1
- tab:
2
- id: access
3
- label: "Access"
4
-
1
+ # 📂 content/definitions/field-sets/access.yaml
2
+ label: "Access"
5
3
  fields:
6
- isHidden: # 🎯 Renamed from 'hidden' to match the DB column
4
+ isHidden:
7
5
  type: boolean
8
6
  label: Hidden
9
7
  default: false
@@ -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
- public: true
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
- tab:
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 # 🔗 Or whatever your main SEO description field is named
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 (which cascades from SEO)
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 # 🔗 Syncs from 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 # 🔗 Syncs from 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 # 🔗 Syncs from 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."
@@ -0,0 +1,12 @@
1
+ id: content
2
+ label: Content
3
+
4
+ layout:
5
+ columns: "1fr"
6
+ areas:
7
+ - ["content"]
8
+
9
+ regions:
10
+ content:
11
+ label: Content
12
+ allowedBlocks: "*"
@@ -5,7 +5,6 @@ layout:
5
5
  columns: "1fr"
6
6
  areas:
7
7
  - ["header"]
8
- - ["hero"]
9
8
  - ["content"]
10
9
  - ["footer"]
11
10
 
@@ -13,10 +12,16 @@ regions:
13
12
  header:
14
13
  label: Header
15
14
  inherit: parent
16
- hero:
17
- label: Hero / Top Banner
15
+ allowedBlocks: "*"
18
16
  content:
19
17
  label: Content
18
+ allowedBlocks: "*"
20
19
  footer:
21
20
  label: Footer
22
21
  inherit: parent
22
+ purgeTargets:
23
+ - "/partials/footer"
24
+ disallowedBlocks:
25
+ - hero
26
+ - image_card
27
+ - header_image
@@ -21,18 +21,23 @@ regions:
21
21
  allowedTypes: ["image/*"]
22
22
  crops:
23
23
  standard:
24
- label: "Desktop Header (4:1)"
25
- aspectRatio: 4.0
24
+ label: "Desktop Header (3:1)"
25
+ aspectRatio: 3.0
26
26
  tablet:
27
27
  label: "Tablet Header (2:1)"
28
28
  aspectRatio: 2.0
29
- mobile:
30
- label: "Mobile Header (4:3)"
31
- aspectRatio: 1.33
32
29
  public: true
33
30
 
34
31
  content:
35
32
  label: Content
33
+ allowedBlocks: "*"
34
+
36
35
  footer:
37
36
  label: Footer
38
37
  inherit: parent
38
+ purgeTargets:
39
+ - "/partials/footer"
40
+ disallowedBlocks:
41
+ - hero
42
+ - image_card
43
+ - header_image