@egose/shadcn-theme-ng-tw 0.0.28 → 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/README.md +130 -13
- package/accordion/README.md +376 -34
- package/accordion/fesm2022/accordion.mjs +20 -20
- package/alert/README.md +343 -34
- package/alert/fesm2022/alert.mjs +18 -18
- package/alert-dialog/README.md +471 -5
- package/alert-dialog/fesm2022/alert-dialog.mjs +48 -48
- package/alert-dialog/types/alert-dialog.d.ts +1 -1
- package/aspect-ratio/README.md +272 -5
- package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
- package/autocomplete/README.md +473 -34
- package/autocomplete/fesm2022/autocomplete.mjs +54 -54
- package/autocomplete/types/autocomplete.d.ts +1 -1
- package/avatar/README.md +357 -5
- package/avatar/fesm2022/avatar.mjs +32 -32
- package/badge/README.md +289 -34
- package/badge/fesm2022/badge.mjs +4 -4
- package/basic-alert/README.md +324 -34
- package/basic-alert/fesm2022/basic-alert.mjs +4 -4
- package/basic-alert/types/basic-alert.d.ts +1 -1
- package/breadcrumb/README.md +406 -5
- package/breadcrumb/fesm2022/breadcrumb.mjs +34 -34
- package/button/README.md +453 -34
- package/button/fesm2022/button.mjs +96 -118
- package/button/types/button.d.ts +7 -10
- package/button-group/README.md +318 -5
- package/button-group/fesm2022/button-group.mjs +20 -20
- package/calendar/README.md +328 -34
- package/calendar/fesm2022/calendar.mjs +154 -154
- package/card/README.md +331 -5
- package/card/fesm2022/card.mjs +33 -33
- package/carousel/README.md +333 -5
- package/carousel/fesm2022/carousel.mjs +47 -44
- package/carousel/types/carousel.d.ts +1 -1
- package/checkbox/README.md +291 -34
- package/checkbox/fesm2022/checkbox.mjs +22 -20
- package/checkbox/types/checkbox.d.ts +5 -4
- package/collapsible/README.md +332 -5
- package/collapsible/fesm2022/collapsible.mjs +15 -15
- package/combobox/README.md +507 -5
- package/combobox/fesm2022/combobox.mjs +95 -92
- package/combobox/types/combobox.d.ts +1 -1
- package/command/README.md +435 -5
- package/command/fesm2022/command.mjs +56 -56
- package/confirmation-dialog/README.md +272 -34
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +13 -12
- package/confirmation-dialog/types/confirmation-dialog.d.ts +9 -5
- package/context-menu/README.md +366 -5
- package/context-menu/fesm2022/context-menu.mjs +9 -9
- package/date-picker/README.md +436 -34
- package/date-picker/fesm2022/date-picker.mjs +79 -68
- package/date-picker/types/date-picker.d.ts +8 -4
- package/dialog/README.md +419 -34
- package/dialog/fesm2022/dialog.mjs +48 -48
- package/drawer/README.md +395 -5
- package/drawer/fesm2022/drawer.mjs +45 -45
- package/dropdown-menu/README.md +417 -5
- package/dropdown-menu/fesm2022/dropdown-menu.mjs +85 -73
- package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
- package/empty/README.md +329 -5
- package/empty/fesm2022/empty.mjs +31 -31
- package/field/README.md +385 -5
- package/field/fesm2022/field.mjs +59 -59
- package/field/types/field.d.ts +1 -1
- package/form-checkbox/README.md +283 -34
- package/form-checkbox/fesm2022/form-checkbox.mjs +37 -19
- package/form-checkbox/types/form-checkbox.d.ts +7 -1
- package/form-date-picker/README.md +293 -34
- package/form-date-picker/fesm2022/form-date-picker.mjs +59 -24
- package/form-date-picker/types/form-date-picker.d.ts +7 -1
- package/form-field/README.md +327 -34
- package/form-field/fesm2022/form-field.mjs +30 -16
- package/form-field/types/form-field.d.ts +28 -20
- package/form-field-simple/README.md +311 -34
- package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
- package/form-searchable-multiselect/README.md +332 -34
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +41 -21
- package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +8 -2
- package/form-select/README.md +321 -34
- package/form-select/fesm2022/form-select.mjs +62 -29
- package/form-select/types/form-select.d.ts +7 -1
- package/form-text-input/README.md +342 -34
- package/form-text-input/fesm2022/form-text-input.mjs +43 -55
- package/form-text-input/types/form-text-input.d.ts +9 -12
- package/form-textarea/README.md +318 -34
- package/form-textarea/fesm2022/form-textarea.mjs +42 -23
- package/form-textarea/types/form-textarea.d.ts +8 -1
- package/hover-card/README.md +256 -5
- package/hover-card/fesm2022/hover-card.mjs +19 -19
- package/icon/README.md +210 -34
- package/icon/fesm2022/icon.mjs +8 -8
- package/input/README.md +240 -34
- package/input/fesm2022/input.mjs +17 -12
- package/input/types/input.d.ts +2 -1
- package/input-group/README.md +335 -5
- package/input-group/fesm2022/input-group.mjs +37 -37
- package/input-group/types/input-group.d.ts +3 -3
- package/input-otp/README.md +375 -5
- package/input-otp/fesm2022/input-otp.mjs +27 -27
- package/item/README.md +385 -5
- package/item/fesm2022/item.mjs +54 -54
- package/kbd/README.md +291 -5
- package/kbd/fesm2022/kbd.mjs +13 -13
- package/label/README.md +243 -34
- package/label/fesm2022/label.mjs +9 -9
- package/label/types/label.d.ts +1 -1
- package/layout-simple/README.md +174 -44
- package/layout-simple/fesm2022/layout-simple.mjs +917 -398
- package/layout-simple/types/layout-simple.d.ts +180 -129
- package/menu/README.md +418 -0
- package/menu/fesm2022/menu.mjs +461 -0
- package/menu/package.json +24 -0
- package/menu/types/menu.d.ts +137 -0
- package/menubar/README.md +343 -5
- package/menubar/fesm2022/menubar.mjs +13 -13
- package/native-select/README.md +323 -5
- package/native-select/fesm2022/native-select.mjs +19 -19
- package/navigation-menu/README.md +369 -5
- package/navigation-menu/fesm2022/navigation-menu.mjs +37 -37
- package/package.json +183 -154
- package/pagination/README.md +388 -5
- package/pagination/fesm2022/pagination.mjs +63 -63
- package/popover/README.md +302 -34
- package/popover/fesm2022/popover.mjs +30 -30
- package/progress/README.md +311 -5
- package/progress/fesm2022/progress.mjs +13 -13
- package/radio-group/README.md +335 -34
- package/radio-group/fesm2022/radio-group.mjs +26 -19
- package/resizable/README.md +269 -5
- package/resizable/fesm2022/resizable.mjs +19 -19
- package/scroll-area/README.md +233 -5
- package/scroll-area/fesm2022/scroll-area.mjs +9 -9
- package/searchable-multiselect/README.md +294 -34
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +63 -16
- package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
- package/select/README.md +408 -34
- package/select/fesm2022/select.mjs +80 -72
- package/select/types/select.d.ts +3 -1
- package/separator/README.md +193 -34
- package/separator/fesm2022/separator.mjs +9 -9
- package/separator/types/separator.d.ts +1 -1
- package/sheet/README.md +282 -34
- package/sheet/fesm2022/sheet.mjs +30 -30
- package/sidebar/README.md +457 -5
- package/sidebar/fesm2022/sidebar.mjs +136 -134
- package/sidebar/types/sidebar.d.ts +3 -3
- package/skeleton/README.md +217 -5
- package/skeleton/fesm2022/skeleton.mjs +9 -9
- package/slider/README.md +273 -5
- package/slider/fesm2022/slider.mjs +29 -25
- package/sonner/README.md +317 -34
- package/sonner/fesm2022/sonner.mjs +9 -9
- package/spinner/README.md +255 -34
- package/spinner/fesm2022/spinner.mjs +8 -8
- package/switch/README.md +281 -34
- package/switch/fesm2022/switch.mjs +12 -14
- package/table/README.md +423 -5
- package/table/fesm2022/table.mjs +41 -41
- package/tabs/README.md +382 -34
- package/tabs/fesm2022/tabs.mjs +48 -38
- package/textarea/README.md +282 -5
- package/textarea/fesm2022/textarea.mjs +9 -9
- package/toggle/README.md +270 -5
- package/toggle/fesm2022/toggle.mjs +14 -14
- package/toggle-group/README.md +340 -5
- package/toggle-group/fesm2022/toggle-group.mjs +13 -13
- package/toggle-group/types/toggle-group.d.ts +13 -7
- package/tooltip/README.md +240 -34
- package/tooltip/fesm2022/tooltip.mjs +14 -14
- package/typography/README.md +271 -5
- package/typography/fesm2022/typography.mjs +53 -53
- package/typography/types/typography.d.ts +12 -12
- package/utils/README.md +274 -34
- package/utils/fesm2022/utils.mjs +68 -44
- package/accordion/fesm2022/accordion.mjs.map +0 -1
- package/alert/fesm2022/alert.mjs.map +0 -1
- package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
- package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
- package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
- package/avatar/fesm2022/avatar.mjs.map +0 -1
- package/badge/fesm2022/badge.mjs.map +0 -1
- package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
- package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
- package/button/fesm2022/button.mjs.map +0 -1
- package/button-group/fesm2022/button-group.mjs.map +0 -1
- package/calendar/fesm2022/calendar.mjs.map +0 -1
- package/card/fesm2022/card.mjs.map +0 -1
- package/carousel/fesm2022/carousel.mjs.map +0 -1
- package/checkbox/fesm2022/checkbox.mjs.map +0 -1
- package/collapsible/fesm2022/collapsible.mjs.map +0 -1
- package/combobox/fesm2022/combobox.mjs.map +0 -1
- package/command/fesm2022/command.mjs.map +0 -1
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
- package/context-menu/fesm2022/context-menu.mjs.map +0 -1
- package/date-picker/fesm2022/date-picker.mjs.map +0 -1
- package/dialog/fesm2022/dialog.mjs.map +0 -1
- package/drawer/fesm2022/drawer.mjs.map +0 -1
- package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
- package/empty/fesm2022/empty.mjs.map +0 -1
- package/field/fesm2022/field.mjs.map +0 -1
- package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
- package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
- package/form-field/fesm2022/form-field.mjs.map +0 -1
- package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
- package/form-select/fesm2022/form-select.mjs.map +0 -1
- package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
- package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
- package/hover-card/fesm2022/hover-card.mjs.map +0 -1
- package/icon/fesm2022/icon.mjs.map +0 -1
- package/input/fesm2022/input.mjs.map +0 -1
- package/input-group/fesm2022/input-group.mjs.map +0 -1
- package/input-otp/fesm2022/input-otp.mjs.map +0 -1
- package/item/fesm2022/item.mjs.map +0 -1
- package/kbd/fesm2022/kbd.mjs.map +0 -1
- package/label/fesm2022/label.mjs.map +0 -1
- package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
- package/menubar/fesm2022/menubar.mjs.map +0 -1
- package/native-select/fesm2022/native-select.mjs.map +0 -1
- package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
- package/pagination/fesm2022/pagination.mjs.map +0 -1
- package/popover/fesm2022/popover.mjs.map +0 -1
- package/progress/fesm2022/progress.mjs.map +0 -1
- package/radio-group/fesm2022/radio-group.mjs.map +0 -1
- package/resizable/fesm2022/resizable.mjs.map +0 -1
- package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
- package/select/fesm2022/select.mjs.map +0 -1
- package/separator/fesm2022/separator.mjs.map +0 -1
- package/sheet/fesm2022/sheet.mjs.map +0 -1
- package/sidebar/fesm2022/sidebar.mjs.map +0 -1
- package/skeleton/fesm2022/skeleton.mjs.map +0 -1
- package/slider/fesm2022/slider.mjs.map +0 -1
- package/sonner/fesm2022/sonner.mjs.map +0 -1
- package/spinner/fesm2022/spinner.mjs.map +0 -1
- package/switch/fesm2022/switch.mjs.map +0 -1
- package/table/fesm2022/table.mjs.map +0 -1
- package/tabs/fesm2022/tabs.mjs.map +0 -1
- package/textarea/fesm2022/textarea.mjs.map +0 -1
- package/toggle/fesm2022/toggle.mjs.map +0 -1
- package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
- package/tooltip/fesm2022/tooltip.mjs.map +0 -1
- package/typography/fesm2022/typography.mjs.map +0 -1
- package/utils/fesm2022/utils.mjs.map +0 -1
|
@@ -8,25 +8,27 @@ class HlmSlider {
|
|
|
8
8
|
_slider = injectBrnSlider();
|
|
9
9
|
constructor() {
|
|
10
10
|
classes(() => [
|
|
11
|
-
'group flex w-full touch-none flex-col select-none data-vertical:h-full data-vertical:min-h-40 data-vertical:w-auto data-vertical:flex-row data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
|
|
11
|
+
'tw:group tw:flex tw:w-full tw:touch-none tw:flex-col tw:select-none tw:data-[orientation=vertical]:h-full tw:data-[orientation=vertical]:min-h-40 tw:data-[orientation=vertical]:w-auto tw:data-[orientation=vertical]:flex-row tw:data-[disabled]:pointer-events-none tw:data-[disabled]:opacity-50',
|
|
12
12
|
]);
|
|
13
13
|
}
|
|
14
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
15
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
16
|
-
<div
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: HlmSlider, isStandalone: true, selector: "hlm-slider, brn-slider [hlm]", hostDirectives: [{ directive: i1.BrnSlider, inputs: ["id", "id", "value", "value", "disabled", "disabled", "min", "min", "max", "max", "step", "step", "minStepsBetweenThumbs", "minStepsBetweenThumbs", "inverted", "inverted", "orientation", "orientation", "showTicks", "showTicks", "maxTicks", "maxTicks", "tickLabelInterval", "tickLabelInterval", "formatTick", "formatTick", "draggableRange", "draggableRange", "draggableRangeOnly", "draggableRangeOnly", "aria-label", "aria-label", "aria-labelledby", "aria-labelledby"], outputs: ["valueChange", "valueChange"] }], ngImport: i0, template: `
|
|
16
|
+
<div
|
|
17
|
+
class="tw:relative tw:flex tw:w-full tw:items-center tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-col"
|
|
18
|
+
>
|
|
17
19
|
<div
|
|
18
20
|
brnSliderTrack
|
|
19
|
-
class="bg-muted rounded-full data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5 relative grow overflow-hidden"
|
|
21
|
+
class="tw:bg-muted tw:rounded-full tw:data-[orientation=horizontal]:h-1.5 tw:data-[orientation=horizontal]:w-full tw:data-[orientation=vertical]:h-full tw:data-[orientation=vertical]:w-1.5 tw:relative tw:grow tw:overflow-hidden"
|
|
20
22
|
>
|
|
21
23
|
<div
|
|
22
|
-
class="bg-primary absolute select-none data-draggable-range:cursor-move data-horizontal:h-full data-vertical:w-full"
|
|
24
|
+
class="tw:bg-primary tw:absolute tw:select-none tw:data-draggable-range:cursor-move tw:data-[orientation=horizontal]:h-full tw:data-[orientation=vertical]:w-full"
|
|
23
25
|
brnSliderRange
|
|
24
26
|
></div>
|
|
25
27
|
</div>
|
|
26
28
|
|
|
27
29
|
@for (i of _slider.thumbIndexes(); track i) {
|
|
28
30
|
<span
|
|
29
|
-
class="border-primary ring-ring/50 size-4 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden absolute block shrink-0 select-none after:absolute after:-inset-2"
|
|
31
|
+
class="tw:border-primary tw:ring-ring/50 tw:size-4 tw:rounded-full tw:border tw:bg-white tw:shadow-sm tw:transition-[color,box-shadow] tw:hover:ring-4 tw:focus-visible:ring-4 tw:focus-visible:outline-hidden tw:absolute tw:block tw:shrink-0 tw:select-none tw:after:absolute tw:after:-inset-2"
|
|
30
32
|
brnSliderThumb
|
|
31
33
|
></span>
|
|
32
34
|
}
|
|
@@ -34,22 +36,22 @@ class HlmSlider {
|
|
|
34
36
|
|
|
35
37
|
@if (_slider.showTicks()) {
|
|
36
38
|
<div
|
|
37
|
-
class="px-2 group-data-vertical:px-0 group-data-vertical:py-2 text-muted-foreground mt-3 flex w-full items-start justify-between gap-1 text-xs font-medium group-data-horizontal:group-data-inverted:flex-row-reverse group-data-vertical:ms-3 group-data-vertical:mt-0 group-data-vertical:w-auto group-data-vertical:flex-col-reverse group-data-vertical:group-data-inverted:flex-col"
|
|
39
|
+
class="tw:px-2 tw:group-data-[orientation=vertical]:px-0 tw:group-data-[orientation=vertical]:py-2 tw:text-muted-foreground tw:mt-3 tw:flex tw:w-full tw:items-start tw:justify-between tw:gap-1 tw:text-xs tw:font-medium tw:group-data-[orientation=horizontal]:group-data-inverted:flex-row-reverse tw:group-data-[orientation=vertical]:ms-3 tw:group-data-[orientation=vertical]:mt-0 tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-col-reverse tw:group-data-[orientation=vertical]:group-data-inverted:flex-col"
|
|
38
40
|
>
|
|
39
41
|
<div
|
|
40
42
|
*brnSliderTick="let tick; let formattedTick = formattedTick"
|
|
41
|
-
class="group flex w-0 flex-col items-center justify-center gap-2 group-data-vertical:h-0 group-data-vertical:w-auto group-data-vertical:flex-row"
|
|
43
|
+
class="tw:group tw:flex tw:w-0 tw:flex-col tw:items-center tw:justify-center tw:gap-2 tw:group-data-[orientation=vertical]:h-0 tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-row"
|
|
42
44
|
>
|
|
43
45
|
<div
|
|
44
|
-
class="bg-muted-foreground/70 h-1 w-px group-data-vertical:h-px group-data-vertical:w-1 group-data-horizontal:group-data-[skip]:h-0.5 group-data-vertical:group-data-[skip]:w-0.5"
|
|
46
|
+
class="tw:bg-muted-foreground/70 tw:h-1 tw:w-px tw:group-data-[orientation=vertical]:h-px tw:group-data-[orientation=vertical]:w-1 tw:group-data-[orientation=horizontal]:group-data-[skip]:h-0.5 tw:group-data-[orientation=vertical]:group-data-[skip]:w-0.5"
|
|
45
47
|
></div>
|
|
46
|
-
<div class="text-center group-data-[skip]:opacity-0">{{ formattedTick }}</div>
|
|
48
|
+
<div class="tw:text-center tw:group-data-[skip]:opacity-0">{{ formattedTick }}</div>
|
|
47
49
|
</div>
|
|
48
50
|
</div>
|
|
49
51
|
}
|
|
50
52
|
`, isInline: true, dependencies: [{ kind: "directive", type: i1.BrnSliderTrack, selector: "[brnSliderTrack]" }, { kind: "directive", type: i1.BrnSliderThumb, selector: "[brnSliderThumb]" }, { kind: "directive", type: i1.BrnSliderRange, selector: "[brnSliderRange]" }, { kind: "directive", type: i1.BrnSliderTick, selector: "[brnSliderTick]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
51
53
|
}
|
|
52
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSlider, decorators: [{
|
|
53
55
|
type: Component,
|
|
54
56
|
args: [{
|
|
55
57
|
selector: 'hlm-slider, brn-slider [hlm]',
|
|
@@ -81,20 +83,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
81
83
|
},
|
|
82
84
|
],
|
|
83
85
|
template: `
|
|
84
|
-
<div
|
|
86
|
+
<div
|
|
87
|
+
class="tw:relative tw:flex tw:w-full tw:items-center tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-col"
|
|
88
|
+
>
|
|
85
89
|
<div
|
|
86
90
|
brnSliderTrack
|
|
87
|
-
class="bg-muted rounded-full data-horizontal:h-1.5 data-horizontal:w-full data-vertical:h-full data-vertical:w-1.5 relative grow overflow-hidden"
|
|
91
|
+
class="tw:bg-muted tw:rounded-full tw:data-[orientation=horizontal]:h-1.5 tw:data-[orientation=horizontal]:w-full tw:data-[orientation=vertical]:h-full tw:data-[orientation=vertical]:w-1.5 tw:relative tw:grow tw:overflow-hidden"
|
|
88
92
|
>
|
|
89
93
|
<div
|
|
90
|
-
class="bg-primary absolute select-none data-draggable-range:cursor-move data-horizontal:h-full data-vertical:w-full"
|
|
94
|
+
class="tw:bg-primary tw:absolute tw:select-none tw:data-draggable-range:cursor-move tw:data-[orientation=horizontal]:h-full tw:data-[orientation=vertical]:w-full"
|
|
91
95
|
brnSliderRange
|
|
92
96
|
></div>
|
|
93
97
|
</div>
|
|
94
98
|
|
|
95
99
|
@for (i of _slider.thumbIndexes(); track i) {
|
|
96
100
|
<span
|
|
97
|
-
class="border-primary ring-ring/50 size-4 rounded-full border bg-white shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden absolute block shrink-0 select-none after:absolute after:-inset-2"
|
|
101
|
+
class="tw:border-primary tw:ring-ring/50 tw:size-4 tw:rounded-full tw:border tw:bg-white tw:shadow-sm tw:transition-[color,box-shadow] tw:hover:ring-4 tw:focus-visible:ring-4 tw:focus-visible:outline-hidden tw:absolute tw:block tw:shrink-0 tw:select-none tw:after:absolute tw:after:-inset-2"
|
|
98
102
|
brnSliderThumb
|
|
99
103
|
></span>
|
|
100
104
|
}
|
|
@@ -102,16 +106,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
102
106
|
|
|
103
107
|
@if (_slider.showTicks()) {
|
|
104
108
|
<div
|
|
105
|
-
class="px-2 group-data-vertical:px-0 group-data-vertical:py-2 text-muted-foreground mt-3 flex w-full items-start justify-between gap-1 text-xs font-medium group-data-horizontal:group-data-inverted:flex-row-reverse group-data-vertical:ms-3 group-data-vertical:mt-0 group-data-vertical:w-auto group-data-vertical:flex-col-reverse group-data-vertical:group-data-inverted:flex-col"
|
|
109
|
+
class="tw:px-2 tw:group-data-[orientation=vertical]:px-0 tw:group-data-[orientation=vertical]:py-2 tw:text-muted-foreground tw:mt-3 tw:flex tw:w-full tw:items-start tw:justify-between tw:gap-1 tw:text-xs tw:font-medium tw:group-data-[orientation=horizontal]:group-data-inverted:flex-row-reverse tw:group-data-[orientation=vertical]:ms-3 tw:group-data-[orientation=vertical]:mt-0 tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-col-reverse tw:group-data-[orientation=vertical]:group-data-inverted:flex-col"
|
|
106
110
|
>
|
|
107
111
|
<div
|
|
108
112
|
*brnSliderTick="let tick; let formattedTick = formattedTick"
|
|
109
|
-
class="group flex w-0 flex-col items-center justify-center gap-2 group-data-vertical:h-0 group-data-vertical:w-auto group-data-vertical:flex-row"
|
|
113
|
+
class="tw:group tw:flex tw:w-0 tw:flex-col tw:items-center tw:justify-center tw:gap-2 tw:group-data-[orientation=vertical]:h-0 tw:group-data-[orientation=vertical]:w-auto tw:group-data-[orientation=vertical]:flex-row"
|
|
110
114
|
>
|
|
111
115
|
<div
|
|
112
|
-
class="bg-muted-foreground/70 h-1 w-px group-data-vertical:h-px group-data-vertical:w-1 group-data-horizontal:group-data-[skip]:h-0.5 group-data-vertical:group-data-[skip]:w-0.5"
|
|
116
|
+
class="tw:bg-muted-foreground/70 tw:h-1 tw:w-px tw:group-data-[orientation=vertical]:h-px tw:group-data-[orientation=vertical]:w-1 tw:group-data-[orientation=horizontal]:group-data-[skip]:h-0.5 tw:group-data-[orientation=vertical]:group-data-[skip]:w-0.5"
|
|
113
117
|
></div>
|
|
114
|
-
<div class="text-center group-data-[skip]:opacity-0">{{ formattedTick }}</div>
|
|
118
|
+
<div class="tw:text-center tw:group-data-[skip]:opacity-0">{{ formattedTick }}</div>
|
|
115
119
|
</div>
|
|
116
120
|
</div>
|
|
117
121
|
}
|
|
@@ -124,11 +128,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
124
128
|
*/
|
|
125
129
|
const HlmSliderImports = [HlmSlider];
|
|
126
130
|
class HlmSliderModule {
|
|
127
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
128
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.
|
|
129
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.
|
|
131
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSliderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
132
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmSliderModule, imports: [HlmSlider], exports: [HlmSlider] });
|
|
133
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSliderModule });
|
|
130
134
|
}
|
|
131
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSliderModule, decorators: [{
|
|
132
136
|
type: NgModule,
|
|
133
137
|
args: [{
|
|
134
138
|
imports: [...HlmSliderImports],
|
|
@@ -141,4 +145,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
141
145
|
*/
|
|
142
146
|
|
|
143
147
|
export { HlmSlider, HlmSliderImports, HlmSliderModule };
|
|
144
|
-
|
|
148
|
+
|
package/sonner/README.md
CHANGED
|
@@ -1,64 +1,347 @@
|
|
|
1
|
-
# Sonner
|
|
1
|
+
# Sonner (`@egose/shadcn-theme-ng/sonner`)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Toast notifications for Angular, styled like [shadcn/ui Sonner](https://ui.shadcn.com/docs/components/sonner). This subpath ships a single standalone component, `HlmToaster`, which is a thin shadcn-styled wrapper around the `NgxSonnerToaster` component from [`ngx-sonner`](https://github.com/adamwathan/ngx-sonner) (the Angular port of [sonner](https://sonner.emilkowal.ski/)). Place one `<hlm-toaster />` at your app root, then fire toasts imperatively with the `toast()` helpers from `ngx-sonner`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> **Ships as:** `@egose/shadcn-theme-ng/sonner` and `@egose/shadcn-theme-ng-tw/sonner` (the `tw:`-prefixed Tailwind variant). See the [package README](../../README.md) for install steps, peer dependencies, Tailwind setup, and testing/release guidance. Do not publish this project directory independently.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
# Plain Tailwind (no prefix)
|
|
11
|
+
npm install @egose/shadcn-theme-ng
|
|
12
|
+
|
|
13
|
+
# Or the tw:-prefixed variant
|
|
14
|
+
npm install @egose/shadcn-theme-ng-tw
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
This library has no extra runtime install beyond the package itself — `ngx-sonner` is installed transitively. See the [package README](../../README.md) for the full peer-dependency table (`@angular/core`, `@angular/common`, `@spartan-ng/brain`, `rxjs`, etc.) and the Tailwind variant contract.
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
> You call `toast()`, `toast.success()`, etc. from the **`ngx-sonner`** package, not from this subpath. This subpath only provides the styled `<hlm-toaster />` outlet component.
|
|
20
|
+
|
|
21
|
+
## Imports
|
|
22
|
+
|
|
23
|
+
All public symbols are re-exported from `projects/sonner/src/public-api.ts`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { HlmToaster, HlmToasterImports, HlmToasterModule } from '@egose/shadcn-theme-ng/sonner';
|
|
27
|
+
// tw variant:
|
|
28
|
+
// import { HlmToaster, HlmToasterImports, HlmToasterModule } from '@egose/shadcn-theme-ng-tw/sonner';
|
|
17
29
|
```
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
Standalone-component usage (preferred):
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
```ts
|
|
34
|
+
import { Component } from '@angular/core';
|
|
35
|
+
import { HlmToasterImports } from '@egose/shadcn-theme-ng/sonner';
|
|
22
36
|
|
|
23
|
-
|
|
24
|
-
|
|
37
|
+
@Component({
|
|
38
|
+
selector: 'app-root',
|
|
39
|
+
standalone: true,
|
|
40
|
+
imports: [...HlmToasterImports],
|
|
41
|
+
template: `<hlm-toaster />`,
|
|
42
|
+
})
|
|
43
|
+
export class AppComponent {}
|
|
25
44
|
```
|
|
26
45
|
|
|
27
|
-
|
|
46
|
+
NgModule usage:
|
|
28
47
|
|
|
29
|
-
|
|
48
|
+
```ts
|
|
49
|
+
import { NgModule } from '@angular/core';
|
|
50
|
+
import { HlmToasterModule } from '@egose/shadcn-theme-ng/sonner';
|
|
30
51
|
|
|
31
|
-
|
|
52
|
+
@NgModule({ imports: [HlmToasterModule] })
|
|
53
|
+
export class AppModule {}
|
|
54
|
+
```
|
|
32
55
|
|
|
33
|
-
|
|
56
|
+
| Symbol | Kind | Description |
|
|
57
|
+
| ------------------- | -------------------- | ------------------------------------------------ |
|
|
58
|
+
| `HlmToaster` | Standalone component | The `<hlm-toaster>` outlet. Renders toasts. |
|
|
59
|
+
| `HlmToasterImports` | `const` array | `[HlmToaster]` — spread into `imports: [...]`. |
|
|
60
|
+
| `HlmToasterModule` | NgModule | Imports + re-exports `HlmToaster` for NgModules. |
|
|
34
61
|
|
|
35
|
-
|
|
36
|
-
cd dist/sonner
|
|
37
|
-
```
|
|
62
|
+
## Anatomy / Structure
|
|
38
63
|
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
npm publish
|
|
42
|
-
```
|
|
64
|
+
Render exactly one toaster outlet, typically in `AppComponent`:
|
|
43
65
|
|
|
44
|
-
|
|
66
|
+
```html
|
|
67
|
+
<!-- app.component.html -->
|
|
68
|
+
<hlm-toaster />
|
|
69
|
+
<router-outlet />
|
|
70
|
+
```
|
|
45
71
|
|
|
46
|
-
|
|
72
|
+
With common options:
|
|
47
73
|
|
|
48
|
-
```
|
|
49
|
-
|
|
74
|
+
```html
|
|
75
|
+
<hlm-toaster
|
|
76
|
+
theme="system"
|
|
77
|
+
position="top-center"
|
|
78
|
+
[richColors]="true"
|
|
79
|
+
[expand]="true"
|
|
80
|
+
[closeButton]="true"
|
|
81
|
+
[duration]="5000"
|
|
82
|
+
[visibleToasts]="5"
|
|
83
|
+
/>
|
|
50
84
|
```
|
|
51
85
|
|
|
52
|
-
|
|
86
|
+
The component template forwards everything to `<ngx-sonner-toaster>` internally — you never write `<ngx-sonner-toaster>` yourself.
|
|
53
87
|
|
|
54
|
-
|
|
88
|
+
## API reference
|
|
55
89
|
|
|
56
|
-
|
|
57
|
-
|
|
90
|
+
### `HlmToaster` — selector `hlm-toaster` (component)
|
|
91
|
+
|
|
92
|
+
All inputs are Angular signal `input()`s mirroring `ToasterProps` from `ngx-sonner`.
|
|
93
|
+
|
|
94
|
+
| Input | Type | Default | Description |
|
|
95
|
+
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
96
|
+
| `invert` | `boolean` (coerced with `booleanAttribute`) | `false` | Dark mode inversion. |
|
|
97
|
+
| `theme` | `ToasterProps['theme']` (`'light' \| 'dark' \| 'system'` approx.) | `'light'` | Color theme of the toasts. |
|
|
98
|
+
| `position` | `ToasterProps['position']` | `'bottom-right'` | Screen corner/edge: e.g. `top-left`, `top-center`, `top-right`, `bottom-left`, `bottom-center`, `bottom-right`. |
|
|
99
|
+
| `hotKey` | `ToasterProps['hotkey']` (`string[]`) | `['altKey', 'KeyT']` | Hotkey that focuses/expands toasts. |
|
|
100
|
+
| `richColors` | `boolean` (coerced) | `false` | Success/error color accents. |
|
|
101
|
+
| `expand` | `boolean` (coerced) | `false` | Expand all toasts by default (else stacked). |
|
|
102
|
+
| `duration` | `number` (coerced with `numberAttribute`) | `4000` | Default toast lifetime in ms. |
|
|
103
|
+
| `visibleToasts` | `number` (coerced) | `3` | Max simultaneously visible toasts. |
|
|
104
|
+
| `closeButton` | `boolean` (coerced) | `false` | Show an × close button on every toast. |
|
|
105
|
+
| `toastOptions` | `ToasterProps['toastOptions']` | `{ classes: { toast: 'group toast group-[.toaster]:bg-background …', description: 'group-[.toast]:text-muted-foreground', actionButton: 'group-[.toast]:bg-primary …', cancelButton: 'group-[.toast]:bg-muted …' } }` | Per-toast default options + shadcn class overrides. |
|
|
106
|
+
| `offset` | `ToasterProps['offset']` | `null` | Pixel offset from the viewport edge. |
|
|
107
|
+
| `dir` | `ToasterProps['dir']` | `'auto'` | Text direction (`auto` / `ltr` / `rtl`). |
|
|
108
|
+
| `class` | `ClassValue` (aliased input `userClass`) | `''` | Extra classes merged via `hlm('toaster group', …)` onto the outlet. |
|
|
109
|
+
| `style` | `Record<string, string>` (aliased input `userStyle`) | `{}` | Inline styles forwarded to `ngx-sonner-toaster`. |
|
|
110
|
+
|
|
111
|
+
No outputs, no methods. The host element gets computed class `toaster group` (+ your `class`).
|
|
112
|
+
|
|
113
|
+
> `toast()`, `toast.success()`, `toast.error()`, `toast.promise()`, `toast.dismiss()` etc. are imported from **`ngx-sonner`**, not from this subpath:
|
|
114
|
+
>
|
|
115
|
+
> ```ts
|
|
116
|
+
> import { toast } from 'ngx-sonner';
|
|
117
|
+
> ```
|
|
118
|
+
|
|
119
|
+
## Examples
|
|
120
|
+
|
|
121
|
+
### 1. Basic setup + plain toast
|
|
122
|
+
|
|
123
|
+
Add the outlet once at the app root.
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
// app.component.ts
|
|
127
|
+
import { Component } from '@angular/core';
|
|
128
|
+
import { HlmToasterImports } from '@egose/shadcn-theme-ng/sonner';
|
|
129
|
+
|
|
130
|
+
@Component({
|
|
131
|
+
selector: 'app-root',
|
|
132
|
+
standalone: true,
|
|
133
|
+
imports: [...HlmToasterImports],
|
|
134
|
+
template: `
|
|
135
|
+
<hlm-toaster />
|
|
136
|
+
<router-outlet />
|
|
137
|
+
`,
|
|
138
|
+
})
|
|
139
|
+
export class AppComponent {}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Fire a toast from anywhere:
|
|
143
|
+
|
|
144
|
+
```ts
|
|
145
|
+
// demo.component.ts
|
|
146
|
+
import { Component } from '@angular/core';
|
|
147
|
+
import { toast } from 'ngx-sonner';
|
|
148
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
149
|
+
|
|
150
|
+
@Component({
|
|
151
|
+
selector: 'demo-basic',
|
|
152
|
+
standalone: true,
|
|
153
|
+
imports: [HlmButton],
|
|
154
|
+
template: `<button hlmBtn (click)="notify()">Show toast</button>`,
|
|
155
|
+
})
|
|
156
|
+
export class DemoBasic {
|
|
157
|
+
notify() {
|
|
158
|
+
toast('Event created', { description: 'Your event is now live.' });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 2. Success / error / warning states
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
// demo-states.component.ts
|
|
167
|
+
import { Component } from '@angular/core';
|
|
168
|
+
import { toast } from 'ngx-sonner';
|
|
169
|
+
import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
|
|
170
|
+
|
|
171
|
+
@Component({
|
|
172
|
+
selector: 'demo-states',
|
|
173
|
+
standalone: true,
|
|
174
|
+
imports: [...HlmButtonImports],
|
|
175
|
+
template: `
|
|
176
|
+
<div class="flex gap-2">
|
|
177
|
+
<button hlmBtn variant="default" (click)="ok()">Success</button>
|
|
178
|
+
<button hlmBtn variant="destructive" (click)="fail()">Error</button>
|
|
179
|
+
<button hlmBtn variant="secondary" (click)="warn()">Warning</button>
|
|
180
|
+
<button hlmBtn variant="outline" (click)="info()">Info</button>
|
|
181
|
+
</div>
|
|
182
|
+
`,
|
|
183
|
+
})
|
|
184
|
+
export class DemoStates {
|
|
185
|
+
ok() {
|
|
186
|
+
toast.success('Profile saved', { description: 'Your changes are live.' });
|
|
187
|
+
}
|
|
188
|
+
fail() {
|
|
189
|
+
toast.error('Upload failed', { description: 'File exceeds 10 MB.' });
|
|
190
|
+
}
|
|
191
|
+
warn() {
|
|
192
|
+
toast.warning('Session expiring', { description: 'You will be logged out in 2 minutes.' });
|
|
193
|
+
}
|
|
194
|
+
info() {
|
|
195
|
+
toast.info('New version', { description: 'Refresh to get the latest UI.' });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
58
198
|
```
|
|
59
199
|
|
|
60
|
-
|
|
200
|
+
### 3. Positions, themes, rich colors
|
|
201
|
+
|
|
202
|
+
```html
|
|
203
|
+
<!-- Top-center, system theme, colored toasts with close buttons -->
|
|
204
|
+
<hlm-toaster position="top-center" theme="system" [richColors]="true" [closeButton]="true" [expand]="true" />
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
```ts
|
|
208
|
+
import { Component, signal } from '@angular/core';
|
|
209
|
+
import { HlmToasterImports } from '@egose/shadcn-theme-ng/sonner';
|
|
210
|
+
|
|
211
|
+
@Component({
|
|
212
|
+
selector: 'demo-position',
|
|
213
|
+
standalone: true,
|
|
214
|
+
imports: [...HlmToasterImports],
|
|
215
|
+
template: ` <hlm-toaster [position]="position()" theme="dark" [visibleToasts]="5" /> `,
|
|
216
|
+
})
|
|
217
|
+
export class DemoPosition {
|
|
218
|
+
// 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'
|
|
219
|
+
readonly position = signal<'top-center'>('top-center');
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 4. Actions, cancellation, and durations
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
// demo-actions.component.ts
|
|
227
|
+
import { Component } from '@angular/core';
|
|
228
|
+
import { toast } from 'ngx-sonner';
|
|
229
|
+
import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
|
|
230
|
+
|
|
231
|
+
@Component({
|
|
232
|
+
selector: 'demo-actions',
|
|
233
|
+
standalone: true,
|
|
234
|
+
imports: [...HlmButtonImports],
|
|
235
|
+
template: `
|
|
236
|
+
<div class="flex gap-2">
|
|
237
|
+
<button hlmBtn (click)="withAction()">Undoable delete</button>
|
|
238
|
+
<button hlmBtn variant="outline" (click)="sticky()">Sticky toast</button>
|
|
239
|
+
<button hlmBtn variant="ghost" (click)="dismissAll()">Dismiss all</button>
|
|
240
|
+
</div>
|
|
241
|
+
`,
|
|
242
|
+
})
|
|
243
|
+
export class DemoActions {
|
|
244
|
+
withAction() {
|
|
245
|
+
toast('Conversation archived', {
|
|
246
|
+
description: 'You can undo this within 10 seconds.',
|
|
247
|
+
duration: 10000,
|
|
248
|
+
action: { label: 'Undo', onClick: () => toast.success('Restored') },
|
|
249
|
+
cancel: { label: 'Dismiss', onClick: () => {} },
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
sticky() {
|
|
253
|
+
toast('Sync paused — offline', { duration: Infinity, closeButton: true });
|
|
254
|
+
}
|
|
255
|
+
dismissAll() {
|
|
256
|
+
toast.dismiss();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 5. Async / promise toasts (loading → success → error)
|
|
262
|
+
|
|
263
|
+
```ts
|
|
264
|
+
// demo-promise.component.ts
|
|
265
|
+
import { Component, inject } from '@angular/core';
|
|
266
|
+
import { HttpClient } from '@angular/common/http';
|
|
267
|
+
import { toast } from 'ngx-sonner';
|
|
268
|
+
import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
|
|
269
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
270
|
+
|
|
271
|
+
@Component({
|
|
272
|
+
selector: 'demo-promise',
|
|
273
|
+
standalone: true,
|
|
274
|
+
imports: [...HlmButtonImports, ...HlmSpinnerImports],
|
|
275
|
+
template: `<button hlmBtn (click)="save()">Save report</button>`,
|
|
276
|
+
})
|
|
277
|
+
export class DemoPromise {
|
|
278
|
+
private readonly http = inject(HttpClient);
|
|
279
|
+
|
|
280
|
+
save() {
|
|
281
|
+
const request = this.http.post('/api/reports', { title: 'Q3' }).toPromise();
|
|
282
|
+
toast.promise(request, {
|
|
283
|
+
loading: 'Saving report…',
|
|
284
|
+
success: 'Report saved',
|
|
285
|
+
error: 'Could not save report',
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Combine with a spinner while the promise is pending by driving `show` from a signal — see `@egose/shadcn-theme-ng/spinner`.
|
|
292
|
+
|
|
293
|
+
### 6. Custom styling via `toastOptions`, `class`, and `style`
|
|
294
|
+
|
|
295
|
+
```ts
|
|
296
|
+
// app.component.ts
|
|
297
|
+
import { Component } from '@angular/core';
|
|
298
|
+
import { HlmToasterImports } from '@egose/shadcn-theme-ng/sonner';
|
|
299
|
+
|
|
300
|
+
@Component({
|
|
301
|
+
selector: 'app-root',
|
|
302
|
+
standalone: true,
|
|
303
|
+
imports: [...HlmToasterImports],
|
|
304
|
+
template: ` <hlm-toaster class="my-toaster" [toastOptions]="toastOptions" [offset]="24" dir="ltr" /> `,
|
|
305
|
+
})
|
|
306
|
+
export class AppComponent {
|
|
307
|
+
readonly toastOptions = {
|
|
308
|
+
classes: {
|
|
309
|
+
toast: 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground',
|
|
310
|
+
description: 'group-[.toast]:text-muted-foreground',
|
|
311
|
+
actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',
|
|
312
|
+
cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',
|
|
313
|
+
},
|
|
314
|
+
// per-toast defaults can also set duration/style here
|
|
315
|
+
duration: 6000,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Per-toast override (description + action button classes come from `toastOptions.classes` above unless overridden):
|
|
321
|
+
|
|
322
|
+
```ts
|
|
323
|
+
toast('Custom toast', {
|
|
324
|
+
description: 'This toast uses the global toastOptions classes.',
|
|
325
|
+
className: 'border-primary',
|
|
326
|
+
style: { borderWidth: '2px' },
|
|
327
|
+
});
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Accessibility notes
|
|
331
|
+
|
|
332
|
+
- `ngx-sonner` renders toasts in an `aria-live` region so screen readers announce them; keep messages short and put detail in `description`.
|
|
333
|
+
- Always pair an icon-only trigger with visible text or an `aria-label` on the button that fires the toast.
|
|
334
|
+
- Do not use toasts as the only feedback for errors on form submit — also surface the error inline near the field (the `description` alone is not focusable).
|
|
335
|
+
- `duration: Infinity` toasts trap no focus but persist; always provide a `closeButton` or explicit dismiss action for sticky toasts.
|
|
336
|
+
- Hotkey defaults to `Alt+T` (`hotKey` input); document it if your app relies on keyboard flows, or override it to avoid conflicts.
|
|
337
|
+
|
|
338
|
+
## Theming / CSS variables
|
|
339
|
+
|
|
340
|
+
The outlet merges `hlm('toaster group', userClass)` and ships `toastOptions.classes` mapped onto shadcn theme tokens (`bg-background`, `text-foreground`, `border-border`, `bg-primary`, `bg-muted`, …). It follows your shadcn CSS-variable theme automatically. Override via the `class` input (outlet position/layout) or `toastOptions.classes` (toast/description/action/cancel styling).
|
|
61
341
|
|
|
62
|
-
##
|
|
342
|
+
## Related subpaths
|
|
63
343
|
|
|
64
|
-
|
|
344
|
+
- `@egose/shadcn-theme-ng/button` — trigger buttons for toast demos.
|
|
345
|
+
- `@egose/shadcn-theme-ng/spinner` — loading indicator to pair with `toast.promise()`.
|
|
346
|
+
- `@egose/shadcn-theme-ng/alert` / `@egose/shadcn-theme-ng/basic-alert` — persistent inline feedback (vs. transient toasts).
|
|
347
|
+
- `@egose/shadcn-theme-ng/utils` — `hlm()` merger used internally for outlet classes.
|
|
@@ -31,10 +31,10 @@ class HlmToaster {
|
|
|
31
31
|
...(ngDevMode ? [{ debugName: "dir" }] : /* istanbul ignore next */ []));
|
|
32
32
|
userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
|
|
33
33
|
userStyle = input({}, { ...(ngDevMode ? { debugName: "userStyle" } : /* istanbul ignore next */ {}), alias: 'style' });
|
|
34
|
-
_computedClass = computed(() => hlm('toaster group', this.userClass()), /* @ts-ignore */
|
|
34
|
+
_computedClass = computed(() => hlm('toaster tw:group', this.userClass()), /* @ts-ignore */
|
|
35
35
|
...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
|
|
36
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
37
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.
|
|
36
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToaster, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.3", type: HlmToaster, isStandalone: true, selector: "hlm-toaster", inputs: { invert: { classPropertyName: "invert", publicName: "invert", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, hotKey: { classPropertyName: "hotKey", publicName: "hotKey", isSignal: true, isRequired: false, transformFunction: null }, richColors: { classPropertyName: "richColors", publicName: "richColors", isSignal: true, isRequired: false, transformFunction: null }, expand: { classPropertyName: "expand", publicName: "expand", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, visibleToasts: { classPropertyName: "visibleToasts", publicName: "visibleToasts", isSignal: true, isRequired: false, transformFunction: null }, closeButton: { classPropertyName: "closeButton", publicName: "closeButton", isSignal: true, isRequired: false, transformFunction: null }, toastOptions: { classPropertyName: "toastOptions", publicName: "toastOptions", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, userStyle: { classPropertyName: "userStyle", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
38
38
|
<ngx-sonner-toaster
|
|
39
39
|
[class]="_computedClass()"
|
|
40
40
|
[invert]="invert()"
|
|
@@ -53,7 +53,7 @@ class HlmToaster {
|
|
|
53
53
|
/>
|
|
54
54
|
`, isInline: true, dependencies: [{ kind: "component", type: NgxSonnerToaster, selector: "ngx-sonner-toaster", inputs: ["invert", "theme", "position", "hotKey", "richColors", "expand", "duration", "visibleToasts", "closeButton", "toastOptions", "offset", "dir", "class", "style"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
55
55
|
}
|
|
56
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToaster, decorators: [{
|
|
57
57
|
type: Component,
|
|
58
58
|
args: [{
|
|
59
59
|
selector: 'hlm-toaster',
|
|
@@ -85,11 +85,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
85
85
|
*/
|
|
86
86
|
const HlmToasterImports = [HlmToaster];
|
|
87
87
|
class HlmToasterModule {
|
|
88
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
89
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.
|
|
90
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.
|
|
88
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToasterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
89
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmToasterModule, imports: [HlmToaster], exports: [HlmToaster] });
|
|
90
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToasterModule, imports: [HlmToasterImports] });
|
|
91
91
|
}
|
|
92
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToasterModule, decorators: [{
|
|
93
93
|
type: NgModule,
|
|
94
94
|
args: [{
|
|
95
95
|
imports: [...HlmToasterImports],
|
|
@@ -102,4 +102,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
102
102
|
*/
|
|
103
103
|
|
|
104
104
|
export { HlmToaster, HlmToasterImports, HlmToasterModule };
|
|
105
|
-
|
|
105
|
+
|