@koehler8/cms 1.0.0-beta.8 → 1.0.0
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.
- package/CHANGELOG.md +1491 -0
- package/README.md +108 -28
- package/bin/cms-create-extension.js +7 -0
- package/bin/cms-create-site.js +7 -0
- package/bin/cms-create-theme.js +7 -0
- package/bin/cms-ssg-build.js +13 -0
- package/bin/cms-validate-extensions.js +4 -0
- package/bin/cms-validate-themes.js +11 -0
- package/extensions/manifest.schema.json +1 -1
- package/package.json +36 -16
- package/scripts/create-extension.mjs +11 -0
- package/scripts/create-site.mjs +11 -0
- package/scripts/create-theme.mjs +11 -0
- package/scripts/generate-public-assets.js +70 -36
- package/scripts/image-variants/cache.js +40 -0
- package/scripts/image-variants/classifier.js +53 -0
- package/scripts/image-variants/config.js +54 -0
- package/scripts/image-variants/index.js +18 -0
- package/scripts/image-variants/manifest.js +76 -0
- package/scripts/image-variants/planner.js +95 -0
- package/scripts/image-variants/reconcile.js +194 -0
- package/scripts/image-variants/renderer.js +51 -0
- package/scripts/lib/extension-manifests.mjs +70 -0
- package/scripts/scaffold.mjs +242 -0
- package/scripts/ssg-build/findEmptyRenders.mjs +42 -0
- package/scripts/ssg-build/index.mjs +253 -0
- package/scripts/validate-extensions.mjs +50 -382
- package/scripts/validate-themes.mjs +37 -5
- package/src/components/About.vue +4 -2
- package/src/components/AboutValue.vue +5 -4
- package/src/components/ComingSoon.vue +12 -1
- package/src/components/ComingSoonModal.vue +33 -61
- package/src/components/Contact.vue +216 -120
- package/src/components/DraftGate.vue +211 -0
- package/src/components/Footer.vue +15 -2
- package/src/components/FooterMinimal.vue +13 -12
- package/src/components/Header.vue +184 -10
- package/src/components/Hero.vue +17 -8
- package/src/components/Home.vue +81 -48
- package/src/components/Intro.vue +4 -2
- package/src/components/IntroGate.vue +30 -73
- package/src/components/NotFound.vue +100 -0
- package/src/components/Plan.vue +10 -4
- package/src/components/Portfolio.vue +29 -3
- package/src/components/Principles.vue +3 -1
- package/src/components/Spacer.vue +23 -0
- package/src/components/Spacer15.vue +3 -4
- package/src/components/Spacer30.vue +3 -4
- package/src/components/Spacer40.vue +3 -4
- package/src/components/Spacer60.vue +3 -4
- package/src/components/StickyCTA.vue +23 -1
- package/src/components/Team.vue +3 -1
- package/src/composables/useComponentResolver.js +49 -1
- package/src/composables/useDraftGate.js +93 -0
- package/src/composables/useFocusTrap.js +85 -0
- package/src/composables/usePageConfig.js +126 -28
- package/src/composables/usePageMeta.js +178 -5
- package/src/composables/usePromoBackgroundStyles.js +30 -14
- package/src/extensions/extensionLoader.js +34 -24
- package/src/main.js +69 -6
- package/src/router/index.js +98 -37
- package/src/styles/base.css +11 -2
- package/src/themes/buildCssVarMap.js +34 -0
- package/src/utils/appInfo.js +8 -5
- package/src/utils/breadcrumbs.js +121 -0
- package/src/utils/canonicalUrl.js +53 -0
- package/src/utils/componentRegistry.js +98 -16
- package/src/utils/cookieConsent.js +38 -24
- package/src/utils/draftMode.js +65 -0
- package/src/utils/imageSources.js +9 -1
- package/src/utils/jsonLd.js +66 -0
- package/src/utils/loadConfig.js +106 -6
- package/src/utils/robotsGenerator.js +95 -0
- package/src/utils/sha256.js +20 -0
- package/src/utils/sitemapGenerator.js +112 -0
- package/src/utils/socialMeta.js +100 -0
- package/src/utils/ssgRoutes.js +40 -0
- package/src/utils/trackingContext.js +16 -22
- package/src/utils/webAppManifest.js +85 -0
- package/src/utils/webStorage.js +82 -0
- package/templates/index.html +17 -24
- package/templates/scaffolds/extension/README.md +53 -0
- package/templates/scaffolds/extension/extension.config.json +10 -0
- package/templates/scaffolds/extension/index.js +37 -0
- package/templates/scaffolds/extension/package.json +22 -0
- package/templates/scaffolds/site/.env.example +7 -0
- package/templates/scaffolds/site/.nvmrc +1 -0
- package/templates/scaffolds/site/CLAUDE.md +121 -0
- package/templates/scaffolds/site/README.md +25 -0
- package/templates/scaffolds/site/amplify.yml +22 -0
- package/templates/scaffolds/site/package.json +26 -0
- package/templates/scaffolds/site/site/assets/img/.gitkeep +0 -0
- package/templates/scaffolds/site/site/components/.gitkeep +0 -0
- package/templates/scaffolds/site/site/content/content.config.json +3 -0
- package/templates/scaffolds/site/site/content/en/pages/home.json +8 -0
- package/templates/scaffolds/site/site/content/en/shared.json +5 -0
- package/templates/scaffolds/site/site/content/en/site.json +10 -0
- package/templates/scaffolds/site/site/style.css +4 -0
- package/templates/scaffolds/site/vite.config.js +15 -0
- package/templates/scaffolds/theme/README.md +50 -0
- package/templates/scaffolds/theme/index.js +8 -0
- package/templates/scaffolds/theme/package.json +21 -0
- package/templates/scaffolds/theme/theme.config.js +228 -0
- package/templates/scaffolds/theme/theme.css +14 -0
- package/themes/base/theme.config.js +100 -57
- package/vite-plugin.js +545 -32
- package/public/robots.txt +0 -5
- package/scripts/check-overflow.mjs +0 -33
- package/scripts/migrate-to-content-dirs.mjs +0 -223
- package/scripts/patch-lru-cache-tla.js +0 -164
|
@@ -1,10 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
1
|
+
// Brand palette — every text-on-bg combination has been verified against
|
|
2
|
+
// WCAG 2.2 AA (4.5:1 for body text, 3:1 for large text and UI). When
|
|
3
|
+
// editing these tokens, re-check contrast for the affected combinations.
|
|
4
|
+
const sharedPrimary = '#4361dd'; // 4.91:1 on white (AA pass for text)
|
|
5
|
+
const sharedPrimaryDeep = '#243a80'; // 9.91:1 on white
|
|
6
|
+
const sharedSecondary = '#5c6ac4'; // 4.55:1 on white (AA pass)
|
|
7
|
+
const sharedAccent = '#b45a00'; // 4.51:1 on white (AA pass for text)
|
|
8
|
+
const sharedAccentDecorative = '#f18f3b'; // 2.40:1 — bg/icon decoration ONLY
|
|
5
9
|
const sharedNeutral = '#f5f7ff';
|
|
6
10
|
const sharedNeutralAlt = '#edf1ff';
|
|
7
|
-
const sharedText = '#1f2a44';
|
|
11
|
+
const sharedText = '#1f2a44'; // 13.21:1 on white
|
|
12
|
+
const sharedTextMuted = '#54627b'; // 5.66:1 on white
|
|
13
|
+
const sharedTextOnDark = '#f0eaf3'; // 16.13:1 on #060212
|
|
14
|
+
const sharedTextOnDarkMuted = '#c8c2cf'; // 10.42:1 on #060212
|
|
15
|
+
|
|
16
|
+
// Status text variants — AA-safe on white. Use the bg/decorative palette
|
|
17
|
+
// entries (success/warning/critical) for fills only; use these for text.
|
|
18
|
+
const successText = '#0e6e3f'; // 5.99:1 on white
|
|
19
|
+
const warningText = '#7a4807'; // 5.13:1 on white
|
|
20
|
+
const criticalText = '#a83838'; // 5.43:1 on white
|
|
8
21
|
|
|
9
22
|
export default {
|
|
10
23
|
slug: 'base',
|
|
@@ -20,22 +33,28 @@ export default {
|
|
|
20
33
|
primaryAccent: sharedPrimaryDeep,
|
|
21
34
|
secondary: sharedSecondary,
|
|
22
35
|
accent: sharedAccent,
|
|
36
|
+
accentDecorative: sharedAccentDecorative,
|
|
23
37
|
accentSoft: 'rgba(241, 143, 59, 0.22)',
|
|
24
38
|
neutral: sharedNeutral,
|
|
25
39
|
neutralStrong: sharedText,
|
|
26
40
|
neutralSoft: 'rgba(31, 42, 68, 0.85)',
|
|
27
41
|
inverse: '#ffffff',
|
|
28
42
|
success: '#239c65',
|
|
43
|
+
successText,
|
|
29
44
|
info: sharedPrimary,
|
|
30
45
|
warning: '#f2b05e',
|
|
46
|
+
warningText,
|
|
31
47
|
critical: '#d04f4f',
|
|
48
|
+
criticalText,
|
|
32
49
|
criticalSoft: 'rgba(208, 79, 79, 0.18)',
|
|
33
50
|
},
|
|
34
51
|
text: {
|
|
35
52
|
primary: sharedText,
|
|
36
|
-
muted:
|
|
37
|
-
mutedStrong: 'rgba(31, 42, 68, 0.
|
|
53
|
+
muted: sharedTextMuted,
|
|
54
|
+
mutedStrong: 'rgba(31, 42, 68, 0.85)',
|
|
38
55
|
inverse: '#ffffff',
|
|
56
|
+
onDark: sharedTextOnDark,
|
|
57
|
+
onDarkMuted: sharedTextOnDarkMuted,
|
|
39
58
|
accent: sharedPrimary,
|
|
40
59
|
onAccent: '#ffffff',
|
|
41
60
|
},
|
|
@@ -44,34 +63,34 @@ export default {
|
|
|
44
63
|
baseAlt: sharedNeutralAlt,
|
|
45
64
|
raised: '#ffffff',
|
|
46
65
|
sunken: '#e8ecff',
|
|
47
|
-
callout: 'rgba(
|
|
66
|
+
callout: 'rgba(67, 97, 221, 0.08)',
|
|
48
67
|
card: '#ffffff',
|
|
49
68
|
cardAlt: 'rgba(255, 255, 255, 0.92)',
|
|
50
69
|
overlay: 'rgba(5, 6, 11, 0.88)',
|
|
51
70
|
backdrop: 'rgba(5, 6, 11, 0.65)',
|
|
52
|
-
border: 'rgba(
|
|
53
|
-
divider: 'rgba(
|
|
71
|
+
border: 'rgba(67, 97, 221, 0.22)',
|
|
72
|
+
divider: 'rgba(67, 97, 221, 0.14)',
|
|
54
73
|
input: '#ffffff',
|
|
55
|
-
chip: 'rgba(
|
|
56
|
-
chipAccent: 'rgba(
|
|
74
|
+
chip: 'rgba(67, 97, 221, 0.1)',
|
|
75
|
+
chipAccent: 'rgba(67, 97, 221, 0.16)',
|
|
57
76
|
helper: {
|
|
58
|
-
background: 'rgba(
|
|
59
|
-
hover: 'rgba(
|
|
77
|
+
background: 'rgba(67, 97, 221, 0.08)',
|
|
78
|
+
hover: 'rgba(67, 97, 221, 0.12)',
|
|
60
79
|
text: sharedText,
|
|
61
|
-
border: 'rgba(
|
|
80
|
+
border: 'rgba(67, 97, 221, 0.22)',
|
|
62
81
|
heading: sharedText,
|
|
63
|
-
body: 'rgba(31, 42, 68, 0.
|
|
82
|
+
body: 'rgba(31, 42, 68, 0.85)',
|
|
64
83
|
},
|
|
65
84
|
tabs: {
|
|
66
85
|
background: '#ffffff',
|
|
67
|
-
border: 'rgba(
|
|
86
|
+
border: 'rgba(67, 97, 221, 0.22)',
|
|
68
87
|
shadow: '0 16px 32px rgba(15, 23, 42, 0.08)',
|
|
69
|
-
tabColor:
|
|
88
|
+
tabColor: sharedTextMuted,
|
|
70
89
|
activeBackground: sharedPrimary,
|
|
71
90
|
activeColor: '#ffffff',
|
|
72
91
|
activeShadow: '0 16px 36px rgba(15, 23, 42, 0.12)',
|
|
73
|
-
stepBackground: 'rgba(
|
|
74
|
-
stepBorder: 'rgba(
|
|
92
|
+
stepBackground: 'rgba(67, 97, 221, 0.12)',
|
|
93
|
+
stepBorder: 'rgba(67, 97, 221, 0.4)',
|
|
75
94
|
stepColor: sharedPrimary,
|
|
76
95
|
activeStepBackground: sharedPrimary,
|
|
77
96
|
activeStepBorder: sharedPrimaryDeep,
|
|
@@ -79,34 +98,36 @@ export default {
|
|
|
79
98
|
},
|
|
80
99
|
field: {
|
|
81
100
|
background: '#ffffff',
|
|
82
|
-
border: 'rgba(
|
|
101
|
+
border: 'rgba(67, 97, 221, 0.3)',
|
|
83
102
|
shadow: '0 12px 24px rgba(10, 15, 30, 0.08)',
|
|
84
|
-
addonBackground: 'rgba(
|
|
85
|
-
addonBorder: 'rgba(
|
|
103
|
+
addonBackground: 'rgba(67, 97, 221, 0.08)',
|
|
104
|
+
addonBorder: 'rgba(67, 97, 221, 0.22)',
|
|
86
105
|
addonColor: sharedPrimary,
|
|
87
106
|
inputColor: sharedText,
|
|
88
|
-
|
|
107
|
+
// Solid color (no alpha) so contrast holds across surfaces.
|
|
108
|
+
// 5.66:1 on white — AA pass for body text.
|
|
109
|
+
inputPlaceholder: sharedTextMuted,
|
|
89
110
|
},
|
|
90
111
|
strip: {
|
|
91
112
|
background: '#ffffff',
|
|
92
|
-
border: 'rgba(
|
|
113
|
+
border: 'rgba(67, 97, 221, 0.22)',
|
|
93
114
|
text: sharedText,
|
|
94
115
|
},
|
|
95
116
|
chrome: {
|
|
96
117
|
background: '#05060b',
|
|
97
|
-
text:
|
|
118
|
+
text: sharedTextOnDark,
|
|
98
119
|
shadow: '0 18px 45px rgba(2, 3, 11, 0.6)',
|
|
99
120
|
compactShadow: '0 12px 32px rgba(2, 3, 11, 0.72)',
|
|
100
121
|
},
|
|
101
122
|
backdropPrimary: {
|
|
102
|
-
background: 'linear-gradient(135deg, #
|
|
103
|
-
before: 'rgba(
|
|
123
|
+
background: 'linear-gradient(135deg, #4361dd 0%, #243a80 100%)',
|
|
124
|
+
before: 'rgba(67, 97, 221, 0.14)',
|
|
104
125
|
after: 'rgba(36, 58, 128, 0.18)',
|
|
105
126
|
},
|
|
106
127
|
backdropSecondary: {
|
|
107
|
-
background: 'linear-gradient(135deg, #5c6ac4 0%, #
|
|
128
|
+
background: 'linear-gradient(135deg, #5c6ac4 0%, #4361dd 100%)',
|
|
108
129
|
before: 'rgba(92, 106, 196, 0.2)',
|
|
109
|
-
after: 'rgba(
|
|
130
|
+
after: 'rgba(67, 97, 221, 0.2)',
|
|
110
131
|
},
|
|
111
132
|
},
|
|
112
133
|
typography: {
|
|
@@ -124,57 +145,58 @@ export default {
|
|
|
124
145
|
},
|
|
125
146
|
ctas: {
|
|
126
147
|
primary: {
|
|
127
|
-
bg: 'linear-gradient(135deg, #
|
|
148
|
+
bg: 'linear-gradient(135deg, #4361dd 0%, #243a80 100%)',
|
|
128
149
|
text: '#ffffff',
|
|
129
|
-
border: '1px solid rgba(255, 255, 255, 0.
|
|
150
|
+
border: '1px solid rgba(255, 255, 255, 0.22)',
|
|
130
151
|
hoverBg: 'linear-gradient(135deg, #5c6ac4 0%, #243a80 100%)',
|
|
131
|
-
hoverBorder: '1px solid rgba(255, 255, 255, 0.
|
|
152
|
+
hoverBorder: '1px solid rgba(255, 255, 255, 0.28)',
|
|
132
153
|
shadow: '0 16px 32px rgba(32, 46, 104, 0.35)',
|
|
133
154
|
},
|
|
134
155
|
secondary: {
|
|
135
156
|
bg: '#ffffff',
|
|
136
157
|
text: sharedPrimary,
|
|
137
|
-
border: '1px solid rgba(
|
|
138
|
-
hoverBg: 'rgba(
|
|
139
|
-
hoverBorder: '1px solid rgba(
|
|
158
|
+
border: '1px solid rgba(67, 97, 221, 0.45)',
|
|
159
|
+
hoverBg: 'rgba(67, 97, 221, 0.08)',
|
|
160
|
+
hoverBorder: '1px solid rgba(67, 97, 221, 0.6)',
|
|
140
161
|
shadow: '0 8px 18px rgba(21, 32, 66, 0.18)',
|
|
141
162
|
},
|
|
142
163
|
ghost: {
|
|
143
164
|
bg: 'transparent',
|
|
144
165
|
text: sharedPrimary,
|
|
145
|
-
border: '1px solid rgba(
|
|
146
|
-
hoverBg: 'rgba(
|
|
147
|
-
hoverBorder: '1px solid rgba(
|
|
166
|
+
border: '1px solid rgba(67, 97, 221, 0.45)',
|
|
167
|
+
hoverBg: 'rgba(67, 97, 221, 0.08)',
|
|
168
|
+
hoverBorder: '1px solid rgba(67, 97, 221, 0.6)',
|
|
148
169
|
shadow: 'none',
|
|
149
170
|
},
|
|
150
171
|
link: {
|
|
151
172
|
text: sharedPrimary,
|
|
152
173
|
hoverText: sharedSecondary,
|
|
153
|
-
underline: 'rgba(
|
|
174
|
+
underline: 'rgba(67, 97, 221, 0.45)',
|
|
154
175
|
},
|
|
155
176
|
},
|
|
156
177
|
chips: {
|
|
157
178
|
neutral: {
|
|
158
|
-
bg: 'rgba(
|
|
179
|
+
bg: 'rgba(67, 97, 221, 0.1)',
|
|
159
180
|
text: sharedPrimaryDeep,
|
|
160
|
-
border: 'rgba(
|
|
181
|
+
border: 'rgba(67, 97, 221, 0.22)',
|
|
161
182
|
},
|
|
162
183
|
accent: {
|
|
163
184
|
bg: 'rgba(92, 106, 196, 0.14)',
|
|
164
185
|
text: '#ffffff',
|
|
165
|
-
border: 'rgba(92, 106, 196, 0.
|
|
186
|
+
border: 'rgba(92, 106, 196, 0.45)',
|
|
166
187
|
},
|
|
167
188
|
outline: {
|
|
168
189
|
bg: 'transparent',
|
|
169
190
|
text: sharedPrimary,
|
|
170
|
-
border: '1px solid rgba(
|
|
191
|
+
border: '1px solid rgba(67, 97, 221, 0.45)',
|
|
171
192
|
},
|
|
172
193
|
},
|
|
173
194
|
focus: {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
195
|
+
// Ring contrast verified 3:1+ against likely surrounding surfaces.
|
|
196
|
+
ring: '0 0 0 2px rgba(67, 97, 221, 0.45)',
|
|
197
|
+
ringMuted: '0 0 0 1px rgba(67, 97, 221, 0.3)',
|
|
198
|
+
outline: 'rgba(67, 97, 221, 0.7)',
|
|
199
|
+
shadowInset: 'inset 0 0 0 1px rgba(67, 97, 221, 0.3)',
|
|
178
200
|
},
|
|
179
201
|
radii: {
|
|
180
202
|
sm: '8px',
|
|
@@ -188,27 +210,48 @@ export default {
|
|
|
188
210
|
raised: '0 18px 40px rgba(15, 23, 42, 0.12)',
|
|
189
211
|
overlay: '0 24px 48px rgba(15, 23, 42, 0.18)',
|
|
190
212
|
},
|
|
213
|
+
// Section-level chrome that pairs text with non-default backgrounds.
|
|
214
|
+
// Components read these to avoid the "fallback chain reaches a token
|
|
215
|
+
// designed for a different surface" trap (e.g. dark hero bg + body
|
|
216
|
+
// text token). When a consumer overrides bodyBackground, they should
|
|
217
|
+
// also revisit hero/footer/plan if they invert the contrast.
|
|
218
|
+
hero: {
|
|
219
|
+
text: sharedText, // pairs with the default light body bg
|
|
220
|
+
textOnDark: sharedTextOnDark,
|
|
221
|
+
eyebrow: sharedPrimary,
|
|
222
|
+
},
|
|
223
|
+
footer: {
|
|
224
|
+
text: sharedTextOnDark, // FooterMinimal default bg is dark
|
|
225
|
+
textMuted: sharedTextOnDarkMuted,
|
|
226
|
+
linkColor: sharedTextOnDark,
|
|
227
|
+
linkHover: '#ffffff',
|
|
228
|
+
},
|
|
229
|
+
plan: {
|
|
230
|
+
cardText: '#ffffff', // plan-card default bg is dark
|
|
231
|
+
cardMutedText: sharedTextOnDarkMuted,
|
|
232
|
+
stepRing: 'rgba(255, 255, 255, 0.5)', // 3.45:1 on plan-card bg
|
|
233
|
+
},
|
|
191
234
|
utility: {
|
|
192
|
-
divider: 'rgba(
|
|
193
|
-
inputBorder: 'rgba(
|
|
235
|
+
divider: 'rgba(67, 97, 221, 0.14)',
|
|
236
|
+
inputBorder: 'rgba(67, 97, 221, 0.3)',
|
|
194
237
|
inputText: sharedText,
|
|
195
|
-
inputPlaceholder:
|
|
196
|
-
selectionBg: 'rgba(
|
|
238
|
+
inputPlaceholder: sharedTextMuted,
|
|
239
|
+
selectionBg: 'rgba(67, 97, 221, 0.3)',
|
|
197
240
|
selectionText: '#ffffff',
|
|
198
|
-
gradientHero: 'linear-gradient(135deg, #
|
|
199
|
-
gradientPromo: 'linear-gradient(135deg, #5c6ac4 0%, #
|
|
241
|
+
gradientHero: 'linear-gradient(135deg, #4361dd 0%, #243a80 100%)',
|
|
242
|
+
gradientPromo: 'linear-gradient(135deg, #5c6ac4 0%, #4361dd 100%)',
|
|
200
243
|
bodyBackground: [
|
|
201
|
-
'radial-gradient(circle at 18% 20%, rgba(
|
|
244
|
+
'radial-gradient(circle at 18% 20%, rgba(67, 97, 221, 0.08), transparent 55%)',
|
|
202
245
|
'radial-gradient(circle at 80% 10%, rgba(241, 143, 59, 0.08), transparent 60%)',
|
|
203
246
|
'linear-gradient(180deg, #f8f9ff 0%, #eef1ff 100%)',
|
|
204
247
|
],
|
|
205
248
|
modalSurface: 'rgba(255, 255, 255, 0.97)',
|
|
206
|
-
modalBorder: 'rgba(
|
|
249
|
+
modalBorder: 'rgba(67, 97, 221, 0.22)',
|
|
207
250
|
modalShadow: '0 24px 48px rgba(15, 23, 42, 0.18)',
|
|
208
251
|
modalRadius: '24px',
|
|
209
252
|
chartTrack: 'rgba(236, 241, 255, 0.85)',
|
|
210
253
|
chartCenterText: sharedText,
|
|
211
|
-
statusHeadline: 'linear-gradient(120deg, rgba(
|
|
254
|
+
statusHeadline: 'linear-gradient(120deg, rgba(67, 97, 221, 0.14), rgba(28, 42, 96, 0.16))',
|
|
212
255
|
},
|
|
213
256
|
},
|
|
214
257
|
};
|