@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.
Files changed (156) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/ngbase-adk-autocomplete.mjs +2 -2
  3. package/fesm2022/ngbase-adk-autocomplete.mjs.map +1 -1
  4. package/fesm2022/ngbase-adk-datepicker.mjs +18 -18
  5. package/fesm2022/ngbase-adk-datepicker.mjs.map +1 -1
  6. package/fesm2022/ngbase-adk-dialog.mjs +6 -6
  7. package/fesm2022/ngbase-adk-dialog.mjs.map +1 -1
  8. package/fesm2022/ngbase-adk-pagination.mjs +18 -18
  9. package/fesm2022/ngbase-adk-pagination.mjs.map +1 -1
  10. package/fesm2022/ngbase-adk-popover.mjs +2 -2
  11. package/fesm2022/ngbase-adk-popover.mjs.map +1 -1
  12. package/fesm2022/ngbase-adk-radio.mjs +2 -2
  13. package/fesm2022/ngbase-adk-radio.mjs.map +1 -1
  14. package/fesm2022/ngbase-adk-resizable.mjs +4 -4
  15. package/fesm2022/ngbase-adk-resizable.mjs.map +1 -1
  16. package/fesm2022/ngbase-adk-select.mjs +4 -4
  17. package/fesm2022/ngbase-adk-select.mjs.map +1 -1
  18. package/fesm2022/ngbase-adk-sonner.mjs +4 -4
  19. package/fesm2022/ngbase-adk-sonner.mjs.map +1 -1
  20. package/fesm2022/ngbase-adk-stepper.mjs +2 -2
  21. package/fesm2022/ngbase-adk-stepper.mjs.map +1 -1
  22. package/package.json +26 -25
  23. package/schematics/collection.json +15 -0
  24. package/schematics/components/files/accordion/accordion.ts.template +55 -0
  25. package/schematics/components/files/accordion/index.ts.template +5 -0
  26. package/schematics/components/files/alert/alert.ts.template +62 -0
  27. package/schematics/components/files/alert/index.ts.template +1 -0
  28. package/schematics/components/files/autocomplete/autocomplete.ts.template +48 -0
  29. package/schematics/components/files/autocomplete/index.ts.template +5 -0
  30. package/schematics/components/files/avatar/avatar.ts.template +31 -0
  31. package/schematics/components/files/avatar/index.ts.template +1 -0
  32. package/schematics/components/files/badge/badge.ts.template +11 -0
  33. package/schematics/components/files/badge/index.ts.template +1 -0
  34. package/schematics/components/files/breadcrumb/breadcrumb.ts.template +49 -0
  35. package/schematics/components/files/breadcrumb/index.ts.template +1 -0
  36. package/schematics/components/files/button/button.ts.template +29 -0
  37. package/schematics/components/files/button/index.ts.template +5 -0
  38. package/schematics/components/files/card/card.ts.template +11 -0
  39. package/schematics/components/files/card/index.ts.template +5 -0
  40. package/schematics/components/files/carousel/carousel.ts.template +44 -0
  41. package/schematics/components/files/carousel/index.ts.template +1 -0
  42. package/schematics/components/files/checkbox/checkbox.ts.template +46 -0
  43. package/schematics/components/files/checkbox/focus-style.directive.ts.template +12 -0
  44. package/schematics/components/files/checkbox/index.ts.template +6 -0
  45. package/schematics/components/files/chip/chip.ts.template +36 -0
  46. package/schematics/components/files/chip/index.ts.template +1 -0
  47. package/schematics/components/files/color-picker/color-picker.ts.template +104 -0
  48. package/schematics/components/files/color-picker/index.ts.template +5 -0
  49. package/schematics/components/files/command/command.ts.template +82 -0
  50. package/schematics/components/files/command/index.ts.template +1 -0
  51. package/schematics/components/files/datepicker/calendar.ts.template +117 -0
  52. package/schematics/components/files/datepicker/datepicker-trigger.ts.template +27 -0
  53. package/schematics/components/files/datepicker/datepicker.ts.template +28 -0
  54. package/schematics/components/files/datepicker/index.ts.template +3 -0
  55. package/schematics/components/files/datepicker/time.ts.template +46 -0
  56. package/schematics/components/files/dialog/dialog.ts.template +89 -0
  57. package/schematics/components/files/dialog/index.ts.template +5 -0
  58. package/schematics/components/files/drawer/drawer.ts.template +104 -0
  59. package/schematics/components/files/drawer/index.ts.template +5 -0
  60. package/schematics/components/files/form-field/index.ts.template +7 -0
  61. package/schematics/components/files/form-field/input-style.directive.ts.template +11 -0
  62. package/schematics/components/files/form-field/input.ts.template +100 -0
  63. package/schematics/components/files/form-field/otp.ts.template +37 -0
  64. package/schematics/components/files/hover-card/hover-card.ts.template +13 -0
  65. package/schematics/components/files/hover-card/index.ts.template +5 -0
  66. package/schematics/components/files/icon/icon.ts.template +16 -0
  67. package/schematics/components/files/icon/index.ts.template +1 -0
  68. package/schematics/components/files/inline-edit/index.ts.template +1 -0
  69. package/schematics/components/files/inline-edit/inline-edit.ts.template +24 -0
  70. package/schematics/components/files/keys/index.ts.template +5 -0
  71. package/schematics/components/files/keys/key.ts.template +35 -0
  72. package/schematics/components/files/list/index.ts.template +5 -0
  73. package/schematics/components/files/list/list.ts.template +28 -0
  74. package/schematics/components/files/mask/index.ts.template +1 -0
  75. package/schematics/components/files/mask/mask.ts.template +8 -0
  76. package/schematics/components/files/menu/context-menu.ts.template +14 -0
  77. package/schematics/components/files/menu/index.ts.template +8 -0
  78. package/schematics/components/files/menu/mention.ts.template +14 -0
  79. package/schematics/components/files/menu/menu.ts.template +37 -0
  80. package/schematics/components/files/menu/navigation-menu.ts.template +8 -0
  81. package/schematics/components/files/pagination/index.ts.template +1 -0
  82. package/schematics/components/files/pagination/pagination.ts.template +71 -0
  83. package/schematics/components/files/picasa/index.ts.template +1 -0
  84. package/schematics/components/files/picasa/picasa-base.component.ts.template +80 -0
  85. package/schematics/components/files/picasa/picasa.component.ts.template +57 -0
  86. package/schematics/components/files/picasa/picasa.directive.ts.template +41 -0
  87. package/schematics/components/files/picasa/picase.service.ts.template +24 -0
  88. package/schematics/components/files/popover/index.ts.template +1 -0
  89. package/schematics/components/files/popover/popover.ts.template +87 -0
  90. package/schematics/components/files/progress/index.ts.template +5 -0
  91. package/schematics/components/files/progress/progress.ts.template +14 -0
  92. package/schematics/components/files/radio/index.ts.template +5 -0
  93. package/schematics/components/files/radio/radio.ts.template +40 -0
  94. package/schematics/components/files/resizable/index.ts.template +5 -0
  95. package/schematics/components/files/resizable/resizable.ts.template +56 -0
  96. package/schematics/components/files/scroll-area/index.ts.template +1 -0
  97. package/schematics/components/files/scroll-area/scroll-area.ts.template +40 -0
  98. package/schematics/components/files/select/index.ts.template +8 -0
  99. package/schematics/components/files/select/list-selection.ts.template +15 -0
  100. package/schematics/components/files/select/option.ts.template +34 -0
  101. package/schematics/components/files/select/select-input.ts.template +21 -0
  102. package/schematics/components/files/select/select.ts.template +96 -0
  103. package/schematics/components/files/selectable/index.ts.template +1 -0
  104. package/schematics/components/files/selectable/selectable.ts.template +34 -0
  105. package/schematics/components/files/separator/index.ts.template +5 -0
  106. package/schematics/components/files/separator/separator.ts.template +19 -0
  107. package/schematics/components/files/sheet/index.ts.template +5 -0
  108. package/schematics/components/files/sheet/sheet.ts.template +134 -0
  109. package/schematics/components/files/sidenav/index.ts.template +1 -0
  110. package/schematics/components/files/sidenav/sidenav.ts.template +48 -0
  111. package/schematics/components/files/skeleton/index.ts.template +1 -0
  112. package/schematics/components/files/skeleton/skeleton.ts.template +15 -0
  113. package/schematics/components/files/slider/index.ts.template +5 -0
  114. package/schematics/components/files/slider/slider.ts.template +42 -0
  115. package/schematics/components/files/sonner/index.ts.template +5 -0
  116. package/schematics/components/files/sonner/sonner.ts.template +58 -0
  117. package/schematics/components/files/spinner/index.ts.template +1 -0
  118. package/schematics/components/files/spinner/spinner.ts.template +79 -0
  119. package/schematics/components/files/stepper/index.ts.template +1 -0
  120. package/schematics/components/files/stepper/stepper.ts.template +88 -0
  121. package/schematics/components/files/switch/index.ts.template +5 -0
  122. package/schematics/components/files/switch/switch.ts.template +29 -0
  123. package/schematics/components/files/table/body-cell.ts.template +19 -0
  124. package/schematics/components/files/table/body-row.ts.template +21 -0
  125. package/schematics/components/files/table/column.ts.template +8 -0
  126. package/schematics/components/files/table/head-cell.ts.template +19 -0
  127. package/schematics/components/files/table/head-row.ts.template +27 -0
  128. package/schematics/components/files/table/index.ts.template +26 -0
  129. package/schematics/components/files/table/table.ts.template +20 -0
  130. package/schematics/components/files/tabs/index.ts.template +5 -0
  131. package/schematics/components/files/tabs/tab.ts.template +89 -0
  132. package/schematics/components/files/theme/index.ts.template +2 -0
  133. package/schematics/components/files/theme/theme-button.component.ts.template +26 -0
  134. package/schematics/components/files/theme/theme.component.ts.template +165 -0
  135. package/schematics/components/files/theme/theme.service.ts.template +44 -0
  136. package/schematics/components/files/toggle/index.ts.template +5 -0
  137. package/schematics/components/files/toggle/toggle.ts.template +13 -0
  138. package/schematics/components/files/toggle-group/index.ts.template +5 -0
  139. package/schematics/components/files/toggle-group/toggle-group.ts.template +25 -0
  140. package/schematics/components/files/tooltip/index.ts.template +5 -0
  141. package/schematics/components/files/tooltip/tooltip.ts.template +40 -0
  142. package/schematics/components/files/tour/index.ts.template +3 -0
  143. package/schematics/components/files/tour/tour-step.ts.template +8 -0
  144. package/schematics/components/files/tour/tour.service.ts.template +7 -0
  145. package/schematics/components/files/tour/tour.ts.template +8 -0
  146. package/schematics/components/files/tree/index.ts.template +1 -0
  147. package/schematics/components/files/tree/tree.ts.template +66 -0
  148. package/schematics/components/index.d.ts +3 -0
  149. package/schematics/components/index.js +17 -0
  150. package/schematics/components/index.js.map +1 -0
  151. package/schematics/components/index.ts +29 -0
  152. package/schematics/components/schema.d.ts +6 -0
  153. package/schematics/components/schema.js +3 -0
  154. package/schematics/components/schema.js.map +1 -0
  155. package/schematics/components/schema.json +137 -0
  156. 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,5 @@
1
+ /*
2
+ * Public API Surface of progress
3
+ */
4
+
5
+ export * from './progress';
@@ -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,5 @@
1
+ /*
2
+ * Public API Surface of radio
3
+ */
4
+
5
+ export * from './radio';
@@ -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,5 @@
1
+ /*
2
+ * Public API Surface of resizable
3
+ */
4
+
5
+ export * from './resizable';
@@ -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,8 @@
1
+ /*
2
+ * Public API Surface of select
3
+ */
4
+
5
+ export * from './select';
6
+ export * from './option';
7
+ export * from './select-input';
8
+ export * from './list-selection';
@@ -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,5 @@
1
+ /*
2
+ * Public API Surface of separator
3
+ */
4
+
5
+ export * from './separator';
@@ -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,5 @@
1
+ /*
2
+ * Public API Surface of sheet
3
+ */
4
+
5
+ export * from './sheet';
@@ -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';