@llmnative/react 2.0.0 → 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.
- package/bin/cli.js +117 -117
- package/dist/index.css +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +336 -198
- package/dist/index.mjs.map +1 -1
- package/dist/types/src/App.d.ts +9 -0
- package/dist/types/src/Theme.d.ts +16 -0
- package/llms-full.txt +65 -1
- package/package.json +1 -1
- package/scripts/cli/setup-project.js +24 -4
- package/templates/_shared/sections/Footer.tsx +1 -1
- package/templates/_shared/sections/Header.tsx +1 -1
- package/themes/default.ts +13 -12
- package/themes/tokyo-night-light.ts +24 -2
- package/themes/tokyo-night.ts +24 -2
- package/themes/vscode-dark-modern.ts +24 -2
- package/themes/vscode-dark-plus.ts +24 -2
- package/themes/vscode-light-modern.ts +24 -2
- package/themes/vscode-light-plus.ts +24 -2
package/dist/types/src/App.d.ts
CHANGED
|
@@ -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
|
@@ -54,7 +54,7 @@ import '@llmnative/react/dist/index.css'
|
|
|
54
54
|
themeProvider="default" // 'default' | 'flat' | 'cyber' | AppThemeProviderConfig
|
|
55
55
|
menuConfig={menuConfig}
|
|
56
56
|
importPage={(path) => import(path)}
|
|
57
|
-
LayoutDefault={MyLayout} // layout wrapper custom (opzionale)
|
|
57
|
+
LayoutDefault={MyLayout} // layout wrapper custom (opzionale): avvolge ogni voce di menuConfig senza `layout`
|
|
58
58
|
appName="MyApp" // nome app (opzionale)
|
|
59
59
|
i18n={{ locale: 'it', translations: { ... } }}
|
|
60
60
|
contextProviders={MyContextProvider}
|
|
@@ -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
|
|
@@ -113,6 +122,61 @@ The VS Code and Tokyo Night themes are compiled from the original VS Code theme
|
|
|
113
122
|
| ai | `AIProviderAdapter` | `openai`, `gemini`, `anthropic`, `deepseek`, `mistral`, `openrouter`, `opencode`, `opencode-go`, `cloudflare`, `groq` | `Config.tsx AIConfig` | no |
|
|
114
123
|
| credentials | `CredentialsAdapter` | `googleServiceAccount` | `providers.google.serviceAccount` | no |
|
|
115
124
|
|
|
125
|
+
### Firebase: quale app usano auth, dati e storage
|
|
126
|
+
|
|
127
|
+
- `providers.firebase` inizializza l'app Firebase **di default** dell'SDK (`[DEFAULT]`). `firestoreDb` e `firestorage` la
|
|
128
|
+
usano, e il driver `firebaseAuth` (`services.auth: 'firebaseAuth'`) fa login su quella stessa app: login, Firestore
|
|
129
|
+
e Storage condividono la sessione.
|
|
130
|
+
- Un'app che chiama già `initializeApp(config)` per conto suo condivide l'app di default con il framework solo se ha lo
|
|
131
|
+
**stesso `appId`**. Con un `appId` diverso il framework chiude quell'app e la reinizializza con la propria config, e
|
|
132
|
+
la sessione dell'app cade. Per questo il client Firebase si crea una volta sola: o `providers.firebase`, o il codice
|
|
133
|
+
dell'app con la stessa config.
|
|
134
|
+
- Una sessione separata, che non deve cadere quando l'app di default cambia (cambio di tenant): istanziare
|
|
135
|
+
`new FirebaseAuthProvider({ config, appName: 'control-plane' })`. `appName` è un'app con un nome suo; senza
|
|
136
|
+
`config` usa un'app già inizializzata con quel nome.
|
|
137
|
+
- Le Cloud Functions callable: `callFirebaseFunction(name, data, appName?, region?)`, sull'app di default se non si
|
|
138
|
+
passa `appName`. Il token della sessione lo aggiunge l'SDK.
|
|
139
|
+
|
|
140
|
+
### Layout per voce di menu
|
|
141
|
+
|
|
142
|
+
Ogni voce di `menuConfig` è una route. Viene avvolta da `item.layout` se presente, altrimenti da `LayoutDefault` di
|
|
143
|
+
`<App>`, altrimenti da `LayoutEmpty`. Una pagina con un guscio diverso, per esempio l'accesso a tutta pagina senza
|
|
144
|
+
sidebar, dichiara `layout` sulla sua voce:
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
export const menuConfig: MenuConfig = {
|
|
148
|
+
main: [
|
|
149
|
+
{ path: '/', title: 'Home', icon: 'home', page: HomePage }, // LayoutDefault
|
|
150
|
+
],
|
|
151
|
+
public: [
|
|
152
|
+
{ path: '/login', page: LoginPage, layout: AccessLayout }, // senza header né sidebar
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
La home va dichiarata con `path: '/'`: senza quella voce, `/` mostra "Missing Page".
|
|
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
|
+
|
|
116
180
|
### Hooks
|
|
117
181
|
|
|
118
182
|
```ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmnative/react",
|
|
3
|
-
"version": "2.
|
|
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(
|
|
92
|
-
const theme =
|
|
99
|
+
const themeInput = await question(`Which theme? (${THEMES.join(', ')}; default: ${DEFAULT_THEME}) `);
|
|
100
|
+
const theme = THEMES.includes(themeInput.trim())
|
|
93
101
|
? themeInput.trim()
|
|
94
|
-
:
|
|
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',
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
|
375
|
-
footerClassName: 'border-t border-border
|
|
376
|
-
groupLabelClassName: 'text-[10.5px] font-semibold uppercase tracking-widest text-
|
|
377
|
-
groupDividerClassName: 'bg-border
|
|
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-
|
|
380
|
-
itemChildActiveClassName: 'bg-accent/
|
|
381
|
-
itemInactiveClassName: 'text-
|
|
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-
|
|
389
|
-
subItemInactiveClassName: 'text-
|
|
390
|
-
collapseButtonClassName: 'shrink-0 flex items-center justify-center rounded-md w-8 h-8 transition-colors text-
|
|
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
|
},
|
package/themes/tokyo-night.ts
CHANGED
|
@@ -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
|
},
|