@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.
Files changed (120) hide show
  1. package/README.md +169 -0
  2. package/bin/cli.js +738 -261
  3. package/content/definitions/blocks/button.yaml +34 -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/node-list.yaml +61 -0
  10. package/content/definitions/blocks/single_image.yaml +27 -0
  11. package/content/definitions/blocks/text.yaml +15 -0
  12. package/content/definitions/channels/ecommerce.yaml +28 -0
  13. package/content/definitions/channels/website.yaml +41 -0
  14. package/{defaults → content}/definitions/field-sets/access.yaml +3 -5
  15. package/content/definitions/field-sets/channel-base.yaml +57 -0
  16. package/{defaults/definitions/field-sets/page-meta.yaml → content/definitions/field-sets/channel-seo.yaml} +3 -11
  17. package/content/definitions/field-sets/content-block.yaml +41 -0
  18. package/content/definitions/field-sets/page-base.yaml +44 -0
  19. package/content/definitions/field-sets/page-seo.yaml +34 -0
  20. package/{defaults → content}/definitions/field-sets/page-social.yaml +6 -8
  21. package/content/definitions/field-sets/schema-type.yaml +43 -0
  22. package/content/definitions/field-sets/tree-base.yaml +31 -0
  23. package/content/definitions/node-layouts/content.yml +12 -0
  24. package/{defaults → content}/definitions/node-layouts/landing-page.yml +8 -3
  25. package/{defaults → content}/definitions/node-layouts/single-column.yml +10 -5
  26. package/{defaults → content}/definitions/node-layouts/two-column.yml +14 -6
  27. package/content/definitions/nodes/address.yaml +40 -0
  28. package/content/definitions/nodes/article.yaml +65 -0
  29. package/content/definitions/nodes/event.yaml +55 -0
  30. package/content/definitions/nodes/external-link.yaml +29 -0
  31. package/content/definitions/nodes/page-skeleton.yaml +48 -0
  32. package/{defaults → content}/definitions/nodes/page.yaml +9 -20
  33. package/content/definitions/nodes/person.yaml +37 -0
  34. package/content/definitions/nodes/product.yaml +89 -0
  35. package/content/definitions/taxonomies/categories.yaml +15 -0
  36. package/content/definitions/taxonomies/tags.yaml +12 -0
  37. package/content/definitions/trees/navigation.yaml +24 -0
  38. package/definitions/editor/default.ts +1 -0
  39. package/dist/assets/index-BVkEzCNs.js +164 -0
  40. package/dist/assets/index-CGLx9oqF.css +1 -0
  41. package/dist/build-seed.js +486 -0
  42. package/dist/dist-kIJlDMvm.js +27162 -0
  43. package/dist/index.html +4 -2
  44. package/dist/index.js +26186 -8576
  45. package/dist/schema-compiler.js +48 -0
  46. package/documentation/SCHEMAS.md +182 -0
  47. package/package.json +24 -25
  48. package/schema.sql +67 -23
  49. package/templates/astro-starter/astro.config.mjs +27 -0
  50. package/templates/astro-starter/package.json.template +20 -0
  51. package/templates/astro-starter/public/robots.txt +23 -0
  52. package/templates/astro-starter/src/components/blocks/BlockRenderer.astro +143 -0
  53. package/templates/astro-starter/src/components/blocks/ColumnLayout.astro +67 -0
  54. package/templates/astro-starter/src/components/blocks/HeaderImage.astro +126 -0
  55. package/templates/astro-starter/src/components/blocks/Hero.astro +218 -0
  56. package/templates/astro-starter/src/components/blocks/HtmlBlock.astro +25 -0
  57. package/templates/astro-starter/src/components/blocks/ImageBlock.astro +91 -0
  58. package/templates/astro-starter/src/components/blocks/NodeList.astro +278 -0
  59. package/templates/astro-starter/src/components/blocks/TextBlock.astro +15 -0
  60. package/templates/astro-starter/src/components/global/Breadcrumb.astro +108 -0
  61. package/templates/astro-starter/src/components/global/Footer.astro +50 -0
  62. package/templates/astro-starter/src/components/global/Header.astro +171 -0
  63. package/templates/astro-starter/src/components/global/MetaHead.astro +266 -0
  64. package/templates/astro-starter/src/components/global/NavigationMenu.astro +413 -0
  65. package/templates/astro-starter/src/components/ui/KamaImage.astro +180 -0
  66. package/templates/astro-starter/src/layouts/SkeletonLayout.astro +56 -0
  67. package/templates/astro-starter/src/layouts/StandardLayout.astro +63 -0
  68. package/templates/astro-starter/src/lib/cms.ts +219 -0
  69. package/templates/astro-starter/src/lib/media/kama-image-service.ts +67 -0
  70. package/templates/astro-starter/src/lib/media/media-proxy.ts +148 -0
  71. package/templates/astro-starter/src/lib/media/media-url.ts +112 -0
  72. package/templates/astro-starter/src/middleware.ts +508 -0
  73. package/templates/astro-starter/src/pages/404.astro +46 -0
  74. package/templates/astro-starter/src/pages/[...slug].astro +318 -0
  75. package/templates/astro-starter/src/pages/api/load-nodes.ts +40 -0
  76. package/templates/astro-starter/src/pages/llms-full.txt.ts +171 -0
  77. package/templates/astro-starter/src/pages/llms.txt.ts +113 -0
  78. package/templates/astro-starter/src/pages/media/[...path].ts +14 -0
  79. package/templates/astro-starter/src/pages/partials/footer.astro +69 -0
  80. package/templates/astro-starter/src/pages/partials/nav.astro +141 -0
  81. package/templates/astro-starter/src/styles/standard-theme.css +157 -0
  82. package/templates/astro-starter/src/utils/tiptap.ts +113 -0
  83. package/templates/astro-starter/tsconfig.json +0 -0
  84. package/templates/kama-worker/index.js +19 -0
  85. package/templates/kama-worker/server.js +104 -0
  86. package/wrangler.json +22 -0
  87. package/defaults/definitions/blocks/button.yaml +0 -15
  88. package/defaults/definitions/blocks/header.yaml +0 -15
  89. package/defaults/definitions/blocks/header_image.yaml +0 -22
  90. package/defaults/definitions/blocks/hero.yaml +0 -27
  91. package/defaults/definitions/blocks/image_card.yaml +0 -57
  92. package/defaults/definitions/blocks/single_image.yaml +0 -28
  93. package/defaults/definitions/blocks/text.yaml +0 -16
  94. package/defaults/definitions/channels/ecommerce.yaml +0 -24
  95. package/defaults/definitions/channels/website.yaml +0 -32
  96. package/defaults/definitions/field-sets/channel-base.yaml +0 -31
  97. package/defaults/definitions/field-sets/content-block.yaml +0 -46
  98. package/defaults/definitions/field-sets/page-base.yaml +0 -49
  99. package/defaults/definitions/field-sets/tree-base.yaml +0 -31
  100. package/defaults/definitions/node-layouts/three-column.yml +0 -41
  101. package/defaults/definitions/nodes/address.yaml +0 -32
  102. package/defaults/definitions/nodes/article.yaml +0 -43
  103. package/defaults/definitions/nodes/event.yaml +0 -49
  104. package/defaults/definitions/nodes/external-link.yaml +0 -26
  105. package/defaults/definitions/nodes/person.yaml +0 -37
  106. package/defaults/definitions/nodes/product.yaml +0 -86
  107. package/defaults/definitions/trees/navigation.yaml +0 -29
  108. package/defaults/definitions/trees/social-links.yaml +0 -9
  109. package/definitions/_page.yaml +0 -52
  110. package/dist/assets/index-D6qQsWOj.js +0 -1392
  111. package/dist/assets/index-TdW5F0pX.css +0 -1
  112. package/dist/media/kama/2026/08/17a098c92bc54ea4b4441e531a34575b.jpg +0 -0
  113. package/dist/media/kama/2026/08/3e9ae457dd23461680cc699f42d07cf0.jpg +0 -0
  114. package/dist/media/kama/2026/08/8e5b3a2fd194459f9b962f8e12928bf0.jpg +0 -0
  115. package/dist/media/kama/2026/08/8ea5c21026cd4944bdf78c99fe2544a9.jpg +0 -0
  116. package/scripts/bundle-definitions.js +0 -176
  117. /package/{defaults → content}/definitions/block-layouts/three-column.yaml +0 -0
  118. /package/{defaults → content}/definitions/block-layouts/two-column.yaml +0 -0
  119. /package/{defaults → content}/definitions/field-sets/comments.yaml +0 -0
  120. /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,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,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,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."