@educarehq/solaris-ui 0.1.0 → 0.2.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 (393) hide show
  1. package/educarehq-solaris-ui.d.ts +5 -0
  2. package/esm2022/educarehq-solaris-ui.js +5 -0
  3. package/esm2022/educarehq-solaris-ui.js.map +1 -0
  4. package/esm2022/index.js +70 -0
  5. package/esm2022/index.js.map +1 -0
  6. package/esm2022/lib/components/actions/button/directives/button-icon.directive.js +17 -0
  7. package/esm2022/lib/components/actions/button/directives/button-icon.directive.js.map +1 -0
  8. package/esm2022/lib/components/actions/button/directives/button.directive.js +60 -0
  9. package/esm2022/lib/components/actions/button/directives/button.directive.js.map +1 -0
  10. package/esm2022/lib/components/actions/button/model/button.types.js +1 -0
  11. package/esm2022/lib/components/actions/button/model/button.types.js.map +1 -0
  12. package/esm2022/lib/components/actions/button-group/component/button-group.component.js +21 -0
  13. package/esm2022/lib/components/actions/button-group/component/button-group.component.js.map +1 -0
  14. package/esm2022/lib/components/actions/button-group/model/button-group.types.js +1 -0
  15. package/esm2022/lib/components/actions/button-group/model/button-group.types.js.map +1 -0
  16. package/esm2022/lib/components/actions/icon-button/directives/icon-button-badge.directive.js +17 -0
  17. package/esm2022/lib/components/actions/icon-button/directives/icon-button-badge.directive.js.map +1 -0
  18. package/esm2022/lib/components/actions/icon-button/directives/icon-button.directive.js +58 -0
  19. package/esm2022/lib/components/actions/icon-button/directives/icon-button.directive.js.map +1 -0
  20. package/esm2022/lib/components/actions/icon-button/model/icon-button.types.js +1 -0
  21. package/esm2022/lib/components/actions/icon-button/model/icon-button.types.js.map +1 -0
  22. package/esm2022/lib/components/data-display/badge/component/badge.component.js +24 -0
  23. package/esm2022/lib/components/data-display/badge/component/badge.component.js.map +1 -0
  24. package/esm2022/lib/components/data-display/badge/directives/badge-icon.directive.js +17 -0
  25. package/esm2022/lib/components/data-display/badge/directives/badge-icon.directive.js.map +1 -0
  26. package/esm2022/lib/components/data-display/badge/model/badge.types.js +1 -0
  27. package/esm2022/lib/components/data-display/badge/model/badge.types.js.map +1 -0
  28. package/esm2022/lib/components/data-display/card/component/card.component.js +20 -0
  29. package/esm2022/lib/components/data-display/card/component/card.component.js.map +1 -0
  30. package/esm2022/lib/components/data-display/card/directives/card-actions.directive.js +17 -0
  31. package/esm2022/lib/components/data-display/card/directives/card-actions.directive.js.map +1 -0
  32. package/esm2022/lib/components/data-display/card/directives/card-content.directive.js +17 -0
  33. package/esm2022/lib/components/data-display/card/directives/card-content.directive.js.map +1 -0
  34. package/esm2022/lib/components/data-display/card/directives/card-description.directive.js +17 -0
  35. package/esm2022/lib/components/data-display/card/directives/card-description.directive.js.map +1 -0
  36. package/esm2022/lib/components/data-display/card/directives/card-footer.directive.js +19 -0
  37. package/esm2022/lib/components/data-display/card/directives/card-footer.directive.js.map +1 -0
  38. package/esm2022/lib/components/data-display/card/directives/card-header.directive.js +17 -0
  39. package/esm2022/lib/components/data-display/card/directives/card-header.directive.js.map +1 -0
  40. package/esm2022/lib/components/data-display/card/directives/card-media.directive.js +17 -0
  41. package/esm2022/lib/components/data-display/card/directives/card-media.directive.js.map +1 -0
  42. package/esm2022/lib/components/data-display/card/directives/card-title.directive.js +17 -0
  43. package/esm2022/lib/components/data-display/card/directives/card-title.directive.js.map +1 -0
  44. package/esm2022/lib/components/data-display/card/model/card.types.js +1 -0
  45. package/esm2022/lib/components/data-display/card/model/card.types.js.map +1 -0
  46. package/esm2022/lib/components/feedback/alert/component/alert-actions.component.js +18 -0
  47. package/esm2022/lib/components/feedback/alert/component/alert-actions.component.js.map +1 -0
  48. package/esm2022/lib/components/feedback/alert/component/alert.component.js +90 -0
  49. package/esm2022/lib/components/feedback/alert/component/alert.component.js.map +1 -0
  50. package/esm2022/lib/components/feedback/alert/directives/alert-description.directive.js +17 -0
  51. package/esm2022/lib/components/feedback/alert/directives/alert-description.directive.js.map +1 -0
  52. package/esm2022/lib/components/feedback/alert/directives/alert-title.directive.js +17 -0
  53. package/esm2022/lib/components/feedback/alert/directives/alert-title.directive.js.map +1 -0
  54. package/esm2022/lib/components/feedback/alert/model/alert.types.js +1 -0
  55. package/esm2022/lib/components/feedback/alert/model/alert.types.js.map +1 -0
  56. package/esm2022/lib/components/feedback/skeleton/component/skeleton.component.js +69 -0
  57. package/esm2022/lib/components/feedback/skeleton/component/skeleton.component.js.map +1 -0
  58. package/esm2022/lib/components/feedback/skeleton/model/skeleton.types.js +1 -0
  59. package/esm2022/lib/components/feedback/skeleton/model/skeleton.types.js.map +1 -0
  60. package/esm2022/lib/components/forms/checkbox/component/checkbox.component.js +227 -0
  61. package/esm2022/lib/components/forms/checkbox/component/checkbox.component.js.map +1 -0
  62. package/esm2022/lib/components/forms/checkbox/model/checkbox.types.js +1 -0
  63. package/esm2022/lib/components/forms/checkbox/model/checkbox.types.js.map +1 -0
  64. package/esm2022/lib/components/forms/checkbox-group/component/checkbox-group.component.js +441 -0
  65. package/esm2022/lib/components/forms/checkbox-group/component/checkbox-group.component.js.map +1 -0
  66. package/esm2022/lib/components/forms/checkbox-group/model/checkbox-group.types.js +1 -0
  67. package/esm2022/lib/components/forms/checkbox-group/model/checkbox-group.types.js.map +1 -0
  68. package/esm2022/lib/components/forms/email-field/component/email-field.component.js +214 -0
  69. package/esm2022/lib/components/forms/email-field/component/email-field.component.js.map +1 -0
  70. package/esm2022/lib/components/forms/email-field/model/email-field.types.js +1 -0
  71. package/esm2022/lib/components/forms/email-field/model/email-field.types.js.map +1 -0
  72. package/esm2022/lib/components/forms/email-field/validators/email-field.validators.js +69 -0
  73. package/esm2022/lib/components/forms/email-field/validators/email-field.validators.js.map +1 -0
  74. package/esm2022/lib/components/forms/form-field/component/form-error.component.js +19 -0
  75. package/esm2022/lib/components/forms/form-field/component/form-error.component.js.map +1 -0
  76. package/esm2022/lib/components/forms/form-field/component/form-field.component.js +394 -0
  77. package/esm2022/lib/components/forms/form-field/component/form-field.component.js.map +1 -0
  78. package/esm2022/lib/components/forms/form-field/component/form-hint.component.js +18 -0
  79. package/esm2022/lib/components/forms/form-field/component/form-hint.component.js.map +1 -0
  80. package/esm2022/lib/components/forms/form-field/component/form-label.component.js +18 -0
  81. package/esm2022/lib/components/forms/form-field/component/form-label.component.js.map +1 -0
  82. package/esm2022/lib/components/forms/form-field/directives/form-field-trigger.directive.js +14 -0
  83. package/esm2022/lib/components/forms/form-field/directives/form-field-trigger.directive.js.map +1 -0
  84. package/esm2022/lib/components/forms/form-field/directives/form-prefix.directive.js +17 -0
  85. package/esm2022/lib/components/forms/form-field/directives/form-prefix.directive.js.map +1 -0
  86. package/esm2022/lib/components/forms/form-field/directives/form-suffix.directive.js +17 -0
  87. package/esm2022/lib/components/forms/form-field/directives/form-suffix.directive.js.map +1 -0
  88. package/esm2022/lib/components/forms/form-field/index.js +8 -0
  89. package/esm2022/lib/components/forms/form-field/index.js.map +1 -0
  90. package/esm2022/lib/components/forms/form-field/model/form-control.contract.js +3 -0
  91. package/esm2022/lib/components/forms/form-field/model/form-control.contract.js.map +1 -0
  92. package/esm2022/lib/components/forms/form-field/model/form-field.types.js +1 -0
  93. package/esm2022/lib/components/forms/form-field/model/form-field.types.js.map +1 -0
  94. package/esm2022/lib/components/forms/input/directives/input.directive.js +148 -0
  95. package/esm2022/lib/components/forms/input/directives/input.directive.js.map +1 -0
  96. package/esm2022/lib/components/forms/input/index.js +2 -0
  97. package/esm2022/lib/components/forms/input/index.js.map +1 -0
  98. package/esm2022/lib/components/forms/input/model/input.defaults.js +27 -0
  99. package/esm2022/lib/components/forms/input/model/input.defaults.js.map +1 -0
  100. package/esm2022/lib/components/forms/input/model/input.types.js +1 -0
  101. package/esm2022/lib/components/forms/input/model/input.types.js.map +1 -0
  102. package/esm2022/lib/components/forms/multi-select/component/multi-select.component.js +1119 -0
  103. package/esm2022/lib/components/forms/multi-select/component/multi-select.component.js.map +1 -0
  104. package/esm2022/lib/components/forms/multi-select/model/multi-select.types.js +1 -0
  105. package/esm2022/lib/components/forms/multi-select/model/multi-select.types.js.map +1 -0
  106. package/esm2022/lib/components/forms/option/component/option.component.js +149 -0
  107. package/esm2022/lib/components/forms/option/component/option.component.js.map +1 -0
  108. package/esm2022/lib/components/forms/option/directives/option-slots.directive.js +58 -0
  109. package/esm2022/lib/components/forms/option/directives/option-slots.directive.js.map +1 -0
  110. package/esm2022/lib/components/forms/option/index.js +3 -0
  111. package/esm2022/lib/components/forms/option/index.js.map +1 -0
  112. package/esm2022/lib/components/forms/option/model/option.types.js +1 -0
  113. package/esm2022/lib/components/forms/option/model/option.types.js.map +1 -0
  114. package/esm2022/lib/components/forms/option-group/component/option-group.component.js +103 -0
  115. package/esm2022/lib/components/forms/option-group/component/option-group.component.js.map +1 -0
  116. package/esm2022/lib/components/forms/option-group/index.js +2 -0
  117. package/esm2022/lib/components/forms/option-group/index.js.map +1 -0
  118. package/esm2022/lib/components/forms/option-group/model/option-group.types.js +1 -0
  119. package/esm2022/lib/components/forms/option-group/model/option-group.types.js.map +1 -0
  120. package/esm2022/lib/components/forms/password-field/component/password-field.component.js +299 -0
  121. package/esm2022/lib/components/forms/password-field/component/password-field.component.js.map +1 -0
  122. package/esm2022/lib/components/forms/password-field/model/password-field-constants.js +5 -0
  123. package/esm2022/lib/components/forms/password-field/model/password-field-constants.js.map +1 -0
  124. package/esm2022/lib/components/forms/password-field/model/password-field.types.js +1 -0
  125. package/esm2022/lib/components/forms/password-field/model/password-field.types.js.map +1 -0
  126. package/esm2022/lib/components/forms/password-field/model/password-policy.types.js +1 -0
  127. package/esm2022/lib/components/forms/password-field/model/password-policy.types.js.map +1 -0
  128. package/esm2022/lib/components/forms/password-field/model/password-strength.js +67 -0
  129. package/esm2022/lib/components/forms/password-field/model/password-strength.js.map +1 -0
  130. package/esm2022/lib/components/forms/password-field/validators/password.validator.js +45 -0
  131. package/esm2022/lib/components/forms/password-field/validators/password.validator.js.map +1 -0
  132. package/esm2022/lib/components/forms/radio/component/radio.component.js +219 -0
  133. package/esm2022/lib/components/forms/radio/component/radio.component.js.map +1 -0
  134. package/esm2022/lib/components/forms/radio/model/radio.types.js +1 -0
  135. package/esm2022/lib/components/forms/radio/model/radio.types.js.map +1 -0
  136. package/esm2022/lib/components/forms/radio-group/component/radio-group.component.js +348 -0
  137. package/esm2022/lib/components/forms/radio-group/component/radio-group.component.js.map +1 -0
  138. package/esm2022/lib/components/forms/radio-group/model/radio-group.token.js +3 -0
  139. package/esm2022/lib/components/forms/radio-group/model/radio-group.token.js.map +1 -0
  140. package/esm2022/lib/components/forms/radio-group/model/radio-group.types.js +1 -0
  141. package/esm2022/lib/components/forms/radio-group/model/radio-group.types.js.map +1 -0
  142. package/esm2022/lib/components/forms/select/component/select.component.js +819 -0
  143. package/esm2022/lib/components/forms/select/component/select.component.js.map +1 -0
  144. package/esm2022/lib/components/forms/select/model/select.types.js +1 -0
  145. package/esm2022/lib/components/forms/select/model/select.types.js.map +1 -0
  146. package/esm2022/lib/components/forms/switch/component/switch.component.js +211 -0
  147. package/esm2022/lib/components/forms/switch/component/switch.component.js.map +1 -0
  148. package/esm2022/lib/components/forms/switch/index.js +2 -0
  149. package/esm2022/lib/components/forms/switch/index.js.map +1 -0
  150. package/esm2022/lib/components/forms/switch/model/switch.types.js +1 -0
  151. package/esm2022/lib/components/forms/switch/model/switch.types.js.map +1 -0
  152. package/esm2022/lib/components/forms/switch-group/component/switch-group.component.js +369 -0
  153. package/esm2022/lib/components/forms/switch-group/component/switch-group.component.js.map +1 -0
  154. package/esm2022/lib/components/forms/switch-group/model/switch-group.types.js +1 -0
  155. package/esm2022/lib/components/forms/switch-group/model/switch-group.types.js.map +1 -0
  156. package/esm2022/lib/components/forms/textarea/directives/textarea.directive.js +137 -0
  157. package/esm2022/lib/components/forms/textarea/directives/textarea.directive.js.map +1 -0
  158. package/esm2022/lib/components/forms/textarea/model/textarea.types.js +1 -0
  159. package/esm2022/lib/components/forms/textarea/model/textarea.types.js.map +1 -0
  160. package/esm2022/lib/components/icon/component/solaris-icon.component.js +20 -0
  161. package/esm2022/lib/components/icon/component/solaris-icon.component.js.map +1 -0
  162. package/esm2022/lib/components/icon/index.js +2 -0
  163. package/esm2022/lib/components/icon/index.js.map +1 -0
  164. package/esm2022/lib/components/interaction/popover/component/popover-panel.component.js +29 -0
  165. package/esm2022/lib/components/interaction/popover/component/popover-panel.component.js.map +1 -0
  166. package/esm2022/lib/components/interaction/popover/directives/popover-trigger.directive.js +317 -0
  167. package/esm2022/lib/components/interaction/popover/directives/popover-trigger.directive.js.map +1 -0
  168. package/esm2022/lib/components/interaction/popover/directives/popover.directive.js +16 -0
  169. package/esm2022/lib/components/interaction/popover/directives/popover.directive.js.map +1 -0
  170. package/esm2022/lib/components/interaction/popover/index.js +4 -0
  171. package/esm2022/lib/components/interaction/popover/index.js.map +1 -0
  172. package/esm2022/lib/components/interaction/popover/model/popover-position.js +145 -0
  173. package/esm2022/lib/components/interaction/popover/model/popover-position.js.map +1 -0
  174. package/esm2022/lib/components/interaction/popover/model/popover.types.js +1 -0
  175. package/esm2022/lib/components/interaction/popover/model/popover.types.js.map +1 -0
  176. package/esm2022/lib/components/interaction/popover/token/popover.tokens.js +3 -0
  177. package/esm2022/lib/components/interaction/popover/token/popover.tokens.js.map +1 -0
  178. package/esm2022/lib/components/interaction/tooltip/component/tooltip-panel.component.js +23 -0
  179. package/esm2022/lib/components/interaction/tooltip/component/tooltip-panel.component.js.map +1 -0
  180. package/esm2022/lib/components/interaction/tooltip/directive/tooltip.directive.js +405 -0
  181. package/esm2022/lib/components/interaction/tooltip/directive/tooltip.directive.js.map +1 -0
  182. package/esm2022/lib/components/interaction/tooltip/index.js +3 -0
  183. package/esm2022/lib/components/interaction/tooltip/index.js.map +1 -0
  184. package/esm2022/lib/components/interaction/tooltip/model/tooltip-position.js +209 -0
  185. package/esm2022/lib/components/interaction/tooltip/model/tooltip-position.js.map +1 -0
  186. package/esm2022/lib/components/interaction/tooltip/model/tooltip.types.js +1 -0
  187. package/esm2022/lib/components/interaction/tooltip/model/tooltip.types.js.map +1 -0
  188. package/esm2022/lib/components/interaction/tooltip/token/tooltip.tokens.js +3 -0
  189. package/esm2022/lib/components/interaction/tooltip/token/tooltip.tokens.js.map +1 -0
  190. package/esm2022/lib/services/accessibility/directives/visually-hidden.directive.js +25 -0
  191. package/esm2022/lib/services/accessibility/directives/visually-hidden.directive.js.map +1 -0
  192. package/esm2022/lib/services/accessibility/model/solaris-accessibility-config.interface.js +1 -0
  193. package/esm2022/lib/services/accessibility/model/solaris-accessibility-config.interface.js.map +1 -0
  194. package/esm2022/lib/services/accessibility/model/solaris-accessibility.types.js +1 -0
  195. package/esm2022/lib/services/accessibility/model/solaris-accessibility.types.js.map +1 -0
  196. package/esm2022/lib/services/accessibility/provider/provide-solaris-accessibility.js +10 -0
  197. package/esm2022/lib/services/accessibility/provider/provide-solaris-accessibility.js.map +1 -0
  198. package/esm2022/lib/services/accessibility/service/solaris-accessibility.service.js +60 -0
  199. package/esm2022/lib/services/accessibility/service/solaris-accessibility.service.js.map +1 -0
  200. package/esm2022/lib/services/accessibility/testing/solaris-accessibility-testing.provider.js +10 -0
  201. package/esm2022/lib/services/accessibility/testing/solaris-accessibility-testing.provider.js.map +1 -0
  202. package/esm2022/lib/services/accessibility/token/solaris-accessibility.tokens.js +3 -0
  203. package/esm2022/lib/services/accessibility/token/solaris-accessibility.tokens.js.map +1 -0
  204. package/esm2022/lib/services/icon/icons/index.js +2 -0
  205. package/esm2022/lib/services/icon/icons/index.js.map +1 -0
  206. package/esm2022/lib/services/icon/icons/solaris-built-in-icons.js +207 -0
  207. package/esm2022/lib/services/icon/icons/solaris-built-in-icons.js.map +1 -0
  208. package/esm2022/lib/services/icon/index.js +5 -0
  209. package/esm2022/lib/services/icon/index.js.map +1 -0
  210. package/esm2022/lib/services/icon/model/solaris-icon-definition.interface.js +1 -0
  211. package/esm2022/lib/services/icon/model/solaris-icon-definition.interface.js.map +1 -0
  212. package/esm2022/lib/services/icon/model/solaris-icon.types.js +1 -0
  213. package/esm2022/lib/services/icon/model/solaris-icon.types.js.map +1 -0
  214. package/esm2022/lib/services/icon/provider/provide-solaris-icons.js +10 -0
  215. package/esm2022/lib/services/icon/provider/provide-solaris-icons.js.map +1 -0
  216. package/esm2022/lib/services/icon/service/solaris-icon-registry.service.js +43 -0
  217. package/esm2022/lib/services/icon/service/solaris-icon-registry.service.js.map +1 -0
  218. package/esm2022/lib/services/icon/token/solaris-icon.tokens.js +3 -0
  219. package/esm2022/lib/services/icon/token/solaris-icon.tokens.js.map +1 -0
  220. package/esm2022/lib/services/theme/model/solaris-theme-config.interface.js +1 -0
  221. package/esm2022/lib/services/theme/model/solaris-theme-config.interface.js.map +1 -0
  222. package/esm2022/lib/services/theme/model/solaris-theme.types.js +1 -0
  223. package/esm2022/lib/services/theme/model/solaris-theme.types.js.map +1 -0
  224. package/esm2022/lib/services/theme/provider/provide-solaris-theme.js +10 -0
  225. package/esm2022/lib/services/theme/provider/provide-solaris-theme.js.map +1 -0
  226. package/esm2022/lib/services/theme/service/solaris-theme.service.js +22 -0
  227. package/esm2022/lib/services/theme/service/solaris-theme.service.js.map +1 -0
  228. package/esm2022/lib/services/theme/testing/solaris-theme-testing.provider.js +10 -0
  229. package/esm2022/lib/services/theme/testing/solaris-theme-testing.provider.js.map +1 -0
  230. package/esm2022/lib/services/theme/token/solaris-theme.tokens.js +3 -0
  231. package/esm2022/lib/services/theme/token/solaris-theme.tokens.js.map +1 -0
  232. package/esm2022/lib/services/translation/index.js +6 -0
  233. package/esm2022/lib/services/translation/index.js.map +1 -0
  234. package/esm2022/lib/services/translation/model/solaris-locale.types.js +1 -0
  235. package/esm2022/lib/services/translation/model/solaris-locale.types.js.map +1 -0
  236. package/esm2022/lib/services/translation/model/solaris-translate-config.interface.js +1 -0
  237. package/esm2022/lib/services/translation/model/solaris-translate-config.interface.js.map +1 -0
  238. package/esm2022/lib/services/translation/model/solaris-translate-defaults.js +40 -0
  239. package/esm2022/lib/services/translation/model/solaris-translate-defaults.js.map +1 -0
  240. package/esm2022/lib/services/translation/model/solaris-translation.types.js +1 -0
  241. package/esm2022/lib/services/translation/model/solaris-translation.types.js.map +1 -0
  242. package/esm2022/lib/services/translation/pipe/solaris-translate.pipe.js +20 -0
  243. package/esm2022/lib/services/translation/pipe/solaris-translate.pipe.js.map +1 -0
  244. package/esm2022/lib/services/translation/provider/provide-solaris-translate.js +10 -0
  245. package/esm2022/lib/services/translation/provider/provide-solaris-translate.js.map +1 -0
  246. package/esm2022/lib/services/translation/service/solaris-translate.service.js +87 -0
  247. package/esm2022/lib/services/translation/service/solaris-translate.service.js.map +1 -0
  248. package/esm2022/lib/services/translation/testing/solaris-translate-testing.provider.js +32 -0
  249. package/esm2022/lib/services/translation/testing/solaris-translate-testing.provider.js.map +1 -0
  250. package/esm2022/lib/services/translation/token/solaris-translate.tokens.js +3 -0
  251. package/esm2022/lib/services/translation/token/solaris-translate.tokens.js.map +1 -0
  252. package/esm2022/lib/testing/provide-solaris-testing.js +11 -0
  253. package/esm2022/lib/testing/provide-solaris-testing.js.map +1 -0
  254. package/esm2022/lib/testing/solaris-test-utilities.js +12 -0
  255. package/esm2022/lib/testing/solaris-test-utilities.js.map +1 -0
  256. package/index.d.ts +106 -0
  257. package/lib/components/actions/button/directives/button-icon.directive.d.ts +5 -0
  258. package/lib/components/actions/button/directives/button.directive.d.ts +22 -0
  259. package/lib/components/actions/button/model/button.types.d.ts +5 -0
  260. package/lib/components/actions/button-group/component/button-group.component.d.ts +10 -0
  261. package/lib/components/actions/button-group/model/button-group.types.d.ts +2 -0
  262. package/lib/components/actions/icon-button/directives/icon-button-badge.directive.d.ts +5 -0
  263. package/lib/components/actions/icon-button/directives/icon-button.directive.d.ts +21 -0
  264. package/lib/components/actions/icon-button/model/icon-button.types.d.ts +5 -0
  265. package/lib/components/data-display/badge/component/badge.component.d.ts +12 -0
  266. package/lib/components/data-display/badge/directives/badge-icon.directive.d.ts +5 -0
  267. package/lib/components/data-display/badge/model/badge.types.d.ts +6 -0
  268. package/lib/components/data-display/card/component/card.component.d.ts +10 -0
  269. package/lib/components/data-display/card/directives/card-actions.directive.d.ts +5 -0
  270. package/lib/components/data-display/card/directives/card-content.directive.d.ts +5 -0
  271. package/lib/components/data-display/card/directives/card-description.directive.d.ts +5 -0
  272. package/lib/components/data-display/card/directives/card-footer.directive.d.ts +6 -0
  273. package/lib/components/data-display/card/directives/card-header.directive.d.ts +5 -0
  274. package/lib/components/data-display/card/directives/card-media.directive.d.ts +5 -0
  275. package/lib/components/data-display/card/directives/card-title.directive.d.ts +5 -0
  276. package/lib/components/data-display/card/model/card.types.d.ts +4 -0
  277. package/lib/components/feedback/alert/component/alert-actions.component.d.ts +5 -0
  278. package/lib/components/feedback/alert/component/alert.component.d.ts +26 -0
  279. package/lib/components/feedback/alert/directives/alert-description.directive.d.ts +5 -0
  280. package/lib/components/feedback/alert/directives/alert-title.directive.d.ts +5 -0
  281. package/lib/components/feedback/alert/model/alert.types.d.ts +5 -0
  282. package/lib/components/feedback/skeleton/component/skeleton.component.d.ts +17 -0
  283. package/lib/components/feedback/skeleton/model/skeleton.types.d.ts +5 -0
  284. package/lib/components/forms/checkbox/component/checkbox.component.d.ts +70 -0
  285. package/lib/components/forms/checkbox/model/checkbox.types.d.ts +5 -0
  286. package/lib/components/forms/checkbox-group/component/checkbox-group.component.d.ts +123 -0
  287. package/lib/components/forms/checkbox-group/model/checkbox-group.types.d.ts +5 -0
  288. package/lib/components/forms/email-field/component/email-field.component.d.ts +66 -0
  289. package/lib/components/forms/email-field/model/email-field.types.d.ts +6 -0
  290. package/lib/components/forms/email-field/validators/email-field.validators.d.ts +8 -0
  291. package/lib/components/forms/form-field/component/form-error.component.d.ts +5 -0
  292. package/lib/components/forms/form-field/component/form-field.component.d.ts +90 -0
  293. package/lib/components/forms/form-field/component/form-hint.component.d.ts +5 -0
  294. package/lib/components/forms/form-field/component/form-label.component.d.ts +5 -0
  295. package/lib/components/forms/form-field/directives/form-field-trigger.directive.d.ts +5 -0
  296. package/lib/components/forms/form-field/directives/form-prefix.directive.d.ts +5 -0
  297. package/lib/components/forms/form-field/directives/form-suffix.directive.d.ts +5 -0
  298. package/lib/components/forms/form-field/index.d.ts +8 -0
  299. package/lib/components/forms/form-field/model/form-control.contract.d.ts +11 -0
  300. package/lib/components/forms/form-field/model/form-field.types.d.ts +5 -0
  301. package/lib/components/forms/input/directives/input.directive.d.ts +37 -0
  302. package/lib/components/forms/input/index.d.ts +2 -0
  303. package/lib/components/forms/input/model/input.defaults.d.ts +2 -0
  304. package/lib/components/forms/input/model/input.types.d.ts +4 -0
  305. package/lib/components/forms/multi-select/component/multi-select.component.d.ts +202 -0
  306. package/lib/components/forms/multi-select/model/multi-select.types.d.ts +5 -0
  307. package/lib/components/forms/option/component/option.component.d.ts +58 -0
  308. package/lib/components/forms/option/directives/option-slots.directive.d.ts +21 -0
  309. package/lib/components/forms/option/index.d.ts +3 -0
  310. package/lib/components/forms/option/model/option.types.d.ts +3 -0
  311. package/lib/components/forms/option-group/component/option-group.component.d.ts +32 -0
  312. package/lib/components/forms/option-group/index.d.ts +2 -0
  313. package/lib/components/forms/option-group/model/option-group.types.d.ts +2 -0
  314. package/lib/components/forms/password-field/component/password-field.component.d.ts +81 -0
  315. package/lib/components/forms/password-field/model/password-field-constants.d.ts +4 -0
  316. package/lib/components/forms/password-field/model/password-field.types.d.ts +6 -0
  317. package/lib/components/forms/password-field/model/password-policy.types.d.ts +10 -0
  318. package/lib/components/forms/password-field/model/password-strength.d.ts +2 -0
  319. package/lib/components/forms/password-field/validators/password.validator.d.ts +3 -0
  320. package/lib/components/forms/radio/component/radio.component.d.ts +68 -0
  321. package/lib/components/forms/radio/model/radio.types.d.ts +4 -0
  322. package/lib/components/forms/radio-group/component/radio-group.component.d.ts +86 -0
  323. package/lib/components/forms/radio-group/model/radio-group.token.d.ts +2 -0
  324. package/lib/components/forms/radio-group/model/radio-group.types.d.ts +5 -0
  325. package/lib/components/forms/select/component/select.component.d.ts +158 -0
  326. package/lib/components/forms/select/model/select.types.d.ts +4 -0
  327. package/lib/components/forms/switch/component/switch.component.d.ts +66 -0
  328. package/lib/components/forms/switch/index.d.ts +2 -0
  329. package/lib/components/forms/switch/model/switch.types.d.ts +4 -0
  330. package/lib/components/forms/switch-group/component/switch-group.component.d.ts +91 -0
  331. package/lib/components/forms/switch-group/model/switch-group.types.d.ts +5 -0
  332. package/lib/components/forms/textarea/directives/textarea.directive.d.ts +37 -0
  333. package/lib/components/forms/textarea/model/textarea.types.d.ts +5 -0
  334. package/lib/components/icon/component/solaris-icon.component.d.ts +13 -0
  335. package/lib/components/icon/index.d.ts +1 -0
  336. package/lib/components/interaction/popover/component/popover-panel.component.d.ts +10 -0
  337. package/lib/components/interaction/popover/directives/popover-trigger.directive.d.ts +65 -0
  338. package/lib/components/interaction/popover/directives/popover.directive.d.ts +7 -0
  339. package/lib/components/interaction/popover/index.d.ts +4 -0
  340. package/lib/components/interaction/popover/model/popover-position.d.ts +4 -0
  341. package/lib/components/interaction/popover/model/popover.types.d.ts +7 -0
  342. package/lib/components/interaction/popover/token/popover.tokens.d.ts +12 -0
  343. package/lib/components/interaction/tooltip/component/tooltip-panel.component.d.ts +9 -0
  344. package/lib/components/interaction/tooltip/directive/tooltip.directive.d.ts +80 -0
  345. package/lib/components/interaction/tooltip/index.d.ts +3 -0
  346. package/lib/components/interaction/tooltip/model/tooltip-position.d.ts +5 -0
  347. package/lib/components/interaction/tooltip/model/tooltip.types.d.ts +22 -0
  348. package/lib/components/interaction/tooltip/token/tooltip.tokens.d.ts +21 -0
  349. package/lib/services/accessibility/directives/visually-hidden.directive.d.ts +5 -0
  350. package/lib/services/accessibility/model/solaris-accessibility-config.interface.d.ts +4 -0
  351. package/lib/services/accessibility/model/solaris-accessibility.types.d.ts +5 -0
  352. package/lib/services/accessibility/provider/provide-solaris-accessibility.d.ts +3 -0
  353. package/lib/services/accessibility/service/solaris-accessibility.service.d.ts +15 -0
  354. package/lib/services/accessibility/testing/solaris-accessibility-testing.provider.d.ts +3 -0
  355. package/lib/services/accessibility/token/solaris-accessibility.tokens.d.ts +3 -0
  356. package/lib/services/icon/icons/index.d.ts +1 -0
  357. package/lib/services/icon/icons/solaris-built-in-icons.d.ts +2 -0
  358. package/lib/services/icon/index.d.ts +8 -0
  359. package/lib/services/icon/model/solaris-icon-definition.interface.d.ts +36 -0
  360. package/lib/services/icon/model/solaris-icon.types.d.ts +4 -0
  361. package/lib/services/icon/provider/provide-solaris-icons.d.ts +3 -0
  362. package/lib/services/icon/service/solaris-icon-registry.service.d.ts +12 -0
  363. package/lib/services/icon/token/solaris-icon.tokens.d.ts +6 -0
  364. package/lib/services/theme/model/solaris-theme-config.interface.d.ts +5 -0
  365. package/lib/services/theme/model/solaris-theme.types.d.ts +3 -0
  366. package/lib/services/theme/provider/provide-solaris-theme.d.ts +3 -0
  367. package/lib/services/theme/service/solaris-theme.service.d.ts +9 -0
  368. package/lib/services/theme/testing/solaris-theme-testing.provider.d.ts +3 -0
  369. package/lib/services/theme/token/solaris-theme.tokens.d.ts +3 -0
  370. package/lib/services/translation/index.d.ts +8 -0
  371. package/lib/services/translation/model/solaris-locale.types.d.ts +4 -0
  372. package/lib/services/translation/model/solaris-translate-config.interface.d.ts +8 -0
  373. package/lib/services/translation/model/solaris-translate-defaults.d.ts +2 -0
  374. package/lib/services/translation/model/solaris-translation.types.d.ts +3 -0
  375. package/lib/services/translation/pipe/solaris-translate.pipe.d.ts +8 -0
  376. package/lib/services/translation/provider/provide-solaris-translate.d.ts +3 -0
  377. package/lib/services/translation/service/solaris-translate.service.d.ts +15 -0
  378. package/lib/services/translation/testing/solaris-translate-testing.provider.d.ts +3 -0
  379. package/lib/services/translation/token/solaris-translate.tokens.d.ts +3 -0
  380. package/lib/testing/provide-solaris-testing.d.ts +10 -0
  381. package/lib/testing/solaris-test-utilities.d.ts +3 -0
  382. package/package.json +9 -5
  383. package/styles/_button.scss +50 -220
  384. package/styles/_core.scss +37 -37
  385. package/styles/_icon-button.scss +43 -219
  386. package/styles/_index.scss +19 -19
  387. package/styles/_input.scss +255 -0
  388. package/styles/_popover.scss +68 -0
  389. package/styles/_theme.scss +36 -36
  390. package/styles/_tooltip.scss +3 -0
  391. package/fesm2022/educarehq-solaris-ui.mjs +0 -1047
  392. package/fesm2022/educarehq-solaris-ui.mjs.map +0 -1
  393. package/types/educarehq-solaris-ui.d.ts +0 -408
