@star-ng/ui 0.0.0-placeholder.0 → 0.1.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -3
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +782 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +392 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1556 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +978 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2523 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3477 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +281 -5
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +118 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5803 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +310 -0
  173. package/types/star-ng-ui-data-display.d.ts +339 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +197 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +540 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +829 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +310 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1,517 @@
1
+ import { _IdGenerator } from "@angular/cdk/a11y";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, booleanAttribute, computed, inject, input, model, output, signal, viewChild } from "@angular/core";
4
+ import { STAR_UI_TEXT } from "@star-ng/ui/core";
5
+ import { StarField } from "@star-ng/ui/field";
6
+ function starPasswordRules(text, minLength = 12) {
7
+ return [
8
+ {
9
+ label: text.passwordRuleLength(minLength),
10
+ test: (v) => v.length >= minLength
11
+ },
12
+ {
13
+ label: text.passwordRuleUpper,
14
+ test: (v) => /\p{Lu}/u.test(v)
15
+ },
16
+ {
17
+ label: text.passwordRuleLower,
18
+ test: (v) => /\p{Ll}/u.test(v)
19
+ },
20
+ {
21
+ label: text.passwordRuleNumber,
22
+ test: (v) => /\d/.test(v)
23
+ },
24
+ {
25
+ label: text.passwordRuleSymbol,
26
+ test: (v) => /[^\p{L}\d\s]/u.test(v)
27
+ }
28
+ ];
29
+ }
30
+ var StarPassword = class StarPassword {
31
+ text = inject(STAR_UI_TEXT);
32
+ field = inject(StarField, { optional: true });
33
+ ids = inject(_IdGenerator);
34
+ value = model("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
35
+ feedback = input(false, {
36
+ ...ngDevMode ? { debugName: "feedback" } : /* istanbul ignore next */ {},
37
+ transform: booleanAttribute
38
+ });
39
+ rules = input(null, ...ngDevMode ? [{ debugName: "rules" }] : /* istanbul ignore next */ []);
40
+ minLength = input(void 0, ...ngDevMode ? [{ debugName: "minLength" }] : /* istanbul ignore next */ []);
41
+ activeRules = computed(() => this.rules() ?? starPasswordRules(this.text, this.minLength() ?? 12), ...ngDevMode ? [{ debugName: "activeRules" }] : /* istanbul ignore next */ []);
42
+ placeholder = input(null, ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
43
+ autocomplete = input(null, ...ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []);
44
+ ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
45
+ inputId = input(this.ids.getId("star-password-"), ...ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []);
46
+ disabled = input(false, {
47
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
48
+ transform: booleanAttribute
49
+ });
50
+ readonly = input(false, {
51
+ ...ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {},
52
+ transform: booleanAttribute
53
+ });
54
+ required = input(false, {
55
+ ...ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {},
56
+ transform: booleanAttribute
57
+ });
58
+ invalid = input(false, {
59
+ ...ngDevMode ? { debugName: "invalid" } : /* istanbul ignore next */ {},
60
+ transform: booleanAttribute
61
+ });
62
+ touched = input(false, {
63
+ ...ngDevMode ? { debugName: "touched" } : /* istanbul ignore next */ {},
64
+ transform: booleanAttribute
65
+ });
66
+ name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
67
+ touch = output();
68
+ feedbackId = this.ids.getId("star-password-feedback-");
69
+ showInvalid = computed(() => this.invalid() && this.touched() || !!this.field?.errorText(), ...ngDevMode ? [{ debugName: "showInvalid" }] : /* istanbul ignore next */ []);
70
+ describedBy = computed(() => [this.field?.describedBy(), this.feedback() ? this.feedbackId : null].filter(Boolean).join(" ") || null, ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
71
+ constructor() {
72
+ this.field?.linkControl(this.inputId);
73
+ }
74
+ masked = signal(true, ...ngDevMode ? [{ debugName: "masked" }] : /* istanbul ignore next */ []);
75
+ bars = [
76
+ 0,
77
+ 1,
78
+ 2,
79
+ 3
80
+ ];
81
+ input = viewChild.required("input", ...ngDevMode ? [{ debugName: "input" }] : /* istanbul ignore next */ []);
82
+ score = computed(() => {
83
+ const rules = this.activeRules();
84
+ if (!this.value() || !rules.length) return 0;
85
+ const met = rules.filter((rule) => rule.test(this.value())).length;
86
+ return Math.max(1, Math.round(met / rules.length * 4));
87
+ }, ...ngDevMode ? [{ debugName: "score" }] : /* istanbul ignore next */ []);
88
+ level = computed(() => [
89
+ "weak",
90
+ "weak",
91
+ "fair",
92
+ "good",
93
+ "strong"
94
+ ][this.score()], ...ngDevMode ? [{ debugName: "level" }] : /* istanbul ignore next */ []);
95
+ levelText = computed(() => {
96
+ const level = this.level();
97
+ return level === "weak" ? this.text.passwordWeak : level === "fair" ? this.text.passwordFair : level === "good" ? this.text.passwordGood : this.text.passwordStrong;
98
+ }, ...ngDevMode ? [{ debugName: "levelText" }] : /* istanbul ignore next */ []);
99
+ focus(options) {
100
+ this.input().nativeElement.focus(options);
101
+ }
102
+ static ɵfac = i0.ɵɵngDeclareFactory({
103
+ minVersion: "12.0.0",
104
+ version: "22.2.6",
105
+ ngImport: i0,
106
+ type: StarPassword,
107
+ deps: [],
108
+ target: i0.ɵɵFactoryTarget.Component
109
+ });
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({
111
+ minVersion: "17.0.0",
112
+ version: "22.2.6",
113
+ type: StarPassword,
114
+ isStandalone: true,
115
+ selector: "star-password",
116
+ inputs: {
117
+ value: {
118
+ classPropertyName: "value",
119
+ publicName: "value",
120
+ isSignal: true,
121
+ isRequired: false,
122
+ transformFunction: null
123
+ },
124
+ feedback: {
125
+ classPropertyName: "feedback",
126
+ publicName: "feedback",
127
+ isSignal: true,
128
+ isRequired: false,
129
+ transformFunction: null
130
+ },
131
+ rules: {
132
+ classPropertyName: "rules",
133
+ publicName: "rules",
134
+ isSignal: true,
135
+ isRequired: false,
136
+ transformFunction: null
137
+ },
138
+ minLength: {
139
+ classPropertyName: "minLength",
140
+ publicName: "minLength",
141
+ isSignal: true,
142
+ isRequired: false,
143
+ transformFunction: null
144
+ },
145
+ placeholder: {
146
+ classPropertyName: "placeholder",
147
+ publicName: "placeholder",
148
+ isSignal: true,
149
+ isRequired: false,
150
+ transformFunction: null
151
+ },
152
+ autocomplete: {
153
+ classPropertyName: "autocomplete",
154
+ publicName: "autocomplete",
155
+ isSignal: true,
156
+ isRequired: false,
157
+ transformFunction: null
158
+ },
159
+ ariaLabel: {
160
+ classPropertyName: "ariaLabel",
161
+ publicName: "ariaLabel",
162
+ isSignal: true,
163
+ isRequired: false,
164
+ transformFunction: null
165
+ },
166
+ inputId: {
167
+ classPropertyName: "inputId",
168
+ publicName: "inputId",
169
+ isSignal: true,
170
+ isRequired: false,
171
+ transformFunction: null
172
+ },
173
+ disabled: {
174
+ classPropertyName: "disabled",
175
+ publicName: "disabled",
176
+ isSignal: true,
177
+ isRequired: false,
178
+ transformFunction: null
179
+ },
180
+ readonly: {
181
+ classPropertyName: "readonly",
182
+ publicName: "readonly",
183
+ isSignal: true,
184
+ isRequired: false,
185
+ transformFunction: null
186
+ },
187
+ required: {
188
+ classPropertyName: "required",
189
+ publicName: "required",
190
+ isSignal: true,
191
+ isRequired: false,
192
+ transformFunction: null
193
+ },
194
+ invalid: {
195
+ classPropertyName: "invalid",
196
+ publicName: "invalid",
197
+ isSignal: true,
198
+ isRequired: false,
199
+ transformFunction: null
200
+ },
201
+ touched: {
202
+ classPropertyName: "touched",
203
+ publicName: "touched",
204
+ isSignal: true,
205
+ isRequired: false,
206
+ transformFunction: null
207
+ },
208
+ name: {
209
+ classPropertyName: "name",
210
+ publicName: "name",
211
+ isSignal: true,
212
+ isRequired: false,
213
+ transformFunction: null
214
+ }
215
+ },
216
+ outputs: {
217
+ value: "valueChange",
218
+ touch: "touch"
219
+ },
220
+ host: {
221
+ properties: { "class.star-password--invalid": "showInvalid()" },
222
+ classAttribute: "star-password"
223
+ },
224
+ viewQueries: [{
225
+ propertyName: "input",
226
+ first: true,
227
+ predicate: ["input"],
228
+ descendants: true,
229
+ isSignal: true
230
+ }],
231
+ ngImport: i0,
232
+ template: `
233
+ <div class="star-password__control">
234
+ <input
235
+ #input
236
+ class="star-password__input"
237
+ [type]="masked() ? 'password' : 'text'"
238
+ [id]="inputId()"
239
+ [attr.name]="name() || null"
240
+ [value]="value()"
241
+ [attr.placeholder]="placeholder()"
242
+ [attr.autocomplete]="autocomplete() ?? (feedback() ? 'new-password' : 'current-password')"
243
+ [disabled]="disabled()"
244
+ [readOnly]="readonly()"
245
+ [required]="required()"
246
+ [attr.aria-label]="ariaLabel()"
247
+ [attr.aria-describedby]="describedBy()"
248
+ [attr.aria-invalid]="showInvalid() || null"
249
+ (input)="value.set(input.value)"
250
+ (blur)="touch.emit()"
251
+ />
252
+ <button
253
+ type="button"
254
+ class="star-select__icon-btn"
255
+ [attr.aria-label]="masked() ? text.showPassword : text.hidePassword"
256
+ [attr.aria-pressed]="!masked()"
257
+ [disabled]="disabled()"
258
+ (click)="masked.set(!masked())"
259
+ >
260
+ <i
261
+ class="ph-bold"
262
+ [class.ph-eye]="masked()"
263
+ [class.ph-eye-slash]="!masked()"
264
+ aria-hidden="true"
265
+ ></i>
266
+ </button>
267
+ </div>
268
+ @if (feedback()) {
269
+ <div class="star-password__feedback" [id]="feedbackId">
270
+ <div class="star-password__meter" aria-hidden="true">
271
+ @for (bar of bars; track bar) {
272
+ <span
273
+ class="star-password__bar"
274
+ [class.star-password__bar--on]="bar < score()"
275
+ [attr.data-level]="level()"
276
+ ></span>
277
+ }
278
+ </div>
279
+ <p class="star-password__level" aria-live="polite">
280
+ {{ value() ? levelText() : '' }}
281
+ </p>
282
+ <ul class="star-password__rules">
283
+ @for (rule of activeRules(); track $index) {
284
+ @let ok = rule.test(value());
285
+ <li [class.star-password__rule--ok]="ok">
286
+ <i
287
+ class="ph-bold"
288
+ [class.ph-check-circle]="ok"
289
+ [class.ph-circle]="!ok"
290
+ aria-hidden="true"
291
+ ></i>
292
+ {{ rule.label
293
+ }}<span class="star-sr-only">{{ ': ' + (ok ? text.ruleMet : text.ruleNotMet) }}</span>
294
+ </li>
295
+ }
296
+ </ul>
297
+ </div>
298
+ }
299
+ `,
300
+ isInline: true,
301
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
302
+ });
303
+ };
304
+ i0.ɵɵngDeclareClassMetadata({
305
+ minVersion: "12.0.0",
306
+ version: "22.2.6",
307
+ ngImport: i0,
308
+ type: StarPassword,
309
+ decorators: [{
310
+ type: Component,
311
+ args: [{
312
+ selector: "star-password",
313
+ changeDetection: ChangeDetectionStrategy.OnPush,
314
+ host: {
315
+ class: "star-password",
316
+ "[class.star-password--invalid]": "showInvalid()"
317
+ },
318
+ template: `
319
+ <div class="star-password__control">
320
+ <input
321
+ #input
322
+ class="star-password__input"
323
+ [type]="masked() ? 'password' : 'text'"
324
+ [id]="inputId()"
325
+ [attr.name]="name() || null"
326
+ [value]="value()"
327
+ [attr.placeholder]="placeholder()"
328
+ [attr.autocomplete]="autocomplete() ?? (feedback() ? 'new-password' : 'current-password')"
329
+ [disabled]="disabled()"
330
+ [readOnly]="readonly()"
331
+ [required]="required()"
332
+ [attr.aria-label]="ariaLabel()"
333
+ [attr.aria-describedby]="describedBy()"
334
+ [attr.aria-invalid]="showInvalid() || null"
335
+ (input)="value.set(input.value)"
336
+ (blur)="touch.emit()"
337
+ />
338
+ <button
339
+ type="button"
340
+ class="star-select__icon-btn"
341
+ [attr.aria-label]="masked() ? text.showPassword : text.hidePassword"
342
+ [attr.aria-pressed]="!masked()"
343
+ [disabled]="disabled()"
344
+ (click)="masked.set(!masked())"
345
+ >
346
+ <i
347
+ class="ph-bold"
348
+ [class.ph-eye]="masked()"
349
+ [class.ph-eye-slash]="!masked()"
350
+ aria-hidden="true"
351
+ ></i>
352
+ </button>
353
+ </div>
354
+ @if (feedback()) {
355
+ <div class="star-password__feedback" [id]="feedbackId">
356
+ <div class="star-password__meter" aria-hidden="true">
357
+ @for (bar of bars; track bar) {
358
+ <span
359
+ class="star-password__bar"
360
+ [class.star-password__bar--on]="bar < score()"
361
+ [attr.data-level]="level()"
362
+ ></span>
363
+ }
364
+ </div>
365
+ <p class="star-password__level" aria-live="polite">
366
+ {{ value() ? levelText() : '' }}
367
+ </p>
368
+ <ul class="star-password__rules">
369
+ @for (rule of activeRules(); track $index) {
370
+ @let ok = rule.test(value());
371
+ <li [class.star-password__rule--ok]="ok">
372
+ <i
373
+ class="ph-bold"
374
+ [class.ph-check-circle]="ok"
375
+ [class.ph-circle]="!ok"
376
+ aria-hidden="true"
377
+ ></i>
378
+ {{ rule.label
379
+ }}<span class="star-sr-only">{{ ': ' + (ok ? text.ruleMet : text.ruleNotMet) }}</span>
380
+ </li>
381
+ }
382
+ </ul>
383
+ </div>
384
+ }
385
+ `
386
+ }]
387
+ }],
388
+ ctorParameters: () => [],
389
+ propDecorators: {
390
+ value: [{
391
+ type: i0.Input,
392
+ args: [{
393
+ isSignal: true,
394
+ alias: "value",
395
+ required: false
396
+ }]
397
+ }, {
398
+ type: i0.Output,
399
+ args: ["valueChange"]
400
+ }],
401
+ feedback: [{
402
+ type: i0.Input,
403
+ args: [{
404
+ isSignal: true,
405
+ alias: "feedback",
406
+ required: false
407
+ }]
408
+ }],
409
+ rules: [{
410
+ type: i0.Input,
411
+ args: [{
412
+ isSignal: true,
413
+ alias: "rules",
414
+ required: false
415
+ }]
416
+ }],
417
+ minLength: [{
418
+ type: i0.Input,
419
+ args: [{
420
+ isSignal: true,
421
+ alias: "minLength",
422
+ required: false
423
+ }]
424
+ }],
425
+ placeholder: [{
426
+ type: i0.Input,
427
+ args: [{
428
+ isSignal: true,
429
+ alias: "placeholder",
430
+ required: false
431
+ }]
432
+ }],
433
+ autocomplete: [{
434
+ type: i0.Input,
435
+ args: [{
436
+ isSignal: true,
437
+ alias: "autocomplete",
438
+ required: false
439
+ }]
440
+ }],
441
+ ariaLabel: [{
442
+ type: i0.Input,
443
+ args: [{
444
+ isSignal: true,
445
+ alias: "ariaLabel",
446
+ required: false
447
+ }]
448
+ }],
449
+ inputId: [{
450
+ type: i0.Input,
451
+ args: [{
452
+ isSignal: true,
453
+ alias: "inputId",
454
+ required: false
455
+ }]
456
+ }],
457
+ disabled: [{
458
+ type: i0.Input,
459
+ args: [{
460
+ isSignal: true,
461
+ alias: "disabled",
462
+ required: false
463
+ }]
464
+ }],
465
+ readonly: [{
466
+ type: i0.Input,
467
+ args: [{
468
+ isSignal: true,
469
+ alias: "readonly",
470
+ required: false
471
+ }]
472
+ }],
473
+ required: [{
474
+ type: i0.Input,
475
+ args: [{
476
+ isSignal: true,
477
+ alias: "required",
478
+ required: false
479
+ }]
480
+ }],
481
+ invalid: [{
482
+ type: i0.Input,
483
+ args: [{
484
+ isSignal: true,
485
+ alias: "invalid",
486
+ required: false
487
+ }]
488
+ }],
489
+ touched: [{
490
+ type: i0.Input,
491
+ args: [{
492
+ isSignal: true,
493
+ alias: "touched",
494
+ required: false
495
+ }]
496
+ }],
497
+ name: [{
498
+ type: i0.Input,
499
+ args: [{
500
+ isSignal: true,
501
+ alias: "name",
502
+ required: false
503
+ }]
504
+ }],
505
+ touch: [{
506
+ type: i0.Output,
507
+ args: ["touch"]
508
+ }],
509
+ input: [{
510
+ type: i0.ViewChild,
511
+ args: ["input", { isSignal: true }]
512
+ }]
513
+ }
514
+ });
515
+ export { StarPassword, starPasswordRules };
516
+
517
+ //# sourceMappingURL=star-ng-ui-password.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-password.mjs","names":[],"sources":["../../../projects/star-ng/password/password.ts"],"sourcesContent":["import { _IdGenerator } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport type { FormValueControl } from '@angular/forms/signals';\nimport { STAR_UI_TEXT, StarUiText } from '@star-ng/ui/core';\nimport { StarField } from '@star-ng/ui/field';\n\nexport interface StarPasswordRule {\n readonly label: string;\n readonly test: (value: string) => boolean;\n}\n\n/** Default rules, labelled from the control texts (so they follow the active language). */\nexport function starPasswordRules(text: StarUiText, minLength = 12): readonly StarPasswordRule[] {\n return [\n { label: text.passwordRuleLength(minLength), test: (v) => v.length >= minLength },\n { label: text.passwordRuleUpper, test: (v) => /\\p{Lu}/u.test(v) },\n { label: text.passwordRuleLower, test: (v) => /\\p{Ll}/u.test(v) },\n { label: text.passwordRuleNumber, test: (v) => /\\d/.test(v) },\n { label: text.passwordRuleSymbol, test: (v) => /[^\\p{L}\\d\\s]/u.test(v) },\n ];\n}\n\n/**\n * Password field (PrimeNG `p-password`): show / hide toggle, strength meter and a rule\n * checklist (`feedback`), `autocomplete` defaults to `new-password` with feedback,\n * `current-password` without.\n *\n * `<star-password [formField]=\"form.newPassword\" feedback />`\n */\n@Component({\n selector: 'star-password',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-password',\n '[class.star-password--invalid]': 'showInvalid()',\n },\n template: `\n <div class=\"star-password__control\">\n <input\n #input\n class=\"star-password__input\"\n [type]=\"masked() ? 'password' : 'text'\"\n [id]=\"inputId()\"\n [attr.name]=\"name() || null\"\n [value]=\"value()\"\n [attr.placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() ?? (feedback() ? 'new-password' : 'current-password')\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"showInvalid() || null\"\n (input)=\"value.set(input.value)\"\n (blur)=\"touch.emit()\"\n />\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"masked() ? text.showPassword : text.hidePassword\"\n [attr.aria-pressed]=\"!masked()\"\n [disabled]=\"disabled()\"\n (click)=\"masked.set(!masked())\"\n >\n <i\n class=\"ph-bold\"\n [class.ph-eye]=\"masked()\"\n [class.ph-eye-slash]=\"!masked()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n @if (feedback()) {\n <div class=\"star-password__feedback\" [id]=\"feedbackId\">\n <div class=\"star-password__meter\" aria-hidden=\"true\">\n @for (bar of bars; track bar) {\n <span\n class=\"star-password__bar\"\n [class.star-password__bar--on]=\"bar < score()\"\n [attr.data-level]=\"level()\"\n ></span>\n }\n </div>\n <p class=\"star-password__level\" aria-live=\"polite\">\n {{ value() ? levelText() : '' }}\n </p>\n <ul class=\"star-password__rules\">\n @for (rule of activeRules(); track $index) {\n @let ok = rule.test(value());\n <li [class.star-password__rule--ok]=\"ok\">\n <i\n class=\"ph-bold\"\n [class.ph-check-circle]=\"ok\"\n [class.ph-circle]=\"!ok\"\n aria-hidden=\"true\"\n ></i>\n {{ rule.label\n }}<span class=\"star-sr-only\">{{ ': ' + (ok ? text.ruleMet : text.ruleNotMet) }}</span>\n </li>\n }\n </ul>\n </div>\n }\n `,\n})\nexport class StarPassword implements FormValueControl<string> {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly field = inject(StarField, { optional: true });\n private readonly ids = inject(_IdGenerator);\n\n readonly value = model('');\n readonly feedback = input(false, { transform: booleanAttribute });\n /** Custom rules. Default: length (`minLength`), upper, lower, number and symbol. */\n readonly rules = input<readonly StarPasswordRule[] | null>(null);\n /** Length rule; also bound from a Signal Forms `minLength()` validator. Default 12. */\n readonly minLength = input<number | undefined>(undefined);\n protected readonly activeRules = computed(\n () => this.rules() ?? starPasswordRules(this.text, this.minLength() ?? 12),\n );\n readonly placeholder = input<string | null>(null);\n readonly autocomplete = input<string | null>(null);\n readonly ariaLabel = input<string | null>(null);\n readonly inputId = input(this.ids.getId('star-password-'));\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly touched = input(false, { transform: booleanAttribute });\n readonly name = input('');\n readonly touch = output<void>();\n\n protected readonly feedbackId = this.ids.getId('star-password-feedback-');\n /** Invalid after touch, or while the parent `star-field` shows an error. */\n protected readonly showInvalid = computed(\n () => (this.invalid() && this.touched()) || !!this.field?.errorText(),\n );\n /** Field error or hint, then the strength feedback. */\n protected readonly describedBy = computed(\n () =>\n [this.field?.describedBy(), this.feedback() ? this.feedbackId : null]\n .filter(Boolean)\n .join(' ') || null,\n );\n\n constructor() {\n this.field?.linkControl(this.inputId);\n }\n protected readonly masked = signal(true);\n protected readonly bars = [0, 1, 2, 3];\n private readonly input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n\n /** Rules met, scaled to 0–4 bars. */\n protected readonly score = computed(() => {\n const rules = this.activeRules();\n if (!this.value() || !rules.length) return 0;\n const met = rules.filter((rule) => rule.test(this.value())).length;\n return Math.max(1, Math.round((met / rules.length) * 4));\n });\n protected readonly level = computed<'weak' | 'fair' | 'good' | 'strong'>(\n () => (['weak', 'weak', 'fair', 'good', 'strong'] as const)[this.score()],\n );\n protected readonly levelText = computed(() => {\n const level = this.level();\n return level === 'weak'\n ? this.text.passwordWeak\n : level === 'fair'\n ? this.text.passwordFair\n : level === 'good'\n ? this.text.passwordGood\n : this.text.passwordStrong;\n });\n\n focus(options?: FocusOptions): void {\n this.input().nativeElement.focus(options);\n }\n}\n"],"mappings":"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"}