@llmnative/react 2.0.1 → 2.1.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.
@@ -13,8 +13,11 @@ import { type I18nConfig } from "./I18n";
13
13
  import { type ServicesConfig, type GoogleProviderConfig, type SupabaseProviderConfig, type MockProviderConfig } from "./providers/manifest";
14
14
  interface MenuItem {
15
15
  path: string;
16
+ /** The label of the entry in a menu (`SideNav`, `Menu`). A route without it is never an entry. */
16
17
  title?: string;
17
18
  icon?: string;
19
+ /** A route only, never an entry of a menu, title or not (CR-126): a page reached by a link. */
20
+ hidden?: boolean;
18
21
  children?: MenuItem[];
19
22
  page?: React.ComponentType;
20
23
  layout?: React.ComponentType;
@@ -124,5 +127,11 @@ export declare const getContextMenu: () => string[];
124
127
  */
125
128
  export declare function AppProvider({ contextProviders, providers, appName, scrapeConfig, iconProvider, googleMaps, themeProvider, i18n, children, errorReportUrl, debug, basename, }: AppProviderProps): React.JSX.Element;
126
129
  declare function App({ importPage, LayoutDefault, menuConfig, children, ...providerProps }: AppProps): React.JSX.Element;
130
+ /**
131
+ * Whether a route of `menuConfig` is a page to navigate to: it has a title, it is not `hidden`, and its path has
132
+ * no parameter (`/invite/:token`) and no wildcard (`*`). The others are routes only, never entries of a menu
133
+ * (CR-126). A parent stays when one of its children is an entry.
134
+ */
135
+ export declare function isMenuEntry(item: MenuItem): boolean;
127
136
  export declare const useMenu: (type: string) => UseMenuItem[];
128
137
  export default App;
@@ -39,6 +39,22 @@ export interface ColorScale {
39
39
  border?: string;
40
40
  input?: string;
41
41
  ring?: string;
42
+ /** Top bar of the app (`bg-header`): the title bar of the IDE. */
43
+ header?: string;
44
+ headerForeground?: string;
45
+ /** The line under the top bar (`border-header-border`). */
46
+ headerBorder?: string;
47
+ /** Side navigation (`bg-sidebar`): the side bar of the IDE. */
48
+ sidebar?: string;
49
+ sidebarForeground?: string;
50
+ sidebarBorder?: string;
51
+ /** The selected entry of the side navigation (`bg-sidebar-accent`). */
52
+ sidebarAccent?: string;
53
+ sidebarAccentForeground?: string;
54
+ /** Bottom bar of the app (`bg-footer`): the status bar of the IDE. */
55
+ footer?: string;
56
+ footerForeground?: string;
57
+ footerBorder?: string;
42
58
  }
43
59
  export interface MenuTheme {
44
60
  wrapperClassName?: string;
package/llms-full.txt CHANGED
@@ -98,6 +98,15 @@ The VS Code and Tokyo Night themes are compiled from the original VS Code theme
98
98
 
99
99
  `ColorScale` tokens: `background`, `foreground`, `canvas` (page floor behind cards and panels, `bg-canvas`; falls back to `background`), `card`, `popover`, `primary`, `secondary`, `muted`, `accent`, `destructive`, `success`, `warning`, `info` (each with its `*Foreground`), `border`, `input` (border of form fields), `ring`. A consumer bridging the tokens in its own `@theme inline` adds `--color-canvas: hsl(var(--rf-canvas, var(--rf-background)));`.
100
100
 
101
+ **The frame of the app** (CR-126), as the title bar, side bar and status bar of the IDE: `header`, `headerForeground`, `headerBorder`, `sidebar`, `sidebarForeground`, `sidebarBorder`, `sidebarAccent` (the selected entry), `sidebarAccentForeground`, `footer`, `footerForeground`, `footerBorder`. The IDE themes carry them (VS Code Light+: gray title bar, blue status bar); a theme without them falls back to the base tokens (header and footer on `background`, sidebar on `card`, borders on `border`). Utilities: `bg-header text-header-foreground border-header-border`, `bg-sidebar …`, `bg-footer …`. `SideNav` draws itself with the sidebar tokens. The top bar and status bar of a layout:
102
+
103
+ ```tsx
104
+ <header className="flex h-14 shrink-0 items-center gap-3 border-b border-header-border bg-header px-4 text-header-foreground">…</header>
105
+ <footer className="shrink-0 border-t border-footer-border bg-footer px-4 py-1.5 text-xs text-footer-foreground">…</footer>
106
+ ```
107
+
108
+ A border without a color class (`border`, `border-b`) is the theme's `border`, not the text color. The scaffold (`npx @llmnative/react create`) starts in `vscode-light-modern` and bridges all these tokens in `src/styles/globals.css`; a consumer scaffolded before adds the `--color-header…`/`--color-sidebar…`/`--color-footer…` lines of `src/globals.css` to its own `@theme inline`.
109
+
101
110
  ---
102
111
 
103
112
  ## Provider System
@@ -147,6 +156,27 @@ export const menuConfig: MenuConfig = {
147
156
 
148
157
  La home va dichiarata con `path: '/'`: senza quella voce, `/` mostra "Missing Page".
149
158
 
159
+ ### Voci di menu e rotte
160
+
161
+ `SideNav menuKey="main"` e `Menu menuKey="main"` mostrano solo le **voci**: le route di quella chiave con `title`,
162
+ senza `hidden: true`, senza parametri (`:token`) e senza `*`. Le altre sono rotte e basta (CR-126). Ogni voce
163
+ mostrata ha `title` **e** `icon`. Una pagina raggiunta da un link (accesso, invito, impostazioni dal menu utente)
164
+ sta in una chiave che nessun menu mostra, oppure ha `hidden: true`:
165
+
166
+ ```tsx
167
+ export const menuConfig: MenuConfig = {
168
+ main: [
169
+ { path: '/', title: 'Dashboard', icon: 'layout-dashboard', page: HomePage },
170
+ { path: '/contacts', title: 'Contatti', icon: 'users', page: ContactsPage },
171
+ { path: '/settings', title: 'Impostazioni', icon: 'settings', page: SettingsPage, hidden: true },
172
+ ],
173
+ routes: [
174
+ { path: '/invite/:token', page: InvitePage, layout: AccessLayout },
175
+ { path: '*', page: NotFoundPage },
176
+ ],
177
+ };
178
+ ```
179
+
150
180
  ### Hooks
151
181
 
152
182
  ```ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmnative/react",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "LLM-native React framework for deterministic UI generation. Data-driven by default, schema-driven optional. Ultra-low token consumption — built for AI agents, not just humans.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -6,6 +6,14 @@ const root = process.cwd();
6
6
  const args = process.argv.slice(2);
7
7
  const shouldReset = args.includes('--reset');
8
8
 
9
+ // The built-in themes (BUILT_IN_THEME_IDS of src/Theme.tsx), those of the IDEs first: a new app starts in the
10
+ // colors of an IDE, frame included (CR-126).
11
+ const THEMES = [
12
+ 'vscode-light-modern', 'vscode-dark-modern', 'vscode-light-plus', 'vscode-dark-plus',
13
+ 'tokyo-night-light', 'tokyo-night', 'default', 'flat', 'cyber',
14
+ ];
15
+ const DEFAULT_THEME = 'vscode-light-modern';
16
+
9
17
  function getArg(name, fallback = '') {
10
18
  const prefix = `--${name}=`;
11
19
  const arg = args.find((item) => item.startsWith(prefix));
@@ -88,10 +96,10 @@ async function askInteractive(callback) {
88
96
  ? iconProviderInput.trim()
89
97
  : 'lucide';
90
98
 
91
- const themeInput = await question('Which theme? (default, flat, cyber; default: default) ');
92
- const theme = ['default', 'flat', 'cyber'].includes(themeInput.trim())
99
+ const themeInput = await question(`Which theme? (${THEMES.join(', ')}; default: ${DEFAULT_THEME}) `);
100
+ const theme = THEMES.includes(themeInput.trim())
93
101
  ? themeInput.trim()
94
- : 'default';
102
+ : DEFAULT_THEME;
95
103
 
96
104
  const localeInput = await question('Default locale? (en, it, fr, de, es; default: en) ');
97
105
  const locale = localeInput.trim() || 'en';
@@ -433,6 +441,18 @@ function createSourceFiles(params) {
433
441
  --color-border: hsl(var(--rf-border));
434
442
  --color-input: hsl(var(--rf-input));
435
443
  --color-ring: hsl(var(--rf-ring));
444
+ /* The frame of the app: the title bar, side bar and status bar of the theme. */
445
+ --color-header: hsl(var(--rf-header, var(--rf-background)));
446
+ --color-header-foreground: hsl(var(--rf-header-foreground, var(--rf-foreground)));
447
+ --color-header-border: hsl(var(--rf-header-border, var(--rf-border)));
448
+ --color-sidebar: hsl(var(--rf-sidebar, var(--rf-card)));
449
+ --color-sidebar-foreground: hsl(var(--rf-sidebar-foreground, var(--rf-foreground)));
450
+ --color-sidebar-border: hsl(var(--rf-sidebar-border, var(--rf-border)));
451
+ --color-sidebar-accent: hsl(var(--rf-sidebar-accent, var(--rf-accent)));
452
+ --color-sidebar-accent-foreground: hsl(var(--rf-sidebar-accent-foreground, var(--rf-accent-foreground)));
453
+ --color-footer: hsl(var(--rf-footer, var(--rf-background)));
454
+ --color-footer-foreground: hsl(var(--rf-footer-foreground, var(--rf-muted-foreground)));
455
+ --color-footer-border: hsl(var(--rf-footer-border, var(--rf-border)));
436
456
  --radius: 0.5rem;
437
457
  }
438
458
 
@@ -587,7 +607,7 @@ function scaffoldProject() {
587
607
  aiProvider: getArg('ai-provider', 'none'),
588
608
  proxyProvider: getArg('proxy-provider', 'none'),
589
609
  iconProvider: getArg('icon-provider', 'lucide'),
590
- theme: getArg('theme', getArg('theme-provider', 'default')),
610
+ theme: getArg('theme', getArg('theme-provider', DEFAULT_THEME)),
591
611
  locale: getArg('locale', 'en'),
592
612
  template: getArg('template', 'blank'),
593
613
  hosting: getArg('hosting', 'n'),
@@ -2,7 +2,7 @@ import React from 'react';
2
2
 
3
3
  export default function Footer() {
4
4
  return (
5
- <footer className="shrink-0 border-t bg-background px-4 py-2 text-end text-sm text-muted-foreground">
5
+ <footer className="shrink-0 border-t border-footer-border bg-footer px-4 py-1.5 text-end text-xs text-footer-foreground">
6
6
  Powered by [projectname]
7
7
  </footer>
8
8
  );
@@ -7,7 +7,7 @@ type HeaderProps = {
7
7
 
8
8
  export default function Header({ onMenuToggle }: HeaderProps) {
9
9
  return (
10
- <header className="flex h-14 shrink-0 items-center gap-3 border-b bg-background px-4">
10
+ <header className="flex h-14 shrink-0 items-center gap-3 border-b border-header-border bg-header px-4 text-header-foreground">
11
11
  <ActionButton
12
12
  icon="menu"
13
13
  ariaLabel="Toggle navigation"
package/themes/default.ts CHANGED
@@ -367,27 +367,28 @@ export const components: Theme = {
367
367
  },
368
368
  SideNav: {
369
369
  wrapperClassName: '',
370
- shellClassName: 'border-r border-border bg-card/80 text-foreground backdrop-blur supports-[backdrop-filter]:bg-card/70',
370
+ // The side bar of the theme (CR-126): `sidebar*` tokens, the base ones when the theme has none.
371
+ shellClassName: 'border-r border-sidebar-border bg-sidebar text-sidebar-foreground',
371
372
  overlayClassName: 'shadow-xl',
372
- headerClassName: 'border-b border-border/60 px-1.5 py-2',
373
+ headerClassName: 'border-b border-sidebar-border px-1.5 py-2',
373
374
  navClassName: 'px-1.5 py-2',
374
- bottomNavClassName: 'border-t border-border/60 px-1.5 py-2',
375
- footerClassName: 'border-t border-border/60 px-1.5 py-2',
376
- groupLabelClassName: 'text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/60 select-none',
377
- groupDividerClassName: 'bg-border/50',
375
+ bottomNavClassName: 'border-t border-sidebar-border px-1.5 py-2',
376
+ footerClassName: 'border-t border-sidebar-border px-1.5 py-2',
377
+ groupLabelClassName: 'text-[10.5px] font-semibold uppercase tracking-widest text-sidebar-foreground/60 select-none',
378
+ groupDividerClassName: 'bg-sidebar-border',
378
379
  itemClassName: 'rounded-lg',
379
- itemActiveClassName: 'bg-primary/10 text-primary font-medium shadow-sm',
380
- itemChildActiveClassName: 'bg-accent/80 text-foreground font-medium',
381
- itemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
380
+ itemActiveClassName: 'bg-sidebar-accent text-sidebar-accent-foreground font-medium',
381
+ itemChildActiveClassName: 'bg-sidebar-accent/60 text-sidebar-accent-foreground font-medium',
382
+ itemInactiveClassName: 'text-sidebar-foreground/80 hover:text-sidebar-accent-foreground hover:bg-sidebar-accent/70',
382
383
  itemIconClassName: '',
383
384
  itemTextClassName: '',
384
385
  itemBadgeClassName: 'ml-auto shrink-0 text-[10px] font-semibold leading-none px-1.5 py-[3px] rounded-full bg-primary/15 text-primary',
385
386
  itemCollapsedBadgeClassName: 'absolute -top-0.5 -right-1 h-[7px] w-[7px] rounded-full bg-primary ring-1 ring-card',
386
387
  itemToggleClassName: 'shrink-0 flex items-center justify-center w-6 h-6 rounded-md transition-colors text-muted-foreground/50 hover:text-foreground hover:bg-accent/70',
387
388
  subItemClassName: 'rounded-md',
388
- subItemActiveClassName: 'bg-primary/10 text-primary font-medium',
389
- subItemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
390
- collapseButtonClassName: 'shrink-0 flex items-center justify-center rounded-md w-8 h-8 transition-colors text-muted-foreground hover:text-foreground hover:bg-accent/70',
389
+ subItemActiveClassName: 'bg-sidebar-accent text-sidebar-accent-foreground font-medium',
390
+ subItemInactiveClassName: 'text-sidebar-foreground/80 hover:text-sidebar-accent-foreground hover:bg-sidebar-accent/70',
391
+ collapseButtonClassName: 'shrink-0 flex items-center justify-center rounded-md w-8 h-8 transition-colors text-sidebar-foreground/70 hover:text-sidebar-accent-foreground hover:bg-sidebar-accent/70',
391
392
  },
392
393
  Toolbar: {
393
394
  wrapperClassName: 'z-20 w-full',
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '224.3 17.6% 25.7%',
29
29
  border: '230 5.1% 76.9%',
30
30
  input: '230 5.1% 76.9%',
31
- ring: '226.7 10.1% 82.5%'
31
+ ring: '226.7 10.1% 82.5%',
32
+ header: '226.7 12.3% 85.7%',
33
+ headerForeground: '224.3 17.6% 25.7%',
34
+ headerBorder: '230 5.1% 76.9%',
35
+ sidebar: '226.7 12.3% 85.7%',
36
+ sidebarForeground: '224.3 17.6% 25.7%',
37
+ sidebarBorder: '230 5.1% 76.9%',
38
+ sidebarAccent: '231.4 16.3% 91.6%',
39
+ sidebarAccentForeground: '224.3 17.6% 25.7%',
40
+ footer: '226.7 12.3% 85.7%',
41
+ footerForeground: '224.3 17.6% 25.7%',
42
+ footerBorder: '230 5.1% 76.9%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '229.3 35.4% 75.1%',
52
63
  border: '240 11.1% 7.1%',
53
64
  input: '240 14.3% 6.9%',
54
- ring: '233.3 19.1% 18.4%'
65
+ ring: '233.3 19.1% 18.4%',
66
+ header: '240 15.4% 10.2%',
67
+ headerForeground: '232.7 13.9% 53.5%',
68
+ headerBorder: '240 11.1% 7.1%',
69
+ sidebar: '240 15.4% 10.2%',
70
+ sidebarForeground: '232.7 13.9% 53.5%',
71
+ sidebarBorder: '240 11.1% 7.1%',
72
+ sidebarAccent: '235.4 18.8% 13.5%',
73
+ sidebarAccentForeground: '229.3 35.4% 75.1%',
74
+ footer: '240 15.4% 10.2%',
75
+ footerForeground: '232.7 13.9% 53.5%',
76
+ footerBorder: '240 11.1% 7.1%'
55
77
  },
56
78
  },
57
79
  },
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '224.3 17.6% 25.7%',
29
29
  border: '230 5.1% 76.9%',
30
30
  input: '230 5.1% 76.9%',
31
- ring: '226.7 10.1% 82.5%'
31
+ ring: '226.7 10.1% 82.5%',
32
+ header: '226.7 12.3% 85.7%',
33
+ headerForeground: '224.3 17.6% 25.7%',
34
+ headerBorder: '230 5.1% 76.9%',
35
+ sidebar: '226.7 12.3% 85.7%',
36
+ sidebarForeground: '224.3 17.6% 25.7%',
37
+ sidebarBorder: '230 5.1% 76.9%',
38
+ sidebarAccent: '231.4 16.3% 91.6%',
39
+ sidebarAccentForeground: '224.3 17.6% 25.7%',
40
+ footer: '226.7 12.3% 85.7%',
41
+ footerForeground: '224.3 17.6% 25.7%',
42
+ footerBorder: '230 5.1% 76.9%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '229.3 35.4% 75.1%',
52
63
  border: '240 11.1% 7.1%',
53
64
  input: '240 14.3% 6.9%',
54
- ring: '233.3 19.1% 18.4%'
65
+ ring: '233.3 19.1% 18.4%',
66
+ header: '240 15.4% 10.2%',
67
+ headerForeground: '232.7 13.9% 53.5%',
68
+ headerBorder: '240 11.1% 7.1%',
69
+ sidebar: '240 15.4% 10.2%',
70
+ sidebarForeground: '232.7 13.9% 53.5%',
71
+ sidebarBorder: '240 11.1% 7.1%',
72
+ sidebarAccent: '235.4 18.8% 13.5%',
73
+ sidebarAccentForeground: '229.3 35.4% 75.1%',
74
+ footer: '240 15.4% 10.2%',
75
+ footerForeground: '232.7 13.9% 53.5%',
76
+ footerBorder: '240 11.1% 7.1%'
55
77
  },
56
78
  },
57
79
  },
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '0 0% 23.1%',
29
29
  border: '0 0% 89.8%',
30
30
  input: '0 0% 80.8%',
31
- ring: '209 100% 36.1%'
31
+ ring: '209 100% 36.1%',
32
+ header: '0 0% 97.3%',
33
+ headerForeground: '0 0% 11.8%',
34
+ headerBorder: '0 0% 89.8%',
35
+ sidebar: '0 0% 97.3%',
36
+ sidebarForeground: '0 0% 23.1%',
37
+ sidebarBorder: '0 0% 89.8%',
38
+ sidebarAccent: '230.8 31.7% 92%',
39
+ sidebarAccentForeground: '0 0% 23.1%',
40
+ footer: '0 0% 97.3%',
41
+ footerForeground: '0 0% 23.1%',
42
+ footerBorder: '0 0% 89.8%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '0 0% 80%',
52
63
  border: '0 0% 16.9%',
53
64
  input: '0 0% 23.5%',
54
- ring: '206 100% 41.6%'
65
+ ring: '206 100% 41.6%',
66
+ header: '0 0% 9.4%',
67
+ headerForeground: '0 0% 80%',
68
+ headerBorder: '0 0% 16.9%',
69
+ sidebar: '0 0% 9.4%',
70
+ sidebarForeground: '0 0% 80%',
71
+ sidebarBorder: '0 0% 16.9%',
72
+ sidebarAccent: '240 5.2% 22.7%',
73
+ sidebarAccentForeground: '0 0% 80%',
74
+ footer: '0 0% 9.4%',
75
+ footerForeground: '0 0% 80%',
76
+ footerBorder: '0 0% 16.9%'
55
77
  },
56
78
  },
57
79
  },
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '0 0% 38%',
29
29
  border: '0 0% 82.7%',
30
30
  input: '0 0% 80.8%',
31
- ring: '204.1 100% 47.3%'
31
+ ring: '204.1 100% 47.3%',
32
+ header: '0 0% 86.7%',
33
+ headerForeground: '0 0% 20%',
34
+ headerBorder: '0 0% 86.7%',
35
+ sidebar: '0 0% 95.3%',
36
+ sidebarForeground: '0 0% 38%',
37
+ sidebarBorder: '0 0% 95.3%',
38
+ sidebarAccent: '230.8 31.7% 92%',
39
+ sidebarAccentForeground: '0 0% 38%',
40
+ footer: '204.1 100% 40%',
41
+ footerForeground: '0 0% 100%',
42
+ footerBorder: '204.1 100% 40%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '0 0% 80%',
52
63
  border: '0 0% 27.1%',
53
64
  input: '0 0% 23.5%',
54
- ring: '204.1 100% 41.6%'
65
+ ring: '204.1 100% 41.6%',
66
+ header: '0 0% 23.5%',
67
+ headerForeground: '0 0% 80%',
68
+ headerBorder: '0 0% 23.5%',
69
+ sidebar: '240 1.3% 14.7%',
70
+ sidebarForeground: '0 0% 80%',
71
+ sidebarBorder: '240 1.3% 14.7%',
72
+ sidebarAccent: '240 5.2% 22.7%',
73
+ sidebarAccentForeground: '0 0% 80%',
74
+ footer: '204.1 100% 40%',
75
+ footerForeground: '0 0% 100%',
76
+ footerBorder: '204.1 100% 40%'
55
77
  },
56
78
  },
57
79
  },
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '0 0% 23.1%',
29
29
  border: '0 0% 89.8%',
30
30
  input: '0 0% 80.8%',
31
- ring: '209 100% 36.1%'
31
+ ring: '209 100% 36.1%',
32
+ header: '0 0% 97.3%',
33
+ headerForeground: '0 0% 11.8%',
34
+ headerBorder: '0 0% 89.8%',
35
+ sidebar: '0 0% 97.3%',
36
+ sidebarForeground: '0 0% 23.1%',
37
+ sidebarBorder: '0 0% 89.8%',
38
+ sidebarAccent: '230.8 31.7% 92%',
39
+ sidebarAccentForeground: '0 0% 23.1%',
40
+ footer: '0 0% 97.3%',
41
+ footerForeground: '0 0% 23.1%',
42
+ footerBorder: '0 0% 89.8%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '0 0% 80%',
52
63
  border: '0 0% 16.9%',
53
64
  input: '0 0% 23.5%',
54
- ring: '206 100% 41.6%'
65
+ ring: '206 100% 41.6%',
66
+ header: '0 0% 9.4%',
67
+ headerForeground: '0 0% 80%',
68
+ headerBorder: '0 0% 16.9%',
69
+ sidebar: '0 0% 9.4%',
70
+ sidebarForeground: '0 0% 80%',
71
+ sidebarBorder: '0 0% 16.9%',
72
+ sidebarAccent: '240 5.2% 22.7%',
73
+ sidebarAccentForeground: '0 0% 80%',
74
+ footer: '0 0% 9.4%',
75
+ footerForeground: '0 0% 80%',
76
+ footerBorder: '0 0% 16.9%'
55
77
  },
56
78
  },
57
79
  },
@@ -28,7 +28,18 @@ const definition: ThemeDefinition = {
28
28
  accentForeground: '0 0% 38%',
29
29
  border: '0 0% 82.7%',
30
30
  input: '0 0% 80.8%',
31
- ring: '204.1 100% 47.3%'
31
+ ring: '204.1 100% 47.3%',
32
+ header: '0 0% 86.7%',
33
+ headerForeground: '0 0% 20%',
34
+ headerBorder: '0 0% 86.7%',
35
+ sidebar: '0 0% 95.3%',
36
+ sidebarForeground: '0 0% 38%',
37
+ sidebarBorder: '0 0% 95.3%',
38
+ sidebarAccent: '230.8 31.7% 92%',
39
+ sidebarAccentForeground: '0 0% 38%',
40
+ footer: '204.1 100% 40%',
41
+ footerForeground: '0 0% 100%',
42
+ footerBorder: '204.1 100% 40%'
32
43
  },
33
44
  },
34
45
  dark: {
@@ -51,7 +62,18 @@ const definition: ThemeDefinition = {
51
62
  accentForeground: '0 0% 80%',
52
63
  border: '0 0% 27.1%',
53
64
  input: '0 0% 23.5%',
54
- ring: '204.1 100% 41.6%'
65
+ ring: '204.1 100% 41.6%',
66
+ header: '0 0% 23.5%',
67
+ headerForeground: '0 0% 80%',
68
+ headerBorder: '0 0% 23.5%',
69
+ sidebar: '240 1.3% 14.7%',
70
+ sidebarForeground: '0 0% 80%',
71
+ sidebarBorder: '240 1.3% 14.7%',
72
+ sidebarAccent: '240 5.2% 22.7%',
73
+ sidebarAccentForeground: '0 0% 80%',
74
+ footer: '204.1 100% 40%',
75
+ footerForeground: '0 0% 100%',
76
+ footerBorder: '204.1 100% 40%'
55
77
  },
56
78
  },
57
79
  },