@brightsideoy/kama 0.1.0-alpha.39 → 0.1.0-alpha.41

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 (40) hide show
  1. package/defaults/definitions/block-layouts/three-column.yaml +20 -0
  2. package/defaults/definitions/block-layouts/two-column.yaml +29 -0
  3. package/defaults/definitions/blocks/header.yaml +15 -0
  4. package/defaults/definitions/blocks/header_image.yaml +22 -0
  5. package/defaults/definitions/blocks/hero.yaml +27 -0
  6. package/defaults/definitions/blocks/image_card.yaml +53 -0
  7. package/defaults/definitions/blocks/text.yaml +16 -0
  8. package/defaults/definitions/channels/ecommerce.yaml +24 -0
  9. package/defaults/definitions/channels/website.yaml +32 -0
  10. package/defaults/definitions/field-sets/access.yaml +29 -0
  11. package/defaults/definitions/field-sets/channel-base.yaml +31 -0
  12. package/defaults/definitions/field-sets/comments.yaml +11 -0
  13. package/defaults/definitions/field-sets/content-block.yaml +46 -0
  14. package/defaults/definitions/field-sets/page-base.yaml +49 -0
  15. package/defaults/definitions/field-sets/page-meta.yaml +15 -0
  16. package/defaults/definitions/field-sets/page-social.yaml +80 -0
  17. package/defaults/definitions/field-sets/tree-base.yaml +31 -0
  18. package/defaults/definitions/field-sets/visibility.yaml +8 -0
  19. package/defaults/definitions/node-layouts/landing-page.yml +22 -0
  20. package/defaults/definitions/node-layouts/single-column.yml +38 -0
  21. package/defaults/definitions/node-layouts/three-column.yml +41 -0
  22. package/defaults/definitions/node-layouts/two-column.yml +40 -0
  23. package/defaults/definitions/nodes/address.yaml +32 -0
  24. package/defaults/definitions/nodes/article.yaml +41 -0
  25. package/defaults/definitions/nodes/event.yaml +40 -0
  26. package/defaults/definitions/nodes/external-link.yaml +26 -0
  27. package/defaults/definitions/nodes/page.yaml +63 -0
  28. package/defaults/definitions/nodes/person.yaml +35 -0
  29. package/defaults/definitions/nodes/product.yaml +79 -0
  30. package/defaults/definitions/trees/navigation.yaml +29 -0
  31. package/defaults/definitions/trees/social-links.yaml +9 -0
  32. package/definitions/_page.yaml +52 -0
  33. package/definitions/editor/default.ts +17 -0
  34. package/definitions/editor/header.ts +33 -0
  35. package/definitions/editor/minimal.ts +13 -0
  36. package/definitions/validators/iban.ts +12 -0
  37. package/definitions/validators/magic-word.ts +7 -0
  38. package/dist/index.js +10 -10
  39. package/package.json +3 -1
  40. package/scripts/bundle-definitions.js +40 -16
