@ngbase/adk 0.1.3 → 0.1.5

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 (127) hide show
  1. package/package.json +13 -13
  2. package/schematics/collection.json +15 -0
  3. package/schematics/components/files/accordion/accordion.ts.template +53 -0
  4. package/schematics/components/files/accordion/index.ts.template +5 -0
  5. package/schematics/components/files/alert/alert.ts.template +62 -0
  6. package/schematics/components/files/alert/index.ts.template +1 -0
  7. package/schematics/components/files/autocomplete/autocomplete.ts.template +44 -0
  8. package/schematics/components/files/autocomplete/index.ts.template +5 -0
  9. package/schematics/components/files/avatar/avatar.ts.template +31 -0
  10. package/schematics/components/files/avatar/index.ts.template +1 -0
  11. package/schematics/components/files/badge/badge.ts.template +11 -0
  12. package/schematics/components/files/badge/index.ts.template +1 -0
  13. package/schematics/components/files/breadcrumb/breadcrumb.ts.template +53 -0
  14. package/schematics/components/files/breadcrumb/index.ts.template +1 -0
  15. package/schematics/components/files/button/button.ts.template +29 -0
  16. package/schematics/components/files/button/index.ts.template +5 -0
  17. package/schematics/components/files/card/card.ts.template +11 -0
  18. package/schematics/components/files/card/index.ts.template +5 -0
  19. package/schematics/components/files/carousel/carousel.ts.template +44 -0
  20. package/schematics/components/files/carousel/index.ts.template +1 -0
  21. package/schematics/components/files/checkbox/checkbox.ts.template +36 -0
  22. package/schematics/components/files/checkbox/focus-style.directive.ts.template +12 -0
  23. package/schematics/components/files/checkbox/index.ts.template +6 -0
  24. package/schematics/components/files/chip/chip.ts.template +38 -0
  25. package/schematics/components/files/chip/index.ts.template +1 -0
  26. package/schematics/components/files/color-picker/color-picker.ts.template +104 -0
  27. package/schematics/components/files/color-picker/index.ts.template +5 -0
  28. package/schematics/components/files/command/command.ts.template +82 -0
  29. package/schematics/components/files/command/index.ts.template +1 -0
  30. package/schematics/components/files/datepicker/calendar.ts.template +117 -0
  31. package/schematics/components/files/datepicker/datepicker.ts.template +59 -0
  32. package/schematics/components/files/datepicker/index.ts.template +2 -0
  33. package/schematics/components/files/datepicker/time.ts.template +54 -0
  34. package/schematics/components/files/dialog/dialog.ts.template +89 -0
  35. package/schematics/components/files/dialog/index.ts.template +5 -0
  36. package/schematics/components/files/drawer/drawer.ts.template +104 -0
  37. package/schematics/components/files/drawer/index.ts.template +5 -0
  38. package/schematics/components/files/form-field/form-field.ts.template +111 -0
  39. package/schematics/components/files/form-field/index.ts.template +6 -0
  40. package/schematics/components/files/form-field/input-style.directive.ts.template +11 -0
  41. package/schematics/components/files/hover-card/hover-card.ts.template +13 -0
  42. package/schematics/components/files/hover-card/index.ts.template +5 -0
  43. package/schematics/components/files/icon/icon.ts.template +16 -0
  44. package/schematics/components/files/icon/index.ts.template +1 -0
  45. package/schematics/components/files/inline-edit/index.ts.template +1 -0
  46. package/schematics/components/files/inline-edit/inline-edit.ts.template +24 -0
  47. package/schematics/components/files/keys/index.ts.template +5 -0
  48. package/schematics/components/files/keys/key.ts.template +35 -0
  49. package/schematics/components/files/list/index.ts.template +5 -0
  50. package/schematics/components/files/list/list.ts.template +28 -0
  51. package/schematics/components/files/mask/index.ts.template +1 -0
  52. package/schematics/components/files/mask/mask.ts.template +8 -0
  53. package/schematics/components/files/menu/context-menu.ts.template +14 -0
  54. package/schematics/components/files/menu/index.ts.template +8 -0
  55. package/schematics/components/files/menu/mention.ts.template +14 -0
  56. package/schematics/components/files/menu/menu.ts.template +37 -0
  57. package/schematics/components/files/menu/navigation-menu.ts.template +8 -0
  58. package/schematics/components/files/otp/index.ts.template +5 -0
  59. package/schematics/components/files/otp/otp.ts.template +37 -0
  60. package/schematics/components/files/pagination/index.ts.template +1 -0
  61. package/schematics/components/files/pagination/pagination.ts.template +75 -0
  62. package/schematics/components/files/picasa/index.ts.template +1 -0
  63. package/schematics/components/files/picasa/picasa-base.component.ts.template +80 -0
  64. package/schematics/components/files/picasa/picasa.component.ts.template +57 -0
  65. package/schematics/components/files/picasa/picasa.directive.ts.template +41 -0
  66. package/schematics/components/files/picasa/picase.service.ts.template +24 -0
  67. package/schematics/components/files/popover/index.ts.template +1 -0
  68. package/schematics/components/files/popover/popover.ts.template +64 -0
  69. package/schematics/components/files/progress/index.ts.template +5 -0
  70. package/schematics/components/files/progress/progress.ts.template +14 -0
  71. package/schematics/components/files/radio/index.ts.template +5 -0
  72. package/schematics/components/files/radio/radio.ts.template +37 -0
  73. package/schematics/components/files/resizable/index.ts.template +5 -0
  74. package/schematics/components/files/resizable/resizable.ts.template +59 -0
  75. package/schematics/components/files/scroll-area/index.ts.template +1 -0
  76. package/schematics/components/files/scroll-area/scroll-area.ts.template +40 -0
  77. package/schematics/components/files/select/index.ts.template +8 -0
  78. package/schematics/components/files/select/list-selection.ts.template +15 -0
  79. package/schematics/components/files/select/option.ts.template +35 -0
  80. package/schematics/components/files/select/select-input.ts.template +21 -0
  81. package/schematics/components/files/select/select.ts.template +96 -0
  82. package/schematics/components/files/selectable/index.ts.template +1 -0
  83. package/schematics/components/files/selectable/selectable.ts.template +34 -0
  84. package/schematics/components/files/separator/index.ts.template +5 -0
  85. package/schematics/components/files/separator/separator.ts.template +19 -0
  86. package/schematics/components/files/sheet/index.ts.template +5 -0
  87. package/schematics/components/files/sheet/sheet.ts.template +69 -0
  88. package/schematics/components/files/sidenav/index.ts.template +1 -0
  89. package/schematics/components/files/sidenav/sidenav.ts.template +48 -0
  90. package/schematics/components/files/skeleton/index.ts.template +1 -0
  91. package/schematics/components/files/skeleton/skeleton.ts.template +15 -0
  92. package/schematics/components/files/slider/index.ts.template +5 -0
  93. package/schematics/components/files/slider/slider.ts.template +35 -0
  94. package/schematics/components/files/sonner/index.ts.template +5 -0
  95. package/schematics/components/files/sonner/sonner.ts.template +59 -0
  96. package/schematics/components/files/spinner/index.ts.template +1 -0
  97. package/schematics/components/files/spinner/spinner.ts.template +79 -0
  98. package/schematics/components/files/stepper/index.ts.template +1 -0
  99. package/schematics/components/files/stepper/stepper.ts.template +88 -0
  100. package/schematics/components/files/switch/index.ts.template +5 -0
  101. package/schematics/components/files/switch/switch.ts.template +29 -0
  102. package/schematics/components/files/table/index.ts.template +27 -0
  103. package/schematics/components/files/table/table.ts.template +122 -0
  104. package/schematics/components/files/tabs/index.ts.template +5 -0
  105. package/schematics/components/files/tabs/tab.ts.template +92 -0
  106. package/schematics/components/files/theme/index.ts.template +2 -0
  107. package/schematics/components/files/theme/theme-button.component.ts.template +26 -0
  108. package/schematics/components/files/theme/theme.service.ts.template +33 -0
  109. package/schematics/components/files/toggle/index.ts.template +5 -0
  110. package/schematics/components/files/toggle/toggle.ts.template +13 -0
  111. package/schematics/components/files/toggle-group/index.ts.template +5 -0
  112. package/schematics/components/files/toggle-group/toggle-group.ts.template +25 -0
  113. package/schematics/components/files/tooltip/index.ts.template +5 -0
  114. package/schematics/components/files/tooltip/tooltip.ts.template +45 -0
  115. package/schematics/components/files/tour/index.ts.template +1 -0
  116. package/schematics/components/files/tour/tour.ts.template +19 -0
  117. package/schematics/components/files/tree/index.ts.template +1 -0
  118. package/schematics/components/files/tree/tree.ts.template +66 -0
  119. package/schematics/components/index.d.ts +3 -0
  120. package/schematics/components/index.js +23 -0
  121. package/schematics/components/index.js.map +1 -0
  122. package/schematics/components/index.ts +39 -0
  123. package/schematics/components/schema.d.ts +6 -0
  124. package/schematics/components/schema.js +3 -0
  125. package/schematics/components/schema.js.map +1 -0
  126. package/schematics/components/schema.json +142 -0
  127. package/schematics/components/schema.ts +6 -0
