@growth-labs/cms 0.5.25 → 0.5.27

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 (76) hide show
  1. package/dist/providers/null.d.ts.map +1 -1
  2. package/dist/providers/null.js +8 -0
  3. package/dist/providers/null.js.map +1 -1
  4. package/dist/providers/types.d.ts +26 -1
  5. package/dist/providers/types.d.ts.map +1 -1
  6. package/dist/providers/types.js.map +1 -1
  7. package/dist/ui/client/mount.d.ts +1 -0
  8. package/dist/ui/client/mount.d.ts.map +1 -1
  9. package/dist/ui/client/mount.js +1 -0
  10. package/dist/ui/client/mount.js.map +1 -1
  11. package/dist/ui/components/CmsApp.js +2 -11
  12. package/dist/ui/components/CmsApp.js.map +1 -1
  13. package/dist/ui/components/Sidebar.d.ts.map +1 -1
  14. package/dist/ui/components/Sidebar.js +2 -2
  15. package/dist/ui/components/Sidebar.js.map +1 -1
  16. package/dist/ui/components/Topbar.d.ts.map +1 -1
  17. package/dist/ui/components/Topbar.js +1 -10
  18. package/dist/ui/components/Topbar.js.map +1 -1
  19. package/dist/ui/editor/ContentForm.d.ts.map +1 -1
  20. package/dist/ui/editor/ContentForm.js +7 -8
  21. package/dist/ui/editor/ContentForm.js.map +1 -1
  22. package/dist/ui/editor/Rte.js +3 -3
  23. package/dist/ui/editor/Rte.js.map +1 -1
  24. package/dist/ui/inspector/FoundryTab.js +1 -1
  25. package/dist/ui/inspector/FoundryTab.js.map +1 -1
  26. package/dist/ui/pages/admin.astro +1 -1
  27. package/dist/ui/screens/AnalyticsScreen.d.ts +7 -0
  28. package/dist/ui/screens/AnalyticsScreen.d.ts.map +1 -1
  29. package/dist/ui/screens/AnalyticsScreen.js +38 -9
  30. package/dist/ui/screens/AnalyticsScreen.js.map +1 -1
  31. package/dist/ui/screens/AuthorsScreen.js +1 -1
  32. package/dist/ui/screens/ContentInsightsScreen.js +1 -1
  33. package/dist/ui/screens/ContentInsightsScreen.js.map +1 -1
  34. package/dist/ui/screens/EditorScreen.d.ts +3 -0
  35. package/dist/ui/screens/EditorScreen.d.ts.map +1 -1
  36. package/dist/ui/screens/EditorScreen.js +15 -9
  37. package/dist/ui/screens/EditorScreen.js.map +1 -1
  38. package/dist/ui/screens/LibraryScreen.js +2 -2
  39. package/dist/ui/screens/LibraryScreen.js.map +1 -1
  40. package/dist/ui/screens/SettingsScreen.js +1 -1
  41. package/dist/ui/screens/SubscriptionsScreen.js +2 -2
  42. package/dist/ui/screens/analytics-data.d.ts.map +1 -1
  43. package/dist/ui/screens/analytics-data.js +16 -1
  44. package/dist/ui/screens/analytics-data.js.map +1 -1
  45. package/dist/ui/styles/broadsheet.css +131 -156
  46. package/dist/ui/styles/growth-labs-tokens.css +149 -0
  47. package/dist/ui/theme.d.ts +7 -4
  48. package/dist/ui/theme.d.ts.map +1 -1
  49. package/dist/ui/theme.js +24 -65
  50. package/dist/ui/theme.js.map +1 -1
  51. package/dist/ui/use-tweaks.d.ts.map +1 -1
  52. package/dist/ui/use-tweaks.js +2 -1
  53. package/dist/ui/use-tweaks.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/providers/null.ts +8 -0
  56. package/src/providers/types.ts +27 -1
  57. package/src/ui/client/mount.tsx +1 -0
  58. package/src/ui/components/CmsApp.tsx +3 -20
  59. package/src/ui/components/Sidebar.tsx +5 -11
  60. package/src/ui/components/Topbar.tsx +2 -13
  61. package/src/ui/editor/ContentForm.tsx +7 -8
  62. package/src/ui/editor/Rte.tsx +3 -3
  63. package/src/ui/inspector/FoundryTab.tsx +1 -1
  64. package/src/ui/pages/admin.astro +1 -1
  65. package/src/ui/screens/AnalyticsScreen.tsx +86 -7
  66. package/src/ui/screens/AuthorsScreen.tsx +1 -1
  67. package/src/ui/screens/ContentInsightsScreen.tsx +1 -1
  68. package/src/ui/screens/EditorScreen.tsx +17 -9
  69. package/src/ui/screens/LibraryScreen.tsx +5 -2
  70. package/src/ui/screens/SettingsScreen.tsx +1 -1
  71. package/src/ui/screens/SubscriptionsScreen.tsx +2 -2
  72. package/src/ui/screens/analytics-data.ts +16 -2
  73. package/src/ui/styles/broadsheet.css +131 -156
  74. package/src/ui/styles/growth-labs-tokens.css +149 -0
  75. package/src/ui/theme.ts +29 -68
  76. package/src/ui/use-tweaks.ts +2 -1
