@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,111 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ Directive,
5
+ effect,
6
+ ElementRef,
7
+ inject,
8
+ viewChild,
9
+ } from '@angular/core';
10
+ import {
11
+ InputBase,
12
+ NgbFormField,
13
+ NgbInputError,
14
+ NgbLabel,
15
+ toggleDiv,
16
+ } from '@ngbase/adk/form-field';
17
+ import { InputStyle } from './input-style.directive';
18
+ import { NgbSelectTarget } from '@ngbase/adk/select';
19
+
20
+ @Component({
21
+ selector: '<%= name %>-form-field, [<%= name %>FormField]',
22
+ changeDetection: ChangeDetectionStrategy.OnPush,
23
+ hostDirectives: [NgbFormField, NgbSelectTarget],
24
+ imports: [InputStyle],
25
+ template: `
26
+ <ng-content select="[<%= name %>Label]" />
27
+ <ng-content select="[<%= name %>Description]" />
28
+ <div class="mt-1 flex items-center" #target <%= name %>InputStyle>
29
+ <ng-content select="[<%= name %>Prefix]" />
30
+ <ng-content />
31
+ <ng-content select="[<%= name %>Suffix]" />
32
+ </div>
33
+ <ng-content select="[<%= name %>Error]" />
34
+ `,
35
+ host: {
36
+ class: 'inline-flex flex-col font-medium gap-1',
37
+ },
38
+ })
39
+ export class FormField {
40
+ readonly selectTarget = inject(NgbSelectTarget);
41
+ readonly target = viewChild.required<ElementRef<HTMLDivElement>>('target');
42
+ private _ = effect(() => {
43
+ this.selectTarget.target.set(this.target().nativeElement);
44
+ });
45
+ }
46
+
47
+ @Directive({
48
+ selector: '[<%= name %>Input]',
49
+ hostDirectives: [{ directive: InputBase, inputs: ['value'], outputs: ['valueChange'] }],
50
+ host: {
51
+ class: 'outline-none w-full bg-transparent',
52
+ '[class.border-red-500]': 'formField?.hasErrors()',
53
+ },
54
+ })
55
+ export class Input {
56
+ readonly formField = inject(NgbFormField, { optional: true });
57
+ }
58
+
59
+ @Component({
60
+ selector: '[<%= name %>Label]',
61
+ changeDetection: ChangeDetectionStrategy.OnPush,
62
+ hostDirectives: [NgbLabel],
63
+ template: `<ng-content />`,
64
+ host: {
65
+ class: 'block font-medium mx-0.5',
66
+ },
67
+ })
68
+ export class Label {}
69
+
70
+ @Directive({
71
+ selector: '[<%= name %>Description]',
72
+ host: {
73
+ class: 'text-sm text-muted-foreground',
74
+ },
75
+ })
76
+ export class Description {}
77
+
78
+ @Directive({
79
+ selector: '[<%= name %>Prefix]',
80
+ host: {
81
+ class: 'mr-2.5',
82
+ },
83
+ })
84
+ export class InputPrefix {}
85
+
86
+ @Directive({
87
+ selector: '[<%= name %>Suffix]',
88
+ host: {
89
+ class: 'ml-2.5',
90
+ },
91
+ })
92
+ export class InputSuffix {}
93
+
94
+ @Component({
95
+ selector: '[<%= name %>Error]',
96
+ hostDirectives: [{ directive: NgbInputError, inputs: ['ngbError: <%= name %>Error'] }],
97
+ template: `<ng-content />`,
98
+ host: {
99
+ class: 'text-red-500 mx-0.5',
100
+ '[@toggleDiv]': 'isInvalid() ? "visible" : "hidden"',
101
+ },
102
+ animations: [toggleDiv],
103
+ })
104
+ export class InputError {
105
+ readonly error = inject(NgbInputError);
106
+ readonly isInvalid = this.error.isInvalid;
107
+
108
+ constructor() {
109
+ this.error.animate.set(true);
110
+ }
111
+ }
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of input
3
+ */
4
+
5
+ export * from './form-field';
6
+ export * from './input-style.directive';
@@ -0,0 +1,11 @@
1
+ import { Directive } from '@angular/core';
2
+ import { ɵFocusStyle as FocusStyle } from '<%= basepath %>/checkbox';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>InputStyle]',
6
+ hostDirectives: [{ directive: FocusStyle, inputs: ['unfocus'] }],
7
+ host: {
8
+ class: 'inline-block rounded-lg bg-transparent px-2.5 py-2 border font-normal min-h-10',
9
+ },
10
+ })
11
+ export class InputStyle {}
@@ -0,0 +1,13 @@
1
+ import { Directive } from '@angular/core';
2
+ import { NgbHoverCard } from '@ngbase/adk/hover-card';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>HoverCard]',
6
+ hostDirectives: [
7
+ {
8
+ directive: NgbHoverCard,
9
+ inputs: ['ngbHoverCard: <%= name %>HoverCard', 'options', 'delay'],
10
+ },
11
+ ],
12
+ })
13
+ export class HoverCard<T = any> {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of hover-card
3
+ */
4
+
5
+ export * from './hover-card';
@@ -0,0 +1,16 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+ import { IconType, NgIconComponent } from '@ng-icons/core';
3
+
4
+ @Component({
5
+ selector: '<%= name %>-icon',
6
+ imports: [NgIconComponent],
7
+ changeDetection: ChangeDetectionStrategy.OnPush,
8
+ template: `<ng-icon [name]="name()" [size]="size()"></ng-icon>`,
9
+ host: {
10
+ class: 'inline-flex items-center justify-center',
11
+ },
12
+ })
13
+ export class Icon {
14
+ readonly name = input.required<IconType>();
15
+ readonly size = input<string>('1rem');
16
+ }
@@ -0,0 +1 @@
1
+ export * from './icon';
@@ -0,0 +1 @@
1
+ export * from './inline-edit';
@@ -0,0 +1,24 @@
1
+ import { Component } from '@angular/core';
2
+ import {
3
+ NgbInlineEdit,
4
+ NgbInlineInput,
5
+ NgbInlineValue,
6
+ provideInlineEdit,
7
+ } from '@ngbase/adk/inline-edit';
8
+
9
+ @Component({
10
+ selector: '<%= name %>-inline-edit',
11
+ imports: [NgbInlineInput, NgbInlineValue],
12
+ providers: [provideInlineEdit(), { provide: NgbInlineEdit, useExisting: InlineEdit }],
13
+ template: `
14
+ @if (isEditing()) {
15
+ <input
16
+ ngbInlineInput
17
+ class="rounded p-1 drop-shadow-md focus:border-transparent focus:outline-none"
18
+ />
19
+ } @else {
20
+ <div ngbInlineValue class="cursor-pointer p-1">{{ localValue() }}</div>
21
+ }
22
+ `,
23
+ })
24
+ export class InlineEdit extends NgbInlineEdit {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of keys
3
+ */
4
+
5
+ export * from './key';
@@ -0,0 +1,35 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ computed,
5
+ effect,
6
+ ElementRef,
7
+ inject,
8
+ Injector,
9
+ input,
10
+ } from '@angular/core';
11
+ import { keyMap } from '@ngbase/adk/keys';
12
+
13
+ @Component({
14
+ selector: '<%= name %>-key, [<%= name %>Key]',
15
+ changeDetection: ChangeDetectionStrategy.OnPush,
16
+ template: `{{ content() }}`,
17
+ host: {
18
+ class: 'ml-auto text-xs tracking-widest opacity-60 text-muted-foreground',
19
+ },
20
+ })
21
+ export class Key {
22
+ readonly el = inject<ElementRef<HTMLButtonElement>>(ElementRef);
23
+
24
+ readonly <%= name %>Key = input.required<string>();
25
+ readonly content = computed(() => {
26
+ return this.<%= name %>Key().replace(/\+/g, ' ');
27
+ });
28
+
29
+ constructor() {
30
+ const injector = inject(Injector);
31
+ effect(cleanup => {
32
+ keyMap(this.<%= name %>Key(), () => this.el.nativeElement.click(), { cleanup, injector });
33
+ });
34
+ }
35
+ }
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of list
3
+ */
4
+
5
+ export * from './list';
@@ -0,0 +1,28 @@
1
+ import { Directive } from '@angular/core';
2
+ import { NgbList, NgbListActionGroup, provideList } from '@ngbase/adk/list';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>ListStyle]',
6
+ host: {
7
+ class:
8
+ 'flex items-center gap-2 py-2 px-2 hover:bg-accent cursor-pointer rounded-md text-left data-[focus="true"]:bg-accent',
9
+ },
10
+ })
11
+ export class ListStyle {}
12
+
13
+ @Directive({
14
+ selector: '[<%= name %>List]',
15
+ hostDirectives: [ListStyle],
16
+ providers: [provideList(List)],
17
+ host: {
18
+ role: 'list',
19
+ '[class]': 'disabled() ? "pointer-events-none cursor-not-allowed opacity-50" : ""',
20
+ },
21
+ })
22
+ export class List extends NgbList {}
23
+
24
+ @Directive({
25
+ selector: '[<%= name %>ActionGroup]',
26
+ hostDirectives: [NgbListActionGroup],
27
+ })
28
+ export class ListActionGroup {}
@@ -0,0 +1 @@
1
+ export * from './mask';
@@ -0,0 +1,8 @@
1
+ import { Directive } from '@angular/core';
2
+ import { Mask } from '@ngbase/adk/mask';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>Mask]',
6
+ hostDirectives: [{ directive: Mask, inputs: ['ngbMask: <%= name %>Mask', 'showMaskType'] }],
7
+ })
8
+ export class MaskInput {}
@@ -0,0 +1,14 @@
1
+ import { Directive } from '@angular/core';
2
+ import { NgbContextMenu } from '@ngbase/adk/menu';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>ContextMenu]',
6
+ hostDirectives: [
7
+ {
8
+ directive: NgbContextMenu,
9
+ inputs: ['ngbContextMenu: <%= name %>ContextMenu'],
10
+ outputs: ['ctxOpen', 'ctxClose'],
11
+ },
12
+ ],
13
+ })
14
+ export class ContextMenu {}
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Public API Surface of menu
3
+ */
4
+
5
+ export * from './menu';
6
+ export * from './context-menu';
7
+ export * from './navigation-menu';
8
+ export * from './mention';
@@ -0,0 +1,14 @@
1
+ import { Directive } from '@angular/core';
2
+ import { NgbMentionTrigger } from '@ngbase/adk/menu';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>MentionTrigger]',
6
+ hostDirectives: [
7
+ {
8
+ directive: NgbMentionTrigger,
9
+ inputs: ['ngbMentionTrigger: <%= name %>MentionTrigger', 'key', 'options'],
10
+ outputs: ['search'],
11
+ },
12
+ ],
13
+ })
14
+ export class MentionTrigger {}
@@ -0,0 +1,37 @@
1
+ import { ChangeDetectionStrategy, Component, Directive } from '@angular/core';
2
+ import { AccessibleGroup } from '@ngbase/adk/a11y';
3
+ import { NgbMenu, NgbMenuTrigger, NgpMenuGroup, aliasMenu } from '@ngbase/adk/menu';
4
+
5
+ @Component({
6
+ selector: '<%= name %>-menu',
7
+ exportAs: '<%= name %>Menu',
8
+ changeDetection: ChangeDetectionStrategy.OnPush,
9
+ providers: [aliasMenu(Menu)],
10
+ imports: [AccessibleGroup, NgpMenuGroup],
11
+ template: `
12
+ <ng-template #container>
13
+ <div ngbMenuGroup class="flex flex-col p-1">
14
+ <ng-content />
15
+ </div>
16
+ </ng-template>
17
+ `,
18
+ })
19
+ export class Menu extends NgbMenu {}
20
+
21
+ @Directive({
22
+ selector: '[<%= name %>MenuTrigger]',
23
+ hostDirectives: [
24
+ {
25
+ directive: NgbMenuTrigger,
26
+ inputs: [
27
+ 'ngbMenuTrigger: <%= name %>MenuTrigger',
28
+ 'ngbMenuTriggerData: <%= name %>MenuTriggerData',
29
+ 'options',
30
+ ],
31
+ },
32
+ ],
33
+ host: {
34
+ class: 'outline-none',
35
+ },
36
+ })
37
+ export class MenuTrigger {}
@@ -0,0 +1,8 @@
1
+ import { Directive } from '@angular/core';
2
+ import { NgbNavigationMenu } from '@ngbase/adk/menu';
3
+
4
+ @Directive({
5
+ selector: '[<%= name %>NavigationMenu]',
6
+ hostDirectives: [{ directive: NgbNavigationMenu, inputs: ['hover'] }],
7
+ })
8
+ export class NavigationMenu {}
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of input
3
+ */
4
+
5
+ export * from './otp';
@@ -0,0 +1,37 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { injectDirectionality } from '@ngbase/adk/bidi';
3
+ import { NgbInputOtp, NgbOtpInput, NgbOtpValue, aliasInputOtp } from '@ngbase/adk/otp';
4
+ import { NumberOnly, RangePipe } from '@ngbase/adk/utils';
5
+ import { InputStyle } from '<%= basepath %>/form-field';
6
+
7
+ @Component({
8
+ selector: '<%= name %>-input-otp',
9
+ changeDetection: ChangeDetectionStrategy.OnPush,
10
+ providers: [aliasInputOtp(InputOtp)],
11
+ imports: [InputStyle, RangePipe, NgbOtpInput, NgbOtpValue, NumberOnly],
12
+ template: `
13
+ @for (num of size(); track $index; let l = $last) {
14
+ @for (n of num | range; track n; let i = $index; let ll = $last) {
15
+ <div
16
+ <%= name %>InputStyle
17
+ ngbOtpValue
18
+ class="{{
19
+ 'mb-0 aspect-square w-10 rounded-none !px-0 text-center text-base font-semibold data-[disabled]:bg-muted/40 data-[disabled]:text-muted-foreground data-[focus]:relative' +
20
+ ((dir.isRtl() ? ll : i === 0) ? ' !rounded-l-lg' : '') +
21
+ ((dir.isRtl() ? i === 0 : ll) ? ' !rounded-r-lg' : '')
22
+ }}"
23
+ ></div>
24
+ }
25
+ @if (!l) {
26
+ <div class="px-2">-</div>
27
+ }
28
+ }
29
+ <input type="text" ngbOtpInput ngbNumberOnly class="selection:bg-transparent" />
30
+ `,
31
+ host: {
32
+ class: 'inline-flex items-center justify-center rounded-lg relative',
33
+ },
34
+ })
35
+ export class InputOtp extends NgbInputOtp {
36
+ readonly dir = injectDirectionality();
37
+ }
@@ -0,0 +1 @@
1
+ export * from './pagination';
@@ -0,0 +1,75 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { aliasPagination, NgbPagination, NgbPaginationBtn } from '@ngbase/adk/pagination';
3
+ import { Button } from '<%= basepath %>/button';
4
+ import { Icon } from '<%= basepath %>/icon';
5
+ import { Option, Select } from '<%= basepath %>/select';
6
+ import { provideIcons } from '@ng-icons/core';
7
+ import {
8
+ lucideChevronLeft,
9
+ lucideChevronRight,
10
+ lucideChevronsLeft,
11
+ lucideChevronsRight,
12
+ } from '@ng-icons/lucide';
13
+
14
+ @Component({
15
+ selector: '<%= name %>-pagination',
16
+ providers: [aliasPagination(Pagination)],
17
+ viewProviders: [
18
+ provideIcons({
19
+ lucideChevronLeft,
20
+ lucideChevronRight,
21
+ lucideChevronsLeft,
22
+ lucideChevronsRight,
23
+ }),
24
+ ],
25
+ imports: [Button, Icon, Select, Option, NgbPaginationBtn],
26
+ template: `
27
+ <div class="flex items-center gap-2">
28
+ <div>Rows per page</div>
29
+ <<%= name %>-select
30
+ [value]="size()"
31
+ (valueChange)="sizeChanged($event)"
32
+ class="h-8 !w-auto rounded-md border px-2"
33
+ >
34
+ @for (size of sizeOptions(); track size) {
35
+ <<%= name %>-option [value]="size">
36
+ {{ size }}
37
+ </<%= name %>-option>
38
+ }
39
+ </<%= name %>-select>
40
+ </div>
41
+ <div>Page {{ active() }} of {{ totalSnaps() }}</div>
42
+ <div class="flex items-center gap-2">
43
+ <button ngbPaginationBtn="prev" <%= name %>Button="outline" class="h-8 w-8 !p-2">
44
+ <<%= name %>-icon name="lucideChevronsLeft" />
45
+ </button>
46
+ <button ngbPaginationBtn="prev" jump="-1" <%= name %>Button="outline" class="h-8 w-8 !p-2">
47
+ <<%= name %>-icon name="lucideChevronLeft" />
48
+ </button>
49
+ @if (showPage()) {
50
+ @for (snap of snaps(); track snap) {
51
+ <button
52
+ ngbPaginationBtn="page"
53
+ [jump]="snap"
54
+ <%= name %>Button="ghost"
55
+ class="min-w-9 !p-2 ring-offset-foreground aria-[current=page]:bg-muted aria-[current=page]:text-primary"
56
+ >
57
+ {{ snap }}
58
+ </button>
59
+ }
60
+ }
61
+ <button ngbPaginationBtn="next" jump="1" <%= name %>Button="outline" class="h-8 w-8 !p-2">
62
+ <<%= name %>-icon name="lucideChevronRight" />
63
+ </button>
64
+ <button ngbPaginationBtn="next" <%= name %>Button="outline" class="h-8 w-8 !p-2">
65
+ <<%= name %>-icon name="lucideChevronsRight" />
66
+ </button>
67
+ </div>
68
+ `,
69
+ host: {
70
+ class: 'flex items-center gap-8 font-semibold',
71
+ },
72
+ })
73
+ export class Pagination extends NgbPagination {
74
+ readonly showPage = input<boolean>(false);
75
+ }
@@ -0,0 +1 @@
1
+ export * from './picasa.directive';
@@ -0,0 +1,80 @@
1
+ import {
2
+ afterNextRender,
3
+ ChangeDetectionStrategy,
4
+ Component,
5
+ viewChild,
6
+ ViewContainerRef,
7
+ } from '@angular/core';
8
+ import { BaseDialog, DialogOptions } from '@ngbase/adk/portal';
9
+ import { createHostAnimation, fadeAnimation } from '@ngbase/adk/utils';
10
+ import { Subject } from 'rxjs';
11
+
12
+ @Component({
13
+ selector: '<%= name %>-dialog',
14
+ changeDetection: ChangeDetectionStrategy.OnPush,
15
+ template: `
16
+ <div class="pointer-events-none flex h-full items-center justify-center">
17
+ <div class="pointer-events-auto">
18
+ <ng-container #myDialog />
19
+ </div>
20
+ <div
21
+ class="backdropColor pointer-events-auto absolute top-0 -z-10 h-full w-full"
22
+ (click)="!options.disableClose && close()"
23
+ [@fadeAnimation]=""
24
+ ></div>
25
+ </div>
26
+ `,
27
+ host: {
28
+ '[ngStyle]': '{ "z-index": options.overrideLowerDialog ? "982" : "980" }',
29
+ class: 'fixed block top-0 bottom-0 left-0 right-0 overflow-auto pointer-events-none z-p',
30
+ '[@parentAnimation]': '',
31
+ },
32
+ styles: `
33
+ .backdropColor {
34
+ background: rgba(0, 0, 0, 0.32);
35
+ }
36
+
37
+ .full-window {
38
+ width: 100vw !important;
39
+ height: 100vh;
40
+ max-width: initial;
41
+ top: 0;
42
+ border-radius: 0;
43
+ }
44
+ `,
45
+ animations: [createHostAnimation(['@fadeAnimation']), fadeAnimation('300ms')],
46
+ })
47
+ export class PicasaBase extends BaseDialog {
48
+ myDialog = viewChild('myDialog', { read: ViewContainerRef });
49
+
50
+ backdropColor = true;
51
+ isSidePopup = true;
52
+
53
+ options!: DialogOptions;
54
+ classNames = '';
55
+ isHideHeader = false;
56
+ onDone = new Subject<any>();
57
+
58
+ constructor() {
59
+ super();
60
+ afterNextRender(() => {
61
+ this._afterViewSource.next(this.myDialog()!);
62
+
63
+ // setTimeout(() => {
64
+ // this.show.set(false);
65
+ // }, 2000);
66
+ });
67
+ // this.dialogRef.afterClosed.subscribe(() => {
68
+ // setTimeout(() => {
69
+ // this.animationDone();
70
+ // }, 500);
71
+ // });
72
+ }
73
+
74
+ override setOptions(options: DialogOptions) {
75
+ this.options = options;
76
+ this.classNames = this.options.classNames?.join(' ') || '';
77
+ this.isHideHeader = this.options.header || false;
78
+ this.backdropColor = this.options.backdropColor || true;
79
+ }
80
+ }
@@ -0,0 +1,57 @@
1
+ import { Component, ElementRef, afterNextRender, inject, viewChild } from '@angular/core';
2
+ import { DialogRef } from '@ngbase/adk/portal';
3
+ import { PicasaBase } from './picasa-base.component';
4
+
5
+ @Component({
6
+ selector: '<%= name %>-picasa',
7
+ template: `
8
+ <img
9
+ #imgEl
10
+ [src]="data.data.src"
11
+ alt="Placeholder"
12
+ class="max-h-[100vh] max-w-[100vw] object-contain"
13
+ [style.viewTransitionName]="data.data.id"
14
+ />
15
+ `,
16
+ host: {
17
+ class: 'block',
18
+ },
19
+ })
20
+ export class PicasaContainer {
21
+ data = inject(DialogRef);
22
+ imgEl = viewChild<ElementRef<HTMLImageElement>>('imgEl');
23
+ dialogRef = inject(DialogRef);
24
+ picasa = inject(PicasaBase);
25
+
26
+ constructor() {
27
+ let transform = '';
28
+ afterNextRender(() => {
29
+ const imgEl = this.imgEl()!.nativeElement;
30
+ const target = this.data.data.target as HTMLElement;
31
+ const { width, height, top, left } = target.getBoundingClientRect();
32
+ const { clientWidth, clientHeight } = document.documentElement;
33
+ const imgRect = imgEl.getBoundingClientRect();
34
+ const scale = Math.max(width / imgRect.width, height / imgRect.height);
35
+ imgEl.style.transform = `scale(${scale})`;
36
+ const x = left + width / 2 - clientWidth / 2;
37
+ const y = top + height / 2 - clientHeight / 2;
38
+ transform = `translate3d(${x}px, ${y}px, 0) scale(${scale})`;
39
+ imgEl.style.transform = transform;
40
+ console.log(transform);
41
+ setTimeout(() => {
42
+ imgEl.style.transition = '300ms cubic-bezier(0.55, 0.31, 0.15, 0.93)';
43
+ imgEl.style.transform = `none`;
44
+ });
45
+ });
46
+
47
+ this.dialogRef.afterClosed.subscribe(() => {
48
+ const imgEl = this.imgEl()!.nativeElement;
49
+ imgEl.style.transition = '300ms cubic-bezier(0.55, 0.31, 0.15, 0.93)';
50
+ imgEl.style.transform = transform;
51
+ console.log(transform);
52
+ imgEl.addEventListener('transitionend', this.picasa.onClose, {
53
+ once: true,
54
+ });
55
+ });
56
+ }
57
+ }