@brightsideoy/kama 0.1.0-alpha.1 → 0.1.0-alpha.100

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 (52) hide show
  1. package/bin/cli.js +343 -0
  2. package/defaults/definitions/block-layouts/three-column.yaml +20 -0
  3. package/defaults/definitions/block-layouts/two-column.yaml +29 -0
  4. package/defaults/definitions/blocks/button.yaml +15 -0
  5. package/defaults/definitions/blocks/header.yaml +15 -0
  6. package/defaults/definitions/blocks/header_image.yaml +22 -0
  7. package/defaults/definitions/blocks/hero.yaml +27 -0
  8. package/defaults/definitions/blocks/image_card.yaml +57 -0
  9. package/defaults/definitions/blocks/single_image.yaml +28 -0
  10. package/defaults/definitions/blocks/text.yaml +16 -0
  11. package/defaults/definitions/channels/ecommerce.yaml +24 -0
  12. package/defaults/definitions/channels/website.yaml +32 -0
  13. package/defaults/definitions/field-sets/access.yaml +29 -0
  14. package/defaults/definitions/field-sets/channel-base.yaml +31 -0
  15. package/defaults/definitions/field-sets/comments.yaml +11 -0
  16. package/defaults/definitions/field-sets/content-block.yaml +46 -0
  17. package/defaults/definitions/field-sets/page-base.yaml +49 -0
  18. package/defaults/definitions/field-sets/page-meta.yaml +29 -0
  19. package/defaults/definitions/field-sets/page-social.yaml +80 -0
  20. package/defaults/definitions/field-sets/tree-base.yaml +31 -0
  21. package/defaults/definitions/field-sets/visibility.yaml +8 -0
  22. package/defaults/definitions/node-layouts/landing-page.yml +22 -0
  23. package/defaults/definitions/node-layouts/single-column.yml +38 -0
  24. package/defaults/definitions/node-layouts/three-column.yml +41 -0
  25. package/defaults/definitions/node-layouts/two-column.yml +40 -0
  26. package/defaults/definitions/nodes/address.yaml +32 -0
  27. package/defaults/definitions/nodes/article.yaml +43 -0
  28. package/defaults/definitions/nodes/event.yaml +49 -0
  29. package/defaults/definitions/nodes/external-link.yaml +26 -0
  30. package/defaults/definitions/nodes/page.yaml +65 -0
  31. package/defaults/definitions/nodes/person.yaml +37 -0
  32. package/defaults/definitions/nodes/product.yaml +86 -0
  33. package/defaults/definitions/trees/navigation.yaml +29 -0
  34. package/defaults/definitions/trees/social-links.yaml +9 -0
  35. package/definitions/_page.yaml +52 -0
  36. package/definitions/editor/button.ts +11 -0
  37. package/definitions/editor/default.ts +21 -0
  38. package/definitions/editor/header.ts +36 -0
  39. package/definitions/editor/minimal.ts +15 -0
  40. package/definitions/validators/iban.ts +12 -0
  41. package/definitions/validators/magic-word.ts +7 -0
  42. package/dist/assets/index-10GEw0KY.css +1 -0
  43. package/dist/assets/index-u699KJW2.js +1392 -0
  44. package/dist/index.html +13 -0
  45. package/dist/index.js +7922 -1022
  46. package/dist/media/kama/2026/08/17a098c92bc54ea4b4441e531a34575b.jpg +0 -0
  47. package/dist/media/kama/2026/08/3e9ae457dd23461680cc699f42d07cf0.jpg +0 -0
  48. package/dist/media/kama/2026/08/8e5b3a2fd194459f9b962f8e12928bf0.jpg +0 -0
  49. package/dist/media/kama/2026/08/8ea5c21026cd4944bdf78c99fe2544a9.jpg +0 -0
  50. package/package.json +25 -11
  51. package/schema.sql +221 -0
  52. package/scripts/bundle-definitions.js +176 -0
