@hyalo/angular 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/LICENSE +21 -0
  3. package/README.md +45 -2
  4. package/fesm2022/hyalo-angular-accordion.mjs +230 -0
  5. package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
  6. package/fesm2022/hyalo-angular-alert.mjs +171 -0
  7. package/fesm2022/hyalo-angular-alert.mjs.map +1 -0
  8. package/fesm2022/hyalo-angular-aspect-ratio.mjs +64 -0
  9. package/fesm2022/hyalo-angular-aspect-ratio.mjs.map +1 -0
  10. package/fesm2022/hyalo-angular-avatar.mjs +169 -0
  11. package/fesm2022/hyalo-angular-avatar.mjs.map +1 -0
  12. package/fesm2022/hyalo-angular-badge.mjs +268 -0
  13. package/fesm2022/hyalo-angular-badge.mjs.map +1 -0
  14. package/fesm2022/hyalo-angular-bento.mjs +132 -0
  15. package/fesm2022/hyalo-angular-bento.mjs.map +1 -0
  16. package/fesm2022/hyalo-angular-blocks.mjs +985 -0
  17. package/fesm2022/hyalo-angular-blocks.mjs.map +1 -0
  18. package/fesm2022/hyalo-angular-border-beam.mjs +73 -0
  19. package/fesm2022/hyalo-angular-border-beam.mjs.map +1 -0
  20. package/fesm2022/hyalo-angular-breadcrumb.mjs +77 -0
  21. package/fesm2022/hyalo-angular-breadcrumb.mjs.map +1 -0
  22. package/fesm2022/hyalo-angular-button-group.mjs +90 -0
  23. package/fesm2022/hyalo-angular-button-group.mjs.map +1 -0
  24. package/fesm2022/hyalo-angular-button.mjs +204 -0
  25. package/fesm2022/hyalo-angular-button.mjs.map +1 -0
  26. package/fesm2022/hyalo-angular-card.mjs +221 -0
  27. package/fesm2022/hyalo-angular-card.mjs.map +1 -0
  28. package/fesm2022/hyalo-angular-carousel.mjs +709 -0
  29. package/fesm2022/hyalo-angular-carousel.mjs.map +1 -0
  30. package/fesm2022/hyalo-angular-chapter-nav.mjs +336 -0
  31. package/fesm2022/hyalo-angular-chapter-nav.mjs.map +1 -0
  32. package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs +5 -0
  33. package/fesm2022/hyalo-angular-chart-engine-DSJop6He.mjs.map +1 -0
  34. package/fesm2022/hyalo-angular-chart.mjs +391 -0
  35. package/fesm2022/hyalo-angular-chart.mjs.map +1 -0
  36. package/fesm2022/hyalo-angular-choice.mjs +789 -0
  37. package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
  38. package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs +40 -0
  39. package/fesm2022/hyalo-angular-code-block-highlight-B20d5C76.mjs.map +1 -0
  40. package/fesm2022/hyalo-angular-code-block.mjs +161 -0
  41. package/fesm2022/hyalo-angular-code-block.mjs.map +1 -0
  42. package/fesm2022/hyalo-angular-command.mjs +193 -0
  43. package/fesm2022/hyalo-angular-command.mjs.map +1 -0
  44. package/fesm2022/hyalo-angular-copy.mjs +138 -0
  45. package/fesm2022/hyalo-angular-copy.mjs.map +1 -0
  46. package/fesm2022/hyalo-angular-core.mjs +424 -0
  47. package/fesm2022/hyalo-angular-core.mjs.map +1 -0
  48. package/fesm2022/hyalo-angular-description-list.mjs +57 -0
  49. package/fesm2022/hyalo-angular-description-list.mjs.map +1 -0
  50. package/fesm2022/hyalo-angular-dialog.mjs +600 -0
  51. package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
  52. package/fesm2022/hyalo-angular-divider.mjs +66 -0
  53. package/fesm2022/hyalo-angular-divider.mjs.map +1 -0
  54. package/fesm2022/hyalo-angular-empty-state.mjs +123 -0
  55. package/fesm2022/hyalo-angular-empty-state.mjs.map +1 -0
  56. package/fesm2022/hyalo-angular-field.mjs +344 -0
  57. package/fesm2022/hyalo-angular-field.mjs.map +1 -0
  58. package/fesm2022/hyalo-angular-filter.mjs +309 -0
  59. package/fesm2022/hyalo-angular-filter.mjs.map +1 -0
  60. package/fesm2022/hyalo-angular-hotspot.mjs +225 -0
  61. package/fesm2022/hyalo-angular-hotspot.mjs.map +1 -0
  62. package/fesm2022/hyalo-angular-hover-card.mjs +233 -0
  63. package/fesm2022/hyalo-angular-hover-card.mjs.map +1 -0
  64. package/fesm2022/hyalo-angular-icon.mjs +385 -0
  65. package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
  66. package/fesm2022/hyalo-angular-image-compare.mjs +168 -0
  67. package/fesm2022/hyalo-angular-image-compare.mjs.map +1 -0
  68. package/fesm2022/hyalo-angular-interaction.mjs +446 -0
  69. package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
  70. package/fesm2022/hyalo-angular-kbd.mjs +41 -0
  71. package/fesm2022/hyalo-angular-kbd.mjs.map +1 -0
  72. package/fesm2022/hyalo-angular-lightbox.mjs +228 -0
  73. package/fesm2022/hyalo-angular-lightbox.mjs.map +1 -0
  74. package/fesm2022/hyalo-angular-link.mjs +42 -0
  75. package/fesm2022/hyalo-angular-link.mjs.map +1 -0
  76. package/fesm2022/hyalo-angular-list.mjs +131 -0
  77. package/fesm2022/hyalo-angular-list.mjs.map +1 -0
  78. package/fesm2022/hyalo-angular-marquee.mjs +197 -0
  79. package/fesm2022/hyalo-angular-marquee.mjs.map +1 -0
  80. package/fesm2022/hyalo-angular-menu.mjs +423 -0
  81. package/fesm2022/hyalo-angular-menu.mjs.map +1 -0
  82. package/fesm2022/hyalo-angular-mesh.mjs +126 -0
  83. package/fesm2022/hyalo-angular-mesh.mjs.map +1 -0
  84. package/fesm2022/hyalo-angular-motion.mjs +620 -0
  85. package/fesm2022/hyalo-angular-motion.mjs.map +1 -0
  86. package/fesm2022/hyalo-angular-navbar.mjs +343 -0
  87. package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
  88. package/fesm2022/hyalo-angular-navigation-menu.mjs +222 -0
  89. package/fesm2022/hyalo-angular-navigation-menu.mjs.map +1 -0
  90. package/fesm2022/hyalo-angular-number-ticker.mjs +174 -0
  91. package/fesm2022/hyalo-angular-number-ticker.mjs.map +1 -0
  92. package/fesm2022/hyalo-angular-overlay.mjs +163 -0
  93. package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
  94. package/fesm2022/hyalo-angular-pagination.mjs +187 -0
  95. package/fesm2022/hyalo-angular-pagination.mjs.map +1 -0
  96. package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
  97. package/fesm2022/hyalo-angular-popover.mjs +516 -0
  98. package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
  99. package/fesm2022/hyalo-angular-progress.mjs +209 -0
  100. package/fesm2022/hyalo-angular-progress.mjs.map +1 -0
  101. package/fesm2022/hyalo-angular-progressive-blur.mjs +73 -0
  102. package/fesm2022/hyalo-angular-progressive-blur.mjs.map +1 -0
  103. package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs +186 -0
  104. package/fesm2022/hyalo-angular-refraction-renderer-5ZA-kfsA.mjs.map +1 -0
  105. package/fesm2022/hyalo-angular-refraction.mjs +178 -0
  106. package/fesm2022/hyalo-angular-refraction.mjs.map +1 -0
  107. package/fesm2022/hyalo-angular-scroll-area.mjs +93 -0
  108. package/fesm2022/hyalo-angular-scroll-area.mjs.map +1 -0
  109. package/fesm2022/hyalo-angular-scroll-to-top.mjs +127 -0
  110. package/fesm2022/hyalo-angular-scroll-to-top.mjs.map +1 -0
  111. package/fesm2022/hyalo-angular-segmented.mjs +223 -0
  112. package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
  113. package/fesm2022/hyalo-angular-select.mjs +561 -0
  114. package/fesm2022/hyalo-angular-select.mjs.map +1 -0
  115. package/fesm2022/hyalo-angular-sidebar.mjs +241 -0
  116. package/fesm2022/hyalo-angular-sidebar.mjs.map +1 -0
  117. package/fesm2022/hyalo-angular-skeleton.mjs +131 -0
  118. package/fesm2022/hyalo-angular-skeleton.mjs.map +1 -0
  119. package/fesm2022/hyalo-angular-sparkline.mjs +110 -0
  120. package/fesm2022/hyalo-angular-sparkline.mjs.map +1 -0
  121. package/fesm2022/hyalo-angular-split-text.mjs +126 -0
  122. package/fesm2022/hyalo-angular-split-text.mjs.map +1 -0
  123. package/fesm2022/hyalo-angular-stat.mjs +193 -0
  124. package/fesm2022/hyalo-angular-stat.mjs.map +1 -0
  125. package/fesm2022/hyalo-angular-stepper.mjs +254 -0
  126. package/fesm2022/hyalo-angular-stepper.mjs.map +1 -0
  127. package/fesm2022/hyalo-angular-table.mjs +335 -0
  128. package/fesm2022/hyalo-angular-table.mjs.map +1 -0
  129. package/fesm2022/hyalo-angular-tabs.mjs +324 -0
  130. package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
  131. package/fesm2022/hyalo-angular-theme.mjs +94 -0
  132. package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
  133. package/fesm2022/hyalo-angular-timeline.mjs +157 -0
  134. package/fesm2022/hyalo-angular-timeline.mjs.map +1 -0
  135. package/fesm2022/hyalo-angular-toast.mjs +323 -0
  136. package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
  137. package/fesm2022/hyalo-angular.mjs +2 -0
  138. package/package.json +329 -3
  139. package/styles/hyalo-core.css +25 -0
  140. package/styles/hyalo.css +17 -0
  141. package/styles/overlays/dialog.css +9 -0
  142. package/styles/overlays/popover.css +9 -0
  143. package/styles/overlays/select.css +9 -0
  144. package/styles/overlays/toast.css +8 -0
  145. package/styles/palettes/aurora.css +47 -0
  146. package/styles/palettes/ember.css +47 -0
  147. package/styles/palettes/graphite.css +47 -0
  148. package/styles/palettes/ocean.css +47 -0
  149. package/styles/palettes/orchid.css +47 -0
  150. package/styles/palettes/rose.css +47 -0
  151. package/styles/parts/card.css +49 -0
  152. package/styles/parts/dialog.css +116 -0
  153. package/styles/parts/drawer.css +124 -0
  154. package/styles/parts/field.css +44 -0
  155. package/styles/parts/glass.css +139 -0
  156. package/styles/parts/motion.css +101 -0
  157. package/styles/parts/navbar.css +55 -0
  158. package/styles/parts/popover.css +27 -0
  159. package/styles/parts/presence.css +55 -0
  160. package/styles/parts/reset.css +42 -0
  161. package/styles/parts/select.css +46 -0
  162. package/styles/parts/themes.css +105 -0
  163. package/styles/parts/toast.css +128 -0
  164. package/styles/parts/tokens.css +151 -0
  165. package/styles/parts/typography.css +81 -0
  166. package/types/hyalo-angular-accordion.d.ts +74 -0
  167. package/types/hyalo-angular-alert.d.ts +47 -0
  168. package/types/hyalo-angular-aspect-ratio.d.ts +13 -0
  169. package/types/hyalo-angular-avatar.d.ts +39 -0
  170. package/types/hyalo-angular-badge.d.ts +82 -0
  171. package/types/hyalo-angular-bento.d.ts +25 -0
  172. package/types/hyalo-angular-blocks.d.ts +272 -0
  173. package/types/hyalo-angular-border-beam.d.ts +15 -0
  174. package/types/hyalo-angular-breadcrumb.d.ts +22 -0
  175. package/types/hyalo-angular-button-group.d.ts +19 -0
  176. package/types/hyalo-angular-button.d.ts +89 -0
  177. package/types/hyalo-angular-card.d.ts +61 -0
  178. package/types/hyalo-angular-carousel.d.ts +147 -0
  179. package/types/hyalo-angular-chapter-nav.d.ts +79 -0
  180. package/types/hyalo-angular-chart.d.ts +90 -0
  181. package/types/hyalo-angular-choice.d.ts +259 -0
  182. package/types/hyalo-angular-code-block.d.ts +46 -0
  183. package/types/hyalo-angular-command.d.ts +41 -0
  184. package/types/hyalo-angular-copy.d.ts +39 -0
  185. package/types/hyalo-angular-core.d.ts +210 -0
  186. package/types/hyalo-angular-description-list.d.ts +16 -0
  187. package/types/hyalo-angular-dialog.d.ts +171 -0
  188. package/types/hyalo-angular-divider.d.ts +12 -0
  189. package/types/hyalo-angular-empty-state.d.ts +30 -0
  190. package/types/hyalo-angular-field.d.ts +141 -0
  191. package/types/hyalo-angular-filter.d.ts +122 -0
  192. package/types/hyalo-angular-hotspot.d.ts +70 -0
  193. package/types/hyalo-angular-hover-card.d.ts +47 -0
  194. package/types/hyalo-angular-icon.d.ts +122 -0
  195. package/types/hyalo-angular-image-compare.d.ts +55 -0
  196. package/types/hyalo-angular-interaction.d.ts +131 -0
  197. package/types/hyalo-angular-kbd.d.ts +5 -0
  198. package/types/hyalo-angular-lightbox.d.ts +67 -0
  199. package/types/hyalo-angular-link.d.ts +5 -0
  200. package/types/hyalo-angular-list.d.ts +30 -0
  201. package/types/hyalo-angular-marquee.d.ts +48 -0
  202. package/types/hyalo-angular-menu.d.ts +105 -0
  203. package/types/hyalo-angular-mesh.d.ts +36 -0
  204. package/types/hyalo-angular-motion.d.ts +218 -0
  205. package/types/hyalo-angular-navbar.d.ts +110 -0
  206. package/types/hyalo-angular-navigation-menu.d.ts +47 -0
  207. package/types/hyalo-angular-number-ticker.d.ts +52 -0
  208. package/types/hyalo-angular-overlay.d.ts +40 -0
  209. package/types/hyalo-angular-pagination.d.ts +59 -0
  210. package/types/hyalo-angular-popover.d.ts +152 -0
  211. package/types/hyalo-angular-progress.d.ts +46 -0
  212. package/types/hyalo-angular-progressive-blur.d.ts +14 -0
  213. package/types/hyalo-angular-refraction.d.ts +46 -0
  214. package/types/hyalo-angular-scroll-area.d.ts +18 -0
  215. package/types/hyalo-angular-scroll-to-top.d.ts +31 -0
  216. package/types/hyalo-angular-segmented.d.ts +79 -0
  217. package/types/hyalo-angular-select.d.ts +176 -0
  218. package/types/hyalo-angular-sidebar.d.ts +57 -0
  219. package/types/hyalo-angular-skeleton.d.ts +34 -0
  220. package/types/hyalo-angular-sparkline.d.ts +19 -0
  221. package/types/hyalo-angular-split-text.d.ts +24 -0
  222. package/types/hyalo-angular-stat.d.ts +56 -0
  223. package/types/hyalo-angular-stepper.d.ts +63 -0
  224. package/types/hyalo-angular-table.d.ts +125 -0
  225. package/types/hyalo-angular-tabs.d.ts +102 -0
  226. package/types/hyalo-angular-theme.d.ts +46 -0
  227. package/types/hyalo-angular-timeline.d.ts +36 -0
  228. package/types/hyalo-angular-toast.d.ts +79 -0
  229. package/types/hyalo-angular.d.ts +2 -0
