@gradial/aci 0.1.52-rc.1 → 0.1.52-rc.13

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 (94) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +4 -4
  3. package/dist/audience-data-models.d.ts +96 -0
  4. package/dist/audience-data-models.js +52 -0
  5. package/dist/cli/compile-registry.d.mts +5 -1
  6. package/dist/cli/compile-registry.mjs +25 -10
  7. package/dist/cli/validate-content.d.mts +31 -1
  8. package/dist/cli/validate-content.mjs +50 -12
  9. package/dist/collect/aci.js +1 -1
  10. package/dist/collect/aci.js.sha256 +1 -1
  11. package/dist/collect/api.d.ts +3 -7
  12. package/dist/collect/api.js +2 -8
  13. package/dist/collect/index.js +1 -1
  14. package/dist/content/provider.d.ts +1 -0
  15. package/dist/content/resolve-slots.d.ts +9 -2
  16. package/dist/content/resolve-slots.js +5 -3
  17. package/dist/content/types.d.ts +2 -0
  18. package/dist/edge/personalization-core.js +13 -1
  19. package/dist/internal/domain/edge/compose.d.ts +24 -0
  20. package/dist/internal/domain/edge/compose.js +89 -0
  21. package/dist/internal/domain/edge/index.d.ts +2 -0
  22. package/dist/internal/domain/edge/index.js +2 -0
  23. package/dist/internal/domain/edge/mimic_token.d.ts +13 -0
  24. package/dist/internal/domain/edge/mimic_token.js +59 -0
  25. package/dist/internal/domain/edge/personalization-core.d.ts +4 -1
  26. package/dist/internal/domain/edge/personalization-core.js +25 -8
  27. package/dist/internal/domain/edge/resolve.js +19 -9
  28. package/dist/internal/domain/edge/types.d.ts +16 -0
  29. package/dist/mimic/core.d.ts +34 -0
  30. package/dist/mimic/core.js +127 -0
  31. package/dist/next/collect-route.d.ts +6 -0
  32. package/dist/next/collect-route.js +15 -0
  33. package/dist/next/error-seat-payload.js +1 -1
  34. package/dist/next/hosted-page-target.d.ts +7 -0
  35. package/dist/next/hosted-page-target.js +39 -0
  36. package/dist/next/index.d.ts +0 -1
  37. package/dist/next/index.js +0 -1
  38. package/dist/next/page.d.ts +29 -6
  39. package/dist/next/page.js +47 -25
  40. package/dist/next/personalization-host.d.ts +4 -0
  41. package/dist/next/personalization-host.js +18 -7
  42. package/dist/next/server.js +28 -1
  43. package/dist/next/vercel-edge-projection-v1.js +7 -1
  44. package/dist/next/vercel-s3-personalization.d.ts +1 -0
  45. package/dist/next/vercel-s3-personalization.js +1 -0
  46. package/dist/providers/s3.js +11 -4
  47. package/dist/types/block-ref.d.ts +2 -0
  48. package/dist/types/block-ref.js +1 -0
  49. package/package.json +7 -7
  50. package/src/cli/compile-registry.mjs +24 -10
  51. package/src/cli/validate-content.mjs +52 -13
  52. package/src/types/block-ref.test.ts +45 -0
  53. package/src/types/block-ref.ts +2 -0
  54. package/templates/astro/starter-content/src/fixtures/atomicBlocks.ts +7 -6
  55. package/templates/astro/starter-content/src/fixtures/composition.ts +3 -2
  56. package/templates/astro/starter-content/src/fixtures/sections.ts +2 -1
  57. package/templates/astro/template/package.json.tmpl +1 -1
  58. package/templates/astro/template/src/layouts/SiteLayout.astro +2 -2
  59. package/templates/common/.agents/skills/authoring/SKILL.md +11 -3
  60. package/templates/common/.agents/skills/authoring/references/block-slots.md +3 -0
  61. package/templates/common/.content/pages/{home/_index.json → _index.json} +10 -0
  62. package/templates/common/.content/schemas/site.schema.json +1 -1
  63. package/templates/common/.nvmrc +1 -1
  64. package/templates/common/starter-content/.content/.rules-baseline.json +8 -0
  65. package/templates/common/starter-content/.content/config/site.json +1 -1
  66. package/templates/common/starter-content/.content/content-rules/no-public-resource-paths.json +6 -0
  67. package/templates/common/starter-content/.content/fragments/navbar/_index.json +23 -20
  68. package/templates/common/starter-content/.content/fragments/site-footer/_index.json +59 -56
  69. package/templates/common/starter-content/.content/pages/404/_index.json +1 -0
  70. package/templates/common/starter-content/.content/pages/about/_index.json +3 -0
  71. package/templates/common/starter-content/.content/pages/error/_index.json +1 -0
  72. package/templates/common/starter-content/.content/pages/home/_index.json +9 -0
  73. package/templates/common/starter-content/.content/patterns/components/button.json +55 -0
  74. package/templates/common/starter-content/.content/patterns/components/container.json +62 -0
  75. package/templates/common/starter-content/.content/patterns/components/feature_card.json +30 -0
  76. package/templates/common/starter-content/.content/patterns/components/feature_grid.json +57 -0
  77. package/templates/common/starter-content/.content/patterns/components/home_hero.json +142 -0
  78. package/templates/common/starter-content/.content/patterns/components/personalization_choice.json +42 -0
  79. package/templates/common/starter-content/.content/patterns/components/site-footer.json +203 -0
  80. package/templates/common/starter-content/.content/patterns/components/site-navigation.json +115 -0
  81. package/templates/common/starter-content/.content/patterns/components/stats_bar.json +45 -0
  82. package/templates/common/starter-content/.content/patterns/layouts/default.json +14 -0
  83. package/templates/common/starter-content/.content/schemas/site.schema.json +1 -1
  84. package/templates/nextjs/template/.aci.yaml +10 -0
  85. package/templates/nextjs/template/package.json.tmpl +2 -1
  86. package/templates/nextjs/template/src/app/_components/c15t-bridge.ts +30 -0
  87. package/templates/nextjs/template/src/app/_components/c15t-consent-ui.tsx +37 -0
  88. package/templates/nextjs/template/src/app/_components/consent-manager.css +63 -0
  89. package/templates/nextjs/template/src/app/_components/consent-manager.tsx +76 -0
  90. package/templates/nextjs/template/src/app/layout.tsx +2 -0
  91. package/dist/next/middleware.d.ts +0 -40
  92. package/dist/next/middleware.js +0 -475
  93. /package/templates/common/.content/overlays/audience/preference-blue/pages/{home/_index.json → _index.json} +0 -0
  94. /package/templates/common/.content/overlays/audience/preference-red/pages/{home/_index.json → _index.json} +0 -0
