@ojiepermana/angular-theme 22.0.35 → 22.0.36
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/README.md +38 -19
- package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +10 -6
- package/fesm2022/ojiepermana-angular-theme-styles.mjs +356 -53
- package/package.json +3 -3
- package/styles/README.md +10 -3
- package/styles/css/{seasonal/base → base}/tailwind.css +9 -5
- package/styles/css/{seasonal/base → base}/theme.css +1 -6
- package/styles/css/{seasonal/base → base}/tokens.css +26 -16
- package/styles/css/color/amber.css +50 -0
- package/styles/css/color/blue.css +50 -0
- package/styles/css/color/brand.css +16 -0
- package/styles/css/color/cyan.css +50 -0
- package/styles/css/color/emerald.css +50 -0
- package/styles/css/color/fuchsia.css +50 -0
- package/styles/css/color/green.css +50 -0
- package/styles/css/color/index.css +19 -0
- package/styles/css/color/indigo.css +50 -0
- package/styles/css/color/lime.css +50 -0
- package/styles/css/color/orange.css +50 -0
- package/styles/css/color/pink.css +50 -0
- package/styles/css/color/purple.css +50 -0
- package/styles/css/color/red.css +50 -0
- package/styles/css/color/rose.css +50 -0
- package/styles/css/color/sky.css +50 -0
- package/styles/css/color/teal.css +50 -0
- package/styles/css/color/violet.css +50 -0
- package/styles/css/color/yellow.css +50 -0
- package/styles/css/index.css +15 -6
- package/styles/css/neutral/gray.css +34 -0
- package/styles/css/neutral/index.css +11 -0
- package/styles/css/neutral/mauve.css +34 -0
- package/styles/css/neutral/mist.css +34 -0
- package/styles/css/neutral/neutral.css +34 -0
- package/styles/css/neutral/olive.css +34 -0
- package/styles/css/neutral/slate.css +34 -0
- package/styles/css/neutral/stone.css +34 -0
- package/styles/css/neutral/taupe.css +34 -0
- package/styles/css/neutral/zinc.css +34 -0
- package/styles/css/radius/index.css +29 -0
- package/styles/css/space/index.css +24 -0
- package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +6 -6
- package/types/ojiepermana-angular-theme-styles.d.ts +168 -37
- package/styles/css/seasonal/ied/package.css +0 -4
- package/styles/css/seasonal/ied/theme.css +0 -78
- package/styles/css/seasonal/imlek/components.css +0 -87
- package/styles/css/seasonal/imlek/package.css +0 -6
- package/styles/css/seasonal/imlek/tailwind.css +0 -144
- package/styles/css/seasonal/imlek/theme.css +0 -95
- package/styles/css/seasonal/imlek/tokens.css +0 -152
- package/styles/css/seasonal/index.css +0 -6
- package/styles/css/seasonal/natal/package.css +0 -4
- package/styles/css/seasonal/natal/theme.css +0 -78
- package/styles/css/seasonal/new-year/package.css +0 -4
- package/styles/css/seasonal/new-year/theme.css +0 -78
- package/styles/css/seasonal/ramadhan/package.css +0 -4
- package/styles/css/seasonal/ramadhan/theme.css +0 -78
- /package/styles/css/{seasonal/base → base}/components.css +0 -0
- /package/styles/css/{seasonal/base → base}/package.css +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neutral theme: zinc. Generated by scripts/gen-theme-colors.mjs — do not edit.
|
|
3
|
+
*/
|
|
4
|
+
@layer tokens {
|
|
5
|
+
html[theme-neutral='zinc'][data-mode='light'] {
|
|
6
|
+
--background: 240 3% 98%;
|
|
7
|
+
--foreground: 240 5% 12%;
|
|
8
|
+
--surface: 240 5% 96%;
|
|
9
|
+
--surface-foreground: 240 5% 12%;
|
|
10
|
+
--card: 0 0% 100%;
|
|
11
|
+
--card-foreground: 240 5% 12%;
|
|
12
|
+
--popover: 0 0% 100%;
|
|
13
|
+
--popover-foreground: 240 5% 12%;
|
|
14
|
+
--muted: 240 5% 95%;
|
|
15
|
+
--muted-foreground: 240 5% 42%;
|
|
16
|
+
--border: 240 5% 88%;
|
|
17
|
+
--input: 240 5% 88%;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
html[theme-neutral='zinc'][data-mode='dark'] {
|
|
21
|
+
--background: 240 5% 7%;
|
|
22
|
+
--foreground: 240 3% 96%;
|
|
23
|
+
--surface: 240 5% 11%;
|
|
24
|
+
--surface-foreground: 240 3% 96%;
|
|
25
|
+
--card: 240 5% 8%;
|
|
26
|
+
--card-foreground: 240 3% 96%;
|
|
27
|
+
--popover: 240 5% 8%;
|
|
28
|
+
--popover-foreground: 240 3% 96%;
|
|
29
|
+
--muted: 240 5% 15%;
|
|
30
|
+
--muted-foreground: 240 4% 64%;
|
|
31
|
+
--border: 240 5% 17%;
|
|
32
|
+
--input: 240 5% 17%;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Corner radius axis (theme-radius). Each preset sets the single --radius-base
|
|
3
|
+
* knob; the whole --radius-* scale + every rounded-* utility follows via the
|
|
4
|
+
* calc() chain (base/tailwind.css @theme inline). Runtime-switched by
|
|
5
|
+
* ThemeRadiusService via <html theme-radius>. 'md' = the 0.625rem default.
|
|
6
|
+
*
|
|
7
|
+
* Wrapped in @layer tokens to match base/tokens.css and the color/neutral
|
|
8
|
+
* presets; html[theme-radius='x'] (0,1,1) beats the :root default (0,1,0).
|
|
9
|
+
*/
|
|
10
|
+
@layer tokens {
|
|
11
|
+
html[theme-radius='none'] {
|
|
12
|
+
--radius-base: 0px;
|
|
13
|
+
}
|
|
14
|
+
html[theme-radius='sm'] {
|
|
15
|
+
--radius-base: 0.375rem;
|
|
16
|
+
}
|
|
17
|
+
html[theme-radius='md'] {
|
|
18
|
+
--radius-base: 0.625rem;
|
|
19
|
+
}
|
|
20
|
+
html[theme-radius='lg'] {
|
|
21
|
+
--radius-base: 0.875rem;
|
|
22
|
+
}
|
|
23
|
+
html[theme-radius='xl'] {
|
|
24
|
+
--radius-base: 1.25rem;
|
|
25
|
+
}
|
|
26
|
+
html[theme-radius='full'] {
|
|
27
|
+
--radius-base: 9999px;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Spacing density axis (theme-space). Each preset sets the single --spacing-base
|
|
3
|
+
* knob; Tailwind derives --spacing from it (base/tailwind.css @theme inline), so
|
|
4
|
+
* every padding, margin, gap, width and height utility (and the --spacing-N
|
|
5
|
+
* scale) rescales at runtime. Switched by ThemeSpaceService via <html theme-space>.
|
|
6
|
+
* normal = the 0.25rem default (the Tailwind unit), so it is a no-op baseline.
|
|
7
|
+
*
|
|
8
|
+
* Wrapped in @layer tokens to match the radius/color/neutral presets;
|
|
9
|
+
* html[theme-space='x'] (0,1,1) beats the :root default (0,1,0).
|
|
10
|
+
*/
|
|
11
|
+
@layer tokens {
|
|
12
|
+
html[theme-space='compact'] {
|
|
13
|
+
--spacing-base: 0.2rem;
|
|
14
|
+
}
|
|
15
|
+
html[theme-space='normal'] {
|
|
16
|
+
--spacing-base: 0.25rem;
|
|
17
|
+
}
|
|
18
|
+
html[theme-space='relaxed'] {
|
|
19
|
+
--spacing-base: 0.28rem;
|
|
20
|
+
}
|
|
21
|
+
html[theme-space='spacious'] {
|
|
22
|
+
--spacing-base: 0.32rem;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -69,10 +69,10 @@ declare class LayoutUser {
|
|
|
69
69
|
declare class LayoutNavSidebar {
|
|
70
70
|
readonly brand: _angular_core.InputSignal<BrandIdentity>;
|
|
71
71
|
readonly user: _angular_core.InputSignal<UserIdentity>;
|
|
72
|
-
/** Appearance dari shell (`[appearance]`);
|
|
72
|
+
/** Appearance dari shell (`[appearance]`); menentukan ketebalan border kanan pemisah konten. */
|
|
73
73
|
readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
|
|
74
|
-
/**
|
|
75
|
-
protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "">;
|
|
74
|
+
/** Border kanan pemisah; ketebalan ikut appearance: `border-rail` 1.5px, `flat` 1px. */
|
|
75
|
+
protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "border-r border-border">;
|
|
76
76
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavSidebar, never>;
|
|
77
77
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavSidebar, "LayoutNavSidebar", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
78
78
|
}
|
|
@@ -84,10 +84,10 @@ declare class LayoutNavSidebar {
|
|
|
84
84
|
declare class LayoutNavDockbar {
|
|
85
85
|
readonly brand: _angular_core.InputSignal<BrandIdentity>;
|
|
86
86
|
readonly user: _angular_core.InputSignal<UserIdentity>;
|
|
87
|
-
/** Appearance dari shell (`[appearance]`);
|
|
87
|
+
/** Appearance dari shell (`[appearance]`); menentukan ketebalan border kanan pemisah konten. */
|
|
88
88
|
readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
|
|
89
|
-
/**
|
|
90
|
-
protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "">;
|
|
89
|
+
/** Border kanan pemisah; ketebalan ikut appearance: `border-rail` 1.5px, `flat` 1px. */
|
|
90
|
+
protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "border-r border-border">;
|
|
91
91
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavDockbar, never>;
|
|
92
92
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavDockbar, "LayoutNavDockbar", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
93
93
|
}
|
|
@@ -1,21 +1,59 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, EnvironmentProviders } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
declare const THEME_MODES: readonly ["light", "dark", "system"];
|
|
5
5
|
declare const RESOLVED_THEME_MODES: readonly ["light", "dark"];
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* FluxUI-style accent palettes (axis `theme-color`). `base` = core theme (no
|
|
8
|
+
* override); `brand` = the consumer's `--brand` color. Others re-tint the full
|
|
9
|
+
* palette. Order mirrors the FluxUI accent picker (base…rose) + `brand`.
|
|
10
|
+
*/
|
|
11
|
+
declare const THEME_COLORS: readonly ["base", "red", "orange", "amber", "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", "violet", "purple", "fuchsia", "pink", "rose", "brand"];
|
|
12
|
+
/**
|
|
13
|
+
* Neutral (gray) families (axis `theme-neutral`). `base` = core theme neutrals.
|
|
14
|
+
* Overrides only the gray family, composing with any accent.
|
|
15
|
+
*/
|
|
16
|
+
declare const THEME_NEUTRALS: readonly ["base", "slate", "gray", "zinc", "neutral", "stone", "mauve", "olive", "mist", "taupe"];
|
|
17
|
+
/**
|
|
18
|
+
* Corner radius presets (axis `theme-radius`). Each drives the single
|
|
19
|
+
* `--radius-base` knob; the whole `--radius-*` scale + `rounded-*` utilities
|
|
20
|
+
* follow. `md` = the 0.625rem default; `full` is the pill extreme.
|
|
21
|
+
*/
|
|
22
|
+
declare const THEME_RADII: readonly ["none", "sm", "md", "lg", "xl", "full"];
|
|
23
|
+
/**
|
|
24
|
+
* Spacing density presets (axis `theme-space`). Each drives the single
|
|
25
|
+
* `--spacing-base` knob; every `p-*`/`m-*`/`gap-*`/`w-*`/`h-*` utility follows.
|
|
26
|
+
* `normal` = the 0.25rem default (no-op baseline).
|
|
27
|
+
*/
|
|
28
|
+
declare const THEME_SPACES: readonly ["compact", "normal", "relaxed", "spacious"];
|
|
7
29
|
type ThemeMode = (typeof THEME_MODES)[number];
|
|
8
30
|
type ResolvedThemeMode = (typeof RESOLVED_THEME_MODES)[number];
|
|
9
|
-
type
|
|
31
|
+
type ThemeColor = (typeof THEME_COLORS)[number];
|
|
32
|
+
type ThemeNeutral = (typeof THEME_NEUTRALS)[number];
|
|
33
|
+
type ThemeRadius = (typeof THEME_RADII)[number];
|
|
34
|
+
type ThemeSpace = (typeof THEME_SPACES)[number];
|
|
10
35
|
declare const DEFAULT_THEME_MODE: ThemeMode;
|
|
11
|
-
declare const
|
|
36
|
+
declare const DEFAULT_THEME_COLOR: ThemeColor;
|
|
37
|
+
declare const DEFAULT_THEME_NEUTRAL: ThemeNeutral;
|
|
38
|
+
declare const DEFAULT_THEME_RADIUS: ThemeRadius;
|
|
39
|
+
declare const DEFAULT_THEME_SPACE: ThemeSpace;
|
|
12
40
|
declare const THEME_MODE_STORAGE_KEY = "theme-mode";
|
|
13
|
-
declare const
|
|
41
|
+
declare const THEME_COLOR_STORAGE_KEY = "theme-color";
|
|
42
|
+
declare const THEME_NEUTRAL_STORAGE_KEY = "theme-neutral";
|
|
43
|
+
declare const THEME_BRAND_STORAGE_KEY = "theme-brand";
|
|
44
|
+
declare const THEME_RADIUS_STORAGE_KEY = "theme-radius";
|
|
45
|
+
declare const THEME_SPACE_STORAGE_KEY = "theme-space";
|
|
14
46
|
declare function isThemeMode(value: string | null | undefined): value is ThemeMode;
|
|
15
47
|
declare function isResolvedThemeMode(value: string | null | undefined): value is ResolvedThemeMode;
|
|
16
|
-
declare function
|
|
48
|
+
declare function isThemeColor(value: string | null | undefined): value is ThemeColor;
|
|
49
|
+
declare function isThemeNeutral(value: string | null | undefined): value is ThemeNeutral;
|
|
50
|
+
declare function isThemeRadius(value: string | null | undefined): value is ThemeRadius;
|
|
51
|
+
declare function isThemeSpace(value: string | null | undefined): value is ThemeSpace;
|
|
17
52
|
declare function normalizeThemeMode(value: string | null | undefined): ThemeMode;
|
|
18
|
-
declare function
|
|
53
|
+
declare function normalizeThemeColor(value: string | null | undefined): ThemeColor;
|
|
54
|
+
declare function normalizeThemeNeutral(value: string | null | undefined): ThemeNeutral;
|
|
55
|
+
declare function normalizeThemeRadius(value: string | null | undefined): ThemeRadius;
|
|
56
|
+
declare function normalizeThemeSpace(value: string | null | undefined): ThemeSpace;
|
|
19
57
|
|
|
20
58
|
interface ThemeIconOptions {
|
|
21
59
|
/**
|
|
@@ -28,19 +66,30 @@ interface ThemeIconOptions {
|
|
|
28
66
|
*/
|
|
29
67
|
readonly materialSymbols?: boolean;
|
|
30
68
|
}
|
|
69
|
+
/** Consumer brand color. HSL triplets `H S% L%` consumed by `hsl(var(--brand))`. */
|
|
70
|
+
interface ThemeBrandOptions {
|
|
71
|
+
/** Brand color, e.g. `'221 83% 53%'`. */
|
|
72
|
+
readonly color: string;
|
|
73
|
+
/** Foreground on solid brand fills. Defaults to white. */
|
|
74
|
+
readonly foreground?: string;
|
|
75
|
+
}
|
|
31
76
|
interface ThemeOptions {
|
|
32
77
|
readonly mode?: ThemeMode;
|
|
33
|
-
|
|
34
|
-
readonly
|
|
78
|
+
/** Initial accent palette (`theme-color`). Persisted choice wins over this. */
|
|
79
|
+
readonly color?: ThemeColor;
|
|
80
|
+
/** Initial neutral family (`theme-neutral`). Persisted choice wins over this. */
|
|
81
|
+
readonly neutral?: ThemeNeutral;
|
|
82
|
+
/** Initial corner radius preset (`theme-radius`). Persisted choice wins over this. */
|
|
83
|
+
readonly radius?: ThemeRadius;
|
|
84
|
+
/** Initial spacing density preset (`theme-space`). Persisted choice wins over this. */
|
|
85
|
+
readonly space?: ThemeSpace;
|
|
35
86
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* loading happens — the app is expected to bundle season CSS itself.
|
|
40
|
-
*
|
|
41
|
-
* Contoh: `(season) => '/themes/seasonal/' + season + '/package.css'`
|
|
87
|
+
* Consumer brand color → `--brand` / `bg-brand`, and the `brand` accent preset.
|
|
88
|
+
* Pass an HSL triplet string, or `{ color, foreground }`. Persisted/runtime
|
|
89
|
+
* changes (ThemeBrandService.setBrand) win over this default.
|
|
42
90
|
*/
|
|
43
|
-
readonly
|
|
91
|
+
readonly brand?: string | ThemeBrandOptions;
|
|
92
|
+
readonly icons?: ThemeIconOptions;
|
|
44
93
|
}
|
|
45
94
|
declare const THEME_OPTIONS: InjectionToken<Readonly<ThemeOptions>>;
|
|
46
95
|
|
|
@@ -50,9 +99,9 @@ declare class ThemeModeService {
|
|
|
50
99
|
private readonly options;
|
|
51
100
|
private readonly modeState;
|
|
52
101
|
private readonly systemPrefersDark;
|
|
53
|
-
readonly mode:
|
|
54
|
-
readonly resolvedMode:
|
|
55
|
-
readonly isDark:
|
|
102
|
+
readonly mode: i0.Signal<"light" | "dark" | "system">;
|
|
103
|
+
readonly resolvedMode: i0.Signal<"light" | "dark">;
|
|
104
|
+
readonly isDark: i0.Signal<boolean>;
|
|
56
105
|
constructor();
|
|
57
106
|
setMode(mode: ThemeMode): void;
|
|
58
107
|
toggle(): void;
|
|
@@ -65,33 +114,115 @@ declare class ThemeModeService {
|
|
|
65
114
|
private storage;
|
|
66
115
|
private readStorage;
|
|
67
116
|
private writeStorage;
|
|
68
|
-
static ɵfac:
|
|
69
|
-
static ɵprov:
|
|
117
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeModeService, never>;
|
|
118
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeModeService>;
|
|
70
119
|
}
|
|
71
120
|
|
|
72
121
|
declare function provideUiTheme(options?: ThemeOptions): EnvironmentProviders;
|
|
73
122
|
|
|
74
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Drives the two FluxUI-style color axes:
|
|
125
|
+
* - accent → `<html theme-color>` (full tinted palette per color)
|
|
126
|
+
* - neutral → `<html theme-neutral>` (gray family only)
|
|
127
|
+
*
|
|
128
|
+
* Both persist to localStorage and seed from `provideUiTheme({ color, neutral })`
|
|
129
|
+
* (a persisted choice wins over the configured default). `base` on either axis
|
|
130
|
+
* means "no override" — the core base theme applies.
|
|
131
|
+
*/
|
|
132
|
+
declare class ThemeColorService {
|
|
75
133
|
private readonly documentRef;
|
|
76
134
|
private readonly options;
|
|
77
|
-
private readonly
|
|
78
|
-
readonly
|
|
135
|
+
private readonly colorState;
|
|
136
|
+
private readonly neutralState;
|
|
137
|
+
readonly color: i0.Signal<"base" | "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | "brand">;
|
|
138
|
+
readonly neutral: i0.Signal<"base" | "slate" | "gray" | "zinc" | "neutral" | "stone" | "mauve" | "olive" | "mist" | "taupe">;
|
|
79
139
|
constructor();
|
|
80
|
-
|
|
140
|
+
setColor(color: ThemeColor): void;
|
|
141
|
+
setNeutral(neutral: ThemeNeutral): void;
|
|
81
142
|
private ensureDefaults;
|
|
82
|
-
private
|
|
83
|
-
private applySeasonAttribute;
|
|
84
|
-
/**
|
|
85
|
-
* Lazily loads the active season's stylesheet via `<link>` when the app
|
|
86
|
-
* configured `seasonalCssUrl`, so only base CSS ships in the main bundle.
|
|
87
|
-
*/
|
|
88
|
-
private ensureSeasonStylesheet;
|
|
143
|
+
private applyAttribute;
|
|
89
144
|
private storage;
|
|
90
145
|
private readStorage;
|
|
91
|
-
private
|
|
92
|
-
static ɵfac:
|
|
93
|
-
static ɵprov:
|
|
146
|
+
private persist;
|
|
147
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeColorService, never>;
|
|
148
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeColorService>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Resolved brand color. Both fields are HSL triplets `H S% L%`. */
|
|
152
|
+
interface ThemeBrand {
|
|
153
|
+
readonly color: string;
|
|
154
|
+
readonly foreground: string;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Consumer-configurable brand color. Writes `--brand` / `--brand-foreground` as
|
|
158
|
+
* inline custom properties on `<html>` so `bg-brand` / `text-brand-foreground`
|
|
159
|
+
* and the `theme-color='brand'` accent preset resolve to it.
|
|
160
|
+
*
|
|
161
|
+
* Default comes from `provideUiTheme({ brand })`; `setBrand()` overrides at
|
|
162
|
+
* runtime and persists. When unset, `--brand` falls back to `var(--primary)`.
|
|
163
|
+
*/
|
|
164
|
+
declare class ThemeBrandService {
|
|
165
|
+
private readonly documentRef;
|
|
166
|
+
private readonly options;
|
|
167
|
+
private readonly brandState;
|
|
168
|
+
readonly brand: i0.Signal<ThemeBrand | null>;
|
|
169
|
+
constructor();
|
|
170
|
+
/** Set the brand color. `color`/`foreground` are HSL triplets (e.g. `'221 83% 53%'`). */
|
|
171
|
+
setBrand(color: string, foreground?: string): void;
|
|
172
|
+
/** Clear the consumer brand → `--brand` falls back to `var(--primary)`. */
|
|
173
|
+
clearBrand(): void;
|
|
174
|
+
private ensureDefaults;
|
|
175
|
+
private normalizeOption;
|
|
176
|
+
private applyBrand;
|
|
177
|
+
private storage;
|
|
178
|
+
private readStoredBrand;
|
|
179
|
+
private persist;
|
|
180
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeBrandService, never>;
|
|
181
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeBrandService>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Corner radius axis. Writes `<html theme-radius>`; each preset CSS sets the
|
|
186
|
+
* single `--radius-base` knob so the whole `--radius-*` scale + `rounded-*`
|
|
187
|
+
* utilities rescale. Persists to localStorage and seeds from
|
|
188
|
+
* `provideUiTheme({ radius })` (a persisted choice wins over the default).
|
|
189
|
+
*/
|
|
190
|
+
declare class ThemeRadiusService {
|
|
191
|
+
private readonly documentRef;
|
|
192
|
+
private readonly options;
|
|
193
|
+
private readonly radiusState;
|
|
194
|
+
readonly radius: i0.Signal<"none" | "sm" | "md" | "lg" | "xl" | "full">;
|
|
195
|
+
constructor();
|
|
196
|
+
setRadius(radius: ThemeRadius): void;
|
|
197
|
+
private ensureDefaults;
|
|
198
|
+
private storage;
|
|
199
|
+
private readStorage;
|
|
200
|
+
private persist;
|
|
201
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeRadiusService, never>;
|
|
202
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeRadiusService>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Spacing density axis. Writes `<html theme-space>`; each preset CSS sets the
|
|
207
|
+
* single `--spacing-base` knob, which Tailwind's `--spacing` derives from, so
|
|
208
|
+
* every `p-*`/`m-*`/`gap-*`/`w-*`/`h-*` utility rescales. Persists to
|
|
209
|
+
* localStorage and seeds from `provideUiTheme({ space })` (a persisted choice
|
|
210
|
+
* wins over the default).
|
|
211
|
+
*/
|
|
212
|
+
declare class ThemeSpaceService {
|
|
213
|
+
private readonly documentRef;
|
|
214
|
+
private readonly options;
|
|
215
|
+
private readonly spaceState;
|
|
216
|
+
readonly space: i0.Signal<"compact" | "normal" | "relaxed" | "spacious">;
|
|
217
|
+
constructor();
|
|
218
|
+
setSpace(space: ThemeSpace): void;
|
|
219
|
+
private ensureDefaults;
|
|
220
|
+
private storage;
|
|
221
|
+
private readStorage;
|
|
222
|
+
private persist;
|
|
223
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeSpaceService, never>;
|
|
224
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ThemeSpaceService>;
|
|
94
225
|
}
|
|
95
226
|
|
|
96
|
-
export { DEFAULT_THEME_MODE,
|
|
97
|
-
export type { ResolvedThemeMode, ThemeIconOptions, ThemeMode, ThemeOptions,
|
|
227
|
+
export { DEFAULT_THEME_COLOR, DEFAULT_THEME_MODE, DEFAULT_THEME_NEUTRAL, DEFAULT_THEME_RADIUS, DEFAULT_THEME_SPACE, RESOLVED_THEME_MODES, THEME_BRAND_STORAGE_KEY, THEME_COLORS, THEME_COLOR_STORAGE_KEY, THEME_MODES, THEME_MODE_STORAGE_KEY, THEME_NEUTRALS, THEME_NEUTRAL_STORAGE_KEY, THEME_OPTIONS, THEME_RADII, THEME_RADIUS_STORAGE_KEY, THEME_SPACES, THEME_SPACE_STORAGE_KEY, ThemeBrandService, ThemeColorService, ThemeModeService, ThemeRadiusService, ThemeSpaceService, isResolvedThemeMode, isThemeColor, isThemeMode, isThemeNeutral, isThemeRadius, isThemeSpace, normalizeThemeColor, normalizeThemeMode, normalizeThemeNeutral, normalizeThemeRadius, normalizeThemeSpace, provideUiTheme };
|
|
228
|
+
export type { ResolvedThemeMode, ThemeBrand, ThemeBrandOptions, ThemeColor, ThemeIconOptions, ThemeMode, ThemeNeutral, ThemeOptions, ThemeRadius, ThemeSpace };
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token overrides for the Ied season.
|
|
3
|
-
*/
|
|
4
|
-
@layer tokens {
|
|
5
|
-
html[theme-season='ied'][data-mode='light'] {
|
|
6
|
-
color-scheme: light;
|
|
7
|
-
|
|
8
|
-
--highlight: 188 84% 38%;
|
|
9
|
-
|
|
10
|
-
--background: 186 38% 98%;
|
|
11
|
-
--surface: 45 78% 96%;
|
|
12
|
-
--surface-foreground: 188 46% 16%;
|
|
13
|
-
--foreground: 188 46% 16%;
|
|
14
|
-
|
|
15
|
-
--card: 0 0% 100%;
|
|
16
|
-
--card-foreground: 188 46% 16%;
|
|
17
|
-
|
|
18
|
-
--popover: 0 0% 100%;
|
|
19
|
-
--popover-foreground: 188 46% 16%;
|
|
20
|
-
|
|
21
|
-
--muted: 186 22% 94%;
|
|
22
|
-
--muted-foreground: 188 16% 34%;
|
|
23
|
-
|
|
24
|
-
--border: 186 20% 85%;
|
|
25
|
-
--input: 186 20% 85%;
|
|
26
|
-
|
|
27
|
-
--primary: 188 84% 38%;
|
|
28
|
-
--primary-foreground: 0 0% 100%;
|
|
29
|
-
--accent: 45 92% 94%;
|
|
30
|
-
--accent-foreground: 188 52% 22%;
|
|
31
|
-
--secondary: 184 24% 93%;
|
|
32
|
-
--secondary-foreground: 188 48% 24%;
|
|
33
|
-
--ring: 45 88% 54%;
|
|
34
|
-
|
|
35
|
-
--chart-1: 188 84% 38%;
|
|
36
|
-
--chart-2: 45 88% 54%;
|
|
37
|
-
--chart-3: 149 48% 40%;
|
|
38
|
-
--chart-4: 223 74% 58%;
|
|
39
|
-
--chart-5: 25 92% 60%;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
html[theme-season='ied'][data-mode='dark'] {
|
|
43
|
-
color-scheme: dark;
|
|
44
|
-
|
|
45
|
-
--highlight: 45 92% 68%;
|
|
46
|
-
|
|
47
|
-
--background: 189 34% 11%;
|
|
48
|
-
--surface: 189 24% 16%;
|
|
49
|
-
--surface-foreground: 46 72% 95%;
|
|
50
|
-
--foreground: 46 72% 95%;
|
|
51
|
-
|
|
52
|
-
--card: 189 24% 14%;
|
|
53
|
-
--card-foreground: 46 72% 95%;
|
|
54
|
-
|
|
55
|
-
--popover: 189 24% 14%;
|
|
56
|
-
--popover-foreground: 46 72% 95%;
|
|
57
|
-
|
|
58
|
-
--muted: 189 18% 19%;
|
|
59
|
-
--muted-foreground: 46 18% 78%;
|
|
60
|
-
|
|
61
|
-
--border: 189 16% 25%;
|
|
62
|
-
--input: 189 16% 25%;
|
|
63
|
-
|
|
64
|
-
--primary: 45 92% 68%;
|
|
65
|
-
--primary-foreground: 189 46% 16%;
|
|
66
|
-
--accent: 188 24% 21%;
|
|
67
|
-
--accent-foreground: 46 82% 90%;
|
|
68
|
-
--secondary: 189 18% 19%;
|
|
69
|
-
--secondary-foreground: 46 62% 88%;
|
|
70
|
-
--ring: 45 92% 68%;
|
|
71
|
-
|
|
72
|
-
--chart-1: 45 92% 68%;
|
|
73
|
-
--chart-2: 188 76% 58%;
|
|
74
|
-
--chart-3: 149 54% 54%;
|
|
75
|
-
--chart-4: 223 82% 70%;
|
|
76
|
-
--chart-5: 24 96% 68%;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global component-facing styles that should react to the active theme.
|
|
3
|
-
*/
|
|
4
|
-
@layer base {
|
|
5
|
-
html[theme-season='imlek'] * {
|
|
6
|
-
border-color: hsl(var(--border));
|
|
7
|
-
outline-color: hsl(var(--ring) / var(--opacity-50));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
html[theme-season='imlek'],
|
|
11
|
-
html[theme-season='imlek'] body {
|
|
12
|
-
min-height: 100%;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
html[theme-season='imlek'] {
|
|
16
|
-
background: hsl(var(--background));
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
html[theme-season='imlek'] 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
|
-
html[theme-season='imlek'] button,
|
|
35
|
-
html[theme-season='imlek'] input,
|
|
36
|
-
html[theme-season='imlek'] select,
|
|
37
|
-
html[theme-season='imlek'] textarea {
|
|
38
|
-
font: inherit;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
html[theme-season='imlek'] ::selection {
|
|
42
|
-
background: hsl(var(--primary) / var(--opacity-24));
|
|
43
|
-
color: hsl(var(--foreground));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@layer components {
|
|
48
|
-
html[theme-season='imlek'] .nav-text {
|
|
49
|
-
font-family: var(--nav-font-family, var(--font-sans));
|
|
50
|
-
font-size: var(--nav-text-size, var(--text-base));
|
|
51
|
-
line-height: var(--nav-text-line-height, var(--text-base--line-height));
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
html[theme-season='imlek'] .nav-hover-surface {
|
|
55
|
-
@apply relative isolate hover:text-accent-foreground;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
html[theme-season='imlek'] .nav-hover-surface::before {
|
|
59
|
-
content: '';
|
|
60
|
-
border-radius: inherit;
|
|
61
|
-
@apply pointer-events-none absolute inset-y-0 left-2 right-2 z-0 bg-transparent transition-colors;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
html[theme-season='imlek'] .nav-hover-surface:hover::before {
|
|
65
|
-
@apply bg-accent;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
html[theme-season='imlek'] .nav-hover-surface > * {
|
|
69
|
-
@apply relative z-10;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
html[theme-season='imlek'] .nav-heading {
|
|
73
|
-
font-family: var(--nav-heading-font-family, var(--nav-font-family, var(--font-sans)));
|
|
74
|
-
font-size: var(--nav-heading-size, var(--text-sm));
|
|
75
|
-
line-height: var(--nav-heading-line-height, var(--text-sm--line-height));
|
|
76
|
-
font-weight: var(--nav-heading-weight, 600);
|
|
77
|
-
letter-spacing: var(--nav-heading-letter-spacing, 0.12em);
|
|
78
|
-
text-transform: uppercase;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
html[theme-season='imlek'] .nav-badge {
|
|
82
|
-
font-family: var(--nav-badge-font-family, var(--nav-font-family, var(--font-sans)));
|
|
83
|
-
font-size: var(--nav-badge-size, var(--text-sm));
|
|
84
|
-
line-height: var(--nav-badge-line-height, var(--text-sm--line-height));
|
|
85
|
-
font-weight: var(--nav-badge-weight, 500);
|
|
86
|
-
}
|
|
87
|
-
}
|