@cdevhub/ngx-tw 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
- package/package.json +265 -0
- package/theme/_base.css +394 -0
- package/theme/_dark.css +510 -0
- package/theme/_high-contrast.css +290 -0
- package/theme/_semantic.css +317 -0
- package/theme/_typography.css +9 -0
- package/theme/index.css +54 -0
- package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
- package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
- package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
- package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
- package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
- package/types/cdevhub-ngx-tw-button.d.ts +74 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
- package/types/cdevhub-ngx-tw-card.d.ts +48 -0
- package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
- package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
- package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
- package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
- package/types/cdevhub-ngx-tw-core.d.ts +719 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
- package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
- package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
- package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
- package/types/cdevhub-ngx-tw-input.d.ts +110 -0
- package/types/cdevhub-ngx-tw-item.d.ts +70 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
- package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
- package/types/cdevhub-ngx-tw-select.d.ts +384 -0
- package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
- package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
- package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
- package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
- package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
- package/types/cdevhub-ngx-tw-split.d.ts +265 -0
- package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
- package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
- package/types/cdevhub-ngx-tw-table.d.ts +479 -0
- package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
- package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
- package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
- package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
- package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
- package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
- package/types/cdevhub-ngx-tw.d.ts +49 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, inject, ElementRef, DestroyRef, computed, Directive } from '@angular/core';
|
|
3
|
+
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
4
|
+
import { tv } from 'tailwind-variants';
|
|
5
|
+
|
|
6
|
+
const buttonVariants = tv({
|
|
7
|
+
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',
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
solid: '',
|
|
11
|
+
outline: 'border',
|
|
12
|
+
ghost: '',
|
|
13
|
+
soft: '',
|
|
14
|
+
link: 'underline-offset-4 hover:underline',
|
|
15
|
+
},
|
|
16
|
+
color: {
|
|
17
|
+
primary: '',
|
|
18
|
+
secondary: '',
|
|
19
|
+
accent: '',
|
|
20
|
+
neutral: '',
|
|
21
|
+
info: '',
|
|
22
|
+
success: '',
|
|
23
|
+
warning: '',
|
|
24
|
+
error: '',
|
|
25
|
+
},
|
|
26
|
+
size: {
|
|
27
|
+
xs: 'px-2 py-1 text-xs',
|
|
28
|
+
sm: 'px-3 py-1.5 text-sm',
|
|
29
|
+
md: 'px-4 py-2 text-sm',
|
|
30
|
+
lg: 'px-5 py-2.5 text-base',
|
|
31
|
+
xl: 'px-6 py-3 text-base',
|
|
32
|
+
},
|
|
33
|
+
disabled: {
|
|
34
|
+
true: 'opacity-50 pointer-events-none',
|
|
35
|
+
false: '',
|
|
36
|
+
},
|
|
37
|
+
loading: {
|
|
38
|
+
true: 'pointer-events-none',
|
|
39
|
+
false: '',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
compoundVariants: [
|
|
43
|
+
// ===== Primary =====
|
|
44
|
+
{ variant: 'solid', color: 'primary', class: 'bg-primary-600 text-on-primary hover:bg-primary-700' },
|
|
45
|
+
{ variant: 'outline', color: 'primary', class: 'border-primary-300 text-primary-700 hover:bg-primary-50' },
|
|
46
|
+
{ variant: 'ghost', color: 'primary', class: 'text-primary-700 hover:bg-primary-50' },
|
|
47
|
+
{ variant: 'soft', color: 'primary', class: 'bg-primary-50 text-primary-800 hover:bg-primary-100' },
|
|
48
|
+
{ variant: 'link', color: 'primary', class: 'text-primary-700' },
|
|
49
|
+
// ===== Secondary =====
|
|
50
|
+
{ variant: 'solid', color: 'secondary', class: 'bg-secondary-600 text-on-secondary hover:bg-secondary-700' },
|
|
51
|
+
{ variant: 'outline', color: 'secondary', class: 'border-secondary-300 text-secondary-700 hover:bg-secondary-50' },
|
|
52
|
+
{ variant: 'ghost', color: 'secondary', class: 'text-secondary-700 hover:bg-secondary-50' },
|
|
53
|
+
{ variant: 'soft', color: 'secondary', class: 'bg-secondary-50 text-secondary-800 hover:bg-secondary-100' },
|
|
54
|
+
{ variant: 'link', color: 'secondary', class: 'text-secondary-700' },
|
|
55
|
+
// ===== Accent =====
|
|
56
|
+
{ variant: 'solid', color: 'accent', class: 'bg-accent-600 text-on-accent hover:bg-accent-700' },
|
|
57
|
+
{ variant: 'outline', color: 'accent', class: 'border-accent-300 text-accent-700 hover:bg-accent-50' },
|
|
58
|
+
{ variant: 'ghost', color: 'accent', class: 'text-accent-700 hover:bg-accent-50' },
|
|
59
|
+
{ variant: 'soft', color: 'accent', class: 'bg-accent-50 text-accent-800 hover:bg-accent-100' },
|
|
60
|
+
{ variant: 'link', color: 'accent', class: 'text-accent-700' },
|
|
61
|
+
// ===== Neutral ===== (subdued solid pairs surface-muted with text-fg; on-neutral is white and would be unreadable here)
|
|
62
|
+
{ variant: 'solid', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },
|
|
63
|
+
{ variant: 'outline', color: 'neutral', class: 'border-border text-fg hover:bg-surface-muted' },
|
|
64
|
+
{ variant: 'ghost', color: 'neutral', class: 'text-fg-muted hover:bg-surface-muted' },
|
|
65
|
+
{ variant: 'soft', color: 'neutral', class: 'bg-surface-muted text-fg hover:bg-surface-sunken' },
|
|
66
|
+
{ variant: 'link', color: 'neutral', class: 'text-fg-muted' },
|
|
67
|
+
// ===== Info =====
|
|
68
|
+
{ variant: 'solid', color: 'info', class: 'bg-info-600 text-on-info hover:bg-info-700' },
|
|
69
|
+
{ variant: 'outline', color: 'info', class: 'border-info-300 text-info-700 hover:bg-info-50' },
|
|
70
|
+
{ variant: 'ghost', color: 'info', class: 'text-info-700 hover:bg-info-50' },
|
|
71
|
+
{ variant: 'soft', color: 'info', class: 'bg-info-50 text-info-800 hover:bg-info-100' },
|
|
72
|
+
{ variant: 'link', color: 'info', class: 'text-info-700' },
|
|
73
|
+
// ===== Success =====
|
|
74
|
+
{ variant: 'solid', color: 'success', class: 'bg-success-600 text-on-success hover:bg-success-700' },
|
|
75
|
+
{ variant: 'outline', color: 'success', class: 'border-success-300 text-success-700 hover:bg-success-50' },
|
|
76
|
+
{ variant: 'ghost', color: 'success', class: 'text-success-700 hover:bg-success-50' },
|
|
77
|
+
{ variant: 'soft', color: 'success', class: 'bg-success-50 text-success-800 hover:bg-success-100' },
|
|
78
|
+
{ variant: 'link', color: 'success', class: 'text-success-700' },
|
|
79
|
+
// ===== Warning =====
|
|
80
|
+
{ variant: 'solid', color: 'warning', class: 'bg-warning-500 text-on-warning hover:bg-warning-600' },
|
|
81
|
+
{ variant: 'outline', color: 'warning', class: 'border-warning-300 text-warning-700 hover:bg-warning-50' },
|
|
82
|
+
{ variant: 'ghost', color: 'warning', class: 'text-warning-700 hover:bg-warning-50' },
|
|
83
|
+
{ variant: 'soft', color: 'warning', class: 'bg-warning-50 text-warning-800 hover:bg-warning-100' },
|
|
84
|
+
{ variant: 'link', color: 'warning', class: 'text-warning-700' },
|
|
85
|
+
// ===== Error =====
|
|
86
|
+
{ variant: 'solid', color: 'error', class: 'bg-error-600 text-on-error hover:bg-error-700' },
|
|
87
|
+
{ variant: 'outline', color: 'error', class: 'border-error-300 text-error-700 hover:bg-error-50' },
|
|
88
|
+
{ variant: 'ghost', color: 'error', class: 'text-error-700 hover:bg-error-50' },
|
|
89
|
+
{ variant: 'soft', color: 'error', class: 'bg-error-50 text-error-800 hover:bg-error-100' },
|
|
90
|
+
{ variant: 'link', color: 'error', class: 'text-error-700' },
|
|
91
|
+
// ===== Link variant: strip padding =====
|
|
92
|
+
{ variant: 'link', size: 'xs', class: 'px-0 py-0' },
|
|
93
|
+
{ variant: 'link', size: 'sm', class: 'px-0 py-0' },
|
|
94
|
+
{ variant: 'link', size: 'md', class: 'px-0 py-0' },
|
|
95
|
+
{ variant: 'link', size: 'lg', class: 'px-0 py-0' },
|
|
96
|
+
{ variant: 'link', size: 'xl', class: 'px-0 py-0' },
|
|
97
|
+
],
|
|
98
|
+
defaultVariants: {
|
|
99
|
+
variant: 'solid',
|
|
100
|
+
color: 'primary',
|
|
101
|
+
size: 'md',
|
|
102
|
+
disabled: false,
|
|
103
|
+
loading: false,
|
|
104
|
+
},
|
|
105
|
+
}, {
|
|
106
|
+
twMerge: true,
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* Enhances a native `<button>` or `<a>` element with library styling, semantic
|
|
110
|
+
* color/size variants, and disabled/loading states. The directive does not
|
|
111
|
+
* expose a `clicked` output — bind `(click)` directly on the host element. When
|
|
112
|
+
* `disabled` or `loading` is true, the directive intercepts clicks with
|
|
113
|
+
* `preventDefault()` + `stopImmediatePropagation()` so the host handler does
|
|
114
|
+
* not run.
|
|
115
|
+
*
|
|
116
|
+
* The directive owns no template, so visual loading affordances (spinner,
|
|
117
|
+
* status text) are composed by the consumer — see the `loading` input.
|
|
118
|
+
*/
|
|
119
|
+
class ButtonDirective {
|
|
120
|
+
/** Controls the visual style. Defaults to `'solid'`. */
|
|
121
|
+
variant = input('solid', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
122
|
+
/** Sets the semantic color palette. Defaults to `'primary'`. */
|
|
123
|
+
color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
124
|
+
/** Controls the size (padding, font size, icon size). Defaults to `'md'`. */
|
|
125
|
+
size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
126
|
+
/** When true, prevents interaction and applies muted styling. Defaults to `false`. */
|
|
127
|
+
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
128
|
+
/**
|
|
129
|
+
* When true, blocks clicks and sets `aria-busy="true"`. Defaults to `false`.
|
|
130
|
+
* The directive does not render a spinner or status text — compose them in
|
|
131
|
+
* the projected content:
|
|
132
|
+
*
|
|
133
|
+
* ```html
|
|
134
|
+
* <button twButton [loading]="saving()">
|
|
135
|
+
* @if (saving()) {
|
|
136
|
+
* <tw-spinner twButtonIcon size="sm" />
|
|
137
|
+
* <span class="sr-only">Saving…</span>
|
|
138
|
+
* }
|
|
139
|
+
* Save
|
|
140
|
+
* </button>
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* The `sr-only` text gives assistive tech an explicit status announcement
|
|
144
|
+
* to pair with the `aria-busy` attribute.
|
|
145
|
+
*/
|
|
146
|
+
loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
147
|
+
elementRef = inject((ElementRef));
|
|
148
|
+
focusMonitor = inject(FocusMonitor);
|
|
149
|
+
destroyRef = inject(DestroyRef);
|
|
150
|
+
isNativeButton = computed(() => this.elementRef.nativeElement.tagName === 'BUTTON', ...(ngDevMode ? [{ debugName: "isNativeButton" }] : /* istanbul ignore next */ []));
|
|
151
|
+
classes = computed(() => buttonVariants({
|
|
152
|
+
variant: this.variant(),
|
|
153
|
+
color: this.color(),
|
|
154
|
+
size: this.size(),
|
|
155
|
+
disabled: this.disabled() || this.loading(),
|
|
156
|
+
loading: this.loading(),
|
|
157
|
+
}), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
158
|
+
ngOnInit() {
|
|
159
|
+
this.focusMonitor.monitor(this.elementRef);
|
|
160
|
+
this.destroyRef.onDestroy(() => {
|
|
161
|
+
this.focusMonitor.stopMonitoring(this.elementRef);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
handleClick(event) {
|
|
165
|
+
if (this.disabled() || this.loading()) {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
event.stopImmediatePropagation();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
171
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: ButtonDirective, isStandalone: true, selector: "[twButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "handleClick($event)" }, properties: { "class": "classes()", "attr.aria-disabled": "disabled() || loading() || null", "attr.aria-busy": "loading() || null", "attr.disabled": "isNativeButton() && (disabled() || loading()) ? true : null", "attr.tabindex": "!isNativeButton() && (disabled() || loading()) ? -1 : null" } }, exportAs: ["twButton"], ngImport: i0 });
|
|
172
|
+
}
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ButtonDirective, decorators: [{
|
|
174
|
+
type: Directive,
|
|
175
|
+
args: [{
|
|
176
|
+
selector: '[twButton]',
|
|
177
|
+
exportAs: 'twButton',
|
|
178
|
+
host: {
|
|
179
|
+
'[class]': 'classes()',
|
|
180
|
+
'[attr.aria-disabled]': 'disabled() || loading() || null',
|
|
181
|
+
'[attr.aria-busy]': 'loading() || null',
|
|
182
|
+
'[attr.disabled]': 'isNativeButton() && (disabled() || loading()) ? true : null',
|
|
183
|
+
'[attr.tabindex]': '!isNativeButton() && (disabled() || loading()) ? -1 : null',
|
|
184
|
+
'(click)': 'handleClick($event)',
|
|
185
|
+
},
|
|
186
|
+
}]
|
|
187
|
+
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }] } });
|
|
188
|
+
class ButtonIconDirective {
|
|
189
|
+
/**
|
|
190
|
+
* Position of the icon relative to the button label. Defaults to `'leading'`.
|
|
191
|
+
*
|
|
192
|
+
* The empty-string member of the union is load-bearing: Angular binds `''` to
|
|
193
|
+
* the input when the selector is used as a bare attribute (`<svg twButtonIcon>`),
|
|
194
|
+
* which is the canonical "leading" usage. Templates that omit a value still
|
|
195
|
+
* have the directive attached and resolve to leading placement at runtime via
|
|
196
|
+
* the `=== 'trailing'` check below.
|
|
197
|
+
*/
|
|
198
|
+
twButtonIcon = input('leading', ...(ngDevMode ? [{ debugName: "twButtonIcon" }] : /* istanbul ignore next */ []));
|
|
199
|
+
button = inject(ButtonDirective);
|
|
200
|
+
classes = computed(() => {
|
|
201
|
+
const size = this.button.size();
|
|
202
|
+
const iconSize = size === 'xs' || size === 'sm' ? 'size-4' : 'size-5';
|
|
203
|
+
// `order-last` only takes effect when the button host is a flex container —
|
|
204
|
+
// `ButtonDirective`'s base class includes `inline-flex`, which is the
|
|
205
|
+
// contract this directive relies on for trailing-icon placement.
|
|
206
|
+
const order = this.twButtonIcon() === 'trailing' ? 'order-last' : '';
|
|
207
|
+
return [iconSize, 'shrink-0', order].filter(Boolean).join(' ');
|
|
208
|
+
}, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
209
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ButtonIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
210
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: ButtonIconDirective, isStandalone: true, selector: "[twButtonIcon]", inputs: { twButtonIcon: { classPropertyName: "twButtonIcon", publicName: "twButtonIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
211
|
+
}
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ButtonIconDirective, decorators: [{
|
|
213
|
+
type: Directive,
|
|
214
|
+
args: [{
|
|
215
|
+
selector: '[twButtonIcon]',
|
|
216
|
+
host: {
|
|
217
|
+
'[class]': 'classes()',
|
|
218
|
+
},
|
|
219
|
+
}]
|
|
220
|
+
}], propDecorators: { twButtonIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "twButtonIcon", required: false }] }] } });
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Generated bundle index. Do not edit.
|
|
224
|
+
*/
|
|
225
|
+
|
|
226
|
+
export { ButtonDirective, ButtonIconDirective };
|
|
227
|
+
//# sourceMappingURL=cdevhub-ngx-tw-button.mjs.map
|
|
@@ -0,0 +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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"}
|