@cdevhub/ngx-tw 0.6.1 → 0.7.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/fesm2022/cdevhub-ngx-tw-alert.mjs +8 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +18 -8
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +14 -8
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +7 -7
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +7 -7
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +8 -8
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +8 -8
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +8 -8
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +16 -16
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +7 -7
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +10 -4
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +7 -7
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +7 -7
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +21 -21
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +29 -9
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +8 -8
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +8 -8
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +1 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +23 -3
- package/types/cdevhub-ngx-tw-theme.d.ts +18 -1
|
@@ -21,8 +21,15 @@ function outlineSlots(role) {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
function solidSlots(role) {
|
|
24
|
+
// `warning` alone gets a boundary ring. Its `-solid` is `amber-500` because
|
|
25
|
+
// dark-on-yellow is a deliberate signage choice (`_semantic.css`), which
|
|
26
|
+
// leaves the filled block at 1.95:1 against the page in light and 1.56:1 in
|
|
27
|
+
// high-contrast — the other seven roles clear 3:1 on the fill alone (4.33+).
|
|
28
|
+
// Written as a literal so Tailwind's scanner sees it; `ring-{role}-border-strong`
|
|
29
|
+
// is also safelisted in `theme/index.css`.
|
|
30
|
+
const boundary = role === 'warning' ? ' ring-1 ring-inset ring-warning-border-strong' : '';
|
|
24
31
|
return {
|
|
25
|
-
root: `bg-${role}-solid text-${role}-solid-fg`,
|
|
32
|
+
root: `bg-${role}-solid text-${role}-solid-fg${boundary}`,
|
|
26
33
|
icon: `text-${role}-solid-fg`,
|
|
27
34
|
title: `text-${role}-solid-fg`,
|
|
28
35
|
content: `text-${role}-solid-fg`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-alert.mjs","sources":["../../../projects/ngx-tw/alert/alert.ts","../../../projects/ngx-tw/alert/cdevhub-ngx-tw-alert.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the alert container. */\nexport type AlertVariant = 'solid' | 'outline' | 'soft';\n\n/** ARIA live-region politeness for the alert. Maps to the host `role`. */\nexport type AlertPoliteness = 'polite' | 'assertive' | 'off';\n\n/**\n * Alert variants use the semantic role slot tokens defined in\n * `projects/ngx-tw/theme/_semantic.css` (and redefined per-theme in\n * `_dark.css` / `_high-contrast.css`). The mapping role × variant → slots\n * is the same for every color, so the variant table is expressed as a single\n * function template over the role name — no per-role copy-paste, no shade\n * picks, no `dark:` overrides. Dark / high-contrast contrast is owned by the\n * theme tokens; components only consume slots.\n */\ninterface AlertSlotClasses {\n root: string;\n icon: string;\n title: string;\n content: string;\n dismiss: string;\n}\n\nfunction softSlots(role: TwColor): AlertSlotClasses {\n return {\n root: `bg-${role}-soft text-${role}-soft-fg-muted`,\n icon: `text-${role}-icon`,\n title: `text-${role}-soft-fg`,\n content: `text-${role}-soft-fg-muted`,\n dismiss: `text-${role}-icon hover:bg-${role}-soft-hover`,\n };\n}\n\nfunction outlineSlots(role: TwColor): AlertSlotClasses {\n return {\n root: `border-${role}-border text-${role}-soft-fg-muted`,\n icon: `text-${role}-icon`,\n title: `text-${role}-soft-fg`,\n content: `text-${role}-soft-fg-muted`,\n dismiss: `text-${role}-icon hover:bg-${role}-soft`,\n };\n}\n\nfunction solidSlots(role: TwColor): AlertSlotClasses {\n return {\n root: `bg-${role}-solid text-${role}-solid-fg`,\n icon: `text-${role}-solid-fg`,\n title: `text-${role}-solid-fg`,\n content: `text-${role}-solid-fg`,\n dismiss: `text-${role}-solid-fg/80 hover:bg-${role}-solid-hover`,\n };\n}\n\nconst ROLES: readonly TwColor[] = [\n 'primary', 'secondary', 'accent', 'neutral',\n 'info', 'success', 'warning', 'error',\n] as const;\n\nconst alertVariants = tv({\n slots: {\n root: 'relative flex gap-3 rounded-lg p-4 text-sm',\n icon: 'size-5 shrink-0 mt-0.5',\n title: 'text-sm font-semibold',\n content: 'text-sm',\n actions: 'flex items-center gap-2 mt-2',\n // size-3.5 inner glyph: half-step decorative — keeps the X visually centred\n // in the size-6 square-interactive target without dominating the button.\n dismiss:\n 'absolute top-2.5 right-2.5 inline-flex items-center justify-center size-6 rounded-md cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n variant: {\n solid: { root: '' },\n outline: { root: 'border' },\n soft: { root: '' },\n },\n color: Object.fromEntries(ROLES.map((r) => [r, {}])) as Record<TwColor, Record<string, never>>,\n },\n compoundVariants: ROLES.flatMap((role) => [\n { variant: 'soft' as const, color: role, class: softSlots(role) },\n { variant: 'outline' as const, color: role, class: outlineSlots(role) },\n { variant: 'solid' as const, color: role, class: solidSlots(role) },\n ]),\n defaultVariants: {\n variant: 'soft',\n color: 'info',\n },\n}, {\n twMerge: true,\n});\n\n@Directive({\n selector: '[twAlertIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertIconDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.iconClasses;\n}\n\n@Directive({\n selector: '[twAlertTitle]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertTitleDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.titleClasses;\n}\n\n@Directive({\n selector: '[twAlertContent]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertContentDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.contentClasses;\n}\n\n@Directive({\n selector: '[twAlertActions]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertActionsDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.actionsClasses;\n}\n\n@Component({\n selector: 'tw-alert',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': 'computedRole()',\n '[class]': 'rootClasses()',\n '[animate.leave]': '\"fade-out\"',\n },\n template: `\n @if (hasIcon()) {\n <ng-content select=\"[twAlertIcon]\" />\n }\n <div class=\"min-w-0 flex-1\">\n <ng-content select=\"[twAlertTitle]\" />\n <ng-content select=\"[twAlertContent]\" />\n <ng-content />\n <ng-content select=\"[twAlertActions]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"dismissLabel()\"\n [class]=\"dismissClasses()\"\n (click)=\"dismissed.emit()\"\n >\n <!-- size-3.5 (14px) is the half-step between size-3 and size-4 — the only icon size that visually aligns with the alert title's text-sm metric inside the compact xs-density dismiss button. -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-3.5\">\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 AlertComponent {\n /** Controls the visual style of the alert. Defaults to `'soft'`. */\n readonly variant = input<AlertVariant>('soft');\n\n /** Sets the semantic color palette. Defaults to `'info'`. */\n readonly color = input<TwColor>('info');\n\n /** When true, renders a dismiss button. Defaults to `false`. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n\n /**\n * Sets the ARIA live-region politeness. Maps to the host `role`:\n * `'assertive'` → `role=\"alert\"`, `'polite'` → `role=\"status\"`,\n * `'off'` → no role. Use `'off'` to suppress re-announcement when the\n * alert content updates after initial render — assistive tech treats the\n * alert as a static region rather than a live region. Defaults to `'polite'`.\n */\n readonly politeness = input<AlertPoliteness>('polite');\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 iconDirective = contentChild(AlertIconDirective);\n\n readonly hasIcon = computed(() => !!this.iconDirective());\n\n readonly computedRole = computed(() => {\n switch (this.politeness()) {\n case 'assertive':\n return 'alert';\n case 'polite':\n return 'status';\n default:\n return null;\n }\n });\n\n private readonly variantResult = computed(() =>\n alertVariants({\n variant: this.variant(),\n color: this.color(),\n }),\n );\n\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n return this.dismissible() ? `${base} pr-10` : base;\n });\n\n readonly iconClasses = computed(() => this.variantResult().icon());\n readonly titleClasses = computed(() => this.variantResult().title());\n readonly contentClasses = computed(() => this.variantResult().content());\n readonly actionsClasses = computed(() => this.variantResult().actions());\n readonly dismissClasses = computed(() => this.variantResult().dismiss());\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-alert.mjs","sources":["../../../projects/ngx-tw/alert/alert.ts","../../../projects/ngx-tw/alert/cdevhub-ngx-tw-alert.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the alert container. */\nexport type AlertVariant = 'solid' | 'outline' | 'soft';\n\n/** ARIA live-region politeness for the alert. Maps to the host `role`. */\nexport type AlertPoliteness = 'polite' | 'assertive' | 'off';\n\n/**\n * Alert variants use the semantic role slot tokens defined in\n * `projects/ngx-tw/theme/_semantic.css` (and redefined per-theme in\n * `_dark.css` / `_high-contrast.css`). The mapping role × variant → slots\n * is the same for every color, so the variant table is expressed as a single\n * function template over the role name — no per-role copy-paste, no shade\n * picks, no `dark:` overrides. Dark / high-contrast contrast is owned by the\n * theme tokens; components only consume slots.\n */\ninterface AlertSlotClasses {\n root: string;\n icon: string;\n title: string;\n content: string;\n dismiss: string;\n}\n\nfunction softSlots(role: TwColor): AlertSlotClasses {\n return {\n root: `bg-${role}-soft text-${role}-soft-fg-muted`,\n icon: `text-${role}-icon`,\n title: `text-${role}-soft-fg`,\n content: `text-${role}-soft-fg-muted`,\n dismiss: `text-${role}-icon hover:bg-${role}-soft-hover`,\n };\n}\n\nfunction outlineSlots(role: TwColor): AlertSlotClasses {\n return {\n root: `border-${role}-border text-${role}-soft-fg-muted`,\n icon: `text-${role}-icon`,\n title: `text-${role}-soft-fg`,\n content: `text-${role}-soft-fg-muted`,\n dismiss: `text-${role}-icon hover:bg-${role}-soft`,\n };\n}\n\nfunction solidSlots(role: TwColor): AlertSlotClasses {\n // `warning` alone gets a boundary ring. Its `-solid` is `amber-500` because\n // dark-on-yellow is a deliberate signage choice (`_semantic.css`), which\n // leaves the filled block at 1.95:1 against the page in light and 1.56:1 in\n // high-contrast — the other seven roles clear 3:1 on the fill alone (4.33+).\n // Written as a literal so Tailwind's scanner sees it; `ring-{role}-border-strong`\n // is also safelisted in `theme/index.css`.\n const boundary = role === 'warning' ? ' ring-1 ring-inset ring-warning-border-strong' : '';\n return {\n root: `bg-${role}-solid text-${role}-solid-fg${boundary}`,\n icon: `text-${role}-solid-fg`,\n title: `text-${role}-solid-fg`,\n content: `text-${role}-solid-fg`,\n dismiss: `text-${role}-solid-fg/80 hover:bg-${role}-solid-hover`,\n };\n}\n\nconst ROLES: readonly TwColor[] = [\n 'primary', 'secondary', 'accent', 'neutral',\n 'info', 'success', 'warning', 'error',\n] as const;\n\nconst alertVariants = tv({\n slots: {\n root: 'relative flex gap-3 rounded-lg p-4 text-sm',\n icon: 'size-5 shrink-0 mt-0.5',\n title: 'text-sm font-semibold',\n content: 'text-sm',\n actions: 'flex items-center gap-2 mt-2',\n // size-3.5 inner glyph: half-step decorative — keeps the X visually centred\n // in the size-6 square-interactive target without dominating the button.\n dismiss:\n 'absolute top-2.5 right-2.5 inline-flex items-center justify-center size-6 rounded-md cursor-pointer transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n variant: {\n solid: { root: '' },\n outline: { root: 'border' },\n soft: { root: '' },\n },\n color: Object.fromEntries(ROLES.map((r) => [r, {}])) as Record<TwColor, Record<string, never>>,\n },\n compoundVariants: ROLES.flatMap((role) => [\n { variant: 'soft' as const, color: role, class: softSlots(role) },\n { variant: 'outline' as const, color: role, class: outlineSlots(role) },\n { variant: 'solid' as const, color: role, class: solidSlots(role) },\n ]),\n defaultVariants: {\n variant: 'soft',\n color: 'info',\n },\n}, {\n twMerge: true,\n});\n\n@Directive({\n selector: '[twAlertIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertIconDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.iconClasses;\n}\n\n@Directive({\n selector: '[twAlertTitle]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertTitleDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.titleClasses;\n}\n\n@Directive({\n selector: '[twAlertContent]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertContentDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.contentClasses;\n}\n\n@Directive({\n selector: '[twAlertActions]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class AlertActionsDirective {\n private readonly alert = inject(AlertComponent);\n readonly classes = this.alert.actionsClasses;\n}\n\n@Component({\n selector: 'tw-alert',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': 'computedRole()',\n '[class]': 'rootClasses()',\n '[animate.leave]': '\"fade-out\"',\n },\n template: `\n @if (hasIcon()) {\n <ng-content select=\"[twAlertIcon]\" />\n }\n <div class=\"min-w-0 flex-1\">\n <ng-content select=\"[twAlertTitle]\" />\n <ng-content select=\"[twAlertContent]\" />\n <ng-content />\n <ng-content select=\"[twAlertActions]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n [attr.aria-label]=\"dismissLabel()\"\n [class]=\"dismissClasses()\"\n (click)=\"dismissed.emit()\"\n >\n <!-- size-3.5 (14px) is the half-step between size-3 and size-4 — the only icon size that visually aligns with the alert title's text-sm metric inside the compact xs-density dismiss button. -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\" class=\"size-3.5\">\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 AlertComponent {\n /** Controls the visual style of the alert. Defaults to `'soft'`. */\n readonly variant = input<AlertVariant>('soft');\n\n /** Sets the semantic color palette. Defaults to `'info'`. */\n readonly color = input<TwColor>('info');\n\n /** When true, renders a dismiss button. Defaults to `false`. */\n readonly dismissible = input(false, { transform: booleanAttribute });\n\n /**\n * Sets the ARIA live-region politeness. Maps to the host `role`:\n * `'assertive'` → `role=\"alert\"`, `'polite'` → `role=\"status\"`,\n * `'off'` → no role. Use `'off'` to suppress re-announcement when the\n * alert content updates after initial render — assistive tech treats the\n * alert as a static region rather than a live region. Defaults to `'polite'`.\n */\n readonly politeness = input<AlertPoliteness>('polite');\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 iconDirective = contentChild(AlertIconDirective);\n\n readonly hasIcon = computed(() => !!this.iconDirective());\n\n readonly computedRole = computed(() => {\n switch (this.politeness()) {\n case 'assertive':\n return 'alert';\n case 'polite':\n return 'status';\n default:\n return null;\n }\n });\n\n private readonly variantResult = computed(() =>\n alertVariants({\n variant: this.variant(),\n color: this.color(),\n }),\n );\n\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n return this.dismissible() ? `${base} pr-10` : base;\n });\n\n readonly iconClasses = computed(() => this.variantResult().icon());\n readonly titleClasses = computed(() => this.variantResult().title());\n readonly contentClasses = computed(() => this.variantResult().content());\n readonly actionsClasses = computed(() => this.variantResult().actions());\n readonly dismissClasses = computed(() => this.variantResult().dismiss());\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -92,15 +92,15 @@ const badgeVariants = tv({
|
|
|
92
92
|
// green-600 on white fail AA (3.85:1 / 3.3:1); the `-solid` slots map to
|
|
93
93
|
// `-700` where needed so every color meets the body-text threshold.
|
|
94
94
|
{ variant: 'solid', color: 'primary', class: { root: 'bg-primary-solid text-primary-solid-fg' } },
|
|
95
|
-
{ variant: 'outline', color: 'primary', class: { root: 'border-primary-
|
|
95
|
+
{ variant: 'outline', color: 'primary', class: { root: 'border-primary-border text-primary-700' } },
|
|
96
96
|
{ variant: 'soft', color: 'primary', class: { root: 'bg-primary-50 text-primary-800' } },
|
|
97
97
|
// ===== Secondary =====
|
|
98
98
|
{ variant: 'solid', color: 'secondary', class: { root: 'bg-secondary-solid text-secondary-solid-fg' } },
|
|
99
|
-
{ variant: 'outline', color: 'secondary', class: { root: 'border-secondary-
|
|
99
|
+
{ variant: 'outline', color: 'secondary', class: { root: 'border-secondary-border text-secondary-700' } },
|
|
100
100
|
{ variant: 'soft', color: 'secondary', class: { root: 'bg-secondary-50 text-secondary-800' } },
|
|
101
101
|
// ===== Accent =====
|
|
102
102
|
{ variant: 'solid', color: 'accent', class: { root: 'bg-accent-solid text-accent-solid-fg' } },
|
|
103
|
-
{ variant: 'outline', color: 'accent', class: { root: 'border-accent-
|
|
103
|
+
{ variant: 'outline', color: 'accent', class: { root: 'border-accent-border text-accent-700' } },
|
|
104
104
|
{ variant: 'soft', color: 'accent', class: { root: 'bg-accent-50 text-accent-800' } },
|
|
105
105
|
// ===== Neutral ===== (surface/fg tokens auto-adapt to dark mode)
|
|
106
106
|
{ variant: 'solid', color: 'neutral', class: { root: 'bg-surface-muted text-fg' } },
|
|
@@ -108,19 +108,29 @@ const badgeVariants = tv({
|
|
|
108
108
|
{ variant: 'soft', color: 'neutral', class: { root: 'bg-surface-muted text-fg-muted' } },
|
|
109
109
|
// ===== Info =====
|
|
110
110
|
{ variant: 'solid', color: 'info', class: { root: 'bg-info-solid text-info-solid-fg' } },
|
|
111
|
-
{ variant: 'outline', color: 'info', class: { root: 'border-info-
|
|
111
|
+
{ variant: 'outline', color: 'info', class: { root: 'border-info-border text-info-700' } },
|
|
112
112
|
{ variant: 'soft', color: 'info', class: { root: 'bg-info-50 text-info-800' } },
|
|
113
113
|
// ===== Success =====
|
|
114
114
|
{ variant: 'solid', color: 'success', class: { root: 'bg-success-solid text-success-solid-fg' } },
|
|
115
|
-
{ variant: 'outline', color: 'success', class: { root: 'border-success-
|
|
115
|
+
{ variant: 'outline', color: 'success', class: { root: 'border-success-border text-success-700' } },
|
|
116
116
|
{ variant: 'soft', color: 'success', class: { root: 'bg-success-50 text-success-800' } },
|
|
117
117
|
// ===== Warning =====
|
|
118
|
-
{
|
|
119
|
-
|
|
118
|
+
{
|
|
119
|
+
variant: 'solid',
|
|
120
|
+
color: 'warning',
|
|
121
|
+
// `warning-solid` is `amber-500` because dark-on-yellow is a deliberate
|
|
122
|
+
// signage choice (`_semantic.css`), which leaves the chip at 1.95:1
|
|
123
|
+
// against the page in light and 1.56:1 in high-contrast. The fill cannot
|
|
124
|
+
// be darkened without breaking what it was chosen for, so the boundary
|
|
125
|
+
// carries SC 1.4.11 instead. A ring, not a border: it is a box-shadow,
|
|
126
|
+
// so it adds no layout box to a variant that has none.
|
|
127
|
+
class: { root: 'bg-warning-solid text-warning-solid-fg ring-1 ring-inset ring-warning-border-strong' },
|
|
128
|
+
},
|
|
129
|
+
{ variant: 'outline', color: 'warning', class: { root: 'border-warning-border text-warning-700' } },
|
|
120
130
|
{ variant: 'soft', color: 'warning', class: { root: 'bg-warning-50 text-warning-800' } },
|
|
121
131
|
// ===== Error =====
|
|
122
132
|
{ variant: 'solid', color: 'error', class: { root: 'bg-error-solid text-error-solid-fg' } },
|
|
123
|
-
{ variant: 'outline', color: 'error', class: { root: 'border-error-
|
|
133
|
+
{ variant: 'outline', color: 'error', class: { root: 'border-error-border text-error-700' } },
|
|
124
134
|
{ variant: 'soft', color: 'error', class: { root: 'bg-error-50 text-error-800' } },
|
|
125
135
|
// ===== Reduced left padding when avatar is present =====
|
|
126
136
|
{ hasAvatar: true, size: 'xs', class: { root: 'pl-0.5' } },
|
|
@@ -1 +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 // Solid variants consume the semantic `${color}-solid` slot pair (AA-tuned\n // in theme/_semantic.css) instead of a raw `${color}-600` shade — sky-600 /\n // green-600 on white fail AA (3.85:1 / 3.3:1); the `-solid` slots map to\n // `-700` where needed so every color meets the body-text threshold.\n { variant: 'solid', color: 'primary', class: { root: 'bg-primary-solid text-primary-solid-fg' } },\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-solid text-secondary-solid-fg' } },\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-solid text-accent-solid-fg' } },\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-solid text-info-solid-fg' } },\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-solid text-success-solid-fg' } },\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-solid text-warning-solid-fg' } },\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-solid text-error-solid-fg' } },\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 // Dot-indicator sub-scale, 2px per step: 8 / 10 / 12 / 14 / 16 px.\n //\n // xs / sm / md are CLAUDE.md's documented dot table verbatim (`size-2` / `size-2.5` /\n // `size-3`). The table stops at md, so lg and xl continue its own 2px progression. They\n // are NOT free choices: CLAUDE.md forbids `size-5` for a dot outright (\"never size-5 for\n // a dot indicator\"), which caps the scale at 16px, and five distinct steps ending at 16\n // with a 2px cadence admits exactly one assignment.\n //\n // Was 6 / 6 / 8 / 10 / 10 — an entire step below the documented scale, with dead steps at\n // both ends (xs === sm, lg === xl).\n size: {\n xs: 'size-2',\n sm: 'size-2.5',\n md: 'size-3',\n // `size-3.5` (14px) and `size-4` (16px) extend the dot table past its documented md\n // row; both keep the 2px cadence rather than jumping to the glyph scale.\n lg: 'size-3.5',\n xl: 'size-4',\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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"}
|
|
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 // Solid variants consume the semantic `${color}-solid` slot pair (AA-tuned\n // in theme/_semantic.css) instead of a raw `${color}-600` shade — sky-600 /\n // green-600 on white fail AA (3.85:1 / 3.3:1); the `-solid` slots map to\n // `-700` where needed so every color meets the body-text threshold.\n { variant: 'solid', color: 'primary', class: { root: 'bg-primary-solid text-primary-solid-fg' } },\n { variant: 'outline', color: 'primary', class: { root: 'border-primary-border 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-solid text-secondary-solid-fg' } },\n { variant: 'outline', color: 'secondary', class: { root: 'border-secondary-border 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-solid text-accent-solid-fg' } },\n { variant: 'outline', color: 'accent', class: { root: 'border-accent-border 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-solid text-info-solid-fg' } },\n { variant: 'outline', color: 'info', class: { root: 'border-info-border 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-solid text-success-solid-fg' } },\n { variant: 'outline', color: 'success', class: { root: 'border-success-border text-success-700' } },\n { variant: 'soft', color: 'success', class: { root: 'bg-success-50 text-success-800' } },\n\n // ===== Warning =====\n {\n variant: 'solid',\n color: 'warning',\n // `warning-solid` is `amber-500` because dark-on-yellow is a deliberate\n // signage choice (`_semantic.css`), which leaves the chip at 1.95:1\n // against the page in light and 1.56:1 in high-contrast. The fill cannot\n // be darkened without breaking what it was chosen for, so the boundary\n // carries SC 1.4.11 instead. A ring, not a border: it is a box-shadow,\n // so it adds no layout box to a variant that has none.\n class: { root: 'bg-warning-solid text-warning-solid-fg ring-1 ring-inset ring-warning-border-strong' },\n },\n { variant: 'outline', color: 'warning', class: { root: 'border-warning-border 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-solid text-error-solid-fg' } },\n { variant: 'outline', color: 'error', class: { root: 'border-error-border 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 // Dot-indicator sub-scale, 2px per step: 8 / 10 / 12 / 14 / 16 px.\n //\n // xs / sm / md are CLAUDE.md's documented dot table verbatim (`size-2` / `size-2.5` /\n // `size-3`). The table stops at md, so lg and xl continue its own 2px progression. They\n // are NOT free choices: CLAUDE.md forbids `size-5` for a dot outright (\"never size-5 for\n // a dot indicator\"), which caps the scale at 16px, and five distinct steps ending at 16\n // with a 2px cadence admits exactly one assignment.\n //\n // Was 6 / 6 / 8 / 10 / 10 — an entire step below the documented scale, with dead steps at\n // both ends (xs === sm, lg === xl).\n size: {\n xs: 'size-2',\n sm: 'size-2.5',\n md: 'size-3',\n // `size-3.5` (14px) and `size-4` (16px) extend the dot table past its documented md\n // row; both keep the 2px cadence rather than jumping to the glyph scale.\n lg: 'size-3.5',\n xl: 'size-4',\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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"}
|
|
@@ -51,19 +51,19 @@ const buttonVariants = tv({
|
|
|
51
51
|
// sub-AA contrast for info / success in light mode.
|
|
52
52
|
// ===== Primary =====
|
|
53
53
|
{ variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },
|
|
54
|
-
{ variant: 'outline', color: 'primary', class: 'border-primary-
|
|
54
|
+
{ variant: 'outline', color: 'primary', class: 'border-primary-border text-primary-700 hover:bg-primary-50' },
|
|
55
55
|
{ variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },
|
|
56
56
|
{ variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },
|
|
57
57
|
{ variant: 'link', color: 'primary', class: 'text-primary-700' },
|
|
58
58
|
// ===== Secondary =====
|
|
59
59
|
{ variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },
|
|
60
|
-
{ variant: 'outline', color: 'secondary', class: 'border-secondary-
|
|
60
|
+
{ variant: 'outline', color: 'secondary', class: 'border-secondary-border text-secondary-700 hover:bg-secondary-50' },
|
|
61
61
|
{ variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },
|
|
62
62
|
{ variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },
|
|
63
63
|
{ variant: 'link', color: 'secondary', class: 'text-secondary-700' },
|
|
64
64
|
// ===== Accent =====
|
|
65
65
|
{ variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },
|
|
66
|
-
{ variant: 'outline', color: 'accent', class: 'border-accent-
|
|
66
|
+
{ variant: 'outline', color: 'accent', class: 'border-accent-border text-accent-700 hover:bg-accent-50' },
|
|
67
67
|
{ variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },
|
|
68
68
|
{ variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },
|
|
69
69
|
{ variant: 'link', color: 'accent', class: 'text-accent-700' },
|
|
@@ -75,25 +75,31 @@ const buttonVariants = tv({
|
|
|
75
75
|
{ variant: 'link', color: 'neutral', class: 'text-fg-muted' },
|
|
76
76
|
// ===== Info =====
|
|
77
77
|
{ variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },
|
|
78
|
-
{ variant: 'outline', color: 'info', class: 'border-info-
|
|
78
|
+
{ variant: 'outline', color: 'info', class: 'border-info-border text-info-700 hover:bg-info-50' },
|
|
79
79
|
{ variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },
|
|
80
80
|
{ variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },
|
|
81
81
|
{ variant: 'link', color: 'info', class: 'text-info-700' },
|
|
82
82
|
// ===== Success =====
|
|
83
83
|
{ variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },
|
|
84
|
-
{ variant: 'outline', color: 'success', class: 'border-success-
|
|
84
|
+
{ variant: 'outline', color: 'success', class: 'border-success-border text-success-700 hover:bg-success-50' },
|
|
85
85
|
{ variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },
|
|
86
86
|
{ variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },
|
|
87
87
|
{ variant: 'link', color: 'success', class: 'text-success-700' },
|
|
88
88
|
// ===== Warning =====
|
|
89
|
-
{
|
|
90
|
-
|
|
89
|
+
{
|
|
90
|
+
variant: 'solid',
|
|
91
|
+
color: 'warning',
|
|
92
|
+
// See badge.ts: amber-500 is load-bearing for the dark-on-yellow glyph, so
|
|
93
|
+
// the boundary carries SC 1.4.11 (1.95:1 light / 1.56:1 high-contrast).
|
|
94
|
+
class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover ring-1 ring-inset ring-warning-border-strong',
|
|
95
|
+
},
|
|
96
|
+
{ variant: 'outline', color: 'warning', class: 'border-warning-border text-warning-700 hover:bg-warning-50' },
|
|
91
97
|
{ variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },
|
|
92
98
|
{ variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },
|
|
93
99
|
{ variant: 'link', color: 'warning', class: 'text-warning-700' },
|
|
94
100
|
// ===== Error =====
|
|
95
101
|
{ variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },
|
|
96
|
-
{ variant: 'outline', color: 'error', class: 'border-error-
|
|
102
|
+
{ variant: 'outline', color: 'error', class: 'border-error-border text-error-700 hover:bg-error-50' },
|
|
97
103
|
{ variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },
|
|
98
104
|
{ variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },
|
|
99
105
|
{ variant: 'link', color: 'error', class: 'text-error-700' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-button.mjs","sources":["../../../projects/ngx-tw/button/button.ts","../../../projects/ngx-tw/button/cdevhub-ngx-tw-button.ts"],"sourcesContent":["import {\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n type OnInit,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the button. */\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'soft' | 'link';\n\nconst buttonVariants = tv({\n base: 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium transition-colors duration-normal motion-reduce:transition-none cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n variants: {\n variant: {\n solid: '',\n outline: 'border',\n ghost: '',\n soft: '',\n link: 'underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n secondary: '',\n accent: '',\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n },\n // Pinned control heights — see `docs/vertical-rhythm.md`. Vertical padding\n // is deliberately absent: the height is declared, not derived. The\n // `outline` variant's 1px border sits *inside* the pinned box under\n // Preflight's global `box-sizing: border-box`, so outline and solid now\n // measure identically at every size (they used to differ by 2px).\n size: {\n xs: 'px-2 text-xs h-6',\n sm: 'px-3 text-sm h-8',\n md: 'px-4 text-sm h-9',\n lg: 'px-5 text-base h-11',\n xl: 'px-6 text-base h-12',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n false: '',\n },\n loading: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants use the semantic `${color}-solid` token pair so the\n // theme layer owns the AA-contrast bg/fg pairing for each color. Raw\n // `${color}-600` direct usage was violating CLAUDE.md and producing\n // sub-AA contrast for info / success in light mode.\n\n // ===== Primary =====\n { variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },\n { variant: 'outline', color: 'primary', class: 'border-primary-300 text-primary-700 hover:bg-primary-50' },\n { variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },\n { variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },\n { variant: 'link', color: 'primary', class: 'text-primary-700' },\n\n // ===== Secondary =====\n { variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },\n { variant: 'outline', color: 'secondary', class: 'border-secondary-300 text-secondary-700 hover:bg-secondary-50' },\n { variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },\n { variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },\n { variant: 'link', color: 'secondary', class: 'text-secondary-700' },\n\n // ===== Accent =====\n { variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },\n { variant: 'outline', color: 'accent', class: 'border-accent-300 text-accent-700 hover:bg-accent-50' },\n { variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },\n { variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },\n { variant: 'link', color: 'accent', class: 'text-accent-700' },\n\n // ===== Neutral ===== (subdued solid pairs surface-muted with text-fg; on-neutral is white and would be unreadable here)\n { variant: 'solid', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'outline', color: 'neutral', class: 'border-border text-fg hover:bg-surface-muted' },\n { variant: 'ghost', color: 'neutral', class: 'text-fg-muted hover:bg-surface-muted' },\n { variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'link', color: 'neutral', class: 'text-fg-muted' },\n\n // ===== Info =====\n { variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },\n { variant: 'outline', color: 'info', class: 'border-info-300 text-info-700 hover:bg-info-50' },\n { variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },\n { variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },\n { variant: 'link', color: 'info', class: 'text-info-700' },\n\n // ===== Success =====\n { variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },\n { variant: 'outline', color: 'success', class: 'border-success-300 text-success-700 hover:bg-success-50' },\n { variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },\n { variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },\n { variant: 'link', color: 'success', class: 'text-success-700' },\n\n // ===== Warning =====\n { variant: 'solid', color: 'warning', class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover' },\n { variant: 'outline', color: 'warning', class: 'border-warning-300 text-warning-700 hover:bg-warning-50' },\n { variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },\n { variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },\n { variant: 'link', color: 'warning', class: 'text-warning-700' },\n\n // ===== Error =====\n { variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },\n { variant: 'outline', color: 'error', class: 'border-error-300 text-error-700 hover:bg-error-50' },\n { variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },\n { variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },\n { variant: 'link', color: 'error', class: 'text-error-700' },\n\n // ===== Link variant: strip padding, and opt out of the pinned height =====\n // `link` has no box — no border, no fill — so it is not part of the\n // form-row cohort in `docs/vertical-rhythm.md` and must stay text-shaped:\n // pinning it to `h-9` would blow out the line box of any paragraph it sits\n // in. `h-auto` collapses the size variant's `h-*` via twMerge (same group,\n // compoundVariants apply last), leaving the height equal to the line box —\n // exactly what `py-0` produced before this migration.\n { variant: 'link', size: 'xs', class: 'px-0 h-auto' },\n { variant: 'link', size: 'sm', class: 'px-0 h-auto' },\n { variant: 'link', size: 'md', class: 'px-0 h-auto' },\n { variant: 'link', size: 'lg', class: 'px-0 h-auto' },\n { variant: 'link', size: 'xl', class: 'px-0 h-auto' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n loading: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Enhances a native `<button>` or `<a>` element with library styling, semantic\n * color/size variants, and disabled/loading states. The directive does not\n * expose a `clicked` output — bind `(click)` directly on the host element. When\n * `disabled` or `loading` is true, the directive intercepts clicks with\n * `preventDefault()` + `stopImmediatePropagation()` so the host handler does\n * not run.\n *\n * The directive owns no template, so visual loading affordances (spinner,\n * status text) are composed by the consumer — see the `loading` input.\n */\n@Directive({\n selector: '[twButton]',\n exportAs: 'twButton',\n host: {\n '[class]': 'classes()',\n '[attr.aria-disabled]': 'disabled() || loading() || null',\n '[attr.aria-busy]': 'loading() || null',\n '[attr.disabled]': 'isNativeButton() && (disabled() || loading()) ? true : null',\n '[attr.tabindex]': '!isNativeButton() && (disabled() || loading()) ? -1 : null',\n '(click)': 'handleClick($event)',\n },\n})\nexport class ButtonDirective implements OnInit {\n /** Controls the visual style. Defaults to `'solid'`. */\n readonly variant = input<ButtonVariant>('solid');\n\n /** Sets the semantic color palette. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls the size (padding, font size, icon size). Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, prevents interaction and applies muted styling. Defaults to `false`. */\n readonly disabled = input(false);\n\n /**\n * When true, blocks clicks and sets `aria-busy=\"true\"`. Defaults to `false`.\n * The directive does not render a spinner or status text — compose them in\n * the projected content:\n *\n * ```html\n * <button twButton [loading]=\"saving()\">\n * @if (saving()) {\n * <tw-spinner twButtonIcon size=\"sm\" />\n * <span class=\"sr-only\">Saving…</span>\n * }\n * Save\n * </button>\n * ```\n *\n * The `sr-only` text gives assistive tech an explicit status announcement\n * to pair with the `aria-busy` attribute.\n */\n readonly loading = input(false);\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isNativeButton = computed(\n () => this.elementRef.nativeElement.tagName === 'BUTTON',\n );\n\n readonly classes = computed(() =>\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n disabled: this.disabled() || this.loading(),\n loading: this.loading(),\n }),\n );\n\n ngOnInit(): void {\n this.focusMonitor.monitor(this.elementRef);\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n /** @internal Swallows clicks while the button is disabled or loading, so neither navigation nor consumer handlers run. */\n handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n\n@Directive({\n selector: '[twButtonIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ButtonIconDirective {\n /**\n * Position of the icon relative to the button label. Defaults to `'leading'`.\n *\n * The empty-string member of the union is load-bearing: Angular binds `''` to\n * the input when the selector is used as a bare attribute (`<svg twButtonIcon>`),\n * which is the canonical \"leading\" usage. Templates that omit a value still\n * have the directive attached and resolve to leading placement at runtime via\n * the `=== 'trailing'` check below.\n */\n readonly twButtonIcon = input<'' | 'leading' | 'trailing'>('leading');\n\n private readonly button = inject(ButtonDirective);\n\n readonly classes = computed(() => {\n const size = this.button.size();\n const iconSize = size === 'xs' || size === 'sm' ? 'size-4' : 'size-5';\n // `order-last` only takes effect when the button host is a flex container —\n // `ButtonDirective`'s base class includes `inline-flex`, which is the\n // contract this directive relies on for trailing-icon placement.\n const order = this.twButtonIcon() === 'trailing' ? 'order-last' : '';\n return [iconSize, 'shrink-0', order].filter(Boolean).join(' ');\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-button.mjs","sources":["../../../projects/ngx-tw/button/button.ts","../../../projects/ngx-tw/button/cdevhub-ngx-tw-button.ts"],"sourcesContent":["import {\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n type OnInit,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the button. */\nexport type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'soft' | 'link';\n\nconst buttonVariants = tv({\n base: 'inline-flex items-center justify-center gap-1.5 rounded-md font-medium transition-colors duration-normal motion-reduce:transition-none cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n variants: {\n variant: {\n solid: '',\n outline: 'border',\n ghost: '',\n soft: '',\n link: 'underline-offset-4 hover:underline',\n },\n color: {\n primary: '',\n secondary: '',\n accent: '',\n neutral: '',\n info: '',\n success: '',\n warning: '',\n error: '',\n },\n // Pinned control heights — see `docs/vertical-rhythm.md`. Vertical padding\n // is deliberately absent: the height is declared, not derived. The\n // `outline` variant's 1px border sits *inside* the pinned box under\n // Preflight's global `box-sizing: border-box`, so outline and solid now\n // measure identically at every size (they used to differ by 2px).\n size: {\n xs: 'px-2 text-xs h-6',\n sm: 'px-3 text-sm h-8',\n md: 'px-4 text-sm h-9',\n lg: 'px-5 text-base h-11',\n xl: 'px-6 text-base h-12',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n false: '',\n },\n loading: {\n true: 'pointer-events-none',\n false: '',\n },\n },\n compoundVariants: [\n // Solid variants use the semantic `${color}-solid` token pair so the\n // theme layer owns the AA-contrast bg/fg pairing for each color. Raw\n // `${color}-600` direct usage was violating CLAUDE.md and producing\n // sub-AA contrast for info / success in light mode.\n\n // ===== Primary =====\n { variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },\n { variant: 'outline', color: 'primary', class: 'border-primary-border text-primary-700 hover:bg-primary-50' },\n { variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },\n { variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },\n { variant: 'link', color: 'primary', class: 'text-primary-700' },\n\n // ===== Secondary =====\n { variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },\n { variant: 'outline', color: 'secondary', class: 'border-secondary-border text-secondary-700 hover:bg-secondary-50' },\n { variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },\n { variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },\n { variant: 'link', color: 'secondary', class: 'text-secondary-700' },\n\n // ===== Accent =====\n { variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },\n { variant: 'outline', color: 'accent', class: 'border-accent-border text-accent-700 hover:bg-accent-50' },\n { variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },\n { variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },\n { variant: 'link', color: 'accent', class: 'text-accent-700' },\n\n // ===== Neutral ===== (subdued solid pairs surface-muted with text-fg; on-neutral is white and would be unreadable here)\n { variant: 'solid', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'outline', color: 'neutral', class: 'border-border text-fg hover:bg-surface-muted' },\n { variant: 'ghost', color: 'neutral', class: 'text-fg-muted hover:bg-surface-muted' },\n { variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },\n { variant: 'link', color: 'neutral', class: 'text-fg-muted' },\n\n // ===== Info =====\n { variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },\n { variant: 'outline', color: 'info', class: 'border-info-border text-info-700 hover:bg-info-50' },\n { variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },\n { variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },\n { variant: 'link', color: 'info', class: 'text-info-700' },\n\n // ===== Success =====\n { variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },\n { variant: 'outline', color: 'success', class: 'border-success-border text-success-700 hover:bg-success-50' },\n { variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },\n { variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },\n { variant: 'link', color: 'success', class: 'text-success-700' },\n\n // ===== Warning =====\n {\n variant: 'solid',\n color: 'warning',\n // See badge.ts: amber-500 is load-bearing for the dark-on-yellow glyph, so\n // the boundary carries SC 1.4.11 (1.95:1 light / 1.56:1 high-contrast).\n class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover ring-1 ring-inset ring-warning-border-strong',\n },\n { variant: 'outline', color: 'warning', class: 'border-warning-border text-warning-700 hover:bg-warning-50' },\n { variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },\n { variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },\n { variant: 'link', color: 'warning', class: 'text-warning-700' },\n\n // ===== Error =====\n { variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },\n { variant: 'outline', color: 'error', class: 'border-error-border text-error-700 hover:bg-error-50' },\n { variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },\n { variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },\n { variant: 'link', color: 'error', class: 'text-error-700' },\n\n // ===== Link variant: strip padding, and opt out of the pinned height =====\n // `link` has no box — no border, no fill — so it is not part of the\n // form-row cohort in `docs/vertical-rhythm.md` and must stay text-shaped:\n // pinning it to `h-9` would blow out the line box of any paragraph it sits\n // in. `h-auto` collapses the size variant's `h-*` via twMerge (same group,\n // compoundVariants apply last), leaving the height equal to the line box —\n // exactly what `py-0` produced before this migration.\n { variant: 'link', size: 'xs', class: 'px-0 h-auto' },\n { variant: 'link', size: 'sm', class: 'px-0 h-auto' },\n { variant: 'link', size: 'md', class: 'px-0 h-auto' },\n { variant: 'link', size: 'lg', class: 'px-0 h-auto' },\n { variant: 'link', size: 'xl', class: 'px-0 h-auto' },\n ],\n defaultVariants: {\n variant: 'solid',\n color: 'primary',\n size: 'md',\n disabled: false,\n loading: false,\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Enhances a native `<button>` or `<a>` element with library styling, semantic\n * color/size variants, and disabled/loading states. The directive does not\n * expose a `clicked` output — bind `(click)` directly on the host element. When\n * `disabled` or `loading` is true, the directive intercepts clicks with\n * `preventDefault()` + `stopImmediatePropagation()` so the host handler does\n * not run.\n *\n * The directive owns no template, so visual loading affordances (spinner,\n * status text) are composed by the consumer — see the `loading` input.\n */\n@Directive({\n selector: '[twButton]',\n exportAs: 'twButton',\n host: {\n '[class]': 'classes()',\n '[attr.aria-disabled]': 'disabled() || loading() || null',\n '[attr.aria-busy]': 'loading() || null',\n '[attr.disabled]': 'isNativeButton() && (disabled() || loading()) ? true : null',\n '[attr.tabindex]': '!isNativeButton() && (disabled() || loading()) ? -1 : null',\n '(click)': 'handleClick($event)',\n },\n})\nexport class ButtonDirective implements OnInit {\n /** Controls the visual style. Defaults to `'solid'`. */\n readonly variant = input<ButtonVariant>('solid');\n\n /** Sets the semantic color palette. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls the size (padding, font size, icon size). Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, prevents interaction and applies muted styling. Defaults to `false`. */\n readonly disabled = input(false);\n\n /**\n * When true, blocks clicks and sets `aria-busy=\"true\"`. Defaults to `false`.\n * The directive does not render a spinner or status text — compose them in\n * the projected content:\n *\n * ```html\n * <button twButton [loading]=\"saving()\">\n * @if (saving()) {\n * <tw-spinner twButtonIcon size=\"sm\" />\n * <span class=\"sr-only\">Saving…</span>\n * }\n * Save\n * </button>\n * ```\n *\n * The `sr-only` text gives assistive tech an explicit status announcement\n * to pair with the `aria-busy` attribute.\n */\n readonly loading = input(false);\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly isNativeButton = computed(\n () => this.elementRef.nativeElement.tagName === 'BUTTON',\n );\n\n readonly classes = computed(() =>\n buttonVariants({\n variant: this.variant(),\n color: this.color(),\n size: this.size(),\n disabled: this.disabled() || this.loading(),\n loading: this.loading(),\n }),\n );\n\n ngOnInit(): void {\n this.focusMonitor.monitor(this.elementRef);\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n }\n\n /** @internal Swallows clicks while the button is disabled or loading, so neither navigation nor consumer handlers run. */\n handleClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n\n@Directive({\n selector: '[twButtonIcon]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class ButtonIconDirective {\n /**\n * Position of the icon relative to the button label. Defaults to `'leading'`.\n *\n * The empty-string member of the union is load-bearing: Angular binds `''` to\n * the input when the selector is used as a bare attribute (`<svg twButtonIcon>`),\n * which is the canonical \"leading\" usage. Templates that omit a value still\n * have the directive attached and resolve to leading placement at runtime via\n * the `=== 'trailing'` check below.\n */\n readonly twButtonIcon = input<'' | 'leading' | 'trailing'>('leading');\n\n private readonly button = inject(ButtonDirective);\n\n readonly classes = computed(() => {\n const size = this.button.size();\n const iconSize = size === 'xs' || size === 'sm' ? 'size-4' : 'size-5';\n // `order-last` only takes effect when the button host is a flex container —\n // `ButtonDirective`'s base class includes `inline-flex`, which is the\n // contract this directive relies on for trailing-icon placement.\n const order = this.twButtonIcon() === 'trailing' ? 'order-last' : '';\n return [iconSize, 'shrink-0', order].filter(Boolean).join(' ');\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -45,13 +45,13 @@ const cardVariants = tv({
|
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
47
|
compoundVariants: [
|
|
48
|
-
{ variant: 'outline', color: 'primary', class: { root: 'border-primary-
|
|
49
|
-
{ variant: 'outline', color: 'secondary', class: { root: 'border-secondary-
|
|
50
|
-
{ variant: 'outline', color: 'accent', class: { root: 'border-accent-
|
|
51
|
-
{ variant: 'outline', color: 'info', class: { root: 'border-info-
|
|
52
|
-
{ variant: 'outline', color: 'success', class: { root: 'border-success-
|
|
53
|
-
{ variant: 'outline', color: 'warning', class: { root: 'border-warning-
|
|
54
|
-
{ variant: 'outline', color: 'error', class: { root: 'border-error-
|
|
48
|
+
{ variant: 'outline', color: 'primary', class: { root: 'border-primary-border' } },
|
|
49
|
+
{ variant: 'outline', color: 'secondary', class: { root: 'border-secondary-border' } },
|
|
50
|
+
{ variant: 'outline', color: 'accent', class: { root: 'border-accent-border' } },
|
|
51
|
+
{ variant: 'outline', color: 'info', class: { root: 'border-info-border' } },
|
|
52
|
+
{ variant: 'outline', color: 'success', class: { root: 'border-success-border' } },
|
|
53
|
+
{ variant: 'outline', color: 'warning', class: { root: 'border-warning-border' } },
|
|
54
|
+
{ variant: 'outline', color: 'error', class: { root: 'border-error-border' } },
|
|
55
55
|
],
|
|
56
56
|
defaultVariants: {
|
|
57
57
|
variant: 'elevated',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-card.mjs","sources":["../../../projects/ngx-tw/card/card.ts","../../../projects/ngx-tw/card/cdevhub-ngx-tw-card.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n inject,\n input,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the card container. */\nexport type CardVariant = 'elevated' | 'outline' | 'ghost' | CardVariantLegacy;\n\n/**\n * Legacy `variant` spellings, kept so existing templates keep compiling.\n * @deprecated `'outlined'` is an alias for `'outline'` and renders identically.\n * It will be removed in the next major — prefer `'outline'`.\n */\nexport type CardVariantLegacy = 'outlined';\n\n/** Canonical `variant` spellings — the set `tv()` actually keys on. */\ntype CardVariantCanonical = Exclude<CardVariant, CardVariantLegacy>;\n\n/** Maps every legacy spelling onto its canonical replacement. */\nconst VARIANT_ALIASES: Readonly<Record<CardVariantLegacy, CardVariantCanonical>> = {\n outlined: 'outline',\n};\n\nconst cardVariants = tv({\n slots: {\n root: 'rounded-lg text-fg overflow-hidden',\n header: 'text-sm font-semibold text-fg border-b border-border',\n body: 'text-sm text-fg',\n footer: 'text-xs text-fg-muted border-t border-border',\n media: 'w-full overflow-hidden',\n },\n variants: {\n variant: {\n elevated: {\n root: 'bg-surface-raised shadow hover:shadow-md transition-shadow duration-normal motion-reduce:transition-none',\n },\n outline: {\n root: 'bg-surface border border-border',\n },\n ghost: {\n root: 'bg-transparent',\n },\n },\n size: {\n xs: { header: 'p-2', body: 'p-2', footer: 'p-2' },\n sm: { header: 'p-3', body: 'p-3', footer: 'p-3' },\n md: { header: 'p-4', body: 'p-4', footer: 'p-4' },\n lg: { header: 'p-6', body: 'p-6', footer: 'p-6' },\n xl: { header: 'p-8', body: 'p-8', footer: 'p-8' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n },\n compoundVariants: [\n { variant: 'outline', color: 'primary', class: { root: 'border-primary-300' } },\n { variant: 'outline', color: 'secondary', class: { root: 'border-secondary-300' } },\n { variant: 'outline', color: 'accent', class: { root: 'border-accent-300' } },\n { variant: 'outline', color: 'info', class: { root: 'border-info-300' } },\n { variant: 'outline', color: 'success', class: { root: 'border-success-300' } },\n { variant: 'outline', color: 'warning', class: { root: 'border-warning-300' } },\n { variant: 'outline', color: 'error', class: { root: 'border-error-300' } },\n ],\n defaultVariants: {\n variant: 'elevated',\n color: 'neutral',\n size: 'md',\n },\n}, {\n twMerge: true,\n});\n\n@Component({\n selector: 'tw-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `<ng-content />`,\n})\nexport class CardComponent {\n /** Controls the visual elevation style. Defaults to `'elevated'`. `'outlined'` is a deprecated alias for `'outline'` and renders identically. */\n readonly variant = input<CardVariant>('elevated');\n\n /** Sets the semantic color for bordered regions. Only applies to `outline` variant borders. Defaults to `'neutral'`. */\n readonly color = input<TwColor>('neutral');\n\n /** Controls padding of header, body, and footer sections. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** @internal Canonical variant with legacy spellings folded in. */\n private readonly resolvedVariant = computed<CardVariantCanonical>(() => {\n const v = this.variant();\n return (VARIANT_ALIASES as Record<string, CardVariantCanonical | undefined>)[v] ?? (v as CardVariantCanonical);\n });\n\n private readonly variantResult = computed(() =>\n cardVariants({\n variant: this.resolvedVariant(),\n color: this.color(),\n size: this.size(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly headerClasses = computed(() => this.variantResult().header());\n readonly bodyClasses = computed(() => this.variantResult().body());\n readonly footerClasses = computed(() => this.variantResult().footer());\n readonly mediaClasses = computed(() => this.variantResult().media());\n}\n\n@Directive({\n selector: '[twCardHeader]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardHeaderDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.headerClasses;\n}\n\n@Directive({\n selector: '[twCardBody]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardBodyDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.bodyClasses;\n}\n\n@Directive({\n selector: '[twCardFooter]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardFooterDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.footerClasses;\n}\n\n@Directive({\n selector: '[twCardMedia]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardMediaDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.mediaClasses;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAwBA;AACA,MAAM,eAAe,GAA8D;AACjF,IAAA,QAAQ,EAAE,SAAS;CACpB;AAED,MAAM,YAAY,GAAG,EAAE,CAAC;AACtB,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE,oCAAoC;AAC1C,QAAA,MAAM,EAAE,sDAAsD;AAC9D,QAAA,IAAI,EAAE,iBAAiB;AACvB,QAAA,MAAM,EAAE,8CAA8C;AACtD,QAAA,KAAK,EAAE,wBAAwB;AAChC,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,QAAQ,EAAE;AACR,gBAAA,IAAI,EAAE,0GAA0G;AACjH,aAAA;AACD,YAAA,OAAO,EAAE;AACP,gBAAA,IAAI,EAAE,iCAAiC;AACxC,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE,gBAAgB;AACvB,aAAA;AACF,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AACjD,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;AAClD,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACF,KAAA;AACD,IAAA,gBAAgB,EAAE;AAChB,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE;AAC/E,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE;AACnF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;AAC7E,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE;AACzE,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE;AAC/E,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE;AAC/E,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE;AAC5E,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;CACF,EAAE;AACD,IAAA,OAAO,EAAE,IAAI;AACd,CAAA,CAAC;MAUW,aAAa,CAAA;;IAEf,OAAO,GAAG,KAAK,CAAc,UAAU;gFAAC;;IAGxC,KAAK,GAAG,KAAK,CAAU,SAAS;8EAAC;;IAGjC,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;;AAGlB,IAAA,eAAe,GAAG,QAAQ,CAAuB,MAAK;AACrE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,OAAQ,eAAoE,CAAC,CAAC,CAAC,IAAK,CAA0B;IAChH,CAAC;wFAAC;AAEe,IAAA,aAAa,GAAG,QAAQ,CAAC,MACxC,YAAY,CAAC;AACX,QAAA,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE;AAC/B,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KAClB,CAAC;sFACH;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE;oFAAC;AACzD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;sFAAC;AAC7D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE;oFAAC;AACzD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;sFAAC;AAC7D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE;qFAAC;uGA5BzD,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,8eAFd,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEf,aAAa,EAAA,UAAA,EAAA,CAAA;kBARzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;oBACnB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC3B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;MAsCY,mBAAmB,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;AACpC,IAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;uGAF/B,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;MAYY,iBAAiB,CAAA;AACX,IAAA,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;AACpC,IAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;uGAF7B,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;MAYY,mBAAmB,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;AACpC,IAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;uGAF/B,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;MAYY,kBAAkB,CAAA;AACZ,IAAA,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;AACpC,IAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY;uGAF9B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACvB,qBAAA;AACF,iBAAA;;;AClKD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"cdevhub-ngx-tw-card.mjs","sources":["../../../projects/ngx-tw/card/card.ts","../../../projects/ngx-tw/card/cdevhub-ngx-tw-card.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n Directive,\n inject,\n input,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the card container. */\nexport type CardVariant = 'elevated' | 'outline' | 'ghost' | CardVariantLegacy;\n\n/**\n * Legacy `variant` spellings, kept so existing templates keep compiling.\n * @deprecated `'outlined'` is an alias for `'outline'` and renders identically.\n * It will be removed in the next major — prefer `'outline'`.\n */\nexport type CardVariantLegacy = 'outlined';\n\n/** Canonical `variant` spellings — the set `tv()` actually keys on. */\ntype CardVariantCanonical = Exclude<CardVariant, CardVariantLegacy>;\n\n/** Maps every legacy spelling onto its canonical replacement. */\nconst VARIANT_ALIASES: Readonly<Record<CardVariantLegacy, CardVariantCanonical>> = {\n outlined: 'outline',\n};\n\nconst cardVariants = tv({\n slots: {\n root: 'rounded-lg text-fg overflow-hidden',\n header: 'text-sm font-semibold text-fg border-b border-border',\n body: 'text-sm text-fg',\n footer: 'text-xs text-fg-muted border-t border-border',\n media: 'w-full overflow-hidden',\n },\n variants: {\n variant: {\n elevated: {\n root: 'bg-surface-raised shadow hover:shadow-md transition-shadow duration-normal motion-reduce:transition-none',\n },\n outline: {\n root: 'bg-surface border border-border',\n },\n ghost: {\n root: 'bg-transparent',\n },\n },\n size: {\n xs: { header: 'p-2', body: 'p-2', footer: 'p-2' },\n sm: { header: 'p-3', body: 'p-3', footer: 'p-3' },\n md: { header: 'p-4', body: 'p-4', footer: 'p-4' },\n lg: { header: 'p-6', body: 'p-6', footer: 'p-6' },\n xl: { header: 'p-8', body: 'p-8', footer: 'p-8' },\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n },\n compoundVariants: [\n { variant: 'outline', color: 'primary', class: { root: 'border-primary-border' } },\n { variant: 'outline', color: 'secondary', class: { root: 'border-secondary-border' } },\n { variant: 'outline', color: 'accent', class: { root: 'border-accent-border' } },\n { variant: 'outline', color: 'info', class: { root: 'border-info-border' } },\n { variant: 'outline', color: 'success', class: { root: 'border-success-border' } },\n { variant: 'outline', color: 'warning', class: { root: 'border-warning-border' } },\n { variant: 'outline', color: 'error', class: { root: 'border-error-border' } },\n ],\n defaultVariants: {\n variant: 'elevated',\n color: 'neutral',\n size: 'md',\n },\n}, {\n twMerge: true,\n});\n\n@Component({\n selector: 'tw-card',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'rootClasses()',\n },\n template: `<ng-content />`,\n})\nexport class CardComponent {\n /** Controls the visual elevation style. Defaults to `'elevated'`. `'outlined'` is a deprecated alias for `'outline'` and renders identically. */\n readonly variant = input<CardVariant>('elevated');\n\n /** Sets the semantic color for bordered regions. Only applies to `outline` variant borders. Defaults to `'neutral'`. */\n readonly color = input<TwColor>('neutral');\n\n /** Controls padding of header, body, and footer sections. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** @internal Canonical variant with legacy spellings folded in. */\n private readonly resolvedVariant = computed<CardVariantCanonical>(() => {\n const v = this.variant();\n return (VARIANT_ALIASES as Record<string, CardVariantCanonical | undefined>)[v] ?? (v as CardVariantCanonical);\n });\n\n private readonly variantResult = computed(() =>\n cardVariants({\n variant: this.resolvedVariant(),\n color: this.color(),\n size: this.size(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly headerClasses = computed(() => this.variantResult().header());\n readonly bodyClasses = computed(() => this.variantResult().body());\n readonly footerClasses = computed(() => this.variantResult().footer());\n readonly mediaClasses = computed(() => this.variantResult().media());\n}\n\n@Directive({\n selector: '[twCardHeader]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardHeaderDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.headerClasses;\n}\n\n@Directive({\n selector: '[twCardBody]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardBodyDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.bodyClasses;\n}\n\n@Directive({\n selector: '[twCardFooter]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardFooterDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.footerClasses;\n}\n\n@Directive({\n selector: '[twCardMedia]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class CardMediaDirective {\n private readonly card = inject(CardComponent);\n readonly classes = this.card.mediaClasses;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -118,7 +118,7 @@ const SOLID_BOX = {
|
|
|
118
118
|
neutral: 'bg-fg border-fg',
|
|
119
119
|
info: 'bg-info-600 border-info-600',
|
|
120
120
|
success: 'bg-success-600 border-success-600',
|
|
121
|
-
warning: 'bg-warning-500 border-warning-
|
|
121
|
+
warning: 'bg-warning-500 border-warning-border-strong',
|
|
122
122
|
error: 'bg-error-600 border-error-600',
|
|
123
123
|
};
|
|
124
124
|
const SOLID_ICON = {
|
|
@@ -138,7 +138,7 @@ const OUTLINE_BOX = {
|
|
|
138
138
|
neutral: 'bg-surface border-fg',
|
|
139
139
|
info: 'bg-surface border-info-600',
|
|
140
140
|
success: 'bg-surface border-success-600',
|
|
141
|
-
warning: 'bg-surface border-warning-
|
|
141
|
+
warning: 'bg-surface border-warning-border-strong',
|
|
142
142
|
error: 'bg-surface border-error-600',
|
|
143
143
|
};
|
|
144
144
|
const OUTLINE_ICON = {
|