@@ -11,6 +11,7 @@
11
11
  "regions": {
12
12
  "main": [
13
13
  {
14
+ "$type": "component",
14
15
  "id": "about-hero",
15
16
  "component": "home_hero",
16
17
  "props": {
@@ -27,12 +28,14 @@
27
28
  }
28
29
  },
29
30
  {
31
+ "$type": "component",
30
32
  "id": "about-actions",
31
33
  "component": "container",
32
34
  "props": {
33
35
  "className": "items-center justify-center text-center",
34
36
  "content": [
35
37
  {
38
+ "$type": "component",
36
39
  "id": "home-link",
37
40
  "component": "button",
38
41
  "props": {
@@ -11,6 +11,7 @@
11
11
  "regions": {
12
12
  "main": [
13
13
  {
14
+ "$type": "component",
14
15
  "id": "error-hero",
15
16
  "component": "home_hero",
16
17
  "props": {
@@ -11,6 +11,7 @@
11
11
  "regions": {
12
12
  "main": [
13
13
  {
14
+ "$type": "component",
14
15
  "id": "hero",
15
16
  "component": "home_hero",
16
17
  "props": {
@@ -27,6 +28,7 @@
27
28
  }
28
29
  },
29
30
  {
31
+ "$type": "component",
30
32
  "id": "why-meridian",
31
33
  "component": "feature_grid",
32
34
  "props": {
@@ -34,6 +36,7 @@
34
36
  "subtitle": "Engineered for the edges of the world.",
35
37
  "features": [
36
38
  {
39
+ "$type": "component",
37
40
  "id": "global-coverage",
38
41
  "component": "feature_card",
39
42
  "props": {
@@ -43,6 +46,7 @@
43
46
  }
44
47
  },
45
48
  {
49
+ "$type": "component",
46
50
  "id": "low-latency",
47
51
  "component": "feature_card",
48
52
  "props": {
@@ -52,6 +56,7 @@
52
56
  }
53
57
  },
54
58
  {
59
+ "$type": "component",
55
60
  "id": "easy-setup",
56
61
  "component": "feature_card",
57
62
  "props": {
@@ -64,6 +69,7 @@
64
69
  }
65
70
  },
66
71
  {
72
+ "$type": "component",
67
73
  "id": "stats",
68
74
  "component": "stats_bar",
69
75
  "props": {
@@ -92,6 +98,7 @@
92
98
  }
93
99
  },
94
100
  {
101
+ "$type": "component",
95
102
  "id": "cta",
96
103
  "component": "container",
97
104
  "props": {
@@ -99,6 +106,7 @@
99
106
  "className": "items-center justify-center text-center",
100
107
  "content": [
101
108
  {
109
+ "$type": "component",
102
110
  "id": "cta-primary",
103
111
  "component": "button",
104
112
  "props": {
@@ -110,6 +118,7 @@
110
118
  }
111
119
  },
112
120
  {
121
+ "$type": "component",
113
122
  "id": "cta-secondary",
114
123
  "component": "button",
115
124
  "props": {
@@ -0,0 +1,55 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "button",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "button",
9
+ "type": "object",
10
+ "properties": {
11
+ "label": {
12
+ "type": "string",
13
+ "minLength": 1
14
+ },
15
+ "href": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "variant": {
20
+ "type": "string",
21
+ "enum": [
22
+ "primary",
23
+ "secondary",
24
+ "tertiary",
25
+ "outline",
26
+ "ghost"
27
+ ]
28
+ },
29
+ "newWindow": {
30
+ "type": "boolean"
31
+ },
32
+ "icon": {
33
+ "type": "string"
34
+ },
35
+ "iconPosition": {
36
+ "type": "string",
37
+ "enum": [
38
+ "before",
39
+ "after"
40
+ ]
41
+ },
42
+ "className": {
43
+ "type": "string"
44
+ }
45
+ },
46
+ "required": [
47
+ "label",
48
+ "href"
49
+ ],
50
+ "additionalProperties": false
51
+ },
52
+ "imageSlots": {},
53
+ "notes": "",
54
+ "skills": []
55
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "container",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "container",
9
+ "type": "object",
10
+ "properties": {
11
+ "theme": {
12
+ "type": "string",
13
+ "enum": [
14
+ "auto",
15
+ "light",
16
+ "dark"
17
+ ]
18
+ },
19
+ "className": {
20
+ "type": "string"
21
+ },
22
+ "content": {
23
+ "type": "array",
24
+ "items": {
25
+ "type": "object",
26
+ "properties": {
27
+ "$type": {
28
+ "type": "string",
29
+ "const": "component"
30
+ },
31
+ "id": {
32
+ "type": "string",
33
+ "minLength": 1
34
+ },
35
+ "component": {
36
+ "type": "string",
37
+ "minLength": 1
38
+ },
39
+ "props": {
40
+ "type": "object",
41
+ "propertyNames": {
42
+ "type": "string"
43
+ },
44
+ "additionalProperties": {}
45
+ }
46
+ },
47
+ "required": [
48
+ "$type",
49
+ "id",
50
+ "component",
51
+ "props"
52
+ ],
53
+ "additionalProperties": false
54
+ }
55
+ }
56
+ },
57
+ "additionalProperties": false
58
+ },
59
+ "imageSlots": {},
60
+ "notes": "",
61
+ "skills": []
62
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "feature_card",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "feature_card",
9
+ "type": "object",
10
+ "properties": {
11
+ "icon": {
12
+ "type": "string"
13
+ },
14
+ "title": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "description": {
19
+ "type": "string"
20
+ }
21
+ },
22
+ "required": [
23
+ "title"
24
+ ],
25
+ "additionalProperties": false
26
+ },
27
+ "imageSlots": {},
28
+ "notes": "",
29
+ "skills": []
30
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "feature_grid",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "feature_grid",
9
+ "type": "object",
10
+ "properties": {
11
+ "title": {
12
+ "type": "string"
13
+ },
14
+ "subtitle": {
15
+ "type": "string"
16
+ },
17
+ "features": {
18
+ "type": "array",
19
+ "items": {
20
+ "type": "object",
21
+ "properties": {
22
+ "$type": {
23
+ "type": "string",
24
+ "const": "component"
25
+ },
26
+ "id": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "component": {
31
+ "type": "string",
32
+ "minLength": 1
33
+ },
34
+ "props": {
35
+ "type": "object",
36
+ "propertyNames": {
37
+ "type": "string"
38
+ },
39
+ "additionalProperties": {}
40
+ }
41
+ },
42
+ "required": [
43
+ "$type",
44
+ "id",
45
+ "component",
46
+ "props"
47
+ ],
48
+ "additionalProperties": false
49
+ }
50
+ }
51
+ },
52
+ "additionalProperties": false
53
+ },
54
+ "imageSlots": {},
55
+ "notes": "",
56
+ "skills": []
57
+ }
@@ -0,0 +1,142 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "home_hero",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "home_hero",
9
+ "type": "object",
10
+ "properties": {
11
+ "eyebrow": {
12
+ "type": "string"
13
+ },
14
+ "headline": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "description": {
19
+ "type": "string"
20
+ },
21
+ "ctaLabel": {
22
+ "type": "string",
23
+ "minLength": 1
24
+ },
25
+ "ctaHref": {
26
+ "type": "string",
27
+ "minLength": 1
28
+ },
29
+ "image": {
30
+ "type": "object",
31
+ "properties": {
32
+ "$type": {
33
+ "type": "string",
34
+ "const": "gradial.image"
35
+ },
36
+ "assetId": {
37
+ "type": "string",
38
+ "minLength": 1
39
+ },
40
+ "versionId": {
41
+ "type": "string",
42
+ "minLength": 1
43
+ },
44
+ "alt": {
45
+ "type": "string"
46
+ },
47
+ "sources": {
48
+ "minItems": 1,
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object",
52
+ "properties": {
53
+ "src": {
54
+ "type": "string",
55
+ "minLength": 1
56
+ },
57
+ "srcset": {
58
+ "type": "string",
59
+ "minLength": 1
60
+ },
61
+ "width": {
62
+ "type": "integer",
63
+ "minimum": 0,
64
+ "maximum": 9007199254740991
65
+ },
66
+ "height": {
67
+ "type": "integer",
68
+ "minimum": 0,
69
+ "maximum": 9007199254740991
70
+ },
71
+ "sizes": {
72
+ "type": "string",
73
+ "minLength": 1
74
+ },
75
+ "media": {
76
+ "type": "string",
77
+ "minLength": 1
78
+ },
79
+ "type": {
80
+ "type": "string",
81
+ "minLength": 1
82
+ }
83
+ },
84
+ "required": [
85
+ "src",
86
+ "type"
87
+ ],
88
+ "additionalProperties": false
89
+ }
90
+ }
91
+ },
92
+ "required": [
93
+ "$type",
94
+ "assetId",
95
+ "versionId",
96
+ "alt",
97
+ "sources"
98
+ ],
99
+ "additionalProperties": false
100
+ }
101
+ },
102
+ "required": [
103
+ "headline",
104
+ "ctaLabel",
105
+ "ctaHref",
106
+ "image"
107
+ ],
108
+ "additionalProperties": false
109
+ },
110
+ "imageSlots": {
111
+ "image": {
112
+ "outputs": [
113
+ {
114
+ "aspectRatio": "16:9",
115
+ "widths": [
116
+ 768,
117
+ 1280,
118
+ 1920
119
+ ],
120
+ "media": "(min-width: 768px)"
121
+ },
122
+ {
123
+ "aspectRatio": "3:4",
124
+ "widths": [
125
+ 480,
126
+ 720,
127
+ 960
128
+ ],
129
+ "media": "(max-width: 767px)"
130
+ }
131
+ ],
132
+ "formats": [
133
+ "image/avif",
134
+ "image/webp",
135
+ "image/jpeg"
136
+ ],
137
+ "sizes": "100vw"
138
+ }
139
+ },
140
+ "notes": "",
141
+ "skills": []
142
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "personalization_choice",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "personalization_choice",
9
+ "type": "object",
10
+ "properties": {
11
+ "title": {
12
+ "type": "string",
13
+ "minLength": 1
14
+ },
15
+ "description": {
16
+ "type": "string"
17
+ },
18
+ "redLabel": {
19
+ "type": "string",
20
+ "minLength": 1
21
+ },
22
+ "blueLabel": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "refreshLabel": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ }
30
+ },
31
+ "required": [
32
+ "title",
33
+ "redLabel",
34
+ "blueLabel",
35
+ "refreshLabel"
36
+ ],
37
+ "additionalProperties": false
38
+ },
39
+ "imageSlots": {},
40
+ "notes": "",
41
+ "skills": []
42
+ }
@@ -0,0 +1,203 @@
1
+ {
2
+ "$type": "componentPattern",
3
+ "buildId": "codebuild_01a017ed-c52f-703a-a6b4-a0943c057d31",
4
+ "codeDigest": "sha256:119dd8414ca342ca67f4dd4703dcb504630220bbdca9130b1501ee7b25693134",
5
+ "name": "site-footer",
6
+ "schema": {
7
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
8
+ "title": "site-footer",
9
+ "type": "object",
10
+ "properties": {
11
+ "brandHref": {
12
+ "type": "string",
13
+ "minLength": 1
14
+ },
15
+ "brandLabel": {
16
+ "type": "string",
17
+ "minLength": 1
18
+ },
19
+ "brandLogo": {
20
+ "anyOf": [
21
+ {
22
+ "type": "object",
23
+ "properties": {
24
+ "src": {
25
+ "type": "string"
26
+ },
27
+ "alt": {
28
+ "type": "string"
29
+ }
30
+ },
31
+ "required": [
32
+ "src",
33
+ "alt"
34
+ ],
35
+ "additionalProperties": false
36
+ },
37
+ {
38
+ "type": "null"
39
+ }
40
+ ]
41
+ },
42
+ "columns": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "properties": {
47
+ "id": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "title": {
52
+ "type": "string"
53
+ },
54
+ "links": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "properties": {
59
+ "id": {
60
+ "type": "string",
61
+ "minLength": 1
62
+ },
63
+ "label": {
64
+ "type": "string",
65
+ "minLength": 1
66
+ },
67
+ "href": {
68
+ "type": "string",
69
+ "minLength": 1
70
+ }
71
+ },
72
+ "required": [
73
+ "id",
74
+ "label",
75
+ "href"
76
+ ],
77
+ "additionalProperties": false
78
+ }
79
+ },
80
+ "groups": {
81
+ "type": "array",
82
+ "items": {
83
+ "type": "object",
84
+ "properties": {
85
+ "id": {
86
+ "type": "string",
87
+ "minLength": 1
88
+ },
89
+ "title": {
90
+ "type": "string"
91
+ },
92
+ "links": {
93
+ "type": "array",
94
+ "items": {
95
+ "type": "object",
96
+ "properties": {
97
+ "id": {
98
+ "type": "string",
99
+ "minLength": 1
100
+ },
101
+ "label": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ },
105
+ "href": {
106
+ "type": "string",
107
+ "minLength": 1
108
+ }
109
+ },
110
+ "required": [
111
+ "id",
112
+ "label",
113
+ "href"
114
+ ],
115
+ "additionalProperties": false
116
+ }
117
+ }
118
+ },
119
+ "required": [
120
+ "id",
121
+ "title",
122
+ "links"
123
+ ],
124
+ "additionalProperties": false
125
+ }
126
+ }
127
+ },
128
+ "required": [
129
+ "id"
130
+ ],
131
+ "additionalProperties": false
132
+ }
133
+ },
134
+ "social": {
135
+ "type": "array",
136
+ "items": {
137
+ "type": "object",
138
+ "properties": {
139
+ "id": {
140
+ "type": "string",
141
+ "minLength": 1
142
+ },
143
+ "label": {
144
+ "type": "string",
145
+ "minLength": 1
146
+ },
147
+ "href": {
148
+ "type": "string",
149
+ "minLength": 1
150
+ },
151
+ "icon": {
152
+ "type": "string"
153
+ }
154
+ },
155
+ "required": [
156
+ "id",
157
+ "label",
158
+ "href"
159
+ ],
160
+ "additionalProperties": false
161
+ }
162
+ },
163
+ "legalLinks": {
164
+ "type": "array",
165
+ "items": {
166
+ "type": "object",
167
+ "properties": {
168
+ "id": {
169
+ "type": "string",
170
+ "minLength": 1
171
+ },
172
+ "label": {
173
+ "type": "string",
174
+ "minLength": 1
175
+ },
176
+ "href": {
177
+ "type": "string",
178
+ "minLength": 1
179
+ }
180
+ },
181
+ "required": [
182
+ "id",
183
+ "label",
184
+ "href"
185
+ ],
186
+ "additionalProperties": false
187
+ }
188
+ },
189
+ "copyright": {
190
+ "type": "string"
191
+ }
192
+ },
193
+ "required": [
194
+ "brandHref",
195
+ "brandLabel",
196
+ "columns"
197
+ ],
198
+ "additionalProperties": false
199
+ },
200
+ "imageSlots": {},
201
+ "notes": "",
202
+ "skills": []
203
+ }