@ojiepermana/angular 21.0.7 → 21.1.2
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/.npmignore +2 -0
- package/README.md +36 -0
- package/brand/etos/README.md +68 -0
- package/brand/etos/package.json +4 -0
- package/brand/etos/styles/index.css +15 -0
- package/brand/etos/styles/layout.css +175 -0
- package/{theme/styles/themes/brand/etos → brand/etos/styles}/style.css +18 -17
- package/chart/package.json +4 -0
- package/collection.json +28 -28
- package/component/package.json +4 -0
- package/etos/package.json +4 -0
- package/etos/styles/color.css +21 -0
- package/etos/styles/index.css +15 -0
- package/etos/styles/layout.css +175 -0
- package/etos/styles/style.css +51 -0
- package/fesm2022/ojiepermana-angular-brand-etos.mjs +285 -0
- package/fesm2022/ojiepermana-angular-brand-etos.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-etos.mjs +12 -0
- package/fesm2022/ojiepermana-angular-etos.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout.mjs +22 -9
- package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation.mjs +32 -21
- package/fesm2022/ojiepermana-angular-navigation.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular.mjs +1 -0
- package/fesm2022/ojiepermana-angular.mjs.map +1 -1
- package/generator/api/README.md +35 -14
- package/generator/api/bin/package.json +3 -0
- package/generator/api/package.json +4 -0
- package/generator/api/schematics/init/schema.json +17 -17
- package/generator/api/schematics/ng-add/schema.json +13 -13
- package/generator/api/schematics/sdk/schema.json +17 -17
- package/generator/api/sdk.config.example.json +21 -21
- package/generator/guide/bin/package.json +3 -0
- package/generator/guide/guide.config.example.json +8 -8
- package/generator/guide/schematics/build/schema.json +12 -12
- package/generator/guide/schematics/init/schema.json +17 -17
- package/layout/package.json +4 -0
- package/navigation/package.json +4 -0
- package/package.json +17 -2
- package/theme/package.json +4 -0
- package/theme/styles/etos.css +3 -35
- package/theme/styles/themes/library/style/brutal.css +1 -0
- package/theme/styles/themes/library/style/default.css +1 -0
- package/theme/styles/themes/library/style/sharp.css +1 -0
- package/theme/styles/themes/library/style/soft.css +1 -0
- package/types/ojiepermana-angular-brand-etos.d.ts +73 -0
- package/types/ojiepermana-angular-etos.d.ts +1 -0
- package/types/ojiepermana-angular-layout.d.ts +3 -2
- package/types/ojiepermana-angular-navigation.d.ts +2 -1
- /package/{theme/styles/themes/brand/etos → brand/etos/styles}/color.css +0 -0
package/.npmignore
ADDED
package/README.md
CHANGED
|
@@ -33,6 +33,42 @@ If you install the package with `npm install`, `bun add`, `pnpm add`, or `yarn
|
|
|
33
33
|
add` directly, peer dependency installation falls back to the package
|
|
34
34
|
manager's own behavior.
|
|
35
35
|
|
|
36
|
+
## SDK generator in a consumer workspace
|
|
37
|
+
|
|
38
|
+
After `@ojiepermana/angular` is installed, a consumer workspace can scaffold an
|
|
39
|
+
SDK config file under `config/sdk.config.json` and generate an Angular SDK directly from the published
|
|
40
|
+
schematics:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
ng generate @ojiepermana/angular:sdk-init
|
|
44
|
+
# edit config/sdk.config.json
|
|
45
|
+
ng generate @ojiepermana/angular:sdk
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The main consumer flow is: create `config/sdk.config.json`, adjust the OpenAPI
|
|
49
|
+
input and output target, then run the SDK generator.
|
|
50
|
+
|
|
51
|
+
If you want short script aliases in the consumer app's `package.json`, add:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"scripts": {
|
|
56
|
+
"gen:sdk:init": "ng generate @ojiepermana/angular:sdk-init",
|
|
57
|
+
"gen:sdk": "ng generate @ojiepermana/angular:sdk"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Consumers do not need a `gen:sdk:build` step because the npm package already
|
|
63
|
+
ships the compiled schematic runtime.
|
|
64
|
+
|
|
65
|
+
Common follow-up options:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
ng generate @ojiepermana/angular:sdk-init --path=config/my-sdk.config.json
|
|
69
|
+
ng generate @ojiepermana/angular:sdk --config=config/my-sdk.config.json --dry-run
|
|
70
|
+
```
|
|
71
|
+
|
|
36
72
|
## Code scaffolding
|
|
37
73
|
|
|
38
74
|
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Etos Brand
|
|
2
|
+
|
|
3
|
+
Etos is isolated as a brand umbrella entrypoint under `projects/angular/brand/etos`.
|
|
4
|
+
|
|
5
|
+
Use this folder for Etos-specific implementation:
|
|
6
|
+
|
|
7
|
+
- `core/` contains Etos provider composition and brand defaults.
|
|
8
|
+
- `themes/` contains Etos color, style, layout, and component-facing CSS.
|
|
9
|
+
- `layouts/` contains Etos shell components.
|
|
10
|
+
- `navigation/`, `components/`, `assets/`, and `docs/` can be added when Etos needs brand-specific behavior beyond shared primitives.
|
|
11
|
+
|
|
12
|
+
Shared services, types, and primitives stay in the generic libraries:
|
|
13
|
+
|
|
14
|
+
- `@ojiepermana/angular/theme`
|
|
15
|
+
- `@ojiepermana/angular/layout`
|
|
16
|
+
- `@ojiepermana/angular/navigation`
|
|
17
|
+
|
|
18
|
+
## Package usage
|
|
19
|
+
|
|
20
|
+
Published consumers should import Etos through the short public entrypoint:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { type EtosBrandOptions, EtosLayoutComponent, provideEtosBrand } from '@ojiepermana/angular/etos';
|
|
24
|
+
|
|
25
|
+
export const etosBrandConfig = {
|
|
26
|
+
theme: { mode: 'light' },
|
|
27
|
+
layout: { mode: 'vertical' },
|
|
28
|
+
} satisfies EtosBrandOptions;
|
|
29
|
+
|
|
30
|
+
export const appConfig = {
|
|
31
|
+
providers: [provideEtosBrand(etosBrandConfig)],
|
|
32
|
+
};
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
@Component({
|
|
37
|
+
imports: [EtosLayoutComponent],
|
|
38
|
+
template: `<etos-layout />`,
|
|
39
|
+
})
|
|
40
|
+
export class Pages {}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
App CSS should import the Etos package stylesheet before Tailwind:
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
@import '@ojiepermana/angular/etos/styles';
|
|
47
|
+
@import 'tailwindcss';
|
|
48
|
+
@import '@ojiepermana/angular/theme/tailwind/theme.css';
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Workspace usage in this repository
|
|
52
|
+
|
|
53
|
+
The Etos demo under `projects/demo/etos` already uses the short TypeScript entrypoint:
|
|
54
|
+
|
|
55
|
+
- `src/app/app.config.ts` imports `provideEtosBrand` from `@ojiepermana/angular/etos`.
|
|
56
|
+
- `src/pages/pages.ts` imports `EtosLayoutComponent` from `@ojiepermana/angular/etos`.
|
|
57
|
+
|
|
58
|
+
For CSS, the workspace demo currently imports the Etos source stylesheet directly:
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
@import '../../../angular/brand/etos/themes/index.css';
|
|
62
|
+
@import 'tailwindcss';
|
|
63
|
+
@import '@ojiepermana/angular/theme/tailwind/theme.css';
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
That local CSS path is intentional while developing inside this monorepo. Angular resolves bare CSS package imports from `node_modules/@ojiepermana/angular`, while TypeScript imports in the demo resolve through `tsconfig.json` path aliases. After the package is built, published, and installed with the latest exports, consumers should use `@ojiepermana/angular/etos/styles`.
|
|
67
|
+
|
|
68
|
+
The older `@ojiepermana/angular/theme/styles/etos.css` path is kept only as a compatibility shim.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ojiepermana/angular/etos — complete Etos brand stylesheet.
|
|
3
|
+
*
|
|
4
|
+
* Import before Tailwind, then import the shared Tailwind token bridge.
|
|
5
|
+
*/
|
|
6
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_layers.css';
|
|
7
|
+
@import '@ojiepermana/angular/theme/styles/themes/mode/index.css';
|
|
8
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/color/index.css';
|
|
9
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/style/index.css';
|
|
10
|
+
@import './color.css';
|
|
11
|
+
@import './style.css';
|
|
12
|
+
@import './layout.css';
|
|
13
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_tokens.css';
|
|
14
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_material-overrides.css';
|
|
15
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_components.css';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Etos brand layout layer.
|
|
3
|
+
*/
|
|
4
|
+
@layer tokens {
|
|
5
|
+
[theme-brand='etos'] {
|
|
6
|
+
--etos-layout-shell-padding: clamp(1rem, 2vw, 2rem);
|
|
7
|
+
--etos-layout-frame-radius: var(--radius-lg);
|
|
8
|
+
--etos-layout-frame-shadow: var(--shadow-sm);
|
|
9
|
+
--etos-layout-main-max-width: 80rem;
|
|
10
|
+
--etos-layout-empty-max-width: 24rem;
|
|
11
|
+
--etos-layout-empty-padding: clamp(1.5rem, 4vw, 3rem);
|
|
12
|
+
--etos-layout-topbar-inline: 0.875rem;
|
|
13
|
+
--etos-layout-brand-mark-size: 2rem;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
[data-mode='dark'][theme-brand='etos'] {
|
|
17
|
+
--etos-layout-frame-shadow: 0 0 0 1px hsl(var(--border));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@layer components {
|
|
22
|
+
.etos-layout-host {
|
|
23
|
+
display: block;
|
|
24
|
+
height: 100dvh;
|
|
25
|
+
width: 100%;
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
background: hsl(var(--background));
|
|
28
|
+
color: hsl(var(--foreground));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.etos-layout-host--fixed {
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.etos-layout-frame {
|
|
36
|
+
display: flex;
|
|
37
|
+
height: 100%;
|
|
38
|
+
width: 100%;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
background: hsl(var(--background));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.etos-layout-frame--horizontal {
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.etos-layout-main {
|
|
48
|
+
min-width: 0;
|
|
49
|
+
flex: 1 1 0%;
|
|
50
|
+
overflow: auto;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.etos-layout-main--fixed {
|
|
54
|
+
width: 100%;
|
|
55
|
+
max-width: var(--etos-layout-main-max-width);
|
|
56
|
+
margin-inline: auto;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.etos-layout-topbar {
|
|
60
|
+
width: 100%;
|
|
61
|
+
flex-shrink: 0;
|
|
62
|
+
border-bottom: var(--border-width) solid hsl(var(--border));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.etos-layout-topbar-slot {
|
|
66
|
+
display: flex;
|
|
67
|
+
min-width: 0;
|
|
68
|
+
align-items: center;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.etos-layout-topbar-slot--end {
|
|
72
|
+
justify-content: flex-end;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.etos-layout-empty-host {
|
|
76
|
+
display: flex;
|
|
77
|
+
min-height: 100dvh;
|
|
78
|
+
width: 100%;
|
|
79
|
+
align-items: center;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
padding: var(--etos-layout-empty-padding);
|
|
82
|
+
background: hsl(var(--background));
|
|
83
|
+
color: hsl(var(--foreground));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.etos-layout-empty-main {
|
|
87
|
+
width: 100%;
|
|
88
|
+
max-width: var(--etos-layout-empty-max-width);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.etos-brand-link,
|
|
92
|
+
.etos-profile-trigger {
|
|
93
|
+
display: inline-flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
gap: 0.75rem;
|
|
96
|
+
min-height: 2.5rem;
|
|
97
|
+
padding: 0.375rem 0.5rem;
|
|
98
|
+
color: hsl(var(--foreground));
|
|
99
|
+
text-decoration: none;
|
|
100
|
+
transition:
|
|
101
|
+
color 160ms ease,
|
|
102
|
+
background-color 160ms ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.etos-brand-link:focus-visible,
|
|
106
|
+
.etos-profile-trigger:focus-visible {
|
|
107
|
+
outline: 2px solid hsl(var(--ring));
|
|
108
|
+
outline-offset: 2px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.etos-brand-mark,
|
|
112
|
+
.etos-profile-mark {
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
height: var(--etos-layout-brand-mark-size);
|
|
115
|
+
width: var(--etos-layout-brand-mark-size);
|
|
116
|
+
align-items: center;
|
|
117
|
+
justify-content: center;
|
|
118
|
+
border-radius: var(--radius-md);
|
|
119
|
+
background: hsl(var(--primary));
|
|
120
|
+
color: hsl(var(--primary-foreground));
|
|
121
|
+
font-size: 0.7rem;
|
|
122
|
+
font-weight: 700;
|
|
123
|
+
letter-spacing: 0.18em;
|
|
124
|
+
line-height: 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.etos-profile-mark {
|
|
128
|
+
border-radius: 999px;
|
|
129
|
+
letter-spacing: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.etos-brand-copy {
|
|
133
|
+
display: none;
|
|
134
|
+
min-width: 0;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
gap: 0.125rem;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.etos-brand-name {
|
|
140
|
+
font-size: var(--text-sm);
|
|
141
|
+
font-weight: 700;
|
|
142
|
+
line-height: 1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.etos-brand-subtitle,
|
|
146
|
+
.etos-profile-name {
|
|
147
|
+
font-size: var(--text-xs);
|
|
148
|
+
line-height: 1;
|
|
149
|
+
color: hsl(var(--muted-foreground));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.etos-profile-name {
|
|
153
|
+
display: none;
|
|
154
|
+
font-weight: 600;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@media (min-width: 40rem) {
|
|
158
|
+
.etos-brand-copy,
|
|
159
|
+
.etos-profile-name {
|
|
160
|
+
display: flex;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@media (min-width: 64rem) {
|
|
165
|
+
.etos-layout-host--fixed {
|
|
166
|
+
padding: var(--etos-layout-shell-padding);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.etos-layout-frame--fixed {
|
|
170
|
+
border: var(--border-width) solid hsl(var(--border));
|
|
171
|
+
border-radius: var(--etos-layout-frame-radius);
|
|
172
|
+
box-shadow: var(--etos-layout-frame-shadow);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Etos
|
|
2
|
+
* Etos brand style layer.
|
|
3
3
|
*/
|
|
4
4
|
@layer tokens {
|
|
5
5
|
[theme-brand='etos'] {
|
|
6
|
-
--theme-radius-base: 0.
|
|
6
|
+
--theme-radius-base: 0.375rem;
|
|
7
7
|
--theme-radius-sm: calc(var(--theme-radius-base) - 2px);
|
|
8
8
|
--theme-radius-md: var(--theme-radius-base);
|
|
9
|
-
--theme-radius-lg: calc(var(--theme-radius-base) +
|
|
9
|
+
--theme-radius-lg: calc(var(--theme-radius-base) + 2px);
|
|
10
10
|
|
|
11
11
|
--radius: var(--theme-radius-base);
|
|
12
12
|
--radius-sm: var(--theme-radius-sm);
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
--border-width: 1px;
|
|
17
17
|
|
|
18
|
-
--theme-shadow-sm: 0 1px
|
|
19
|
-
--theme-shadow: 0
|
|
20
|
-
--theme-shadow-md: 0
|
|
21
|
-
--theme-shadow-lg: 0
|
|
18
|
+
--theme-shadow-sm: 0 1px 0 0 hsl(211 95% 12% / 0.08);
|
|
19
|
+
--theme-shadow: 0 2px 4px -2px hsl(211 95% 12% / 0.14);
|
|
20
|
+
--theme-shadow-md: 0 8px 18px -14px hsl(211 95% 12% / 0.24);
|
|
21
|
+
--theme-shadow-lg: 0 18px 36px -28px hsl(211 95% 12% / 0.34);
|
|
22
22
|
|
|
23
23
|
--shadow-sm: var(--theme-shadow-sm);
|
|
24
24
|
--shadow: var(--theme-shadow);
|
|
@@ -30,21 +30,22 @@
|
|
|
30
30
|
|
|
31
31
|
--font-sans: var(--theme-font-sans);
|
|
32
32
|
--font-mono: var(--theme-font-mono);
|
|
33
|
-
--font-weight-bold:
|
|
33
|
+
--font-weight-bold: 650;
|
|
34
34
|
--theme-text-scale: 1;
|
|
35
35
|
--nav-font-family: var(--font-sans);
|
|
36
|
-
--nav-text-size: var(--text-
|
|
37
|
-
--nav-text-line-height: var(--text-
|
|
36
|
+
--nav-text-size: var(--text-sm);
|
|
37
|
+
--nav-text-line-height: var(--text-sm--line-height);
|
|
38
38
|
--nav-heading-font-family: var(--font-sans);
|
|
39
|
-
--nav-heading-size: var(--text-
|
|
40
|
-
--nav-heading-line-height: var(--text-
|
|
41
|
-
--nav-heading-weight:
|
|
42
|
-
--nav-heading-letter-spacing: 0.
|
|
39
|
+
--nav-heading-size: var(--text-xs);
|
|
40
|
+
--nav-heading-line-height: var(--text-xs--line-height);
|
|
41
|
+
--nav-heading-weight: 700;
|
|
42
|
+
--nav-heading-letter-spacing: 0.14em;
|
|
43
43
|
--nav-badge-font-family: var(--font-sans);
|
|
44
|
-
--nav-badge-size: var(--text-
|
|
45
|
-
--nav-badge-line-height: var(--text-
|
|
46
|
-
--nav-badge-weight:
|
|
44
|
+
--nav-badge-size: var(--text-xs);
|
|
45
|
+
--nav-badge-line-height: var(--text-xs--line-height);
|
|
46
|
+
--nav-badge-weight: 600;
|
|
47
47
|
--letter-spacing: 0;
|
|
48
48
|
--space-unit: 0.25rem;
|
|
49
|
+
--layout-topbar-height: 3.25rem;
|
|
49
50
|
}
|
|
50
51
|
}
|
package/collection.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
2
|
+
"$schema": "../../node_modules/@angular-devkit/schematics/collection-schema.json",
|
|
3
|
+
"schematics": {
|
|
4
|
+
"ng-add": {
|
|
5
|
+
"description": "Add @ojiepermana/angular and its required peer dependencies to an Angular workspace.",
|
|
6
|
+
"factory": "./generator/api/bin/schematics/ng-add/index.js#ngAdd",
|
|
7
|
+
"schema": "./generator/api/schematics/ng-add/schema.json"
|
|
8
|
+
},
|
|
9
|
+
"sdk": {
|
|
10
|
+
"description": "Generate an Angular SDK from an OpenAPI spec.",
|
|
11
|
+
"factory": "./generator/api/bin/schematics/sdk/index.js#sdk",
|
|
12
|
+
"schema": "./generator/api/schematics/sdk/schema.json"
|
|
13
|
+
},
|
|
14
|
+
"sdk-init": {
|
|
15
|
+
"description": "Create config/sdk.config.json under the workspace root.",
|
|
16
|
+
"factory": "./generator/api/bin/schematics/init/index.js#init",
|
|
17
|
+
"schema": "./generator/api/schematics/init/schema.json"
|
|
18
|
+
},
|
|
19
|
+
"guide": {
|
|
20
|
+
"description": "Compile Markdown files into Angular standalone components and a nested route tree.",
|
|
21
|
+
"factory": "./generator/guide/bin/schematics/build/index.js#build",
|
|
22
|
+
"schema": "./generator/guide/schematics/build/schema.json"
|
|
23
|
+
},
|
|
24
|
+
"guide-init": {
|
|
25
|
+
"description": "Create config/guide.config.json under the workspace root.",
|
|
26
|
+
"factory": "./generator/guide/bin/schematics/init/index.js#init",
|
|
27
|
+
"schema": "./generator/guide/schematics/init/schema.json"
|
|
29
28
|
}
|
|
30
|
-
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Etos brand color layer.
|
|
3
|
+
*/
|
|
4
|
+
@layer tokens {
|
|
5
|
+
[theme-brand='etos'] {
|
|
6
|
+
--primary: 211 95% 29%;
|
|
7
|
+
--primary-foreground: 0 0% 100%;
|
|
8
|
+
--accent: 211 95% 96%;
|
|
9
|
+
--accent-foreground: 211 95% 22%;
|
|
10
|
+
--secondary: 211 24% 95%;
|
|
11
|
+
--secondary-foreground: 211 75% 24%;
|
|
12
|
+
--ring: 211 95% 29%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
[data-mode='dark'][theme-brand='etos'] {
|
|
16
|
+
--accent: 211 58% 18%;
|
|
17
|
+
--accent-foreground: 211 90% 84%;
|
|
18
|
+
--secondary: 211 24% 18%;
|
|
19
|
+
--secondary-foreground: 211 82% 84%;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ojiepermana/angular/etos — complete Etos brand stylesheet.
|
|
3
|
+
*
|
|
4
|
+
* Import before Tailwind, then import the shared Tailwind token bridge.
|
|
5
|
+
*/
|
|
6
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_layers.css';
|
|
7
|
+
@import '@ojiepermana/angular/theme/styles/themes/mode/index.css';
|
|
8
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/color/index.css';
|
|
9
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/style/index.css';
|
|
10
|
+
@import './color.css';
|
|
11
|
+
@import './style.css';
|
|
12
|
+
@import './layout.css';
|
|
13
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_tokens.css';
|
|
14
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_material-overrides.css';
|
|
15
|
+
@import '@ojiepermana/angular/theme/styles/themes/library/_components.css';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Etos brand layout layer.
|
|
3
|
+
*/
|
|
4
|
+
@layer tokens {
|
|
5
|
+
[theme-brand='etos'] {
|
|
6
|
+
--etos-layout-shell-padding: clamp(1rem, 2vw, 2rem);
|
|
7
|
+
--etos-layout-frame-radius: var(--radius-lg);
|
|
8
|
+
--etos-layout-frame-shadow: var(--shadow-sm);
|
|
9
|
+
--etos-layout-main-max-width: 80rem;
|
|
10
|
+
--etos-layout-empty-max-width: 24rem;
|
|
11
|
+
--etos-layout-empty-padding: clamp(1.5rem, 4vw, 3rem);
|
|
12
|
+
--etos-layout-topbar-inline: 0.875rem;
|
|
13
|
+
--etos-layout-brand-mark-size: 2rem;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
[data-mode='dark'][theme-brand='etos'] {
|
|
17
|
+
--etos-layout-frame-shadow: 0 0 0 1px hsl(var(--border));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@layer components {
|
|
22
|
+
.etos-layout-host {
|
|
23
|
+
display: block;
|
|
24
|
+
height: 100dvh;
|
|
25
|
+
width: 100%;
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
background: hsl(var(--background));
|
|
28
|
+
color: hsl(var(--foreground));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.etos-layout-host--fixed {
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.etos-layout-frame {
|
|
36
|
+
display: flex;
|
|
37
|
+
height: 100%;
|
|
38
|
+
width: 100%;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
background: hsl(var(--background));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.etos-layout-frame--horizontal {
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.etos-layout-main {
|
|
48
|
+
min-width: 0;
|
|
49
|
+
flex: 1 1 0%;
|
|
50
|
+
overflow: auto;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.etos-layout-main--fixed {
|
|
54
|
+
width: 100%;
|
|
55
|
+
max-width: var(--etos-layout-main-max-width);
|
|
56
|
+
margin-inline: auto;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.etos-layout-topbar {
|
|
60
|
+
width: 100%;
|
|
61
|
+
flex-shrink: 0;
|
|
62
|
+
border-bottom: var(--border-width) solid hsl(var(--border));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.etos-layout-topbar-slot {
|
|
66
|
+
display: flex;
|
|
67
|
+
min-width: 0;
|
|
68
|
+
align-items: center;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.etos-layout-topbar-slot--end {
|
|
72
|
+
justify-content: flex-end;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.etos-layout-empty-host {
|
|
76
|
+
display: flex;
|
|
77
|
+
min-height: 100dvh;
|
|
78
|
+
width: 100%;
|
|
79
|
+
align-items: center;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
padding: var(--etos-layout-empty-padding);
|
|
82
|
+
background: hsl(var(--background));
|
|
83
|
+
color: hsl(var(--foreground));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.etos-layout-empty-main {
|
|
87
|
+
width: 100%;
|
|
88
|
+
max-width: var(--etos-layout-empty-max-width);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.etos-brand-link,
|
|
92
|
+
.etos-profile-trigger {
|
|
93
|
+
display: inline-flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
gap: 0.75rem;
|
|
96
|
+
min-height: 2.5rem;
|
|
97
|
+
padding: 0.375rem 0.5rem;
|
|
98
|
+
color: hsl(var(--foreground));
|
|
99
|
+
text-decoration: none;
|
|
100
|
+
transition:
|
|
101
|
+
color 160ms ease,
|
|
102
|
+
background-color 160ms ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.etos-brand-link:focus-visible,
|
|
106
|
+
.etos-profile-trigger:focus-visible {
|
|
107
|
+
outline: 2px solid hsl(var(--ring));
|
|
108
|
+
outline-offset: 2px;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.etos-brand-mark,
|
|
112
|
+
.etos-profile-mark {
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
height: var(--etos-layout-brand-mark-size);
|
|
115
|
+
width: var(--etos-layout-brand-mark-size);
|
|
116
|
+
align-items: center;
|
|
117
|
+
justify-content: center;
|
|
118
|
+
border-radius: var(--radius-md);
|
|
119
|
+
background: hsl(var(--primary));
|
|
120
|
+
color: hsl(var(--primary-foreground));
|
|
121
|
+
font-size: 0.7rem;
|
|
122
|
+
font-weight: 700;
|
|
123
|
+
letter-spacing: 0.18em;
|
|
124
|
+
line-height: 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.etos-profile-mark {
|
|
128
|
+
border-radius: 999px;
|
|
129
|
+
letter-spacing: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.etos-brand-copy {
|
|
133
|
+
display: none;
|
|
134
|
+
min-width: 0;
|
|
135
|
+
flex-direction: column;
|
|
136
|
+
gap: 0.125rem;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.etos-brand-name {
|
|
140
|
+
font-size: var(--text-sm);
|
|
141
|
+
font-weight: 700;
|
|
142
|
+
line-height: 1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.etos-brand-subtitle,
|
|
146
|
+
.etos-profile-name {
|
|
147
|
+
font-size: var(--text-xs);
|
|
148
|
+
line-height: 1;
|
|
149
|
+
color: hsl(var(--muted-foreground));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.etos-profile-name {
|
|
153
|
+
display: none;
|
|
154
|
+
font-weight: 600;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@media (min-width: 40rem) {
|
|
158
|
+
.etos-brand-copy,
|
|
159
|
+
.etos-profile-name {
|
|
160
|
+
display: flex;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@media (min-width: 64rem) {
|
|
165
|
+
.etos-layout-host--fixed {
|
|
166
|
+
padding: var(--etos-layout-shell-padding);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.etos-layout-frame--fixed {
|
|
170
|
+
border: var(--border-width) solid hsl(var(--border));
|
|
171
|
+
border-radius: var(--etos-layout-frame-radius);
|
|
172
|
+
box-shadow: var(--etos-layout-frame-shadow);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|