@@ -0,0 +1,48 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import {
3
+ NgbSidenav,
4
+ NgbSidenavHeader,
5
+ NgbSidenavHeaderContent,
6
+ NgbSidenavHeaderTrack,
7
+ NgbSidenavOverlay,
8
+ SidenavType,
9
+ aliasSidenav,
10
+ slideAnimation,
11
+ } from '@ngbase/adk/sidenav';
12
+
13
+ export type { SidenavType };
14
+
15
+ @Component({
16
+ selector: '<%= name %>-sidenav',
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ providers: [aliasSidenav(Sidenav)],
19
+ imports: [NgbSidenavOverlay, NgbSidenavHeaderTrack],
20
+ template: `
21
+ @if (showOverlay()) {
22
+ <div ngbSidenavOverlay class="z-p bg-black/70"></div>
23
+ }
24
+ <div ngbSidenavHeaderTrack class="transition-[width] duration-500"></div>
25
+ <ng-content select="<%= name %>-sidenav-header" />
26
+ <ng-content />
27
+ `,
28
+ host: {
29
+ class: 'flex w-full overflow-hidden relative top-0 left-0 h-full',
30
+ },
31
+ })
32
+ export class Sidenav extends NgbSidenav {}
33
+
34
+ @Component({
35
+ selector: '<%= name %>-sidenav-header',
36
+ changeDetection: ChangeDetectionStrategy.OnPush,
37
+ imports: [NgbSidenavHeaderContent],
38
+ template: `
39
+ <div ngbSidenavHeaderContent class="h-full overflow-auto">
40
+ <ng-content />
41
+ </div>
42
+ `,
43
+ host: {
44
+ class: 'block h-full bg-background z-p transition-[width] duration-500',
45
+ },
46
+ animations: [slideAnimation('500ms cubic-bezier(0.4, 0, 0.2, 1)')],
47
+ })
48
+ export class SidenavHeader extends NgbSidenavHeader {}
@@ -0,0 +1 @@
1
+ export * from './skeleton';
@@ -0,0 +1,15 @@
1
+ import { Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: '<%= name %>-skeleton',
5
+ template: ``,
6
+ host: {
7
+ class: 'block animate-pulse bg-muted',
8
+ '[class]': `shape() === 'circle' ? 'rounded-full' : 'rounded-md'`,
9
+ },
10
+ })
11
+ export class Skeleton {
12
+ readonly shape = input<'circle' | 'rectangle'>('rectangle');
13
+ readonly width = input<string>('100%');
14
+ readonly height = input<string>('20px');
15
+ }
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of slider
3
+ */
4
+
5
+ export * from './slider';
@@ -0,0 +1,35 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { NgbSlider, SliderRange, SliderThumb, SliderTrack, aliasSlider } from '@ngbase/adk/slider';
3
+ import { ɵFocusStyle as FocusStyle } from '<%= basepath %>/checkbox';
4
+
5
+ @Component({
6
+ selector: '<%= name %>-slider',
7
+ exportAs: '<%= name %>Slider',
8
+ changeDetection: ChangeDetectionStrategy.OnPush,
9
+ providers: [aliasSlider(Slider)],
10
+ imports: [FocusStyle, SliderTrack, SliderRange, SliderThumb],
11
+ template: `
12
+ <div
13
+ ngbSliderTrack
14
+ class="h-full overflow-hidden rounded-full bg-muted aria-[disabled=true]:bg-opacity-30"
15
+ >
16
+ <div ngbSliderRange class="bg-primary aria-[disabled=true]:bg-muted"></div>
17
+ </div>
18
+ @for (thumb of noOfThumbs(); track thumb) {
19
+ <button
20
+ ngbSliderThumb
21
+ <%= name %>FocusStyle
22
+ class="{{
23
+ 'inline-block h-5 w-5 rounded-full border-2 bg-background shadow-md aria-[disabled=false]:border-primary aria-[disabled=true]:bg-muted ' +
24
+ (orientation() === 'vertical'
25
+ ? '-left-1.5 -translate-y-1/2'
26
+ : '-top-1.5 -translate-x-1/2')
27
+ }}"
28
+ ></button>
29
+ }
30
+ `,
31
+ host: {
32
+ class: 'block relative my-2 aria-[orientation=vertical]:w-2 aria-[orientation=horizontal]:h-2',
33
+ },
34
+ })
35
+ export class Slider extends NgbSlider {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of sonner
3
+ */
4
+
5
+ export { sonnerPortal } from './sonner';
@@ -0,0 +1,59 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { NgbSonner, ngbSonnerPortal, sonnerAnimation, SonnerBase } from '@ngbase/adk/sonner';
3
+ import { Icon } from '<%= basepath %>/icon';
4
+ import { provideIcons } from '@ng-icons/core';
5
+ import {
6
+ lucideCircleAlert,
7
+ lucideCircleCheck,
8
+ lucideInfo,
9
+ lucideTriangleAlert,
10
+ } from '@ng-icons/lucide';
11
+
12
+ @Component({
13
+ selector: '<%= name %>-sonner',
14
+ changeDetection: ChangeDetectionStrategy.OnPush,
15
+ providers: [
16
+ provideIcons({ lucideCircleCheck, lucideInfo, lucideTriangleAlert, lucideCircleAlert }),
17
+ ],
18
+ imports: [Icon, SonnerBase],
19
+ template: `
20
+ <ul class="fixed bottom-0 right-0 z-p flex flex-col gap-1">
21
+ @for (msg of messages(); track msg.id) {
22
+ <li
23
+ [ngbSonnerBase]="$index"
24
+ class="{{
25
+ 'm-4 w-96 rounded-lg border bg-background p-4 shadow-lg transition-all duration-300' +
26
+ (msg.type === 'success' ? ' bg-green-50 text-green-600' : '') +
27
+ (msg.type === 'error' ? ' bg-red-50 text-red-600' : '') +
28
+ (msg.type === 'warning' ? ' bg-yellow-50 text-yellow-600' : '')
29
+ }}"
30
+ >
31
+ <h4 class="flex items-center gap-2 font-semibold">
32
+ @if (msg.type && icons[msg.type]; as iconName) {
33
+ <<%= name %>-icon [name]="iconName" />
34
+ }
35
+ {{ msg.message }}
36
+ </h4>
37
+ @if (msg.data?.description) {
38
+ <p class="text-muted-foreground">{{ msg.data?.description }}</p>
39
+ }
40
+ </li>
41
+ }
42
+ </ul>
43
+ `,
44
+ animations: [sonnerAnimation],
45
+ })
46
+ export class Sonner extends NgbSonner {
47
+ readonly icons = {
48
+ success: 'lucideCircleCheck',
49
+ error: 'lucideCircleAlert',
50
+ info: 'lucideInfo',
51
+ warning: 'lucideTriangleAlert',
52
+ default: '',
53
+ };
54
+ }
55
+
56
+ export function sonnerPortal() {
57
+ const portal = ngbSonnerPortal(Sonner);
58
+ return portal;
59
+ }
@@ -0,0 +1 @@
1
+ export * from './spinner';
@@ -0,0 +1,79 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { animate, keyframes, style, transition, trigger } from '@angular/animations';
3
+
4
+ const spinnerAnimation = trigger('enterLeave', [
5
+ transition(':enter', [
6
+ animate(
7
+ '500ms cubic-bezier(0.68, -0.55, 0.265, 1.55)',
8
+ keyframes([
9
+ style({ opacity: 0, transform: 'scale(0)', offset: 0 }),
10
+ style({ opacity: 1, transform: 'scale(1.5)', offset: 0.7 }),
11
+ style({ opacity: 1, transform: 'scale(1)', offset: 1 }),
12
+ ]),
13
+ ),
14
+ ]),
15
+ transition(':leave', [
16
+ animate(
17
+ '500ms cubic-bezier(0.68, -0.55, 0.265, 1.55)',
18
+ keyframes([
19
+ style({ opacity: 1, transform: 'scale(1)', offset: 0 }),
20
+ style({ opacity: 1, transform: 'scale(1.5)', offset: 0.3 }),
21
+ style({ opacity: 0, transform: 'scale(0)', offset: 1 }),
22
+ ]),
23
+ ),
24
+ ]),
25
+ ]);
26
+
27
+ @Component({
28
+ selector: '<%= name %>-spinner',
29
+ template: `
30
+ <ng-content />
31
+ <!-- <div
32
+ class="aspect-square w-full animate-spin rounded-full border-primary border-l-transparent"
33
+ [class]="mode()"
34
+ [style.border-width.px]="strokeWidth()"
35
+ [style.width.px]="diameter()"
36
+ ></div> -->
37
+ <div
38
+ class="spinner"
39
+ [style]="{
40
+ width: diameter() + 'px',
41
+ height: diameter() + 'px',
42
+ }"
43
+ >
44
+ <svg viewBox="0 0 50 50">
45
+ <circle
46
+ cx="25"
47
+ cy="25"
48
+ r="20"
49
+ [style.strokeWidth.px]="strokeWidth()"
50
+ stroke-dasharray="88 38"
51
+ stroke-linecap="round"
52
+ class="fill-none stroke-current"
53
+ >
54
+ <animateTransform
55
+ attributeName="transform"
56
+ type="rotate"
57
+ repeatCount="indefinite"
58
+ dur="1s"
59
+ values="0 25 25;360 25 25"
60
+ />
61
+ </circle>
62
+ </svg>
63
+ </div>
64
+ `,
65
+ host: {
66
+ class: 'inline-flex items-center justify-center transition-all duration-300 text-primary',
67
+ '[class]': `root() ? 'fixed inset-0 z-p bg-background bg-opacity-60 backdrop-blur-sm' : 'relative'`,
68
+ },
69
+ animations: [
70
+ // animation for entering and exiting, with a bouncy effect
71
+ spinnerAnimation,
72
+ ],
73
+ })
74
+ export class Spinner {
75
+ readonly mode = input<'light' | 'dark' | ''>('light');
76
+ readonly diameter = input<number>(35);
77
+ readonly strokeWidth = input<any>(3);
78
+ readonly root = input<boolean>(false);
79
+ }
@@ -0,0 +1 @@
1
+ export * from './stepper';
@@ -0,0 +1,88 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
3
+ import {
4
+ aliasStepper,
5
+ NgbStep,
6
+ NgbStepHeader,
7
+ NgbStepper,
8
+ NgbStepperStep,
9
+ provideStep,
10
+ stepperAnimation,
11
+ } from '@ngbase/adk/stepper';
12
+
13
+ @Component({
14
+ selector: '<%= name %>-stepper',
15
+ exportAs: '<%= name %>Stepper',
16
+ changeDetection: ChangeDetectionStrategy.OnPush,
17
+ providers: [aliasStepper(Stepper)],
18
+ imports: [NgTemplateOutlet, NgbStepperStep],
19
+ template: `
20
+ <div class="flex justify-between" [class.flex-col]="direction() === 'vertical'">
21
+ @for (step of steps(); track step) {
22
+ <div
23
+ [ngbStepperStep]="$index"
24
+ class="{{
25
+ 'relative flex pb-4 data-[index]:flex-1 data-[index]:after:mx-2 data-[index]:after:block data-[index]:after:flex-1 data-[index]:after:bg-foreground data-[index]:after:transition-colors' +
26
+ (activeIndex() > $index ? ' data-[index]:after:bg-primary' : '') +
27
+ (direction() === 'vertical'
28
+ ? ' flex-col data-[index]:after:absolute data-[index]:after:bottom-0 data-[index]:after:left-3 data-[index]:after:top-10 data-[index]:after:w-0.5'
29
+ : ' items-center data-[index]:after:h-0.5')
30
+ }}"
31
+ >
32
+ <div class="flex items-center">
33
+ <div
34
+ class="{{
35
+ 'mr-2 grid aspect-square w-10 place-content-center rounded-full border-2 transition-colors' +
36
+ (activeIndex() > $index ? ' bg-primary' : '') +
37
+ (activeIndex() >= $index ? ' border-primary' : '')
38
+ }}"
39
+ >
40
+ {{ $index + 1 }}
41
+ </div>
42
+ @if (step.header(); as header) {
43
+ <ng-container *ngTemplateOutlet="header" />
44
+ } @else {
45
+ {{ step.title() }}
46
+ }
47
+ </div>
48
+ @if (step.verticalTemplate(); as template) {
49
+ <div class="ml-12" [@slide]>
50
+ <div class="pt-4">
51
+ <ng-container *ngTemplateOutlet="template" />
52
+ </div>
53
+ </div>
54
+ }
55
+ </div>
56
+ }
57
+ </div>
58
+ <ng-content />
59
+ `,
60
+ animations: [stepperAnimation],
61
+ })
62
+ export class Stepper extends NgbStepper {}
63
+
64
+ @Component({
65
+ selector: '<%= name %>-step',
66
+ exportAs: '<%= name %>Step',
67
+ changeDetection: ChangeDetectionStrategy.OnPush,
68
+ providers: [provideStep(Step)],
69
+ imports: [NgTemplateOutlet],
70
+ template: `
71
+ <ng-template #stepContainer>
72
+ <ng-content />
73
+ </ng-template>
74
+
75
+ @if (horizontalTemplate(); as template) {
76
+ <div class="pb-4">
77
+ <ng-container *ngTemplateOutlet="template" />
78
+ </div>
79
+ }
80
+ `,
81
+ })
82
+ export class Step extends NgbStep {}
83
+
84
+ @Directive({
85
+ selector: '[<%= name %>StepHeader]',
86
+ hostDirectives: [NgbStepHeader],
87
+ })
88
+ export class StepHeader {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of switch
3
+ */
4
+
5
+ export * from './switch';
@@ -0,0 +1,29 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { NgbSwitch, NgbSwitchLabel, NgbSwitchThumb, NgbSwitchTrack } from '@ngbase/adk/switch';
3
+
4
+ @Component({
5
+ selector: '<%= name %>-switch',
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ hostDirectives: [
8
+ { directive: NgbSwitch, inputs: ['checked', 'disabled'], outputs: ['checkedChange', 'change'] },
9
+ ],
10
+ imports: [NgbSwitchTrack, NgbSwitchLabel, NgbSwitchThumb],
11
+ template: `
12
+ <button
13
+ ngbSwitchTrack
14
+ class="relative w-9 rounded-full border-2 border-transparent bg-muted transition-colors aria-[checked=true]:bg-primary"
15
+ >
16
+ <span
17
+ #thumb="ngbSwitchThumb"
18
+ ngbSwitchThumb
19
+ [class]="thumb.checked() ? (thumb.rtl() ? '-translate-x-full' : 'translate-x-full') : ''"
20
+ class="block h-4 w-4 rounded-full bg-background shadow-sm transition-transform"
21
+ ></span>
22
+ </button>
23
+ <label ngbSwitchLabel><ng-content /></label>
24
+ `,
25
+ host: {
26
+ class: 'inline-flex items-center gap-2 py-1',
27
+ },
28
+ })
29
+ export class Switch {}
@@ -0,0 +1,27 @@
1
+ import {
2
+ BodyRow,
3
+ BodyRowDef,
4
+ Cell,
5
+ CellDef,
6
+ Column,
7
+ HeadDef,
8
+ Head,
9
+ Table,
10
+ HeadRow,
11
+ HeadRowDef,
12
+ } from './table';
13
+
14
+ export * from './table';
15
+
16
+ export const TableComponents = [
17
+ BodyRow,
18
+ BodyRowDef,
19
+ Cell,
20
+ CellDef,
21
+ Head,
22
+ HeadDef,
23
+ HeadRow,
24
+ HeadRowDef,
25
+ Column,
26
+ Table,
27
+ ];
@@ -0,0 +1,122 @@
1
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
2
+ import {
3
+ NgbBodyRow,
4
+ NgbBodyRowDef,
5
+ NgbCell,
6
+ NgbCellDef,
7
+ NgbColumn,
8
+ NgbHead,
9
+ NgbHeadDef,
10
+ NgbHeadRow,
11
+ NgbHeadRowDef,
12
+ NgbTable,
13
+ } from '@ngbase/adk/table';
14
+
15
+ @Component({
16
+ selector: 'table[<%= name %>Table]',
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ providers: [{ provide: NgbTable, useExisting: Table }],
19
+ template: `
20
+ <thead>
21
+ <ng-container #thead />
22
+ </thead>
23
+ <tbody>
24
+ <ng-container #tbody />
25
+ </tbody>
26
+ `,
27
+ host: {
28
+ class: 'w-full text-sm',
29
+ },
30
+ })
31
+ export class Table<T> extends NgbTable<T> {}
32
+
33
+ // Cell
34
+ @Component({
35
+ selector: '[<%= name %>Cell]',
36
+ changeDetection: ChangeDetectionStrategy.OnPush,
37
+ hostDirectives: [NgbCell],
38
+ template: `<ng-content />`,
39
+ host: {
40
+ class: 'px-4 py-2 align-middle bg-background',
41
+ },
42
+ })
43
+ export class Cell {}
44
+
45
+ @Directive({
46
+ selector: '[<%= name %>CellDef]',
47
+ hostDirectives: [NgbCellDef],
48
+ })
49
+ export class CellDef {}
50
+
51
+ // Body
52
+
53
+ @Directive({
54
+ selector: '[<%= name %>BodyRowDef]',
55
+ hostDirectives: [
56
+ { directive: NgbBodyRowDef, inputs: ['ngbBodyRowDefColumns: <%= name %>BodyRowDefColumns'] },
57
+ ],
58
+ })
59
+ export class BodyRowDef {}
60
+
61
+ @Component({
62
+ selector: '[<%= name %>BodyRow]',
63
+ changeDetection: ChangeDetectionStrategy.OnPush,
64
+ providers: [{ provide: NgbBodyRow, useExisting: BodyRow }],
65
+ template: `<ng-container #container />`,
66
+ host: {
67
+ class: '[&:not(:last-child)]:border-b hover:bg-muted h-12',
68
+ },
69
+ })
70
+ export class BodyRow extends NgbBodyRow {}
71
+
72
+ // Column
73
+
74
+ @Directive({
75
+ selector: '[<%= name %>Column]',
76
+ hostDirectives: [{ directive: NgbColumn, inputs: ['ngbColumn: <%= name %>Column', 'sticky'] }],
77
+ })
78
+ export class Column {}
79
+
80
+ // Head Cell
81
+
82
+ @Component({
83
+ selector: '[<%= name %>Head]',
84
+ changeDetection: ChangeDetectionStrategy.OnPush,
85
+ hostDirectives: [NgbHead],
86
+ template: `<ng-content />`,
87
+ host: {
88
+ class:
89
+ 'px-4 py-2 text-left align-middle font-medium text-muted-foreground border-b bg-background',
90
+ },
91
+ })
92
+ export class Head {}
93
+
94
+ @Directive({
95
+ selector: '[<%= name %>HeadDef]',
96
+ hostDirectives: [NgbHeadDef],
97
+ })
98
+ export class HeadDef {}
99
+
100
+ // Head Row
101
+
102
+ @Component({
103
+ selector: '[<%= name %>HeadRow]',
104
+ changeDetection: ChangeDetectionStrategy.OnPush,
105
+ providers: [{ provide: NgbHeadRow, useExisting: HeadRow }],
106
+ template: `<ng-container #container />`,
107
+ host: {
108
+ class: `h-10 [&[data-sticky=true]]:sticky [&[data-sticky=true]]:top-0 [&[data-sticky=true]]:bg-background`,
109
+ },
110
+ })
111
+ export class HeadRow extends NgbHeadRow {}
112
+
113
+ @Directive({
114
+ selector: '[<%= name %>HeadRowDef]',
115
+ hostDirectives: [
116
+ {
117
+ directive: NgbHeadRowDef,
118
+ inputs: ['ngbHeadRowDef: <%= name %>HeadRowDef', 'ngbHeadRowDefSticky: <%= name %>HeadRowDefSticky'],
119
+ },
120
+ ],
121
+ })
122
+ export class HeadRowDef {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of tab
3
+ */
4
+
5
+ export * from './tab';
@@ -0,0 +1,92 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
3
+ import { Icon } from '<%= basepath %>/icon';
4
+ import { provideIcons } from '@ng-icons/core';
5
+ import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
6
+ import {
7
+ aliasTab,
8
+ aliasTabs,
9
+ NgbTab,
10
+ NgbTabChangeEvent,
11
+ NgbTabHeader,
12
+ NgbTabLazy,
13
+ NgbTabs,
14
+ TabButton,
15
+ TabButtonsGroup,
16
+ TabScroll,
17
+ } from '@ngbase/adk/tabs';
18
+
19
+ @Component({
20
+ selector: '<%= name %>-tabs',
21
+ imports: [Icon, TabButton, TabButtonsGroup, TabScroll],
22
+ changeDetection: ChangeDetectionStrategy.OnPush,
23
+ providers: [aliasTabs(Tabs)],
24
+ viewProviders: [provideIcons({ lucideChevronRight, lucideChevronLeft })],
25
+ template: `<div class="flex items-center border-b">
26
+ <ng-content select=".tab-start-header-content" />
27
+ <div class="relative flex overflow-hidden">
28
+ <button
29
+ ngbTabScroll="left"
30
+ class="absolute left-0 z-10 h-full place-items-center bg-background px-2"
31
+ >
32
+ <<%= name %>-icon name="lucideChevronLeft" />
33
+ </button>
34
+ <nav ngbTabButtonsGroup class="overflow-auto">
35
+ <div #tabListContainer class="flex h-full w-max">
36
+ @for (tab of tabs(); track tab.id) {
37
+ <button
38
+ [ngbTabButton]="tab"
39
+ class="text-muted-foreground aria-[disabled=true]:text-muted-foreground whitespace-nowrap border-b-2 border-transparent px-4 py-3 font-medium aria-[disabled=true]:cursor-not-allowed aria-[selected=true]:!border-primary aria-[selected=true]:!text-primary aria-[disabled=true]:opacity-50"
40
+ ></button>
41
+ }
42
+ </div>
43
+ </nav>
44
+ <button
45
+ ngbTabScroll="right"
46
+ class="absolute right-0 z-10 h-full place-items-center bg-background px-2"
47
+ >
48
+ <<%= name %>-icon name="lucideChevronRight" />
49
+ </button>
50
+ </div>
51
+ <ng-content select=".tab-header-content" />
52
+ </div>
53
+ <ng-content /> `,
54
+ host: {
55
+ class: 'bg-background flex flex-col',
56
+ },
57
+ })
58
+ export class Tabs extends NgbTabs<Tab> {}
59
+
60
+ @Component({
61
+ selector: '<%= name %>-tab',
62
+ exportAs: '<%= name %>Tab',
63
+ changeDetection: ChangeDetectionStrategy.OnPush,
64
+ providers: [aliasTab(Tab)],
65
+ imports: [NgTemplateOutlet],
66
+ template: `
67
+ @if (lazyTemplate(); as template) {
68
+ <ng-container *ngTemplateOutlet="template" />
69
+ } @else if (activeMode()) {
70
+ <ng-content />
71
+ }
72
+ `,
73
+ host: {
74
+ class: 'block overflow-auto',
75
+ '[class]': `active() ? 'flex-1 h-full pt-4' : 'hidden'`,
76
+ },
77
+ })
78
+ export class Tab extends NgbTab {}
79
+
80
+ @Directive({
81
+ selector: '[<%= name %>TabHeader]',
82
+ hostDirectives: [NgbTabHeader],
83
+ })
84
+ export class TabHeader {}
85
+
86
+ @Directive({
87
+ selector: '[<%= name %>TabLazy]',
88
+ hostDirectives: [NgbTabLazy],
89
+ })
90
+ export class TabLazy {}
91
+
92
+ export type TabChangeEvent = NgbTabChangeEvent;
@@ -0,0 +1,2 @@
1
+ export { injectTheme } from './theme.service';
2
+ export { ThemeButton } from './theme-button.component';
@@ -0,0 +1,26 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { Button } from '<%= basepath %>/button';
3
+ import { Icon } from '<%= basepath %>/icon';
4
+ import { provideIcons } from '@ng-icons/core';
5
+ import { lucideMoon, lucideSun } from '@ng-icons/lucide';
6
+ import { injectTheme } from './theme.service';
7
+
8
+ @Component({
9
+ selector: '<%= name %>-theme-button',
10
+ imports: [Icon, Button],
11
+ changeDetection: ChangeDetectionStrategy.OnPush,
12
+ viewProviders: [provideIcons({ lucideMoon, lucideSun })],
13
+ template: `
14
+ <button <%= name %>Button="icon" class="tour-mode h-9 w-9" (click)="themeService.toggle()">
15
+ <<%= name %>-icon [name]="themeService.mode() === 'dark' ? 'lucideSun' : 'lucideMoon'" />
16
+ <span class="sr-only">Toggle theme</span>
17
+ </button>
18
+ `,
19
+ })
20
+ export class ThemeButton {
21
+ readonly themeService = injectTheme();
22
+
23
+ constructor() {
24
+ // shortcutListener('ctrl+d', () => this.themeService.toggle());
25
+ }
26
+ }