@egose/shadcn-theme-ng 0.1.0 → 0.3.0

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 (162) hide show
  1. package/README.md +2 -2
  2. package/accordion/README.md +405 -2
  3. package/alert/README.md +372 -2
  4. package/alert-dialog/README.md +471 -5
  5. package/aspect-ratio/README.md +272 -5
  6. package/autocomplete/README.md +502 -2
  7. package/autocomplete/fesm2022/autocomplete.mjs +1 -1
  8. package/avatar/README.md +357 -5
  9. package/badge/README.md +318 -2
  10. package/basic-alert/README.md +353 -2
  11. package/breadcrumb/README.md +406 -5
  12. package/button/README.md +482 -2
  13. package/button/fesm2022/button.mjs +85 -107
  14. package/button/types/button.d.ts +5 -8
  15. package/button-group/README.md +318 -5
  16. package/calendar/README.md +357 -2
  17. package/card/README.md +331 -5
  18. package/carousel/README.md +333 -5
  19. package/carousel/fesm2022/carousel.mjs +4 -1
  20. package/checkbox/README.md +320 -2
  21. package/checkbox/fesm2022/checkbox.mjs +6 -7
  22. package/checkbox/types/checkbox.d.ts +1 -1
  23. package/collapsible/README.md +332 -5
  24. package/combobox/README.md +507 -5
  25. package/combobox/fesm2022/combobox.mjs +5 -2
  26. package/command/README.md +435 -5
  27. package/confirmation-dialog/README.md +301 -2
  28. package/context-menu/README.md +366 -5
  29. package/date-picker/README.md +469 -2
  30. package/date-picker/fesm2022/date-picker.mjs +150 -32
  31. package/date-picker/types/date-picker.d.ts +102 -9
  32. package/dialog/README.md +448 -2
  33. package/drawer/README.md +395 -5
  34. package/dropdown-menu/README.md +417 -5
  35. package/empty/README.md +329 -5
  36. package/field/README.md +385 -5
  37. package/form-autocomplete/README.md +177 -0
  38. package/form-autocomplete/fesm2022/form-autocomplete.mjs +125 -0
  39. package/form-autocomplete/package.json +24 -0
  40. package/form-autocomplete/types/form-autocomplete.d.ts +61 -0
  41. package/form-checkbox/README.md +322 -2
  42. package/form-checkbox/fesm2022/form-checkbox.mjs +22 -9
  43. package/form-checkbox/types/form-checkbox.d.ts +23 -4
  44. package/form-combobox/README.md +202 -0
  45. package/form-combobox/fesm2022/form-combobox.mjs +147 -0
  46. package/form-combobox/package.json +24 -0
  47. package/form-combobox/types/form-combobox.d.ts +73 -0
  48. package/form-date-picker/README.md +348 -2
  49. package/form-date-picker/fesm2022/form-date-picker.mjs +38 -12
  50. package/form-date-picker/types/form-date-picker.d.ts +17 -1
  51. package/form-date-picker-multi/README.md +191 -0
  52. package/form-date-picker-multi/fesm2022/form-date-picker-multi.mjs +129 -0
  53. package/form-date-picker-multi/package.json +24 -0
  54. package/form-date-picker-multi/types/form-date-picker-multi.d.ts +58 -0
  55. package/form-date-range-picker/README.md +253 -0
  56. package/form-date-range-picker/fesm2022/form-date-range-picker.mjs +130 -0
  57. package/form-date-range-picker/package.json +24 -0
  58. package/form-date-range-picker/types/form-date-range-picker.d.ts +55 -0
  59. package/form-field/README.md +356 -2
  60. package/form-field-simple/README.md +340 -2
  61. package/form-input-otp/README.md +194 -0
  62. package/form-input-otp/fesm2022/form-input-otp.mjs +106 -0
  63. package/form-input-otp/package.json +24 -0
  64. package/form-input-otp/types/form-input-otp.d.ts +58 -0
  65. package/form-month-year-picker/README.md +188 -0
  66. package/form-month-year-picker/fesm2022/form-month-year-picker.mjs +125 -0
  67. package/form-month-year-picker/package.json +24 -0
  68. package/form-month-year-picker/types/form-month-year-picker.d.ts +53 -0
  69. package/form-native-select/README.md +205 -0
  70. package/form-native-select/fesm2022/form-native-select.mjs +103 -0
  71. package/form-native-select/package.json +24 -0
  72. package/form-native-select/types/form-native-select.d.ts +57 -0
  73. package/form-phone-input/README.md +188 -0
  74. package/form-phone-input/fesm2022/form-phone-input.mjs +113 -0
  75. package/form-phone-input/package.json +24 -0
  76. package/form-phone-input/types/form-phone-input.d.ts +58 -0
  77. package/form-radio-group/README.md +198 -0
  78. package/form-radio-group/fesm2022/form-radio-group.mjs +111 -0
  79. package/form-radio-group/package.json +24 -0
  80. package/form-radio-group/types/form-radio-group.d.ts +63 -0
  81. package/form-searchable-multiselect/README.md +371 -2
  82. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +19 -10
  83. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +18 -1
  84. package/form-select/README.md +360 -2
  85. package/form-select/fesm2022/form-select.mjs +20 -11
  86. package/form-select/types/form-select.d.ts +18 -1
  87. package/form-slider/README.md +182 -0
  88. package/form-slider/fesm2022/form-slider.mjs +106 -0
  89. package/form-slider/package.json +24 -0
  90. package/form-slider/types/form-slider.d.ts +60 -0
  91. package/form-switch/README.md +173 -0
  92. package/form-switch/fesm2022/form-switch.mjs +100 -0
  93. package/form-switch/package.json +24 -0
  94. package/form-switch/types/form-switch.d.ts +50 -0
  95. package/form-text-input/README.md +381 -2
  96. package/form-text-input/fesm2022/form-text-input.mjs +19 -10
  97. package/form-text-input/types/form-text-input.d.ts +18 -1
  98. package/form-textarea/README.md +357 -2
  99. package/form-textarea/fesm2022/form-textarea.mjs +19 -10
  100. package/form-textarea/types/form-textarea.d.ts +18 -1
  101. package/form-toggle/README.md +186 -0
  102. package/form-toggle/fesm2022/form-toggle.mjs +159 -0
  103. package/form-toggle/package.json +24 -0
  104. package/form-toggle/types/form-toggle.d.ts +82 -0
  105. package/form-toggle-group/README.md +176 -0
  106. package/form-toggle-group/fesm2022/form-toggle-group.mjs +116 -0
  107. package/form-toggle-group/package.json +24 -0
  108. package/form-toggle-group/types/form-toggle-group.d.ts +65 -0
  109. package/hover-card/README.md +256 -5
  110. package/icon/README.md +239 -2
  111. package/input/README.md +269 -2
  112. package/input-group/README.md +335 -5
  113. package/input-group/fesm2022/input-group.mjs +22 -12
  114. package/input-group/types/input-group.d.ts +4 -1
  115. package/input-otp/README.md +375 -5
  116. package/item/README.md +385 -5
  117. package/item/fesm2022/item.mjs +3 -3
  118. package/kbd/README.md +291 -5
  119. package/label/README.md +272 -2
  120. package/layout-simple/README.md +193 -2
  121. package/layout-simple/fesm2022/layout-simple.mjs +472 -236
  122. package/layout-simple/types/layout-simple.d.ts +174 -137
  123. package/menu/README.md +417 -2
  124. package/menubar/README.md +343 -5
  125. package/native-select/README.md +323 -5
  126. package/native-select/fesm2022/native-select.mjs +18 -6
  127. package/native-select/types/native-select.d.ts +7 -2
  128. package/navigation-menu/README.md +369 -5
  129. package/package.json +57 -1
  130. package/pagination/README.md +388 -5
  131. package/phone-input/README.md +114 -0
  132. package/phone-input/fesm2022/phone-input.mjs +191 -0
  133. package/phone-input/package.json +24 -0
  134. package/phone-input/types/phone-input.d.ts +67 -0
  135. package/popover/README.md +331 -2
  136. package/progress/README.md +311 -5
  137. package/radio-group/README.md +364 -2
  138. package/radio-group/fesm2022/radio-group.mjs +5 -1
  139. package/resizable/README.md +269 -5
  140. package/scroll-area/README.md +233 -5
  141. package/searchable-multiselect/README.md +323 -2
  142. package/select/README.md +437 -2
  143. package/separator/README.md +222 -2
  144. package/sheet/README.md +311 -2
  145. package/sidebar/README.md +457 -5
  146. package/skeleton/README.md +217 -5
  147. package/slider/README.md +273 -5
  148. package/slider/fesm2022/slider.mjs +3 -3
  149. package/sonner/README.md +346 -2
  150. package/spinner/README.md +284 -2
  151. package/switch/README.md +310 -2
  152. package/switch/fesm2022/switch.mjs +7 -5
  153. package/switch/types/switch.d.ts +2 -1
  154. package/table/README.md +423 -5
  155. package/tabs/README.md +411 -2
  156. package/tabs/fesm2022/tabs.mjs +2 -2
  157. package/textarea/README.md +282 -5
  158. package/toggle/README.md +270 -5
  159. package/toggle-group/README.md +340 -5
  160. package/tooltip/README.md +269 -2
  161. package/typography/README.md +271 -5
  162. package/utils/README.md +303 -2