@@ -0,0 +1,66 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, input } from "@angular/core";
3
+ var HyDivider = class HyDivider {
4
+ orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
5
+ static ɵfac = i0.ɵɵngDeclareFactory({
6
+ minVersion: "12.0.0",
7
+ version: "22.2.3",
8
+ ngImport: i0,
9
+ type: HyDivider,
10
+ deps: [],
11
+ target: i0.ɵɵFactoryTarget.Component
12
+ });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({
14
+ minVersion: "17.1.0",
15
+ version: "22.2.3",
16
+ type: HyDivider,
17
+ isStandalone: true,
18
+ selector: "hy-divider",
19
+ inputs: { orientation: {
20
+ classPropertyName: "orientation",
21
+ publicName: "orientation",
22
+ isSignal: true,
23
+ isRequired: false,
24
+ transformFunction: null
25
+ } },
26
+ host: {
27
+ attributes: { "role": "separator" },
28
+ properties: { "attr.aria-orientation": "orientation()" }
29
+ },
30
+ ngImport: i0,
31
+ template: "",
32
+ isInline: true,
33
+ styles: [":host{display:block;border-block-start:1px solid var(--hy-line);margin-block:var(--hy-space-6)}:host([aria-orientation=\"vertical\"]){display:inline-block;align-self:stretch;border-block-start:0;border-inline-start:1px solid var(--hy-line);margin-block:0;margin-inline:var(--hy-space-3)}\n"],
34
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
35
+ });
36
+ };
37
+ i0.ɵɵngDeclareClassMetadata({
38
+ minVersion: "12.0.0",
39
+ version: "22.2.3",
40
+ ngImport: i0,
41
+ type: HyDivider,
42
+ decorators: [{
43
+ type: Component,
44
+ args: [{
45
+ selector: "hy-divider",
46
+ changeDetection: ChangeDetectionStrategy.OnPush,
47
+ host: {
48
+ role: "separator",
49
+ "[attr.aria-orientation]": "orientation()"
50
+ },
51
+ template: "",
52
+ styles: [":host{display:block;border-block-start:1px solid var(--hy-line);margin-block:var(--hy-space-6)}:host([aria-orientation=\"vertical\"]){display:inline-block;align-self:stretch;border-block-start:0;border-inline-start:1px solid var(--hy-line);margin-block:0;margin-inline:var(--hy-space-3)}\n"]
53
+ }]
54
+ }],
55
+ propDecorators: { orientation: [{
56
+ type: i0.Input,
57
+ args: [{
58
+ isSignal: true,
59
+ alias: "orientation",
60
+ required: false
61
+ }]
62
+ }] }
63
+ });
64
+ export { HyDivider };
65
+
66
+ //# sourceMappingURL=hyalo-angular-divider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-divider.mjs","names":[],"sources":["../../../projects/hyalo/divider/divider.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n@Component({\r\n selector: 'hy-divider',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { role: 'separator', '[attr.aria-orientation]': 'orientation()' },\r\n template: '',\r\n styleUrl: './divider.css',\r\n})\r\nexport class HyDivider {\r\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\r\n}\r\n"],"mappings":";;AAQA,IAAa,YAAb,MAAa,UAAS;CACX,cAAc,MAAiC,cAAa,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAD1D,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAS,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAT,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAS,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,aAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,YAAA;GAAA,YAAA,EAAA,yBAAA,gBAAA;EAAA;EAAA,UAAA;EAAA,UAHV;EAAE,UAAA;EAAA,QAAA,CAAA,mSAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAGD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAS,YAAA,CAAA;EAPrB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAY,iBACL,wBAAwB;GAAM,MACzC;IAAE,MAAM;IAAa,2BAA2B;GAAe;GAAE,UAC7D;GAAE,QAAA,CAAA,mSAAA;EAAA,CAAA"}
@@ -0,0 +1,123 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, input } from "@angular/core";
3
+ import { HyIcon } from "@hyalo/angular/icon";
4
+ var HyEmptyState = class HyEmptyState {
5
+ heading = input.required(...ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []);
6
+ headingLevel = input(2, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
7
+ description = input("", ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
8
+ icon = input(...ngDevMode ? [void 0, { debugName: "icon" }] : /* istanbul ignore next */ []);
9
+ static ɵfac = i0.ɵɵngDeclareFactory({
10
+ minVersion: "12.0.0",
11
+ version: "22.2.3",
12
+ ngImport: i0,
13
+ type: HyEmptyState,
14
+ deps: [],
15
+ target: i0.ɵɵFactoryTarget.Component
16
+ });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({
18
+ minVersion: "17.0.0",
19
+ version: "22.2.3",
20
+ type: HyEmptyState,
21
+ isStandalone: true,
22
+ selector: "hy-empty-state",
23
+ inputs: {
24
+ heading: {
25
+ classPropertyName: "heading",
26
+ publicName: "heading",
27
+ isSignal: true,
28
+ isRequired: true,
29
+ transformFunction: null
30
+ },
31
+ headingLevel: {
32
+ classPropertyName: "headingLevel",
33
+ publicName: "headingLevel",
34
+ isSignal: true,
35
+ isRequired: false,
36
+ transformFunction: null
37
+ },
38
+ description: {
39
+ classPropertyName: "description",
40
+ publicName: "description",
41
+ isSignal: true,
42
+ isRequired: false,
43
+ transformFunction: null
44
+ },
45
+ icon: {
46
+ classPropertyName: "icon",
47
+ publicName: "icon",
48
+ isSignal: true,
49
+ isRequired: false,
50
+ transformFunction: null
51
+ }
52
+ },
53
+ ngImport: i0,
54
+ template: "@if (icon()) {\r\n <div class=\"symbol\"><hy-icon [name]=\"icon()!\" /></div>\r\n}\r\n@switch (headingLevel()) {\r\n @case (3) {\r\n <h3>{{ heading() }}</h3>\r\n }\r\n @case (4) {\r\n <h4>{{ heading() }}</h4>\r\n }\r\n @case (5) {\r\n <h5>{{ heading() }}</h5>\r\n }\r\n @case (6) {\r\n <h6>{{ heading() }}</h6>\r\n }\r\n @default {\r\n <h2>{{ heading() }}</h2>\r\n }\r\n}\r\n@if (description()) {\r\n <p>{{ description() }}</p>\r\n}\r\n<div class=\"actions\"><ng-content /></div>\r\n",
55
+ styles: [":host{display:grid;justify-items:center;text-align:center;padding:clamp(1.5rem,5vw,3rem);gap:.75rem;color:var(--hy-ink)}:is(h2,h3,h4,h5,h6),p{margin:0}:is(h2,h3,h4,h5,h6){font-size:var(--hy-step-2)}p{color:var(--hy-ink-2);max-inline-size:42ch}.symbol{display:grid;place-items:center;inline-size:3rem;block-size:3rem;background:var(--hy-primary-wash);color:var(--hy-primary);border-radius:var(--hy-radius-m)}.actions{display:flex;flex-wrap:wrap;justify-content:center;gap:.5rem;margin-block-start:.5rem}\n"],
56
+ dependencies: [{
57
+ kind: "component",
58
+ type: HyIcon,
59
+ selector: "hy-icon",
60
+ inputs: [
61
+ "name",
62
+ "icon",
63
+ "label",
64
+ "size",
65
+ "strokeWidth"
66
+ ]
67
+ }],
68
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
69
+ });
70
+ };
71
+ i0.ɵɵngDeclareClassMetadata({
72
+ minVersion: "12.0.0",
73
+ version: "22.2.3",
74
+ ngImport: i0,
75
+ type: HyEmptyState,
76
+ decorators: [{
77
+ type: Component,
78
+ args: [{
79
+ selector: "hy-empty-state",
80
+ imports: [HyIcon],
81
+ changeDetection: ChangeDetectionStrategy.OnPush,
82
+ template: "@if (icon()) {\r\n <div class=\"symbol\"><hy-icon [name]=\"icon()!\" /></div>\r\n}\r\n@switch (headingLevel()) {\r\n @case (3) {\r\n <h3>{{ heading() }}</h3>\r\n }\r\n @case (4) {\r\n <h4>{{ heading() }}</h4>\r\n }\r\n @case (5) {\r\n <h5>{{ heading() }}</h5>\r\n }\r\n @case (6) {\r\n <h6>{{ heading() }}</h6>\r\n }\r\n @default {\r\n <h2>{{ heading() }}</h2>\r\n }\r\n}\r\n@if (description()) {\r\n <p>{{ description() }}</p>\r\n}\r\n<div class=\"actions\"><ng-content /></div>\r\n",
83
+ styles: [":host{display:grid;justify-items:center;text-align:center;padding:clamp(1.5rem,5vw,3rem);gap:.75rem;color:var(--hy-ink)}:is(h2,h3,h4,h5,h6),p{margin:0}:is(h2,h3,h4,h5,h6){font-size:var(--hy-step-2)}p{color:var(--hy-ink-2);max-inline-size:42ch}.symbol{display:grid;place-items:center;inline-size:3rem;block-size:3rem;background:var(--hy-primary-wash);color:var(--hy-primary);border-radius:var(--hy-radius-m)}.actions{display:flex;flex-wrap:wrap;justify-content:center;gap:.5rem;margin-block-start:.5rem}\n"]
84
+ }]
85
+ }],
86
+ propDecorators: {
87
+ heading: [{
88
+ type: i0.Input,
89
+ args: [{
90
+ isSignal: true,
91
+ alias: "heading",
92
+ required: true
93
+ }]
94
+ }],
95
+ headingLevel: [{
96
+ type: i0.Input,
97
+ args: [{
98
+ isSignal: true,
99
+ alias: "headingLevel",
100
+ required: false
101
+ }]
102
+ }],
103
+ description: [{
104
+ type: i0.Input,
105
+ args: [{
106
+ isSignal: true,
107
+ alias: "description",
108
+ required: false
109
+ }]
110
+ }],
111
+ icon: [{
112
+ type: i0.Input,
113
+ args: [{
114
+ isSignal: true,
115
+ alias: "icon",
116
+ required: false
117
+ }]
118
+ }]
119
+ }
120
+ });
121
+ export { HyEmptyState };
122
+
123
+ //# sourceMappingURL=hyalo-angular-empty-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-empty-state.mjs","names":[],"sources":["../../../projects/hyalo/empty-state/empty-state.ts","../../../projects/hyalo/empty-state/empty-state.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { HyIcon } from '@hyalo/angular/icon';\r\n@Component({\r\n selector: 'hy-empty-state',\r\n imports: [HyIcon],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './empty-state.html',\r\n styleUrl: './empty-state.css',\r\n})\r\nexport class HyEmptyState {\r\n readonly heading = input.required<string>();\r\n readonly headingLevel = input<2 | 3 | 4 | 5 | 6>(2);\r\n readonly description = input('');\r\n readonly icon = input<string>();\r\n}\r\n","@if (icon()) {\r\n <div class=\"symbol\"><hy-icon [name]=\"icon()!\" /></div>\r\n}\r\n@switch (headingLevel()) {\r\n @case (3) {\r\n <h3>{{ heading() }}</h3>\r\n }\r\n @case (4) {\r\n <h4>{{ heading() }}</h4>\r\n }\r\n @case (5) {\r\n <h5>{{ heading() }}</h5>\r\n }\r\n @case (6) {\r\n <h6>{{ heading() }}</h6>\r\n }\r\n @default {\r\n <h2>{{ heading() }}</h2>\r\n }\r\n}\r\n@if (description()) {\r\n <p>{{ description() }}</p>\r\n}\r\n<div class=\"actions\"><ng-content /></div>\r\n"],"mappings":";;;AASA,IAAa,eAAb,MAAa,aAAY;CACd,UAAU,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAClC,eAAe,MAAyB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAC1C,cAAc,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,OAAO,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAJpB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAY,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,cAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UCTzB;EAwBA,QAAA,CAAA,0fAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MDpBY;GAAM,UAAA;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAKL,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EAPxB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,SACjB,CAAC,MAAM;GAAC,iBACA,wBAAwB;GAAM,UAAA;GAAA,QAAA,CAAA,0fAAA;EAAA,CAAA"}
@@ -0,0 +1,344 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, Directive, HostAttributeToken, InjectionToken, booleanAttribute, computed, forwardRef, inject, input, signal } from "@angular/core";
3
+ import { injectId } from "@hyalo/angular/core";
4
+ import { NgControl, Validators } from "@angular/forms";
5
+ import { FORM_FIELD } from "@angular/forms/signals";
6
+ const HY_FIELD = new InjectionToken("HY_FIELD");
7
+ var HyInput = class HyInput {
8
+ field = inject(HY_FIELD, { optional: true });
9
+ formField = inject(FORM_FIELD, {
10
+ self: true,
11
+ optional: true
12
+ });
13
+ ngControl = this.formField ? null : inject(NgControl, {
14
+ self: true,
15
+ optional: true
16
+ });
17
+ destroy = inject(DestroyRef);
18
+ revision = signal(0, ...ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []);
19
+ control;
20
+ subscription;
21
+ constructor() {
22
+ this.field?.register(this);
23
+ this.destroy.onDestroy(() => this.subscription?.unsubscribe());
24
+ }
25
+ ngDoCheck() {
26
+ const control = this.ngControl?.control;
27
+ if (control === this.control) return;
28
+ this.subscription?.unsubscribe();
29
+ this.control = control;
30
+ this.subscription = control?.events.subscribe(() => this.revision.update((value) => value + 1));
31
+ this.revision.update((value) => value + 1);
32
+ }
33
+ labelable = true;
34
+ id = signal(inject(new HostAttributeToken("id"), { optional: true }) ?? injectId("input")).asReadonly();
35
+ invalid = computed(() => {
36
+ this.revision();
37
+ const state = this.formField?.state(), control = this.ngControl?.control;
38
+ return state ? state.invalid() && state.touched() : !!control?.invalid && control.touched;
39
+ }, ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
40
+ errorMessage = computed(() => {
41
+ this.revision();
42
+ const control = this.ngControl?.control;
43
+ if (!this.formField && control?.errors) {
44
+ const first = Object.keys(control.errors)[0];
45
+ const detail = first ? control.errors[first] : void 0;
46
+ return typeof detail === "object" && detail !== null && "message" in detail && typeof detail.message === "string" ? detail.message : first;
47
+ }
48
+ const first = (this.formField?.state().errors() ?? [])[0];
49
+ return first ? first.message ?? first.kind : void 0;
50
+ }, ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
51
+ showsError = computed(() => this.field ? this.field.errorShown() : this.invalid(), ...ngDevMode ? [{ debugName: "showsError" }] : /* istanbul ignore next */ []);
52
+ required = computed(() => {
53
+ this.revision();
54
+ return this.formField?.state().required() ?? this.ngControl?.control?.hasValidator(Validators.required) ?? false;
55
+ }, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
56
+ disabled = computed(() => {
57
+ this.revision();
58
+ return this.formField?.state().disabled() ?? this.ngControl?.control?.disabled ?? false;
59
+ }, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
60
+ static ɵfac = i0.ɵɵngDeclareFactory({
61
+ minVersion: "12.0.0",
62
+ version: "22.2.3",
63
+ ngImport: i0,
64
+ type: HyInput,
65
+ deps: [],
66
+ target: i0.ɵɵFactoryTarget.Directive
67
+ });
68
+ static ɵdir = i0.ɵɵngDeclareDirective({
69
+ minVersion: "14.0.0",
70
+ version: "22.2.3",
71
+ type: HyInput,
72
+ isStandalone: true,
73
+ selector: "input[hyInput], textarea[hyInput]",
74
+ host: {
75
+ properties: {
76
+ "id": "id()",
77
+ "attr.aria-describedby": "field?.describedBy() ?? null",
78
+ "attr.aria-invalid": "showsError() || null"
79
+ },
80
+ classAttribute: "hy-input"
81
+ },
82
+ ngImport: i0
83
+ });
84
+ };
85
+ i0.ɵɵngDeclareClassMetadata({
86
+ minVersion: "12.0.0",
87
+ version: "22.2.3",
88
+ ngImport: i0,
89
+ type: HyInput,
90
+ decorators: [{
91
+ type: Directive,
92
+ args: [{
93
+ selector: "input[hyInput], textarea[hyInput]",
94
+ host: {
95
+ class: "hy-input",
96
+ "[id]": "id()",
97
+ "[attr.aria-describedby]": "field?.describedBy() ?? null",
98
+ "[attr.aria-invalid]": "showsError() || null"
99
+ }
100
+ }]
101
+ }],
102
+ ctorParameters: () => []
103
+ });
104
+ var HyPrefix = class HyPrefix {
105
+ static ɵfac = i0.ɵɵngDeclareFactory({
106
+ minVersion: "12.0.0",
107
+ version: "22.2.3",
108
+ ngImport: i0,
109
+ type: HyPrefix,
110
+ deps: [],
111
+ target: i0.ɵɵFactoryTarget.Directive
112
+ });
113
+ static ɵdir = i0.ɵɵngDeclareDirective({
114
+ minVersion: "14.0.0",
115
+ version: "22.2.3",
116
+ type: HyPrefix,
117
+ isStandalone: true,
118
+ selector: "[hyPrefix]",
119
+ host: { classAttribute: "hy-field__prefix" },
120
+ ngImport: i0
121
+ });
122
+ };
123
+ i0.ɵɵngDeclareClassMetadata({
124
+ minVersion: "12.0.0",
125
+ version: "22.2.3",
126
+ ngImport: i0,
127
+ type: HyPrefix,
128
+ decorators: [{
129
+ type: Directive,
130
+ args: [{
131
+ selector: "[hyPrefix]",
132
+ host: { class: "hy-field__prefix" }
133
+ }]
134
+ }]
135
+ });
136
+ var HySuffix = class HySuffix {
137
+ static ɵfac = i0.ɵɵngDeclareFactory({
138
+ minVersion: "12.0.0",
139
+ version: "22.2.3",
140
+ ngImport: i0,
141
+ type: HySuffix,
142
+ deps: [],
143
+ target: i0.ɵɵFactoryTarget.Directive
144
+ });
145
+ static ɵdir = i0.ɵɵngDeclareDirective({
146
+ minVersion: "14.0.0",
147
+ version: "22.2.3",
148
+ type: HySuffix,
149
+ isStandalone: true,
150
+ selector: "[hySuffix]",
151
+ host: { classAttribute: "hy-field__suffix" },
152
+ ngImport: i0
153
+ });
154
+ };
155
+ i0.ɵɵngDeclareClassMetadata({
156
+ minVersion: "12.0.0",
157
+ version: "22.2.3",
158
+ ngImport: i0,
159
+ type: HySuffix,
160
+ decorators: [{
161
+ type: Directive,
162
+ args: [{
163
+ selector: "[hySuffix]",
164
+ host: { class: "hy-field__suffix" }
165
+ }]
166
+ }]
167
+ });
168
+ var HyField = class HyField {
169
+ labelId = injectId("field-label");
170
+ hintId = injectId("field-hint");
171
+ errorId = injectId("field-error");
172
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
173
+ hint = input(...ngDevMode ? [void 0, { debugName: "hint" }] : /* istanbul ignore next */ []);
174
+ error = input(...ngDevMode ? [void 0, { debugName: "error" }] : /* istanbul ignore next */ []);
175
+ forceError = input(false, {
176
+ ...ngDevMode ? { debugName: "forceError" } : /* istanbul ignore next */ {},
177
+ transform: booleanAttribute
178
+ });
179
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
180
+ control = signal(void 0, ...ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []);
181
+ labelFor = computed(() => {
182
+ const c = this.control();
183
+ return c?.labelable ? c.id() : null;
184
+ }, ...ngDevMode ? [{ debugName: "labelFor" }] : /* istanbul ignore next */ []);
185
+ errorText = computed(() => {
186
+ if (this.error()) return this.error();
187
+ const c = this.control();
188
+ return c && (c.invalid() || this.forceError()) ? c.errorMessage() : void 0;
189
+ }, ...ngDevMode ? [{ debugName: "errorText" }] : /* istanbul ignore next */ []);
190
+ errorShown = computed(() => !!this.errorText(), ...ngDevMode ? [{ debugName: "errorShown" }] : /* istanbul ignore next */ []);
191
+ describedBy = computed(() => {
192
+ const ids = [];
193
+ if (this.hint() && !this.errorText()) ids.push(this.hintId);
194
+ if (this.errorText()) ids.push(this.errorId);
195
+ return ids.length ? ids.join(" ") : null;
196
+ }, ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
197
+ register(control) {
198
+ this.control.set(control);
199
+ }
200
+ static ɵfac = i0.ɵɵngDeclareFactory({
201
+ minVersion: "12.0.0",
202
+ version: "22.2.3",
203
+ ngImport: i0,
204
+ type: HyField,
205
+ deps: [],
206
+ target: i0.ɵɵFactoryTarget.Component
207
+ });
208
+ static ɵcmp = i0.ɵɵngDeclareComponent({
209
+ minVersion: "17.0.0",
210
+ version: "22.2.3",
211
+ type: HyField,
212
+ isStandalone: true,
213
+ selector: "hy-field",
214
+ inputs: {
215
+ label: {
216
+ classPropertyName: "label",
217
+ publicName: "label",
218
+ isSignal: true,
219
+ isRequired: false,
220
+ transformFunction: null
221
+ },
222
+ hint: {
223
+ classPropertyName: "hint",
224
+ publicName: "hint",
225
+ isSignal: true,
226
+ isRequired: false,
227
+ transformFunction: null
228
+ },
229
+ error: {
230
+ classPropertyName: "error",
231
+ publicName: "error",
232
+ isSignal: true,
233
+ isRequired: false,
234
+ transformFunction: null
235
+ },
236
+ forceError: {
237
+ classPropertyName: "forceError",
238
+ publicName: "forceError",
239
+ isSignal: true,
240
+ isRequired: false,
241
+ transformFunction: null
242
+ },
243
+ size: {
244
+ classPropertyName: "size",
245
+ publicName: "size",
246
+ isSignal: true,
247
+ isRequired: false,
248
+ transformFunction: null
249
+ }
250
+ },
251
+ host: {
252
+ properties: {
253
+ "attr.data-size": "size()",
254
+ "attr.data-invalid": "errorShown() || null",
255
+ "attr.data-disabled": "control()?.disabled() || null"
256
+ },
257
+ classAttribute: "hy-field"
258
+ },
259
+ providers: [{
260
+ provide: HY_FIELD,
261
+ useExisting: forwardRef(() => HyField)
262
+ }],
263
+ ngImport: i0,
264
+ template: "@if (label()) {\r\n <label class=\"hy-field__label\" [id]=\"labelId\" [attr.for]=\"labelFor()\">\r\n {{ label() }}\r\n @if (control()?.required()) {\r\n <span class=\"hy-field__required\" aria-hidden=\"true\">*</span>\r\n }\r\n </label>\r\n}\r\n<div class=\"hy-field__box\">\r\n <ng-content select=\"[hyPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[hySuffix]\" />\r\n</div>\r\n@if (hint() && !errorText()) {\r\n <p class=\"hy-field__hint\" [id]=\"hintId\">{{ hint() }}</p>\r\n}\r\n<p class=\"hy-field__error\" [id]=\"errorId\" aria-live=\"polite\">{{ errorText() }}</p>\r\n",
265
+ styles: [":host{--_h: var(--hy-control-md);display:flex;flex-direction:column;gap:var(--hy-space-2);min-inline-size:0}:host([data-size=\"sm\"]){--_h: var(--hy-control-sm)}:host([data-size=\"lg\"]){--_h: var(--hy-control-lg)}.hy-field__label{color:var(--hy-ink);font-size:var(--hy-step--1);letter-spacing:var(--hy-tracking-small);font-weight:560}.hy-field__required{color:var(--hy-danger);margin-inline-start:.15em}.hy-field__box{display:flex;align-items:center;gap:var(--hy-space-2);min-block-size:var(--_h);padding-inline:var(--hy-space-3);border:1px solid var(--hy-field-border, var(--hy-line-strong));border-radius:var(--hy-field-radius, var(--hy-radius-m));background:var(--hy-field-bg, color-mix(in srgb, var(--hy-surface-1) 72%, transparent));box-shadow:inset 0 1px 2px #0f1a240d;transition:border-color var(--hy-dur-quick) var(--hy-ease-out),box-shadow var(--hy-dur-quick) var(--hy-ease-out),background-color var(--hy-dur-quick) var(--hy-ease-out)}.hy-field__box:hover{border-color:color-mix(in srgb,var(--hy-ink) 38%,transparent)}.hy-field__box:focus-within{border-color:var(--hy-primary);background:var(--hy-surface-1);box-shadow:0 0 0 3px var(--hy-primary-wash)}:host([data-invalid]) .hy-field__box{border-color:var(--hy-danger)}:host([data-invalid]) .hy-field__box:focus-within{box-shadow:0 0 0 3px var(--hy-danger-wash)}:host([data-disabled]) .hy-field__box,.hy-field__box:has(:disabled){opacity:.55;cursor:not-allowed}.hy-field__hint,.hy-field__error{margin:0;font-size:var(--hy-step--1);letter-spacing:var(--hy-tracking-small)}.hy-field__hint{color:var(--hy-ink-3)}.hy-field__error{color:var(--hy-danger)}.hy-field__error:empty{display:none}@media(forced-colors:active){.hy-field__box:focus-within{outline:2px solid Highlight}}\n"],
266
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
267
+ });
268
+ };
269
+ i0.ɵɵngDeclareClassMetadata({
270
+ minVersion: "12.0.0",
271
+ version: "22.2.3",
272
+ ngImport: i0,
273
+ type: HyField,
274
+ decorators: [{
275
+ type: Component,
276
+ args: [{
277
+ selector: "hy-field",
278
+ changeDetection: ChangeDetectionStrategy.OnPush,
279
+ providers: [{
280
+ provide: HY_FIELD,
281
+ useExisting: forwardRef(() => HyField)
282
+ }],
283
+ host: {
284
+ class: "hy-field",
285
+ "[attr.data-size]": "size()",
286
+ "[attr.data-invalid]": "errorShown() || null",
287
+ "[attr.data-disabled]": "control()?.disabled() || null"
288
+ },
289
+ template: "@if (label()) {\r\n <label class=\"hy-field__label\" [id]=\"labelId\" [attr.for]=\"labelFor()\">\r\n {{ label() }}\r\n @if (control()?.required()) {\r\n <span class=\"hy-field__required\" aria-hidden=\"true\">*</span>\r\n }\r\n </label>\r\n}\r\n<div class=\"hy-field__box\">\r\n <ng-content select=\"[hyPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[hySuffix]\" />\r\n</div>\r\n@if (hint() && !errorText()) {\r\n <p class=\"hy-field__hint\" [id]=\"hintId\">{{ hint() }}</p>\r\n}\r\n<p class=\"hy-field__error\" [id]=\"errorId\" aria-live=\"polite\">{{ errorText() }}</p>\r\n",
290
+ styles: [":host{--_h: var(--hy-control-md);display:flex;flex-direction:column;gap:var(--hy-space-2);min-inline-size:0}:host([data-size=\"sm\"]){--_h: var(--hy-control-sm)}:host([data-size=\"lg\"]){--_h: var(--hy-control-lg)}.hy-field__label{color:var(--hy-ink);font-size:var(--hy-step--1);letter-spacing:var(--hy-tracking-small);font-weight:560}.hy-field__required{color:var(--hy-danger);margin-inline-start:.15em}.hy-field__box{display:flex;align-items:center;gap:var(--hy-space-2);min-block-size:var(--_h);padding-inline:var(--hy-space-3);border:1px solid var(--hy-field-border, var(--hy-line-strong));border-radius:var(--hy-field-radius, var(--hy-radius-m));background:var(--hy-field-bg, color-mix(in srgb, var(--hy-surface-1) 72%, transparent));box-shadow:inset 0 1px 2px #0f1a240d;transition:border-color var(--hy-dur-quick) var(--hy-ease-out),box-shadow var(--hy-dur-quick) var(--hy-ease-out),background-color var(--hy-dur-quick) var(--hy-ease-out)}.hy-field__box:hover{border-color:color-mix(in srgb,var(--hy-ink) 38%,transparent)}.hy-field__box:focus-within{border-color:var(--hy-primary);background:var(--hy-surface-1);box-shadow:0 0 0 3px var(--hy-primary-wash)}:host([data-invalid]) .hy-field__box{border-color:var(--hy-danger)}:host([data-invalid]) .hy-field__box:focus-within{box-shadow:0 0 0 3px var(--hy-danger-wash)}:host([data-disabled]) .hy-field__box,.hy-field__box:has(:disabled){opacity:.55;cursor:not-allowed}.hy-field__hint,.hy-field__error{margin:0;font-size:var(--hy-step--1);letter-spacing:var(--hy-tracking-small)}.hy-field__hint{color:var(--hy-ink-3)}.hy-field__error{color:var(--hy-danger)}.hy-field__error:empty{display:none}@media(forced-colors:active){.hy-field__box:focus-within{outline:2px solid Highlight}}\n"]
291
+ }]
292
+ }],
293
+ propDecorators: {
294
+ label: [{
295
+ type: i0.Input,
296
+ args: [{
297
+ isSignal: true,
298
+ alias: "label",
299
+ required: false
300
+ }]
301
+ }],
302
+ hint: [{
303
+ type: i0.Input,
304
+ args: [{
305
+ isSignal: true,
306
+ alias: "hint",
307
+ required: false
308
+ }]
309
+ }],
310
+ error: [{
311
+ type: i0.Input,
312
+ args: [{
313
+ isSignal: true,
314
+ alias: "error",
315
+ required: false
316
+ }]
317
+ }],
318
+ forceError: [{
319
+ type: i0.Input,
320
+ args: [{
321
+ isSignal: true,
322
+ alias: "forceError",
323
+ required: false
324
+ }]
325
+ }],
326
+ size: [{
327
+ type: i0.Input,
328
+ args: [{
329
+ isSignal: true,
330
+ alias: "size",
331
+ required: false
332
+ }]
333
+ }]
334
+ }
335
+ });
336
+ const HY_TEXT_FIELD = [
337
+ HyField,
338
+ HyInput,
339
+ HyPrefix,
340
+ HySuffix
341
+ ];
342
+ export { HY_FIELD, HY_TEXT_FIELD, HyField, HyInput, HyPrefix, HySuffix };
343
+
344
+ //# sourceMappingURL=hyalo-angular-field.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyalo-angular-field.mjs","names":[],"sources":["../../../projects/hyalo/field/field-control.ts","../../../projects/hyalo/field/input.ts","../../../projects/hyalo/field/field.ts","../../../projects/hyalo/field/field.html"],"sourcesContent":["import { InjectionToken, type Signal } from '@angular/core';\r\n\r\n/**\r\n * What a control tells the field around it. Implemented by `hyInput` and\r\n * `hy-select`. Custom controls can implement it too, so `hy-field` can\r\n * label them and show their errors.\r\n */\r\nexport interface HyFieldControl {\r\n /** Id of the focusable element. */\r\n readonly id: Signal<string>;\r\n /** True when the field should show as invalid. */\r\n readonly invalid: Signal<boolean>;\r\n /** First error message to show, if any. */\r\n readonly errorMessage: Signal<string | undefined>;\r\n readonly required: Signal<boolean>;\r\n readonly disabled: Signal<boolean>;\r\n /**\r\n * True when the control is a native labelable element (input, textarea,\r\n * select, button). Those get `<label for>`. Others rely on\r\n * `aria-labelledby`.\r\n */\r\n readonly labelable: boolean;\r\n}\r\n\r\n/** The field a control sits in. */\r\nexport interface HyFieldContext {\r\n readonly labelId: string;\r\n readonly hintId: string;\r\n readonly errorId: string;\r\n /** True while the field displays an error. */\r\n readonly errorShown: Signal<boolean>;\r\n /** Space-separated ids for `aria-describedby`. */\r\n readonly describedBy: Signal<string | null>;\r\n register(control: HyFieldControl): void;\r\n}\r\n\r\n/** Provided by `hy-field` to the control inside it. */\r\nexport const HY_FIELD = new InjectionToken<HyFieldContext>('HY_FIELD');\r\n","import type { Subscription } from 'rxjs';\nimport { NgControl, Validators, type AbstractControl } from '@angular/forms';\nimport {\n Directive,\n HostAttributeToken,\n DestroyRef,\n DoCheck,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { FORM_FIELD } from '@angular/forms/signals';\nimport { injectId } from '@hyalo/angular/core';\n\nimport { HY_FIELD, type HyFieldControl } from './field-control';\n\n/**\n * Marks a native `<input>` or `<textarea>` as the control of a `hy-field`.\n * It wires the label, hint and error ids, and reads validity from Signal\n * Forms when `[formField]` is on the same element.\n *\n * The element stays native, so Signal Forms, `ngModel`, autofill and\n * mobile keyboards all work as usual.\n */\n@Directive({\n selector: 'input[hyInput], textarea[hyInput]',\n host: {\n class: 'hy-input',\n '[id]': 'id()',\n '[attr.aria-describedby]': 'field?.describedBy() ?? null',\n '[attr.aria-invalid]': 'showsError() || null',\n },\n})\nexport class HyInput implements HyFieldControl, DoCheck {\n protected readonly field = inject(HY_FIELD, { optional: true });\n // The token, not the FormField class, so apps without forms do not bundle them.\n private readonly formField = inject(FORM_FIELD, { self: true, optional: true });\n\n // Signal Forms exposes a lightweight NgControl bridge, not an AbstractControl.\n // Its state is already reactive through FORM_FIELD, so no event subscription is needed.\n private readonly ngControl = this.formField\n ? null\n : inject(NgControl, { self: true, optional: true });\n private readonly destroy = inject(DestroyRef);\n private readonly revision = signal(0);\n private control: AbstractControl | null | undefined;\n private subscription?: Subscription;\n constructor() {\n this.field?.register(this);\n this.destroy.onDestroy(() => this.subscription?.unsubscribe());\n }\n ngDoCheck(): void {\n const control = this.ngControl?.control;\n if (control === this.control) return;\n this.subscription?.unsubscribe();\n this.control = control;\n this.subscription = control?.events.subscribe(() => this.revision.update((value) => value + 1));\n this.revision.update((value) => value + 1);\n }\n readonly labelable = true;\n /** The element's own static `id` attribute, or a generated one. */\n readonly id = signal(\n inject(new HostAttributeToken('id'), { optional: true }) ?? injectId('input'),\n ).asReadonly();\n\n readonly invalid = computed(() => {\n this.revision();\n const state = this.formField?.state(),\n control = this.ngControl?.control;\n return state ? state.invalid() && state.touched() : !!control?.invalid && control.touched;\n });\n\n readonly errorMessage = computed(() => {\n this.revision();\n const control = this.ngControl?.control;\n if (!this.formField && control?.errors) {\n const first = Object.keys(control.errors)[0];\n const detail: unknown = first ? control.errors[first] : undefined;\n return typeof detail === 'object' &&\n detail !== null &&\n 'message' in detail &&\n typeof detail.message === 'string'\n ? detail.message\n : first;\n }\n const errors = this.formField?.state().errors() ?? [];\n const first = errors[0];\n return first ? (first.message ?? first.kind) : undefined;\n });\n\n protected readonly showsError = computed(() =>\n this.field ? this.field.errorShown() : this.invalid(),\n );\n\n readonly required = computed(() => {\n this.revision();\n return (\n this.formField?.state().required() ??\n this.ngControl?.control?.hasValidator(Validators.required) ??\n false\n );\n });\n readonly disabled = computed(() => {\n this.revision();\n return this.formField?.state().disabled() ?? this.ngControl?.control?.disabled ?? false;\n });\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { type HySize, injectId } from '@hyalo/angular/core';\r\n\r\nimport { HY_FIELD, type HyFieldContext, type HyFieldControl } from './field-control';\r\nimport { HyInput } from './input';\r\n\r\n/** Content before the control inside the field box, such as an icon. */\r\n@Directive({ selector: '[hyPrefix]', host: { class: 'hy-field__prefix' } })\r\nexport class HyPrefix {}\r\n\r\n/** Content after the control inside the field box, such as a unit or a button. */\r\n@Directive({ selector: '[hySuffix]', host: { class: 'hy-field__suffix' } })\r\nexport class HySuffix {}\r\n\r\n/**\r\n * Label, hint and error around one form control.\r\n *\r\n * ```html\r\n * <hy-field label=\"Email\" hint=\"Only used for the receipt\">\r\n * <hy-icon hyPrefix name=\"mail\" />\r\n * <input hyInput type=\"email\" [formField]=\"form.email\" />\r\n * </hy-field>\r\n * ```\r\n *\r\n * With Signal Forms the error comes from the field state and shows once the\r\n * field is touched. An explicit `error` input always wins, which is how\r\n * server-side errors are shown.\r\n */\r\n@Component({\r\n selector: 'hy-field',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: HY_FIELD, useExisting: forwardRef(() => HyField) }],\r\n host: {\r\n class: 'hy-field',\r\n '[attr.data-size]': 'size()',\r\n '[attr.data-invalid]': 'errorShown() || null',\r\n '[attr.data-disabled]': 'control()?.disabled() || null',\r\n },\r\n templateUrl: './field.html',\r\n styleUrl: './field.css',\r\n})\r\nexport class HyField implements HyFieldContext {\r\n readonly labelId = injectId('field-label');\r\n readonly hintId = injectId('field-hint');\r\n readonly errorId = injectId('field-error');\r\n\r\n /** Visible label. Always set one, placeholders are not labels. */\r\n readonly label = input<string>();\r\n /** Help text under the control. Hidden while an error shows. */\r\n readonly hint = input<string>();\r\n /** Error text. Overrides errors from the form. */\r\n readonly error = input<string>();\r\n /** Show errors before the field is touched, for example after submit. */\r\n readonly forceError = input(false, { transform: booleanAttribute });\r\n /** Height of the field box. */\r\n readonly size = input<HySize>('md');\r\n\r\n protected readonly control = signal<HyFieldControl | undefined>(undefined);\r\n\r\n protected readonly labelFor = computed(() => {\r\n const c = this.control();\r\n return c?.labelable ? c.id() : null;\r\n });\r\n\r\n protected readonly errorText = computed(() => {\r\n if (this.error()) return this.error();\r\n const c = this.control();\r\n return c && (c.invalid() || this.forceError()) ? c.errorMessage() : undefined;\r\n });\r\n\r\n readonly errorShown = computed(() => !!this.errorText());\r\n\r\n readonly describedBy = computed(() => {\r\n const ids = [];\r\n if (this.hint() && !this.errorText()) ids.push(this.hintId);\r\n if (this.errorText()) ids.push(this.errorId);\r\n return ids.length ? ids.join(' ') : null;\r\n });\r\n\r\n register(control: HyFieldControl): void {\r\n this.control.set(control);\r\n }\r\n}\r\n\r\n/** Everything needed to build a text field. */\r\nexport const HY_TEXT_FIELD = [HyField, HyInput, HyPrefix, HySuffix] as const;\r\n","@if (label()) {\r\n <label class=\"hy-field__label\" [id]=\"labelId\" [attr.for]=\"labelFor()\">\r\n {{ label() }}\r\n @if (control()?.required()) {\r\n <span class=\"hy-field__required\" aria-hidden=\"true\">*</span>\r\n }\r\n </label>\r\n}\r\n<div class=\"hy-field__box\">\r\n <ng-content select=\"[hyPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[hySuffix]\" />\r\n</div>\r\n@if (hint() && !errorText()) {\r\n <p class=\"hy-field__hint\" [id]=\"hintId\">{{ hint() }}</p>\r\n}\r\n<p class=\"hy-field__error\" [id]=\"errorId\" aria-live=\"polite\">{{ errorText() }}</p>\r\n"],"mappings":"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"}