@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
|
@@ -9,7 +9,7 @@ import { NgIcon, provideIcons } from '@ng-icons/core';
|
|
|
9
9
|
import { lucideX } from '@ng-icons/lucide';
|
|
10
10
|
import { HlmBtn } from '@egose/shadcn-theme-ng-tw/button';
|
|
11
11
|
|
|
12
|
-
const hlmDialogOverlayClass = hlm('data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs');
|
|
12
|
+
const hlmDialogOverlayClass = hlm('tw:data-open:animate-in tw:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 tw:isolate tw:bg-black/10 tw:duration-100 tw:supports-backdrop-filter:backdrop-blur-xs');
|
|
13
13
|
class HlmDialogOverlay {
|
|
14
14
|
_classSettable = injectCustomClassSettable({ optional: true, host: true });
|
|
15
15
|
userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
|
|
@@ -21,10 +21,10 @@ class HlmDialogOverlay {
|
|
|
21
21
|
untracked(() => this._classSettable?.setClassToCustomElement(newClass));
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
25
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogOverlay, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
25
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmDialogOverlay, isStandalone: true, selector: "[hlmDialogOverlay],hlm-dialog-overlay", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, hostDirectives: [{ directive: i1.BrnDialogOverlay }], ngImport: i0 });
|
|
26
26
|
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogOverlay, decorators: [{
|
|
28
28
|
type: Directive,
|
|
29
29
|
args: [{
|
|
30
30
|
selector: '[hlmDialogOverlay],hlm-dialog-overlay',
|
|
@@ -33,8 +33,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
33
33
|
}], ctorParameters: () => [], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
34
34
|
|
|
35
35
|
class HlmDialog extends BrnDialog {
|
|
36
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
37
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.
|
|
36
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialog, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialog, isStandalone: true, selector: "hlm-dialog", providers: [
|
|
38
38
|
{
|
|
39
39
|
provide: BrnDialog,
|
|
40
40
|
useExisting: forwardRef(() => HlmDialog),
|
|
@@ -47,7 +47,7 @@ class HlmDialog extends BrnDialog {
|
|
|
47
47
|
<ng-content />
|
|
48
48
|
`, isInline: true, dependencies: [{ kind: "directive", type: HlmDialogOverlay, selector: "[hlmDialogOverlay],hlm-dialog-overlay", inputs: ["class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
49
49
|
}
|
|
50
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialog, decorators: [{
|
|
51
51
|
type: Component,
|
|
52
52
|
args: [{
|
|
53
53
|
selector: 'hlm-dialog',
|
|
@@ -71,10 +71,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
71
71
|
}] });
|
|
72
72
|
|
|
73
73
|
class HlmDialogClose {
|
|
74
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
75
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
74
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogClose, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
75
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogClose, isStandalone: true, selector: "button[hlmDialogClose]", host: { attributes: { "data-slot": "dialog-close" } }, hostDirectives: [{ directive: i1.BrnDialogClose }], ngImport: i0 });
|
|
76
76
|
}
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogClose, decorators: [{
|
|
78
78
|
type: Directive,
|
|
79
79
|
args: [{
|
|
80
80
|
selector: 'button[hlmDialogClose]',
|
|
@@ -93,12 +93,12 @@ class HlmDialogContent {
|
|
|
93
93
|
_dynamicComponentClass = this._dialogContext?.$dynamicComponentClass;
|
|
94
94
|
constructor() {
|
|
95
95
|
classes(() => [
|
|
96
|
-
'bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 ring-foreground/10 grid max-w-[calc(100%-2rem)] gap-6 rounded-xl p-6 text-sm ring-1 duration-100 sm:max-w-md relative mx-auto w-full outline-none sm:mx-0',
|
|
96
|
+
'tw:bg-popover tw:text-popover-foreground tw:data-open:animate-in tw:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 tw:data-closed:zoom-out-95 tw:data-open:zoom-in-95 tw:ring-foreground/10 tw:grid tw:max-w-[calc(100%-2rem)] tw:gap-6 tw:rounded-xl tw:p-6 tw:text-sm tw:ring-1 tw:duration-100 tw:sm:max-w-md tw:relative tw:mx-auto tw:w-full tw:outline-none tw:sm:mx-0',
|
|
97
97
|
this._dynamicComponentClass,
|
|
98
98
|
]);
|
|
99
99
|
}
|
|
100
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
101
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
100
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogContent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: HlmDialogContent, isStandalone: true, selector: "hlm-dialog-content", inputs: { showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "dialog-content" }, properties: { "attr.data-state": "state()" } }, providers: [provideIcons({ lucideX })], ngImport: i0, template: `
|
|
102
102
|
@if (component) {
|
|
103
103
|
<ng-container [ngComponentOutlet]="component" />
|
|
104
104
|
} @else {
|
|
@@ -106,14 +106,14 @@ class HlmDialogContent {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
@if (showCloseButton()) {
|
|
109
|
-
<button hlmBtn variant="ghost" size="icon-sm" class="absolute end-4 top-4" hlmDialogClose>
|
|
110
|
-
<span class="sr-only">close</span>
|
|
109
|
+
<button hlmBtn variant="ghost" size="icon-sm" class="tw:absolute tw:end-4 tw:top-4" hlmDialogClose>
|
|
110
|
+
<span class="tw:sr-only">close</span>
|
|
111
111
|
<ng-icon name="lucideX" />
|
|
112
112
|
</button>
|
|
113
113
|
}
|
|
114
114
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: HlmBtn, selector: "button[hlmBtn], a[hlmBtn]", inputs: ["variant", "size", "class", "type"], exportAs: ["hlmBtn"] }, { kind: "directive", type: HlmDialogClose, selector: "button[hlmDialogClose]" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
115
115
|
}
|
|
116
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogContent, decorators: [{
|
|
117
117
|
type: Component,
|
|
118
118
|
args: [{
|
|
119
119
|
selector: 'hlm-dialog-content',
|
|
@@ -132,8 +132,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
@if (showCloseButton()) {
|
|
135
|
-
<button hlmBtn variant="ghost" size="icon-sm" class="absolute end-4 top-4" hlmDialogClose>
|
|
136
|
-
<span class="sr-only">close</span>
|
|
135
|
+
<button hlmBtn variant="ghost" size="icon-sm" class="tw:absolute tw:end-4 tw:top-4" hlmDialogClose>
|
|
136
|
+
<span class="tw:sr-only">close</span>
|
|
137
137
|
<ng-icon name="lucideX" />
|
|
138
138
|
</button>
|
|
139
139
|
}
|
|
@@ -143,12 +143,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
143
143
|
|
|
144
144
|
class HlmDialogDescription {
|
|
145
145
|
constructor() {
|
|
146
|
-
classes(() => 'text-muted-foreground
|
|
146
|
+
classes(() => 'tw:text-muted-foreground tw:*:[a]:hover:text-foreground tw:text-sm tw:*:[a]:underline tw:*:[a]:underline-offset-3');
|
|
147
147
|
}
|
|
148
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
149
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
148
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogDescription, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
149
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogDescription, isStandalone: true, selector: "[hlmDialogDescription]", host: { attributes: { "data-slot": "dialog-description" } }, hostDirectives: [{ directive: i1.BrnDialogDescription }], ngImport: i0 });
|
|
150
150
|
}
|
|
151
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogDescription, decorators: [{
|
|
152
152
|
type: Directive,
|
|
153
153
|
args: [{
|
|
154
154
|
selector: '[hlmDialogDescription]',
|
|
@@ -159,12 +159,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
159
159
|
|
|
160
160
|
class HlmDialogFooter {
|
|
161
161
|
constructor() {
|
|
162
|
-
classes(() => 'flex flex-col-reverse gap-2 sm:flex-row sm:justify-end');
|
|
162
|
+
classes(() => 'tw:flex tw:flex-col-reverse tw:gap-2 tw:sm:flex-row tw:sm:justify-end');
|
|
163
163
|
}
|
|
164
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
165
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogFooter, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
165
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogFooter, isStandalone: true, selector: "[hlmDialogFooter],hlm-dialog-footer", host: { attributes: { "data-slot": "dialog-footer" } }, ngImport: i0 });
|
|
166
166
|
}
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogFooter, decorators: [{
|
|
168
168
|
type: Directive,
|
|
169
169
|
args: [{
|
|
170
170
|
selector: '[hlmDialogFooter],hlm-dialog-footer',
|
|
@@ -174,12 +174,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
174
174
|
|
|
175
175
|
class HlmDialogHeader {
|
|
176
176
|
constructor() {
|
|
177
|
-
classes(() => 'gap-2 flex flex-col');
|
|
177
|
+
classes(() => 'tw:gap-2 tw:flex tw:flex-col');
|
|
178
178
|
}
|
|
179
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
180
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
179
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
180
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogHeader, isStandalone: true, selector: "[hlmDialogHeader],hlm-dialog-header", host: { attributes: { "data-slot": "dialog-header" } }, ngImport: i0 });
|
|
181
181
|
}
|
|
182
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogHeader, decorators: [{
|
|
183
183
|
type: Directive,
|
|
184
184
|
args: [{
|
|
185
185
|
selector: '[hlmDialogHeader],hlm-dialog-header',
|
|
@@ -188,10 +188,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
188
188
|
}], ctorParameters: () => [] });
|
|
189
189
|
|
|
190
190
|
class HlmDialogPortal {
|
|
191
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
192
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
191
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogPortal, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
192
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogPortal, isStandalone: true, selector: "[hlmDialogPortal]", hostDirectives: [{ directive: i1.BrnDialogContent, inputs: ["context", "context", "class", "class"] }], ngImport: i0 });
|
|
193
193
|
}
|
|
194
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogPortal, decorators: [{
|
|
195
195
|
type: Directive,
|
|
196
196
|
args: [{
|
|
197
197
|
selector: '[hlmDialogPortal]',
|
|
@@ -201,12 +201,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
201
201
|
|
|
202
202
|
class HlmDialogTitle {
|
|
203
203
|
constructor() {
|
|
204
|
-
classes(() => 'leading-none font-medium');
|
|
204
|
+
classes(() => 'tw:leading-none tw:font-medium');
|
|
205
205
|
}
|
|
206
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
207
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
206
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogTitle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
207
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogTitle, isStandalone: true, selector: "[hlmDialogTitle]", host: { attributes: { "data-slot": "dialog-title" } }, hostDirectives: [{ directive: i1.BrnDialogTitle }], ngImport: i0 });
|
|
208
208
|
}
|
|
209
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
209
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogTitle, decorators: [{
|
|
210
210
|
type: Directive,
|
|
211
211
|
args: [{
|
|
212
212
|
selector: '[hlmDialogTitle]',
|
|
@@ -216,10 +216,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
216
216
|
}], ctorParameters: () => [] });
|
|
217
217
|
|
|
218
218
|
class HlmDialogTrigger {
|
|
219
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
220
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.
|
|
219
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
220
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmDialogTrigger, isStandalone: true, selector: "button[hlmDialogTrigger],button[hlmDialogTriggerFor]", host: { attributes: { "data-slot": "dialog-trigger" } }, hostDirectives: [{ directive: i1.BrnDialogTrigger, inputs: ["id", "id", "brnDialogTriggerFor", "hlmDialogTriggerFor", "type", "type"] }], ngImport: i0 });
|
|
221
221
|
}
|
|
222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogTrigger, decorators: [{
|
|
223
223
|
type: Directive,
|
|
224
224
|
args: [{
|
|
225
225
|
selector: 'button[hlmDialogTrigger],button[hlmDialogTriggerFor]',
|
|
@@ -243,10 +243,10 @@ class HlmDialogService {
|
|
|
243
243
|
};
|
|
244
244
|
return this._brnDialogService.open(HlmDialogContent, undefined, mergedOptions.context, mergedOptions);
|
|
245
245
|
}
|
|
246
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
247
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
246
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
247
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogService, providedIn: 'root' });
|
|
248
248
|
}
|
|
249
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogService, decorators: [{
|
|
250
250
|
type: Injectable,
|
|
251
251
|
args: [{
|
|
252
252
|
providedIn: 'root',
|
|
@@ -269,8 +269,8 @@ const HlmDialogImports = [
|
|
|
269
269
|
HlmDialogClose,
|
|
270
270
|
];
|
|
271
271
|
class HlmDialogModule {
|
|
272
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
273
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.
|
|
272
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
273
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogModule, imports: [HlmDialog,
|
|
274
274
|
HlmDialogContent,
|
|
275
275
|
HlmDialogDescription,
|
|
276
276
|
HlmDialogFooter,
|
|
@@ -289,9 +289,9 @@ class HlmDialogModule {
|
|
|
289
289
|
HlmDialogTitle,
|
|
290
290
|
HlmDialogTrigger,
|
|
291
291
|
HlmDialogClose] });
|
|
292
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.
|
|
292
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogModule, imports: [HlmDialogContent] });
|
|
293
293
|
}
|
|
294
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmDialogModule, decorators: [{
|
|
295
295
|
type: NgModule,
|
|
296
296
|
args: [{
|
|
297
297
|
imports: [...HlmDialogImports],
|
|
@@ -304,4 +304,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
304
304
|
*/
|
|
305
305
|
|
|
306
306
|
export { HlmDialog, HlmDialogClose, HlmDialogContent, HlmDialogDescription, HlmDialogFooter, HlmDialogHeader, HlmDialogImports, HlmDialogModule, HlmDialogOverlay, HlmDialogPortal, HlmDialogService, HlmDialogTitle, HlmDialogTrigger, hlmDialogOverlayClass };
|
|
307
|
-
|
|
307
|
+
|
package/drawer/README.md
CHANGED
|
@@ -1,11 +1,401 @@
|
|
|
1
|
-
# Drawer
|
|
1
|
+
# Drawer (`@egose/shadcn-theme-ng/drawer`)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A swipeable bottom/side panel in the shadcn/ui Drawer (vaul-style) look: overlay + sliding content with header, title, description, and footer slots. Equivalent to shadcn/ui `Drawer`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The Angular implementation is a thin styling layer over the headless
|
|
6
|
+
[`BrnDrawer*` primitives from `@spartan-ng/brain/drawer`](https://www.spartan-ng.com/) (built on the
|
|
7
|
+
brain dialog core): `HlmDrawer` extends `BrnDrawer`, `HlmDrawerContent` composes `BrnDrawerHandle`
|
|
8
|
+
with direction-aware slide animations, and trigger/close/title/description/overlay directives compose
|
|
9
|
+
their `Brn*` counterparts via `hostDirectives`. Styling uses `hlm()` / `classes()` from
|
|
10
|
+
`@egose/shadcn-theme-ng/utils`.
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
> **Ships as:** `@egose/shadcn-theme-ng/drawer` and `@egose/shadcn-theme-ng-tw/drawer`
|
|
13
|
+
> (the `tw:`-prefixed Tailwind variant). Both expose the identical TypeScript surface; only the
|
|
14
|
+
> emitted Tailwind class strings differ. See the [package README](../../README.md) for install
|
|
15
|
+
> steps, peer dependencies, and Tailwind setup. Do not publish this project directory independently.
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
8
18
|
|
|
9
19
|
```bash
|
|
10
|
-
|
|
20
|
+
# Plain Tailwind (no prefix)
|
|
21
|
+
npm install @egose/shadcn-theme-ng
|
|
22
|
+
|
|
23
|
+
# tw:-prefixed Tailwind variant
|
|
24
|
+
npm install @egose/shadcn-theme-ng-tw
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Peer dependencies (Angular, `@spartan-ng/brain`, `@ng-icons/*`, `rxjs`, …) are documented in the
|
|
28
|
+
[package README](../../README.md#peer-dependencies). This subpath has no extra runtime component
|
|
29
|
+
dependencies beyond `@egose/shadcn-theme-ng/utils`.
|
|
30
|
+
|
|
31
|
+
## Imports
|
|
32
|
+
|
|
33
|
+
All symbols are exported from the subpath root (`projects/drawer/src/public-api.ts`):
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import {
|
|
37
|
+
HlmDrawer,
|
|
38
|
+
HlmDrawerContent,
|
|
39
|
+
HlmDrawerTrigger,
|
|
40
|
+
HlmDrawerClose,
|
|
41
|
+
HlmDrawerOverlay,
|
|
42
|
+
HlmDrawerPortal,
|
|
43
|
+
HlmDrawerTitle,
|
|
44
|
+
HlmDrawerDescription,
|
|
45
|
+
HlmDrawerHeader,
|
|
46
|
+
HlmDrawerFooter,
|
|
47
|
+
HlmDrawerImports,
|
|
48
|
+
HlmDrawerModule,
|
|
49
|
+
} from '@egose/shadcn-theme-ng/drawer';
|
|
50
|
+
// tw variant: replace with '@egose/shadcn-theme-ng-tw/drawer'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Standalone component — spread the `*Imports` array:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { Component } from '@angular/core';
|
|
57
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
58
|
+
|
|
59
|
+
@Component({
|
|
60
|
+
selector: 'app-demo',
|
|
61
|
+
standalone: true,
|
|
62
|
+
imports: [...HlmDrawerImports],
|
|
63
|
+
template: `...`,
|
|
64
|
+
})
|
|
65
|
+
export class DemoComponent {}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
NgModule-based consumer — import the module:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { NgModule } from '@angular/core';
|
|
72
|
+
import { HlmDrawerModule } from '@egose/shadcn-theme-ng/drawer';
|
|
73
|
+
|
|
74
|
+
@NgModule({ imports: [HlmDrawerModule] })
|
|
75
|
+
export class DemoModule {}
|
|
11
76
|
```
|
|
77
|
+
|
|
78
|
+
## Anatomy / Structure
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<hlm-drawer>
|
|
82
|
+
<button hlmBtn variant="outline" hlmDrawerTrigger>Open drawer</button>
|
|
83
|
+
|
|
84
|
+
<hlm-drawer-content>
|
|
85
|
+
<div hlmDrawerHeader>
|
|
86
|
+
<h2 hlmDrawerTitle>Edit profile</h2>
|
|
87
|
+
<p hlmDrawerDescription>Make changes here.</p>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<p class="tw:px-4">Drawer body…</p>
|
|
91
|
+
|
|
92
|
+
<div hlmDrawerFooter>
|
|
93
|
+
<button hlmBtn hlmDrawerClose>Close</button>
|
|
94
|
+
</div>
|
|
95
|
+
</hlm-drawer-content>
|
|
96
|
+
</hlm-drawer>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Real selectors (from source):
|
|
100
|
+
|
|
101
|
+
| Class | Selector(s) | Kind |
|
|
102
|
+
| ---------------------- | ---------------------------------------- | ------------------------------- |
|
|
103
|
+
| `HlmDrawer` | `hlm-drawer` | Component (extends `BrnDrawer`) |
|
|
104
|
+
| `HlmDrawerContent` | `hlm-drawer-content` | Component |
|
|
105
|
+
| `HlmDrawerTrigger` | `button[hlmDrawerTrigger]` | Directive (thin wrapper) |
|
|
106
|
+
| `HlmDrawerClose` | `button[hlmDrawerClose]` | Directive (thin wrapper) |
|
|
107
|
+
| `HlmDrawerOverlay` | `[hlmDrawerOverlay], hlm-drawer-overlay` | Directive |
|
|
108
|
+
| `HlmDrawerPortal` | `[hlmDrawerPortal]` | Directive |
|
|
109
|
+
| `HlmDrawerTitle` | `[hlmDrawerTitle]` | Directive |
|
|
110
|
+
| `HlmDrawerDescription` | `[hlmDrawerDescription]` | Directive |
|
|
111
|
+
| `HlmDrawerHeader` | `[hlmDrawerHeader], hlm-drawer-header` | Directive |
|
|
112
|
+
| `HlmDrawerFooter` | `[hlmDrawerFooter], hlm-drawer-footer` | Directive |
|
|
113
|
+
|
|
114
|
+
## API reference
|
|
115
|
+
|
|
116
|
+
### `HlmDrawer` — `hlm-drawer`
|
|
117
|
+
|
|
118
|
+
Root drawer state host. Extends `BrnDrawer` (and provides `BrnDialog` + `BrnDrawer` tokens). Renders `<hlm-drawer-overlay />` plus projected content. `exportAs: 'hlmDrawer'`.
|
|
119
|
+
|
|
120
|
+
No new inputs/outputs — direction and dialog options come from the trigger (`direction`) and brain defaults.
|
|
121
|
+
|
|
122
|
+
### `HlmDrawerContent` — `hlm-drawer-content`
|
|
123
|
+
|
|
124
|
+
The sliding panel. Hosts `BrnDrawerHandle` (swipe/drag, `closeThreshold` input forwarded), exposes `data-vaul-drawer-direction` and `data-state`, and renders the drag handle bar for bottom drawers plus projected content.
|
|
125
|
+
|
|
126
|
+
| Input (forwarded) | Type | Description |
|
|
127
|
+
| ----------------- | ------------------------------ | ------------------------------------- |
|
|
128
|
+
| `closeThreshold` | forwarded to `BrnDrawerHandle` | Drag distance that closes the drawer. |
|
|
129
|
+
|
|
130
|
+
| Member | Description |
|
|
131
|
+
| ------- | ------------------------------------------------------------------------------------ |
|
|
132
|
+
| `state` | Current open state signal (from the exposed state provider, defaults to `'closed'`). |
|
|
133
|
+
|
|
134
|
+
Direction styling (`bottom` default, plus `top` / `left` / `right`) is driven by the trigger's `direction` via `data-vaul-drawer-direction` selectors.
|
|
135
|
+
|
|
136
|
+
### `HlmDrawerTrigger` — `button[hlmDrawerTrigger]`
|
|
137
|
+
|
|
138
|
+
Thin wrapper. Forwards `id`, `direction`, `type` to `BrnDrawerTrigger` via `hostDirectives`. Set `direction="left" | "right" | "top" | "bottom"` here.
|
|
139
|
+
|
|
140
|
+
### `HlmDrawerClose` — `button[hlmDrawerClose]`
|
|
141
|
+
|
|
142
|
+
Thin wrapper around `BrnDrawerClose`. Place on any `<button>` inside the drawer to close it.
|
|
143
|
+
|
|
144
|
+
### `HlmDrawerOverlay` — `[hlmDrawerOverlay], hlm-drawer-overlay`
|
|
145
|
+
|
|
146
|
+
Backdrop. Wraps `BrnDrawerOverlay`; merges `class` via `hlm()`.
|
|
147
|
+
|
|
148
|
+
| Input | Type | Default | Description |
|
|
149
|
+
| ------- | ------------ | ------- | --------------------------------------------------- |
|
|
150
|
+
| `class` | `ClassValue` | `''` | Extra classes merged over the base overlay classes. |
|
|
151
|
+
|
|
152
|
+
### `HlmDrawerPortal` — `[hlmDrawerPortal]`
|
|
153
|
+
|
|
154
|
+
Thin wrapper forwarding `context` and `class` to `BrnDrawerContent` for portal-based content.
|
|
155
|
+
|
|
156
|
+
### `HlmDrawerTitle` — `[hlmDrawerTitle]` / `HlmDrawerDescription` — `[hlmDrawerDescription]`
|
|
157
|
+
|
|
158
|
+
Accessible title/description. Wrap `BrnDrawerTitle` / `BrnDrawerDescription` plus shadcn typography. No inputs.
|
|
159
|
+
|
|
160
|
+
### `HlmDrawerHeader` / `HlmDrawerFooter`
|
|
161
|
+
|
|
162
|
+
Pure layout directives, no inputs. Header centers text on top/bottom drawers; footer stacks actions with `mt-auto`.
|
|
163
|
+
|
|
164
|
+
## Examples
|
|
165
|
+
|
|
166
|
+
### 1. Basic bottom drawer
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { Component } from '@angular/core';
|
|
170
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
171
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
172
|
+
|
|
173
|
+
@Component({
|
|
174
|
+
selector: 'app-basic-drawer',
|
|
175
|
+
standalone: true,
|
|
176
|
+
imports: [...HlmDrawerImports, HlmButton],
|
|
177
|
+
template: `
|
|
178
|
+
<hlm-drawer>
|
|
179
|
+
<button hlmBtn variant="outline" hlmDrawerTrigger>Open drawer</button>
|
|
180
|
+
<hlm-drawer-content>
|
|
181
|
+
<div hlmDrawerHeader>
|
|
182
|
+
<h2 hlmDrawerTitle>Are you sure?</h2>
|
|
183
|
+
<p hlmDrawerDescription>This action cannot be undone.</p>
|
|
184
|
+
</div>
|
|
185
|
+
<div hlmDrawerFooter>
|
|
186
|
+
<button hlmBtn hlmDrawerClose>Close</button>
|
|
187
|
+
</div>
|
|
188
|
+
</hlm-drawer-content>
|
|
189
|
+
</hlm-drawer>
|
|
190
|
+
`,
|
|
191
|
+
})
|
|
192
|
+
export class BasicDrawerComponent {}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 2. Direction variants (left / right / top)
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
import { Component } from '@angular/core';
|
|
199
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
200
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
201
|
+
|
|
202
|
+
@Component({
|
|
203
|
+
selector: 'app-directions',
|
|
204
|
+
standalone: true,
|
|
205
|
+
imports: [...HlmDrawerImports, HlmButton],
|
|
206
|
+
template: `
|
|
207
|
+
<hlm-drawer>
|
|
208
|
+
<button hlmBtn variant="outline" hlmDrawerTrigger direction="right">Right panel</button>
|
|
209
|
+
<hlm-drawer-content>
|
|
210
|
+
<div hlmDrawerHeader>
|
|
211
|
+
<h2 hlmDrawerTitle>Right drawer</h2>
|
|
212
|
+
<p hlmDrawerDescription>Slides in from the right.</p>
|
|
213
|
+
</div>
|
|
214
|
+
<div hlmDrawerFooter>
|
|
215
|
+
<button hlmBtn variant="outline" hlmDrawerClose>Close</button>
|
|
216
|
+
</div>
|
|
217
|
+
</hlm-drawer-content>
|
|
218
|
+
</hlm-drawer>
|
|
219
|
+
|
|
220
|
+
<hlm-drawer>
|
|
221
|
+
<button hlmBtn variant="outline" hlmDrawerTrigger direction="left">Left panel</button>
|
|
222
|
+
<hlm-drawer-content>
|
|
223
|
+
<div hlmDrawerHeader>
|
|
224
|
+
<h2 hlmDrawerTitle>Left drawer</h2>
|
|
225
|
+
<p hlmDrawerDescription>Slides in from the left.</p>
|
|
226
|
+
</div>
|
|
227
|
+
</hlm-drawer-content>
|
|
228
|
+
</hlm-drawer>
|
|
229
|
+
`,
|
|
230
|
+
})
|
|
231
|
+
export class DirectionsComponent {}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 3. Form drawer with footer actions
|
|
235
|
+
|
|
236
|
+
```ts
|
|
237
|
+
import { Component, inject } from '@angular/core';
|
|
238
|
+
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
239
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
240
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
241
|
+
import { HlmLabel } from '@egose/shadcn-theme-ng/label';
|
|
242
|
+
import { HlmInput } from '@egose/shadcn-theme-ng/input';
|
|
243
|
+
|
|
244
|
+
@Component({
|
|
245
|
+
selector: 'app-form-drawer',
|
|
246
|
+
standalone: true,
|
|
247
|
+
imports: [ReactiveFormsModule, HlmLabel, HlmInput, HlmButton, ...HlmDrawerImports],
|
|
248
|
+
template: `
|
|
249
|
+
<hlm-drawer>
|
|
250
|
+
<button hlmBtn hlmDrawerTrigger>New goal</button>
|
|
251
|
+
<hlm-drawer-content>
|
|
252
|
+
<div hlmDrawerHeader>
|
|
253
|
+
<h2 hlmDrawerTitle>New goal</h2>
|
|
254
|
+
<p hlmDrawerDescription>Set a goal for this week.</p>
|
|
255
|
+
</div>
|
|
256
|
+
<form [formGroup]="form" class="tw:grid tw:gap-4 tw:px-4">
|
|
257
|
+
<label hlmLabel for="goal">Goal</label>
|
|
258
|
+
<input hlmInput id="goal" formControlName="goal" placeholder="Exercise 3x" />
|
|
259
|
+
</form>
|
|
260
|
+
<div hlmDrawerFooter>
|
|
261
|
+
<button hlmBtn [disabled]="form.invalid" hlmDrawerClose (click)="save()">Save</button>
|
|
262
|
+
<button hlmBtn variant="outline" hlmDrawerClose>Cancel</button>
|
|
263
|
+
</div>
|
|
264
|
+
</hlm-drawer-content>
|
|
265
|
+
</hlm-drawer>
|
|
266
|
+
`,
|
|
267
|
+
})
|
|
268
|
+
export class FormDrawerComponent {
|
|
269
|
+
private readonly fb = inject(FormBuilder);
|
|
270
|
+
readonly form = this.fb.group({ goal: ['', Validators.required] });
|
|
271
|
+
save() {
|
|
272
|
+
console.log(this.form.value);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 4. Drag threshold + custom overlay
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
import { Component } from '@angular/core';
|
|
281
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
282
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
283
|
+
|
|
284
|
+
@Component({
|
|
285
|
+
selector: 'app-threshold',
|
|
286
|
+
standalone: true,
|
|
287
|
+
imports: [...HlmDrawerImports, HlmButton],
|
|
288
|
+
template: `
|
|
289
|
+
<hlm-drawer>
|
|
290
|
+
<button hlmBtn variant="secondary" hlmDrawerTrigger>Player queue</button>
|
|
291
|
+
<hlm-drawer-content [closeThreshold]="0.4" class="tw:max-h-[60vh]">
|
|
292
|
+
<div hlmDrawerHeader>
|
|
293
|
+
<h2 hlmDrawerTitle>Up next</h2>
|
|
294
|
+
<p hlmDrawerDescription>Drag down past 40% to dismiss.</p>
|
|
295
|
+
</div>
|
|
296
|
+
<ul class="tw:px-4 tw:text-sm">
|
|
297
|
+
<li>Track 1 — Intro</li>
|
|
298
|
+
<li>Track 2 — Verse</li>
|
|
299
|
+
<li>Track 3 — Outro</li>
|
|
300
|
+
</ul>
|
|
301
|
+
<div hlmDrawerFooter>
|
|
302
|
+
<button hlmBtn variant="outline" hlmDrawerClose>Close</button>
|
|
303
|
+
</div>
|
|
304
|
+
</hlm-drawer-content>
|
|
305
|
+
</hlm-drawer>
|
|
306
|
+
`,
|
|
307
|
+
})
|
|
308
|
+
export class ThresholdComponent {}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 5. Element + attribute header/footer spellings
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
import { Component } from '@angular/core';
|
|
315
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
316
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
317
|
+
|
|
318
|
+
@Component({
|
|
319
|
+
selector: 'app-spellings',
|
|
320
|
+
standalone: true,
|
|
321
|
+
imports: [...HlmDrawerImports, HlmButton],
|
|
322
|
+
template: `
|
|
323
|
+
<hlm-drawer>
|
|
324
|
+
<button hlmBtn variant="ghost" hlmDrawerTrigger>Filters</button>
|
|
325
|
+
<hlm-drawer-content>
|
|
326
|
+
<hlm-drawer-header>
|
|
327
|
+
<h2 hlmDrawerTitle>Filters</h2>
|
|
328
|
+
<p hlmDrawerDescription>Refine the list below.</p>
|
|
329
|
+
</hlm-drawer-header>
|
|
330
|
+
<div class="tw:px-4 tw:text-sm">Filter controls…</div>
|
|
331
|
+
<hlm-drawer-footer>
|
|
332
|
+
<button hlmBtn hlmDrawerClose>Apply</button>
|
|
333
|
+
<button hlmBtn variant="ghost" hlmDrawerClose>Reset</button>
|
|
334
|
+
</hlm-drawer-footer>
|
|
335
|
+
</hlm-drawer-content>
|
|
336
|
+
</hlm-drawer>
|
|
337
|
+
`,
|
|
338
|
+
})
|
|
339
|
+
export class SpellingsComponent {}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### 6. Multi-step content inside one drawer
|
|
343
|
+
|
|
344
|
+
```ts
|
|
345
|
+
import { Component, signal } from '@angular/core';
|
|
346
|
+
import { HlmDrawerImports } from '@egose/shadcn-theme-ng/drawer';
|
|
347
|
+
import { HlmButton } from '@egose/shadcn-theme-ng/button';
|
|
348
|
+
|
|
349
|
+
@Component({
|
|
350
|
+
selector: 'app-steps',
|
|
351
|
+
standalone: true,
|
|
352
|
+
imports: [...HlmDrawerImports, HlmButton],
|
|
353
|
+
template: `
|
|
354
|
+
<hlm-drawer>
|
|
355
|
+
<button hlmBtn hlmDrawerTrigger>Checkout</button>
|
|
356
|
+
<hlm-drawer-content>
|
|
357
|
+
<div hlmDrawerHeader>
|
|
358
|
+
<h2 hlmDrawerTitle>Step {{ step() }} of 2</h2>
|
|
359
|
+
<p hlmDrawerDescription>{{ step() === 1 ? 'Address' : 'Payment' }}</p>
|
|
360
|
+
</div>
|
|
361
|
+
<div class="tw:px-4 tw:text-sm">
|
|
362
|
+
@if (step() === 1) {
|
|
363
|
+
<p>Address form…</p>
|
|
364
|
+
} @else {
|
|
365
|
+
<p>Payment form…</p>
|
|
366
|
+
}
|
|
367
|
+
</div>
|
|
368
|
+
<div hlmDrawerFooter>
|
|
369
|
+
@if (step() === 1) {
|
|
370
|
+
<button hlmBtn (click)="step.set(2)">Next</button>
|
|
371
|
+
} @else {
|
|
372
|
+
<button hlmBtn (click)="step.set(1)" variant="outline">Back</button>
|
|
373
|
+
<button hlmBtn hlmDrawerClose>Pay</button>
|
|
374
|
+
}
|
|
375
|
+
</div>
|
|
376
|
+
</hlm-drawer-content>
|
|
377
|
+
</hlm-drawer>
|
|
378
|
+
`,
|
|
379
|
+
})
|
|
380
|
+
export class StepsComponent {
|
|
381
|
+
readonly step = signal(1);
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Accessibility notes
|
|
386
|
+
|
|
387
|
+
- Always include `hlmDrawerTitle` and `hlmDrawerDescription` so the panel is labelled and described (brain `BrnDrawerTitle` / `BrnDrawerDescription` wiring).
|
|
388
|
+
- Focus is trapped while open and restored to the trigger on close; escape and overlay click dismiss by default.
|
|
389
|
+
- The drag handle is visual; keyboard and screen-reader users rely on the close button — always provide a labelled `hlmDrawerClose` control.
|
|
390
|
+
- `data-state` and `data-vaul-drawer-direction` attributes let assistive and custom styles target open/closed and directional states.
|
|
391
|
+
|
|
392
|
+
## Theming / CSS variables
|
|
393
|
+
|
|
394
|
+
No component-specific CSS variables. Panel geometry and slide animations are direction-aware via `data-vaul-drawer-direction` selectors; colors come from global tokens (`--background`, `--muted`, …). Extend with `class` on `hlm-drawer-content` / overlay.
|
|
395
|
+
|
|
396
|
+
## Related subpaths
|
|
397
|
+
|
|
398
|
+
- `@egose/shadcn-theme-ng/dialog` — centered modal built on the same brain dialog core.
|
|
399
|
+
- `@egose/shadcn-theme-ng/sheet` — side-anchored panel alternative without swipe handling.
|
|
400
|
+
- `@egose/shadcn-theme-ng/button` — `hlmBtn` triggers and footer actions.
|
|
401
|
+
- `@egose/shadcn-theme-ng/separator` — dividers inside drawer bodies.
|