@ng-zen/cli 22.3.0 → 22.4.0-next.1
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 +5 -7
- package/package.json +1 -1
- package/schematics/ui/files/badge/badge.scss +4 -3
- package/schematics/ui/files/badge/badge.spec.ts +17 -0
- package/schematics/ui/files/badge/badge.stories.ts +67 -0
- package/schematics/ui/files/badge/badge.ts +38 -1
- package/schematics/ui/files/button/button.scss +1 -1
- package/schematics/ui/files/checkbox/checkbox.scss +2 -2
- package/schematics/ui/files/checkbox/checkbox.ts +1 -1
- package/schematics/ui/files/form-control/form-control.ts +1 -1
- package/schematics/ui/files/input/input.scss +2 -1
- package/schematics/ui/files/radio/radio.scss +2 -2
- package/schematics/ui/files/radio/radio.ts +1 -1
- package/schematics/ui/files/skeleton/skeleton.scss +3 -1
- package/schematics/ui/files/switch/switch.scss +2 -1
- package/schematics/ui/files/textarea/textarea.scss +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
## [22.
|
|
1
|
+
## [22.4.0-next.1](https://github.com/kstepien3/ng-zen/compare/v22.3.0...v22.4.0-next.1) (2026-07-17)
|
|
2
2
|
|
|
3
3
|
### 🚀 New Features
|
|
4
4
|
|
|
5
|
-
* **ui/badge:** add
|
|
5
|
+
* **ui/badge:** add disabled support with styles and documentation ([#468](https://github.com/kstepien3/ng-zen/issues/468)) ([1b21055](https://github.com/kstepien3/ng-zen/commit/1b2105514e4c35495b9c1b2d2c1a0a2c3e332fb3))
|
|
6
|
+
* **ui:** centralize `disabled-opacity` variable across components ([#469](https://github.com/kstepien3/ng-zen/issues/469)) ([0af45f7](https://github.com/kstepien3/ng-zen/commit/0af45f78186aa19bb82d1e28a71dffd78c1be25b))
|
|
6
7
|
|
|
7
|
-
###
|
|
8
|
+
### 🐛 Bug Fixes
|
|
8
9
|
|
|
9
|
-
*
|
|
10
|
-
* **README:** emphasize @ng-zen/cli ([#456](https://github.com/kstepien3/ng-zen/issues/456)) ([6306d4e](https://github.com/kstepien3/ng-zen/commit/6306d4efb5fef1b9a2de8790b4dc149e5069a5dd))
|
|
11
|
-
* **README:** simplify content structure and highlight key features ([#457](https://github.com/kstepien3/ng-zen/issues/457)) ([6ff7d4d](https://github.com/kstepien3/ng-zen/commit/6ff7d4d296b5be3bd86fcc44193028afcfe25dd7))
|
|
12
|
-
* **ui/card:** integrate zen-input in card stories ([#453](https://github.com/kstepien3/ng-zen/issues/453)) ([42d03b8](https://github.com/kstepien3/ng-zen/commit/42d03b842415eaa57ca3f199474820f6cc9756bd))
|
|
10
|
+
* **ui/form-control:** use 'focusout' for touch event ([#464](https://github.com/kstepien3/ng-zen/issues/464)) ([d2859a6](https://github.com/kstepien3/ng-zen/commit/d2859a6e09b7d9e4f70087aa78d3a7c38c357af3))
|
|
13
11
|
|
|
14
12
|
Development mode - changelog will be generated during build.
|
package/package.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
$transition-duration: var(--zen-transition-duration, 0.2s);
|
|
4
4
|
$outline: var(--zen-outline, 2px solid hsl(200deg 100% 50% / 50%));
|
|
5
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
5
6
|
|
|
6
7
|
:host {
|
|
7
|
-
--zen-badge-shadow: 0 1px 2px hsl(0deg 0% 0% / 8%);
|
|
8
8
|
--zen-badge-neutral: var(--zen-neutral, hsl(30deg 5% 10%));
|
|
9
9
|
--zen-badge-primary: var(--zen-primary, hsl(193deg 58% 34%));
|
|
10
10
|
--zen-badge-success: var(--zen-success, hsl(142deg 38% 36%));
|
|
@@ -25,6 +25,7 @@ $colors: (
|
|
|
25
25
|
$ghost-hover-opacity: 10%;
|
|
26
26
|
$ghost-active-opacity: 20%;
|
|
27
27
|
|
|
28
|
+
/* stylelint-disable-next-line no-duplicate-selectors -- separate variables and styles */
|
|
28
29
|
:host {
|
|
29
30
|
--zen-badge-bg-color: var(--zen-badge-neutral);
|
|
30
31
|
|
|
@@ -63,8 +64,8 @@ $ghost-active-opacity: 20%;
|
|
|
63
64
|
height: 0.75rem;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
:host([disabled]) {
|
|
67
|
-
opacity:
|
|
67
|
+
:host([data-disabled]) {
|
|
68
|
+
opacity: $disabled-opacity;
|
|
68
69
|
pointer-events: none;
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -12,6 +12,23 @@ describe('ZenBadge', () => {
|
|
|
12
12
|
}).compileComponents();
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
+
describe('disabled', () => {
|
|
16
|
+
it('should not have disabled attribute by default', () => {
|
|
17
|
+
const fixture = TestBed.createComponent(ZenBadge);
|
|
18
|
+
fixture.detectChanges();
|
|
19
|
+
const badge = fixture.nativeElement as HTMLElement;
|
|
20
|
+
expect(badge.hasAttribute('disabled')).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should apply disabled attribute when set', () => {
|
|
24
|
+
const fixture = TestBed.createComponent(ZenBadge);
|
|
25
|
+
fixture.componentRef.setInput('disabled', true);
|
|
26
|
+
fixture.detectChanges();
|
|
27
|
+
const badge = fixture.nativeElement as HTMLElement;
|
|
28
|
+
expect(badge.hasAttribute('data-disabled')).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
15
32
|
it('should create', () => {
|
|
16
33
|
const fixture = TestBed.createComponent(ZenBadge);
|
|
17
34
|
const component = fixture.componentInstance;
|
|
@@ -7,6 +7,7 @@ import { ZenBadge } from './badge';
|
|
|
7
7
|
interface StoryParams {
|
|
8
8
|
color: 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';
|
|
9
9
|
variant: 'solid' | 'filled' | 'outline' | 'ghost';
|
|
10
|
+
disabled: boolean;
|
|
10
11
|
label: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
@@ -19,6 +20,7 @@ export default {
|
|
|
19
20
|
label: 'Badge',
|
|
20
21
|
color: 'neutral',
|
|
21
22
|
variant: 'solid',
|
|
23
|
+
disabled: false,
|
|
22
24
|
},
|
|
23
25
|
argTypes: {
|
|
24
26
|
label: {
|
|
@@ -38,6 +40,15 @@ export default {
|
|
|
38
40
|
control: 'select',
|
|
39
41
|
options: ['solid', 'filled', 'outline', 'ghost'],
|
|
40
42
|
},
|
|
43
|
+
disabled: {
|
|
44
|
+
control: 'boolean',
|
|
45
|
+
table: {
|
|
46
|
+
category: 'attributes',
|
|
47
|
+
type: {
|
|
48
|
+
summary: 'boolean',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
41
52
|
},
|
|
42
53
|
render: ({ label, ...args }) => ({
|
|
43
54
|
props: args,
|
|
@@ -136,3 +147,59 @@ export const AllColorVariants: Story = {
|
|
|
136
147
|
`,
|
|
137
148
|
}),
|
|
138
149
|
};
|
|
150
|
+
|
|
151
|
+
export const DisabledVariants: Story = {
|
|
152
|
+
render: () => ({
|
|
153
|
+
template: `
|
|
154
|
+
<div style="display: flex; flex-direction: column; gap: 1rem;">
|
|
155
|
+
<!-- Default (No color attribute) -->
|
|
156
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
157
|
+
<zen-badge disabled variant="solid">Solid</zen-badge>
|
|
158
|
+
<zen-badge disabled variant="filled">Filled</zen-badge>
|
|
159
|
+
<zen-badge disabled variant="outline">Outline</zen-badge>
|
|
160
|
+
<zen-badge disabled variant="ghost">Ghost</zen-badge>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<!-- Primary -->
|
|
164
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
165
|
+
<zen-badge disabled color="primary" variant="solid">Solid</zen-badge>
|
|
166
|
+
<zen-badge disabled color="primary" variant="filled">Filled</zen-badge>
|
|
167
|
+
<zen-badge disabled color="primary" variant="outline">Outline</zen-badge>
|
|
168
|
+
<zen-badge disabled color="primary" variant="ghost">Ghost</zen-badge>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<!-- Success -->
|
|
172
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
173
|
+
<zen-badge disabled color="success" variant="solid">Solid</zen-badge>
|
|
174
|
+
<zen-badge disabled color="success" variant="filled">Filled</zen-badge>
|
|
175
|
+
<zen-badge disabled color="success" variant="outline">Outline</zen-badge>
|
|
176
|
+
<zen-badge disabled color="success" variant="ghost">Ghost</zen-badge>
|
|
177
|
+
</div>
|
|
178
|
+
|
|
179
|
+
<!-- Warning -->
|
|
180
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
181
|
+
<zen-badge disabled color="warning" variant="solid">Solid</zen-badge>
|
|
182
|
+
<zen-badge disabled color="warning" variant="filled">Filled</zen-badge>
|
|
183
|
+
<zen-badge disabled color="warning" variant="outline">Outline</zen-badge>
|
|
184
|
+
<zen-badge disabled color="warning" variant="ghost">Ghost</zen-badge>
|
|
185
|
+
</div>
|
|
186
|
+
|
|
187
|
+
<!-- Danger -->
|
|
188
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
189
|
+
<zen-badge disabled color="danger" variant="solid">Solid</zen-badge>
|
|
190
|
+
<zen-badge disabled color="danger" variant="filled">Filled</zen-badge>
|
|
191
|
+
<zen-badge disabled color="danger" variant="outline">Outline</zen-badge>
|
|
192
|
+
<zen-badge disabled color="danger" variant="ghost">Ghost</zen-badge>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<!-- Info -->
|
|
196
|
+
<div style="display: flex; gap: 0.5rem;">
|
|
197
|
+
<zen-badge disabled color="info" variant="solid">Solid</zen-badge>
|
|
198
|
+
<zen-badge disabled color="info" variant="filled">Filled</zen-badge>
|
|
199
|
+
<zen-badge disabled color="info" variant="outline">Outline</zen-badge>
|
|
200
|
+
<zen-badge disabled color="info" variant="ghost">Ghost</zen-badge>
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
`,
|
|
204
|
+
}),
|
|
205
|
+
};
|
|
@@ -1,5 +1,35 @@
|
|
|
1
|
-
import { Component, input } from '@angular/core';
|
|
1
|
+
import { booleanAttribute, Component, input } from '@angular/core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* ZenBadge is a reusable badge component for displaying labels,
|
|
5
|
+
* statuses, or counts with customizable colors and variants.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <zen-badge>Default</zen-badge>
|
|
9
|
+
* <zen-badge color="primary" variant="outline">Primary</zen-badge>
|
|
10
|
+
* <zen-badge variant="filled">Filled</zen-badge>
|
|
11
|
+
* <zen-badge disabled>Disabled</zen-badge>
|
|
12
|
+
*
|
|
13
|
+
* ### CSS Custom Properties
|
|
14
|
+
*
|
|
15
|
+
* You can customize the component using CSS custom properties:
|
|
16
|
+
*
|
|
17
|
+
* ```css
|
|
18
|
+
* :root {
|
|
19
|
+
* --zen-badge-neutral: hsl(30deg 5% 10%);
|
|
20
|
+
* --zen-badge-primary: hsl(193deg 58% 34%);
|
|
21
|
+
* --zen-badge-success: hsl(142deg 38% 36%);
|
|
22
|
+
* --zen-badge-warning: hsl(36deg 72% 46%);
|
|
23
|
+
* --zen-badge-danger: hsl(348deg 52% 42%);
|
|
24
|
+
* --zen-badge-info: hsl(214deg 34% 46%);
|
|
25
|
+
* --zen-disabled-opacity: 0.6;
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @author Konrad Stępień
|
|
30
|
+
* @license {@link https://github.com/kstepien3/ng-zen/blob/master/LICENSE|BSD-2-Clause}
|
|
31
|
+
* @see [GitHub](https://github.com/kstepien3/ng-zen)
|
|
32
|
+
*/
|
|
3
33
|
@Component({
|
|
4
34
|
selector: 'zen-badge',
|
|
5
35
|
template: '<ng-content />',
|
|
@@ -7,9 +37,16 @@ import { Component, input } from '@angular/core';
|
|
|
7
37
|
host: {
|
|
8
38
|
'[attr.data-color]': 'color()',
|
|
9
39
|
'[attr.data-variant]': 'variant()',
|
|
40
|
+
'[attr.data-disabled]': 'disabled() ? "" : null',
|
|
10
41
|
},
|
|
11
42
|
})
|
|
12
43
|
export class ZenBadge {
|
|
44
|
+
/** The color theme of the badge. */
|
|
13
45
|
readonly color = input<'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info'>('neutral');
|
|
46
|
+
|
|
47
|
+
/** The visual style variant of the badge. */
|
|
14
48
|
readonly variant = input<'solid' | 'outline' | 'filled' | 'ghost'>('solid');
|
|
49
|
+
|
|
50
|
+
/** Whether the badge is disabled. When `true`, reduces opacity and disables pointer events. */
|
|
51
|
+
readonly disabled = input(false, { transform: booleanAttribute });
|
|
15
52
|
}
|
|
@@ -3,12 +3,12 @@ $error: var(--zen-error, hsl(0deg 70% 50%));
|
|
|
3
3
|
$focus-shadow: var(--zen-focus-shadow, 0 1px 4px hsl(0deg 0% 60% / 20%) inset);
|
|
4
4
|
$outline: var(--zen-outline, 2px solid hsl(200deg 100% 50% / 50%));
|
|
5
5
|
$transition-duration: var(--zen-transition-duration, 0.2s);
|
|
6
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
6
7
|
|
|
7
8
|
:host {
|
|
8
9
|
--zen-checkbox-size: 1rem;
|
|
9
10
|
--zen-checkbox-border-radius: 0.375rem; // 6px
|
|
10
11
|
--zen-checkbox-appearance: hsl(0deg 0% 10%);
|
|
11
|
-
--zen-checkbox-disabled-opacity: 0.6;
|
|
12
12
|
--zen-checkbox-border: 1px solid hsl(0deg 0% 80%);
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -50,7 +50,7 @@ input {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
&:has(input[type='checkbox']:disabled) {
|
|
53
|
-
opacity:
|
|
53
|
+
opacity: $disabled-opacity;
|
|
54
54
|
|
|
55
55
|
&,
|
|
56
56
|
input {
|
|
@@ -24,7 +24,7 @@ import { ZenFormControl } from '../form-control';
|
|
|
24
24
|
* --zen-checkbox-size: 1rem;
|
|
25
25
|
* --zen-checkbox-border-radius: 0.375rem;
|
|
26
26
|
* --zen-checkbox-appearance: hsl(0deg 0% 10%);
|
|
27
|
-
* --zen-
|
|
27
|
+
* --zen-disabled-opacity: 0.6;
|
|
28
28
|
* --zen-checkbox-border: 1px solid hsl(0deg 0% 80%);
|
|
29
29
|
* }
|
|
30
30
|
* ```
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Globals
|
|
2
2
|
$outline: var(--zen-outline, 2px solid hsl(200deg 100% 50% / 50%));
|
|
3
3
|
$error: var(--zen-error, hsl(0deg 70% 50%));
|
|
4
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
4
5
|
|
|
5
6
|
:host {
|
|
6
7
|
--zen-input-border: 1px solid hsl(0deg 0% 80%);
|
|
@@ -21,7 +22,7 @@ input {
|
|
|
21
22
|
padding: var(--zen-input-padding);
|
|
22
23
|
|
|
23
24
|
&:disabled {
|
|
24
|
-
opacity:
|
|
25
|
+
opacity: $disabled-opacity;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
&:focus-visible {
|
|
@@ -3,12 +3,12 @@ $error: var(--zen-error, hsl(0deg 70% 50%));
|
|
|
3
3
|
$focus-shadow: var(--zen-focus-shadow, 0 1px 4px hsl(0deg 0% 60% / 20%) inset);
|
|
4
4
|
$outline: var(--zen-outline, 2px solid hsl(200deg 100% 50% / 50%));
|
|
5
5
|
$transition-duration: var(--zen-transition-duration, 0.2s);
|
|
6
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
6
7
|
|
|
7
8
|
:host {
|
|
8
9
|
--zen-radio-size: 1rem;
|
|
9
10
|
--zen-radio-border-radius: 50%;
|
|
10
11
|
--zen-radio-appearance: hsl(0deg 0% 10%);
|
|
11
|
-
--zen-radio-disabled-opacity: 0.6;
|
|
12
12
|
--zen-radio-border: 1px solid hsl(0deg 0% 80%);
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -47,7 +47,7 @@ input {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
&:has(input[type='radio']:disabled) {
|
|
50
|
-
opacity:
|
|
50
|
+
opacity: $disabled-opacity;
|
|
51
51
|
|
|
52
52
|
&,
|
|
53
53
|
input {
|
|
@@ -25,7 +25,7 @@ import { ZenRadioRegistry } from './radio.registry';
|
|
|
25
25
|
* --zen-radio-size: 1rem;
|
|
26
26
|
* --zen-radio-border-radius: 50%;
|
|
27
27
|
* --zen-radio-appearance: hsl(0deg 0% 10%);
|
|
28
|
-
* --zen-
|
|
28
|
+
* --zen-disabled-opacity: 0.6;
|
|
29
29
|
* --zen-radio-border: 1px solid hsl(0deg 0% 80%);
|
|
30
30
|
* }
|
|
31
31
|
* ```
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
--zen-skeleton-animation-duration: 1.6s;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
8
|
+
|
|
7
9
|
/* stylelint-disable-next-line no-duplicate-selectors -- separate variables and styles */
|
|
8
10
|
:host {
|
|
9
11
|
background: var(--zen-skeleton-background);
|
|
@@ -55,7 +57,7 @@
|
|
|
55
57
|
|
|
56
58
|
@keyframes pulse {
|
|
57
59
|
0% {
|
|
58
|
-
opacity:
|
|
60
|
+
opacity: $disabled-opacity;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
100% {
|
|
@@ -4,6 +4,7 @@ $transition-duration: var(--zen-transition-duration-quick, 0.1s);
|
|
|
4
4
|
$placeholder-color: var(--zen-placeholder-color, hsl(0deg 0% 60%));
|
|
5
5
|
$focus-shadow: var(--zen-focus-shadow, 0 1px 4px hsl(0deg 0% 60% / 20%) inset);
|
|
6
6
|
$appearance: var(--zen-appearance, hsl(0deg 0% 10%));
|
|
7
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
7
8
|
|
|
8
9
|
:host {
|
|
9
10
|
--zen-switch-thumb-size: 1rem;
|
|
@@ -73,7 +74,7 @@ $appearance: var(--zen-appearance, hsl(0deg 0% 10%));
|
|
|
73
74
|
|
|
74
75
|
&[data-disabled='true'] {
|
|
75
76
|
cursor: not-allowed;
|
|
76
|
-
opacity:
|
|
77
|
+
opacity: $disabled-opacity;
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
&:active:not([data-disabled='true']) .thumb {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
$focus-shadow: var(--zen-focus-shadow, 0 1px 4px hsl(0deg 0% 60% / 20%) inset);
|
|
3
3
|
$outline: var(--zen-outline, 2px solid hsl(200deg 100% 50% / 50%));
|
|
4
4
|
$error: var(--zen-error, hsl(0deg 70% 50%));
|
|
5
|
+
$disabled-opacity: var(--zen-disabled-opacity, 0.6);
|
|
5
6
|
|
|
6
7
|
:host {
|
|
7
8
|
--zen-textarea-border: var(--zen-input-border, 1px solid hsl(0deg 0% 80%));
|
|
@@ -22,7 +23,7 @@ $error: var(--zen-error, hsl(0deg 70% 50%));
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
&:disabled {
|
|
25
|
-
opacity:
|
|
26
|
+
opacity: $disabled-opacity;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
&:focus-visible {
|