@ngbase/adk 0.1.3 → 0.1.4

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 +9 -9
  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 +41 -0
  121. package/schematics/components/index.js.map +1 -0
  122. package/schematics/components/index.ts +59 -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 +145 -0
  127. package/schematics/components/schema.ts +6 -0
@@ -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
+ }
@@ -0,0 +1,33 @@
1
+ import { inject, Injectable, signal } from '@angular/core';
2
+ import { isClient } from '@ngbase/adk/utils';
3
+
4
+ @Injectable({ providedIn: 'root' })
5
+ export class ThemeService {
6
+ mode = signal<'light' | 'dark' | ''>('light');
7
+
8
+ constructor() {
9
+ if (isClient()) {
10
+ const theme = localStorage.getItem('theme');
11
+ this._update((theme as 'light' | 'dark') || 'light');
12
+
13
+ // registerShortcut('ctrl+h', () => this.open());
14
+ }
15
+ }
16
+
17
+ toggle() {
18
+ this._update(this.mode() === 'dark' ? 'light' : 'dark');
19
+ }
20
+
21
+ private _update(mode: 'light' | 'dark' = 'light') {
22
+ const body = document.body;
23
+ if (mode === 'dark') {
24
+ body.classList.add('dark');
25
+ } else {
26
+ body.classList.remove('dark');
27
+ }
28
+ localStorage.setItem('theme', mode);
29
+ this.mode.set(mode);
30
+ }
31
+ }
32
+
33
+ export const injectTheme = () => inject(ThemeService);
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of toggle
3
+ */
4
+
5
+ export * from './toggle';
@@ -0,0 +1,13 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { NgbToggle } from '@ngbase/adk/toggle';
3
+
4
+ @Component({
5
+ selector: 'button[<%= name %>Toggle]',
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ hostDirectives: [{ directive: NgbToggle, inputs: ['value'], outputs: ['valueChange'] }],
8
+ template: `<ng-content />`,
9
+ host: {
10
+ class: 'block w-9 h-9 rounded relative aria-[pressed=true]:bg-foreground',
11
+ },
12
+ })
13
+ export class Toggle {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of toggle-group
3
+ */
4
+
5
+ export * from './toggle-group';
@@ -0,0 +1,25 @@
1
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
2
+ import { NgbToggleGroup, NgbToggleItem } from '@ngbase/adk/toggle-group';
3
+
4
+ @Component({
5
+ selector: '<%= name %>-toggle-group',
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ hostDirectives: [
8
+ { directive: NgbToggleGroup, inputs: ['value', 'multiple'], outputs: ['valueChange'] },
9
+ ],
10
+ template: ` <ng-content select="[<%= name %>ToggleItem]" /> `,
11
+ host: {
12
+ class: 'flex gap-1',
13
+ },
14
+ })
15
+ export class ToggleGroup<T> {}
16
+
17
+ @Directive({
18
+ selector: 'button[<%= name %>ToggleItem]',
19
+ hostDirectives: [{ directive: NgbToggleItem, inputs: ['disabled', 'value'] }],
20
+ host: {
21
+ class:
22
+ 'inline-block rounded h-9 px-3 hover:bg-opacity-80 active:bg-opacity-70 aria-[selected=true]:bg-foreground',
23
+ },
24
+ })
25
+ export class ToggleItem<T> {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of tooltip
3
+ */
4
+
5
+ export { provideTooltipOptions, Tooltip } from './tooltip';
@@ -0,0 +1,45 @@
1
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
2
+ import { injectTheme } from '<%= basepath %>/theme';
3
+ import { NgbPopoverArrow, providePopoverArrowTracker } from '@ngbase/adk/popover';
4
+ import {
5
+ NgbTooltip,
6
+ NgbTooltipTemplate,
7
+ provideNgbTooltipOptions,
8
+ tooltipAnimation,
9
+ TooltipOptions,
10
+ } from '@ngbase/adk/tooltip';
11
+
12
+ @Directive({
13
+ selector: '[<%= name %>Tooltip]',
14
+ hostDirectives: [
15
+ {
16
+ directive: NgbTooltip,
17
+ inputs: [
18
+ 'ngbTooltip: <%= name %>Tooltip',
19
+ 'ngbTooltipPosition: <%= name %>TooltipPosition',
20
+ 'delay',
21
+ ],
22
+ },
23
+ ],
24
+ })
25
+ export class Tooltip {}
26
+
27
+ @Component({
28
+ selector: '<%= name %>-tooltip',
29
+ changeDetection: ChangeDetectionStrategy.OnPush,
30
+ providers: [providePopoverArrowTracker()],
31
+ imports: [NgbPopoverArrow],
32
+ template: `<div ngbPopoverArrow>{{ content() }}</div>`,
33
+ host: {
34
+ class:
35
+ 'fixed inline-block rounded-lg bg-background px-3 py-1 border shadow-md z-p whitespace-pre-line max-w-[15rem] text-text',
36
+ '[class]': `theme.mode() === 'dark' ? 'light' : 'dark'`,
37
+ },
38
+ animations: [tooltipAnimation],
39
+ })
40
+ export class TooltipComponent extends NgbTooltipTemplate {
41
+ readonly theme = injectTheme();
42
+ }
43
+
44
+ export const provideTooltipOptions = (options: TooltipOptions) =>
45
+ provideNgbTooltipOptions({ ...options, component: TooltipComponent });
@@ -0,0 +1 @@
1
+ export * from './tour';
@@ -0,0 +1,19 @@
1
+ import { Directive, inject, InjectionToken } from '@angular/core';
2
+ import { NgbTour, NgbTourService, NgbTourStep } from '@ngbase/adk/tour';
3
+
4
+ export const TourService = new InjectionToken<NgbTourService>('TourService', {
5
+ providedIn: 'root',
6
+ factory: () => inject(NgbTourService),
7
+ });
8
+
9
+ @Directive({
10
+ selector: '[<%= name %>Tour]',
11
+ hostDirectives: [NgbTour],
12
+ })
13
+ export class Tour {}
14
+
15
+ @Directive({
16
+ selector: '[<%= name %>TourStep]',
17
+ hostDirectives: [{ directive: NgbTourStep, inputs: ['ngbTourStep: <%= name %>TourStep'] }],
18
+ })
19
+ export class TourStep {}
@@ -0,0 +1 @@
1
+ export * from './tree';