@@ -0,0 +1,20 @@
1
+ id: three-column
2
+ label: Three Columns (33/33/33)
3
+ showLabel: false
4
+ group: Sub-Layouts
5
+
6
+ layout:
7
+ columns: "1fr 1fr 1fr"
8
+ areas:
9
+ - ["left", "middle", "right"]
10
+
11
+ regions:
12
+ left:
13
+ label: Left Column
14
+ showLabel: false # 👈 Hides "LEFT COLUMN" header on this region cell
15
+ middle:
16
+ label: Middle Column
17
+ showLabel: false # 👈 Hides "LEFT COLUMN" header on this region cell
18
+ right:
19
+ label: Right Column
20
+ showLabel: false # 👈 Keeps "RIGHT COLUMN" visible
@@ -0,0 +1,29 @@
1
+ id: two-column
2
+ label: Two Columns (50/50)
3
+ showLabel: false # 👈 Hides the main "Two Columns" badge on the canvas
4
+ group: Sub-Layouts
5
+
6
+ layout:
7
+ columns: "1fr 1fr"
8
+ areas:
9
+ - ["left", "right"]
10
+
11
+ regions:
12
+ left:
13
+ label: Left Column
14
+ showLabel: false # 👈 Hides "LEFT COLUMN" header on this region cell
15
+ right:
16
+ label: Right Column
17
+ showLabel: false # 👈 Keeps "RIGHT COLUMN" visible
18
+
19
+ # Optional: We can give the layout block its own settings!
20
+ fields:
21
+ gap:
22
+ label: Column Gap
23
+ type: select
24
+ default: "2rem"
25
+ options:
26
+ - { label: "None", value: "0" }
27
+ - { label: "Small", value: "1rem" }
28
+ - { label: "Medium", value: "2rem" }
29
+ - { label: "Large", value: "4rem" }
@@ -0,0 +1,15 @@
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
+ default: "Header here..."
12
+
13
+ - fieldSet: access
14
+ - hidden:
15
+ default: false
@@ -0,0 +1,22 @@
1
+ id: header_image
2
+ label: Header Image
3
+ group: Content
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
+ - fieldSet: access
21
+ - hidden:
22
+ default: false
@@ -0,0 +1,27 @@
1
+ id: hero
2
+ label: Hero
3
+ group: Content
4
+
5
+ fields:
6
+ - heroBadge:
7
+ type: text
8
+ label: Badge
9
+ public: true
10
+ - heroTitle:
11
+ type: text
12
+ label: Title
13
+ public: true
14
+ - heroSubTitle:
15
+ type: text
16
+ label: Sub-Title
17
+ public: true
18
+ - headline:
19
+ type: richtext
20
+ editor: header
21
+ label: Headline
22
+ public: true
23
+ default: "Header here..."
24
+
25
+ - fieldSet: access
26
+ - hidden:
27
+ default: false
@@ -0,0 +1,53 @@
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
+ - linkUrl:
38
+ label: Link URL
39
+ type: text
40
+ description: Where should this card link to? (e.g., /about or https://...)
41
+ public: true
42
+ default: "https://"
43
+
44
+ - linkText:
45
+ label: Button Text
46
+ type: text
47
+ description: "e.g., 'Read More' or 'Buy Now'"
48
+ default: "Read More"
49
+ public: true
50
+
51
+ - fieldSet: access
52
+ - hidden:
53
+ default: false
@@ -0,0 +1,16 @@
1
+ id: text
2
+ label: Text
3
+ group: Content
4
+ description: Paragraph body
5
+
6
+ fields:
7
+ - body:
8
+ label: Text
9
+ type: richtext
10
+ editor: default
11
+ default: "Write content here..."
12
+ public: true
13
+
14
+ - fieldSet: access
15
+ - hidden:
16
+ default: false
@@ -0,0 +1,24 @@
1
+ id: ecommerce
2
+ label: "E-Commerce"
3
+
4
+ tabs:
5
+ settings:
6
+ label: "Channel"
7
+ fields:
8
+ - fieldSet: channel-base
9
+
10
+ - currency:
11
+ label: Default Currency
12
+ type: select
13
+ default: "EUR"
14
+ options:
15
+ - "EUR"
16
+ - "USD"
17
+ - "GBP"
18
+
19
+ - checkoutUrl:
20
+ label: Checkout Endpoint URL
21
+ type: text
22
+ public: true
23
+
24
+ - fieldSet: access
@@ -0,0 +1,32 @@
1
+ id: website
2
+ label: "Website"
3
+
4
+ tabs:
5
+ settings:
6
+ label: "Channel"
7
+ fields:
8
+ - fieldSet: channel-base
9
+
10
+ - domain:
11
+ label: Hostname
12
+ type: text
13
+ dbType: text
14
+ index: true
15
+ public: true
16
+
17
+ - baseUrl:
18
+ label: Base URL
19
+ type: text
20
+ dbType: text
21
+ public: true
22
+
23
+ - defaultLanguage:
24
+ label: Channel Language / Locale
25
+ type: language-select
26
+ dbType: text
27
+ public: true
28
+
29
+ access:
30
+ label: "Access"
31
+ fields:
32
+ - fieldSet: access
@@ -0,0 +1,29 @@
1
+ tab:
2
+ id: access
3
+ label: "Access"
4
+
5
+ fields:
6
+ isHidden: # 🎯 Renamed from 'hidden' to match the DB column
7
+ type: boolean
8
+ label: Hidden
9
+ default: false
10
+ public: false
11
+ variant: danger
12
+ dbType: integer
13
+ index: true
14
+ position: sidebar
15
+ liveSync: true
16
+
17
+ startShowingAt:
18
+ type: datetime
19
+ label: Start Showing At
20
+ position: sidebar
21
+ public: false
22
+ index: true
23
+
24
+ stopShowingAt:
25
+ type: datetime
26
+ label: Stop Showing At
27
+ position: sidebar
28
+ public: false
29
+ index: true
@@ -0,0 +1,31 @@
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."
@@ -0,0 +1,11 @@
1
+ tab:
2
+ id: comments
3
+ label: "Comments"
4
+
5
+ fields:
6
+ isHidden:
7
+ type: textarea
8
+ label: Comments
9
+ public: false
10
+ index: true
11
+ position: sidebar
@@ -0,0 +1,46 @@
1
+ # definitions/field-sets/content-block.yaml
2
+ id: content-block
3
+ label: Content Block Base Properties
4
+
5
+ fields:
6
+ - id:
7
+ label: ID
8
+ type: hidden
9
+ dbType: text
10
+ primaryKey: true
11
+
12
+ - contentId:
13
+ label: Node ID
14
+ type: text
15
+ dbType: text
16
+ rules:
17
+ required: true
18
+
19
+ - sortOrder:
20
+ label: Sort Order
21
+ type: number
22
+ dbType: integer
23
+ rules:
24
+ required: true
25
+
26
+ - elementType:
27
+ label: Element Component Type
28
+ type: text
29
+ dbType: text
30
+ rules:
31
+ required: true
32
+
33
+ - dataJson:
34
+ label: Content Field Data
35
+ type: json
36
+ dbType: json
37
+ rules:
38
+ required: true
39
+
40
+ - region:
41
+ label: Grid Region
42
+ type: text
43
+ dbType: text
44
+ default: "main"
45
+ rules:
46
+ required: true
@@ -0,0 +1,49 @@
1
+ # definitions/field-sets/page-base.yaml
2
+ id: page-base
3
+ label: Base Page Properties
4
+
5
+ fields:
6
+ - id:
7
+ label: ID
8
+ type: hidden
9
+ dbType: text
10
+ primaryKey: true
11
+ public: true
12
+
13
+ - channelId:
14
+ label: Channel ID
15
+ type: hidden
16
+ dbType: text
17
+ public: true
18
+ index: true
19
+
20
+ - nodeType:
21
+ label: Type
22
+ type: select
23
+ dbType: text
24
+ default: "page"
25
+ public: true
26
+ position: sidebar
27
+ rules:
28
+ required: true
29
+
30
+ - title:
31
+ label: Page Title
32
+ type: text
33
+ dbType: text
34
+ public: true
35
+ rules:
36
+ required: true
37
+
38
+ - slug:
39
+ label: URL Slug
40
+ type: slug
41
+ linkedTo: title
42
+ dbType: text
43
+ public: true
44
+ index: true
45
+ rules:
46
+ required: true
47
+ uniqueSibling: true
48
+ pattern: "^[a-z0-9_-]+$"
49
+ customMessage: "Slug can only contain lowercase letters, numbers, hyphens, and underscores."
@@ -0,0 +1,15 @@
1
+ tab:
2
+ id: page-meta
3
+ label: "Meta"
4
+
5
+ fields:
6
+ metaDescription:
7
+ label: Meta Description
8
+ type: textarea
9
+ public: true
10
+
11
+ metaKeywords:
12
+ label: Meta Keywords
13
+ type: textarea
14
+ required: false
15
+ public: true
@@ -0,0 +1,80 @@
1
+ tab:
2
+ id: page-social
3
+ label: "Social"
4
+
5
+ fields:
6
+ # --- Facebook / Open Graph Texts ---
7
+ fbTitle:
8
+ label: "Facebook Title (og:title)"
9
+ type: text
10
+ inherits: title # 🔗 Syncs from SEO Title automatically
11
+ public: true
12
+ description: "The title of your article as it should appear on Facebook."
13
+
14
+ fbDescription:
15
+ label: "Facebook Description (og:description)"
16
+ type: textarea
17
+ inherits: metaDescription # 🔗 Or whatever your main SEO description field is named
18
+ public: true
19
+ description: "A 2-4 sentence summary of the content."
20
+
21
+ # --- X (Twitter) Texts ---
22
+ xTitle:
23
+ label: "X Title (twitter:title)"
24
+ type: text
25
+ inherits: fbTitle # 🔗 Cascades from Facebook Title (which cascades from SEO)
26
+ public: true
27
+ description: "Keep it concise (under 70 characters is ideal for X)."
28
+
29
+ xDescription:
30
+ label: "X Description (twitter:description)"
31
+ type: textarea
32
+ inherits: fbDescription
33
+ public: true
34
+
35
+ # ==========================================
36
+ # SOCIAL IMAGES (The Waterfall)
37
+ # ==========================================
38
+
39
+ # 1. The Source Image
40
+ socialImage:
41
+ label: "Master Social Image"
42
+ type: image
43
+ maxPreviewWidth: 620px
44
+ multiple: false
45
+ maxSizeMB: 10
46
+ allowedTypes: ["image/jpeg", "image/png", "image/webp"]
47
+ public: true
48
+
49
+ # 2. The Auto-Synced Crops
50
+ fbImage:
51
+ label: "Facebook / LinkedIn Image"
52
+ type: image
53
+ maxPreviewWidth: 620px
54
+ inherits: socialImage # 🔗 Syncs from socialImage
55
+ public: true
56
+ description: "Auto-cropped to 1.91:1. Drop a new image here to override."
57
+ crops:
58
+ aspectRatio: 1.91
59
+
60
+ xImage:
61
+ label: "X (Twitter) Image"
62
+ type: image
63
+ maxPreviewWidth: 620px
64
+ inherits: socialImage # 🔗 Syncs from socialImage
65
+ public: true
66
+ description: "Auto-cropped to 2:1. Drop a new image here to override."
67
+ crops:
68
+ aspectRatio: 2.0
69
+
70
+ whatsappImage:
71
+ label: "Messaging / Square Image"
72
+ type: image
73
+ maxPreviewWidth: 620px
74
+ inherits: socialImage # 🔗 Syncs from socialImage
75
+ public: true
76
+ description: "Auto-cropped to 1:1. Drop a new image here to override."
77
+ crops:
78
+ whatsappImage:
79
+ label: "WhatsApp Image (1:1)"
80
+ aspectRatio: 1.0
@@ -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,8 @@
1
+ fields:
2
+ showInMenus:
3
+ type: boolean
4
+ label: Show in Menus
5
+ default: true
6
+ position: sidebar
7
+ public: true
8
+ variant: alert
@@ -0,0 +1,22 @@
1
+ id: landing-page
2
+ label: Landing Page
3
+
4
+ layout:
5
+ columns: "1fr"
6
+ areas:
7
+ - ["header"]
8
+ - ["hero"]
9
+ - ["content"]
10
+ - ["footer"]
11
+
12
+ regions:
13
+ header:
14
+ label: Header
15
+ inherit: parent
16
+ hero:
17
+ label: Hero / Top Banner
18
+ content:
19
+ label: Content
20
+ footer:
21
+ label: Footer
22
+ inherit: parent
@@ -0,0 +1,38 @@
1
+ id: single-column
2
+ label: Single Column
3
+
4
+ layout:
5
+ columns: "1fr"
6
+ areas:
7
+ - ["header"]
8
+ - ["content"]
9
+ - ["footer"]
10
+
11
+ regions:
12
+ header:
13
+ label: Header Image
14
+ showLabel: true
15
+ inherit: parent
16
+ allowOverride: true
17
+ dropType: image
18
+ maxPreviewWidth: 800px
19
+ multiple: false
20
+ maxSizeMB: 20
21
+ allowedTypes: ["image/*"]
22
+ crops:
23
+ standard:
24
+ label: "Desktop Header (4:1)"
25
+ aspectRatio: 4.0
26
+ tablet:
27
+ label: "Tablet Header (2:1)"
28
+ aspectRatio: 2.0
29
+ mobile:
30
+ label: "Mobile Header (4:3)"
31
+ aspectRatio: 1.33
32
+ public: true
33
+
34
+ content:
35
+ label: Content
36
+ footer:
37
+ label: Footer
38
+ inherit: parent
@@ -0,0 +1,41 @@
1
+ id: three-column
2
+ label: Three Column
3
+
4
+ layout:
5
+ columns: "2fr 7fr 3fr"
6
+ areas:
7
+ - ["header", "header", "header"]
8
+ - ["left_nav", "content", "right_sidebar"]
9
+ - ["footer", "footer", "footer"]
10
+
11
+ regions:
12
+ header:
13
+ label: Header Image
14
+ showLabel: true
15
+ inherit: parent
16
+ allowOverride: true
17
+ dropType: image
18
+ maxPreviewWidth: 800px
19
+ multiple: false
20
+ maxSizeMB: 20
21
+ allowedTypes: ["image/*"]
22
+ crops:
23
+ standard:
24
+ label: "Desktop Header (4:1)"
25
+ aspectRatio: 4.0
26
+ tablet:
27
+ label: "Tablet Header (2:1)"
28
+ aspectRatio: 2.0
29
+ mobile:
30
+ label: "Mobile Header (4:3)"
31
+ aspectRatio: 1.33
32
+ public: true
33
+ left_nav:
34
+ label: Left Navigation
35
+ content:
36
+ label: Content
37
+ right_sidebar:
38
+ label: Right Sidebar
39
+ footer:
40
+ label: Footer
41
+ inherit: parent