@ramme-io/create-app 2.0.0 → 2.0.1

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 (32) hide show
  1. package/README.md +2 -2
  2. package/index.js +1 -1
  3. package/package.json +1 -1
  4. package/template/index.html +1 -1
  5. package/template/package.json +14 -5
  6. package/template/public/_redirects +1 -0
  7. package/template/src/App.tsx +3 -2
  8. package/template/src/components/AppHeader.tsx +5 -0
  9. package/template/src/components/ScrollToTop.tsx +6 -6
  10. package/template/src/features/ai/pages/AiChat.tsx +136 -37
  11. package/template/src/features/auth/AuthContext.tsx +16 -6
  12. package/template/src/features/config/AppConfigContext.tsx +2 -2
  13. package/template/src/features/docs/pages/EdgeTelemetryDemo.tsx +149 -0
  14. package/template/src/features/onboarding/pages/AboutRamme.tsx +12 -12
  15. package/template/src/features/onboarding/pages/PrototypeGallery.tsx +8 -6
  16. package/template/src/features/onboarding/pages/RammeFeatures.tsx +18 -17
  17. package/template/src/features/onboarding/pages/RammeTutorial.tsx +20 -11
  18. package/template/src/features/onboarding/pages/Welcome.tsx +6 -6
  19. package/template/src/features/styleguide/sections/tables/TablesSection.tsx +25 -5
  20. package/template/src/features/theme/pages/ThemeCustomizerPage.tsx +344 -256
  21. package/template/src/features/theme/utils/ThemeGenerator.logic.ts +587 -0
  22. package/template/src/hooks/__tests__/useStudioHotkeys.test.ts +100 -0
  23. package/template/src/hooks/useStudioHotkeys.ts +36 -0
  24. package/template/src/index.css +91 -1
  25. package/template/src/main.tsx +44 -2
  26. package/template/src/templates/dashboard/DashboardLayout.tsx +6 -1
  27. package/template/src/templates/dashboard/dashboard.sitemap.ts +1 -1
  28. package/template/src/templates/docs/docs.sitemap.ts +8 -0
  29. package/template/src/templates/settings/SettingsLayout.tsx +13 -26
  30. package/template/src/test/setup.ts +1 -0
  31. package/template/tsconfig.app.json +1 -0
  32. package/template/vite.config.ts +7 -0
