@ng-brutalism/ui 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/README.md +52 -28
- package/fesm2022/ng-brutalism-ui.mjs +2687 -70
- package/fesm2022/ng-brutalism-ui.mjs.map +1 -1
- package/package.json +5 -2
- package/styles.css +106 -2
- package/theme.css +11 -0
- package/types/ng-brutalism-ui.d.ts +919 -145
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-brutalism/ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Neo-brutalist Angular UI library
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Neo-brutalist Angular UI primitive library and composition system with directive APIs, signals, zoneless-friendly patterns, and Tailwind v4. Install: ng add @ng-brutalism/ui",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Khang Tran <khangtrann8198@gmail.com>",
|
|
7
7
|
"repository": {
|
|
@@ -24,9 +24,12 @@
|
|
|
24
24
|
"angular",
|
|
25
25
|
"angular-ui",
|
|
26
26
|
"angular-components",
|
|
27
|
+
"angular-primitives",
|
|
28
|
+
"angular-composition",
|
|
27
29
|
"angular-brutalism",
|
|
28
30
|
"ui-library",
|
|
29
31
|
"component-library",
|
|
32
|
+
"primitive-library",
|
|
30
33
|
"design-system",
|
|
31
34
|
"tailwindcss",
|
|
32
35
|
"signals",
|
package/styles.css
CHANGED
|
@@ -24,6 +24,10 @@ body {
|
|
|
24
24
|
utility regardless of specificity. */
|
|
25
25
|
|
|
26
26
|
@layer base {
|
|
27
|
+
:where([data-nb-reset-margin]) {
|
|
28
|
+
margin: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
27
31
|
:where([data-slot="dialog-title"]) {
|
|
28
32
|
display: block;
|
|
29
33
|
padding: 1.5rem 1.5rem 0.5rem;
|
|
@@ -32,10 +36,10 @@ body {
|
|
|
32
36
|
line-height: 1;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
:where([data-nb-title])::after {
|
|
39
|
+
:where([data-nb-title][data-underline])::after {
|
|
36
40
|
content: "";
|
|
37
41
|
display: block;
|
|
38
|
-
width: var(--nb-title-wave-width, min(
|
|
42
|
+
width: var(--nb-title-wave-width, min(9rem, 100%));
|
|
39
43
|
height: var(--nb-title-wave-height, 0.625rem);
|
|
40
44
|
margin-top: var(--nb-title-wave-gap, 0);
|
|
41
45
|
background-color: var(--nb-title-wave-color, #a78bfa);
|
|
@@ -45,6 +49,43 @@ body {
|
|
|
45
49
|
center / 100% 100% no-repeat;
|
|
46
50
|
}
|
|
47
51
|
|
|
52
|
+
/* Built-in accent underline for nbDisplay / nbText (underline="bar" | "wave").
|
|
53
|
+
Drawn as an ::after so it stays out of the accessibility tree. Shape, size,
|
|
54
|
+
gap and color are all token-driven public API. */
|
|
55
|
+
:where([data-nb-display][data-underline], [data-nb-text][data-underline]) {
|
|
56
|
+
/* Column flex so the underline sits beneath the text and stays left-aligned,
|
|
57
|
+
regardless of any inherited text-align or shrink-to-fit width. Align to
|
|
58
|
+
start so percentage underline widths are based on the text box instead of
|
|
59
|
+
a stretched flex parent. */
|
|
60
|
+
display: inline-flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
align-items: flex-start;
|
|
63
|
+
align-self: flex-start;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
:where([data-nb-display][data-underline="bar"], [data-nb-text][data-underline="bar"])::after {
|
|
67
|
+
content: "";
|
|
68
|
+
display: block;
|
|
69
|
+
width: var(--nb-underline-width, 7rem);
|
|
70
|
+
height: var(--nb-underline-height, 0.375rem);
|
|
71
|
+
margin-top: var(--nb-underline-gap, 0.75rem);
|
|
72
|
+
border-radius: var(--nb-underline-radius, 9999px);
|
|
73
|
+
background-color: var(--nb-underline-color, var(--nb-pink));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
:where([data-nb-display][data-underline="wave"], [data-nb-text][data-underline="wave"])::after {
|
|
77
|
+
content: "";
|
|
78
|
+
display: block;
|
|
79
|
+
width: var(--nb-underline-width, min(18rem, 100%));
|
|
80
|
+
height: var(--nb-underline-height, 0.625rem);
|
|
81
|
+
margin-top: var(--nb-underline-gap, 0.5rem);
|
|
82
|
+
background-color: var(--nb-underline-color, var(--nb-pink));
|
|
83
|
+
-webkit-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 220 12' preserveAspectRatio='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0,6 Q10,0 20,6 T40,6 T60,6 T80,6 T100,6 T120,6 T140,6 T160,6 T180,6 T200,6 T220,6' fill='none' stroke='black' stroke-width='6' stroke-linecap='round'/%3E%3C/svg%3E")
|
|
84
|
+
center / 100% 100% no-repeat;
|
|
85
|
+
mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 220 12' preserveAspectRatio='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0,6 Q10,0 20,6 T40,6 T60,6 T80,6 T100,6 T120,6 T140,6 T160,6 T180,6 T200,6 T220,6' fill='none' stroke='black' stroke-width='6' stroke-linecap='round'/%3E%3C/svg%3E")
|
|
86
|
+
center / 100% 100% no-repeat;
|
|
87
|
+
}
|
|
88
|
+
|
|
48
89
|
:where([data-slot="dialog-description"]) {
|
|
49
90
|
display: block;
|
|
50
91
|
padding: 0 1.5rem 1rem;
|
|
@@ -140,6 +181,69 @@ body {
|
|
|
140
181
|
}
|
|
141
182
|
}
|
|
142
183
|
|
|
184
|
+
@layer components {
|
|
185
|
+
:where([data-nb-title]) {
|
|
186
|
+
display: inline-flex;
|
|
187
|
+
flex-direction: column;
|
|
188
|
+
align-items: flex-start;
|
|
189
|
+
align-self: flex-start;
|
|
190
|
+
max-width: 100%;
|
|
191
|
+
font-size: var(--nb-title-font-size, 1.75rem);
|
|
192
|
+
font-weight: var(--nb-title-font-weight, 900);
|
|
193
|
+
line-height: var(--nb-title-line-height, 1.05);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
:where(.nb-radius) {
|
|
197
|
+
border-radius: var(--nb-radius-token, var(--_nb-radius-default));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
:where(.nb-tone) {
|
|
201
|
+
background-color: var(
|
|
202
|
+
--_nb-tone-bg-token,
|
|
203
|
+
var(--_nb-tone-bg-default)
|
|
204
|
+
);
|
|
205
|
+
color: var(--_nb-tone-fg-token, var(--_nb-tone-fg-default));
|
|
206
|
+
border-color: var(
|
|
207
|
+
--_nb-tone-border-color-token,
|
|
208
|
+
var(--_nb-tone-border-color-default)
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
:where(.nb-shadow) {
|
|
213
|
+
box-shadow: var(--nb-shadow-token, var(--_nb-shadow-default));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
:where(.nb-padding) {
|
|
217
|
+
padding: var(--nb-padding-token, var(--_nb-padding-default));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
:where(.nb-gap) {
|
|
221
|
+
gap: var(--_nb-gap-resolved, var(--_nb-gap-default));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
:where(.nb-border-width) {
|
|
225
|
+
border-width: var(
|
|
226
|
+
--nb-border-width-token,
|
|
227
|
+
var(--_nb-border-width-default)
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
:where(.nb-radius [data-nb-dialog]) {
|
|
232
|
+
border-radius: var(--nb-radius-token, var(--_nb-radius-default));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
:where(.nb-shadow [data-nb-dialog]) {
|
|
236
|
+
box-shadow: var(--nb-shadow-token, var(--_nb-shadow-default));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
:where(.nb-border-width [data-nb-dialog]) {
|
|
240
|
+
border-width: var(
|
|
241
|
+
--nb-border-width-token,
|
|
242
|
+
var(--_nb-border-width-default)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
143
247
|
/* Focus visible utility class */
|
|
144
248
|
.nb-focus-visible:focus-visible {
|
|
145
249
|
outline: var(--nb-focus-ring);
|
package/theme.css
CHANGED
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
--nb-surface-foreground: #000000;
|
|
12
12
|
--nb-secondary-background: oklch(96% 0 0);
|
|
13
13
|
--nb-field-bg: #faf3d6;
|
|
14
|
+
--nb-yellow: #ffd24a;
|
|
15
|
+
--nb-pink: #ff7eb6;
|
|
16
|
+
--nb-mint: #9bf2cf;
|
|
17
|
+
--nb-lavender: #b8a4ff;
|
|
18
|
+
--nb-blue: #8ae9ff;
|
|
19
|
+
--nb-cream: #faf6f0;
|
|
14
20
|
|
|
15
21
|
--nb-primary: #ff90e8;
|
|
16
22
|
--nb-primary-foreground: #000000;
|
|
@@ -41,6 +47,11 @@
|
|
|
41
47
|
/* Typography */
|
|
42
48
|
--nb-font-sans: system-ui, sans-serif;
|
|
43
49
|
--nb-font-mono: monospace;
|
|
50
|
+
/* Font roles — resolved by nbTypography / nbSurface[typography]. Override any
|
|
51
|
+
role to retheme its primitives without touching templates. */
|
|
52
|
+
--nb-font-body: var(--nb-font-sans);
|
|
53
|
+
--nb-font-display: var(--nb-font-sans);
|
|
54
|
+
--nb-font-accent: var(--nb-font-sans);
|
|
44
55
|
--nb-font-weight-normal: 500;
|
|
45
56
|
--nb-font-weight-bold: 700;
|
|
46
57
|
|