@@ -0,0 +1,394 @@
1
+ import { Component, input, computed, signal, effect, ContentChild, ElementRef, inject, NgZone, } from '@angular/core';
2
+ import { FormControlDirective, FormControlName, NgModel } from '@angular/forms';
3
+ import { SolarisFormPrefixDirective } from '../directives/form-prefix.directive';
4
+ import { SolarisFormSuffixDirective } from '../directives/form-suffix.directive';
5
+ import { SolarisTranslateService } from '../../../../services/translation';
6
+ import { SolarisFormControl } from '../model/form-control.contract';
7
+ import { SolarisFormLabelComponent } from './form-label.component';
8
+ import { SolarisFormErrorComponent } from './form-error.component';
9
+ import { SolarisFormHintComponent } from './form-hint.component';
10
+ import * as i0 from "@angular/core";
11
+ let nextId = 0;
12
+ function generateId() {
13
+ return `solaris-form-field-${++nextId}`;
14
+ }
15
+ export class SolarisFormFieldComponent {
16
+ elementRef = inject(ElementRef);
17
+ translateService = inject(SolarisTranslateService);
18
+ ngZone = inject(NgZone);
19
+ constructor() {
20
+ // SECURITY_EXCEPTION: Setting disabled/readonly on native control is standard DOM API.
21
+ // SECURITY_EXCEPTION: Required for FormField to propagate disabled/readonly state to projected control.
22
+ effect(() => {
23
+ this.isEffectivelyDisabled();
24
+ this.isEffectivelyReadonly();
25
+ this.syncControlDisabledReadonly();
26
+ });
27
+ }
28
+ hintKey = input(...(ngDevMode ? [undefined, { debugName: "hintKey" }] : /* istanbul ignore next */ []));
29
+ labelKey = input(...(ngDevMode ? [undefined, { debugName: "labelKey" }] : /* istanbul ignore next */ []));
30
+ hint = input('', ...(ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []));
31
+ errorKey = input(...(ngDevMode ? [undefined, { debugName: "errorKey" }] : /* istanbul ignore next */ []));
32
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
33
+ error = input('', ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
34
+ optionalLabel = input(...(ngDevMode ? [undefined, { debugName: "optionalLabel" }] : /* istanbul ignore next */ []));
35
+ requiredLabel = input(...(ngDevMode ? [undefined, { debugName: "requiredLabel" }] : /* istanbul ignore next */ []));
36
+ optionalLabelKey = input(...(ngDevMode ? [undefined, { debugName: "optionalLabelKey" }] : /* istanbul ignore next */ []));
37
+ requiredLabelKey = input(...(ngDevMode ? [undefined, { debugName: "requiredLabelKey" }] : /* istanbul ignore next */ []));
38
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
39
+ optional = input(false, ...(ngDevMode ? [{ debugName: "optional" }] : /* istanbul ignore next */ []));
40
+ invalid = input(...(ngDevMode ? [undefined, { debugName: "invalid" }] : /* istanbul ignore next */ []));
41
+ disabled = input(...(ngDevMode ? [undefined, { debugName: "disabled" }] : /* istanbul ignore next */ []));
42
+ readonly = input(...(ngDevMode ? [undefined, { debugName: "readonly" }] : /* istanbul ignore next */ []));
43
+ density = input(...(ngDevMode ? [undefined, { debugName: "density" }] : /* istanbul ignore next */ []));
44
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
45
+ radius = input('md', ...(ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []));
46
+ appearance = input('outline', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
47
+ control = input(undefined, ...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
48
+ projectedLabel;
49
+ projectedHint;
50
+ projectedError;
51
+ prefix;
52
+ suffix;
53
+ formControl;
54
+ formControlDirective;
55
+ formControlName;
56
+ ngModelDir;
57
+ fieldId = generateId();
58
+ hintId = `solaris-form-field-hint-${this.fieldId}`;
59
+ errorId = `solaris-form-field-error-${this.fieldId}`;
60
+ labelId = `solaris-form-field-label-${this.fieldId}`;
61
+ isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : /* istanbul ignore next */ []));
62
+ isTextareaControl = signal(false, ...(ngDevMode ? [{ debugName: "isTextareaControl" }] : /* istanbul ignore next */ []));
63
+ autoDetectedDisabled = signal(false, ...(ngDevMode ? [{ debugName: "autoDetectedDisabled" }] : /* istanbul ignore next */ []));
64
+ autoDetectedReadonly = signal(false, ...(ngDevMode ? [{ debugName: "autoDetectedReadonly" }] : /* istanbul ignore next */ []));
65
+ controlResize = signal(null, ...(ngDevMode ? [{ debugName: "controlResize" }] : /* istanbul ignore next */ []));
66
+ controlId = null;
67
+ controlElement = null;
68
+ focusListener = null;
69
+ blurListener = null;
70
+ hasProjectedLabel = computed(() => !!this.projectedLabel, ...(ngDevMode ? [{ debugName: "hasProjectedLabel" }] : /* istanbul ignore next */ []));
71
+ hasProjectedHint = computed(() => !!this.projectedHint, ...(ngDevMode ? [{ debugName: "hasProjectedHint" }] : /* istanbul ignore next */ []));
72
+ hasProjectedError = computed(() => !!this.projectedError, ...(ngDevMode ? [{ debugName: "hasProjectedError" }] : /* istanbul ignore next */ []));
73
+ hasPrefix = signal(false, ...(ngDevMode ? [{ debugName: "hasPrefix" }] : /* istanbul ignore next */ []));
74
+ hasSuffix = signal(false, ...(ngDevMode ? [{ debugName: "hasSuffix" }] : /* istanbul ignore next */ []));
75
+ controlType = computed(() => {
76
+ return this.isTextareaControl() ? 'textarea' : 'other';
77
+ }, ...(ngDevMode ? [{ debugName: "controlType" }] : /* istanbul ignore next */ []));
78
+ effectiveDensity = computed(() => {
79
+ return this.density() ?? 'comfortable';
80
+ }, ...(ngDevMode ? [{ debugName: "effectiveDensity" }] : /* istanbul ignore next */ []));
81
+ labelText = computed(() => {
82
+ const key = this.labelKey();
83
+ if (key) {
84
+ return this.translateService.translate(key);
85
+ }
86
+ return this.label();
87
+ }, ...(ngDevMode ? [{ debugName: "labelText" }] : /* istanbul ignore next */ []));
88
+ hintText = computed(() => {
89
+ const key = this.hintKey();
90
+ if (key) {
91
+ return this.translateService.translate(key);
92
+ }
93
+ return this.hint();
94
+ }, ...(ngDevMode ? [{ debugName: "hintText" }] : /* istanbul ignore next */ []));
95
+ errorText = computed(() => {
96
+ const key = this.errorKey();
97
+ if (key) {
98
+ return this.translateService.translate(key);
99
+ }
100
+ return this.error();
101
+ }, ...(ngDevMode ? [{ debugName: "errorText" }] : /* istanbul ignore next */ []));
102
+ optionalLabelText = computed(() => {
103
+ const key = this.optionalLabelKey();
104
+ if (key) {
105
+ return this.translateService.translate(key);
106
+ }
107
+ const explicit = this.optionalLabel();
108
+ if (explicit) {
109
+ return explicit;
110
+ }
111
+ return this.translateService.translate('solaris.form-field.optional');
112
+ }, ...(ngDevMode ? [{ debugName: "optionalLabelText" }] : /* istanbul ignore next */ []));
113
+ isEffectivelyDisabled = computed(() => {
114
+ const manual = this.disabled();
115
+ if (manual !== undefined) {
116
+ return manual;
117
+ }
118
+ const explicitControl = this.control();
119
+ if (explicitControl) {
120
+ return explicitControl.disabled;
121
+ }
122
+ if (this.formControl) {
123
+ return this.formControl.disabled;
124
+ }
125
+ return this.autoDetectedDisabled();
126
+ }, ...(ngDevMode ? [{ debugName: "isEffectivelyDisabled" }] : /* istanbul ignore next */ []));
127
+ isEffectivelyReadonly = computed(() => {
128
+ const manual = this.readonly();
129
+ if (manual !== undefined) {
130
+ return manual;
131
+ }
132
+ const explicitControl = this.control();
133
+ if (explicitControl) {
134
+ return explicitControl.readonly;
135
+ }
136
+ if (this.formControl) {
137
+ return this.formControl.readonly;
138
+ }
139
+ return this.autoDetectedReadonly();
140
+ }, ...(ngDevMode ? [{ debugName: "isEffectivelyReadonly" }] : /* istanbul ignore next */ []));
141
+ effectiveNgControl = computed(() => {
142
+ return (this.formControlDirective ??
143
+ this.formControlName ??
144
+ this.ngModelDir ??
145
+ null);
146
+ }, ...(ngDevMode ? [{ debugName: "effectiveNgControl" }] : /* istanbul ignore next */ []));
147
+ isAutoInvalid = computed(() => {
148
+ const control = this.effectiveNgControl();
149
+ if (!control?.control) {
150
+ return false;
151
+ }
152
+ const ctrl = control.control;
153
+ const invalid = ctrl.invalid;
154
+ const touched = ctrl.touched;
155
+ const dirty = ctrl.dirty;
156
+ const focused = this.isFocused();
157
+ if (!invalid) {
158
+ return false;
159
+ }
160
+ if (focused) {
161
+ return false;
162
+ }
163
+ return touched || dirty;
164
+ }, ...(ngDevMode ? [{ debugName: "isAutoInvalid" }] : /* istanbul ignore next */ []));
165
+ isInvalid = computed(() => {
166
+ const manual = this.invalid();
167
+ if (manual !== undefined) {
168
+ return manual;
169
+ }
170
+ const explicitControl = this.control();
171
+ if (explicitControl) {
172
+ return explicitControl.invalid;
173
+ }
174
+ if (this.formControl) {
175
+ return this.formControl.invalid && !this.isFocused();
176
+ }
177
+ return this.isAutoInvalid();
178
+ }, ...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
179
+ showError = computed(() => {
180
+ return this.isInvalid() && (!!this.errorText() || this.hasProjectedError());
181
+ }, ...(ngDevMode ? [{ debugName: "showError" }] : /* istanbul ignore next */ []));
182
+ showHint = computed(() => {
183
+ if (this.showError()) {
184
+ return false;
185
+ }
186
+ return !!this.hintText() || this.hasProjectedHint();
187
+ }, ...(ngDevMode ? [{ debugName: "showHint" }] : /* istanbul ignore next */ []));
188
+ describedBy = computed(() => {
189
+ const ids = [];
190
+ if (this.showHint()) {
191
+ ids.push(this.hintId);
192
+ }
193
+ if (this.showError()) {
194
+ ids.push(this.errorId);
195
+ }
196
+ return ids.length > 0 ? ids.join(' ') : null;
197
+ }, ...(ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []));
198
+ ngAfterContentInit() {
199
+ this.hasPrefix.set(!!this.prefix);
200
+ this.hasSuffix.set(!!this.suffix);
201
+ this.detectControl();
202
+ this.connectControl();
203
+ this.syncDescribedBy();
204
+ this.syncControlDisabledReadonly();
205
+ this.warnNoControl();
206
+ this.warnMultipleControls();
207
+ }
208
+ syncControlDisabledReadonly() {
209
+ if (!this.controlElement) {
210
+ return;
211
+ }
212
+ if (this.control()) {
213
+ return;
214
+ }
215
+ // SECURITY_EXCEPTION: Setting disabled/readonly on native control is required for FormField propagation.
216
+ const input = this.controlElement;
217
+ const shouldDisable = this.isEffectivelyDisabled();
218
+ const shouldReadonly = this.isEffectivelyReadonly();
219
+ if (input.disabled !== shouldDisable) {
220
+ input.disabled = shouldDisable;
221
+ }
222
+ if (input.readOnly !== shouldReadonly) {
223
+ input.readOnly = shouldReadonly;
224
+ }
225
+ }
226
+ syncDescribedBy() {
227
+ const describedBy = this.describedBy();
228
+ const targetControl = this.control() ?? this.formControl;
229
+ if (targetControl) {
230
+ if (describedBy) {
231
+ targetControl.setDescribedByIds(describedBy.split(' '));
232
+ }
233
+ else {
234
+ targetControl.setDescribedByIds([]);
235
+ }
236
+ }
237
+ }
238
+ describedByEffect = effect(() => {
239
+ this.describedBy();
240
+ this.syncDescribedBy();
241
+ }, ...(ngDevMode ? [{ debugName: "describedByEffect" }] : /* istanbul ignore next */ []));
242
+ ngOnDestroy() {
243
+ this.removeListeners();
244
+ }
245
+ detectControl() {
246
+ const explicitControl = this.control();
247
+ if (explicitControl) {
248
+ this.controlId = explicitControl.id;
249
+ // SECURITY_EXCEPTION: nativeElement.querySelector required to find trigger element. Standard DOM API used after Angular CDK pattern.
250
+ const triggerEl = this.elementRef.nativeElement.querySelector('[solaris-form-field-trigger]');
251
+ if (triggerEl) {
252
+ this.controlElement = triggerEl;
253
+ if (triggerEl.id) {
254
+ this.controlId = triggerEl.id;
255
+ }
256
+ this.connectControl();
257
+ }
258
+ return;
259
+ }
260
+ // SECURITY_EXCEPTION: nativeElement access required to detect projected form controls.
261
+ // SECURITY_EXCEPTION: Angular CDK and Material use the same approach.
262
+ // SECURITY_EXCEPTION: Read-only querySelectorAll, no DOM mutation.
263
+ const nativeElement = this.elementRef.nativeElement;
264
+ const children = nativeElement.querySelectorAll('input, select, textarea, [solaris-input], [solaris-select], [solaris-textarea]');
265
+ if (children.length > 0) {
266
+ const first = children[0];
267
+ this.controlElement = first;
268
+ // SECURITY_EXCEPTION: nativeElement.tagName is the standard DOM API to check element type.
269
+ const isTextarea = first.tagName === 'TEXTAREA';
270
+ this.isTextareaControl.set(isTextarea);
271
+ if (isTextarea) {
272
+ const resize = first.dataset['resize'] ?? first.getAttribute('resize');
273
+ const validResize = resize === 'none' ||
274
+ resize === 'vertical' ||
275
+ resize === 'horizontal' ||
276
+ resize === 'both'
277
+ ? resize
278
+ : 'vertical';
279
+ this.controlResize.set(validResize);
280
+ }
281
+ else {
282
+ this.controlResize.set(null);
283
+ }
284
+ }
285
+ if (this.formControl) {
286
+ this.controlId = this.formControl.id;
287
+ }
288
+ else if (this.controlElement) {
289
+ if (!this.controlElement.id) {
290
+ const generatedId = `solaris-control-${this.fieldId}`;
291
+ this.controlElement.id = generatedId;
292
+ this.controlId = generatedId;
293
+ }
294
+ else {
295
+ this.controlId = this.controlElement.id;
296
+ }
297
+ }
298
+ }
299
+ connectControl() {
300
+ if (this.controlElement) {
301
+ this.addListeners(this.controlElement);
302
+ }
303
+ }
304
+ addListeners(element) {
305
+ this.removeListeners();
306
+ this.ngZone.runOutsideAngular(() => {
307
+ const onFocus = () => {
308
+ this.ngZone.run(() => this.isFocused.set(true));
309
+ };
310
+ const onBlur = () => {
311
+ this.ngZone.run(() => this.isFocused.set(false));
312
+ };
313
+ element.addEventListener('focusin', onFocus);
314
+ element.addEventListener('focusout', onBlur);
315
+ this.focusListener = () => element.removeEventListener('focusin', onFocus);
316
+ this.blurListener = () => element.removeEventListener('focusout', onBlur);
317
+ });
318
+ }
319
+ removeListeners() {
320
+ this.focusListener?.();
321
+ this.blurListener?.();
322
+ this.focusListener = null;
323
+ this.blurListener = null;
324
+ }
325
+ warnNoControl() {
326
+ const hasAnyControl = !!this.control() ||
327
+ !!this.formControl ||
328
+ !!this.controlElement ||
329
+ !!this.effectiveNgControl();
330
+ if (!hasAnyControl) {
331
+ console.warn(`[SolarisFormField] No form control found inside <solaris-form-field id="${this.fieldId}">. ` +
332
+ 'Form Field requires a control (input, select, textarea, or a Solaris form control directive). ' +
333
+ 'This warning is shown in development only. The component will render safely without the control.');
334
+ }
335
+ }
336
+ warnMultipleControls() {
337
+ // SECURITY_EXCEPTION: nativeElement access required to count projected controls.
338
+ // SECURITY_EXCEPTION: Same justification as detectControl: read-only query, no DOM mutation.
339
+ const nativeElement = this.elementRef.nativeElement;
340
+ const children = nativeElement.querySelectorAll('input, select, textarea, [solaris-input], [solaris-select], [solaris-textarea]');
341
+ if (children.length > 1) {
342
+ console.warn(`[SolarisFormField] Multiple form controls detected inside <solaris-form-field id="${this.fieldId}">. ` +
343
+ 'Form Field v1 supports one main control. Multiple controls may cause unexpected behavior.');
344
+ }
345
+ }
346
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
347
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SolarisFormFieldComponent, isStandalone: true, selector: "solaris-form-field", inputs: { hintKey: { classPropertyName: "hintKey", publicName: "hintKey", isSignal: true, isRequired: false, transformFunction: null }, labelKey: { classPropertyName: "labelKey", publicName: "labelKey", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, errorKey: { classPropertyName: "errorKey", publicName: "errorKey", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, optionalLabel: { classPropertyName: "optionalLabel", publicName: "optionalLabel", isSignal: true, isRequired: false, transformFunction: null }, requiredLabel: { classPropertyName: "requiredLabel", publicName: "requiredLabel", isSignal: true, isRequired: false, transformFunction: null }, optionalLabelKey: { classPropertyName: "optionalLabelKey", publicName: "optionalLabelKey", isSignal: true, isRequired: false, transformFunction: null }, requiredLabelKey: { classPropertyName: "requiredLabelKey", publicName: "requiredLabelKey", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, optional: { classPropertyName: "optional", publicName: "optional", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-size": "size()", "attr.data-radius": "radius()", "attr.data-bwignore": "\"true\"", "attr.data-appearance": "appearance()", "attr.data-density": "effectiveDensity()", "attr.data-control-type": "controlType()", "attr.data-control-resize": "controlResize()", "attr.data-invalid": "isInvalid() ? \"\" : null", "attr.data-focused": "isFocused() ? \"\" : null", "attr.data-has-prefix": "hasPrefix() ? \"\" : null", "attr.data-has-suffix": "hasSuffix() ? \"\" : null", "attr.data-disabled": "isEffectivelyDisabled() ? \"\" : null", "attr.data-readonly": "isEffectivelyReadonly() ? \"\" : null" } }, queries: [{ propertyName: "projectedLabel", first: true, predicate: SolarisFormLabelComponent, descendants: true }, { propertyName: "projectedHint", first: true, predicate: SolarisFormHintComponent, descendants: true }, { propertyName: "projectedError", first: true, predicate: SolarisFormErrorComponent, descendants: true }, { propertyName: "prefix", first: true, predicate: SolarisFormPrefixDirective, descendants: true }, { propertyName: "suffix", first: true, predicate: SolarisFormSuffixDirective, descendants: true }, { propertyName: "formControl", first: true, predicate: SolarisFormControl, descendants: true }, { propertyName: "formControlDirective", first: true, predicate: FormControlDirective, descendants: true }, { propertyName: "formControlName", first: true, predicate: FormControlName, descendants: true }, { propertyName: "ngModelDir", first: true, predicate: NgModel, descendants: true }], ngImport: i0, template: "@if (labelText() || hasProjectedLabel()) {\n <div class=\"solaris-form-field__label-row\">\n @if (hasProjectedLabel()) {\n <ng-content select=\"solaris-form-label\" />\n } @else if (labelText()) {\n <label\n class=\"solaris-form-field__label\"\n [id]=\"labelId\"\n [for]=\"controlId ?? undefined\"\n >\n {{ labelText() }}\n </label>\n }\n @if (optional()) {\n <span\n class=\"solaris-form-field__optional-marker\"\n [attr.aria-label]=\"optionalLabelText()\"\n >\n {{ optionalLabelText() }}\n </span>\n }\n </div>\n}\n\n<div class=\"solaris-form-field__control-wrapper\">\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--prefix\"\n [attr.data-empty]=\"hasPrefix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-prefix]\" />\n </span>\n\n <div class=\"solaris-form-field__control\">\n <ng-content />\n </div>\n\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--suffix\"\n [attr.data-empty]=\"hasSuffix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-suffix]\" />\n </span>\n</div>\n\n<div class=\"solaris-form-field__message-row\">\n @if (showError()) {\n <div class=\"solaris-form-field__error\" [id]=\"errorId\" role=\"alert\">\n @if (hasProjectedError()) {\n <ng-content select=\"solaris-form-error\" />\n } @else {\n {{ errorText() }}\n }\n </div>\n } @else if (showHint()) {\n <div class=\"solaris-form-field__hint\" [id]=\"hintId\">\n @if (hasProjectedHint()) {\n <ng-content select=\"solaris-form-hint\" />\n } @else {\n {{ hintText() }}\n }\n </div>\n }\n</div>\n", styles: [":host{--solaris-form-field-font-size: initial;--solaris-form-field-hint-color: initial;--solaris-form-field-label-color: initial;--solaris-form-field-control-gap: initial;--solaris-form-field-error-color: initial;--solaris-form-field-prefix-color: initial;--solaris-form-field-suffix-color: initial;--solaris-form-field-control-color: initial;--solaris-form-field-control-height: initial;--solaris-form-field-control-radius: initial;--solaris-form-field-hint-font-size: initial;--solaris-form-field-optional-color: initial;--solaris-form-field-label-font-size: initial;--solaris-form-field-error-font-size: initial;--solaris-form-field-disabled-opacity: initial;--solaris-form-field-focus-ring-width: initial;--solaris-form-field-focus-ring-color: initial;--solaris-form-field-control-padding-x: initial;--solaris-form-field-label-font-weight: initial;--solaris-form-field-message-margin-top: initial;--solaris-form-field-optional-font-size: initial;--solaris-form-field-error-border-color: initial;--solaris-form-field-control-background: initial;--solaris-form-field-label-margin-bottom: initial;--solaris-form-field-readonly-background: initial;--solaris-form-field-control-border-color: initial;--solaris-form-field-control-border-width: initial;display:block;box-sizing:border-box;font-size:var(--solaris-form-field-font-size);font-family:var(--solaris-font-family-sans),system-ui}.solaris-form-field__label-row{display:flex;align-items:center;gap:var(--solaris-spacing-2);margin-bottom:var(--solaris-form-field-label-margin-bottom)}.solaris-form-field__label,::ng-deep .solaris-form-label{display:inline-block;color:var(--solaris-form-field-label-color);font-size:var(--solaris-form-field-label-font-size);font-weight:var(--solaris-form-field-label-font-weight);cursor:pointer}.solaris-form-field__optional-marker{color:var(--solaris-form-field-optional-color);font-size:var(--solaris-form-field-optional-font-size);white-space:nowrap}.solaris-form-field__control-wrapper{position:relative;display:flex;align-items:stretch;gap:var(--solaris-form-field-control-gap);min-height:var(--solaris-form-field-control-height);padding:0 var(--solaris-form-field-control-padding-x);box-sizing:border-box;border-width:var(--solaris-form-field-control-border-width);border-style:solid;border-color:var(--solaris-form-field-control-border-color);border-radius:var(--solaris-form-field-control-radius);background:var(--solaris-form-field-control-background);transition:border-color var(--solaris-motion-duration-fast) ease,box-shadow var(--solaris-motion-duration-fast) ease}:host([data-has-prefix]) .solaris-form-field__control-wrapper{padding-left:0}.solaris-form-field__control-wrapper[data-connected-side=bottom]{border-bottom-left-radius:0;border-bottom-right-radius:0}.solaris-form-field__control-wrapper[data-connected-side=top]{border-top-left-radius:0;border-top-right-radius:0}.solaris-form-field__control{display:flex;flex:1;align-items:center;min-width:0}.solaris-form-field__affix{display:flex;flex:0 0 auto;align-self:stretch;align-items:center;justify-content:center;min-width:0;box-sizing:border-box;line-height:1;cursor:default}.solaris-form-field__affix[data-empty]{display:none}.solaris-form-field__affix--prefix{inline-size:var(--solaris-form-field-control-height);color:var(--solaris-form-field-prefix-color);border-inline-end:var(--solaris-border-width-sm) solid var(--solaris-border-subtle);transition:color var(--solaris-motion-duration-fast) ease}.solaris-form-field__affix--suffix{color:var(--solaris-form-field-suffix-color);transition:color var(--solaris-motion-duration-slow) ease}.solaris-form-field__affix--prefix:hover,.solaris-form-field__affix--suffix:hover{color:var(--solaris-text-default)}:host ::ng-deep .solaris-form-prefix,:host ::ng-deep .solaris-form-suffix{display:inline-flex;flex:0 0 auto;align-self:auto;align-items:center;justify-content:center;color:inherit;border:0;line-height:1;cursor:inherit}:host ::ng-deep solaris-icon.solaris-form-prefix,:host ::ng-deep solaris-icon.solaris-form-suffix,:host ::ng-deep .solaris-form-prefix solaris-icon,:host ::ng-deep .solaris-form-suffix solaris-icon{inline-size:1em;block-size:1em;flex:0 0 auto;color:inherit;font-size:var(--solaris-font-size-lg);transition:color var(--solaris-motion-duration-slow) ease}:host([data-control-type=textarea]){min-width:0}:host([data-control-type=textarea]) .solaris-form-field__control-wrapper{padding-right:0;overflow:visible}:host([data-control-type=textarea]) .solaris-form-field__control{overflow:visible}:host([data-control-type=textarea][data-control-resize=horizontal]) .solaris-form-field__control-wrapper{width:100%;min-width:8rem;overflow:hidden;resize:horizontal}:host([data-control-type=textarea][data-control-resize=horizontal]) .solaris-form-field__control{min-width:0}:host([data-control-type=textarea][data-control-resize=horizontal]) ::ng-deep textarea[solaris-textarea]{display:block;width:100%;min-width:0;resize:none}:host([data-control-type=textarea][data-control-resize=both]) .solaris-form-field__control-wrapper{width:100%;min-width:8rem;min-height:var(--solaris-form-field-control-height);align-items:stretch;overflow:hidden;resize:both}:host([data-control-type=textarea][data-control-resize=both]) .solaris-form-field__control{align-items:stretch;min-width:0;min-height:0;overflow:hidden}:host([data-control-type=textarea][data-control-resize=both]) ::ng-deep textarea[solaris-textarea]{display:block;flex:1 1 auto;width:100%;height:100%;min-width:0;min-height:0;resize:none}.solaris-form-field__message-row{margin-top:var(--solaris-form-field-message-margin-top)}.solaris-form-field__hint{margin:var(--solaris-spacing-1);color:var(--solaris-form-field-hint-color);font-size:var(--solaris-form-field-hint-font-size)}.solaris-form-field__error{margin:var(--solaris-spacing-1);color:var(--solaris-form-field-error-color);font-size:var(--solaris-form-field-error-font-size)}:host([data-size=sm]){--solaris-form-field-control-gap: var(--solaris-spacing-1);--solaris-form-field-font-size: var(--solaris-font-size-sm);--solaris-form-field-control-height: var(--solaris-spacing-8);--solaris-form-field-control-padding-x: var(--solaris-spacing-2);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-size=md]){--solaris-form-field-control-height: var(--solaris-spacing-10);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-font-size: var(--solaris-font-size-md);--solaris-form-field-control-padding-x: var(--solaris-spacing-3);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-sm);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-size=lg]){--solaris-form-field-control-height: var(--solaris-spacing-12);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-font-size: var(--solaris-font-size-lg);--solaris-form-field-control-padding-x: var(--solaris-spacing-4);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-md);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-2);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-2);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-density=compact]){--solaris-form-field-control-height: var(--solaris-density-min-height);--solaris-form-field-control-gap: var(--solaris-spacing-1);--solaris-form-field-font-size: var(--solaris-font-size-sm);--solaris-form-field-control-padding-x: var(--solaris-spacing-2);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-density=comfortable]){--solaris-form-field-control-height: var(--solaris-density-min-height);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-control-padding-x: var(--solaris-spacing-3);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-2);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-2);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-radius=none]){--solaris-form-field-control-radius: var(--solaris-radius-none)}:host([data-radius=sm]){--solaris-form-field-control-radius: var(--solaris-radius-sm)}:host([data-radius=md]){--solaris-form-field-control-radius: var(--solaris-radius-md)}:host([data-radius=lg]){--solaris-form-field-control-radius: var(--solaris-radius-lg)}:host([data-focused]){--solaris-form-field-control-border-color: var( --solaris-form-field-focus-ring-color )}:host([data-disabled]){--solaris-form-field-control-color: var( --solaris-text-disabled, var(--solaris-text-muted) );--solaris-form-field-control-background: var( --solaris-surface-disabled, var(--solaris-surface-muted) );opacity:var(--solaris-form-field-disabled-opacity);cursor:not-allowed}:host([data-readonly]){--solaris-form-field-control-border-color: var(--solaris-border-subtle);--solaris-form-field-control-background: var( --solaris-form-field-readonly-background )}:host([data-appearance=outline]),:host([data-appearance=surface]),:host([data-appearance=filled]){--solaris-form-field-disabled-opacity: .5;--solaris-form-field-focus-ring-width: 2px;--solaris-form-field-hint-color: var(--solaris-text-muted);--solaris-form-field-prefix-color: var(--solaris-text-muted);--solaris-form-field-suffix-color: var(--solaris-text-muted);--solaris-form-field-error-color: var(--solaris-danger-text);--solaris-form-field-label-color: var(--solaris-text-default);--solaris-form-field-optional-color: var(--solaris-text-muted);--solaris-form-field-focus-ring-color: var(--solaris-primary-base);--solaris-form-field-error-border-color: var(--solaris-danger-base);--solaris-form-field-label-font-weight: var(--solaris-font-weight-medium)}:host([data-appearance=outline]){--solaris-form-field-control-border-width: var(--solaris-border-width-sm);--solaris-form-field-control-background: var(--solaris-surface-base);--solaris-form-field-readonly-background: var(--solaris-surface-muted);--solaris-form-field-control-border-color: var(--solaris-border-subtle)}:host([data-appearance=surface]){--solaris-form-field-control-border-width: 0;--solaris-form-field-readonly-background: var(--solaris-surface-base);--solaris-form-field-control-background: var(--solaris-surface-subtle);--solaris-form-field-control-border-color: var(--solaris-border-subtle)}:host([data-appearance=filled]){--solaris-form-field-control-background: var(--solaris-surface-subtle);--solaris-form-field-readonly-background: var(--solaris-surface-muted);--solaris-form-field-control-border-color: var(--solaris-border-subtle);--solaris-form-field-control-border-width: var(--solaris-border-width-sm)}:host([data-invalid]){--solaris-form-field-control-border-color: var( --solaris-form-field-error-border-color )}:host([data-invalid][data-focused]){--solaris-form-field-control-border-color: var( --solaris-form-field-error-border-color );outline-color:var(--solaris-form-field-error-border-color)}\n"] });
348
+ }
349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormFieldComponent, decorators: [{
350
+ type: Component,
351
+ args: [{ selector: 'solaris-form-field', standalone: true, imports: [], host: {
352
+ '[attr.data-size]': 'size()',
353
+ '[attr.data-radius]': 'radius()',
354
+ '[attr.data-bwignore]': '"true"',
355
+ '[attr.data-appearance]': 'appearance()',
356
+ '[attr.data-density]': 'effectiveDensity()',
357
+ '[attr.data-control-type]': 'controlType()',
358
+ '[attr.data-control-resize]': 'controlResize()',
359
+ '[attr.data-invalid]': 'isInvalid() ? "" : null',
360
+ '[attr.data-focused]': 'isFocused() ? "" : null',
361
+ '[attr.data-has-prefix]': 'hasPrefix() ? "" : null',
362
+ '[attr.data-has-suffix]': 'hasSuffix() ? "" : null',
363
+ '[attr.data-disabled]': 'isEffectivelyDisabled() ? "" : null',
364
+ '[attr.data-readonly]': 'isEffectivelyReadonly() ? "" : null',
365
+ }, template: "@if (labelText() || hasProjectedLabel()) {\n <div class=\"solaris-form-field__label-row\">\n @if (hasProjectedLabel()) {\n <ng-content select=\"solaris-form-label\" />\n } @else if (labelText()) {\n <label\n class=\"solaris-form-field__label\"\n [id]=\"labelId\"\n [for]=\"controlId ?? undefined\"\n >\n {{ labelText() }}\n </label>\n }\n @if (optional()) {\n <span\n class=\"solaris-form-field__optional-marker\"\n [attr.aria-label]=\"optionalLabelText()\"\n >\n {{ optionalLabelText() }}\n </span>\n }\n </div>\n}\n\n<div class=\"solaris-form-field__control-wrapper\">\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--prefix\"\n [attr.data-empty]=\"hasPrefix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-prefix]\" />\n </span>\n\n <div class=\"solaris-form-field__control\">\n <ng-content />\n </div>\n\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--suffix\"\n [attr.data-empty]=\"hasSuffix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-suffix]\" />\n </span>\n</div>\n\n<div class=\"solaris-form-field__message-row\">\n @if (showError()) {\n <div class=\"solaris-form-field__error\" [id]=\"errorId\" role=\"alert\">\n @if (hasProjectedError()) {\n <ng-content select=\"solaris-form-error\" />\n } @else {\n {{ errorText() }}\n }\n </div>\n } @else if (showHint()) {\n <div class=\"solaris-form-field__hint\" [id]=\"hintId\">\n @if (hasProjectedHint()) {\n <ng-content select=\"solaris-form-hint\" />\n } @else {\n {{ hintText() }}\n }\n </div>\n }\n</div>\n", styles: [":host{--solaris-form-field-font-size: initial;--solaris-form-field-hint-color: initial;--solaris-form-field-label-color: initial;--solaris-form-field-control-gap: initial;--solaris-form-field-error-color: initial;--solaris-form-field-prefix-color: initial;--solaris-form-field-suffix-color: initial;--solaris-form-field-control-color: initial;--solaris-form-field-control-height: initial;--solaris-form-field-control-radius: initial;--solaris-form-field-hint-font-size: initial;--solaris-form-field-optional-color: initial;--solaris-form-field-label-font-size: initial;--solaris-form-field-error-font-size: initial;--solaris-form-field-disabled-opacity: initial;--solaris-form-field-focus-ring-width: initial;--solaris-form-field-focus-ring-color: initial;--solaris-form-field-control-padding-x: initial;--solaris-form-field-label-font-weight: initial;--solaris-form-field-message-margin-top: initial;--solaris-form-field-optional-font-size: initial;--solaris-form-field-error-border-color: initial;--solaris-form-field-control-background: initial;--solaris-form-field-label-margin-bottom: initial;--solaris-form-field-readonly-background: initial;--solaris-form-field-control-border-color: initial;--solaris-form-field-control-border-width: initial;display:block;box-sizing:border-box;font-size:var(--solaris-form-field-font-size);font-family:var(--solaris-font-family-sans),system-ui}.solaris-form-field__label-row{display:flex;align-items:center;gap:var(--solaris-spacing-2);margin-bottom:var(--solaris-form-field-label-margin-bottom)}.solaris-form-field__label,::ng-deep .solaris-form-label{display:inline-block;color:var(--solaris-form-field-label-color);font-size:var(--solaris-form-field-label-font-size);font-weight:var(--solaris-form-field-label-font-weight);cursor:pointer}.solaris-form-field__optional-marker{color:var(--solaris-form-field-optional-color);font-size:var(--solaris-form-field-optional-font-size);white-space:nowrap}.solaris-form-field__control-wrapper{position:relative;display:flex;align-items:stretch;gap:var(--solaris-form-field-control-gap);min-height:var(--solaris-form-field-control-height);padding:0 var(--solaris-form-field-control-padding-x);box-sizing:border-box;border-width:var(--solaris-form-field-control-border-width);border-style:solid;border-color:var(--solaris-form-field-control-border-color);border-radius:var(--solaris-form-field-control-radius);background:var(--solaris-form-field-control-background);transition:border-color var(--solaris-motion-duration-fast) ease,box-shadow var(--solaris-motion-duration-fast) ease}:host([data-has-prefix]) .solaris-form-field__control-wrapper{padding-left:0}.solaris-form-field__control-wrapper[data-connected-side=bottom]{border-bottom-left-radius:0;border-bottom-right-radius:0}.solaris-form-field__control-wrapper[data-connected-side=top]{border-top-left-radius:0;border-top-right-radius:0}.solaris-form-field__control{display:flex;flex:1;align-items:center;min-width:0}.solaris-form-field__affix{display:flex;flex:0 0 auto;align-self:stretch;align-items:center;justify-content:center;min-width:0;box-sizing:border-box;line-height:1;cursor:default}.solaris-form-field__affix[data-empty]{display:none}.solaris-form-field__affix--prefix{inline-size:var(--solaris-form-field-control-height);color:var(--solaris-form-field-prefix-color);border-inline-end:var(--solaris-border-width-sm) solid var(--solaris-border-subtle);transition:color var(--solaris-motion-duration-fast) ease}.solaris-form-field__affix--suffix{color:var(--solaris-form-field-suffix-color);transition:color var(--solaris-motion-duration-slow) ease}.solaris-form-field__affix--prefix:hover,.solaris-form-field__affix--suffix:hover{color:var(--solaris-text-default)}:host ::ng-deep .solaris-form-prefix,:host ::ng-deep .solaris-form-suffix{display:inline-flex;flex:0 0 auto;align-self:auto;align-items:center;justify-content:center;color:inherit;border:0;line-height:1;cursor:inherit}:host ::ng-deep solaris-icon.solaris-form-prefix,:host ::ng-deep solaris-icon.solaris-form-suffix,:host ::ng-deep .solaris-form-prefix solaris-icon,:host ::ng-deep .solaris-form-suffix solaris-icon{inline-size:1em;block-size:1em;flex:0 0 auto;color:inherit;font-size:var(--solaris-font-size-lg);transition:color var(--solaris-motion-duration-slow) ease}:host([data-control-type=textarea]){min-width:0}:host([data-control-type=textarea]) .solaris-form-field__control-wrapper{padding-right:0;overflow:visible}:host([data-control-type=textarea]) .solaris-form-field__control{overflow:visible}:host([data-control-type=textarea][data-control-resize=horizontal]) .solaris-form-field__control-wrapper{width:100%;min-width:8rem;overflow:hidden;resize:horizontal}:host([data-control-type=textarea][data-control-resize=horizontal]) .solaris-form-field__control{min-width:0}:host([data-control-type=textarea][data-control-resize=horizontal]) ::ng-deep textarea[solaris-textarea]{display:block;width:100%;min-width:0;resize:none}:host([data-control-type=textarea][data-control-resize=both]) .solaris-form-field__control-wrapper{width:100%;min-width:8rem;min-height:var(--solaris-form-field-control-height);align-items:stretch;overflow:hidden;resize:both}:host([data-control-type=textarea][data-control-resize=both]) .solaris-form-field__control{align-items:stretch;min-width:0;min-height:0;overflow:hidden}:host([data-control-type=textarea][data-control-resize=both]) ::ng-deep textarea[solaris-textarea]{display:block;flex:1 1 auto;width:100%;height:100%;min-width:0;min-height:0;resize:none}.solaris-form-field__message-row{margin-top:var(--solaris-form-field-message-margin-top)}.solaris-form-field__hint{margin:var(--solaris-spacing-1);color:var(--solaris-form-field-hint-color);font-size:var(--solaris-form-field-hint-font-size)}.solaris-form-field__error{margin:var(--solaris-spacing-1);color:var(--solaris-form-field-error-color);font-size:var(--solaris-form-field-error-font-size)}:host([data-size=sm]){--solaris-form-field-control-gap: var(--solaris-spacing-1);--solaris-form-field-font-size: var(--solaris-font-size-sm);--solaris-form-field-control-height: var(--solaris-spacing-8);--solaris-form-field-control-padding-x: var(--solaris-spacing-2);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-size=md]){--solaris-form-field-control-height: var(--solaris-spacing-10);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-font-size: var(--solaris-font-size-md);--solaris-form-field-control-padding-x: var(--solaris-spacing-3);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-sm);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-size=lg]){--solaris-form-field-control-height: var(--solaris-spacing-12);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-font-size: var(--solaris-font-size-lg);--solaris-form-field-control-padding-x: var(--solaris-spacing-4);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-md);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-2);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-2);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-density=compact]){--solaris-form-field-control-height: var(--solaris-density-min-height);--solaris-form-field-control-gap: var(--solaris-spacing-1);--solaris-form-field-font-size: var(--solaris-font-size-sm);--solaris-form-field-control-padding-x: var(--solaris-spacing-2);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-label-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-1);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-1);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-density=comfortable]){--solaris-form-field-control-height: var(--solaris-density-min-height);--solaris-form-field-control-gap: var(--solaris-spacing-2);--solaris-form-field-control-padding-x: var(--solaris-spacing-3);--solaris-form-field-hint-font-size: var(--solaris-font-size-xs);--solaris-form-field-error-font-size: var(--solaris-font-size-xs);--solaris-form-field-message-margin-top: var(--solaris-spacing-2);--solaris-form-field-label-margin-bottom: var(--solaris-spacing-2);--solaris-form-field-optional-font-size: var(--solaris-font-size-xs)}:host([data-radius=none]){--solaris-form-field-control-radius: var(--solaris-radius-none)}:host([data-radius=sm]){--solaris-form-field-control-radius: var(--solaris-radius-sm)}:host([data-radius=md]){--solaris-form-field-control-radius: var(--solaris-radius-md)}:host([data-radius=lg]){--solaris-form-field-control-radius: var(--solaris-radius-lg)}:host([data-focused]){--solaris-form-field-control-border-color: var( --solaris-form-field-focus-ring-color )}:host([data-disabled]){--solaris-form-field-control-color: var( --solaris-text-disabled, var(--solaris-text-muted) );--solaris-form-field-control-background: var( --solaris-surface-disabled, var(--solaris-surface-muted) );opacity:var(--solaris-form-field-disabled-opacity);cursor:not-allowed}:host([data-readonly]){--solaris-form-field-control-border-color: var(--solaris-border-subtle);--solaris-form-field-control-background: var( --solaris-form-field-readonly-background )}:host([data-appearance=outline]),:host([data-appearance=surface]),:host([data-appearance=filled]){--solaris-form-field-disabled-opacity: .5;--solaris-form-field-focus-ring-width: 2px;--solaris-form-field-hint-color: var(--solaris-text-muted);--solaris-form-field-prefix-color: var(--solaris-text-muted);--solaris-form-field-suffix-color: var(--solaris-text-muted);--solaris-form-field-error-color: var(--solaris-danger-text);--solaris-form-field-label-color: var(--solaris-text-default);--solaris-form-field-optional-color: var(--solaris-text-muted);--solaris-form-field-focus-ring-color: var(--solaris-primary-base);--solaris-form-field-error-border-color: var(--solaris-danger-base);--solaris-form-field-label-font-weight: var(--solaris-font-weight-medium)}:host([data-appearance=outline]){--solaris-form-field-control-border-width: var(--solaris-border-width-sm);--solaris-form-field-control-background: var(--solaris-surface-base);--solaris-form-field-readonly-background: var(--solaris-surface-muted);--solaris-form-field-control-border-color: var(--solaris-border-subtle)}:host([data-appearance=surface]){--solaris-form-field-control-border-width: 0;--solaris-form-field-readonly-background: var(--solaris-surface-base);--solaris-form-field-control-background: var(--solaris-surface-subtle);--solaris-form-field-control-border-color: var(--solaris-border-subtle)}:host([data-appearance=filled]){--solaris-form-field-control-background: var(--solaris-surface-subtle);--solaris-form-field-readonly-background: var(--solaris-surface-muted);--solaris-form-field-control-border-color: var(--solaris-border-subtle);--solaris-form-field-control-border-width: var(--solaris-border-width-sm)}:host([data-invalid]){--solaris-form-field-control-border-color: var( --solaris-form-field-error-border-color )}:host([data-invalid][data-focused]){--solaris-form-field-control-border-color: var( --solaris-form-field-error-border-color );outline-color:var(--solaris-form-field-error-border-color)}\n"] }]
366
+ }], ctorParameters: () => [], propDecorators: { hintKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "hintKey", required: false }] }], labelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelKey", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorKey", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], optionalLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionalLabel", required: false }] }], requiredLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredLabel", required: false }] }], optionalLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionalLabelKey", required: false }] }], requiredLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "requiredLabelKey", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], optional: [{ type: i0.Input, args: [{ isSignal: true, alias: "optional", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }], projectedLabel: [{
367
+ type: ContentChild,
368
+ args: [SolarisFormLabelComponent]
369
+ }], projectedHint: [{
370
+ type: ContentChild,
371
+ args: [SolarisFormHintComponent]
372
+ }], projectedError: [{
373
+ type: ContentChild,
374
+ args: [SolarisFormErrorComponent]
375
+ }], prefix: [{
376
+ type: ContentChild,
377
+ args: [SolarisFormPrefixDirective]
378
+ }], suffix: [{
379
+ type: ContentChild,
380
+ args: [SolarisFormSuffixDirective]
381
+ }], formControl: [{
382
+ type: ContentChild,
383
+ args: [SolarisFormControl]
384
+ }], formControlDirective: [{
385
+ type: ContentChild,
386
+ args: [FormControlDirective]
387
+ }], formControlName: [{
388
+ type: ContentChild,
389
+ args: [FormControlName]
390
+ }], ngModelDir: [{
391
+ type: ContentChild,
392
+ args: [NgModel]
393
+ }] } });
394
+ //# sourceMappingURL=form-field.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field.component.js","sourceRoot":"","sources":["../../../../../../../../../packages/angular/src/lib/components/forms/form-field/component/form-field.component.ts","../../../../../../../../../packages/angular/src/lib/components/forms/form-field/component/form-field.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\r\n Component,\r\n input,\r\n computed,\r\n signal,\r\n effect,\r\n ContentChild,\r\n AfterContentInit,\r\n OnDestroy,\r\n ElementRef,\r\n inject,\r\n NgZone,\r\n} from '@angular/core';\r\nimport { FormControlDirective, FormControlName, NgModel } from '@angular/forms';\r\n\r\nimport { SolarisFormPrefixDirective } from '../directives/form-prefix.directive';\r\nimport { SolarisFormSuffixDirective } from '../directives/form-suffix.directive';\r\nimport { SolarisTranslateService } from '../../../../services/translation';\r\nimport { SolarisFormControl } from '../model/form-control.contract';\r\nimport { SolarisFormLabelComponent } from './form-label.component';\r\nimport { SolarisFormErrorComponent } from './form-error.component';\r\nimport { SolarisFormHintComponent } from './form-hint.component';\r\n\r\nimport type {\r\n SolarisFormFieldAppearance,\r\n SolarisFormFieldSize,\r\n SolarisFormFieldDensity,\r\n SolarisFormFieldRadius,\r\n ControlResize,\r\n} from '../model/form-field.types';\r\n\r\nlet nextId = 0;\r\nfunction generateId(): string {\r\n return `solaris-form-field-${++nextId}`;\r\n}\r\n\r\n@Component({\r\n selector: 'solaris-form-field',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss'],\r\n host: {\r\n '[attr.data-size]': 'size()',\r\n '[attr.data-radius]': 'radius()',\r\n '[attr.data-bwignore]': '\"true\"',\r\n '[attr.data-appearance]': 'appearance()',\r\n '[attr.data-density]': 'effectiveDensity()',\r\n '[attr.data-control-type]': 'controlType()',\r\n '[attr.data-control-resize]': 'controlResize()',\r\n '[attr.data-invalid]': 'isInvalid() ? \"\" : null',\r\n '[attr.data-focused]': 'isFocused() ? \"\" : null',\r\n '[attr.data-has-prefix]': 'hasPrefix() ? \"\" : null',\r\n '[attr.data-has-suffix]': 'hasSuffix() ? \"\" : null',\r\n '[attr.data-disabled]': 'isEffectivelyDisabled() ? \"\" : null',\r\n '[attr.data-readonly]': 'isEffectivelyReadonly() ? \"\" : null',\r\n },\r\n})\r\nexport class SolarisFormFieldComponent implements AfterContentInit, OnDestroy {\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly translateService = inject(SolarisTranslateService);\r\n private readonly ngZone = inject(NgZone);\r\n\r\n constructor() {\r\n // SECURITY_EXCEPTION: Setting disabled/readonly on native control is standard DOM API.\r\n // SECURITY_EXCEPTION: Required for FormField to propagate disabled/readonly state to projected control.\r\n effect(() => {\r\n this.isEffectivelyDisabled();\r\n this.isEffectivelyReadonly();\r\n this.syncControlDisabledReadonly();\r\n });\r\n }\r\n\r\n readonly hintKey = input<string>();\r\n readonly labelKey = input<string>();\r\n readonly hint = input<string>('');\r\n readonly errorKey = input<string>();\r\n readonly label = input<string>('');\r\n readonly error = input<string>('');\r\n readonly optionalLabel = input<string>();\r\n readonly requiredLabel = input<string>();\r\n readonly optionalLabelKey = input<string>();\r\n readonly requiredLabelKey = input<string>();\r\n readonly required = input<boolean>(false);\r\n readonly optional = input<boolean>(false);\r\n readonly invalid = input<boolean | undefined>();\r\n readonly disabled = input<boolean | undefined>();\r\n readonly readonly = input<boolean | undefined>();\r\n readonly density = input<SolarisFormFieldDensity>();\r\n readonly size = input<SolarisFormFieldSize>('md');\r\n readonly radius = input<SolarisFormFieldRadius>('md');\r\n readonly appearance = input<SolarisFormFieldAppearance>('outline');\r\n readonly control = input<SolarisFormControl | undefined>(undefined);\r\n\r\n @ContentChild(SolarisFormLabelComponent)\r\n protected projectedLabel?: SolarisFormLabelComponent;\r\n @ContentChild(SolarisFormHintComponent)\r\n protected projectedHint?: SolarisFormHintComponent;\r\n @ContentChild(SolarisFormErrorComponent)\r\n protected projectedError?: SolarisFormErrorComponent;\r\n @ContentChild(SolarisFormPrefixDirective)\r\n protected prefix?: SolarisFormPrefixDirective;\r\n @ContentChild(SolarisFormSuffixDirective)\r\n protected suffix?: SolarisFormSuffixDirective;\r\n @ContentChild(SolarisFormControl)\r\n protected formControl?: SolarisFormControl;\r\n @ContentChild(FormControlDirective)\r\n protected formControlDirective?: FormControlDirective;\r\n @ContentChild(FormControlName)\r\n protected formControlName?: FormControlName;\r\n @ContentChild(NgModel)\r\n protected ngModelDir?: NgModel;\r\n\r\n protected readonly fieldId = generateId();\r\n protected readonly hintId = `solaris-form-field-hint-${this.fieldId}`;\r\n protected readonly errorId = `solaris-form-field-error-${this.fieldId}`;\r\n protected readonly labelId = `solaris-form-field-label-${this.fieldId}`;\r\n\r\n protected readonly isFocused = signal(false);\r\n protected readonly isTextareaControl = signal(false);\r\n protected readonly autoDetectedDisabled = signal(false);\r\n protected readonly autoDetectedReadonly = signal(false);\r\n protected readonly controlResize = signal<ControlResize | null>(null);\r\n\r\n protected controlId: string | null = null;\r\n private controlElement: HTMLElement | null = null;\r\n private focusListener: (() => void) | null = null;\r\n private blurListener: (() => void) | null = null;\r\n\r\n protected readonly hasProjectedLabel = computed(() => !!this.projectedLabel);\r\n protected readonly hasProjectedHint = computed(() => !!this.projectedHint);\r\n protected readonly hasProjectedError = computed(() => !!this.projectedError);\r\n protected readonly hasPrefix = signal(false);\r\n protected readonly hasSuffix = signal(false);\r\n\r\n protected readonly controlType = computed<\r\n 'input' | 'textarea' | 'select' | 'other'\r\n >(() => {\r\n return this.isTextareaControl() ? 'textarea' : 'other';\r\n });\r\n\r\n protected readonly effectiveDensity = computed<SolarisFormFieldDensity>(\r\n () => {\r\n return this.density() ?? 'comfortable';\r\n },\r\n );\r\n\r\n protected readonly labelText = computed(() => {\r\n const key = this.labelKey();\r\n if (key) {\r\n return this.translateService.translate(key);\r\n }\r\n return this.label();\r\n });\r\n\r\n protected readonly hintText = computed(() => {\r\n const key = this.hintKey();\r\n if (key) {\r\n return this.translateService.translate(key);\r\n }\r\n return this.hint();\r\n });\r\n\r\n protected readonly errorText = computed(() => {\r\n const key = this.errorKey();\r\n if (key) {\r\n return this.translateService.translate(key);\r\n }\r\n return this.error();\r\n });\r\n\r\n protected readonly optionalLabelText = computed(() => {\r\n const key = this.optionalLabelKey();\r\n if (key) {\r\n return this.translateService.translate(key);\r\n }\r\n const explicit = this.optionalLabel();\r\n if (explicit) {\r\n return explicit;\r\n }\r\n return this.translateService.translate('solaris.form-field.optional');\r\n });\r\n\r\n protected readonly isEffectivelyDisabled = computed(() => {\r\n const manual = this.disabled();\r\n if (manual !== undefined) {\r\n return manual;\r\n }\r\n const explicitControl = this.control();\r\n if (explicitControl) {\r\n return explicitControl.disabled;\r\n }\r\n if (this.formControl) {\r\n return this.formControl.disabled;\r\n }\r\n return this.autoDetectedDisabled();\r\n });\r\n\r\n protected readonly isEffectivelyReadonly = computed(() => {\r\n const manual = this.readonly();\r\n if (manual !== undefined) {\r\n return manual;\r\n }\r\n const explicitControl = this.control();\r\n if (explicitControl) {\r\n return explicitControl.readonly;\r\n }\r\n if (this.formControl) {\r\n return this.formControl.readonly;\r\n }\r\n return this.autoDetectedReadonly();\r\n });\r\n\r\n protected readonly effectiveNgControl = computed(() => {\r\n return (\r\n this.formControlDirective ??\r\n this.formControlName ??\r\n this.ngModelDir ??\r\n null\r\n );\r\n });\r\n\r\n protected readonly isAutoInvalid = computed(() => {\r\n const control = this.effectiveNgControl();\r\n if (!control?.control) {\r\n return false;\r\n }\r\n const ctrl = control.control;\r\n const invalid = ctrl.invalid;\r\n const touched = ctrl.touched;\r\n const dirty = ctrl.dirty;\r\n const focused = this.isFocused();\r\n if (!invalid) {\r\n return false;\r\n }\r\n if (focused) {\r\n return false;\r\n }\r\n return touched || dirty;\r\n });\r\n\r\n protected readonly isInvalid = computed(() => {\r\n const manual = this.invalid();\r\n if (manual !== undefined) {\r\n return manual;\r\n }\r\n const explicitControl = this.control();\r\n if (explicitControl) {\r\n return explicitControl.invalid;\r\n }\r\n if (this.formControl) {\r\n return this.formControl.invalid && !this.isFocused();\r\n }\r\n return this.isAutoInvalid();\r\n });\r\n\r\n protected readonly showError = computed(() => {\r\n return this.isInvalid() && (!!this.errorText() || this.hasProjectedError());\r\n });\r\n\r\n protected readonly showHint = computed(() => {\r\n if (this.showError()) {\r\n return false;\r\n }\r\n return !!this.hintText() || this.hasProjectedHint();\r\n });\r\n\r\n protected readonly describedBy = computed(() => {\r\n const ids: string[] = [];\r\n if (this.showHint()) {\r\n ids.push(this.hintId);\r\n }\r\n if (this.showError()) {\r\n ids.push(this.errorId);\r\n }\r\n return ids.length > 0 ? ids.join(' ') : null;\r\n });\r\n\r\n ngAfterContentInit(): void {\r\n this.hasPrefix.set(!!this.prefix);\r\n this.hasSuffix.set(!!this.suffix);\r\n this.detectControl();\r\n this.connectControl();\r\n this.syncDescribedBy();\r\n this.syncControlDisabledReadonly();\r\n this.warnNoControl();\r\n this.warnMultipleControls();\r\n }\r\n\r\n private syncControlDisabledReadonly(): void {\r\n if (!this.controlElement) {\r\n return;\r\n }\r\n if (this.control()) {\r\n return;\r\n }\r\n // SECURITY_EXCEPTION: Setting disabled/readonly on native control is required for FormField propagation.\r\n const input = this.controlElement as HTMLInputElement;\r\n const shouldDisable = this.isEffectivelyDisabled();\r\n const shouldReadonly = this.isEffectivelyReadonly();\r\n if (input.disabled !== shouldDisable) {\r\n input.disabled = shouldDisable;\r\n }\r\n if (input.readOnly !== shouldReadonly) {\r\n input.readOnly = shouldReadonly;\r\n }\r\n }\r\n\r\n private syncDescribedBy(): void {\r\n const describedBy = this.describedBy();\r\n const targetControl = this.control() ?? this.formControl;\r\n if (targetControl) {\r\n if (describedBy) {\r\n targetControl.setDescribedByIds(describedBy.split(' '));\r\n } else {\r\n targetControl.setDescribedByIds([]);\r\n }\r\n }\r\n }\r\n\r\n protected readonly describedByEffect = effect(() => {\r\n this.describedBy();\r\n this.syncDescribedBy();\r\n });\r\n\r\n ngOnDestroy(): void {\r\n this.removeListeners();\r\n }\r\n\r\n private detectControl(): void {\r\n const explicitControl = this.control();\r\n if (explicitControl) {\r\n this.controlId = explicitControl.id;\r\n // SECURITY_EXCEPTION: nativeElement.querySelector required to find trigger element. Standard DOM API used after Angular CDK pattern.\r\n const triggerEl = this.elementRef.nativeElement.querySelector(\r\n '[solaris-form-field-trigger]',\r\n );\r\n if (triggerEl) {\r\n this.controlElement = triggerEl as HTMLElement;\r\n if (triggerEl.id) {\r\n this.controlId = triggerEl.id;\r\n }\r\n this.connectControl();\r\n }\r\n return;\r\n }\r\n\r\n // SECURITY_EXCEPTION: nativeElement access required to detect projected form controls.\r\n // SECURITY_EXCEPTION: Angular CDK and Material use the same approach.\r\n // SECURITY_EXCEPTION: Read-only querySelectorAll, no DOM mutation.\r\n const nativeElement = this.elementRef.nativeElement;\r\n const children = nativeElement.querySelectorAll(\r\n 'input, select, textarea, [solaris-input], [solaris-select], [solaris-textarea]',\r\n );\r\n\r\n if (children.length > 0) {\r\n const first = children[0] as HTMLElement;\r\n this.controlElement = first;\r\n // SECURITY_EXCEPTION: nativeElement.tagName is the standard DOM API to check element type.\r\n const isTextarea = first.tagName === 'TEXTAREA';\r\n this.isTextareaControl.set(isTextarea);\r\n\r\n if (isTextarea) {\r\n const resize = first.dataset['resize'] ?? first.getAttribute('resize');\r\n\r\n const validResize: ControlResize =\r\n resize === 'none' ||\r\n resize === 'vertical' ||\r\n resize === 'horizontal' ||\r\n resize === 'both'\r\n ? resize\r\n : 'vertical';\r\n\r\n this.controlResize.set(validResize);\r\n } else {\r\n this.controlResize.set(null);\r\n }\r\n }\r\n\r\n if (this.formControl) {\r\n this.controlId = this.formControl.id;\r\n } else if (this.controlElement) {\r\n if (!this.controlElement.id) {\r\n const generatedId = `solaris-control-${this.fieldId}`;\r\n this.controlElement.id = generatedId;\r\n this.controlId = generatedId;\r\n } else {\r\n this.controlId = this.controlElement.id;\r\n }\r\n }\r\n }\r\n\r\n private connectControl(): void {\r\n if (this.controlElement) {\r\n this.addListeners(this.controlElement);\r\n }\r\n }\r\n\r\n private addListeners(element: HTMLElement): void {\r\n this.removeListeners();\r\n this.ngZone.runOutsideAngular(() => {\r\n const onFocus = (): void => {\r\n this.ngZone.run(() => this.isFocused.set(true));\r\n };\r\n const onBlur = (): void => {\r\n this.ngZone.run(() => this.isFocused.set(false));\r\n };\r\n element.addEventListener('focusin', onFocus);\r\n element.addEventListener('focusout', onBlur);\r\n this.focusListener = () =>\r\n element.removeEventListener('focusin', onFocus);\r\n this.blurListener = () => element.removeEventListener('focusout', onBlur);\r\n });\r\n }\r\n\r\n private removeListeners(): void {\r\n this.focusListener?.();\r\n this.blurListener?.();\r\n this.focusListener = null;\r\n this.blurListener = null;\r\n }\r\n\r\n private warnNoControl(): void {\r\n const hasAnyControl =\r\n !!this.control() ||\r\n !!this.formControl ||\r\n !!this.controlElement ||\r\n !!this.effectiveNgControl();\r\n if (!hasAnyControl) {\r\n console.warn(\r\n `[SolarisFormField] No form control found inside <solaris-form-field id=\"${this.fieldId}\">. ` +\r\n 'Form Field requires a control (input, select, textarea, or a Solaris form control directive). ' +\r\n 'This warning is shown in development only. The component will render safely without the control.',\r\n );\r\n }\r\n }\r\n\r\n private warnMultipleControls(): void {\r\n // SECURITY_EXCEPTION: nativeElement access required to count projected controls.\r\n // SECURITY_EXCEPTION: Same justification as detectControl: read-only query, no DOM mutation.\r\n const nativeElement = this.elementRef.nativeElement;\r\n const children = nativeElement.querySelectorAll(\r\n 'input, select, textarea, [solaris-input], [solaris-select], [solaris-textarea]',\r\n );\r\n if (children.length > 1) {\r\n console.warn(\r\n `[SolarisFormField] Multiple form controls detected inside <solaris-form-field id=\"${this.fieldId}\">. ` +\r\n 'Form Field v1 supports one main control. Multiple controls may cause unexpected behavior.',\r\n );\r\n }\r\n }\r\n}\r\n","@if (labelText() || hasProjectedLabel()) {\n <div class=\"solaris-form-field__label-row\">\n @if (hasProjectedLabel()) {\n <ng-content select=\"solaris-form-label\" />\n } @else if (labelText()) {\n <label\n class=\"solaris-form-field__label\"\n [id]=\"labelId\"\n [for]=\"controlId ?? undefined\"\n >\n {{ labelText() }}\n </label>\n }\n @if (optional()) {\n <span\n class=\"solaris-form-field__optional-marker\"\n [attr.aria-label]=\"optionalLabelText()\"\n >\n {{ optionalLabelText() }}\n </span>\n }\n </div>\n}\n\n<div class=\"solaris-form-field__control-wrapper\">\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--prefix\"\n [attr.data-empty]=\"hasPrefix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-prefix]\" />\n </span>\n\n <div class=\"solaris-form-field__control\">\n <ng-content />\n </div>\n\n <span\n class=\"solaris-form-field__affix solaris-form-field__affix--suffix\"\n [attr.data-empty]=\"hasSuffix() ? null : ''\"\n >\n <ng-content select=\"[solaris-form-suffix]\" />\n </span>\n</div>\n\n<div class=\"solaris-form-field__message-row\">\n @if (showError()) {\n <div class=\"solaris-form-field__error\" [id]=\"errorId\" role=\"alert\">\n @if (hasProjectedError()) {\n <ng-content select=\"solaris-form-error\" />\n } @else {\n {{ errorText() }}\n }\n </div>\n } @else if (showHint()) {\n <div class=\"solaris-form-field__hint\" [id]=\"hintId\">\n @if (hasProjectedHint()) {\n <ng-content select=\"solaris-form-hint\" />\n } @else {\n {{ hintText() }}\n }\n </div>\n }\n</div>\n"]}
@@ -0,0 +1,18 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SolarisFormHintComponent {
4
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormHintComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: SolarisFormHintComponent, isStandalone: true, selector: "solaris-form-hint", host: { classAttribute: "solaris-form-hint" }, ngImport: i0, template: '<ng-content />', isInline: true });
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormHintComponent, decorators: [{
8
+ type: Component,
9
+ args: [{
10
+ selector: 'solaris-form-hint',
11
+ standalone: true,
12
+ template: '<ng-content />',
13
+ host: {
14
+ class: 'solaris-form-hint',
15
+ },
16
+ }]
17
+ }] });
18
+ //# sourceMappingURL=form-hint.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-hint.component.js","sourceRoot":"","sources":["../../../../../../../../../packages/angular/src/lib/components/forms/form-field/component/form-hint.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;AAU1C,MAAM,OAAO,wBAAwB;wGAAxB,wBAAwB;4FAAxB,wBAAwB,4HALzB,gBAAgB;;4FAKf,wBAAwB;kBARpC,SAAS;mBAAC;oBACT,QAAQ,EAAE,mBAAmB;oBAC7B,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,gBAAgB;oBAC1B,IAAI,EAAE;wBACJ,KAAK,EAAE,mBAAmB;qBAC3B;iBACF","sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'solaris-form-hint',\n standalone: true,\n template: '<ng-content />',\n host: {\n class: 'solaris-form-hint',\n },\n})\nexport class SolarisFormHintComponent {}\n"]}
@@ -0,0 +1,18 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SolarisFormLabelComponent {
4
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: SolarisFormLabelComponent, isStandalone: true, selector: "solaris-form-label", host: { classAttribute: "solaris-form-label" }, ngImport: i0, template: '<ng-content />', isInline: true });
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormLabelComponent, decorators: [{
8
+ type: Component,
9
+ args: [{
10
+ selector: 'solaris-form-label',
11
+ standalone: true,
12
+ template: '<ng-content />',
13
+ host: {
14
+ class: 'solaris-form-label',
15
+ },
16
+ }]
17
+ }] });
18
+ //# sourceMappingURL=form-label.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-label.component.js","sourceRoot":"","sources":["../../../../../../../../../packages/angular/src/lib/components/forms/form-field/component/form-label.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;AAU1C,MAAM,OAAO,yBAAyB;wGAAzB,yBAAyB;4FAAzB,yBAAyB,8HAL1B,gBAAgB;;4FAKf,yBAAyB;kBARrC,SAAS;mBAAC;oBACT,QAAQ,EAAE,oBAAoB;oBAC9B,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,gBAAgB;oBAC1B,IAAI,EAAE;wBACJ,KAAK,EAAE,oBAAoB;qBAC5B;iBACF","sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'solaris-form-label',\n standalone: true,\n template: '<ng-content />',\n host: {\n class: 'solaris-form-label',\n },\n})\nexport class SolarisFormLabelComponent {}\n"]}
@@ -0,0 +1,14 @@
1
+ import { Directive } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SolarisFormFieldTriggerDirective {
4
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormFieldTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: SolarisFormFieldTriggerDirective, isStandalone: true, selector: "[solaris-form-field-trigger]", ngImport: i0 });
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormFieldTriggerDirective, decorators: [{
8
+ type: Directive,
9
+ args: [{
10
+ selector: '[solaris-form-field-trigger]',
11
+ standalone: true,
12
+ }]
13
+ }] });
14
+ //# sourceMappingURL=form-field-trigger.directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field-trigger.directive.js","sourceRoot":"","sources":["../../../../../../../../../packages/angular/src/lib/components/forms/form-field/directives/form-field-trigger.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;AAM1C,MAAM,OAAO,gCAAgC;wGAAhC,gCAAgC;4FAAhC,gCAAgC;;4FAAhC,gCAAgC;kBAJ5C,SAAS;mBAAC;oBACT,QAAQ,EAAE,8BAA8B;oBACxC,UAAU,EAAE,IAAI;iBACjB","sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[solaris-form-field-trigger]',\r\n standalone: true,\r\n})\r\nexport class SolarisFormFieldTriggerDirective {}\r\n"]}
@@ -0,0 +1,17 @@
1
+ import { Directive } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class SolarisFormPrefixDirective {
4
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormPrefixDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.17", type: SolarisFormPrefixDirective, isStandalone: true, selector: "[solaris-form-prefix]", host: { classAttribute: "solaris-form-prefix" }, ngImport: i0 });
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SolarisFormPrefixDirective, decorators: [{
8
+ type: Directive,
9
+ args: [{
10
+ selector: '[solaris-form-prefix]',
11
+ standalone: true,
12
+ host: {
13
+ class: 'solaris-form-prefix',
14
+ },
15
+ }]
16
+ }] });
17
+ //# sourceMappingURL=form-prefix.directive.js.map