@cdevhub/ngx-tw 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +8 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +8 -2
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +8 -9
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +10 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +2 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +6 -2
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +10 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +3 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +5 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +11 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/package.json +4 -1
- package/theme/_dark.css +16 -12
- package/theme/_semantic.css +3 -2
- package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
- package/types/cdevhub-ngx-tw-select.d.ts +1 -1
- package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
|
@@ -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 */\ntype 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, {}>,\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 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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"}
|
|
@@ -40,20 +40,24 @@ const buttonVariants = tv({
|
|
|
40
40
|
},
|
|
41
41
|
},
|
|
42
42
|
compoundVariants: [
|
|
43
|
+
// Solid variants use the semantic `${color}-solid` token pair so the
|
|
44
|
+
// theme layer owns the AA-contrast bg/fg pairing for each color. Raw
|
|
45
|
+
// `${color}-600` direct usage was violating CLAUDE.md and producing
|
|
46
|
+
// sub-AA contrast for info / success in light mode.
|
|
43
47
|
// ===== Primary =====
|
|
44
|
-
{ variant: 'solid', color: 'primary', class: 'bg-primary-
|
|
48
|
+
{ variant: 'solid', color: 'primary', class: 'bg-primary-solid text-on-primary hover:bg-primary-solid-hover' },
|
|
45
49
|
{ variant: 'outline', color: 'primary', class: 'border-primary-300 text-primary-700 hover:bg-primary-50' },
|
|
46
50
|
{ variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },
|
|
47
51
|
{ variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },
|
|
48
52
|
{ variant: 'link', color: 'primary', class: 'text-primary-700' },
|
|
49
53
|
// ===== Secondary =====
|
|
50
|
-
{ variant: 'solid', color: 'secondary', class: 'bg-secondary-
|
|
54
|
+
{ variant: 'solid', color: 'secondary', class: 'bg-secondary-solid text-on-secondary hover:bg-secondary-solid-hover' },
|
|
51
55
|
{ variant: 'outline', color: 'secondary', class: 'border-secondary-300 text-secondary-700 hover:bg-secondary-50' },
|
|
52
56
|
{ variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },
|
|
53
57
|
{ variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },
|
|
54
58
|
{ variant: 'link', color: 'secondary', class: 'text-secondary-700' },
|
|
55
59
|
// ===== Accent =====
|
|
56
|
-
{ variant: 'solid', color: 'accent', class: 'bg-accent-
|
|
60
|
+
{ variant: 'solid', color: 'accent', class: 'bg-accent-solid text-on-accent hover:bg-accent-solid-hover' },
|
|
57
61
|
{ variant: 'outline', color: 'accent', class: 'border-accent-300 text-accent-700 hover:bg-accent-50' },
|
|
58
62
|
{ variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },
|
|
59
63
|
{ variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },
|
|
@@ -65,25 +69,25 @@ const buttonVariants = tv({
|
|
|
65
69
|
{ variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },
|
|
66
70
|
{ variant: 'link', color: 'neutral', class: 'text-fg-muted' },
|
|
67
71
|
// ===== Info =====
|
|
68
|
-
{ variant: 'solid', color: 'info', class: 'bg-info-
|
|
72
|
+
{ variant: 'solid', color: 'info', class: 'bg-info-solid text-on-info hover:bg-info-solid-hover' },
|
|
69
73
|
{ variant: 'outline', color: 'info', class: 'border-info-300 text-info-700 hover:bg-info-50' },
|
|
70
74
|
{ variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },
|
|
71
75
|
{ variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },
|
|
72
76
|
{ variant: 'link', color: 'info', class: 'text-info-700' },
|
|
73
77
|
// ===== Success =====
|
|
74
|
-
{ variant: 'solid', color: 'success', class: 'bg-success-
|
|
78
|
+
{ variant: 'solid', color: 'success', class: 'bg-success-solid text-on-success hover:bg-success-solid-hover' },
|
|
75
79
|
{ variant: 'outline', color: 'success', class: 'border-success-300 text-success-700 hover:bg-success-50' },
|
|
76
80
|
{ variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },
|
|
77
81
|
{ variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },
|
|
78
82
|
{ variant: 'link', color: 'success', class: 'text-success-700' },
|
|
79
83
|
// ===== Warning =====
|
|
80
|
-
{ variant: 'solid', color: 'warning', class: 'bg-warning-
|
|
84
|
+
{ variant: 'solid', color: 'warning', class: 'bg-warning-solid text-on-warning hover:bg-warning-solid-hover' },
|
|
81
85
|
{ variant: 'outline', color: 'warning', class: 'border-warning-300 text-warning-700 hover:bg-warning-50' },
|
|
82
86
|
{ variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },
|
|
83
87
|
{ variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },
|
|
84
88
|
{ variant: 'link', color: 'warning', class: 'text-warning-700' },
|
|
85
89
|
// ===== Error =====
|
|
86
|
-
{ variant: 'solid', color: 'error', class: 'bg-error-
|
|
90
|
+
{ variant: 'solid', color: 'error', class: 'bg-error-solid text-on-error hover:bg-error-solid-hover' },
|
|
87
91
|
{ variant: 'outline', color: 'error', class: 'border-error-300 text-error-700 hover:bg-error-50' },
|
|
88
92
|
{ variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },
|
|
89
93
|
{ variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },
|
|
@@ -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 size: {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-5 py-2.5 text-base',\n xl: 'px-6 py-3 text-base',\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 // ===== Primary =====\n { variant: 'solid', color: 'primary', class: 'bg-primary-600 text-on-primary hover:bg-primary-700' },\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-600 text-on-secondary hover:bg-secondary-700' },\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-600 text-on-accent hover:bg-accent-700' },\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-600 text-on-info hover:bg-info-700' },\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-600 text-on-success hover:bg-success-700' },\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-500 text-on-warning hover:bg-warning-600' },\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-600 text-on-error hover:bg-error-700' },\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 =====\n { variant: 'link', size: 'xs', class: 'px-0 py-0' },\n { variant: 'link', size: 'sm', class: 'px-0 py-0' },\n { variant: 'link', size: 'md', class: 'px-0 py-0' },\n { variant: 'link', size: 'lg', class: 'px-0 py-0' },\n { variant: 'link', size: 'xl', class: 'px-0 py-0' },\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 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 size: {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-sm',\n md: 'px-4 py-2 text-sm',\n lg: 'px-5 py-2.5 text-base',\n xl: 'px-6 py-3 text-base',\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 =====\n { variant: 'link', size: 'xs', class: 'px-0 py-0' },\n { variant: 'link', size: 'sm', class: 'px-0 py-0' },\n { variant: 'link', size: 'md', class: 'px-0 py-0' },\n { variant: 'link', size: 'lg', class: 'px-0 py-0' },\n { variant: 'link', size: 'xl', class: 'px-0 py-0' },\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 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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"}
|
|
@@ -3780,6 +3780,9 @@ function wireSignalFormsInputs(host, api) {
|
|
|
3780
3780
|
* template. When the mode attribute is omitted, consumers bind the component
|
|
3781
3781
|
* directly — the CVA path handles reactive / template-driven forms.
|
|
3782
3782
|
*/
|
|
3783
|
+
// Selector matches the existing CalendarComponent input `mode="single"`;
|
|
3784
|
+
// renaming to `twMode` would break the public API. The directive is scoped
|
|
3785
|
+
// to the `tw-calendar` element so the unprefixed attribute is safe.
|
|
3783
3786
|
class CalendarSingleDirective {
|
|
3784
3787
|
host = inject(CalendarComponent, { self: true });
|
|
3785
3788
|
/** Two-way value, forwarded to the hosting `CalendarComponent`. Signal Forms `Field` binds against this. */
|
|
@@ -3809,6 +3812,7 @@ class CalendarSingleDirective {
|
|
|
3809
3812
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CalendarSingleDirective, decorators: [{
|
|
3810
3813
|
type: Directive,
|
|
3811
3814
|
args: [{
|
|
3815
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
3812
3816
|
selector: 'tw-calendar[mode="single"]',
|
|
3813
3817
|
exportAs: 'twCalendarSingle',
|
|
3814
3818
|
}]
|
|
@@ -3817,6 +3821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
3817
3821
|
* Signal Forms strict binding for `CalendarComponent` in `multiple` mode.
|
|
3818
3822
|
* Implements `FormValueControl<D[]>`.
|
|
3819
3823
|
*/
|
|
3824
|
+
// See note above on the single-mode directive — same rationale.
|
|
3820
3825
|
class CalendarMultipleDirective {
|
|
3821
3826
|
host = inject(CalendarComponent, { self: true });
|
|
3822
3827
|
/** Two-way value, forwarded to the hosting `CalendarComponent`. Signal Forms `Field` binds against this. */
|
|
@@ -3846,6 +3851,7 @@ class CalendarMultipleDirective {
|
|
|
3846
3851
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CalendarMultipleDirective, decorators: [{
|
|
3847
3852
|
type: Directive,
|
|
3848
3853
|
args: [{
|
|
3854
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
3849
3855
|
selector: 'tw-calendar[mode="multiple"]',
|
|
3850
3856
|
exportAs: 'twCalendarMultiple',
|
|
3851
3857
|
}]
|
|
@@ -3854,6 +3860,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
3854
3860
|
* Signal Forms strict binding for `CalendarComponent` in `range` mode.
|
|
3855
3861
|
* Implements `FormValueControl<{ start: D | null; end: D | null }>`.
|
|
3856
3862
|
*/
|
|
3863
|
+
// See note above on the single-mode directive — same rationale.
|
|
3857
3864
|
class CalendarRangeDirective {
|
|
3858
3865
|
host = inject(CalendarComponent, { self: true });
|
|
3859
3866
|
/** Two-way value, forwarded to the hosting `CalendarComponent`. Signal Forms `Field` binds against this. */
|
|
@@ -3883,6 +3890,7 @@ class CalendarRangeDirective {
|
|
|
3883
3890
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CalendarRangeDirective, decorators: [{
|
|
3884
3891
|
type: Directive,
|
|
3885
3892
|
args: [{
|
|
3893
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
3886
3894
|
selector: 'tw-calendar[mode="range"]',
|
|
3887
3895
|
exportAs: 'twCalendarRange',
|
|
3888
3896
|
}]
|
|
@@ -4221,7 +4229,6 @@ function warnUnresolvableLocaleOnce(locale) {
|
|
|
4221
4229
|
if (!isDevMode() || warnedLocales.has(locale))
|
|
4222
4230
|
return;
|
|
4223
4231
|
warnedLocales.add(locale);
|
|
4224
|
-
// eslint-disable-next-line no-console
|
|
4225
4232
|
console.warn(`[ngx-tw/calendar] Locale "${locale}" is unknown to Intl.Locale.getWeekInfo(); falling back to Monday (1) as the first day of week (§19.2).`);
|
|
4226
4233
|
}
|
|
4227
4234
|
/** `Intl`-driven `Date` adapter. Zero runtime dependencies. */
|