@@ -0,0 +1,149 @@
1
+ /* @growth-labs/cms token snapshot.
2
+ * Source: growthlabs-work/src/styles/ds/tokens/{colors,effects,spacing,themes,typography}.css
3
+ * Verified: 2026-08-21. Package-owned because growthlabs-work is not a runtime dependency. */
4
+
5
+ :root {
6
+ --gl-mint-100: #DFFBE7;
7
+ --gl-mint-200: #B3FBE8;
8
+ --gl-aqua-300: #9AFBE9;
9
+ --gl-cyan-400: #50F5EC;
10
+ --gl-cyan-500: #46FBF5;
11
+ --gl-teal-400: #3ED1C6;
12
+ --gl-teal-500: #1FA3A8;
13
+ --gl-blue-400: #44C2ED;
14
+ --gl-blue-500: #2CA8E0;
15
+ --gl-coral: #F56A61;
16
+ --gl-coral-soft: #F89787;
17
+ --gl-orange: #F7A34B;
18
+ --gl-orange-soft: #FBB35E;
19
+ --gl-pink: #F0659C;
20
+ --gl-magenta: #F230B7;
21
+ --gl-purple: #8C5FD3;
22
+ --gl-violet: #8075ED;
23
+ --gl-periwinkle: #B3C5EA;
24
+ --gl-interactive: #2F6FBD;
25
+ --gl-interactive-hover: #3578C4;
26
+ --gl-interactive-active: #245CA8;
27
+ --gl-focus-ring: #1E5EA8;
28
+ --gl-white: #FFFFFF;
29
+ --gl-off-white: #F8FAFA;
30
+ --gl-light-gray: #F5F6F8;
31
+ --gl-mist: #ECF1F0;
32
+ --gl-mint-wash: #CFEDE8;
33
+ --gl-border: #D6DEE3;
34
+ --gl-gray: #B3B3B3;
35
+ --gl-text-light: #8C8C8C;
36
+ --gl-text: #4D4D4D;
37
+ --gl-charcoal: #2B2F33;
38
+ --gl-ink-900: #16191C;
39
+ --gl-ink-800: #1E2227;
40
+ --gl-ink-700: #262A30;
41
+ --gl-ink-600: #2F343A;
42
+ --gl-ink-500: #3A4046;
43
+ --gl-ink-text: #E7ECEB;
44
+ --gl-ink-text-soft: #A7B0B4;
45
+ --gl-ink-text-mute: #79838A;
46
+ --gl-gradient: linear-gradient(135deg, #A4F1D8 0%, #3ED1C6 50%, #2CA8E0 100%);
47
+ --gl-gradient-bright: linear-gradient(135deg, #DFFBE7 0%, #83FBEC 50%, #44C2ED 100%);
48
+ --gl-gradient-warm: linear-gradient(135deg, #F7A34B 0%, #F56A61 55%, #F0659C 100%);
49
+
50
+ --surface-page: var(--gl-mist);
51
+ --surface-card: var(--gl-white);
52
+ --surface-muted: var(--gl-light-gray);
53
+ --surface-inverse: var(--gl-charcoal);
54
+ --surface-nav: rgba(255, 255, 255, 0.82);
55
+ --surface-raised-nav: rgba(255, 255, 255, 0.92);
56
+ --text-primary: var(--gl-text);
57
+ --text-strong: var(--gl-charcoal);
58
+ --text-secondary: var(--gl-text-light);
59
+ --text-muted: var(--gl-gray);
60
+ --text-on-dark: var(--gl-white);
61
+ --text-on-inverse: var(--gl-white);
62
+ --text-accent: var(--gl-interactive);
63
+ --border-default: var(--gl-border);
64
+ --border-strong: var(--gl-gray);
65
+ --accent-primary: var(--gl-teal-400);
66
+ --accent-primary-strong: var(--gl-teal-500);
67
+ --accent-secondary: var(--gl-blue-500);
68
+ --accent-cta: var(--gl-interactive);
69
+ --accent-cta-hover: var(--gl-interactive-hover);
70
+ --accent-cta-active: var(--gl-interactive-active);
71
+ --accent-warm: var(--gl-coral);
72
+ --focus-ring: var(--gl-focus-ring);
73
+
74
+ --radius-none: 0;
75
+ --radius-sm: 2px;
76
+ --radius-md: 4px;
77
+ --radius-control: 6px;
78
+ --radius-pill: 999px;
79
+ --radius-circle: 50%;
80
+ --shadow-faint: 0 6px 14px rgba(77, 77, 77, 0.06);
81
+ --shadow-card: 0 8px 18px rgba(77, 77, 77, 0.08);
82
+ --shadow-raised: 0 14px 30px rgba(43, 47, 51, 0.12);
83
+ --shadow-chip: 0 10px 20px rgba(43, 47, 51, 0.10);
84
+ --shadow-glow: 0 0 0 6px rgba(62, 209, 198, 0.18);
85
+ --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
86
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
87
+ --duration-fast: 90ms;
88
+ --duration-base: 140ms;
89
+ --duration-slow: 320ms;
90
+ --blur-panel: blur(14px);
91
+ --border-thin: 1px;
92
+ --border-thick: 2px;
93
+
94
+ --space-0: 0;
95
+ --space-1: 4px;
96
+ --space-2: 8px;
97
+ --space-3: 12px;
98
+ --space-4: 16px;
99
+ --space-5: 24px;
100
+ --space-6: 32px;
101
+ --space-7: 48px;
102
+ --space-8: 64px;
103
+ --space-9: 96px;
104
+ --space-10: 128px;
105
+
106
+ --font-display: "Space Grotesk", "Lato", system-ui, sans-serif;
107
+ --font-body: "Lato", "Space Grotesk", system-ui, sans-serif;
108
+ --font-mono: "Space Grotesk", ui-monospace, "SF Mono", Menlo, monospace;
109
+ --weight-light: 300;
110
+ --weight-regular: 400;
111
+ --weight-medium: 500;
112
+ --weight-semibold: 600;
113
+ --weight-bold: 700;
114
+ --tracking-tighter: -0.02em;
115
+ --tracking-wide: 0.02em;
116
+ --tracking-eyebrow: 0.08em;
117
+ }
118
+
119
+ [data-theme="dark"],
120
+ .gl-dark {
121
+ color-scheme: dark;
122
+ --surface-page: var(--gl-ink-800);
123
+ --surface-card: var(--gl-ink-700);
124
+ --surface-muted: var(--gl-ink-600);
125
+ --surface-inverse: var(--gl-mist);
126
+ --surface-nav: rgba(24, 27, 31, 0.82);
127
+ --surface-raised-nav: rgba(24, 27, 31, 0.92);
128
+ --text-primary: var(--gl-ink-text);
129
+ --text-strong: var(--gl-ink-text);
130
+ --text-secondary: var(--gl-ink-text-soft);
131
+ --text-muted: var(--gl-ink-text-mute);
132
+ --text-on-dark: var(--gl-ink-text);
133
+ --text-on-inverse: var(--gl-charcoal);
134
+ --text-accent: var(--gl-cyan-400);
135
+ --border-default: rgba(255, 255, 255, 0.12);
136
+ --border-strong: rgba(255, 255, 255, 0.24);
137
+ --accent-primary: var(--gl-teal-400);
138
+ --accent-primary-strong: var(--gl-cyan-400);
139
+ --accent-secondary: var(--gl-blue-400);
140
+ --accent-cta: #3F86D8;
141
+ --accent-cta-hover: var(--gl-blue-400);
142
+ --accent-cta-active: var(--gl-interactive);
143
+ --focus-ring: var(--gl-cyan-400);
144
+ --shadow-faint: 0 6px 14px rgba(0, 0, 0, 0.35);
145
+ --shadow-card: 0 8px 18px rgba(0, 0, 0, 0.42);
146
+ --shadow-raised: 0 16px 34px rgba(0, 0, 0, 0.52);
147
+ --shadow-chip: 0 10px 20px rgba(0, 0, 0, 0.45);
148
+ --shadow-glow: 0 0 0 6px rgba(62, 209, 198, 0.22);
149
+ }
package/src/ui/theme.ts CHANGED
@@ -1,6 +1,5 @@
1
- // src/ui/theme.ts theme tokens ported from the resolved Broadsheet design
2
- // (app.jsx). The accent/serif vars are applied to documentElement at runtime by
3
- // the useTweaks effect; broadsheet.css carries the rest.
1
+ // Compatibility helpers for the fixed Growth Labs visual contract. Theme and
2
+ // density remain user preferences; brand accent and typography do not.
4
3
 
5
4
  export interface AccentSet {
6
5
  a: string
@@ -9,66 +8,25 @@ export interface AccentSet {
9
8
  tint: string
10
9
  ring: string
11
10
  }
12
- export type AccentName = 'Ink blue' | 'Press red' | 'Forest' | 'Violet'
11
+ type BrandAccentName = 'Growth Labs'
12
+ export type AccentName = BrandAccentName | 'Ink blue' | 'Press red' | 'Forest' | 'Violet'
13
13
 
14
- export const ACCENTS: Record<AccentName, AccentSet> = {
15
- 'Ink blue': {
16
- a: '#0c4a6e',
17
- s: '#075985',
18
- fg: '#ffffff',
19
- tint: 'rgba(12,74,110,0.09)',
20
- ring: 'rgba(12,74,110,0.38)',
21
- },
22
- 'Press red': {
23
- a: '#b23a2e',
24
- s: '#962f25',
25
- fg: '#ffffff',
26
- tint: 'rgba(178,58,46,0.10)',
27
- ring: 'rgba(178,58,46,0.38)',
28
- },
29
- Forest: {
30
- a: '#1f6b4a',
31
- s: '#19583d',
32
- fg: '#ffffff',
33
- tint: 'rgba(31,107,74,0.10)',
34
- ring: 'rgba(31,107,74,0.38)',
35
- },
36
- Violet: {
37
- a: '#5b4bc4',
38
- s: '#4c3ea8',
39
- fg: '#ffffff',
40
- tint: 'rgba(91,75,196,0.10)',
41
- ring: 'rgba(91,75,196,0.38)',
14
+ export const ACCENTS: Record<BrandAccentName, AccentSet> = {
15
+ 'Growth Labs': {
16
+ a: '#2F6FBD',
17
+ s: '#245CA8',
18
+ fg: '#FFFFFF',
19
+ tint: 'rgba(62,209,198,0.14)',
20
+ ring: '#1E5EA8',
42
21
  },
43
22
  }
44
- export const ACCENTS_DARK: Record<AccentName, AccentSet> = {
45
- 'Ink blue': {
46
- a: '#4c9ae8',
47
- s: '#3b86d4',
48
- fg: '#06121d',
49
- tint: 'rgba(76,154,232,0.16)',
50
- ring: 'rgba(76,154,232,0.45)',
51
- },
52
- 'Press red': {
53
- a: '#ef6e62',
54
- s: '#e05348',
55
- fg: '#1d0a08',
56
- tint: 'rgba(239,110,98,0.16)',
57
- ring: 'rgba(239,110,98,0.45)',
58
- },
59
- Forest: {
60
- a: '#4ec98a',
61
- s: '#3bb476',
62
- fg: '#06160f',
63
- tint: 'rgba(78,201,138,0.16)',
64
- ring: 'rgba(78,201,138,0.45)',
65
- },
66
- Violet: {
67
- a: '#9d8df0',
68
- s: '#8978e6',
69
- fg: '#0e0a1d',
70
- tint: 'rgba(157,141,240,0.16)',
71
- ring: 'rgba(157,141,240,0.45)',
23
+ export const ACCENTS_DARK: Record<BrandAccentName, AccentSet> = {
24
+ 'Growth Labs': {
25
+ a: '#3F86D8',
26
+ s: '#2F6FBD',
27
+ fg: '#FFFFFF',
28
+ tint: 'rgba(62,209,198,0.18)',
29
+ ring: '#50F5EC',
72
30
  },
73
31
  }
74
32
 
@@ -77,23 +35,26 @@ export type Density = 'compact' | 'regular' | 'comfy'
77
35
  export type PreviewPos = 'right' | 'bottom' | 'off'
78
36
 
79
37
  export const TWEAK_DEFAULTS = {
80
- theme: 'dark' as ThemeMode,
81
- accent: 'Ink blue' as AccentName,
38
+ theme: 'light' as ThemeMode,
39
+ accent: 'Growth Labs' as AccentName,
82
40
  density: 'regular' as Density,
83
41
  previewPos: 'off' as PreviewPos,
84
- serifDisplay: true,
42
+ serifDisplay: false,
85
43
  }
86
44
 
87
- const SERIF = '"Source Serif 4", Georgia, serif'
88
- const SANS = '"DM Sans", system-ui, sans-serif'
45
+ const DISPLAY = '"Space Grotesk", "Lato", system-ui, sans-serif'
46
+
47
+ export function serifVar(_serifDisplay: boolean): string {
48
+ return DISPLAY
49
+ }
89
50
 
90
- export function serifVar(serifDisplay: boolean): string {
91
- return serifDisplay ? SERIF : SANS
51
+ export function inverseTextVar(theme: ThemeMode): string {
52
+ return theme === 'dark' ? '#2B2F33' : '#FFFFFF'
92
53
  }
93
54
 
94
55
  export function resolveAccentVars(theme: ThemeMode, accent: AccentName): Record<string, string> {
95
56
  const table = theme === 'dark' ? ACCENTS_DARK : ACCENTS
96
- const set = table[accent] ?? table['Ink blue']
57
+ const set = table[accent as BrandAccentName] ?? table['Growth Labs']
97
58
  return {
98
59
  '--accent': set.a,
99
60
  '--accent-strong': set.s,
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useEffect, useState } from 'react'
2
- import { resolveAccentVars, serifVar } from './theme.js'
2
+ import { inverseTextVar, resolveAccentVars, serifVar } from './theme.js'
3
3
  import { applyTweak, loadTweaks, saveTweaks, type TweakState } from './tweaks.js'
4
4
 
5
5
  export function useTweaks(): {
@@ -26,6 +26,7 @@ export function useTweaks(): {
26
26
  for (const [k, val] of Object.entries(resolveAccentVars(t.theme, t.accent)))
27
27
  root.style.setProperty(k, val)
28
28
  root.style.setProperty('--serif', serifVar(t.serifDisplay))
29
+ root.style.setProperty('--text-on-inverse', inverseTextVar(t.theme))
29
30
  }, [t.theme, t.density, t.accent, t.serifDisplay])
30
31
  return { t, setTweak }
31
32
  }