@@ -53,7 +53,7 @@ export const PrototypeGallery: React.FC = () => {
53
53
  const [activeVibe, setActiveVibe] = useState(VIBES[0]);
54
54
 
55
55
  return (
56
- <div className="space-y-12 py-12">
56
+ <div className="space-y-12 py-12 bg-background">
57
57
  <div className="text-center space-y-4">
58
58
  <h3 className="text-4xl font-black tracking-tighter uppercase">One Prototype. Infinite Vibes.</h3>
59
59
  <p className="text-muted-foreground max-w-xl mx-auto font-medium">
@@ -61,10 +61,10 @@ export const PrototypeGallery: React.FC = () => {
61
61
  </p>
62
62
  </div>
63
63
 
64
- <div className="grid grid-cols-1 lg:grid-cols-12 gap-10 items-center">
64
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-12 gap-8 lg:gap-10 items-start lg:items-center">
65
65
 
66
66
  {/* --- SELECTOR --- */}
67
- <div className="lg:col-span-4 space-y-3">
67
+ <div className="sm:col-span-2 lg:col-span-4 space-y-3">
68
68
  {VIBES.map((vibe) => (
69
69
  <button
70
70
  key={vibe.id}
@@ -72,7 +72,7 @@ export const PrototypeGallery: React.FC = () => {
72
72
  className={`w-full text-left p-5 rounded-2xl border transition-all duration-500 group relative overflow-hidden ${
73
73
  activeVibe.id === vibe.id
74
74
  ? 'border-primary bg-primary/10 shadow-2xl translate-x-3'
75
- : 'border-transparent opacity-40 hover:opacity-100 hover:bg-white/5'
75
+ : 'border-transparent opacity-40 hover:opacity-100 hover:bg-muted/10'
76
76
  }`}
77
77
  >
78
78
  <div className="flex items-center gap-4 relative z-10">
@@ -89,7 +89,7 @@ export const PrototypeGallery: React.FC = () => {
89
89
  </div>
90
90
 
91
91
  {/* --- DYNAMIC SIMULATION --- */}
92
- <div className="lg:col-span-8 relative group">
92
+ <div className="sm:col-span-2 lg:col-span-8 relative group">
93
93
  <div
94
94
  className="absolute -inset-10 blur-[120px] opacity-20 transition-colors duration-1000"
95
95
  style={{ backgroundColor: activeVibe.theme.accent }}
@@ -103,7 +103,9 @@ export const PrototypeGallery: React.FC = () => {
103
103
  }}
104
104
  >
105
105
  {/* Header Chrome */}
106
- <div className="h-12 border-b border-white/5 flex items-center px-6 bg-black/20 justify-between">
106
+ <div
107
+ className="h-12 border-b border-border flex items-center px-6 bg-muted/20 justify-between"
108
+ >
107
109
  <div className="flex gap-2">
108
110
  <div className="w-2.5 h-2.5 rounded-full bg-red-500/20" />
109
111
  <div className="w-2.5 h-2.5 rounded-full bg-yellow-500/20" />
@@ -24,8 +24,8 @@ const RammeFeatures: React.FC = () => {
24
24
 
25
25
  {/* --- HERO: THE RADICAL TRANSPARENCY --- */}
26
26
  <header className="pt-24 space-y-10">
27
- <Badge variant="primary" className="uppercase tracking-[0.4em] text-[10px] px-4 py-2 border-white/10 bg-white/5">
28
- Core Engine v4.2 // Open Protocol
27
+ <Badge variant="primary" className="uppercase tracking-[0.4em] text-[10px] px-4 py-2 border-primary/40 bg-primary/10 text-primary">
28
+ Core Engine v2.0 // Open Protocol
29
29
  </Badge>
30
30
  <div className="space-y-6">
31
31
  <h1 className="text-7xl md:text-[120px] font-black tracking-[-0.06em] leading-[0.8] text-foreground uppercase italic">
@@ -51,7 +51,7 @@ const RammeFeatures: React.FC = () => {
51
51
  Traditional prototypes "reset" when you refresh. Ramme’s kernel keeps your data alive by syncing state directly to the browser. Type once, keep it forever.
52
52
  </p>
53
53
  </div>
54
- <div className="rounded-3xl overflow-hidden border border-white/5 shadow-2xl">
54
+ <div className="rounded-3xl overflow-hidden border border-border shadow-2xl">
55
55
  <RammeCodeBlock
56
56
  variant="success"
57
57
  title="persistent_state.ts"
@@ -62,14 +62,14 @@ const RammeFeatures: React.FC = () => {
62
62
  </div>
63
63
 
64
64
  <div className="lg:col-span-5 grid grid-cols-1 gap-4">
65
- <Card className="p-10 bg-white/[0.03] border-white/5 backdrop-blur-md rounded-[2.5rem] flex flex-col justify-between hover:bg-white/[0.06] hover:border-white/20 transition-all group">
65
+ <Card className="p-10 bg-muted/5 border-border backdrop-blur-md rounded-[2.5rem] flex flex-col justify-between hover:bg-muted/10 hover:border-border/70 transition-all group">
66
66
  <Icon name={"refresh-cw" as any} style={{ color: successColor }} size={40} className="group-hover:rotate-180 transition-transform duration-700" />
67
67
  <div className="mt-8 space-y-2">
68
68
  <h5 className="font-black text-xl uppercase italic text-foreground tracking-tight">Hot-State Reload</h5>
69
69
  <p className="text-sm text-muted-foreground leading-relaxed">Change code and watch the UI update <strong>without losing your current scroll position or form data.</strong></p>
70
70
  </div>
71
71
  </Card>
72
- <Card className="p-10 bg-white/[0.03] border-white/5 backdrop-blur-md rounded-[2.5rem] flex flex-col justify-between hover:bg-white/[0.06] hover:border-white/20 transition-all group">
72
+ <Card className="p-10 bg-muted/5 border-border backdrop-blur-md rounded-[2.5rem] flex flex-col justify-between hover:bg-muted/10 hover:border-border/70 transition-all group">
73
73
  <Icon name={"hard-drive" as any} style={{ color: successColor }} size={40} />
74
74
  <div className="mt-8 space-y-2">
75
75
  <h5 className="font-black text-xl uppercase italic text-foreground tracking-tight">JSON Snapshots</h5>
@@ -87,8 +87,8 @@ const RammeFeatures: React.FC = () => {
87
87
 
88
88
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-16 mt-12 items-center">
89
89
  <div className="order-2 lg:order-1">
90
- <Card className="p-1.5 bg-gradient-to-br from-white/10 to-transparent rounded-[3.5rem] shadow-3xl overflow-hidden group/simulation">
91
- <div className="bg-[#0a0a0a] p-12 rounded-[3.2rem] space-y-8 border border-white/5">
90
+ <Card className="p-1.5 bg-gradient-to-br from-muted/10 to-transparent rounded-[3.5rem] shadow-3xl overflow-hidden group/simulation">
91
+ <div className="bg-background p-12 rounded-[3.2rem] space-y-8 border border-border">
92
92
  <div className="flex justify-between items-center">
93
93
  <Badge className="bg-primary/10 text-primary border-primary/20 font-mono text-[10px]">DNA_INJECTION_ACTIVE</Badge>
94
94
  <div className="flex gap-2">
@@ -97,11 +97,11 @@ const RammeFeatures: React.FC = () => {
97
97
  <div className="h-2 w-2 rounded-full bg-primary/40 animate-pulse" />
98
98
  </div>
99
99
  </div>
100
- <div className="p-8 bg-white/5 rounded-3xl border border-white/10 italic text-lg leading-relaxed text-primary/80 font-medium">
100
+ <div className="p-8 bg-muted/10 rounded-3xl border border-border italic text-lg leading-relaxed text-primary/80 font-medium">
101
101
  "Morph the system into a high-density tactical interface. Use monospace fonts, slate-900 backgrounds, and neon-cyan borders."
102
102
  </div>
103
- <Button className="w-full bg-primary text-black font-black uppercase tracking-[0.2em] h-16 rounded-2xl hover:brightness-110 transition-all shadow-lg">
104
- Apply Vibe Shift
103
+ <Button className="w-full bg-primary text-black font-black uppercase tracking-[0.2em] h-16 rounded-2xl hover:brightness-110 transition-all shadow-lg" onClick={() => navigate('/settings/theme')}>
104
+ Launch Theme Engine
105
105
  </Button>
106
106
  </div>
107
107
  </Card>
@@ -150,7 +150,7 @@ const RammeFeatures: React.FC = () => {
150
150
  { title: "Atomic Shell", desc: "Pre-engineered sidebars and navs that handle their own logic and state.", icon: "sidebar", color: infoColor },
151
151
  { title: "Mock Interceptors", desc: "Simulate real API traffic for production-ready testing without the backend.", icon: "terminal", color: primaryColor }
152
152
  ].map((feature, i) => (
153
- <Card key={i} className="p-10 border-white/5 bg-white/[0.03] backdrop-blur-md hover:bg-white/[0.08] hover:border-white/20 transition-all rounded-[3rem] group/card">
153
+ <Card key={i} className="p-10 border-border bg-muted/5 backdrop-blur-md hover:bg-muted/15 hover:border-border/70 transition-all rounded-[3rem] group/card">
154
154
  <Icon name={feature.icon as any} style={{ color: feature.color }} className="mb-8 group-hover/card:scale-110 transition-transform duration-500" size={32} />
155
155
  <h5 className="font-black uppercase text-lg mb-3 italic text-foreground tracking-tight">{feature.title}</h5>
156
156
  <p className="text-sm text-muted-foreground leading-relaxed font-medium">{feature.desc}</p>
@@ -161,7 +161,7 @@ const RammeFeatures: React.FC = () => {
161
161
  </section>
162
162
 
163
163
  {/* --- THE MANIFESTO FOOTER --- */}
164
- <footer className="pt-32 text-center border-t border-white/5 relative">
164
+ <footer className="pt-32 text-center border-t border-border relative">
165
165
  <div className="space-y-12">
166
166
  <h2 className="text-8xl md:text-[140px] font-black tracking-[-0.06em] text-foreground leading-[0.8] uppercase italic">
167
167
  Build <br/> <span style={{ color: primaryColor }}>Better.</span>
@@ -171,20 +171,21 @@ const RammeFeatures: React.FC = () => {
171
171
  size="lg"
172
172
  className="px-20 h-24 text-2xl font-black rounded-full shadow-[0_20px_50px_rgba(0,0,0,0.3)] hover:scale-105 transition-transform"
173
173
  style={{ backgroundColor: primaryColor, color: '#000' }}
174
- onClick={() => navigate('/dashboard')}
174
+ onClick={() => window.open('https://www.npmjs.com/package/@ramme-io/create-app', '_blank')}
175
175
  >
176
- Launch Simulation
176
+ Get Started — It's Free
177
+ <Icon name="external-link" size={20} className="ml-3" />
177
178
  </Button>
178
179
  <Button
179
180
  variant="ghost"
180
181
  className="text-foreground/60 hover:text-foreground font-black uppercase tracking-[0.3em] text-xs transition-colors group"
181
- onClick={() => navigate('/tutorial')}
182
+ onClick={() => navigate('/dashboard/ai-chat')}
182
183
  >
183
- Read the Manifesto
184
+ Ask the AI Assistant
184
185
  <Icon name="arrow-right" size={16} className="ml-2 group-hover:translate-x-2 transition-transform" />
185
186
  </Button>
186
187
  </div>
187
- <p className="font-mono text-[9px] text-foreground/20 tracking-[0.4em] uppercase">v.4.2.0-STABLE // SYSTEM READY</p>
188
+ <p className="font-mono text-[9px] text-foreground/20 tracking-[0.4em] uppercase">v.2.0.0 // SYSTEM READY</p>
188
189
  </div>
189
190
  </footer>
190
191
 
@@ -24,7 +24,7 @@ const RammeTutorial: React.FC = () => {
24
24
 
25
25
  {/* --- HERO SECTION --- */}
26
26
  <div className="text-center space-y-8 pt-20">
27
- <Badge variant="primary" className="uppercase tracking-[0.3em] text-[10px] px-4 py-1.5 border-primary/20 bg-primary/5">
27
+ <Badge variant="primary" className="uppercase tracking-[0.3em] text-[10px] px-4 py-1.5 border-primary/40 bg-primary/10 text-primary">
28
28
  The Creator's Handbook
29
29
  </Badge>
30
30
  <h1 className="text-7xl md:text-[110px] font-black tracking-[-0.02em] leading-[0.8] text-foreground uppercase">
@@ -46,7 +46,7 @@ const RammeTutorial: React.FC = () => {
46
46
  <p className="text-lg leading-relaxed text-muted-foreground">
47
47
  In Ramme, your "screens" are just containers. Drop your elements inside the <code style={{ color: infoColor }} className="font-bold italic px-2 py-0.5 bg-info/5 border border-info/10 rounded">StandardPageLayout</code>.
48
48
  </p>
49
- <div className="rounded-2xl overflow-hidden border border-white/5 shadow-2xl">
49
+ <div className="rounded-2xl overflow-hidden border border-border shadow-2xl">
50
50
  <RammeCodeBlock
51
51
  variant="info"
52
52
  title="App.tsx"
@@ -56,7 +56,7 @@ const RammeTutorial: React.FC = () => {
56
56
  </div>
57
57
  </div>
58
58
  <div className="lg:col-span-2">
59
- <Card className="p-8 bg-black/40 border-white/5 h-full rounded-[2rem] flex flex-col justify-center">
59
+ <Card className="p-8 bg-card/60 border-border h-full rounded-[2rem] flex flex-col justify-center">
60
60
  <Icon name={"maximize" as any} style={{ color: infoColor }} className="mb-6" size={40} />
61
61
  <h4 className="font-black mb-3 text-foreground text-xl uppercase tracking-tight">Auto-Responsive</h4>
62
62
  <p className="text-sm text-muted-foreground leading-relaxed">
@@ -86,7 +86,7 @@ const RammeTutorial: React.FC = () => {
86
86
  </div>
87
87
  </div>
88
88
  </div>
89
- <div className="rounded-2xl overflow-hidden border border-white/5 shadow-2xl">
89
+ <div className="rounded-2xl overflow-hidden border border-border shadow-2xl">
90
90
  <RammeCodeBlock
91
91
  variant="success"
92
92
  title="ProfileSetup.tsx"
@@ -103,7 +103,7 @@ const RammeTutorial: React.FC = () => {
103
103
  <div className="absolute -left-20 -top-10 text-[12rem] font-black opacity-[0.03] italic select-none pointer-events-none group-hover:opacity-[0.06] transition-opacity duration-700" style={{ color: secondaryColor }}>03</div>
104
104
  <SectionHeader title="Dynamic Smart Grids" icon={"grid" as any} />
105
105
  <div className="grid grid-cols-1 lg:grid-cols-3 gap-12 mt-12">
106
- <div className="lg:col-span-2 rounded-2xl overflow-hidden border border-white/5 shadow-2xl">
106
+ <div className="lg:col-span-2 rounded-2xl overflow-hidden border border-border shadow-2xl">
107
107
  <RammeCodeBlock
108
108
  variant="secondary"
109
109
  title="Dashboard.tsx"
@@ -116,7 +116,7 @@ const RammeTutorial: React.FC = () => {
116
116
  <p className="text-md text-muted-foreground leading-relaxed">
117
117
  Use the <span style={{ color: secondaryColor }} className="font-bold">SmartGrid</span> to create layouts that auto-arrange based on information density.
118
118
  </p>
119
- <Button variant="ghost" className="text-secondary p-0 h-auto hover:bg-transparent font-black uppercase text-[10px] tracking-widest group/btn" onClick={() => navigate('/dashboard')}>
119
+ <Button variant="ghost" className="text-secondary p-0 h-auto hover:bg-transparent font-black uppercase text-[10px] tracking-widest group/btn" onClick={() => navigate('/dashboard/dashboard_sample')}>
120
120
  View Dashboard Sample
121
121
  <Icon name="external-link" size={12} className="ml-2 group-hover/btn:translate-x-1 group-hover/btn:-translate-y-1 transition-transform" />
122
122
  </Button>
@@ -129,11 +129,11 @@ const RammeTutorial: React.FC = () => {
129
129
  <div className="absolute -left-20 -top-10 text-[12rem] font-black opacity-[0.03] italic select-none pointer-events-none group-hover:opacity-[0.06] transition-opacity duration-700" style={{ color: primaryColor }}>04</div>
130
130
  <SectionHeader title="AI Vibe Engine" icon={"sparkles" as any} />
131
131
  <div className="grid grid-cols-1 lg:grid-cols-2 gap-12 mt-12">
132
- <Card className="p-10 bg-black/40 border-white/5 flex flex-col gap-8 rounded-[3rem] shadow-2xl relative overflow-hidden group/card">
132
+ <Card className="p-10 bg-card/60 border-border flex flex-col gap-8 rounded-[3rem] shadow-2xl relative overflow-hidden group/card">
133
133
  <div className="absolute top-0 right-0 w-64 h-64 bg-primary/10 blur-[100px] pointer-events-none" />
134
134
  <div className="space-y-4">
135
135
  <div className="text-[10px] font-black opacity-30 uppercase tracking-[0.3em] text-foreground">Global DNA Prompting</div>
136
- <div className="p-6 bg-black/60 rounded-2xl border border-white/10 italic text-sm leading-relaxed" style={{ color: primaryColor }}>
136
+ <div className="p-6 bg-muted/15 rounded-2xl border border-border italic text-sm leading-relaxed" style={{ color: primaryColor }}>
137
137
  "Redesign the entire OS to feel like a high-altitude cockpit: muted slates, tactical orange accents, and blurred glass depth."
138
138
  </div>
139
139
  </div>
@@ -160,7 +160,7 @@ const RammeTutorial: React.FC = () => {
160
160
  </section>
161
161
 
162
162
  {/* --- FINISH LINE --- */}
163
- <div className="pt-32 text-center border-t border-white/5 relative">
163
+ <div className="pt-32 text-center border-t border-border relative">
164
164
  <div className="space-y-8 relative z-10">
165
165
  <h2 className="text-7xl md:text-9xl font-black tracking-[-0.02em] text-foreground leading-[0.8] uppercase italic">
166
166
  Your Studio <br/> Is Ready.
@@ -173,9 +173,18 @@ const RammeTutorial: React.FC = () => {
173
173
  size="lg"
174
174
  className="px-20 h-24 text-3xl font-black rounded-full shadow-[0_0_50px_rgba(var(--app-primary-color),0.2)] hover:scale-105 transition-transform"
175
175
  style={{ backgroundColor: primaryColor, color: '#000' }}
176
- onClick={() => navigate('/dashboard')}
176
+ onClick={() => navigate('/dashboard/ai-chat')}
177
177
  >
178
- Enter Dashboard
178
+ Ask the AI Assistant
179
+ </Button>
180
+ <Button
181
+ size="lg"
182
+ variant="outline"
183
+ className="px-12 h-20 text-xl font-black rounded-full border-border hover:bg-muted/10"
184
+ onClick={() => window.open('https://www.npmjs.com/package/@ramme-io/create-app', '_blank')}
185
+ >
186
+ Get the Package
187
+ <Icon name="external-link" size={16} className="ml-2" />
179
188
  </Button>
180
189
  </div>
181
190
  <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[500px] h-[500px] blur-[150px] rounded-full opacity-[0.07] pointer-events-none" style={{ backgroundColor: primaryColor }} />
@@ -15,7 +15,7 @@ const WelcomeRamme: React.FC = () => {
15
15
  {/* --- HERO: THE CREATOR HOOK --- */}
16
16
  <header className="text-center pt-24">
17
17
  <div className="inline-flex flex-col items-center space-y-8">
18
- <Badge variant="primary" className="uppercase tracking-[0.3em] text-[10px] px-6 py-1.5 border-primary/20 bg-primary/5">
18
+ <Badge variant="primary" className="uppercase tracking-[0.3em] text-[10px] px-6 py-1.5 border-primary/40 bg-primary/10 text-primary">
19
19
  The Rapid Prototyping Engine
20
20
  </Badge>
21
21
  <h1 className="text-7xl md:text-[110px] font-[1000] leading-[0.8] tracking-[-0.05em] text-foreground uppercase">
@@ -42,7 +42,7 @@ const WelcomeRamme: React.FC = () => {
42
42
  variant="info"
43
43
  title="Starter Command"
44
44
  language="bash"
45
- code="npx @ramme-io/create-app@latest"
45
+ code="npm create @ramme-io/app"
46
46
  />
47
47
  </div>
48
48
 
@@ -117,17 +117,17 @@ const WelcomeRamme: React.FC = () => {
117
117
  </p>
118
118
  </div>
119
119
  <div className="flex flex-col sm:flex-row justify-center gap-4">
120
- <Button size="lg" className="px-16 h-20 text-2xl font-black shadow-2xl hover:scale-105 transition-transform" onClick={() => navigate('/dashboard')}>
121
- Enter Dashboard
120
+ <Button size="lg" className="px-16 h-20 text-2xl font-black shadow-2xl hover:scale-105 transition-transform" onClick={() => navigate('/dashboard/features')}>
121
+ Explore Features
122
122
  </Button>
123
123
  <Button
124
124
  size="lg"
125
125
  variant="outline"
126
126
  className="px-12 h-20 text-xl font-bold border-secondary/20 hover:bg-secondary/5"
127
127
  style={{ color: 'rgb(var(--app-secondary-color))' }}
128
- onClick={() => navigate('/tutorial')}
128
+ onClick={() => navigate('/settings/theme')}
129
129
  >
130
- Start Tutorial
130
+ Try the Theme Engine
131
131
  </Button>
132
132
  </div>
133
133
  </footer>
@@ -12,8 +12,8 @@ import {
12
12
  useDataFetch,
13
13
  type ColDef,
14
14
  type ICellRendererParams,
15
- type IRowNode,
16
15
  } from '@ramme-io/ui';
16
+ import { type IRowNode } from 'ag-grid-community';
17
17
 
18
18
  // --- Local Mock Data ---
19
19
  const mockLargeTableData = Array.from({ length: 23 }, (_, i) => ({
@@ -104,10 +104,22 @@ const TablesSection: React.FC = () => {
104
104
  </Card>
105
105
 
106
106
  <Card id="tables-aggrid" className="p-6 scroll-mt-20">
107
- <h3 className="text-2xl font-semibold mb-4 text-text">AG Grid Data Table (Advanced)</h3>
108
- <p className="text-muted-foreground mb-4">
109
- A powerful grid with sorting, filtering, and row selection, powered by AG Grid.
110
- </p>
107
+ <div className="mb-6">
108
+ <h3 className="text-2xl font-semibold mb-2 text-foreground">AG Grid Data Table (Advanced)</h3>
109
+ <p className="text-muted-foreground mb-4">
110
+ Powered by AG Grid Enterprise with <code className="text-primary bg-muted px-2 py-0.5 rounded text-sm">ag-theme-ramme</code> -
111
+ a custom theme that syncs perfectly with Ramme's light/dark modes using semantic CSS variables.
112
+ </p>
113
+ <div className="flex flex-wrap gap-2 text-xs text-muted-foreground">
114
+ <Badge variant="outline">✓ Instant theme switching</Badge>
115
+ <Badge variant="outline">✓ Row selection</Badge>
116
+ <Badge variant="outline">✓ Column sorting</Badge>
117
+ <Badge variant="outline">✓ Advanced filtering</Badge>
118
+ <Badge variant="outline">✓ Pagination</Badge>
119
+ <Badge variant="outline">✓ Custom cell renderers</Badge>
120
+ </div>
121
+ </div>
122
+
111
123
  <div className="flex flex-col md:flex-row md:items-center gap-4 mb-6">
112
124
  <Input
113
125
  type="text"
@@ -131,6 +143,14 @@ const TablesSection: React.FC = () => {
131
143
  rowSelection="multiple"
132
144
  />
133
145
  )}
146
+
147
+ <div className="mt-4 p-4 bg-muted/30 rounded-lg border border-border">
148
+ <p className="text-sm text-muted-foreground">
149
+ <strong className="text-foreground">Theme Architecture:</strong> The grid uses <code className="text-primary">ag-theme-ramme</code> which maps AG Grid's CSS variables
150
+ to Ramme's semantic tokens (<code>--background</code>, <code>--foreground</code>, <code>--primary</code>, etc.).
151
+ This ensures zero-jank theme synchronization across light/dark modes without page reloads.
152
+ </p>
153
+ </div>
134
154
  </Card>
135
155
  </div>
136
156
  );