@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.
- package/fesm2022/ojiepermana-angular-theme-layout-services.mjs +364 -0
- package/fesm2022/ojiepermana-angular-theme-layout-services.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +32 -0
- package/fesm2022/ojiepermana-angular-theme-layout-types.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-layout.mjs +574 -0
- package/fesm2022/ojiepermana-angular-theme-layout.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-page.mjs +510 -0
- package/fesm2022/ojiepermana-angular-theme-page.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme-styles.mjs +244 -0
- package/fesm2022/ojiepermana-angular-theme-styles.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-theme.mjs +11 -0
- package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -0
- package/layout/README.md +471 -0
- package/package.json +60 -0
- package/page/README.md +239 -0
- package/styles/README.md +28 -0
- package/styles/css/index.css +9 -0
- package/styles/css/seasonal/base/components.css +129 -0
- package/styles/css/seasonal/base/package.css +6 -0
- package/styles/css/seasonal/base/tailwind.css +144 -0
- package/styles/css/seasonal/base/theme.css +287 -0
- package/styles/css/seasonal/base/tokens.css +152 -0
- package/styles/css/seasonal/ied/package.css +4 -0
- package/styles/css/seasonal/ied/theme.css +78 -0
- package/styles/css/seasonal/imlek/components.css +87 -0
- package/styles/css/seasonal/imlek/package.css +6 -0
- package/styles/css/seasonal/imlek/tailwind.css +144 -0
- package/styles/css/seasonal/imlek/theme.css +95 -0
- package/styles/css/seasonal/imlek/tokens.css +152 -0
- package/styles/css/seasonal/index.css +6 -0
- package/styles/css/seasonal/natal/package.css +4 -0
- package/styles/css/seasonal/natal/theme.css +78 -0
- package/styles/css/seasonal/new-year/package.css +4 -0
- package/styles/css/seasonal/new-year/theme.css +78 -0
- package/styles/css/seasonal/ramadhan/package.css +4 -0
- package/styles/css/seasonal/ramadhan/theme.css +78 -0
- package/types/ojiepermana-angular-theme-layout-services.d.ts +120 -0
- package/types/ojiepermana-angular-theme-layout-types.d.ts +33 -0
- package/types/ojiepermana-angular-theme-layout.d.ts +117 -0
- package/types/ojiepermana-angular-theme-page.d.ts +168 -0
- package/types/ojiepermana-angular-theme-styles.d.ts +89 -0
- 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
|
+
```
|
package/styles/README.md
ADDED
|
@@ -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,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
|
+
}
|