@@ -0,0 +1,116 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, input, computed, Component } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { FormGroupDirective, ReactiveFormsModule, ControlContainer } from '@angular/forms';
5
+ import { HlmFormIdGenerator, HlmError, HlmHint } from '@egose/shadcn-theme-ng/form-field';
6
+ import { EgFormField } from '@egose/shadcn-theme-ng/form-field-simple';
7
+ import { HlmLabel } from '@egose/shadcn-theme-ng/label';
8
+ import { HlmToggleGroup, HlmToggleGroupItem } from '@egose/shadcn-theme-ng/toggle-group';
9
+ import { hlm } from '@egose/shadcn-theme-ng/utils';
10
+
11
+ const EgFormToggleGroupConfigToken = new InjectionToken('EgFormToggleGroupConfig');
12
+ function provideEgFormToggleGroupConfig(config) {
13
+ return { provide: EgFormToggleGroupConfigToken, useValue: { ...config } };
14
+ }
15
+ function injectEgFormToggleGroupConfig() {
16
+ return inject(EgFormToggleGroupConfigToken, { optional: true }) ?? {};
17
+ }
18
+
19
+ class EgFormToggleGroup {
20
+ formGroupDirective = inject(FormGroupDirective);
21
+ generatedId = inject(HlmFormIdGenerator).generate('eg-form-toggle-group');
22
+ _config = injectEgFormToggleGroupConfig();
23
+ label = input(undefined, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
25
+ controlId = input(undefined, /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []));
27
+ controlName = input('', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "controlName" }] : /* istanbul ignore next */ []));
29
+ error = input(undefined, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
31
+ hint = input(undefined, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
33
+ id = input(undefined, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
35
+ type = input('single', /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
37
+ disabled = input(false, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
39
+ required = input(false, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
41
+ variant = input('default', /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
43
+ size = input('default', /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
45
+ options = input([], /* @ts-ignore */
46
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
47
+ effectiveId = computed(() => this.controlId() || this.id() || this.generatedId, /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "effectiveId" }] : /* istanbul ignore next */ []));
49
+ errorId = computed(() => `${this.effectiveId()}-error`, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []));
51
+ hintId = computed(() => `${this.effectiveId()}-hint`, /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "hintId" }] : /* istanbul ignore next */ []));
53
+ /**
54
+ * Combined lock for the brain `linkedSignal`-based disabled state: the raw
55
+ * input write always carries the resolved value, so a same-pass
56
+ * wrapper-toggle + `control.disable()` cannot clobber CVA state.
57
+ */
58
+ effectiveDisabled() {
59
+ return this.disabled() || !!this.formGroupDirective.form.get(this.controlName())?.disabled;
60
+ }
61
+ describedBy() {
62
+ const control = this.formGroupDirective.form.get(this.controlName());
63
+ return this.error() && control?.invalid && (control.dirty || control.touched)
64
+ ? this.errorId()
65
+ : this.hint()
66
+ ? this.hintId()
67
+ : null;
68
+ }
69
+ // Styling
70
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
71
+ labelClass = input('', /* @ts-ignore */
72
+ ...(ngDevMode ? [{ debugName: "labelClass" }] : /* istanbul ignore next */ []));
73
+ groupClass = input('', /* @ts-ignore */
74
+ ...(ngDevMode ? [{ debugName: "groupClass" }] : /* istanbul ignore next */ []));
75
+ errorClass = input('', /* @ts-ignore */
76
+ ...(ngDevMode ? [{ debugName: "errorClass" }] : /* istanbul ignore next */ []));
77
+ hintClass = input('', /* @ts-ignore */
78
+ ...(ngDevMode ? [{ debugName: "hintClass" }] : /* istanbul ignore next */ []));
79
+ // Computed classes (library base < global config < per-instance)
80
+ $userClass = computed(() => hlm("w-full", this.userClass()), /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "$userClass" }] : /* istanbul ignore next */ []));
82
+ $labelClass = computed(() => hlm("mb-1", this._config.labelClass, this.labelClass()), /* @ts-ignore */
83
+ ...(ngDevMode ? [{ debugName: "$labelClass" }] : /* istanbul ignore next */ []));
84
+ $groupClass = computed(() => hlm(this._config.groupClass, this.groupClass()), /* @ts-ignore */
85
+ ...(ngDevMode ? [{ debugName: "$groupClass" }] : /* istanbul ignore next */ []));
86
+ $errorClass = computed(() => hlm("mt-0", this._config.errorClass, this.errorClass()), /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "$errorClass" }] : /* istanbul ignore next */ []));
88
+ $hintClass = computed(() => hlm("mt-0", this._config.hintClass, this.hintClass()), /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "$hintClass" }] : /* istanbul ignore next */ []));
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: EgFormToggleGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: EgFormToggleGroup, isStandalone: true, selector: "eg-form-toggle-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null }, controlName: { classPropertyName: "controlName", publicName: "controlName", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, labelClass: { classPropertyName: "labelClass", publicName: "labelClass", isSignal: true, isRequired: false, transformFunction: null }, groupClass: { classPropertyName: "groupClass", publicName: "groupClass", isSignal: true, isRequired: false, transformFunction: null }, errorClass: { classPropertyName: "errorClass", publicName: "errorClass", isSignal: true, isRequired: false, transformFunction: null }, hintClass: { classPropertyName: "hintClass", publicName: "hintClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "$userClass()" } }, providers: [{ provide: ControlContainer, useExisting: FormGroupDirective }], ngImport: i0, template: "\n @let lbl = label();\n @let cnm = controlName();\n @let err = error();\n @let hnt = hint();\n @let rqrd = required();\n\n <eg-form-field>\n @if (lbl) {\n <span hlmLabel [class]=\"$labelClass()\"\n >{{ lbl }}\n @if (rqrd) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n\n <hlm-toggle-group\n [formControlName]=\"cnm\"\n [type]=\"type()\"\n [disabled]=\"effectiveDisabled()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [class]=\"$groupClass()\"\n >\n @for (option of options(); track option.value) {\n <button\n hlmToggleGroupItem\n type=\"button\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled ?? false\"\n [attr.aria-describedby]=\"describedBy()\"\n >\n {{ option.label }}\n </button>\n }\n </hlm-toggle-group>\n\n @if (err) {\n <hlm-error [id]=\"errorId()\" [class]=\"$errorClass()\">\n {{ err }}\n </hlm-error>\n }\n\n @if (hnt) {\n <hlm-hint [id]=\"hintId()\" [class]=\"$hintClass()\">\n {{ hnt }}\n </hlm-hint>\n }\n </eg-form-field>\n ", isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: HlmError, selector: "hlm-error", inputs: ["class"] }, { kind: "directive", type: HlmHint, selector: "hlm-hint", inputs: ["class"] }, { kind: "directive", type: HlmLabel, selector: "[hlmLabel]", inputs: ["class"] }, { kind: "directive", type: HlmToggleGroup, selector: "[hlmToggleGroup],hlm-toggle-group", inputs: ["variant", "size", "spacing", "orientation"] }, { kind: "directive", type: HlmToggleGroupItem, selector: "button[hlmToggleGroupItem]", inputs: ["variant", "size"] }, { kind: "component", type: EgFormField, selector: "eg-form-field", inputs: ["class"] }] });
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: EgFormToggleGroup, decorators: [{
94
+ type: Component,
95
+ args: [{
96
+ selector: 'eg-form-toggle-group',
97
+ standalone: true,
98
+ host: {
99
+ '[class]': '$userClass()',
100
+ },
101
+ imports: [ReactiveFormsModule, HlmError, HlmHint, HlmLabel, HlmToggleGroup, HlmToggleGroupItem, EgFormField],
102
+ providers: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
103
+ template: "\n @let lbl = label();\n @let cnm = controlName();\n @let err = error();\n @let hnt = hint();\n @let rqrd = required();\n\n <eg-form-field>\n @if (lbl) {\n <span hlmLabel [class]=\"$labelClass()\"\n >{{ lbl }}\n @if (rqrd) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n\n <hlm-toggle-group\n [formControlName]=\"cnm\"\n [type]=\"type()\"\n [disabled]=\"effectiveDisabled()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [class]=\"$groupClass()\"\n >\n @for (option of options(); track option.value) {\n <button\n hlmToggleGroupItem\n type=\"button\"\n [value]=\"option.value\"\n [disabled]=\"option.disabled ?? false\"\n [attr.aria-describedby]=\"describedBy()\"\n >\n {{ option.label }}\n </button>\n }\n </hlm-toggle-group>\n\n @if (err) {\n <hlm-error [id]=\"errorId()\" [class]=\"$errorClass()\">\n {{ err }}\n </hlm-error>\n }\n\n @if (hnt) {\n <hlm-hint [id]=\"hintId()\" [class]=\"$hintClass()\">\n {{ hnt }}\n </hlm-hint>\n }\n </eg-form-field>\n ",
104
+ }]
105
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], controlId: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlId", required: false }] }], controlName: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlName", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], labelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelClass", required: false }] }], groupClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupClass", required: false }] }], errorClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorClass", required: false }] }], hintClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "hintClass", required: false }] }] } });
106
+
107
+ /*
108
+ * Public API Surface of form-toggle-group
109
+ */
110
+
111
+ /**
112
+ * Generated bundle index. Do not edit.
113
+ */
114
+
115
+ export { EgFormToggleGroup, injectEgFormToggleGroupConfig, provideEgFormToggleGroupConfig };
116
+
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "form-toggle-group",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.3.0 || ^22.0.0",
6
+ "@angular/core": "^20.3.0 || ^22.0.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/form-toggle-group.mjs",
13
+ "typings": "types/form-toggle-group.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./types/form-toggle-group.d.ts",
20
+ "default": "./fesm2022/form-toggle-group.mjs"
21
+ }
22
+ },
23
+ "type": "module"
24
+ }
@@ -0,0 +1,65 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ValueProvider } from '@angular/core';
3
+ import { ClassValue } from 'clsx';
4
+
5
+ interface ToggleGroupOption {
6
+ value: string;
7
+ label: string;
8
+ disabled?: boolean;
9
+ }
10
+ declare class EgFormToggleGroup {
11
+ private readonly formGroupDirective;
12
+ private readonly generatedId;
13
+ private readonly _config;
14
+ label: _angular_core.InputSignal<string | undefined>;
15
+ controlId: _angular_core.InputSignal<string | undefined>;
16
+ controlName: _angular_core.InputSignal<string>;
17
+ error: _angular_core.InputSignal<string | undefined>;
18
+ hint: _angular_core.InputSignal<string | undefined>;
19
+ id: _angular_core.InputSignal<string | undefined>;
20
+ type: _angular_core.InputSignal<"single" | "multiple">;
21
+ disabled: _angular_core.InputSignal<boolean>;
22
+ required: _angular_core.InputSignal<boolean>;
23
+ variant: _angular_core.InputSignal<"default" | "outline" | null | undefined>;
24
+ size: _angular_core.InputSignal<"default" | "sm" | "lg" | null | undefined>;
25
+ options: _angular_core.InputSignal<ToggleGroupOption[]>;
26
+ readonly effectiveId: _angular_core.Signal<string>;
27
+ readonly errorId: _angular_core.Signal<string>;
28
+ readonly hintId: _angular_core.Signal<string>;
29
+ /**
30
+ * Combined lock for the brain `linkedSignal`-based disabled state: the raw
31
+ * input write always carries the resolved value, so a same-pass
32
+ * wrapper-toggle + `control.disable()` cannot clobber CVA state.
33
+ */
34
+ effectiveDisabled(): boolean;
35
+ describedBy(): string | null;
36
+ userClass: _angular_core.InputSignal<ClassValue>;
37
+ labelClass: _angular_core.InputSignal<string>;
38
+ groupClass: _angular_core.InputSignal<string>;
39
+ errorClass: _angular_core.InputSignal<string>;
40
+ hintClass: _angular_core.InputSignal<string>;
41
+ $userClass: _angular_core.Signal<string>;
42
+ $labelClass: _angular_core.Signal<string>;
43
+ $groupClass: _angular_core.Signal<string>;
44
+ $errorClass: _angular_core.Signal<string>;
45
+ $hintClass: _angular_core.Signal<string>;
46
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EgFormToggleGroup, never>;
47
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EgFormToggleGroup, "eg-form-toggle-group", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "controlName": { "alias": "controlName"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "labelClass": { "alias": "labelClass"; "required": false; "isSignal": true; }; "groupClass": { "alias": "groupClass"; "required": false; "isSignal": true; }; "errorClass": { "alias": "errorClass"; "required": false; "isSignal": true; }; "hintClass": { "alias": "hintClass"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
48
+ }
49
+
50
+ interface EgFormToggleGroupConfig {
51
+ /**
52
+ * Global class defaults for `eg-form-toggle-group` styling slots.
53
+ * Each is merged under the matching per-instance `*Class` input
54
+ * (library base < global config < per-instance).
55
+ */
56
+ labelClass?: string;
57
+ groupClass?: string;
58
+ errorClass?: string;
59
+ hintClass?: string;
60
+ }
61
+ declare function provideEgFormToggleGroupConfig(config: Partial<EgFormToggleGroupConfig>): ValueProvider;
62
+ declare function injectEgFormToggleGroupConfig(): EgFormToggleGroupConfig;
63
+
64
+ export { EgFormToggleGroup, injectEgFormToggleGroupConfig, provideEgFormToggleGroupConfig };
65
+ export type { EgFormToggleGroupConfig };
@@ -1,11 +1,262 @@
1
- # HoverCard
1
+ # Hover Card (`@egose/shadcn-theme-ng/hover-card`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli).
3
+ The hover card shows a rich preview panel when the user hovers (or focuses) a trigger — the shadcn/ui _HoverCard_ equivalent (docs link with an author preview, usercard on an `@mention`, product peek on hover). Behavior comes from spartan-ng's `BrnHoverCard` family (CDK overlay under the hood); this subpath adds the shadcn styling and `data-slot` hooks.
4
4
 
5
- ## Building
5
+ > **Ships as:** `@egose/shadcn-theme-ng/hover-card` (plain Tailwind) and `@egose/shadcn-theme-ng-tw/hover-card` (`tw:`-prefixed variant). See the [package README](../../README.md) for installation, peer dependencies, and the Tailwind-variant contract. Do not publish this project directory independently.
6
6
 
7
- To build the library, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng build hover-card
10
+ # Plain Tailwind (no prefix)
11
+ npm install @egose/shadcn-theme-ng
12
+
13
+ # Or the tw:-prefixed variant
14
+ npm install @egose/shadcn-theme-ng-tw
15
+ ```
16
+
17
+ Peer dependencies (Angular, CDK, `@spartan-ng/brain`, `rxjs`) are documented in the [package README](../../README.md#peer-dependencies).
18
+
19
+ ```ts
20
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
21
+ // tw variant:
22
+ // import { HlmHoverCardImports } from '@egose/shadcn-theme-ng-tw/hover-card';
23
+ ```
24
+
25
+ ## Imports
26
+
27
+ ```ts
28
+ // Standalone component — spread the imports array:
29
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
30
+
31
+ @Component({
32
+ standalone: true,
33
+ imports: [HlmHoverCardImports],
34
+ template: `…`,
35
+ })
36
+ export class MyComp {}
37
+ ```
38
+
39
+ ```ts
40
+ // NgModule-based — import the module:
41
+ import { HlmHoverCardModule } from '@egose/shadcn-theme-ng/hover-card';
42
+
43
+ @NgModule({ imports: [HlmHoverCardModule] })
44
+ export class MyModule {}
45
+ ```
46
+
47
+ Individual symbols (all exported from `src/public-api.ts`): `HlmHoverCard`, `HlmHoverCardTrigger`, `HlmHoverCardContent`, `HlmHoverCardPortal`, plus `HlmHoverCardImports` and `HlmHoverCardModule`.
48
+
49
+ ## Anatomy / Structure
50
+
51
+ ```html
52
+ <div hlmHoverCard>
53
+ <a href="https://example.com" hlmHoverCardTrigger>Hover me</a>
54
+
55
+ <!-- structural portal directive + styling directive on the same element -->
56
+ <hlm-hover-card-content *hlmHoverCardPortal>
57
+ <p class="tw:font-semibold">@example</p>
58
+ <p class="tw:text-sm tw:text-gray-500">Preview content goes here.</p>
59
+ </hlm-hover-card-content>
60
+ </div>
11
61
  ```
62
+
63
+ Real selectors: `[hlmHoverCard]` / `hlm-hover-card` (root, `hostDirectives: [BrnHoverCard]`), `[hlmHoverCardTrigger]` (trigger, `hostDirectives: [BrnHoverCardTrigger]`), `[hlmHoverCardPortal]` / `hlm-hover-card-portal` (structural overlay portal, `hostDirectives: [BrnHoverCardContent]` — used as `*hlmHoverCardPortal`), `[hlmHoverCardContent]` / `hlm-hover-card-content` (styling shell: popover colors, `w-64`, rounded, shadow, open/close animations; mirrors `data-state`/`data-side` attributes).
64
+
65
+ ## API reference
66
+
67
+ ### `hlmHoverCard` / `hlm-hover-card` — `HlmHoverCard`
68
+
69
+ Thin directive wrapper: `hostDirectives: [BrnHoverCard]`, `data-slot="hover-card"`. No inputs/outputs of its own — it owns the open state shared by trigger and portal.
70
+
71
+ ### `[hlmHoverCardTrigger]` — `HlmHoverCardTrigger`
72
+
73
+ Thin directive wrapper forwarding these inputs to `BrnHoverCardTrigger` (plus `data-slot="hover-card-trigger"`):
74
+
75
+ | Input | Type | Description |
76
+ | ------------------------ | ------- | ----------------------------------------------------------------------------------- |
77
+ | `showDelay` | (brain) | Delay before the card opens on hover. |
78
+ | `hideDelay` | (brain) | Delay before the card closes after pointer leave. |
79
+ | `animationDelay` | (brain) | Delay applied to the open/close animation. |
80
+ | `sideOffset` | (brain) | Pixel offset between trigger and card. |
81
+ | `align` | (brain) | Overlay alignment (`start` / `center` / `end`). |
82
+ | `hlmHoverCardTriggerFor` | (brain) | Explicit content reference (`brnHoverCardTriggerFor` alias) for non-default wiring. |
83
+
84
+ ### `[hlmHoverCardPortal]` / `hlm-hover-card-portal` — `HlmHoverCardPortal`
85
+
86
+ Structural directive (`hostDirectives: [BrnHoverCardContent]`). Apply as `*hlmHoverCardPortal` on the content element so the card renders in the CDK overlay. No inputs of its own.
87
+
88
+ ### `[hlmHoverCardContent]` / `hlm-hover-card-content` — `HlmHoverCardContent`
89
+
90
+ Styling directive for the panel. No inputs/outputs; it reads the overlay `state` (`open`/`closed`) and `side` (`top`/`bottom`/`left`/`right`) signals from the brain providers and reflects them as `data-state` / `data-side` attributes for the animation classes. Default width is `tw:w-64` — override with `class`.
91
+
92
+ ## Examples
93
+
94
+ ### 1. Basic link preview
95
+
96
+ ```ts
97
+ import { Component } from '@angular/core';
98
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
99
+
100
+ @Component({
101
+ standalone: true,
102
+ imports: [HlmHoverCardImports],
103
+ template: `
104
+ <div hlmHoverCard>
105
+ <a href="https://angular.dev" hlmHoverCardTrigger class="tw:cursor-pointer tw:underline tw:text-blue-600">
106
+ Angular
107
+ </a>
108
+ <hlm-hover-card-content *hlmHoverCardPortal>
109
+ <p class="tw:font-semibold">Angular</p>
110
+ <p class="tw:text-sm tw:text-gray-500">The web development framework for the modern web.</p>
111
+ </hlm-hover-card-content>
112
+ </div>
113
+ `,
114
+ })
115
+ export class BasicExample {}
116
+ ```
117
+
118
+ ### 2. Open/close delays
119
+
120
+ ```ts
121
+ import { Component } from '@angular/core';
122
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
123
+
124
+ @Component({
125
+ standalone: true,
126
+ imports: [HlmHoverCardImports],
127
+ template: `
128
+ <div hlmHoverCard>
129
+ <button hlmHoverCardTrigger type="button" [showDelay]="400" [hideDelay]="200">Hover (opens after 400ms)</button>
130
+ <hlm-hover-card-content *hlmHoverCardPortal>
131
+ <p class="tw:text-sm">Delays keep accidental hovers from flashing the card.</p>
132
+ </hlm-hover-card-content>
133
+ </div>
134
+ `,
135
+ })
136
+ export class DelaysExample {}
137
+ ```
138
+
139
+ ### 3. Placement: side, align, offset
140
+
141
+ ```ts
142
+ import { Component } from '@angular/core';
143
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
144
+
145
+ @Component({
146
+ standalone: true,
147
+ imports: [HlmHoverCardImports],
148
+ template: `
149
+ <div hlmHoverCard>
150
+ <span hlmHoverCardTrigger [sideOffset]="12" align="start"> Hover for right-side card </span>
151
+ <hlm-hover-card-content *hlmHoverCardPortal class="tw:w-72">
152
+ <p class="tw:text-sm">Offset by 12px, aligned to the trigger start edge.</p>
153
+ </hlm-hover-card-content>
154
+ </div>
155
+ `,
156
+ })
157
+ export class PlacementExample {}
158
+ ```
159
+
160
+ > `side` itself is owned by the brain content directive — set alignment/offset on the trigger; the `data-side` attribute on the content element reflects the resolved side for animations.
161
+
162
+ ### 4. User card with avatar + stats
163
+
164
+ ```ts
165
+ import { Component } from '@angular/core';
166
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
167
+ import { HlmAvatarImports } from '@egose/shadcn-theme-ng/avatar';
168
+
169
+ @Component({
170
+ standalone: true,
171
+ imports: [HlmHoverCardImports, HlmAvatarImports],
172
+ template: `
173
+ <div hlmHoverCard>
174
+ <span hlmHoverCardTrigger class="tw:cursor-pointer tw:font-medium tw:underline">@jane</span>
175
+ <hlm-hover-card-content *hlmHoverCardPortal class="tw:w-80">
176
+ <div class="tw:flex tw:gap-4">
177
+ <hlm-avatar size="sm">
178
+ <img hlmAvatarImage src="https://github.com/jane.png" alt="Jane's avatar" />
179
+ <span hlmAvatarFallback>JA</span>
180
+ </hlm-avatar>
181
+ <div>
182
+ <p class="tw:font-semibold">@jane</p>
183
+ <p class="tw:text-sm tw:text-gray-500">Design engineer. Ships accessible UI.</p>
184
+ <p class="tw:mt-2 tw:text-xs tw:text-gray-500">1.2k followers · 84 following</p>
185
+ </div>
186
+ </div>
187
+ </hlm-hover-card-content>
188
+ </div>
189
+ `,
190
+ })
191
+ export class UserCardExample {}
192
+ ```
193
+
194
+ ### 5. Wide content (override the default `w-64`)
195
+
196
+ ```ts
197
+ import { Component } from '@angular/core';
198
+ import { HlmHoverCardImports } from '@egose/shadcn-theme-ng/hover-card';
199
+
200
+ @Component({
201
+ standalone: true,
202
+ imports: [HlmHoverCardImports],
203
+ template: `
204
+ <div hlmHoverCard>
205
+ <button hlmHoverCardTrigger type="button">Product peek</button>
206
+ <hlm-hover-card-content *hlmHoverCardPortal class="tw:w-96">
207
+ <div class="tw:grid tw:grid-cols-[64px_1fr] tw:gap-3">
208
+ <div class="tw:h-16 tw:w-16 tw:rounded-md tw:bg-slate-200"></div>
209
+ <div>
210
+ <p class="tw:font-semibold">Ergonomic keyboard</p>
211
+ <p class="tw:text-sm tw:text-gray-500">Silent switches · $149 · In stock</p>
212
+ </div>
213
+ </div>
214
+ </hlm-hover-card-content>
215
+ </div>
216
+ `,
217
+ })
218
+ export class WideExample {}
219
+ ```
220
+
221
+ ### 6. NgModule usage + keyboard-focusable trigger
222
+
223
+ Hover cards also open on keyboard focus, so a natively focusable trigger keeps them reachable without a mouse:
224
+
225
+ ```ts
226
+ import { NgModule, Component } from '@angular/core';
227
+ import { HlmHoverCardModule } from '@egose/shadcn-theme-ng/hover-card';
228
+
229
+ @Component({
230
+ selector: 'app-hover-demo',
231
+ template: `
232
+ <div hlmHoverCard>
233
+ <button hlmHoverCardTrigger type="button">Focus me with Tab, then hover away</button>
234
+ <hlm-hover-card-content *hlmHoverCardPortal>
235
+ <p class="tw:text-sm">Focus opens the card too — no mouse required.</p>
236
+ </hlm-hover-card-content>
237
+ </div>
238
+ `,
239
+ })
240
+ export class HoverDemoComponent {}
241
+
242
+ @NgModule({ declarations: [HoverDemoComponent], imports: [HlmHoverCardModule] })
243
+ export class HoverDemoModule {}
244
+ ```
245
+
246
+ ## Accessibility notes
247
+
248
+ - Use a natively focusable trigger (`<a href>`, `<button>`) — the card opens on focus as well as hover, which keeps keyboard users in the loop.
249
+ - Keep the card content supplementary: never put the _only_ copy of critical information (or interactive controls) inside a hover-only panel, since touch users and keyboard users may dismiss it easily.
250
+ - The brain layer handles overlay dismissal (Escape / outside pointer). Avoid `showDelay`s so long that keyboard focus has already moved on.
251
+ - If the trigger is an icon or avatar without text, give it an `aria-label` describing what the preview shows.
252
+
253
+ ## Theming / CSS variables
254
+
255
+ No component-specific CSS variables; the panel uses the shared `--popover` / `--popover-foreground` / `--ring` tokens. Widen with `class="tw:w-…"`, or restyle padding via `class` overrides.
256
+
257
+ ## Related subpaths
258
+
259
+ - `@egose/shadcn-theme-ng/popover` — click-triggered counterpart (same portal/content pattern).
260
+ - `@egose/shadcn-theme-ng/tooltip` — lightweight text-only hover hints.
261
+ - `@egose/shadcn-theme-ng/avatar` — typical media inside user preview cards.
262
+ - `@egose/shadcn-theme-ng/dialog` — modal alternative when the content needs interaction.