@@ -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,29 @@
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
16
+
17
+ titlePrefix:
18
+ label: Title Prefix
19
+ type: text
20
+ required: false
21
+ public: true
22
+ inherits: titlePrefix
23
+
24
+ titleSuffix:
25
+ label: Title Suffix
26
+ type: text
27
+ required: false
28
+ public: true
29
+ inherits: titleSuffix
@@ -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
@@ -0,0 +1,40 @@
1
+ # defaults/definitions/layouts/two-column-split.yml
2
+ id: two-column
3
+ label: Two Column
4
+
5
+ layout:
6
+ columns: "10fr 4fr"
7
+ areas:
8
+ - ["header", "header"]
9
+ - ["content", "sidebar"] # 👈 Changed 'main' to 'content' to match old data!
10
+ - ["footer", "footer"]
11
+
12
+ regions:
13
+ header:
14
+ label: Header Image
15
+ showLabel: true
16
+ inherit: parent
17
+ allowOverride: true
18
+ dropType: image
19
+ maxPreviewWidth: 800px
20
+ multiple: false
21
+ maxSizeMB: 20
22
+ allowedTypes: ["image/*"]
23
+ crops:
24
+ standard:
25
+ label: "Desktop Header (4:1)"
26
+ aspectRatio: 4.0
27
+ tablet:
28
+ label: "Tablet Header (2:1)"
29
+ aspectRatio: 2.0
30
+ mobile:
31
+ label: "Mobile Header (4:3)"
32
+ aspectRatio: 1.33
33
+ public: true
34
+ content: # 👈 Changed 'main' to 'content'
35
+ label: Content
36
+ sidebar:
37
+ label: Sidebar
38
+ footer:
39
+ label: Footer
40
+ inherit: parent
@@ -0,0 +1,32 @@
1
+ id: address
2
+ label: Address
3
+ inTree: false
4
+
5
+ # 👉 TABS DEFINITION
6
+ tabs:
7
+ settings:
8
+ label: "Address"
9
+ fields:
10
+ - title:
11
+ label: Address Title
12
+ required: true
13
+ - street:
14
+ label: Street
15
+ - city:
16
+ label: City
17
+ - area:
18
+ label: County / Area
19
+ - zip:
20
+ label: ZIP
21
+ - country:
22
+ label: Country
23
+ geolocation:
24
+ label: "Geolocation"
25
+ fields:
26
+ - lat:
27
+ label: Latitude
28
+ - lng:
29
+ label: Longitude
30
+ - timezone:
31
+ label: Timezone
32
+ - fieldSet: access
@@ -0,0 +1,43 @@
1
+ id: article
2
+ label: Article
3
+ inTree: false
4
+ hasCanvas: true
5
+ directLinking: true
6
+
7
+ regions:
8
+ content:
9
+ label: Content
10
+
11
+ allowedBlocks:
12
+ - header
13
+ - hero
14
+ - text
15
+ - image_card
16
+ - header_image
17
+ - two-column
18
+ - three-column
19
+ - single_image
20
+
21
+ tabs:
22
+ settings:
23
+ label: "Article"
24
+ fields:
25
+ - fieldSet: page-base
26
+ - title:
27
+ label: Article title
28
+ required: true
29
+ - slug:
30
+ linkedTo: "title"
31
+ - articleDate:
32
+ type: date
33
+ label: Article Date
34
+ public: true
35
+ default: now
36
+ index: true
37
+ - abstract:
38
+ label: Abstract
39
+ type: textarea
40
+ public: true
41
+ - fieldSet: page-meta
42
+ - fieldSet: page-social
43
+ - fieldSet: access
@@ -0,0 +1,49 @@
1
+ id: event
2
+ label: Event
3
+ inTree: false
4
+ hasCanvas: true
5
+ directLinking: true
6
+
7
+ regions:
8
+ main:
9
+ label: Content
10
+
11
+ allowedBlocks:
12
+ - header
13
+ - hero
14
+ - text
15
+ - image_card
16
+ - header_image
17
+ - two-column
18
+ - three-column
19
+ - single_image
20
+
21
+ tabs:
22
+ settings:
23
+ label: Event
24
+ fields:
25
+ - fieldSet: page-base
26
+ - title:
27
+ label: Event Title
28
+ required: true
29
+ showAsEditorTitle: true
30
+ - slug:
31
+ linkedTo: "title"
32
+ - startTime:
33
+ type: datetime
34
+ label: Starts
35
+ public: true
36
+ index: true
37
+ showAsEditorTitle: true
38
+ - endTime:
39
+ type: datetime
40
+ label: Finishes
41
+ public: true
42
+ index: true
43
+ - abstract:
44
+ label: Abstract
45
+ type: textarea
46
+ public: true
47
+ - fieldSet: page-meta
48
+ - fieldSet: page-social
49
+ - fieldSet: access
@@ -0,0 +1,26 @@
1
+ id: external-link
2
+ label: External Link
3
+ inTree: true
4
+
5
+ tabs:
6
+ settings:
7
+ label: "Link"
8
+ fields:
9
+ - fieldSet: page-base
10
+ - nodeType
11
+ - title:
12
+ label: Link Text
13
+ - iconName:
14
+ label: Icon
15
+ type: icon
16
+ dbType: text
17
+ packages: ["heroicons", "lucide", "mdi"]
18
+ - slug:
19
+ label: Slug
20
+ linkedTo: "menuTitle, title"
21
+ - url:
22
+ label: URL
23
+ type: text
24
+ public: true
25
+
26
+ - fieldSet: access
@@ -0,0 +1,65 @@
1
+ id: page
2
+ label: Page
3
+ inTree: true
4
+ inVault: true
5
+ hasCanvas: true
6
+ directLinking: true
7
+
8
+ # 👈 Keep this as the absolute last-resort fallback for the Public API
9
+ defaultLayout: "single-column"
10
+
11
+ # 👈 Cleaned up naming!
12
+ allowedBlocks:
13
+ - header
14
+ - hero
15
+ - text
16
+ - image_card
17
+ - header_image
18
+ - two-column
19
+ - three-column
20
+ - single_image
21
+
22
+ tabs:
23
+ settings:
24
+ label: "Page"
25
+ fields:
26
+ - fieldSet: page-base
27
+
28
+ # 👉 THE CURRENT PAGE'S LAYOUT
29
+ - layoutId:
30
+ label: Page Layout
31
+ type: layout-select
32
+ dbType: text
33
+ default: "inherit"
34
+ inheritsFromParent: true # 👈 Tells the UI to bind to the parent!
35
+ allowedLayouts:
36
+ - two-column
37
+ - single-column
38
+ - three-column
39
+ - landing-page
40
+ options:
41
+ - { label: "Inherit Layout", value: "inherit" }
42
+
43
+ # 👉 THE BEHAVIOR FOR ALL CHILDREN
44
+ - subpageLayoutId:
45
+ label: Subpages Layout Rule
46
+ type: layout-select
47
+ dbType: text
48
+ default: "inherit"
49
+ inheritsFromParent: true # 👈 A child's subpage rules can ALSO inherit!
50
+ allowedLayouts:
51
+ - two-column
52
+ - three-column
53
+ - single-column
54
+ - landing-page
55
+ options:
56
+ - { label: "Inherit Layout", value: "inherit" }
57
+
58
+ - menuTitle:
59
+ label: Menu Title
60
+ type: text
61
+ dbType: text
62
+ public: true
63
+ - fieldSet: page-meta
64
+ - fieldSet: page-social
65
+ - fieldSet: access
@@ -0,0 +1,37 @@
1
+ id: person
2
+ label: Person
3
+ inTree: false
4
+ inVault: true
5
+ hasCanvas: false
6
+
7
+ # 👉 TABS DEFINITION
8
+ tabs:
9
+ settings:
10
+ label: "Person"
11
+ fields:
12
+ - image:
13
+ label: Image
14
+ type: asset
15
+ multiple: false
16
+ maxSizeMB: 15
17
+ allowedTypes: ["image/*"]
18
+ maxPreviewWidth: 300
19
+ crops:
20
+ list_thumb:
21
+ label: "List View"
22
+ aspectRatio: 1
23
+ shape: "circle"
24
+ public: true
25
+
26
+ - title:
27
+ label: Title
28
+ required: false
29
+ - firstName:
30
+ label: First Name
31
+ showAsEditorTitle: true
32
+ - lastName:
33
+ label: Last Name
34
+ showAsEditorTitle: true
35
+ - position:
36
+
37
+ - fieldSet: access