@ojiepermana/angular-theme 22.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +364 -0
  2. package/fesm2022/ojiepermana-angular-theme-layout-services.mjs.map +1 -0
  3. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +32 -0
  4. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs.map +1 -0
  5. package/fesm2022/ojiepermana-angular-theme-layout.mjs +574 -0
  6. package/fesm2022/ojiepermana-angular-theme-layout.mjs.map +1 -0
  7. package/fesm2022/ojiepermana-angular-theme-page.mjs +510 -0
  8. package/fesm2022/ojiepermana-angular-theme-page.mjs.map +1 -0
  9. package/fesm2022/ojiepermana-angular-theme-styles.mjs +244 -0
  10. package/fesm2022/ojiepermana-angular-theme-styles.mjs.map +1 -0
  11. package/fesm2022/ojiepermana-angular-theme.mjs +11 -0
  12. package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -0
  13. package/layout/README.md +471 -0
  14. package/package.json +60 -0
  15. package/page/README.md +239 -0
  16. package/styles/README.md +28 -0
  17. package/styles/css/index.css +9 -0
  18. package/styles/css/seasonal/base/components.css +129 -0
  19. package/styles/css/seasonal/base/package.css +6 -0
  20. package/styles/css/seasonal/base/tailwind.css +144 -0
  21. package/styles/css/seasonal/base/theme.css +287 -0
  22. package/styles/css/seasonal/base/tokens.css +152 -0
  23. package/styles/css/seasonal/ied/package.css +4 -0
  24. package/styles/css/seasonal/ied/theme.css +78 -0
  25. package/styles/css/seasonal/imlek/components.css +87 -0
  26. package/styles/css/seasonal/imlek/package.css +6 -0
  27. package/styles/css/seasonal/imlek/tailwind.css +144 -0
  28. package/styles/css/seasonal/imlek/theme.css +95 -0
  29. package/styles/css/seasonal/imlek/tokens.css +152 -0
  30. package/styles/css/seasonal/index.css +6 -0
  31. package/styles/css/seasonal/natal/package.css +4 -0
  32. package/styles/css/seasonal/natal/theme.css +78 -0
  33. package/styles/css/seasonal/new-year/package.css +4 -0
  34. package/styles/css/seasonal/new-year/theme.css +78 -0
  35. package/styles/css/seasonal/ramadhan/package.css +4 -0
  36. package/styles/css/seasonal/ramadhan/theme.css +78 -0
  37. package/types/ojiepermana-angular-theme-layout-services.d.ts +120 -0
  38. package/types/ojiepermana-angular-theme-layout-types.d.ts +33 -0
  39. package/types/ojiepermana-angular-theme-layout.d.ts +117 -0
  40. package/types/ojiepermana-angular-theme-page.d.ts +168 -0
  41. package/types/ojiepermana-angular-theme-styles.d.ts +89 -0
  42. package/types/ojiepermana-angular-theme.d.ts +2 -0
