@ngbase/adk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/ngbase-adk-autocomplete.mjs +2 -2
- package/fesm2022/ngbase-adk-autocomplete.mjs.map +1 -1
- package/fesm2022/ngbase-adk-datepicker.mjs +18 -18
- package/fesm2022/ngbase-adk-datepicker.mjs.map +1 -1
- package/fesm2022/ngbase-adk-dialog.mjs +6 -6
- package/fesm2022/ngbase-adk-dialog.mjs.map +1 -1
- package/fesm2022/ngbase-adk-pagination.mjs +18 -18
- package/fesm2022/ngbase-adk-pagination.mjs.map +1 -1
- package/fesm2022/ngbase-adk-popover.mjs +2 -2
- package/fesm2022/ngbase-adk-popover.mjs.map +1 -1
- package/fesm2022/ngbase-adk-radio.mjs +2 -2
- package/fesm2022/ngbase-adk-radio.mjs.map +1 -1
- package/fesm2022/ngbase-adk-resizable.mjs +4 -4
- package/fesm2022/ngbase-adk-resizable.mjs.map +1 -1
- package/fesm2022/ngbase-adk-select.mjs +4 -4
- package/fesm2022/ngbase-adk-select.mjs.map +1 -1
- package/fesm2022/ngbase-adk-sonner.mjs +4 -4
- package/fesm2022/ngbase-adk-sonner.mjs.map +1 -1
- package/fesm2022/ngbase-adk-stepper.mjs +2 -2
- package/fesm2022/ngbase-adk-stepper.mjs.map +1 -1
- package/package.json +26 -25
- package/schematics/collection.json +15 -0
- package/schematics/components/files/accordion/accordion.ts.template +55 -0
- package/schematics/components/files/accordion/index.ts.template +5 -0
- package/schematics/components/files/alert/alert.ts.template +62 -0
- package/schematics/components/files/alert/index.ts.template +1 -0
- package/schematics/components/files/autocomplete/autocomplete.ts.template +48 -0
- package/schematics/components/files/autocomplete/index.ts.template +5 -0
- package/schematics/components/files/avatar/avatar.ts.template +31 -0
- package/schematics/components/files/avatar/index.ts.template +1 -0
- package/schematics/components/files/badge/badge.ts.template +11 -0
- package/schematics/components/files/badge/index.ts.template +1 -0
- package/schematics/components/files/breadcrumb/breadcrumb.ts.template +49 -0
- package/schematics/components/files/breadcrumb/index.ts.template +1 -0
- package/schematics/components/files/button/button.ts.template +29 -0
- package/schematics/components/files/button/index.ts.template +5 -0
- package/schematics/components/files/card/card.ts.template +11 -0
- package/schematics/components/files/card/index.ts.template +5 -0
- package/schematics/components/files/carousel/carousel.ts.template +44 -0
- package/schematics/components/files/carousel/index.ts.template +1 -0
- package/schematics/components/files/checkbox/checkbox.ts.template +46 -0
- package/schematics/components/files/checkbox/focus-style.directive.ts.template +12 -0
- package/schematics/components/files/checkbox/index.ts.template +6 -0
- package/schematics/components/files/chip/chip.ts.template +36 -0
- package/schematics/components/files/chip/index.ts.template +1 -0
- package/schematics/components/files/color-picker/color-picker.ts.template +104 -0
- package/schematics/components/files/color-picker/index.ts.template +5 -0
- package/schematics/components/files/command/command.ts.template +82 -0
- package/schematics/components/files/command/index.ts.template +1 -0
- package/schematics/components/files/datepicker/calendar.ts.template +117 -0
- package/schematics/components/files/datepicker/datepicker-trigger.ts.template +27 -0
- package/schematics/components/files/datepicker/datepicker.ts.template +28 -0
- package/schematics/components/files/datepicker/index.ts.template +3 -0
- package/schematics/components/files/datepicker/time.ts.template +46 -0
- package/schematics/components/files/dialog/dialog.ts.template +89 -0
- package/schematics/components/files/dialog/index.ts.template +5 -0
- package/schematics/components/files/drawer/drawer.ts.template +104 -0
- package/schematics/components/files/drawer/index.ts.template +5 -0
- package/schematics/components/files/form-field/index.ts.template +7 -0
- package/schematics/components/files/form-field/input-style.directive.ts.template +11 -0
- package/schematics/components/files/form-field/input.ts.template +100 -0
- package/schematics/components/files/form-field/otp.ts.template +37 -0
- package/schematics/components/files/hover-card/hover-card.ts.template +13 -0
- package/schematics/components/files/hover-card/index.ts.template +5 -0
- package/schematics/components/files/icon/icon.ts.template +16 -0
- package/schematics/components/files/icon/index.ts.template +1 -0
- package/schematics/components/files/inline-edit/index.ts.template +1 -0
- package/schematics/components/files/inline-edit/inline-edit.ts.template +24 -0
- package/schematics/components/files/keys/index.ts.template +5 -0
- package/schematics/components/files/keys/key.ts.template +35 -0
- package/schematics/components/files/list/index.ts.template +5 -0
- package/schematics/components/files/list/list.ts.template +28 -0
- package/schematics/components/files/mask/index.ts.template +1 -0
- package/schematics/components/files/mask/mask.ts.template +8 -0
- package/schematics/components/files/menu/context-menu.ts.template +14 -0
- package/schematics/components/files/menu/index.ts.template +8 -0
- package/schematics/components/files/menu/mention.ts.template +14 -0
- package/schematics/components/files/menu/menu.ts.template +37 -0
- package/schematics/components/files/menu/navigation-menu.ts.template +8 -0
- package/schematics/components/files/pagination/index.ts.template +1 -0
- package/schematics/components/files/pagination/pagination.ts.template +71 -0
- package/schematics/components/files/picasa/index.ts.template +1 -0
- package/schematics/components/files/picasa/picasa-base.component.ts.template +80 -0
- package/schematics/components/files/picasa/picasa.component.ts.template +57 -0
- package/schematics/components/files/picasa/picasa.directive.ts.template +41 -0
- package/schematics/components/files/picasa/picase.service.ts.template +24 -0
- package/schematics/components/files/popover/index.ts.template +1 -0
- package/schematics/components/files/popover/popover.ts.template +87 -0
- package/schematics/components/files/progress/index.ts.template +5 -0
- package/schematics/components/files/progress/progress.ts.template +14 -0
- package/schematics/components/files/radio/index.ts.template +5 -0
- package/schematics/components/files/radio/radio.ts.template +40 -0
- package/schematics/components/files/resizable/index.ts.template +5 -0
- package/schematics/components/files/resizable/resizable.ts.template +56 -0
- package/schematics/components/files/scroll-area/index.ts.template +1 -0
- package/schematics/components/files/scroll-area/scroll-area.ts.template +40 -0
- package/schematics/components/files/select/index.ts.template +8 -0
- package/schematics/components/files/select/list-selection.ts.template +15 -0
- package/schematics/components/files/select/option.ts.template +34 -0
- package/schematics/components/files/select/select-input.ts.template +21 -0
- package/schematics/components/files/select/select.ts.template +96 -0
- package/schematics/components/files/selectable/index.ts.template +1 -0
- package/schematics/components/files/selectable/selectable.ts.template +34 -0
- package/schematics/components/files/separator/index.ts.template +5 -0
- package/schematics/components/files/separator/separator.ts.template +19 -0
- package/schematics/components/files/sheet/index.ts.template +5 -0
- package/schematics/components/files/sheet/sheet.ts.template +134 -0
- package/schematics/components/files/sidenav/index.ts.template +1 -0
- package/schematics/components/files/sidenav/sidenav.ts.template +48 -0
- package/schematics/components/files/skeleton/index.ts.template +1 -0
- package/schematics/components/files/skeleton/skeleton.ts.template +15 -0
- package/schematics/components/files/slider/index.ts.template +5 -0
- package/schematics/components/files/slider/slider.ts.template +42 -0
- package/schematics/components/files/sonner/index.ts.template +5 -0
- package/schematics/components/files/sonner/sonner.ts.template +58 -0
- package/schematics/components/files/spinner/index.ts.template +1 -0
- package/schematics/components/files/spinner/spinner.ts.template +79 -0
- package/schematics/components/files/stepper/index.ts.template +1 -0
- package/schematics/components/files/stepper/stepper.ts.template +88 -0
- package/schematics/components/files/switch/index.ts.template +5 -0
- package/schematics/components/files/switch/switch.ts.template +29 -0
- package/schematics/components/files/table/body-cell.ts.template +19 -0
- package/schematics/components/files/table/body-row.ts.template +21 -0
- package/schematics/components/files/table/column.ts.template +8 -0
- package/schematics/components/files/table/head-cell.ts.template +19 -0
- package/schematics/components/files/table/head-row.ts.template +27 -0
- package/schematics/components/files/table/index.ts.template +26 -0
- package/schematics/components/files/table/table.ts.template +20 -0
- package/schematics/components/files/tabs/index.ts.template +5 -0
- package/schematics/components/files/tabs/tab.ts.template +89 -0
- package/schematics/components/files/theme/index.ts.template +2 -0
- package/schematics/components/files/theme/theme-button.component.ts.template +26 -0
- package/schematics/components/files/theme/theme.component.ts.template +165 -0
- package/schematics/components/files/theme/theme.service.ts.template +44 -0
- package/schematics/components/files/toggle/index.ts.template +5 -0
- package/schematics/components/files/toggle/toggle.ts.template +13 -0
- package/schematics/components/files/toggle-group/index.ts.template +5 -0
- package/schematics/components/files/toggle-group/toggle-group.ts.template +25 -0
- package/schematics/components/files/tooltip/index.ts.template +5 -0
- package/schematics/components/files/tooltip/tooltip.ts.template +40 -0
- package/schematics/components/files/tour/index.ts.template +3 -0
- package/schematics/components/files/tour/tour-step.ts.template +8 -0
- package/schematics/components/files/tour/tour.service.ts.template +7 -0
- package/schematics/components/files/tour/tour.ts.template +8 -0
- package/schematics/components/files/tree/index.ts.template +1 -0
- package/schematics/components/files/tree/tree.ts.template +66 -0
- package/schematics/components/index.d.ts +3 -0
- package/schematics/components/index.js +17 -0
- package/schematics/components/index.js.map +1 -0
- package/schematics/components/index.ts +29 -0
- package/schematics/components/schema.d.ts +6 -0
- package/schematics/components/schema.js +3 -0
- package/schematics/components/schema.js.map +1 -0
- package/schematics/components/schema.json +137 -0
- package/schematics/components/schema.ts +6 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
|
|
2
|
+
import {
|
|
3
|
+
NgbPopover,
|
|
4
|
+
NgbPopoverBackdrop,
|
|
5
|
+
NgbPopoverClose,
|
|
6
|
+
NgbPopoverMain,
|
|
7
|
+
ngbPopoverPortal,
|
|
8
|
+
NgbPopoverTrigger,
|
|
9
|
+
providePopover,
|
|
10
|
+
registerNgbPopover,
|
|
11
|
+
} from '@ngbase/adk/popover';
|
|
12
|
+
|
|
13
|
+
@Component({
|
|
14
|
+
selector: '<%= name %>-popover',
|
|
15
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
16
|
+
providers: [providePopover(Popover)],
|
|
17
|
+
imports: [NgbPopoverBackdrop, NgbPopoverMain],
|
|
18
|
+
template: ` <style>
|
|
19
|
+
.popover-anchor {
|
|
20
|
+
--action-angle: 180deg;
|
|
21
|
+
--action-left: 50%;
|
|
22
|
+
--action-top: -1rem;
|
|
23
|
+
}
|
|
24
|
+
.popover-anchor::before {
|
|
25
|
+
content: '';
|
|
26
|
+
position: absolute;
|
|
27
|
+
width: 0;
|
|
28
|
+
height: 0;
|
|
29
|
+
border-style: solid;
|
|
30
|
+
border-top: 0.8rem solid;
|
|
31
|
+
@apply border-foreground;
|
|
32
|
+
border-left: 0.5rem solid transparent;
|
|
33
|
+
border-right: 0.5rem solid transparent;
|
|
34
|
+
top: var(--action-top);
|
|
35
|
+
left: var(--action-left);
|
|
36
|
+
transform: translateX(-50%) rotate(var(--action-angle, 180deg));
|
|
37
|
+
}
|
|
38
|
+
</style>
|
|
39
|
+
<div
|
|
40
|
+
ngbPopoverMain
|
|
41
|
+
[@slideInOutAnimation]
|
|
42
|
+
class="{{
|
|
43
|
+
'menu-container pointer-events-auto fixed z-10 flex flex-col rounded-lg border bg-foreground shadow-md ' +
|
|
44
|
+
(options().anchor ? 'popover-anchor ' : 'overflow-auto ')
|
|
45
|
+
}}"
|
|
46
|
+
>
|
|
47
|
+
<div class="flex flex-1 flex-col overflow-auto">
|
|
48
|
+
<ng-container #myDialog />
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
@if (options().backdrop) {
|
|
52
|
+
<div ngbPopoverBackdrop class="pointer-events-auto fixed top-0 h-full w-full"></div>
|
|
53
|
+
}`,
|
|
54
|
+
host: {
|
|
55
|
+
class:
|
|
56
|
+
'fixed top-0 left-0 w-full h-full pointer-events-none z-p flex items-center justify-center',
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
class Popover extends NgbPopover {}
|
|
60
|
+
|
|
61
|
+
export function registerPopover() {
|
|
62
|
+
return registerNgbPopover(Popover);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const popoverPortal = ngbPopoverPortal;
|
|
66
|
+
|
|
67
|
+
@Directive({
|
|
68
|
+
selector: '[<%= name %>PopoverTrigger]',
|
|
69
|
+
hostDirectives: [
|
|
70
|
+
{
|
|
71
|
+
directive: NgbPopoverTrigger,
|
|
72
|
+
inputs: [
|
|
73
|
+
'ngbPopoverTrigger: <%= name %>PopoverTrigger',
|
|
74
|
+
'ngbPopoverTriggerData: <%= name %>PopoverTriggerData',
|
|
75
|
+
'options',
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
providers: [registerPopover()],
|
|
80
|
+
})
|
|
81
|
+
export class PopoverTrigger {}
|
|
82
|
+
|
|
83
|
+
@Directive({
|
|
84
|
+
selector: '[<%= name %>PopoverClose]',
|
|
85
|
+
hostDirectives: [NgbPopoverClose],
|
|
86
|
+
})
|
|
87
|
+
export class PopoverClose {}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { NgbProgress, NgbProgressBar } from '@ngbase/adk/progress';
|
|
3
|
+
|
|
4
|
+
@Component({
|
|
5
|
+
selector: '<%= name %>-progress',
|
|
6
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
7
|
+
hostDirectives: [{ directive: NgbProgress, inputs: ['value'] }],
|
|
8
|
+
imports: [NgbProgressBar],
|
|
9
|
+
template: `<div class="h-full bg-primary transition" ngbProgressBar></div>`,
|
|
10
|
+
host: {
|
|
11
|
+
class: 'block h-2 my-1 bg-muted-background rounded-full',
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
export class Progress {}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { NgbRadio, NgbRadioGroup, NgbRadioIndicator } from '@ngbase/adk/radio';
|
|
3
|
+
import { ɵFocusStyle as FocusStyle } from '<%= basepath %>/checkbox';
|
|
4
|
+
|
|
5
|
+
@Component({
|
|
6
|
+
selector: '<%= name %>-radio-group',
|
|
7
|
+
hostDirectives: [{ directive: NgbRadioGroup, inputs: ['value'], outputs: ['valueChange'] }],
|
|
8
|
+
template: `<ng-content />`,
|
|
9
|
+
host: {
|
|
10
|
+
class: 'flex gap-2',
|
|
11
|
+
},
|
|
12
|
+
})
|
|
13
|
+
export class RadioGroup {}
|
|
14
|
+
|
|
15
|
+
@Component({
|
|
16
|
+
selector: '<%= name %>-radio, [<%= name %>Radio]',
|
|
17
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
18
|
+
hostDirectives: [{ directive: NgbRadio, inputs: ['value', 'disabled'] }],
|
|
19
|
+
imports: [FocusStyle, NgbRadioIndicator],
|
|
20
|
+
template: `
|
|
21
|
+
<button
|
|
22
|
+
<%= name %>FocusStyle
|
|
23
|
+
ngbRadioIndicator
|
|
24
|
+
#radioIndicator
|
|
25
|
+
class="custom-radio relative flex h-4 w-4 flex-none items-center justify-center rounded-full border border-primary"
|
|
26
|
+
[class]="radioIndicator.disabled() ? 'border-muted' : 'border-primary'"
|
|
27
|
+
>
|
|
28
|
+
<div
|
|
29
|
+
class="h-2 w-2 rounded-full"
|
|
30
|
+
[class]="radioIndicator.disabled() ? 'bg-muted' : 'bg-primary'"
|
|
31
|
+
></div>
|
|
32
|
+
</button>
|
|
33
|
+
<ng-content />
|
|
34
|
+
`,
|
|
35
|
+
host: {
|
|
36
|
+
class:
|
|
37
|
+
'flex items-center gap-2 py-1 cursor-pointer aria-[disabled="true"]:opacity-40 aria-[disabled="true"]:cursor-not-allowed',
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
export class Radio {}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import {
|
|
3
|
+
NgbGutter,
|
|
4
|
+
NgbResizable,
|
|
5
|
+
NgbResizableGroup,
|
|
6
|
+
provideResizable,
|
|
7
|
+
provideResizableGroup,
|
|
8
|
+
} from '@ngbase/adk/resizable';
|
|
9
|
+
import { Icon } from '<%= basepath %>/icon';
|
|
10
|
+
import { provideIcons } from '@ng-icons/core';
|
|
11
|
+
import { lucideGripVertical } from '@ng-icons/lucide';
|
|
12
|
+
|
|
13
|
+
@Component({
|
|
14
|
+
selector: '<%= name %>-resizable-group',
|
|
15
|
+
exportAs: '<%= name %>ResizableGroup',
|
|
16
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
17
|
+
providers: [provideResizableGroup(ResizableGroup)],
|
|
18
|
+
template: `<ng-content select="<%= name %>-resizable" />`,
|
|
19
|
+
host: {
|
|
20
|
+
class: 'flex w-full',
|
|
21
|
+
'[class.flex-col]': "direction() === 'vertical'",
|
|
22
|
+
'[attr.id]': 'id',
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
export class ResizableGroup extends NgbResizableGroup {}
|
|
26
|
+
|
|
27
|
+
@Component({
|
|
28
|
+
selector: '<%= name %>-resizable',
|
|
29
|
+
exportAs: '<%= name %>Resizable',
|
|
30
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
31
|
+
providers: [provideResizable(Resizable)],
|
|
32
|
+
viewProviders: [provideIcons({ lucideGripVertical })],
|
|
33
|
+
imports: [Icon, NgbGutter],
|
|
34
|
+
template: `<ng-content />
|
|
35
|
+
<ng-template #dragElement>
|
|
36
|
+
@if (draggable()) {
|
|
37
|
+
<div
|
|
38
|
+
ngbGutter
|
|
39
|
+
class="{{
|
|
40
|
+
'dragElement relative flex cursor-ew-resize items-center justify-center after:absolute after:top-0' +
|
|
41
|
+
(resizable.direction() === 'vertical'
|
|
42
|
+
? ' bottom-0 left-0 h-0 w-full cursor-ns-resize border-b after:-mt-1 after:h-2 after:w-full'
|
|
43
|
+
: ' right-0 top-0 w-0 cursor-ew-resize border-l after:h-full after:w-2')
|
|
44
|
+
}}"
|
|
45
|
+
>
|
|
46
|
+
<<%= name %>-icon name="lucideGripVertical" class="z-30 rounded-lg border
|
|
47
|
+
bg-muted-background py-0.5" size=".75rem" [class]="resizable.direction() === 'vertical' ?
|
|
48
|
+
'rotate-90' : ''" />
|
|
49
|
+
</div>
|
|
50
|
+
}
|
|
51
|
+
</ng-template>`,
|
|
52
|
+
host: {
|
|
53
|
+
class: 'relative overflow-hidden block flex-none',
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
export class Resizable extends NgbResizable {}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './scroll-area';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, input } from '@angular/core';
|
|
2
|
+
import { NgbScrollArea, NgbScrollBar, ScrollBarOrientation } from '@ngbase/adk/scroll-area';
|
|
3
|
+
|
|
4
|
+
@Component({
|
|
5
|
+
selector: '<%= name %>-scroll-area',
|
|
6
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
7
|
+
imports: [NgbScrollBar, NgbScrollArea],
|
|
8
|
+
template: `
|
|
9
|
+
<div
|
|
10
|
+
ngbScrollArea
|
|
11
|
+
[alwaysShow]="alwaysShow()"
|
|
12
|
+
[orientation]="orientation()"
|
|
13
|
+
[hideDelay]="hideDelay()"
|
|
14
|
+
class="flex-1"
|
|
15
|
+
>
|
|
16
|
+
<ng-content></ng-content>
|
|
17
|
+
|
|
18
|
+
<div
|
|
19
|
+
ngbScrollBar="vertical"
|
|
20
|
+
class="!right-0.5 rounded bg-black/10 opacity-0 transition-colors duration-150 hover:bg-black/50 data-[active=true]:bg-black/50 data-[visible=true]:opacity-100"
|
|
21
|
+
></div>
|
|
22
|
+
|
|
23
|
+
<div
|
|
24
|
+
ngbScrollBar="horizontal"
|
|
25
|
+
class="!bottom-0.5 rounded bg-black/10 opacity-0 transition-colors duration-150 hover:bg-black/50 data-[active=true]:bg-black/50 data-[visible=true]:opacity-100"
|
|
26
|
+
></div>
|
|
27
|
+
|
|
28
|
+
<!-- Corner piece when both scrollbars are visible -->
|
|
29
|
+
<div class="scroll-area-corner absolute bottom-0 right-0 h-2 w-2 rounded bg-black/10"></div>
|
|
30
|
+
</div>
|
|
31
|
+
`,
|
|
32
|
+
host: {
|
|
33
|
+
class: 'flex flex-col w-full',
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
export class ScrollArea {
|
|
37
|
+
readonly alwaysShow = input<boolean>(false);
|
|
38
|
+
readonly orientation = input<ScrollBarOrientation>('both');
|
|
39
|
+
readonly hideDelay = input(1000);
|
|
40
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { provideValueAccessor } from '@ngbase/adk/utils';
|
|
3
|
+
import { SelectBase } from '@ngbase/adk/select';
|
|
4
|
+
|
|
5
|
+
@Component({
|
|
6
|
+
selector: '<%= name %>-list-selection',
|
|
7
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
8
|
+
template: `<ng-content />`,
|
|
9
|
+
providers: [provideValueAccessor(ListSelection)],
|
|
10
|
+
})
|
|
11
|
+
export class ListSelection<T> extends SelectBase<T> {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(true);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
2
|
+
import { NgbOption, NgbOptionGroup } from '@ngbase/adk/select';
|
|
3
|
+
import { Checkbox } from '<%= basepath %>/checkbox';
|
|
4
|
+
import { ListStyle } from '<%= basepath %>/list';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
selector: '<%= name %>-option, [<%= name %>Option]',
|
|
8
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
9
|
+
hostDirectives: [ListStyle, { directive: NgbOption, inputs: ['value', 'disabled', 'ayId'] }],
|
|
10
|
+
imports: [Checkbox],
|
|
11
|
+
template: ` @if (option.multiple()) {
|
|
12
|
+
<<%= name %>-checkbox [checked]="option.checked()" class="!py-0" />
|
|
13
|
+
}
|
|
14
|
+
<ng-content />`,
|
|
15
|
+
host: {
|
|
16
|
+
'[class.bg-muted-background]': 'option.active() || option.checked()',
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
export class Option<T> {
|
|
20
|
+
readonly option = inject(NgbOption<T>);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Component({
|
|
24
|
+
selector: '<%= name %>-option-group, [<%= name %>OptionGroup]',
|
|
25
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
26
|
+
template: `<div class="sticky -top-1 z-10 bg-foreground px-2 py-1.5 text-sm text-muted">
|
|
27
|
+
{{ label() }}
|
|
28
|
+
</div>
|
|
29
|
+
<ng-content />`,
|
|
30
|
+
host: {
|
|
31
|
+
class: 'block',
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
export class OptionGroup extends NgbOptionGroup {}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Directive } from '@angular/core';
|
|
2
|
+
import { NgbSelectInput, NgbSelectTrigger } from '@ngbase/adk/select';
|
|
3
|
+
import { InputStyle } from '<%= basepath %>/form-field';
|
|
4
|
+
|
|
5
|
+
@Directive({
|
|
6
|
+
selector: '[<%= name %>SelectInput]',
|
|
7
|
+
hostDirectives: [
|
|
8
|
+
{ directive: NgbSelectInput, inputs: ['placeholder', 'options', 'filterFn'] },
|
|
9
|
+
InputStyle,
|
|
10
|
+
],
|
|
11
|
+
host: {
|
|
12
|
+
class: 'w-full !m-0 mb-1 !ring-0 !border-0 !border-b rounded-none px-3 z-10',
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
export class SelectInput<T> {}
|
|
16
|
+
|
|
17
|
+
@Directive({
|
|
18
|
+
selector: '[<%= name %>SelectTrigger]',
|
|
19
|
+
hostDirectives: [NgbSelectTrigger],
|
|
20
|
+
})
|
|
21
|
+
export class SelectTrigger {}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import {
|
|
5
|
+
NgbSelect,
|
|
6
|
+
NgbSelectOption,
|
|
7
|
+
NgbSelectOptionGroup,
|
|
8
|
+
provideSelect,
|
|
9
|
+
SelectValue,
|
|
10
|
+
} from '@ngbase/adk/select';
|
|
11
|
+
import { Icon } from '<%= basepath %>/icon';
|
|
12
|
+
import { provideIcons } from '@ng-icons/core';
|
|
13
|
+
import { lucideChevronsUpDown } from '@ng-icons/lucide';
|
|
14
|
+
import { Option } from './option';
|
|
15
|
+
import { SelectInput } from './select-input';
|
|
16
|
+
|
|
17
|
+
@Directive({
|
|
18
|
+
selector: '[<%= name %>SelectOption]',
|
|
19
|
+
hostDirectives: [NgbSelectOption],
|
|
20
|
+
})
|
|
21
|
+
export class SelectOption<T> {}
|
|
22
|
+
|
|
23
|
+
@Component({
|
|
24
|
+
selector: '<%= name %>-select',
|
|
25
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
26
|
+
viewProviders: [provideIcons({ lucideChevronsUpDown })],
|
|
27
|
+
providers: [provideSelect(Select)],
|
|
28
|
+
imports: [
|
|
29
|
+
Icon,
|
|
30
|
+
FormsModule,
|
|
31
|
+
SelectInput,
|
|
32
|
+
Option,
|
|
33
|
+
NgTemplateOutlet,
|
|
34
|
+
SelectValue,
|
|
35
|
+
NgbSelectOptionGroup,
|
|
36
|
+
],
|
|
37
|
+
template: `
|
|
38
|
+
<button
|
|
39
|
+
ngbSelectValue
|
|
40
|
+
[class.opacity-50]="disabled()"
|
|
41
|
+
class="flex min-h-5 w-full items-center justify-between gap-1 whitespace-nowrap outline-none"
|
|
42
|
+
>
|
|
43
|
+
<!-- Prefix template -->
|
|
44
|
+
<ng-content select=".select-prefix" />
|
|
45
|
+
|
|
46
|
+
<span class="truncate" [class.text-muted]="!cValue()">
|
|
47
|
+
<ng-content select="[<%= name %>SelectTrigger]">
|
|
48
|
+
{{ cValue() || placeholder() }}
|
|
49
|
+
</ng-content>
|
|
50
|
+
</span>
|
|
51
|
+
<<%= name %>-icon name="lucideChevronsUpDown" class="ml-0.5 text-muted" />
|
|
52
|
+
</button>
|
|
53
|
+
|
|
54
|
+
<!-- Options template -->
|
|
55
|
+
<ng-template #optionsTemplate>
|
|
56
|
+
<div class="flex flex-col overflow-hidden">
|
|
57
|
+
<ng-content select="[<%= name %>SelectInput]">
|
|
58
|
+
@if (options().length) {
|
|
59
|
+
<input
|
|
60
|
+
<%= name %>SelectInput
|
|
61
|
+
placeholder="Search options"
|
|
62
|
+
[(ngModel)]="optionsFilter.search"
|
|
63
|
+
[ngModelOptions]="{ standalone: true }"
|
|
64
|
+
/>
|
|
65
|
+
}
|
|
66
|
+
</ng-content>
|
|
67
|
+
<div #optionsGroup ngbSelectOptionGroup class="overflow-auto p-1">
|
|
68
|
+
<div class="h-full" role="listbox" aria-label="Suggestions">
|
|
69
|
+
<ng-content>
|
|
70
|
+
@for (option of optionsFilter.filteredList(); track option; let i = $index) {
|
|
71
|
+
<<%= name %>-option [value]="option" [ayId]="ayId">
|
|
72
|
+
@if (optionTemplate(); as ot) {
|
|
73
|
+
<ng-template
|
|
74
|
+
[ngTemplateOutlet]="ot.template"
|
|
75
|
+
[ngTemplateOutletContext]="{ $implicit: option, index: i }"
|
|
76
|
+
/>
|
|
77
|
+
} @else {
|
|
78
|
+
{{ option }}
|
|
79
|
+
}
|
|
80
|
+
</<%= name %>-option>
|
|
81
|
+
}
|
|
82
|
+
</ng-content>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
<ng-content select=".select-footer" />
|
|
86
|
+
</div>
|
|
87
|
+
</ng-template>
|
|
88
|
+
`,
|
|
89
|
+
host: {
|
|
90
|
+
class: 'flex cursor-pointer font-medium',
|
|
91
|
+
'[class.pointer-events-none]': 'disabled()',
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
export class Select<T> extends NgbSelect<T> {
|
|
95
|
+
override sideOffset = 16;
|
|
96
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './selectable';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
2
|
+
import { NgbSelectable, NgbSelectableItem } from '@ngbase/adk/selectable';
|
|
3
|
+
|
|
4
|
+
@Component({
|
|
5
|
+
selector: '<%= name %>-selectable-item, [<%= name %>SelectableItem]',
|
|
6
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
7
|
+
hostDirectives: [{ directive: NgbSelectableItem, inputs: ['value'] }],
|
|
8
|
+
template: `<ng-content />`,
|
|
9
|
+
host: {
|
|
10
|
+
class:
|
|
11
|
+
'flex-1 flex items-center font-medium justify-center px-3 py-1.5 cursor-pointer transition-colors rounded-md whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary',
|
|
12
|
+
'[class]': `selectable.selected() ? 'bg-foreground shadow-md ring-1 ring-border' : 'opacity-60'`,
|
|
13
|
+
},
|
|
14
|
+
})
|
|
15
|
+
export class SelectableItem<T> {
|
|
16
|
+
readonly selectable = inject(NgbSelectableItem);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Component({
|
|
20
|
+
selector: '<%= name %>-selectable',
|
|
21
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
22
|
+
template: `<ng-content />`,
|
|
23
|
+
host: {
|
|
24
|
+
class: 'inline-flex relative bg-muted-background rounded-md p-0.5',
|
|
25
|
+
},
|
|
26
|
+
hostDirectives: [
|
|
27
|
+
{
|
|
28
|
+
directive: NgbSelectable,
|
|
29
|
+
inputs: ['activeIndex'],
|
|
30
|
+
outputs: ['activeIndexChange', 'valueChanged'],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
})
|
|
34
|
+
export class Selectable<T> {}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
@Component({
|
|
4
|
+
selector: '<%= name %>-separator',
|
|
5
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
6
|
+
template: ``,
|
|
7
|
+
host: {
|
|
8
|
+
class: 'bg-border block flex-none',
|
|
9
|
+
'[class]': `vertical() ? 'w-[1px]' : 'h-[1px] w-full'`,
|
|
10
|
+
// '[class.my-1]': `menu`,
|
|
11
|
+
},
|
|
12
|
+
})
|
|
13
|
+
export class Separator {
|
|
14
|
+
vertical = input(false, { transform: booleanAttribute });
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
// console.log('Separator', this.menu);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { NgStyle } from '@angular/common';
|
|
2
|
+
import {
|
|
3
|
+
ChangeDetectionStrategy,
|
|
4
|
+
Component,
|
|
5
|
+
OnDestroy,
|
|
6
|
+
ViewContainerRef,
|
|
7
|
+
afterNextRender,
|
|
8
|
+
inject,
|
|
9
|
+
signal,
|
|
10
|
+
viewChild,
|
|
11
|
+
} from '@angular/core';
|
|
12
|
+
import { BaseDialog, basePortal, DialogInput, DialogOptions, DialogRef } from '@ngbase/adk/portal';
|
|
13
|
+
import { createHostAnimation, fadeAnimation } from '@ngbase/adk/utils';
|
|
14
|
+
import { Button } from '<%= basepath %>/button';
|
|
15
|
+
import { sideAnimation } from '@ngbase/adk/dialog';
|
|
16
|
+
import { Icon } from '<%= basepath %>/icon';
|
|
17
|
+
import { provideIcons } from '@ng-icons/core';
|
|
18
|
+
import { lucideX } from '@ng-icons/lucide';
|
|
19
|
+
|
|
20
|
+
@Component({
|
|
21
|
+
selector: '<%= name %>-sheet',
|
|
22
|
+
imports: [NgStyle, Button, Icon],
|
|
23
|
+
viewProviders: [provideIcons({ lucideX })],
|
|
24
|
+
template: `
|
|
25
|
+
<div
|
|
26
|
+
class="pointer-events-none flex h-full"
|
|
27
|
+
[class]="options.position === 'left' ? 'justify-start' : 'justify-end'"
|
|
28
|
+
>
|
|
29
|
+
<div
|
|
30
|
+
class="pointer-events-auto m-2 flex flex-col overflow-hidden rounded-lg border-l bg-foreground shadow-2xl will-change-transform"
|
|
31
|
+
[@sideAnimation]="position()"
|
|
32
|
+
[ngStyle]="{
|
|
33
|
+
width: options.width,
|
|
34
|
+
minWidth: options.minWidth,
|
|
35
|
+
maxWidth: options.maxWidth,
|
|
36
|
+
}"
|
|
37
|
+
>
|
|
38
|
+
@if (!isHideHeader) {
|
|
39
|
+
<div class="flex items-center border-b px-4 py-2">
|
|
40
|
+
<h2 class="flex-1 font-bold">{{ options.title }}</h2>
|
|
41
|
+
<button <%= name %>Button="ghost" class="-mr-2 !p-2" (click)="close()">
|
|
42
|
+
<<%= name %>-icon name="lucideX" />
|
|
43
|
+
</button>
|
|
44
|
+
</div>
|
|
45
|
+
}
|
|
46
|
+
<div class="h-full overflow-auto p-4">
|
|
47
|
+
<ng-container #myDialog />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
@if (backdropColor) {
|
|
52
|
+
<div
|
|
53
|
+
class="absolute top-0 -z-10 h-full w-full bg-black bg-opacity-30 will-change-transform"
|
|
54
|
+
[@fadeAnimation]
|
|
55
|
+
(click)="close()"
|
|
56
|
+
></div>
|
|
57
|
+
<!-- [class]="status() ? 'pointer-events-auto' : 'pointer-events-none'" -->
|
|
58
|
+
}
|
|
59
|
+
`,
|
|
60
|
+
host: {
|
|
61
|
+
class: 'fixed block top-0 bottom-0 left-0 right-0 z-p',
|
|
62
|
+
'[@parentAnimation]': '',
|
|
63
|
+
'(@parentAnimation.done)': 'animationDone()',
|
|
64
|
+
},
|
|
65
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
66
|
+
animations: [
|
|
67
|
+
createHostAnimation(['@fadeAnimation', '@sideAnimation']),
|
|
68
|
+
fadeAnimation('300ms'),
|
|
69
|
+
sideAnimation,
|
|
70
|
+
],
|
|
71
|
+
})
|
|
72
|
+
export class SheetContainer extends BaseDialog implements OnDestroy {
|
|
73
|
+
myDialog = viewChild('myDialog', { read: ViewContainerRef });
|
|
74
|
+
backdropColor = true;
|
|
75
|
+
options!: SheetOptions;
|
|
76
|
+
classNames = '';
|
|
77
|
+
isHideHeader = false;
|
|
78
|
+
position = signal<'left' | 'right' | 'center'>('left');
|
|
79
|
+
|
|
80
|
+
constructor() {
|
|
81
|
+
super();
|
|
82
|
+
afterNextRender(() => {
|
|
83
|
+
this._afterViewSource.next(this.myDialog()!);
|
|
84
|
+
this.position.set('center');
|
|
85
|
+
});
|
|
86
|
+
const ref = inject(DialogRef);
|
|
87
|
+
ref.afterClosed.subscribe(() => {
|
|
88
|
+
console.log('afterClosed', this.options.position);
|
|
89
|
+
this.position.set(this.options.position as 'left' | 'right' | 'center');
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
override setOptions(options: SheetOptions): void {
|
|
94
|
+
this.options = options;
|
|
95
|
+
this.classNames = this.options.classNames?.join(' ') || '';
|
|
96
|
+
this.isHideHeader = this.options.header || false;
|
|
97
|
+
this.backdropColor = this.options.backdropColor || true;
|
|
98
|
+
this.position.set(this.options.position as 'left' | 'right' | 'center');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
ngOnDestroy(): void {
|
|
102
|
+
// this.position.set(this.options.position as 'left' | 'right' | 'center');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export class SheetOptions extends DialogOptions {
|
|
107
|
+
position?: 'left' | 'right' = 'right';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function sheetPortal() {
|
|
111
|
+
const NAME = 'sheet';
|
|
112
|
+
const base = basePortal(NAME, SheetContainer);
|
|
113
|
+
|
|
114
|
+
function open<T>(component: DialogInput, opt?: SheetOptions) {
|
|
115
|
+
const { diaRef } = base.open(
|
|
116
|
+
component,
|
|
117
|
+
comp => {
|
|
118
|
+
const options = { ...new SheetOptions(), ...opt };
|
|
119
|
+
comp.instance.setOptions(options);
|
|
120
|
+
},
|
|
121
|
+
opt,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const { afterClosed } = diaRef;
|
|
125
|
+
return { afterClosed };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function closeAll() {
|
|
129
|
+
base.closeAll();
|
|
130
|
+
}
|
|
131
|
+
return { open, closeAll };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export type Sheet = ReturnType<typeof sheetPortal>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sidenav';
|