@llmnative/react 2.0.1 → 2.2.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.
Files changed (48) hide show
  1. package/bin/cli.js +117 -117
  2. package/dist/index.css +1 -1
  3. package/dist/index.js +21 -21
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +10468 -8488
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/types/src/App.d.ts +19 -1
  8. package/dist/types/src/I18n.d.ts +91 -0
  9. package/dist/types/src/Theme.d.ts +16 -0
  10. package/dist/types/src/components/auth/AuthGate.d.ts +26 -0
  11. package/dist/types/src/components/auth/AuthLayout.d.ts +38 -0
  12. package/dist/types/src/components/auth/ForgotPassword.d.ts +19 -0
  13. package/dist/types/src/components/auth/OneTimeCodeInput.d.ts +27 -0
  14. package/dist/types/src/components/auth/ResetPassword.d.ts +31 -0
  15. package/dist/types/src/components/auth/SignIn.d.ts +42 -0
  16. package/dist/types/src/components/auth/SignUp.d.ts +43 -0
  17. package/dist/types/src/components/auth/VerifyCode.d.ts +32 -0
  18. package/dist/types/src/components/auth/VerifyEmail.d.ts +31 -0
  19. package/dist/types/src/components/auth/index.d.ts +12 -0
  20. package/dist/types/src/components/auth/providers.d.ts +22 -0
  21. package/dist/types/src/components/auth/shared.d.ts +124 -0
  22. package/dist/types/src/components/auth/useAuthFlows.d.ts +46 -0
  23. package/dist/types/src/index.d.ts +5 -1
  24. package/dist/types/src/providers/auth/AuthProvider.d.ts +51 -0
  25. package/dist/types/src/providers/auth/firebase/FirebaseAuthProvider.d.ts +8 -1
  26. package/dist/types/src/providers/auth/github/GitHubAuthProvider.d.ts +2 -0
  27. package/dist/types/src/providers/auth/mock/MockAuthProvider.d.ts +55 -0
  28. package/dist/types/src/providers/auth/supabase/SupabaseAuthProvider.d.ts +16 -1
  29. package/dist/types/src/providers/manifest.d.ts +4 -1
  30. package/llms-full.txt +96 -2
  31. package/package.json +1 -1
  32. package/scripts/cli/setup-project.js +678 -647
  33. package/templates/_shared/conf/access.tsx +23 -0
  34. package/templates/_shared/pages/access/ForgotPasswordPage.tsx +13 -0
  35. package/templates/_shared/pages/access/ResetPasswordPage.tsx +19 -0
  36. package/templates/_shared/pages/access/SignInPage.tsx +21 -0
  37. package/templates/_shared/pages/access/SignUpPage.tsx +23 -0
  38. package/templates/_shared/pages/access/VerifyEmailPage.tsx +20 -0
  39. package/templates/_shared/pages/access/paths.ts +12 -0
  40. package/templates/_shared/sections/Footer.tsx +1 -1
  41. package/templates/_shared/sections/Header.tsx +2 -2
  42. package/themes/default.ts +13 -12
  43. package/themes/tokyo-night-light.ts +24 -2
  44. package/themes/tokyo-night.ts +24 -2
  45. package/themes/vscode-dark-modern.ts +24 -2
  46. package/themes/vscode-dark-plus.ts +24 -2
  47. package/themes/vscode-light-modern.ts +24 -2
  48. package/themes/vscode-light-plus.ts +24 -2
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import type { MenuConfig } from '@llmnative/react';
3
+ import SignUpPage from '../pages/access/SignUpPage';
4
+ import ForgotPasswordPage from '../pages/access/ForgotPasswordPage';
5
+ import ResetPasswordPage from '../pages/access/ResetPasswordPage';
6
+ import VerifyEmailPage from '../pages/access/VerifyEmailPage';
7
+ import { ACCESS_PATHS } from '../pages/access/paths';
8
+
9
+ /** The pages of access take the whole screen: no header, no menu. */
10
+ const Bare = ({ children }: { children?: React.ReactNode }) => <>{children}</>;
11
+
12
+ /**
13
+ * The pages open without a session (`public`): the sign-in itself has no page, the gate of
14
+ * `index.tsx` shows it in place of any other page. No title: they are never entries of a menu.
15
+ */
16
+ export const accessMenu: MenuConfig = {
17
+ access: [
18
+ { path: ACCESS_PATHS.signUp, page: SignUpPage, layout: Bare, public: true },
19
+ { path: ACCESS_PATHS.forgotPassword, page: ForgotPasswordPage, layout: Bare, public: true },
20
+ { path: ACCESS_PATHS.resetPassword, page: ResetPasswordPage, layout: Bare, public: true },
21
+ { path: ACCESS_PATHS.verifyEmail, page: VerifyEmailPage, layout: Bare, public: true },
22
+ ],
23
+ };
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { Navigate } from 'react-router-dom';
3
+ import { Brand, ForgotPassword, useAuthFlows } from '@llmnative/react';
4
+ import { ACCESS_FLOWS } from './paths';
5
+
6
+ /** Sends the link to choose a new password; the link opens `/reset-password`. */
7
+ export default function ForgotPasswordPage() {
8
+ const flows = useAuthFlows(undefined, ACCESS_FLOWS);
9
+
10
+ if (!flows.forgotPassword) return <Navigate to="/" replace />;
11
+
12
+ return <ForgotPassword {...flows.forgotPassword} brand={<Brand label="[projectname]" />} signInLink="/" />;
13
+ }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { useLocation } from 'react-router-dom';
3
+ import { Brand, ResetPassword, linkCode, useAuthFlows } from '@llmnative/react';
4
+ import { ACCESS_FLOWS, ACCESS_PATHS } from './paths';
5
+
6
+ /** Opened by the link of the email: the code of the link sets the new password. */
7
+ export default function ResetPasswordPage() {
8
+ const flows = useAuthFlows(undefined, ACCESS_FLOWS);
9
+ const code = linkCode(useLocation().search);
10
+
11
+ return (
12
+ <ResetPassword
13
+ {...flows.resetPassword(code)}
14
+ brand={<Brand label="[projectname]" />}
15
+ signInLink="/"
16
+ requestNewLink={ACCESS_PATHS.forgotPassword}
17
+ />
18
+ );
19
+ }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { Brand, SignIn, useAuthFlows } from '@llmnative/react';
3
+ import { ACCESS_FLOWS, ACCESS_PATHS } from './paths';
4
+
5
+ /**
6
+ * The sign-in, shown by the gate of `index.tsx` in place of any page opened without a session:
7
+ * the address does not change, and once signed in the page appears.
8
+ */
9
+ export default function SignInPage() {
10
+ const flows = useAuthFlows(undefined, ACCESS_FLOWS);
11
+
12
+ return (
13
+ <SignIn
14
+ {...flows.signIn}
15
+ appName="[projectname]"
16
+ brand={<Brand label="[projectname]" />}
17
+ signUpLink={flows.signUp ? ACCESS_PATHS.signUp : undefined}
18
+ forgotPasswordLink={flows.forgotPassword ? ACCESS_PATHS.forgotPassword : undefined}
19
+ />
20
+ );
21
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { Navigate, useNavigate } from 'react-router-dom';
3
+ import { Brand, SignUp, useAuthFlows } from '@llmnative/react';
4
+ import { ACCESS_FLOWS } from './paths';
5
+
6
+ /** Creates an account; the confirmation link of the email opens `/verify-email`. */
7
+ export default function SignUpPage() {
8
+ const flows = useAuthFlows(undefined, ACCESS_FLOWS);
9
+ const navigate = useNavigate();
10
+
11
+ // A provider without accounts of its own (Google, GitHub): its sign-in creates them.
12
+ if (!flows.signUp) return <Navigate to="/" replace />;
13
+
14
+ return (
15
+ <SignUp
16
+ {...flows.signUp}
17
+ terms
18
+ brand={<Brand label="[projectname]" />}
19
+ signInLink="/"
20
+ onSignedUp={() => navigate('/')}
21
+ />
22
+ );
23
+ }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { useLocation } from 'react-router-dom';
3
+ import { Brand, VerifyEmail, linkCode, useAuthFlows } from '@llmnative/react';
4
+ import { ACCESS_FLOWS } from './paths';
5
+
6
+ /** Opened by the confirmation link of a new account: it activates the account at once. */
7
+ export default function VerifyEmailPage() {
8
+ const flows = useAuthFlows(undefined, ACCESS_FLOWS);
9
+ const code = linkCode(useLocation().search);
10
+
11
+ return (
12
+ <VerifyEmail
13
+ {...flows.verifyEmail}
14
+ code={code}
15
+ brand={<Brand label="[projectname]" />}
16
+ continueLink="/"
17
+ signInLink="/"
18
+ />
19
+ );
20
+ }
@@ -0,0 +1,12 @@
1
+ // The pages the links of the access emails open: the provider puts them in the emails it sends.
2
+ export const ACCESS_PATHS = {
3
+ signUp: '/sign-up',
4
+ forgotPassword: '/forgot-password',
5
+ resetPassword: '/reset-password',
6
+ verifyEmail: '/verify-email',
7
+ };
8
+
9
+ export const ACCESS_FLOWS = {
10
+ verifyEmailPath: ACCESS_PATHS.verifyEmail,
11
+ resetPasswordPath: ACCESS_PATHS.resetPassword,
12
+ };
@@ -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"
@@ -17,7 +17,7 @@ export default function Header({ onMenuToggle }: HeaderProps) {
17
17
  />
18
18
  <Brand url="/" label="[projectname]" />
19
19
  <div className="ms-auto">
20
- <AuthButton />
20
+ <AuthButton aspect="avatar" />
21
21
  </div>
22
22
  </header>
23
23
  );
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
  },