@cdevhub/ngx-tw 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/LICENSE +21 -0
- package/README.md +134 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
- package/package.json +265 -0
- package/theme/_base.css +394 -0
- package/theme/_dark.css +510 -0
- package/theme/_high-contrast.css +290 -0
- package/theme/_semantic.css +317 -0
- package/theme/_typography.css +9 -0
- package/theme/index.css +54 -0
- package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
- package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
- package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
- package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
- package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
- package/types/cdevhub-ngx-tw-button.d.ts +74 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
- package/types/cdevhub-ngx-tw-card.d.ts +48 -0
- package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
- package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
- package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
- package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
- package/types/cdevhub-ngx-tw-core.d.ts +719 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
- package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
- package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
- package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
- package/types/cdevhub-ngx-tw-input.d.ts +110 -0
- package/types/cdevhub-ngx-tw-item.d.ts +70 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
- package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
- package/types/cdevhub-ngx-tw-select.d.ts +384 -0
- package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
- package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
- package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
- package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
- package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
- package/types/cdevhub-ngx-tw-split.d.ts +265 -0
- package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
- package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
- package/types/cdevhub-ngx-tw-table.d.ts +479 -0
- package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
- package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
- package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
- package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
- package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
- package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
- package/types/cdevhub-ngx-tw.d.ts +49 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, contentChild, computed, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
|
|
3
|
+
import { tv } from 'tailwind-variants';
|
|
4
|
+
import { AvatarComponent } from '@cdevhub/ngx-tw/avatar';
|
|
5
|
+
import { IconComponent } from '@cdevhub/ngx-tw/icon';
|
|
6
|
+
|
|
7
|
+
const badgeVariants = tv({
|
|
8
|
+
slots: {
|
|
9
|
+
root: 'inline-flex items-center font-medium w-fit',
|
|
10
|
+
content: 'inline-flex items-center',
|
|
11
|
+
dismiss: 'inline-flex items-center justify-center rounded-md cursor-pointer hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',
|
|
12
|
+
dismissIcon: 'shrink-0',
|
|
13
|
+
leadingAvatar: 'inline-flex shrink-0 rounded-full overflow-hidden [&>tw-avatar]:size-full',
|
|
14
|
+
leadingIcon: 'inline-flex shrink-0 [&>tw-icon]:size-full',
|
|
15
|
+
},
|
|
16
|
+
variants: {
|
|
17
|
+
variant: {
|
|
18
|
+
solid: { root: '' },
|
|
19
|
+
outline: { root: 'border' },
|
|
20
|
+
soft: { root: '' },
|
|
21
|
+
},
|
|
22
|
+
color: {
|
|
23
|
+
primary: {},
|
|
24
|
+
secondary: {},
|
|
25
|
+
accent: {},
|
|
26
|
+
neutral: {},
|
|
27
|
+
info: {},
|
|
28
|
+
success: {},
|
|
29
|
+
warning: {},
|
|
30
|
+
error: {},
|
|
31
|
+
},
|
|
32
|
+
size: {
|
|
33
|
+
xs: {
|
|
34
|
+
root: 'px-1.5 py-0.5 text-xs gap-1',
|
|
35
|
+
// size-6 (24px) meets WCAG 2.5.8 target-size; negative margins keep
|
|
36
|
+
// the visible badge box centred without inflating its layout height.
|
|
37
|
+
dismiss: 'size-6 -my-1 -mr-1',
|
|
38
|
+
dismissIcon: 'size-3',
|
|
39
|
+
leadingAvatar: 'size-4',
|
|
40
|
+
leadingIcon: 'size-3',
|
|
41
|
+
},
|
|
42
|
+
sm: {
|
|
43
|
+
root: 'px-2 py-0.5 text-xs gap-1',
|
|
44
|
+
dismiss: 'size-6 -my-1 -mr-1',
|
|
45
|
+
dismissIcon: 'size-3',
|
|
46
|
+
leadingAvatar: 'size-4',
|
|
47
|
+
leadingIcon: 'size-3',
|
|
48
|
+
},
|
|
49
|
+
md: {
|
|
50
|
+
root: 'px-2 py-1 text-xs gap-1.5',
|
|
51
|
+
// size-7 (28px) keeps the dismiss target comfortable at md density;
|
|
52
|
+
// negative margins absorb the overflow so the badge height is unchanged.
|
|
53
|
+
dismiss: 'size-7 -my-1.5 -mr-1.5',
|
|
54
|
+
// size-3.5 (14px) half-step: sits between the size-3 used at xs/sm and
|
|
55
|
+
// the size-4 used at lg/xl, balancing the X glyph against text-xs at
|
|
56
|
+
// md density without dominating the dismiss button.
|
|
57
|
+
dismissIcon: 'size-3.5',
|
|
58
|
+
leadingAvatar: 'size-5',
|
|
59
|
+
// size-3.5 (14px) half-step: the md badge sits between xs/sm (size-3
|
|
60
|
+
// leading icon, text-xs) and lg/xl (size-4, text-sm); 14px is the
|
|
61
|
+
// visual mid-point that lines up with text-xs at this density.
|
|
62
|
+
leadingIcon: 'size-3.5',
|
|
63
|
+
},
|
|
64
|
+
lg: {
|
|
65
|
+
root: 'px-3 py-1.5 text-sm gap-1.5',
|
|
66
|
+
dismiss: 'size-8 -my-1.5 -mr-1.5',
|
|
67
|
+
dismissIcon: 'size-4',
|
|
68
|
+
leadingAvatar: 'size-5',
|
|
69
|
+
leadingIcon: 'size-4',
|
|
70
|
+
},
|
|
71
|
+
xl: {
|
|
72
|
+
root: 'px-3 py-1.5 text-sm gap-1.5',
|
|
73
|
+
dismiss: 'size-8 -my-1.5 -mr-1.5',
|
|
74
|
+
dismissIcon: 'size-4',
|
|
75
|
+
leadingAvatar: 'size-6',
|
|
76
|
+
leadingIcon: 'size-4',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
pill: {
|
|
80
|
+
true: { root: 'rounded-full' },
|
|
81
|
+
false: { root: 'rounded-md' },
|
|
82
|
+
},
|
|
83
|
+
hasAvatar: {
|
|
84
|
+
true: {},
|
|
85
|
+
false: {},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
compoundVariants: [
|
|
89
|
+
// ===== Primary =====
|
|
90
|
+
{ variant: 'solid', color: 'primary', class: { root: 'bg-primary-600 text-on-primary' } },
|
|
91
|
+
{ variant: 'outline', color: 'primary', class: { root: 'border-primary-300 text-primary-700' } },
|
|
92
|
+
{ variant: 'soft', color: 'primary', class: { root: 'bg-primary-50 text-primary-800' } },
|
|
93
|
+
// ===== Secondary =====
|
|
94
|
+
{ variant: 'solid', color: 'secondary', class: { root: 'bg-secondary-600 text-on-secondary' } },
|
|
95
|
+
{ variant: 'outline', color: 'secondary', class: { root: 'border-secondary-300 text-secondary-700' } },
|
|
96
|
+
{ variant: 'soft', color: 'secondary', class: { root: 'bg-secondary-50 text-secondary-800' } },
|
|
97
|
+
// ===== Accent =====
|
|
98
|
+
{ variant: 'solid', color: 'accent', class: { root: 'bg-accent-600 text-on-accent' } },
|
|
99
|
+
{ variant: 'outline', color: 'accent', class: { root: 'border-accent-300 text-accent-700' } },
|
|
100
|
+
{ variant: 'soft', color: 'accent', class: { root: 'bg-accent-50 text-accent-800' } },
|
|
101
|
+
// ===== Neutral ===== (surface/fg tokens auto-adapt to dark mode)
|
|
102
|
+
{ variant: 'solid', color: 'neutral', class: { root: 'bg-surface-muted text-fg' } },
|
|
103
|
+
{ variant: 'outline', color: 'neutral', class: { root: 'border-border text-fg' } },
|
|
104
|
+
{ variant: 'soft', color: 'neutral', class: { root: 'bg-surface-muted text-fg-muted' } },
|
|
105
|
+
// ===== Info =====
|
|
106
|
+
{ variant: 'solid', color: 'info', class: { root: 'bg-info-600 text-on-info' } },
|
|
107
|
+
{ variant: 'outline', color: 'info', class: { root: 'border-info-300 text-info-700' } },
|
|
108
|
+
{ variant: 'soft', color: 'info', class: { root: 'bg-info-50 text-info-800' } },
|
|
109
|
+
// ===== Success =====
|
|
110
|
+
{ variant: 'solid', color: 'success', class: { root: 'bg-success-600 text-on-success' } },
|
|
111
|
+
{ variant: 'outline', color: 'success', class: { root: 'border-success-300 text-success-700' } },
|
|
112
|
+
{ variant: 'soft', color: 'success', class: { root: 'bg-success-50 text-success-800' } },
|
|
113
|
+
// ===== Warning =====
|
|
114
|
+
{ variant: 'solid', color: 'warning', class: { root: 'bg-warning-500 text-on-warning' } },
|
|
115
|
+
{ variant: 'outline', color: 'warning', class: { root: 'border-warning-300 text-warning-700' } },
|
|
116
|
+
{ variant: 'soft', color: 'warning', class: { root: 'bg-warning-50 text-warning-800' } },
|
|
117
|
+
// ===== Error =====
|
|
118
|
+
{ variant: 'solid', color: 'error', class: { root: 'bg-error-600 text-on-error' } },
|
|
119
|
+
{ variant: 'outline', color: 'error', class: { root: 'border-error-300 text-error-700' } },
|
|
120
|
+
{ variant: 'soft', color: 'error', class: { root: 'bg-error-50 text-error-800' } },
|
|
121
|
+
// ===== Reduced left padding when avatar is present =====
|
|
122
|
+
{ hasAvatar: true, size: 'xs', class: { root: 'pl-0.5' } },
|
|
123
|
+
{ hasAvatar: true, size: 'sm', class: { root: 'pl-1' } },
|
|
124
|
+
{ hasAvatar: true, size: 'md', class: { root: 'pl-1' } },
|
|
125
|
+
{ hasAvatar: true, size: 'lg', class: { root: 'pl-1.5' } },
|
|
126
|
+
{ hasAvatar: true, size: 'xl', class: { root: 'pl-1.5' } },
|
|
127
|
+
],
|
|
128
|
+
defaultVariants: {
|
|
129
|
+
variant: 'soft',
|
|
130
|
+
color: 'neutral',
|
|
131
|
+
size: 'md',
|
|
132
|
+
pill: false,
|
|
133
|
+
hasAvatar: false,
|
|
134
|
+
},
|
|
135
|
+
}, {
|
|
136
|
+
twMerge: true,
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* Compact status label, tag, or count attached to any host element.
|
|
140
|
+
*
|
|
141
|
+
* Uses an attribute selector (`[twBadge]`) rather than the library's canonical
|
|
142
|
+
* element selector so consumers can apply the badge styling to any inline
|
|
143
|
+
* element — `<span>`, `<a>`, `<div>` — without an extra wrapper. The trade-off
|
|
144
|
+
* is intentional: badges most often live inside an existing text flow or list
|
|
145
|
+
* item where wrapping in a `<tw-badge>` element would add structural noise.
|
|
146
|
+
*
|
|
147
|
+
* For dot-only presence indicators (no text, no padding), use the sibling
|
|
148
|
+
* `[twBadgeDot]` directive — its rendering shape (no children, no dismiss,
|
|
149
|
+
* no leading slot) is structurally distinct from the labelled badge.
|
|
150
|
+
*/
|
|
151
|
+
class BadgeComponent {
|
|
152
|
+
/** Sets the semantic color palette. Defaults to `'neutral'`. */
|
|
153
|
+
color = input('neutral', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
154
|
+
/** Controls the visual style. Defaults to `'soft'`. */
|
|
155
|
+
variant = input('soft', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
156
|
+
/** Controls badge size (padding, font, icon size). Defaults to `'md'`. */
|
|
157
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
158
|
+
/** When true, uses fully rounded corners instead of default `rounded-md`. Defaults to `false`. */
|
|
159
|
+
pill = input(false, ...(ngDevMode ? [{ debugName: "pill" }] : /* istanbul ignore next */ []));
|
|
160
|
+
/** When true, renders a dismiss button inside the badge. Defaults to `false`. */
|
|
161
|
+
dismissible = input(false, ...(ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []));
|
|
162
|
+
/**
|
|
163
|
+
* When true, exposes the badge as an ARIA live region (`role="status"`)
|
|
164
|
+
* so assistive technology announces content changes. Defaults to `false`
|
|
165
|
+
* because most badges are decorative tags or labels — opt in only when
|
|
166
|
+
* the badge represents a value that actually updates in place.
|
|
167
|
+
*/
|
|
168
|
+
live = input(false, ...(ngDevMode ? [{ debugName: "live" }] : /* istanbul ignore next */ []));
|
|
169
|
+
/** Accessible label for the dismiss button. Override for localization. Defaults to `'Dismiss'`. */
|
|
170
|
+
dismissLabel = input('Dismiss', ...(ngDevMode ? [{ debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
|
|
171
|
+
/** Fires when the dismiss button is clicked. */
|
|
172
|
+
dismissed = output();
|
|
173
|
+
/** @internal */
|
|
174
|
+
avatarChild = contentChild(AvatarComponent, ...(ngDevMode ? [{ debugName: "avatarChild" }] : /* istanbul ignore next */ []));
|
|
175
|
+
/** @internal */
|
|
176
|
+
iconChild = contentChild(IconComponent, ...(ngDevMode ? [{ debugName: "iconChild" }] : /* istanbul ignore next */ []));
|
|
177
|
+
hasLeadingAvatar = computed(() => !!this.avatarChild(), ...(ngDevMode ? [{ debugName: "hasLeadingAvatar" }] : /* istanbul ignore next */ []));
|
|
178
|
+
hasLeadingIcon = computed(() => !!this.iconChild(), ...(ngDevMode ? [{ debugName: "hasLeadingIcon" }] : /* istanbul ignore next */ []));
|
|
179
|
+
variantResult = computed(() => badgeVariants({
|
|
180
|
+
variant: this.variant(),
|
|
181
|
+
color: this.color(),
|
|
182
|
+
size: this.size(),
|
|
183
|
+
pill: this.pill(),
|
|
184
|
+
hasAvatar: this.hasLeadingAvatar(),
|
|
185
|
+
}), ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
|
|
186
|
+
rootClasses = computed(() => this.variantResult().root(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
|
|
187
|
+
contentClasses = computed(() => this.variantResult().content(), ...(ngDevMode ? [{ debugName: "contentClasses" }] : /* istanbul ignore next */ []));
|
|
188
|
+
dismissClasses = computed(() => this.variantResult().dismiss(), ...(ngDevMode ? [{ debugName: "dismissClasses" }] : /* istanbul ignore next */ []));
|
|
189
|
+
dismissIconClasses = computed(() => this.variantResult().dismissIcon(), ...(ngDevMode ? [{ debugName: "dismissIconClasses" }] : /* istanbul ignore next */ []));
|
|
190
|
+
leadingAvatarClasses = computed(() => this.variantResult().leadingAvatar(), ...(ngDevMode ? [{ debugName: "leadingAvatarClasses" }] : /* istanbul ignore next */ []));
|
|
191
|
+
leadingIconClasses = computed(() => this.variantResult().leadingIcon(), ...(ngDevMode ? [{ debugName: "leadingIconClasses" }] : /* istanbul ignore next */ []));
|
|
192
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
193
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: BadgeComponent, isStandalone: true, selector: "[twBadge]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, pill: { classPropertyName: "pill", publicName: "pill", isSignal: true, isRequired: false, transformFunction: null }, dismissible: { classPropertyName: "dismissible", publicName: "dismissible", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null }, dismissLabel: { classPropertyName: "dismissLabel", publicName: "dismissLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, host: { properties: { "class": "rootClasses()", "attr.role": "live() ? \"status\" : null" } }, queries: [{ propertyName: "avatarChild", first: true, predicate: AvatarComponent, descendants: true, isSignal: true }, { propertyName: "iconChild", first: true, predicate: IconComponent, descendants: true, isSignal: true }], exportAs: ["twBadge"], ngImport: i0, template: `
|
|
194
|
+
@if (hasLeadingAvatar()) {
|
|
195
|
+
<span [class]="leadingAvatarClasses()"><ng-content select="tw-avatar" /></span>
|
|
196
|
+
}
|
|
197
|
+
@if (hasLeadingIcon() && !hasLeadingAvatar()) {
|
|
198
|
+
<span [class]="leadingIconClasses()"><ng-content select="tw-icon" /></span>
|
|
199
|
+
}
|
|
200
|
+
<span [class]="contentClasses()"><ng-content /></span>
|
|
201
|
+
@if (dismissible()) {
|
|
202
|
+
<button
|
|
203
|
+
type="button"
|
|
204
|
+
[attr.aria-label]="dismissLabel()"
|
|
205
|
+
[class]="dismissClasses()"
|
|
206
|
+
(click)="dismissed.emit()"
|
|
207
|
+
>
|
|
208
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" [class]="dismissIconClasses()">
|
|
209
|
+
<path d="M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z"/>
|
|
210
|
+
</svg>
|
|
211
|
+
</button>
|
|
212
|
+
}
|
|
213
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
214
|
+
}
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BadgeComponent, decorators: [{
|
|
216
|
+
type: Component,
|
|
217
|
+
args: [{
|
|
218
|
+
selector: '[twBadge]',
|
|
219
|
+
exportAs: 'twBadge',
|
|
220
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
221
|
+
host: {
|
|
222
|
+
'[class]': 'rootClasses()',
|
|
223
|
+
'[attr.role]': 'live() ? "status" : null',
|
|
224
|
+
},
|
|
225
|
+
template: `
|
|
226
|
+
@if (hasLeadingAvatar()) {
|
|
227
|
+
<span [class]="leadingAvatarClasses()"><ng-content select="tw-avatar" /></span>
|
|
228
|
+
}
|
|
229
|
+
@if (hasLeadingIcon() && !hasLeadingAvatar()) {
|
|
230
|
+
<span [class]="leadingIconClasses()"><ng-content select="tw-icon" /></span>
|
|
231
|
+
}
|
|
232
|
+
<span [class]="contentClasses()"><ng-content /></span>
|
|
233
|
+
@if (dismissible()) {
|
|
234
|
+
<button
|
|
235
|
+
type="button"
|
|
236
|
+
[attr.aria-label]="dismissLabel()"
|
|
237
|
+
[class]="dismissClasses()"
|
|
238
|
+
(click)="dismissed.emit()"
|
|
239
|
+
>
|
|
240
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" [class]="dismissIconClasses()">
|
|
241
|
+
<path d="M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z"/>
|
|
242
|
+
</svg>
|
|
243
|
+
</button>
|
|
244
|
+
}
|
|
245
|
+
`,
|
|
246
|
+
}]
|
|
247
|
+
}], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], pill: [{ type: i0.Input, args: [{ isSignal: true, alias: "pill", required: false }] }], dismissible: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissible", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }], dismissLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissLabel", required: false }] }], dismissed: [{ type: i0.Output, args: ["dismissed"] }], avatarChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AvatarComponent), { isSignal: true }] }], iconChild: [{ type: i0.ContentChild, args: [i0.forwardRef(() => IconComponent), { isSignal: true }] }] } });
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Dot indicator styling and color tokens for `[twBadgeDot]`. Mirrors the
|
|
251
|
+
* `dot` slot rules previously embedded in the badge component but lives in
|
|
252
|
+
* its own variant table because the dot has no text content, no padding,
|
|
253
|
+
* and no border / variant axis.
|
|
254
|
+
*/
|
|
255
|
+
const badgeDotVariants = tv({
|
|
256
|
+
base: 'inline-block rounded-full shrink-0',
|
|
257
|
+
variants: {
|
|
258
|
+
color: {
|
|
259
|
+
primary: 'bg-primary-500',
|
|
260
|
+
secondary: 'bg-secondary-500',
|
|
261
|
+
accent: 'bg-accent-500',
|
|
262
|
+
neutral: 'bg-fg-muted',
|
|
263
|
+
info: 'bg-info-500',
|
|
264
|
+
success: 'bg-success-500',
|
|
265
|
+
warning: 'bg-warning-500',
|
|
266
|
+
error: 'bg-error-500',
|
|
267
|
+
},
|
|
268
|
+
size: {
|
|
269
|
+
xs: 'size-1.5',
|
|
270
|
+
sm: 'size-1.5',
|
|
271
|
+
md: 'size-2',
|
|
272
|
+
lg: 'size-2.5',
|
|
273
|
+
xl: 'size-2.5',
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
defaultVariants: {
|
|
277
|
+
color: 'neutral',
|
|
278
|
+
size: 'md',
|
|
279
|
+
},
|
|
280
|
+
}, {
|
|
281
|
+
twMerge: true,
|
|
282
|
+
});
|
|
283
|
+
/**
|
|
284
|
+
* Compact colored dot used as a presence indicator, unread marker, or status
|
|
285
|
+
* pip. Applies as an attribute selector so the host element controls the
|
|
286
|
+
* structure — wrap in a `<span>`, `<div>`, list item, or any inline element.
|
|
287
|
+
*
|
|
288
|
+
* The dot has no text content; pair it with a visible label adjacent in the
|
|
289
|
+
* DOM, or set `aria-label` on the host so assistive technology can announce
|
|
290
|
+
* the state. Opt in to `live` to expose the dot as an ARIA live region when
|
|
291
|
+
* the indicator state actually changes (e.g. "new messages received").
|
|
292
|
+
*
|
|
293
|
+
* @example
|
|
294
|
+
* ```html
|
|
295
|
+
* <span twBadgeDot color="success" size="sm"></span>
|
|
296
|
+
* <span twBadgeDot color="error" [live]="true" aria-label="3 unread"></span>
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
class BadgeDotDirective {
|
|
300
|
+
/** Sets the semantic color palette. Defaults to `'neutral'`. */
|
|
301
|
+
color = input('neutral', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
302
|
+
/** Controls dot dimensions. Defaults to `'md'`. */
|
|
303
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
304
|
+
/**
|
|
305
|
+
* When true, exposes the dot as an ARIA live region (`role="status"`) so
|
|
306
|
+
* assistive technology announces state changes (e.g. an unread indicator
|
|
307
|
+
* appearing). Defaults to `false` because most dots are decorative pips
|
|
308
|
+
* paired with a visible label.
|
|
309
|
+
*/
|
|
310
|
+
live = input(false, ...(ngDevMode ? [{ debugName: "live" }] : /* istanbul ignore next */ []));
|
|
311
|
+
classes = computed(() => badgeDotVariants({ color: this.color(), size: this.size() }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
312
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BadgeDotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
313
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: BadgeDotDirective, isStandalone: true, selector: "[twBadgeDot]", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, live: { classPropertyName: "live", publicName: "live", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "live() ? \"status\" : null" } }, exportAs: ["twBadgeDot"], ngImport: i0 });
|
|
314
|
+
}
|
|
315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BadgeDotDirective, decorators: [{
|
|
316
|
+
type: Directive,
|
|
317
|
+
args: [{
|
|
318
|
+
selector: '[twBadgeDot]',
|
|
319
|
+
exportAs: 'twBadgeDot',
|
|
320
|
+
host: {
|
|
321
|
+
'[class]': 'classes()',
|
|
322
|
+
'[attr.role]': 'live() ? "status" : null',
|
|
323
|
+
},
|
|
324
|
+
}]
|
|
325
|
+
}], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], live: [{ type: i0.Input, args: [{ isSignal: true, alias: "live", required: false }] }] } });
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Generated bundle index. Do not edit.
|
|
329
|
+
*/
|
|
330
|
+
|
|
331
|
+
export { BadgeComponent, BadgeDotDirective };
|
|
332
|
+
//# sourceMappingURL=cdevhub-ngx-tw-badge.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-badge.mjs","sources":["../../../projects/ngx-tw/badge/badge.ts","../../../projects/ngx-tw/badge/badge-dot.ts","../../../projects/ngx-tw/badge/cdevhub-ngx-tw-badge.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n output,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\nimport { AvatarComponent } from '@cdevhub/ngx-tw/avatar';\nimport { IconComponent } from '@cdevhub/ngx-tw/icon';\n\n/** Visual style of the badge. */\nexport type BadgeVariant = 'solid' | 'outline' | 'soft';\n\nconst badgeVariants = tv({\n slots: {\n root: 'inline-flex items-center font-medium w-fit',\n content: 'inline-flex items-center',\n dismiss:\n 'inline-flex items-center justify-center rounded-md cursor-pointer hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n dismissIcon: 'shrink-0',\n leadingAvatar: 'inline-flex shrink-0 rounded-full overflow-hidden [&>tw-avatar]:size-full',\n leadingIcon: 'inline-flex shrink-0 [&>tw-icon]:size-full',\n },\n variants: {\n variant: {\n solid: { root: '' },\n outline: { root: 'border' },\n soft: { root: '' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n size: {\n xs: {\n root: 'px-1.5 py-0.5 text-xs gap-1',\n // size-6 (24px) meets WCAG 2.5.8 target-size; negative margins keep\n // the visible badge box centred without inflating its layout height.\n dismiss: 'size-6 -my-1 -mr-1',\n dismissIcon: 'size-3',\n leadingAvatar: 'size-4',\n leadingIcon: 'size-3',\n },\n sm: {\n root: 'px-2 py-0.5 text-xs gap-1',\n dismiss: 'size-6 -my-1 -mr-1',\n dismissIcon: 'size-3',\n leadingAvatar: 'size-4',\n leadingIcon: 'size-3',\n },\n md: {\n root: 'px-2 py-1 text-xs gap-1.5',\n // size-7 (28px) keeps the dismiss target comfortable at md density;\n // negative margins absorb the overflow so the badge height is unchanged.\n dismiss: 'size-7 -my-1.5 -mr-1.5',\n // size-3.5 (14px) half-step: sits between the size-3 used at xs/sm and\n // the size-4 used at lg/xl, balancing the X glyph against text-xs at\n // md density without dominating the dismiss button.\n dismissIcon: 'size-3.5',\n leadingAvatar: 'size-5',\n // size-3.5 (14px) half-step: the md badge sits between xs/sm (size-3\n // leading icon, text-xs) and lg/xl (size-4, text-sm); 14px is the\n // visual mid-point that lines up with text-xs at this density.\n leadingIcon: 'size-3.5',\n },\n lg: {\n root: 'px-3 py-1.5 text-sm gap-1.5',\n dismiss: 'size-8 -my-1.5 -mr-1.5',\n dismissIcon: 'size-4',\n leadingAvatar: 'size-5',\n leadingIcon: 'size-4',\n },\n xl: {\n root: 'px-3 py-1.5 text-sm gap-1.5',\n dismiss: 'size-8 -my-1.5 -mr-1.5',\n dismissIcon: 'size-4',\n leadingAvatar: 'size-6',\n leadingIcon: 'size-4',\n },\n },\n pill: {\n true: { root: 'rounded-full' },\n false: { root: 'rounded-md' },\n },\n hasAvatar: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n // ===== Primary =====\n { variant: 'solid', color: 'primary', class: { root: 'bg-primary-600 text-on-primary' } },\n { variant: 'outline', color: 'primary', class: { root: 'border-primary-300 text-primary-700' } },\n { variant: 'soft', color: 'primary', class: { root: 'bg-primary-50 text-primary-800' } },\n\n // ===== Secondary =====\n { variant: 'solid', color: 'secondary', class: { root: 'bg-secondary-600 text-on-secondary' } },\n { variant: 'outline', color: 'secondary', class: { root: 'border-secondary-300 text-secondary-700' } },\n { variant: 'soft', color: 'secondary', class: { root: 'bg-secondary-50 text-secondary-800' } },\n\n // ===== Accent =====\n { variant: 'solid', color: 'accent', class: { root: 'bg-accent-600 text-on-accent' } },\n { variant: 'outline', color: 'accent', class: { root: 'border-accent-300 text-accent-700' } },\n { variant: 'soft', color: 'accent', class: { root: 'bg-accent-50 text-accent-800' } },\n\n // ===== Neutral ===== (surface/fg tokens auto-adapt to dark mode)\n { variant: 'solid', color: 'neutral', class: { root: 'bg-surface-muted text-fg' } },\n { variant: 'outline', color: 'neutral', class: { root: 'border-border text-fg' } },\n { variant: 'soft', color: 'neutral', class: { root: 'bg-surface-muted text-fg-muted' } },\n\n // ===== Info =====\n { variant: 'solid', color: 'info', class: { root: 'bg-info-600 text-on-info' } },\n { variant: 'outline', color: 'info', class: { root: 'border-info-300 text-info-700' } },\n { variant: 'soft', color: 'info', class: { root: 'bg-info-50 text-info-800' } },\n\n // ===== Success =====\n { variant: 'solid', color: 'success', class: { root: 'bg-success-600 text-on-success' } },\n { variant: 'outline', color: 'success', class: { root: 'border-success-300 text-success-700' } },\n { variant: 'soft', color: 'success', class: { root: 'bg-success-50 text-success-800' } },\n\n // ===== Warning =====\n { variant: 'solid', color: 'warning', class: { root: 'bg-warning-500 text-on-warning' } },\n { variant: 'outline', color: 'warning', class: { root: 'border-warning-300 text-warning-700' } },\n { variant: 'soft', color: 'warning', class: { root: 'bg-warning-50 text-warning-800' } },\n\n // ===== Error =====\n { variant: 'solid', color: 'error', class: { root: 'bg-error-600 text-on-error' } },\n { variant: 'outline', color: 'error', class: { root: 'border-error-300 text-error-700' } },\n { variant: 'soft', color: 'error', class: { root: 'bg-error-50 text-error-800' } },\n\n // ===== Reduced left padding when avatar is present =====\n { hasAvatar: true, size: 'xs', class: { root: 'pl-0.5' } },\n { hasAvatar: true, size: 'sm', class: { root: 'pl-1' } },\n { hasAvatar: true, size: 'md', class: { root: 'pl-1' } },\n { hasAvatar: true, size: 'lg', class: { root: 'pl-1.5' } },\n { hasAvatar: true, size: 'xl', class: { root: 'pl-1.5' } },\n ],\n defaultVariants: {\n variant: 'soft',\n color: 'neutral',\n size: 'md',\n pill: false,\n hasAvatar: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Compact status label, tag, or count attached to any host element.\n *\n * Uses an attribute selector (`[twBadge]`) rather than the library's canonical\n * element selector so consumers can apply the badge styling to any inline\n * element — `<span>`, `<a>`, `<div>` — without an extra wrapper. The trade-off\n * is intentional: badges most often live inside an existing text flow or list\n * item where wrapping in a `<tw-badge>` element would add structural noise.\n *\n * For dot-only presence indicators (no text, no padding), use the sibling\n * `[twBadgeDot]` directive — its rendering shape (no children, no dismiss,\n * no leading slot) is structurally distinct from the labelled badge.\n */\n@Component({\n selector: '[twBadge]',\n exportAs: 'twBadge',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n '[attr.role]': 'live() ? \"status\" : null',\n },\n template: `\n @if (hasLeadingAvatar()) {\n <span [class]=\"leadingAvatarClasses()\"><ng-content select=\"tw-avatar\" /></span>\n }\n @if (hasLeadingIcon() && !hasLeadingAvatar()) {\n <span [class]=\"leadingIconClasses()\"><ng-content select=\"tw-icon\" /></span>\n }\n <span [class]=\"contentClasses()\"><ng-content /></span>\n @if (dismissible()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"dismissLabel()\"\n [class]=\"dismissClasses()\"\n (click)=\"dismissed.emit()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" [class]=\"dismissIconClasses()\">\n <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\"/>\n </svg>\n </button>\n }\n `,\n})\nexport class BadgeComponent {\n /** Sets the semantic color palette. Defaults to `'neutral'`. */\n readonly color = input<TwColor>('neutral');\n\n /** Controls the visual style. Defaults to `'soft'`. */\n readonly variant = input<BadgeVariant>('soft');\n\n /** Controls badge size (padding, font, icon size). Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, uses fully rounded corners instead of default `rounded-md`. Defaults to `false`. */\n readonly pill = input(false);\n\n /** When true, renders a dismiss button inside the badge. Defaults to `false`. */\n readonly dismissible = input(false);\n\n /**\n * When true, exposes the badge as an ARIA live region (`role=\"status\"`)\n * so assistive technology announces content changes. Defaults to `false`\n * because most badges are decorative tags or labels — opt in only when\n * the badge represents a value that actually updates in place.\n */\n readonly live = input(false);\n\n /** Accessible label for the dismiss button. Override for localization. Defaults to `'Dismiss'`. */\n readonly dismissLabel = input<string>('Dismiss');\n\n /** Fires when the dismiss button is clicked. */\n readonly dismissed = output<void>();\n\n /** @internal */\n readonly avatarChild = contentChild(AvatarComponent);\n\n /** @internal */\n readonly iconChild = contentChild(IconComponent);\n\n readonly hasLeadingAvatar = computed(() => !!this.avatarChild());\n readonly hasLeadingIcon = computed(() => !!this.iconChild());\n\n private readonly variantResult = computed(() =>\n badgeVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n pill: this.pill(),\n hasAvatar: this.hasLeadingAvatar(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly contentClasses = computed(() => this.variantResult().content());\n readonly dismissClasses = computed(() => this.variantResult().dismiss());\n readonly dismissIconClasses = computed(() => this.variantResult().dismissIcon());\n readonly leadingAvatarClasses = computed(() => this.variantResult().leadingAvatar());\n readonly leadingIconClasses = computed(() => this.variantResult().leadingIcon());\n}\n","import {\n Directive,\n computed,\n input,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/**\n * Dot indicator styling and color tokens for `[twBadgeDot]`. Mirrors the\n * `dot` slot rules previously embedded in the badge component but lives in\n * its own variant table because the dot has no text content, no padding,\n * and no border / variant axis.\n */\nconst badgeDotVariants = tv({\n base: 'inline-block rounded-full shrink-0',\n variants: {\n color: {\n primary: 'bg-primary-500',\n secondary: 'bg-secondary-500',\n accent: 'bg-accent-500',\n neutral: 'bg-fg-muted',\n info: 'bg-info-500',\n success: 'bg-success-500',\n warning: 'bg-warning-500',\n error: 'bg-error-500',\n },\n size: {\n xs: 'size-1.5',\n sm: 'size-1.5',\n md: 'size-2',\n lg: 'size-2.5',\n xl: 'size-2.5',\n },\n },\n defaultVariants: {\n color: 'neutral',\n size: 'md',\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Compact colored dot used as a presence indicator, unread marker, or status\n * pip. Applies as an attribute selector so the host element controls the\n * structure — wrap in a `<span>`, `<div>`, list item, or any inline element.\n *\n * The dot has no text content; pair it with a visible label adjacent in the\n * DOM, or set `aria-label` on the host so assistive technology can announce\n * the state. Opt in to `live` to expose the dot as an ARIA live region when\n * the indicator state actually changes (e.g. \"new messages received\").\n *\n * @example\n * ```html\n * <span twBadgeDot color=\"success\" size=\"sm\"></span>\n * <span twBadgeDot color=\"error\" [live]=\"true\" aria-label=\"3 unread\"></span>\n * ```\n */\n@Directive({\n selector: '[twBadgeDot]',\n exportAs: 'twBadgeDot',\n host: {\n '[class]': 'classes()',\n '[attr.role]': 'live() ? \"status\" : null',\n },\n})\nexport class BadgeDotDirective {\n /** Sets the semantic color palette. Defaults to `'neutral'`. */\n readonly color = input<TwColor>('neutral');\n\n /** Controls dot dimensions. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /**\n * When true, exposes the dot as an ARIA live region (`role=\"status\"`) so\n * assistive technology announces state changes (e.g. an unread indicator\n * appearing). Defaults to `false` because most dots are decorative pips\n * paired with a visible label.\n */\n readonly live = input(false);\n\n readonly classes = computed(() =>\n badgeDotVariants({ color: this.color(), size: this.size() }),\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|