package/page/README.md ADDED
@@ -0,0 +1,239 @@
1
+ # @ojiepermana/angular-theme/page
2
+
3
+ Primitive page shell untuk layout halaman dengan pendekatan nested component.
4
+
5
+ Dokumentasi ini mengikuti API publik terbaru dari `@ojiepermana/angular-theme/page`, termasuk mode `height`, slot `PageDashboard`, controlled side state, dan override untuk side rail.
6
+
7
+ ## Components
8
+
9
+ - `Page`
10
+ - `PageHeader`
11
+ - `PageContent`
12
+ - `PageDashboard`
13
+ - `PageFooter`
14
+ - `PageSide`
15
+ - `PageSideToggle`
16
+
17
+ `PageSideToggle` menerima projected content untuk label atau ikon kustom. Jika tidak ada projected content, komponen akan memakai ikon fallback bawaan.
18
+ `PageDashboard` mengikuti perilaku layout dan scroll yang sama dengan `PageContent`, tetapi disediakan sebagai slot semantik untuk dashboard, board, dan surface analitik.
19
+
20
+ ## Root API
21
+
22
+ ### `Page`
23
+
24
+ | Input | Type | Default | Keterangan |
25
+ | ----------- | ----------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------- |
26
+ | `variant` | `'stacked' \| 'side'` | `'stacked'` | Menentukan struktur utama page shell. |
27
+ | `scroll` | `'content' \| 'Page'` | `'content'` | Menentukan apakah body slot scroll sendiri atau seluruh root `Page` scroll bersama. |
28
+ | `height` | `'auto' \| 'fix'` | `'auto'` | Mengontrol tinggi `PageHeader` dan `PageFooter`. |
29
+ | `position` | `'left' \| 'right'` | `'left'` | Posisi default untuk `PageSide` jika side tidak memberi override sendiri. |
30
+ | `sideMode` | `'sticky' \| 'drawer' \| 'overlay'` | `'sticky'` | Mode default untuk `PageSide` jika side tidak memberi override sendiri. |
31
+ | `sideWidth` | `string` | `'16rem'` | Lebar default side rail; dipakai juga untuk drawer dan overlay. |
32
+ | `sideOpen` | `boolean \| null` | `null` | Saat `null`, state side tidak dikontrol dari parent. Saat `true/false`, komponen masuk controlled mode. |
33
+ | `class` | `string` | `''` | Class tambahan pada host `Page`. |
34
+
35
+ | Output | Payload | Keterangan |
36
+ | ---------------- | --------- | -------------------------------------------------------------------------------------------- |
37
+ | `sideOpenChange` | `boolean` | Emit setiap ada permintaan buka/tutup side, baik dari toggle, backdrop, maupun tombol `Esc`. |
38
+
39
+ `Page` juga menambahkan atribut host `data-page-variant`, `data-page-height`, `data-page-scroll`, `data-page-position`, `data-page-side-mode`, dan `data-page-side-open` untuk styling atau inspeksi.
40
+
41
+ ## Slot API
42
+
43
+ ### Body slots
44
+
45
+ | Component | Input | Default | Keterangan |
46
+ | --------------- | --------------- | ------- | -------------------------------------------------------------------------------------- |
47
+ | `PageHeader` | `class: string` | `''` | Slot header dengan border bawah. Saat `height="fix"`, tinggi dipaksa `h-12`. |
48
+ | `PageContent` | `class: string` | `''` | Body slot utama. Mengikuti mode `scroll` dari root `Page`. |
49
+ | `PageDashboard` | `class: string` | `''` | Setara dengan `PageContent`, tetapi untuk kebutuhan dashboard/board/analytics surface. |
50
+ | `PageFooter` | `class: string` | `''` | Slot footer dengan border atas. Saat `height="fix"`, tinggi dipaksa `h-12`. |
51
+
52
+ ### `PageSide`
53
+
54
+ | Input | Type | Default | Keterangan |
55
+ | ------------ | ----------------------------------- | ---------- | ----------------------------------------------------------------------------------------------- |
56
+ | `mode` | `'sticky' \| 'drawer' \| 'overlay'` | `'sticky'` | Override mode side untuk instance tersebut. |
57
+ | `position` | `'left' \| 'right' \| null` | `null` | Override posisi side untuk instance tersebut. Jika `null`, memakai nilai dari root `Page`. |
58
+ | `width` | `string \| null` | `null` | Override lebar side untuk instance tersebut. Jika `null`, memakai `sideWidth` dari root `Page`. |
59
+ | `closeOnEsc` | `boolean` | `true` | Berlaku untuk `drawer` dan `overlay`; menutup side ketika tombol `Esc` ditekan. |
60
+ | `class` | `string` | `''` | Class tambahan pada host `PageSide`. |
61
+
62
+ ### `PageSideToggle`
63
+
64
+ | Input / Output | Type | Default | Keterangan |
65
+ | -------------- | --------- | -------------------- | ----------------------------------------------------------- |
66
+ | `ariaLabel` | `string` | `'Toggle Page side'` | Label aksesibilitas untuk tombol toggle. |
67
+ | `class` | `string` | `''` | Class tambahan pada host toggle. |
68
+ | `toggled` | `boolean` | - | Emit nilai open state terbaru setelah tombol toggle diklik. |
69
+
70
+ ## Variants
71
+
72
+ - `stacked`
73
+ - `side`
74
+
75
+ ## Scroll Modes
76
+
77
+ - `content` (default): `PageContent` atau `PageDashboard` menjadi area scroll. Pada variant `side`, `PageSide` dan body slot yang dipakai sama-sama stretch ke parent dan masing-masing punya scroll sendiri.
78
+ - `Page`: seluruh isi `Page` menjadi area scroll. Header, content, footer, dan pada variant `side` juga `PageSide` akan mengikuti tinggi content induk tanpa scroll internal.
79
+
80
+ ## Height Modes
81
+
82
+ - `auto` (default): tinggi `PageHeader` dan `PageFooter` mengikuti isi.
83
+ - `fix`: `PageHeader` dan `PageFooter` dipaksa `h-12` dan `overflow-hidden`, sehingga isi yang melebihi tinggi tersebut akan terpotong.
84
+
85
+ Dalam mode `fix`, pastikan isi header/footer memang dirancang sebagai rail ringkas. Konten yang lebih tinggi dari `h-12` tidak akan ikut menambah tinggi slot.
86
+
87
+ ## Behavior Summary
88
+
89
+ | Variant | `scroll="content"` | `scroll="Page"` |
90
+ | --------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
91
+ | `stacked` | `PageContent` atau `PageDashboard` stretch ke tinggi yang tersedia dan menjadi area scroll | seluruh `Page` scroll bersama; header, content, footer ikut satu kanvas |
92
+ | `side` | `PageSide` dan body slot (`PageContent`/`PageDashboard`) sama-sama stretch ke parent dan punya scroll sendiri | `PageSide` dan body slot mengikuti tinggi content induk tanpa scroll internal |
93
+
94
+ ## Header And Footer Height
95
+
96
+ Saat memakai `height="fix"`, slot berikut tidak boleh melebihi tinggi tetap yang disediakan:
97
+
98
+ - `PageHeader`: `h-12` dengan `overflow-hidden`
99
+ - `PageFooter`: `h-12` dengan `overflow-hidden`
100
+
101
+ ## Side Modes
102
+
103
+ - `sticky`
104
+ - `drawer`
105
+ - `overlay`
106
+
107
+ ## Examples
108
+
109
+ ### Stacked with content scroll
110
+
111
+ ```html
112
+ <Page variant="stacked">
113
+ <PageHeader>
114
+ <h1>Executive summary</h1>
115
+ </PageHeader>
116
+
117
+ <PageContent>
118
+ <p>Secara default, slot content yang menjadi area scroll.</p>
119
+ </PageContent>
120
+
121
+ <PageFooter>
122
+ <button type="button">Save</button>
123
+ </PageFooter>
124
+ </Page>
125
+ ```
126
+
127
+ ### Stacked dashboard surface
128
+
129
+ ```html
130
+ <Page variant="stacked">
131
+ <PageHeader>
132
+ <h1>Executive dashboard</h1>
133
+ </PageHeader>
134
+
135
+ <PageDashboard>
136
+ <p>Gunakan slot ini ketika area utama secara semantik adalah dashboard atau board analitik.</p>
137
+ </PageDashboard>
138
+
139
+ <PageFooter>
140
+ <button type="button">Open insight</button>
141
+ </PageFooter>
142
+ </Page>
143
+ ```
144
+
145
+ ### Stacked with fixed header and footer height
146
+
147
+ ```html
148
+ <Page variant="stacked" height="fix">
149
+ <PageHeader>
150
+ <div class="h-20">Bagian ini akan terpotong ke tinggi h-12.</div>
151
+ </PageHeader>
152
+
153
+ <PageContent>
154
+ <p>Content tetap mengikuti mode scroll yang aktif.</p>
155
+ </PageContent>
156
+
157
+ <PageFooter>
158
+ <div class="h-20">Footer juga tidak boleh melebihi h-12.</div>
159
+ </PageFooter>
160
+ </Page>
161
+ ```
162
+
163
+ ### Stacked with page scroll
164
+
165
+ ```html
166
+ <Page variant="stacked" scroll="page">
167
+ <PageHeader>
168
+ <h1>Executive summary</h1>
169
+ </PageHeader>
170
+
171
+ <PageContent>
172
+ <p>Semua area di dalam page ikut scroll bersama.</p>
173
+ </PageContent>
174
+
175
+ <PageFooter>
176
+ <button type="button">Save</button>
177
+ </PageFooter>
178
+ </Page>
179
+ ```
180
+
181
+ ### Side with content scroll
182
+
183
+ ```html
184
+ <Page variant="side" position="left" scroll="content">
185
+ <PageHeader>
186
+ <PageSideToggle ariaLabel="Toggle side">
187
+ <span>Open filters</span>
188
+ </PageSideToggle>
189
+ <h1>Page title</h1>
190
+ </PageHeader>
191
+
192
+ <PageSide mode="sticky">
193
+ <p>Side rail scroll sendiri.</p>
194
+ </PageSide>
195
+
196
+ <PageContent>
197
+ <p>Main content juga scroll sendiri.</p>
198
+ </PageContent>
199
+ </Page>
200
+ ```
201
+
202
+ ### Side with page scroll
203
+
204
+ ```html
205
+ <Page variant="side" position="left" scroll="page">
206
+ <PageHeader>
207
+ <h1>Executive detail</h1>
208
+ </PageHeader>
209
+
210
+ <PageSide mode="sticky">
211
+ <p>Side mengikuti tinggi content induk.</p>
212
+ </PageSide>
213
+
214
+ <PageContent>
215
+ <p>Root `Page` yang menjadi area scroll tunggal.</p>
216
+ </PageContent>
217
+ </Page>
218
+ ```
219
+
220
+ ### Controlled side state
221
+
222
+ ```html
223
+ <Page variant="side" sideMode="drawer" [sideOpen]="filtersOpen()" (sideOpenChange)="filtersOpen.set($event)">
224
+ <PageHeader>
225
+ <PageSideToggle ariaLabel="Toggle filters">
226
+ <span>Filters</span>
227
+ </PageSideToggle>
228
+ <h1>Pipeline board</h1>
229
+ </PageHeader>
230
+
231
+ <PageSide>
232
+ <p>Drawer ini mengikuti state dari parent.</p>
233
+ </PageSide>
234
+
235
+ <PageDashboard>
236
+ <p>Dashboard tetap memakai body behavior yang sama seperti page-content.</p>
237
+ </PageDashboard>
238
+ </Page>
239
+ ```
@@ -0,0 +1,28 @@
1
+ # Theme
2
+
3
+ `@ojiepermana/angular-theme/styles` menyediakan provider untuk mode, season, dan preload aset tema global.
4
+
5
+ ```ts
6
+ import { provideUiTheme } from '@ojiepermana/angular-theme/styles';
7
+
8
+ export const appConfig = {
9
+ providers: [
10
+ provideUiTheme({
11
+ mode: 'light',
12
+ season: 'base',
13
+ }),
14
+ ],
15
+ };
16
+ ```
17
+
18
+ ## API Notes
19
+
20
+ - `mode` mem-bootstrap `ThemeModeService` dan default mode yang disimpan di storage.
21
+ - `season` mem-bootstrap `ThemeSeasonService` dan default season yang disimpan di storage.
22
+ - `icons.materialSymbols` mengontrol preload stylesheet Material Symbols pada bootstrap aplikasi.
23
+
24
+ ## Default Behavior
25
+
26
+ - Material Symbols di-preload secara default saat `provideUiTheme()` dijalankan.
27
+ - Untuk menonaktifkan preload global, set `icons.materialSymbols` ke `false`.
28
+ - Komponen dari `@ojiepermana/angular-component/icon` tetap punya fallback lazy-load bila provider tema tidak dipakai.
@@ -0,0 +1,9 @@
1
+ /*
2
+ * Default theme stylesheet: base tokens/components only.
3
+ *
4
+ * CSS musiman TIDAK lagi di-bundle di sini (±36 kB). Musim aktif dimuat
5
+ * runtime oleh ThemeSeasonService bila `seasonalCssUrl` dikonfigurasi pada
6
+ * provideUiTheme(), atau impor manual './seasonal/<season>/package.css'
7
+ * (semua musim sekaligus: './seasonal/index.css').
8
+ */
9
+ @import './seasonal/base/package.css';
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Global component-facing styles that should react to the active theme.
3
+ */
4
+ @layer base {
5
+ * {
6
+ border-color: hsl(var(--border));
7
+ outline-color: hsl(var(--ring) / var(--opacity-50));
8
+ }
9
+
10
+ html,
11
+ body {
12
+ min-height: 100%;
13
+ }
14
+
15
+ html {
16
+ background: hsl(var(--background));
17
+ }
18
+
19
+ body {
20
+ background: hsl(var(--background));
21
+ color: hsl(var(--foreground));
22
+ font-family: var(--font-sans);
23
+ font-size: var(--text-base);
24
+ line-height: var(--text-base--line-height);
25
+ letter-spacing: var(--letter-spacing);
26
+ transition:
27
+ background-color var(--duration-normal) var(--ease-standard),
28
+ color var(--duration-normal) var(--ease-standard),
29
+ border-color var(--duration-normal) var(--ease-standard),
30
+ box-shadow var(--duration-normal) var(--ease-standard),
31
+ outline-color var(--duration-normal) var(--ease-standard);
32
+ }
33
+
34
+ button,
35
+ input,
36
+ select,
37
+ textarea {
38
+ font: inherit;
39
+ }
40
+
41
+ html,
42
+ body,
43
+ * {
44
+ scrollbar-width: thin;
45
+ scrollbar-color: hsl(var(--scrollbar-thumb)) hsl(var(--scrollbar-track));
46
+ }
47
+
48
+ *::-webkit-scrollbar {
49
+ width: var(--scrollbar-size);
50
+ height: var(--scrollbar-size);
51
+ }
52
+
53
+ *::-webkit-scrollbar-track {
54
+ background: hsl(var(--scrollbar-track));
55
+ }
56
+
57
+ *::-webkit-scrollbar-thumb {
58
+ background: hsl(var(--scrollbar-thumb));
59
+ border: 2px solid transparent;
60
+ background-clip: padding-box;
61
+ border-radius: var(--scrollbar-radius);
62
+ }
63
+
64
+ *::-webkit-scrollbar-thumb:hover {
65
+ background: hsl(var(--scrollbar-thumb-hover));
66
+ background-clip: padding-box;
67
+ }
68
+
69
+ ::selection {
70
+ background: hsl(var(--primary) / var(--opacity-24));
71
+ color: hsl(var(--foreground));
72
+ }
73
+
74
+ @media (forced-colors: active) {
75
+ html,
76
+ body,
77
+ * {
78
+ scrollbar-width: auto;
79
+ scrollbar-color: auto;
80
+ }
81
+
82
+ *::-webkit-scrollbar-thumb {
83
+ background: CanvasText;
84
+ border-color: transparent;
85
+ }
86
+ }
87
+ }
88
+
89
+ @layer components {
90
+ .nav-text {
91
+ font-family: var(--nav-font-family, var(--font-sans));
92
+ font-size: var(--nav-text-size, var(--text-base));
93
+ line-height: var(--nav-text-line-height, var(--text-base--line-height));
94
+ }
95
+
96
+ .nav-hover-surface {
97
+ @apply relative isolate hover:text-accent-foreground;
98
+ }
99
+
100
+ .nav-hover-surface::before {
101
+ content: '';
102
+ border-radius: inherit;
103
+ @apply pointer-events-none absolute inset-y-0 left-2 right-2 z-0 bg-transparent transition-colors;
104
+ }
105
+
106
+ .nav-hover-surface:hover::before {
107
+ @apply bg-accent;
108
+ }
109
+
110
+ .nav-hover-surface > * {
111
+ @apply relative z-10;
112
+ }
113
+
114
+ .nav-heading {
115
+ font-family: var(--nav-heading-font-family, var(--nav-font-family, var(--font-sans)));
116
+ font-size: var(--nav-heading-size, var(--text-sm));
117
+ line-height: var(--nav-heading-line-height, var(--text-sm--line-height));
118
+ font-weight: var(--nav-heading-weight, 600);
119
+ letter-spacing: var(--nav-heading-letter-spacing, 0.12em);
120
+ text-transform: uppercase;
121
+ }
122
+
123
+ .nav-badge {
124
+ font-family: var(--nav-badge-font-family, var(--nav-font-family, var(--font-sans)));
125
+ font-size: var(--nav-badge-size, var(--text-sm));
126
+ line-height: var(--nav-badge-line-height, var(--text-sm--line-height));
127
+ font-weight: var(--nav-badge-weight, 500);
128
+ }
129
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Internal grouped base theme stylesheet.
3
+ */
4
+ @import './theme.css';
5
+ @import './tokens.css';
6
+ @import './components.css';
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Tailwind v4 theme mapping for @ojiepermana/angular-theme/styles.
3
+ *
4
+ * Requires Tailwind CSS ^4.3.0.
5
+ *
6
+ * Usage (styles.css):
7
+ * @import '@ojiepermana/angular-theme/styles/styles';
8
+ * @import 'tailwindcss';
9
+ * @import '@ojiepermana/angular-theme/styles/tailwind/theme.css';
10
+ *
11
+ * Maps the 3-layer HSL CSS variables onto Tailwind v4 design tokens so
12
+ * utilities like `bg-primary`, `text-foreground`, `rounded-md`, and
13
+ * `shadow-lg` resolve to the active theme automatically.
14
+ */
15
+ @custom-variant dark (&:where([data-mode='dark'], [data-mode='dark'] *, .dark, .dark *));
16
+
17
+ @theme inline {
18
+ --color-highlight: hsl(var(--highlight) / 0.7);
19
+ --color-border: hsl(var(--border));
20
+ --color-input: hsl(var(--input));
21
+ --color-ring: hsl(var(--ring));
22
+ --color-background: hsl(var(--background));
23
+ --color-surface: hsl(var(--surface, var(--muted)));
24
+ --color-surface-foreground: hsl(var(--surface-foreground, var(--foreground)));
25
+ --color-foreground: hsl(var(--foreground));
26
+
27
+ --color-primary: hsl(var(--primary));
28
+ --color-primary-foreground: hsl(var(--primary-foreground));
29
+
30
+ --color-secondary: hsl(var(--secondary));
31
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
32
+
33
+ --color-destructive: hsl(var(--destructive));
34
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
35
+
36
+ --color-success: hsl(var(--success));
37
+ --color-success-foreground: hsl(var(--success-foreground));
38
+
39
+ --color-warning: hsl(var(--warning));
40
+ --color-warning-foreground: hsl(var(--warning-foreground));
41
+
42
+ --color-info: hsl(var(--info));
43
+ --color-info-foreground: hsl(var(--info-foreground));
44
+
45
+ --color-muted: hsl(var(--muted));
46
+ --color-muted-foreground: hsl(var(--muted-foreground));
47
+
48
+ --color-accent: hsl(var(--accent));
49
+ --color-accent-foreground: hsl(var(--accent-foreground));
50
+
51
+ --color-popover: hsl(var(--popover));
52
+ --color-popover-foreground: hsl(var(--popover-foreground));
53
+
54
+ --color-card: hsl(var(--card));
55
+ --color-card-foreground: hsl(var(--card-foreground));
56
+
57
+ --color-chart-1: hsl(var(--chart-1));
58
+ --color-chart-2: hsl(var(--chart-2));
59
+ --color-chart-3: hsl(var(--chart-3));
60
+ --color-chart-4: hsl(var(--chart-4));
61
+ --color-chart-5: hsl(var(--chart-5));
62
+
63
+ --color-sidebar: hsl(var(--sidebar));
64
+ --color-sidebar-foreground: hsl(var(--sidebar-foreground));
65
+ --color-sidebar-primary: hsl(var(--sidebar-primary));
66
+ --color-sidebar-primary-foreground: hsl(var(--sidebar-primary-foreground));
67
+ --color-sidebar-accent: hsl(var(--sidebar-accent));
68
+ --color-sidebar-accent-foreground: hsl(var(--sidebar-accent-foreground));
69
+ --color-sidebar-border: hsl(var(--sidebar-border));
70
+ --color-sidebar-ring: hsl(var(--sidebar-ring));
71
+
72
+ --radius: var(--radius-base);
73
+ --radius-xs: calc(var(--radius-base) * 0.4);
74
+ --radius-sm: calc(var(--radius-base) * 0.6);
75
+ --radius-md: calc(var(--radius-base) * 0.8);
76
+ --radius-lg: var(--radius-base);
77
+ --radius-xl: calc(var(--radius-base) * 1.4);
78
+ --radius-2xl: calc(var(--radius-base) * 1.8);
79
+ --radius-3xl: calc(var(--radius-base) * 2.2);
80
+ --radius-4xl: calc(var(--radius-base) * 2.6);
81
+
82
+ --shadow-xs: var(--theme-shadow-xs);
83
+ --shadow-sm: var(--theme-shadow-sm);
84
+ --shadow: var(--theme-shadow);
85
+ --shadow-md: var(--theme-shadow-md);
86
+ --shadow-lg: var(--theme-shadow-lg);
87
+ --shadow-xl: var(--theme-shadow-xl);
88
+
89
+ --text-2xs: var(--font-size-2xs);
90
+ --text-2xs--line-height: var(--line-height-2xs);
91
+ --text-2xs-plus: var(--font-size-2xs-plus);
92
+ --text-2xs-plus--line-height: var(--line-height-2xs-plus);
93
+ --text-xs: var(--font-size-xs);
94
+ --text-xs--line-height: var(--line-height-tight);
95
+ --text-sm: var(--font-size-sm);
96
+ --text-sm--line-height: var(--line-height-snug);
97
+ --text-base: var(--font-size-md);
98
+ --text-base--line-height: var(--line-height-normal);
99
+ --text-lg: var(--font-size-lg);
100
+ --text-lg--line-height: var(--line-height-normal);
101
+ --text-xl: var(--font-size-xl);
102
+ --text-xl--line-height: var(--line-height-snug);
103
+ --text-2xl: var(--font-size-2xl);
104
+ --text-2xl--line-height: var(--line-height-snug);
105
+ --text-3xl: var(--font-size-3xl);
106
+ --text-3xl--line-height: var(--line-height-tight);
107
+ --text-4xl: var(--font-size-4xl);
108
+ --text-4xl--line-height: var(--line-height-tight);
109
+ --text-5xl: calc(var(--font-size-base) * 3);
110
+ --text-5xl--line-height: 1;
111
+ --text-6xl: calc(var(--font-size-base) * 3.75);
112
+ --text-6xl--line-height: 1;
113
+ --text-7xl: calc(var(--font-size-base) * 4.5);
114
+ --text-7xl--line-height: 1;
115
+ --text-8xl: calc(var(--font-size-base) * 6);
116
+ --text-8xl--line-height: 1;
117
+ --text-9xl: calc(var(--font-size-base) * 8);
118
+ --text-9xl--line-height: 1;
119
+
120
+ --leading-tight: var(--line-height-tight);
121
+ --leading-snug: var(--line-height-snug);
122
+ --leading-normal: var(--line-height-normal);
123
+ --leading-relaxed: var(--line-height-relaxed);
124
+ --leading-loose: var(--line-height-loose);
125
+
126
+ --spacing-control-xs: var(--control-height-xs);
127
+ --spacing-control-sm: var(--control-height-sm);
128
+ --spacing-control-md: var(--control-height-md);
129
+ --spacing-control-lg: var(--control-height-lg);
130
+ --spacing-control-xl: var(--control-height-xl);
131
+
132
+ --spacing-container-sm: var(--container-sm);
133
+ --spacing-container-md: var(--container-md);
134
+ --spacing-container-lg: var(--container-lg);
135
+ --spacing-container-xl: var(--container-xl);
136
+ --spacing-container-2xl: var(--container-2xl);
137
+
138
+ --font-sans: var(--theme-font-sans);
139
+ --font-mono: var(--theme-font-mono);
140
+ }
141
+
142
+ @utility rounded-base {
143
+ border-radius: var(--rounded-base);
144
+ }