@weeehaoooz/talos-ui 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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs +237 -0
  4. package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +1 -0
  5. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +93 -0
  6. package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +1 -0
  7. package/fesm2022/weeehaoooz-talos-ui-core.mjs +438 -0
  8. package/fesm2022/weeehaoooz-talos-ui-core.mjs.map +1 -0
  9. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +233 -0
  10. package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +1 -0
  11. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +361 -0
  12. package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +1 -0
  13. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +312 -0
  14. package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +1 -0
  15. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +235 -0
  16. package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +1 -0
  17. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +462 -0
  18. package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +1 -0
  19. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +805 -0
  20. package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +1 -0
  21. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +267 -0
  22. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +1 -0
  23. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +351 -0
  24. package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +1 -0
  25. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +566 -0
  26. package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +1 -0
  27. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +534 -0
  28. package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +1 -0
  29. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +446 -0
  30. package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +1 -0
  31. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +376 -0
  32. package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +1 -0
  33. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +147 -0
  34. package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +1 -0
  35. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +242 -0
  36. package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +1 -0
  37. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +514 -0
  38. package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +1 -0
  39. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +548 -0
  40. package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +1 -0
  41. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +692 -0
  42. package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +1 -0
  43. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +761 -0
  44. package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +1 -0
  45. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +896 -0
  46. package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +1 -0
  47. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +872 -0
  48. package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +1 -0
  49. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +119 -0
  50. package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +1 -0
  51. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +135 -0
  52. package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +1 -0
  53. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +666 -0
  54. package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +1 -0
  55. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +147 -0
  56. package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +1 -0
  57. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +33 -0
  58. package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +1 -0
  59. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +455 -0
  60. package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +1 -0
  61. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +379 -0
  62. package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +1 -0
  63. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +297 -0
  64. package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +1 -0
  65. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +661 -0
  66. package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +1 -0
  67. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +346 -0
  68. package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +1 -0
  69. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +896 -0
  70. package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +1 -0
  71. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +252 -0
  72. package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +1 -0
  73. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +916 -0
  74. package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +1 -0
  75. package/fesm2022/weeehaoooz-talos-ui-layout.mjs +851 -0
  76. package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -0
  77. package/fesm2022/weeehaoooz-talos-ui-nav.mjs +897 -0
  78. package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -0
  79. package/fesm2022/weeehaoooz-talos-ui.mjs +17058 -0
  80. package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -0
  81. package/package.json +203 -0
  82. package/schematics/collection.json +10 -0
  83. package/schematics/ng-add/index.d.ts +3 -0
  84. package/schematics/ng-add/index.js +99 -0
  85. package/schematics/ng-add/schema.d.ts +10 -0
  86. package/schematics/ng-add/schema.js +2 -0
  87. package/schematics/ng-add/schema.json +52 -0
  88. package/styles/_alert.scss +56 -0
  89. package/styles/_badge.scss +279 -0
  90. package/styles/_button-group.scss +470 -0
  91. package/styles/_buttons.scss +442 -0
  92. package/styles/_card.scss +18 -0
  93. package/styles/_dialog.scss +116 -0
  94. package/styles/_drop-zone.scss +19 -0
  95. package/styles/_form-controls.scss +660 -0
  96. package/styles/_slide-toggle.scss +171 -0
  97. package/styles/_status-tag.scss +108 -0
  98. package/styles/_timeline.scss +19 -0
  99. package/styles/_tooltip.scss +32 -0
  100. package/styles/_typography.scss +279 -0
  101. package/styles/_variables.scss +590 -0
  102. package/styles/index.scss +15 -0
  103. package/types/weeehaoooz-talos-ui-button-button-group.d.ts +59 -0
  104. package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +1 -0
  105. package/types/weeehaoooz-talos-ui-button-button.d.ts +38 -0
  106. package/types/weeehaoooz-talos-ui-button-button.d.ts.map +1 -0
  107. package/types/weeehaoooz-talos-ui-core.d.ts +95 -0
  108. package/types/weeehaoooz-talos-ui-core.d.ts.map +1 -0
  109. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +119 -0
  110. package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +1 -0
  111. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +135 -0
  112. package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +1 -0
  113. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +144 -0
  114. package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +1 -0
  115. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +83 -0
  116. package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +1 -0
  117. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +255 -0
  118. package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +1 -0
  119. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +204 -0
  120. package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +1 -0
  121. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +101 -0
  122. package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +1 -0
  123. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +138 -0
  124. package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +1 -0
  125. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +161 -0
  126. package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +1 -0
  127. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +212 -0
  128. package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +1 -0
  129. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +259 -0
  130. package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +1 -0
  131. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +147 -0
  132. package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +1 -0
  133. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +32 -0
  134. package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +1 -0
  135. package/types/weeehaoooz-talos-ui-form-affix.d.ts +88 -0
  136. package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +1 -0
  137. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +113 -0
  138. package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +1 -0
  139. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +165 -0
  140. package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +1 -0
  141. package/types/weeehaoooz-talos-ui-form-chips.d.ts +152 -0
  142. package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +1 -0
  143. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +144 -0
  144. package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +1 -0
  145. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +138 -0
  146. package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +1 -0
  147. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +148 -0
  148. package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +1 -0
  149. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +44 -0
  150. package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +1 -0
  151. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +48 -0
  152. package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +1 -0
  153. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +227 -0
  154. package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +1 -0
  155. package/types/weeehaoooz-talos-ui-form-form-field.d.ts +42 -0
  156. package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +1 -0
  157. package/types/weeehaoooz-talos-ui-form-input.d.ts +15 -0
  158. package/types/weeehaoooz-talos-ui-form-input.d.ts.map +1 -0
  159. package/types/weeehaoooz-talos-ui-form-otp.d.ts +111 -0
  160. package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +1 -0
  161. package/types/weeehaoooz-talos-ui-form-password-input.d.ts +145 -0
  162. package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +1 -0
  163. package/types/weeehaoooz-talos-ui-form-radio.d.ts +84 -0
  164. package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +1 -0
  165. package/types/weeehaoooz-talos-ui-form-range-input.d.ts +181 -0
  166. package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +1 -0
  167. package/types/weeehaoooz-talos-ui-form-rating.d.ts +110 -0
  168. package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +1 -0
  169. package/types/weeehaoooz-talos-ui-form-select-input.d.ts +195 -0
  170. package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +1 -0
  171. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +79 -0
  172. package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +1 -0
  173. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +192 -0
  174. package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +1 -0
  175. package/types/weeehaoooz-talos-ui-layout.d.ts +286 -0
  176. package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -0
  177. package/types/weeehaoooz-talos-ui-nav.d.ts +384 -0
  178. package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -0
  179. package/types/weeehaoooz-talos-ui.d.ts +5050 -0
  180. package/types/weeehaoooz-talos-ui.d.ts.map +1 -0
@@ -0,0 +1,379 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, effect, untracked, forwardRef, ViewChild, Component, inject, ElementRef, Directive, NgModule } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { LucideLock, LucideEye, LucideEyeOff, LucideCheck, LucideX } from '@lucide/angular';
5
+
6
+ /**
7
+ * Default rule set provided out-of-the-box.
8
+ */
9
+ const DEFAULT_PASSWORD_RULES = [
10
+ {
11
+ id: 'min-length',
12
+ label: 'At least 8 characters',
13
+ minLength: 8,
14
+ validator: (p) => p.length >= 8,
15
+ weight: 1
16
+ },
17
+ {
18
+ id: 'lowercase',
19
+ label: 'At least 1 lowercase letter (a-z)',
20
+ pattern: /[a-z]/,
21
+ weight: 1
22
+ },
23
+ {
24
+ id: 'uppercase',
25
+ label: 'At least 1 uppercase letter (A-Z)',
26
+ pattern: /[A-Z]/,
27
+ weight: 1
28
+ },
29
+ {
30
+ id: 'number',
31
+ label: 'At least 1 number (0-9)',
32
+ pattern: /[0-9]/,
33
+ weight: 1
34
+ },
35
+ {
36
+ id: 'special',
37
+ label: 'At least 1 special character (!@#$%^&*)',
38
+ pattern: /[^A-Za-z0-9]/,
39
+ weight: 1
40
+ }
41
+ ];
42
+ const DEFAULT_STRENGTH_LABELS = {
43
+ 'very-weak': 'Very Weak',
44
+ 'weak': 'Weak',
45
+ 'fair': 'Fair',
46
+ 'good': 'Good',
47
+ 'strong': 'Strong',
48
+ 'very-strong': 'Very Strong'
49
+ };
50
+
51
+ let uniquePasswordId = 0;
52
+ class TalosPasswordInputComponent {
53
+ inputElementRef;
54
+ autoId = `talos-password-${++uniquePasswordId}`;
55
+ // ─── Value & Sizing Inputs ──────────────────────────────────────────
56
+ value = input('', /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
58
+ placeholder = input('Enter password', /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
60
+ size = input('md', /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
62
+ disabled = input(false, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
64
+ readonly = input(false, /* @ts-ignore */
65
+ ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
66
+ invalid = input(false, /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
68
+ id = input('', /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
70
+ name = input('', /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
72
+ autocomplete = input('current-password', /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []));
74
+ ariaLabel = input('Password', /* @ts-ignore */
75
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
76
+ // ─── Visual & Prefix / Suffix Features ──────────────────────────────
77
+ showPrefixIcon = input(true, /* @ts-ignore */
78
+ ...(ngDevMode ? [{ debugName: "showPrefixIcon" }] : /* istanbul ignore next */ []));
79
+ allowToggleMask = input(true, /* @ts-ignore */
80
+ ...(ngDevMode ? [{ debugName: "allowToggleMask" }] : /* istanbul ignore next */ []));
81
+ masked = input(true, /* @ts-ignore */
82
+ ...(ngDevMode ? [{ debugName: "masked" }] : /* istanbul ignore next */ []));
83
+ maskToggleAriaLabel = input('Toggle password visibility', /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "maskToggleAriaLabel" }] : /* istanbul ignore next */ []));
85
+ // ─── Strength Meter & Rules Configuration ───────────────────────────
86
+ showStrengthMeter = input(false, /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "showStrengthMeter" }] : /* istanbul ignore next */ []));
88
+ meterVariant = input('segmented', /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "meterVariant" }] : /* istanbul ignore next */ []));
90
+ showStrengthLabel = input(true, /* @ts-ignore */
91
+ ...(ngDevMode ? [{ debugName: "showStrengthLabel" }] : /* istanbul ignore next */ []));
92
+ showRuleList = input(false, /* @ts-ignore */
93
+ ...(ngDevMode ? [{ debugName: "showRuleList" }] : /* istanbul ignore next */ []));
94
+ rules = input(DEFAULT_PASSWORD_RULES, { ...(ngDevMode ? { debugName: "rules" } : /* istanbul ignore next */ {}), transform: (val) => val ?? DEFAULT_PASSWORD_RULES });
95
+ strengthLabels = input(DEFAULT_STRENGTH_LABELS, { ...(ngDevMode ? { debugName: "strengthLabels" } : /* istanbul ignore next */ {}), transform: (val) => val ?? DEFAULT_STRENGTH_LABELS });
96
+ strengthCalculator = input(undefined, /* @ts-ignore */
97
+ ...(ngDevMode ? [{ debugName: "strengthCalculator" }] : /* istanbul ignore next */ []));
98
+ // ─── Outputs ────────────────────────────────────────────────────────
99
+ valueChange = output();
100
+ maskChange = output();
101
+ strengthChange = output();
102
+ inputFocus = output();
103
+ inputBlur = output();
104
+ // ─── Internal Reactive State ────────────────────────────────────────
105
+ innerValue = signal('', /* @ts-ignore */
106
+ ...(ngDevMode ? [{ debugName: "innerValue" }] : /* istanbul ignore next */ []));
107
+ isMasked = signal(true, /* @ts-ignore */
108
+ ...(ngDevMode ? [{ debugName: "isMasked" }] : /* istanbul ignore next */ []));
109
+ isFocused = signal(false, /* @ts-ignore */
110
+ ...(ngDevMode ? [{ debugName: "isFocused" }] : /* istanbul ignore next */ []));
111
+ formDisabled = signal(false, /* @ts-ignore */
112
+ ...(ngDevMode ? [{ debugName: "formDisabled" }] : /* istanbul ignore next */ []));
113
+ onChange = () => { };
114
+ onTouched = () => { };
115
+ elementId = computed(() => this.id() || this.autoId, /* @ts-ignore */
116
+ ...(ngDevMode ? [{ debugName: "elementId" }] : /* istanbul ignore next */ []));
117
+ strengthMeterId = computed(() => `${this.elementId()}-strength-meter`, /* @ts-ignore */
118
+ ...(ngDevMode ? [{ debugName: "strengthMeterId" }] : /* istanbul ignore next */ []));
119
+ effectiveDisabled = computed(() => this.disabled() || this.formDisabled(), /* @ts-ignore */
120
+ ...(ngDevMode ? [{ debugName: "effectiveDisabled" }] : /* istanbul ignore next */ []));
121
+ effectiveInvalid = computed(() => this.invalid(), /* @ts-ignore */
122
+ ...(ngDevMode ? [{ debugName: "effectiveInvalid" }] : /* istanbul ignore next */ []));
123
+ // ─── Strength Computation ───────────────────────────────────────────
124
+ strengthResult = computed(() => {
125
+ const pwd = this.innerValue();
126
+ const activeRules = this.rules() ?? DEFAULT_PASSWORD_RULES;
127
+ const customCalc = this.strengthCalculator();
128
+ if (customCalc) {
129
+ return customCalc(pwd, activeRules);
130
+ }
131
+ return this.calculateStrength(pwd, activeRules);
132
+ }, /* @ts-ignore */
133
+ ...(ngDevMode ? [{ debugName: "strengthResult" }] : /* istanbul ignore next */ []));
134
+ /** Number of active segments for the 4-segment or 5-segment meter */
135
+ activeSegmentCount = computed(() => {
136
+ const score = this.strengthResult().score;
137
+ if (score <= 0)
138
+ return 0;
139
+ if (score <= 25)
140
+ return 1;
141
+ if (score <= 50)
142
+ return 2;
143
+ if (score <= 75)
144
+ return 3;
145
+ return 4;
146
+ }, /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "activeSegmentCount" }] : /* istanbul ignore next */ []));
148
+ constructor() {
149
+ // Sync external [value] input
150
+ effect(() => {
151
+ const val = this.value();
152
+ untracked(() => {
153
+ if (val !== undefined && val !== this.innerValue()) {
154
+ this.innerValue.set(val);
155
+ }
156
+ });
157
+ });
158
+ // Sync external [masked] input
159
+ effect(() => {
160
+ const m = this.masked();
161
+ untracked(() => {
162
+ this.isMasked.set(m);
163
+ });
164
+ });
165
+ // Emit strengthChange whenever strengthResult changes
166
+ effect(() => {
167
+ const res = this.strengthResult();
168
+ untracked(() => {
169
+ this.strengthChange.emit(res);
170
+ });
171
+ });
172
+ }
173
+ // ─── Mask Toggle ───────────────────────────────────────────────────
174
+ toggleMask() {
175
+ if (this.effectiveDisabled() || !this.allowToggleMask())
176
+ return;
177
+ const next = !this.isMasked();
178
+ this.isMasked.set(next);
179
+ this.maskChange.emit(next);
180
+ }
181
+ // ─── Input Events ──────────────────────────────────────────────────
182
+ onInput(event) {
183
+ const input = event.target;
184
+ const val = input.value;
185
+ this.innerValue.set(val);
186
+ this.onChange(val);
187
+ this.valueChange.emit(val);
188
+ }
189
+ onFocus(event) {
190
+ this.isFocused.set(true);
191
+ this.inputFocus.emit(event);
192
+ }
193
+ onBlur(event) {
194
+ this.isFocused.set(false);
195
+ this.onTouched();
196
+ this.inputBlur.emit(event);
197
+ }
198
+ /** Focus the input programmatically */
199
+ focus() {
200
+ this.inputElementRef?.nativeElement.focus();
201
+ }
202
+ // ─── ControlValueAccessor ──────────────────────────────────────────
203
+ writeValue(value) {
204
+ const stringVal = value == null ? '' : String(value);
205
+ this.innerValue.set(stringVal);
206
+ }
207
+ registerOnChange(fn) {
208
+ this.onChange = fn;
209
+ }
210
+ registerOnTouched(fn) {
211
+ this.onTouched = fn;
212
+ }
213
+ setDisabledState(isDisabled) {
214
+ this.formDisabled.set(isDisabled);
215
+ }
216
+ // ─── Default Strength Evaluation ───────────────────────────────────
217
+ calculateStrength(password, ruleList) {
218
+ const labels = this.strengthLabels() ?? DEFAULT_STRENGTH_LABELS;
219
+ if (!password || ruleList.length === 0) {
220
+ return {
221
+ score: 0,
222
+ level: 'very-weak',
223
+ levelLabel: labels['very-weak'] ?? 'Very Weak',
224
+ passedCount: 0,
225
+ totalRules: ruleList.length,
226
+ rules: ruleList.map(r => ({ rule: r, passed: false })),
227
+ isValid: false
228
+ };
229
+ }
230
+ let totalWeight = 0;
231
+ let passedWeight = 0;
232
+ let passedCount = 0;
233
+ const evaluatedRules = ruleList.map(r => {
234
+ const weight = r.weight ?? 1;
235
+ totalWeight += weight;
236
+ let passed = false;
237
+ if (r.validator) {
238
+ passed = r.validator(password);
239
+ }
240
+ else if (r.pattern) {
241
+ passed = r.pattern.test(password);
242
+ }
243
+ else if (r.minLength !== undefined) {
244
+ passed = password.length >= r.minLength;
245
+ }
246
+ if (passed) {
247
+ passedWeight += weight;
248
+ passedCount++;
249
+ }
250
+ return { rule: r, passed };
251
+ });
252
+ const score = totalWeight > 0 ? Math.round((passedWeight / totalWeight) * 100) : 0;
253
+ let level = 'very-weak';
254
+ if (score === 0) {
255
+ level = 'very-weak';
256
+ }
257
+ else if (score <= 25) {
258
+ level = 'weak';
259
+ }
260
+ else if (score <= 50) {
261
+ level = 'fair';
262
+ }
263
+ else if (score <= 75) {
264
+ level = 'good';
265
+ }
266
+ else if (score < 100) {
267
+ level = 'strong';
268
+ }
269
+ else {
270
+ level = 'very-strong';
271
+ }
272
+ return {
273
+ score,
274
+ level,
275
+ levelLabel: labels[level] ?? level,
276
+ passedCount,
277
+ totalRules: ruleList.length,
278
+ rules: evaluatedRules,
279
+ isValid: passedCount === ruleList.length
280
+ };
281
+ }
282
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
283
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: TalosPasswordInputComponent, isStandalone: true, selector: "talos-password-input, talos-password-field", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", 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 }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, showPrefixIcon: { classPropertyName: "showPrefixIcon", publicName: "showPrefixIcon", isSignal: true, isRequired: false, transformFunction: null }, allowToggleMask: { classPropertyName: "allowToggleMask", publicName: "allowToggleMask", isSignal: true, isRequired: false, transformFunction: null }, masked: { classPropertyName: "masked", publicName: "masked", isSignal: true, isRequired: false, transformFunction: null }, maskToggleAriaLabel: { classPropertyName: "maskToggleAriaLabel", publicName: "maskToggleAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, showStrengthMeter: { classPropertyName: "showStrengthMeter", publicName: "showStrengthMeter", isSignal: true, isRequired: false, transformFunction: null }, meterVariant: { classPropertyName: "meterVariant", publicName: "meterVariant", isSignal: true, isRequired: false, transformFunction: null }, showStrengthLabel: { classPropertyName: "showStrengthLabel", publicName: "showStrengthLabel", isSignal: true, isRequired: false, transformFunction: null }, showRuleList: { classPropertyName: "showRuleList", publicName: "showRuleList", isSignal: true, isRequired: false, transformFunction: null }, rules: { classPropertyName: "rules", publicName: "rules", isSignal: true, isRequired: false, transformFunction: null }, strengthLabels: { classPropertyName: "strengthLabels", publicName: "strengthLabels", isSignal: true, isRequired: false, transformFunction: null }, strengthCalculator: { classPropertyName: "strengthCalculator", publicName: "strengthCalculator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", maskChange: "maskChange", strengthChange: "strengthChange", inputFocus: "inputFocus", inputBlur: "inputBlur" }, host: { properties: { "class.is-disabled": "effectiveDisabled()", "class.is-readonly": "readonly()", "class.is-invalid": "effectiveInvalid()", "class.is-focused": "isFocused()", "class.password-sm": "size() === \"sm\"", "class.password-md": "size() === \"md\"", "class.password-lg": "size() === \"lg\"" }, classAttribute: "talos-password-host" }, providers: [
284
+ {
285
+ provide: NG_VALUE_ACCESSOR,
286
+ useExisting: forwardRef(() => TalosPasswordInputComponent),
287
+ multi: true
288
+ }
289
+ ], viewQueries: [{ propertyName: "inputElementRef", first: true, predicate: ["inputEl"], descendants: true }], ngImport: i0, template: "<div class=\"talos-password-control-wrapper\">\n @if (showPrefixIcon()) {\n <span class=\"password-prefix-icon\" aria-hidden=\"true\">\n <svg lucideLock [size]=\"16\"></svg>\n </span>\n }\n\n <ng-content select=\"[prefix], [talosPrefix], [talosTextPrefix]\"></ng-content>\n\n <input\n #inputEl\n class=\"password-native-input\"\n [type]=\"isMasked() ? 'password' : 'text'\"\n [value]=\"innerValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.id]=\"elementId()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n [attr.aria-describedby]=\"showStrengthMeter() ? strengthMeterId() : null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n\n <ng-content select=\"[suffix], [talosSuffix], [talosPostfix], [talosTextSuffix], [talosTextPostfix]\"></ng-content>\n\n @if (allowToggleMask()) {\n <button\n type=\"button\"\n class=\"password-mask-toggle-btn\"\n [disabled]=\"effectiveDisabled()\"\n [attr.aria-label]=\"isMasked() ? 'Show password' : 'Hide password'\"\n [attr.title]=\"isMasked() ? 'Show password' : 'Hide password'\"\n (click)=\"toggleMask()\"\n tabindex=\"-1\"\n >\n @if (isMasked()) {\n <svg lucideEye [size]=\"16\" aria-hidden=\"true\"></svg>\n } @else {\n <svg lucideEyeOff [size]=\"16\" aria-hidden=\"true\"></svg>\n }\n </button>\n }\n</div>\n\n@if (showStrengthMeter()) {\n <div\n class=\"password-strength-container\"\n [attr.id]=\"strengthMeterId()\"\n [class.has-value]=\"!!innerValue()\"\n >\n <div class=\"password-strength-header\">\n @if (meterVariant() === 'segmented') {\n <div\n class=\"strength-meter-segments\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 1\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 2\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 3\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 4\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n </div>\n } @else {\n <div\n class=\"strength-meter-continuous\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <div\n class=\"meter-continuous-bar\"\n [style.width.%]=\"strengthResult().score\"\n [class]=\"'level-' + strengthResult().level\"\n ></div>\n </div>\n }\n\n @if (showStrengthLabel()) {\n <span class=\"strength-label\" [class]=\"'level-' + strengthResult().level\">\n {{ strengthResult().levelLabel }}\n </span>\n }\n </div>\n\n @if (showRuleList()) {\n <ul class=\"password-rule-list\" aria-label=\"Password requirements\">\n @for (item of strengthResult().rules; track item.rule.id) {\n <li\n class=\"rule-item\"\n [class.is-passed]=\"item.passed\"\n [class.is-unmet]=\"!item.passed\"\n >\n <span class=\"rule-icon\" aria-hidden=\"true\">\n @if (item.passed) {\n <svg lucideCheck [size]=\"13\"></svg>\n } @else {\n <svg lucideX [size]=\"13\"></svg>\n }\n </span>\n <span class=\"rule-text\">{{ item.rule.label }}</span>\n </li>\n }\n </ul>\n }\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box;font-family:inherit;--pwd-height: var(--talos-control-height, 2.25rem);--pwd-padding-x: var(--talos-control-padding-x, .75rem);--pwd-font-size: var(--talos-control-font-size, .8125rem);--pwd-radius: var(--talos-border-radius, .375rem);--pwd-bg: var(--talos-input-bg, var(--talos-card-bg, #ffffff));--pwd-border: var(--talos-input-border, var(--talos-border-color, #cbd5e1));--pwd-border-hover: var(--talos-input-border-hover, var(--talos-border-hover, #64748b));--pwd-border-focus: var(--talos-input-border-focus, var(--talos-border-focus, #2563eb));--pwd-shadow-focus: var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .15));--pwd-color: var(--talos-input-color, var(--talos-text-color, #0f172a));--pwd-placeholder: var(--talos-input-placeholder-color, #94a3b8);--pwd-icon-color: var(--talos-text-muted, #64748b);--pwd-icon-hover: var(--talos-text-color, #0f172a);--talos-affix-btn-size: var(--talos-affix-btn-size-md, 1.5rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-md, .875rem)}:host(.password-sm){--pwd-height: 2rem;--pwd-padding-x: .625rem;--pwd-font-size: .75rem;--talos-affix-btn-size: var(--talos-affix-btn-size-sm, 1.375rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-sm, .8125rem)}:host(.password-lg){--pwd-height: 2.75rem;--pwd-padding-x: .875rem;--pwd-font-size: .875rem;--talos-affix-btn-size: var(--talos-affix-btn-size-lg, 1.75rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-lg, 1rem)}.talos-password-control-wrapper{position:relative;display:flex;align-items:center;width:100%;height:var(--pwd-height);padding:0 var(--pwd-padding-x);background-color:var(--pwd-bg);border:1px solid var(--pwd-border);border-radius:var(--pwd-radius);box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.talos-password-control-wrapper:hover:not(.is-disabled){border-color:var(--pwd-border-hover)}:host(.is-focused) .talos-password-control-wrapper{border-color:var(--pwd-border-focus);box-shadow:var(--pwd-shadow-focus)}:host(.is-invalid) .talos-password-control-wrapper{border-color:var(--talos-error-color, #ef4444)}:host(.is-invalid) .talos-password-control-wrapper:focus-within{box-shadow:0 0 0 3px #ef444426}:host(.is-disabled){opacity:.65;cursor:not-allowed}:host(.is-disabled) .talos-password-control-wrapper{background-color:var(--talos-input-disabled-bg, var(--talos-bg-color, #f8fafc));border-color:var(--talos-input-disabled-border, #e2e8f0);cursor:not-allowed}:host(.is-disabled) .password-native-input,:host(.is-disabled) .password-mask-toggle-btn{cursor:not-allowed}.password-prefix-icon,::ng-deep [talosPrefix],::ng-deep [talosTextPrefix],::ng-deep [talosLead],::ng-deep [talosStart],::ng-deep [prefix]{position:static!important;transform:none!important;display:inline-flex;align-items:center;justify-content:center;color:var(--pwd-icon-color);margin-right:.5rem;font-size:var(--pwd-font-size);font-weight:500;flex-shrink:0;pointer-events:none;-webkit-user-select:none;user-select:none}.password-prefix-icon.affix-interactive,.password-prefix-icon button,.password-prefix-icon a,::ng-deep [talosPrefix].affix-interactive,::ng-deep [talosPrefix] button,::ng-deep [talosPrefix] a,::ng-deep [talosTextPrefix].affix-interactive,::ng-deep [talosTextPrefix] button,::ng-deep [talosTextPrefix] a,::ng-deep [talosLead].affix-interactive,::ng-deep [talosLead] button,::ng-deep [talosLead] a,::ng-deep [talosStart].affix-interactive,::ng-deep [talosStart] button,::ng-deep [talosStart] a,::ng-deep [prefix].affix-interactive,::ng-deep [prefix] button,::ng-deep [prefix] a{pointer-events:auto}.password-prefix-icon:hover,.password-prefix-icon:active,.password-prefix-icon:focus,.password-prefix-icon:focus-visible,::ng-deep [talosPrefix]:hover,::ng-deep [talosPrefix]:active,::ng-deep [talosPrefix]:focus,::ng-deep [talosPrefix]:focus-visible,::ng-deep [talosTextPrefix]:hover,::ng-deep [talosTextPrefix]:active,::ng-deep [talosTextPrefix]:focus,::ng-deep [talosTextPrefix]:focus-visible,::ng-deep [talosLead]:hover,::ng-deep [talosLead]:active,::ng-deep [talosLead]:focus,::ng-deep [talosLead]:focus-visible,::ng-deep [talosStart]:hover,::ng-deep [talosStart]:active,::ng-deep [talosStart]:focus,::ng-deep [talosStart]:focus-visible,::ng-deep [prefix]:hover,::ng-deep [prefix]:active,::ng-deep [prefix]:focus,::ng-deep [prefix]:focus-visible{transform:none!important;box-shadow:none}::ng-deep [talosSuffix],::ng-deep [talosPostfix],::ng-deep [talosTextSuffix],::ng-deep [talosTextPostfix],::ng-deep [talosTrail],::ng-deep [talosEnd],::ng-deep [suffix]{position:static!important;transform:none!important;display:inline-flex;align-items:center;justify-content:center;color:var(--pwd-icon-color);margin-left:.375rem;font-size:var(--pwd-font-size);font-weight:500;flex-shrink:0;pointer-events:none;-webkit-user-select:none;user-select:none}::ng-deep [talosSuffix].affix-interactive,::ng-deep [talosSuffix] button,::ng-deep [talosSuffix] a,::ng-deep [talosPostfix].affix-interactive,::ng-deep [talosPostfix] button,::ng-deep [talosPostfix] a,::ng-deep [talosTextSuffix].affix-interactive,::ng-deep [talosTextSuffix] button,::ng-deep [talosTextSuffix] a,::ng-deep [talosTextPostfix].affix-interactive,::ng-deep [talosTextPostfix] button,::ng-deep [talosTextPostfix] a,::ng-deep [talosTrail].affix-interactive,::ng-deep [talosTrail] button,::ng-deep [talosTrail] a,::ng-deep [talosEnd].affix-interactive,::ng-deep [talosEnd] button,::ng-deep [talosEnd] a,::ng-deep [suffix].affix-interactive,::ng-deep [suffix] button,::ng-deep [suffix] a{pointer-events:auto}::ng-deep [talosSuffix]:hover,::ng-deep [talosSuffix]:active,::ng-deep [talosSuffix]:focus,::ng-deep [talosSuffix]:focus-visible,::ng-deep [talosPostfix]:hover,::ng-deep [talosPostfix]:active,::ng-deep [talosPostfix]:focus,::ng-deep [talosPostfix]:focus-visible,::ng-deep [talosTextSuffix]:hover,::ng-deep [talosTextSuffix]:active,::ng-deep [talosTextSuffix]:focus,::ng-deep [talosTextSuffix]:focus-visible,::ng-deep [talosTextPostfix]:hover,::ng-deep [talosTextPostfix]:active,::ng-deep [talosTextPostfix]:focus,::ng-deep [talosTextPostfix]:focus-visible,::ng-deep [talosTrail]:hover,::ng-deep [talosTrail]:active,::ng-deep [talosTrail]:focus,::ng-deep [talosTrail]:focus-visible,::ng-deep [talosEnd]:hover,::ng-deep [talosEnd]:active,::ng-deep [talosEnd]:focus,::ng-deep [talosEnd]:focus-visible,::ng-deep [suffix]:hover,::ng-deep [suffix]:active,::ng-deep [suffix]:focus,::ng-deep [suffix]:focus-visible{transform:none!important;box-shadow:none}::ng-deep .talos-password-control-wrapper>button.talos-affix-element,::ng-deep .talos-password-control-wrapper>button[talosPrefix],::ng-deep .talos-password-control-wrapper>button[talosSuffix],::ng-deep .talos-password-control-wrapper>button[talosPostfix],::ng-deep .talos-password-control-wrapper>button[talosLead],::ng-deep .talos-password-control-wrapper>button[talosTrail],::ng-deep .talos-password-control-wrapper>button[talosStart],::ng-deep .talos-password-control-wrapper>button[talosEnd],::ng-deep .talos-password-control-wrapper>button[talosAffixButton],::ng-deep .talos-password-control-wrapper>button.talos-affix-btn,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button){pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-sizing:border-box;width:var(--talos-affix-btn-size, 1.5rem)!important;height:var(--talos-affix-btn-size, 1.5rem)!important;min-width:var(--talos-affix-btn-size, 1.5rem)!important;padding:0!important;margin:0!important;border-radius:var(--talos-affix-btn-radius, var(--talos-radius-sm, .25rem));background:transparent;border:none;outline:none;color:var(--talos-affix-btn-color, var(--pwd-icon-color));transition:color .15s ease,background-color .15s ease,box-shadow .15s ease}::ng-deep .talos-password-control-wrapper>button.talos-affix-element svg,::ng-deep .talos-password-control-wrapper>button.talos-affix-element i,::ng-deep .talos-password-control-wrapper>button.talos-affix-element [lucideIcon],::ng-deep .talos-password-control-wrapper>button.talos-affix-element .lucide,::ng-deep .talos-password-control-wrapper>button[talosPrefix] svg,::ng-deep .talos-password-control-wrapper>button[talosPrefix] i,::ng-deep .talos-password-control-wrapper>button[talosPrefix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosPrefix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosSuffix] svg,::ng-deep .talos-password-control-wrapper>button[talosSuffix] i,::ng-deep .talos-password-control-wrapper>button[talosSuffix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosSuffix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosPostfix] svg,::ng-deep .talos-password-control-wrapper>button[talosPostfix] i,::ng-deep .talos-password-control-wrapper>button[talosPostfix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosPostfix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosLead] svg,::ng-deep .talos-password-control-wrapper>button[talosLead] i,::ng-deep .talos-password-control-wrapper>button[talosLead] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosLead] .lucide,::ng-deep .talos-password-control-wrapper>button[talosTrail] svg,::ng-deep .talos-password-control-wrapper>button[talosTrail] i,::ng-deep .talos-password-control-wrapper>button[talosTrail] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosTrail] .lucide,::ng-deep .talos-password-control-wrapper>button[talosStart] svg,::ng-deep .talos-password-control-wrapper>button[talosStart] i,::ng-deep .talos-password-control-wrapper>button[talosStart] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosStart] .lucide,::ng-deep .talos-password-control-wrapper>button[talosEnd] svg,::ng-deep .talos-password-control-wrapper>button[talosEnd] i,::ng-deep .talos-password-control-wrapper>button[talosEnd] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosEnd] .lucide,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] svg,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] i,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosAffixButton] .lucide,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn svg,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn i,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn [lucideIcon],::ng-deep .talos-password-control-wrapper>button.talos-affix-btn .lucide,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) svg,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) i,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) [lucideIcon],::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) .lucide{width:var(--talos-affix-btn-icon-size, .875rem);height:var(--talos-affix-btn-icon-size, .875rem);flex-shrink:0}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):hover:not(:disabled):not(.is-disabled){color:var(--pwd-icon-hover);background-color:var(--talos-affix-btn-hover-bg, rgba(148, 163, 184, .12));box-shadow:none}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):active:not(:disabled):not(.is-disabled){background-color:var(--talos-affix-btn-active-bg, rgba(148, 163, 184, .25))}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):focus-visible:not(:disabled):not(.is-disabled){outline:none;box-shadow:var(--talos-focus-ring, 0 0 0 2px rgba(37, 99, 235, .25))}.password-native-input{flex:1 1 auto;min-width:0;height:100%;padding:0;margin:0;font-family:inherit;font-size:var(--pwd-font-size);color:var(--pwd-color);background:transparent;border:none;outline:none;letter-spacing:normal}.password-native-input[type=password]{letter-spacing:.125em}.password-native-input::placeholder{color:var(--pwd-placeholder);letter-spacing:normal;opacity:1}.password-mask-toggle-btn{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--talos-affix-btn-size, 1.5rem);height:var(--talos-affix-btn-size, 1.5rem);min-width:var(--talos-affix-btn-size, 1.5rem);padding:0;margin-left:.375rem;background:transparent;border:none;outline:none;border-radius:var(--talos-affix-btn-radius, var(--talos-radius-sm, .25rem));color:var(--pwd-icon-color);cursor:pointer;flex-shrink:0;transition:color .15s ease,background-color .15s ease,box-shadow .15s ease}.password-mask-toggle-btn svg,.password-mask-toggle-btn i,.password-mask-toggle-btn [lucideIcon],.password-mask-toggle-btn .lucide{width:var(--talos-affix-btn-icon-size, .875rem);height:var(--talos-affix-btn-icon-size, .875rem);flex-shrink:0}.password-mask-toggle-btn:hover:not(:disabled){color:var(--pwd-icon-hover);background-color:var(--talos-affix-btn-hover-bg, rgba(148, 163, 184, .12))}.password-mask-toggle-btn:focus-visible{box-shadow:var(--talos-focus-ring, 0 0 0 2px rgba(37, 99, 235, .25))}.password-strength-container{display:flex;flex-direction:column;gap:.375rem;margin-top:.5rem}.password-strength-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.strength-meter-segments{display:flex;align-items:center;gap:.25rem;flex:1 1 auto;height:.25rem}.strength-meter-segments .meter-segment{flex:1 1 0;height:100%;border-radius:9999px;background-color:var(--talos-border-color, #e2e8f0);transition:background-color .2s cubic-bezier(.4,0,.2,1)}.strength-meter-segments .meter-segment.active.level-very-weak,.strength-meter-segments .meter-segment.active.level-weak{background-color:var(--talos-error-color, #ef4444)}.strength-meter-segments .meter-segment.active.level-fair{background-color:var(--talos-warning-color, #f59e0b)}.strength-meter-segments .meter-segment.active.level-good{background-color:#eab308}.strength-meter-segments .meter-segment.active.level-strong{background-color:#22c55e}.strength-meter-segments .meter-segment.active.level-very-strong{background-color:var(--talos-success-color, #10b981)}.strength-meter-continuous{flex:1 1 auto;height:.25rem;background-color:var(--talos-border-color, #e2e8f0);border-radius:9999px;overflow:hidden}.strength-meter-continuous .meter-continuous-bar{height:100%;border-radius:9999px;transition:width .25s cubic-bezier(.4,0,.2,1),background-color .2s ease}.strength-meter-continuous .meter-continuous-bar.level-very-weak,.strength-meter-continuous .meter-continuous-bar.level-weak{background-color:var(--talos-error-color, #ef4444)}.strength-meter-continuous .meter-continuous-bar.level-fair{background-color:var(--talos-warning-color, #f59e0b)}.strength-meter-continuous .meter-continuous-bar.level-good{background-color:#eab308}.strength-meter-continuous .meter-continuous-bar.level-strong{background-color:#22c55e}.strength-meter-continuous .meter-continuous-bar.level-very-strong{background-color:var(--talos-success-color, #10b981)}.strength-label{font-size:.75rem;font-weight:600;line-height:1;flex-shrink:0;transition:color .15s ease}.strength-label.level-very-weak,.strength-label.level-weak{color:var(--talos-error-color, #ef4444)}.strength-label.level-fair{color:var(--talos-warning-color, #f59e0b)}.strength-label.level-good{color:#eab308}.strength-label.level-strong{color:#22c55e}.strength-label.level-very-strong{color:var(--talos-success-color, #10b981)}.password-rule-list{display:flex;flex-direction:column;gap:.25rem;padding:.25rem 0 0;margin:0;list-style:none}.password-rule-list .rule-item{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;color:var(--talos-text-muted, #64748b);transition:color .15s ease}.password-rule-list .rule-item .rule-icon{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;flex-shrink:0}.password-rule-list .rule-item.is-passed,.password-rule-list .rule-item.is-passed .rule-icon{color:var(--talos-success-color, #10b981)}.password-rule-list .rule-item.is-unmet{color:var(--talos-text-muted, #64748b)}.password-rule-list .rule-item.is-unmet .rule-icon{color:var(--talos-text-muted, #94a3b8);opacity:.7}\n"], dependencies: [{ kind: "component", type: LucideLock, selector: "svg[lucideLock]" }, { kind: "component", type: LucideEye, selector: "svg[lucideEye]" }, { kind: "component", type: LucideEyeOff, selector: "svg[lucideEyeOff]" }, { kind: "component", type: LucideCheck, selector: "svg[lucideCheck]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }] });
290
+ }
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputComponent, decorators: [{
292
+ type: Component,
293
+ args: [{ selector: 'talos-password-input, talos-password-field', imports: [
294
+ LucideLock,
295
+ LucideEye,
296
+ LucideEyeOff,
297
+ LucideCheck,
298
+ LucideX
299
+ ], providers: [
300
+ {
301
+ provide: NG_VALUE_ACCESSOR,
302
+ useExisting: forwardRef(() => TalosPasswordInputComponent),
303
+ multi: true
304
+ }
305
+ ], host: {
306
+ 'class': 'talos-password-host',
307
+ '[class.is-disabled]': 'effectiveDisabled()',
308
+ '[class.is-readonly]': 'readonly()',
309
+ '[class.is-invalid]': 'effectiveInvalid()',
310
+ '[class.is-focused]': 'isFocused()',
311
+ '[class.password-sm]': 'size() === "sm"',
312
+ '[class.password-md]': 'size() === "md"',
313
+ '[class.password-lg]': 'size() === "lg"'
314
+ }, template: "<div class=\"talos-password-control-wrapper\">\n @if (showPrefixIcon()) {\n <span class=\"password-prefix-icon\" aria-hidden=\"true\">\n <svg lucideLock [size]=\"16\"></svg>\n </span>\n }\n\n <ng-content select=\"[prefix], [talosPrefix], [talosTextPrefix]\"></ng-content>\n\n <input\n #inputEl\n class=\"password-native-input\"\n [type]=\"isMasked() ? 'password' : 'text'\"\n [value]=\"innerValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.id]=\"elementId()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n [attr.aria-describedby]=\"showStrengthMeter() ? strengthMeterId() : null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n\n <ng-content select=\"[suffix], [talosSuffix], [talosPostfix], [talosTextSuffix], [talosTextPostfix]\"></ng-content>\n\n @if (allowToggleMask()) {\n <button\n type=\"button\"\n class=\"password-mask-toggle-btn\"\n [disabled]=\"effectiveDisabled()\"\n [attr.aria-label]=\"isMasked() ? 'Show password' : 'Hide password'\"\n [attr.title]=\"isMasked() ? 'Show password' : 'Hide password'\"\n (click)=\"toggleMask()\"\n tabindex=\"-1\"\n >\n @if (isMasked()) {\n <svg lucideEye [size]=\"16\" aria-hidden=\"true\"></svg>\n } @else {\n <svg lucideEyeOff [size]=\"16\" aria-hidden=\"true\"></svg>\n }\n </button>\n }\n</div>\n\n@if (showStrengthMeter()) {\n <div\n class=\"password-strength-container\"\n [attr.id]=\"strengthMeterId()\"\n [class.has-value]=\"!!innerValue()\"\n >\n <div class=\"password-strength-header\">\n @if (meterVariant() === 'segmented') {\n <div\n class=\"strength-meter-segments\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 1\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 2\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 3\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 4\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n </div>\n } @else {\n <div\n class=\"strength-meter-continuous\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <div\n class=\"meter-continuous-bar\"\n [style.width.%]=\"strengthResult().score\"\n [class]=\"'level-' + strengthResult().level\"\n ></div>\n </div>\n }\n\n @if (showStrengthLabel()) {\n <span class=\"strength-label\" [class]=\"'level-' + strengthResult().level\">\n {{ strengthResult().levelLabel }}\n </span>\n }\n </div>\n\n @if (showRuleList()) {\n <ul class=\"password-rule-list\" aria-label=\"Password requirements\">\n @for (item of strengthResult().rules; track item.rule.id) {\n <li\n class=\"rule-item\"\n [class.is-passed]=\"item.passed\"\n [class.is-unmet]=\"!item.passed\"\n >\n <span class=\"rule-icon\" aria-hidden=\"true\">\n @if (item.passed) {\n <svg lucideCheck [size]=\"13\"></svg>\n } @else {\n <svg lucideX [size]=\"13\"></svg>\n }\n </span>\n <span class=\"rule-text\">{{ item.rule.label }}</span>\n </li>\n }\n </ul>\n }\n </div>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box;font-family:inherit;--pwd-height: var(--talos-control-height, 2.25rem);--pwd-padding-x: var(--talos-control-padding-x, .75rem);--pwd-font-size: var(--talos-control-font-size, .8125rem);--pwd-radius: var(--talos-border-radius, .375rem);--pwd-bg: var(--talos-input-bg, var(--talos-card-bg, #ffffff));--pwd-border: var(--talos-input-border, var(--talos-border-color, #cbd5e1));--pwd-border-hover: var(--talos-input-border-hover, var(--talos-border-hover, #64748b));--pwd-border-focus: var(--talos-input-border-focus, var(--talos-border-focus, #2563eb));--pwd-shadow-focus: var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .15));--pwd-color: var(--talos-input-color, var(--talos-text-color, #0f172a));--pwd-placeholder: var(--talos-input-placeholder-color, #94a3b8);--pwd-icon-color: var(--talos-text-muted, #64748b);--pwd-icon-hover: var(--talos-text-color, #0f172a);--talos-affix-btn-size: var(--talos-affix-btn-size-md, 1.5rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-md, .875rem)}:host(.password-sm){--pwd-height: 2rem;--pwd-padding-x: .625rem;--pwd-font-size: .75rem;--talos-affix-btn-size: var(--talos-affix-btn-size-sm, 1.375rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-sm, .8125rem)}:host(.password-lg){--pwd-height: 2.75rem;--pwd-padding-x: .875rem;--pwd-font-size: .875rem;--talos-affix-btn-size: var(--talos-affix-btn-size-lg, 1.75rem);--talos-affix-btn-icon-size: var(--talos-affix-btn-icon-size-lg, 1rem)}.talos-password-control-wrapper{position:relative;display:flex;align-items:center;width:100%;height:var(--pwd-height);padding:0 var(--pwd-padding-x);background-color:var(--pwd-bg);border:1px solid var(--pwd-border);border-radius:var(--pwd-radius);box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}.talos-password-control-wrapper:hover:not(.is-disabled){border-color:var(--pwd-border-hover)}:host(.is-focused) .talos-password-control-wrapper{border-color:var(--pwd-border-focus);box-shadow:var(--pwd-shadow-focus)}:host(.is-invalid) .talos-password-control-wrapper{border-color:var(--talos-error-color, #ef4444)}:host(.is-invalid) .talos-password-control-wrapper:focus-within{box-shadow:0 0 0 3px #ef444426}:host(.is-disabled){opacity:.65;cursor:not-allowed}:host(.is-disabled) .talos-password-control-wrapper{background-color:var(--talos-input-disabled-bg, var(--talos-bg-color, #f8fafc));border-color:var(--talos-input-disabled-border, #e2e8f0);cursor:not-allowed}:host(.is-disabled) .password-native-input,:host(.is-disabled) .password-mask-toggle-btn{cursor:not-allowed}.password-prefix-icon,::ng-deep [talosPrefix],::ng-deep [talosTextPrefix],::ng-deep [talosLead],::ng-deep [talosStart],::ng-deep [prefix]{position:static!important;transform:none!important;display:inline-flex;align-items:center;justify-content:center;color:var(--pwd-icon-color);margin-right:.5rem;font-size:var(--pwd-font-size);font-weight:500;flex-shrink:0;pointer-events:none;-webkit-user-select:none;user-select:none}.password-prefix-icon.affix-interactive,.password-prefix-icon button,.password-prefix-icon a,::ng-deep [talosPrefix].affix-interactive,::ng-deep [talosPrefix] button,::ng-deep [talosPrefix] a,::ng-deep [talosTextPrefix].affix-interactive,::ng-deep [talosTextPrefix] button,::ng-deep [talosTextPrefix] a,::ng-deep [talosLead].affix-interactive,::ng-deep [talosLead] button,::ng-deep [talosLead] a,::ng-deep [talosStart].affix-interactive,::ng-deep [talosStart] button,::ng-deep [talosStart] a,::ng-deep [prefix].affix-interactive,::ng-deep [prefix] button,::ng-deep [prefix] a{pointer-events:auto}.password-prefix-icon:hover,.password-prefix-icon:active,.password-prefix-icon:focus,.password-prefix-icon:focus-visible,::ng-deep [talosPrefix]:hover,::ng-deep [talosPrefix]:active,::ng-deep [talosPrefix]:focus,::ng-deep [talosPrefix]:focus-visible,::ng-deep [talosTextPrefix]:hover,::ng-deep [talosTextPrefix]:active,::ng-deep [talosTextPrefix]:focus,::ng-deep [talosTextPrefix]:focus-visible,::ng-deep [talosLead]:hover,::ng-deep [talosLead]:active,::ng-deep [talosLead]:focus,::ng-deep [talosLead]:focus-visible,::ng-deep [talosStart]:hover,::ng-deep [talosStart]:active,::ng-deep [talosStart]:focus,::ng-deep [talosStart]:focus-visible,::ng-deep [prefix]:hover,::ng-deep [prefix]:active,::ng-deep [prefix]:focus,::ng-deep [prefix]:focus-visible{transform:none!important;box-shadow:none}::ng-deep [talosSuffix],::ng-deep [talosPostfix],::ng-deep [talosTextSuffix],::ng-deep [talosTextPostfix],::ng-deep [talosTrail],::ng-deep [talosEnd],::ng-deep [suffix]{position:static!important;transform:none!important;display:inline-flex;align-items:center;justify-content:center;color:var(--pwd-icon-color);margin-left:.375rem;font-size:var(--pwd-font-size);font-weight:500;flex-shrink:0;pointer-events:none;-webkit-user-select:none;user-select:none}::ng-deep [talosSuffix].affix-interactive,::ng-deep [talosSuffix] button,::ng-deep [talosSuffix] a,::ng-deep [talosPostfix].affix-interactive,::ng-deep [talosPostfix] button,::ng-deep [talosPostfix] a,::ng-deep [talosTextSuffix].affix-interactive,::ng-deep [talosTextSuffix] button,::ng-deep [talosTextSuffix] a,::ng-deep [talosTextPostfix].affix-interactive,::ng-deep [talosTextPostfix] button,::ng-deep [talosTextPostfix] a,::ng-deep [talosTrail].affix-interactive,::ng-deep [talosTrail] button,::ng-deep [talosTrail] a,::ng-deep [talosEnd].affix-interactive,::ng-deep [talosEnd] button,::ng-deep [talosEnd] a,::ng-deep [suffix].affix-interactive,::ng-deep [suffix] button,::ng-deep [suffix] a{pointer-events:auto}::ng-deep [talosSuffix]:hover,::ng-deep [talosSuffix]:active,::ng-deep [talosSuffix]:focus,::ng-deep [talosSuffix]:focus-visible,::ng-deep [talosPostfix]:hover,::ng-deep [talosPostfix]:active,::ng-deep [talosPostfix]:focus,::ng-deep [talosPostfix]:focus-visible,::ng-deep [talosTextSuffix]:hover,::ng-deep [talosTextSuffix]:active,::ng-deep [talosTextSuffix]:focus,::ng-deep [talosTextSuffix]:focus-visible,::ng-deep [talosTextPostfix]:hover,::ng-deep [talosTextPostfix]:active,::ng-deep [talosTextPostfix]:focus,::ng-deep [talosTextPostfix]:focus-visible,::ng-deep [talosTrail]:hover,::ng-deep [talosTrail]:active,::ng-deep [talosTrail]:focus,::ng-deep [talosTrail]:focus-visible,::ng-deep [talosEnd]:hover,::ng-deep [talosEnd]:active,::ng-deep [talosEnd]:focus,::ng-deep [talosEnd]:focus-visible,::ng-deep [suffix]:hover,::ng-deep [suffix]:active,::ng-deep [suffix]:focus,::ng-deep [suffix]:focus-visible{transform:none!important;box-shadow:none}::ng-deep .talos-password-control-wrapper>button.talos-affix-element,::ng-deep .talos-password-control-wrapper>button[talosPrefix],::ng-deep .talos-password-control-wrapper>button[talosSuffix],::ng-deep .talos-password-control-wrapper>button[talosPostfix],::ng-deep .talos-password-control-wrapper>button[talosLead],::ng-deep .talos-password-control-wrapper>button[talosTrail],::ng-deep .talos-password-control-wrapper>button[talosStart],::ng-deep .talos-password-control-wrapper>button[talosEnd],::ng-deep .talos-password-control-wrapper>button[talosAffixButton],::ng-deep .talos-password-control-wrapper>button.talos-affix-btn,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button){pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;box-sizing:border-box;width:var(--talos-affix-btn-size, 1.5rem)!important;height:var(--talos-affix-btn-size, 1.5rem)!important;min-width:var(--talos-affix-btn-size, 1.5rem)!important;padding:0!important;margin:0!important;border-radius:var(--talos-affix-btn-radius, var(--talos-radius-sm, .25rem));background:transparent;border:none;outline:none;color:var(--talos-affix-btn-color, var(--pwd-icon-color));transition:color .15s ease,background-color .15s ease,box-shadow .15s ease}::ng-deep .talos-password-control-wrapper>button.talos-affix-element svg,::ng-deep .talos-password-control-wrapper>button.talos-affix-element i,::ng-deep .talos-password-control-wrapper>button.talos-affix-element [lucideIcon],::ng-deep .talos-password-control-wrapper>button.talos-affix-element .lucide,::ng-deep .talos-password-control-wrapper>button[talosPrefix] svg,::ng-deep .talos-password-control-wrapper>button[talosPrefix] i,::ng-deep .talos-password-control-wrapper>button[talosPrefix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosPrefix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosSuffix] svg,::ng-deep .talos-password-control-wrapper>button[talosSuffix] i,::ng-deep .talos-password-control-wrapper>button[talosSuffix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosSuffix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosPostfix] svg,::ng-deep .talos-password-control-wrapper>button[talosPostfix] i,::ng-deep .talos-password-control-wrapper>button[talosPostfix] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosPostfix] .lucide,::ng-deep .talos-password-control-wrapper>button[talosLead] svg,::ng-deep .talos-password-control-wrapper>button[talosLead] i,::ng-deep .talos-password-control-wrapper>button[talosLead] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosLead] .lucide,::ng-deep .talos-password-control-wrapper>button[talosTrail] svg,::ng-deep .talos-password-control-wrapper>button[talosTrail] i,::ng-deep .talos-password-control-wrapper>button[talosTrail] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosTrail] .lucide,::ng-deep .talos-password-control-wrapper>button[talosStart] svg,::ng-deep .talos-password-control-wrapper>button[talosStart] i,::ng-deep .talos-password-control-wrapper>button[talosStart] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosStart] .lucide,::ng-deep .talos-password-control-wrapper>button[talosEnd] svg,::ng-deep .talos-password-control-wrapper>button[talosEnd] i,::ng-deep .talos-password-control-wrapper>button[talosEnd] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosEnd] .lucide,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] svg,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] i,::ng-deep .talos-password-control-wrapper>button[talosAffixButton] [lucideIcon],::ng-deep .talos-password-control-wrapper>button[talosAffixButton] .lucide,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn svg,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn i,::ng-deep .talos-password-control-wrapper>button.talos-affix-btn [lucideIcon],::ng-deep .talos-password-control-wrapper>button.talos-affix-btn .lucide,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) svg,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) i,::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) [lucideIcon],::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button) .lucide{width:var(--talos-affix-btn-icon-size, .875rem);height:var(--talos-affix-btn-icon-size, .875rem);flex-shrink:0}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:hover:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):hover:not(:disabled):not(.is-disabled){color:var(--pwd-icon-hover);background-color:var(--talos-affix-btn-hover-bg, rgba(148, 163, 184, .12));box-shadow:none}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:active:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):active:not(:disabled):not(.is-disabled){background-color:var(--talos-affix-btn-active-bg, rgba(148, 163, 184, .25))}::ng-deep .talos-password-control-wrapper>button.talos-affix-element:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPrefix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosSuffix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosPostfix]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosLead]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosTrail]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosStart]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosEnd]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button[talosAffixButton]:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>button.talos-affix-btn:focus-visible:not(:disabled):not(.is-disabled),::ng-deep .talos-password-control-wrapper>.affix-interactive:is(button):focus-visible:not(:disabled):not(.is-disabled){outline:none;box-shadow:var(--talos-focus-ring, 0 0 0 2px rgba(37, 99, 235, .25))}.password-native-input{flex:1 1 auto;min-width:0;height:100%;padding:0;margin:0;font-family:inherit;font-size:var(--pwd-font-size);color:var(--pwd-color);background:transparent;border:none;outline:none;letter-spacing:normal}.password-native-input[type=password]{letter-spacing:.125em}.password-native-input::placeholder{color:var(--pwd-placeholder);letter-spacing:normal;opacity:1}.password-mask-toggle-btn{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--talos-affix-btn-size, 1.5rem);height:var(--talos-affix-btn-size, 1.5rem);min-width:var(--talos-affix-btn-size, 1.5rem);padding:0;margin-left:.375rem;background:transparent;border:none;outline:none;border-radius:var(--talos-affix-btn-radius, var(--talos-radius-sm, .25rem));color:var(--pwd-icon-color);cursor:pointer;flex-shrink:0;transition:color .15s ease,background-color .15s ease,box-shadow .15s ease}.password-mask-toggle-btn svg,.password-mask-toggle-btn i,.password-mask-toggle-btn [lucideIcon],.password-mask-toggle-btn .lucide{width:var(--talos-affix-btn-icon-size, .875rem);height:var(--talos-affix-btn-icon-size, .875rem);flex-shrink:0}.password-mask-toggle-btn:hover:not(:disabled){color:var(--pwd-icon-hover);background-color:var(--talos-affix-btn-hover-bg, rgba(148, 163, 184, .12))}.password-mask-toggle-btn:focus-visible{box-shadow:var(--talos-focus-ring, 0 0 0 2px rgba(37, 99, 235, .25))}.password-strength-container{display:flex;flex-direction:column;gap:.375rem;margin-top:.5rem}.password-strength-header{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.strength-meter-segments{display:flex;align-items:center;gap:.25rem;flex:1 1 auto;height:.25rem}.strength-meter-segments .meter-segment{flex:1 1 0;height:100%;border-radius:9999px;background-color:var(--talos-border-color, #e2e8f0);transition:background-color .2s cubic-bezier(.4,0,.2,1)}.strength-meter-segments .meter-segment.active.level-very-weak,.strength-meter-segments .meter-segment.active.level-weak{background-color:var(--talos-error-color, #ef4444)}.strength-meter-segments .meter-segment.active.level-fair{background-color:var(--talos-warning-color, #f59e0b)}.strength-meter-segments .meter-segment.active.level-good{background-color:#eab308}.strength-meter-segments .meter-segment.active.level-strong{background-color:#22c55e}.strength-meter-segments .meter-segment.active.level-very-strong{background-color:var(--talos-success-color, #10b981)}.strength-meter-continuous{flex:1 1 auto;height:.25rem;background-color:var(--talos-border-color, #e2e8f0);border-radius:9999px;overflow:hidden}.strength-meter-continuous .meter-continuous-bar{height:100%;border-radius:9999px;transition:width .25s cubic-bezier(.4,0,.2,1),background-color .2s ease}.strength-meter-continuous .meter-continuous-bar.level-very-weak,.strength-meter-continuous .meter-continuous-bar.level-weak{background-color:var(--talos-error-color, #ef4444)}.strength-meter-continuous .meter-continuous-bar.level-fair{background-color:var(--talos-warning-color, #f59e0b)}.strength-meter-continuous .meter-continuous-bar.level-good{background-color:#eab308}.strength-meter-continuous .meter-continuous-bar.level-strong{background-color:#22c55e}.strength-meter-continuous .meter-continuous-bar.level-very-strong{background-color:var(--talos-success-color, #10b981)}.strength-label{font-size:.75rem;font-weight:600;line-height:1;flex-shrink:0;transition:color .15s ease}.strength-label.level-very-weak,.strength-label.level-weak{color:var(--talos-error-color, #ef4444)}.strength-label.level-fair{color:var(--talos-warning-color, #f59e0b)}.strength-label.level-good{color:#eab308}.strength-label.level-strong{color:#22c55e}.strength-label.level-very-strong{color:var(--talos-success-color, #10b981)}.password-rule-list{display:flex;flex-direction:column;gap:.25rem;padding:.25rem 0 0;margin:0;list-style:none}.password-rule-list .rule-item{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;color:var(--talos-text-muted, #64748b);transition:color .15s ease}.password-rule-list .rule-item .rule-icon{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;flex-shrink:0}.password-rule-list .rule-item.is-passed,.password-rule-list .rule-item.is-passed .rule-icon{color:var(--talos-success-color, #10b981)}.password-rule-list .rule-item.is-unmet{color:var(--talos-text-muted, #64748b)}.password-rule-list .rule-item.is-unmet .rule-icon{color:var(--talos-text-muted, #94a3b8);opacity:.7}\n"] }]
315
+ }], ctorParameters: () => [], propDecorators: { inputElementRef: [{
316
+ type: ViewChild,
317
+ args: ['inputEl']
318
+ }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], showPrefixIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPrefixIcon", required: false }] }], allowToggleMask: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowToggleMask", required: false }] }], masked: [{ type: i0.Input, args: [{ isSignal: true, alias: "masked", required: false }] }], maskToggleAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "maskToggleAriaLabel", required: false }] }], showStrengthMeter: [{ type: i0.Input, args: [{ isSignal: true, alias: "showStrengthMeter", required: false }] }], meterVariant: [{ type: i0.Input, args: [{ isSignal: true, alias: "meterVariant", required: false }] }], showStrengthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showStrengthLabel", required: false }] }], showRuleList: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRuleList", required: false }] }], rules: [{ type: i0.Input, args: [{ isSignal: true, alias: "rules", required: false }] }], strengthLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "strengthLabels", required: false }] }], strengthCalculator: [{ type: i0.Input, args: [{ isSignal: true, alias: "strengthCalculator", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], maskChange: [{ type: i0.Output, args: ["maskChange"] }], strengthChange: [{ type: i0.Output, args: ["strengthChange"] }], inputFocus: [{ type: i0.Output, args: ["inputFocus"] }], inputBlur: [{ type: i0.Output, args: ["inputBlur"] }] } });
319
+
320
+ class TalosPasswordInputDirective {
321
+ elementRef = inject((ElementRef));
322
+ /** Sizing variation for the input */
323
+ size = input('md', /* @ts-ignore */
324
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
325
+ /** Whether the input is in an invalid error state */
326
+ invalid = input(false, /* @ts-ignore */
327
+ ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
328
+ /** Whether the password characters are masked */
329
+ masked = input(true, /* @ts-ignore */
330
+ ...(ngDevMode ? [{ debugName: "masked" }] : /* istanbul ignore next */ []));
331
+ /** Emitted when masked state changes */
332
+ maskChange = output();
333
+ /** Internal toggle method */
334
+ toggleMask() {
335
+ const nextState = !this.masked();
336
+ this.maskChange.emit(nextState);
337
+ }
338
+ /** Focus the underlying input element */
339
+ focus() {
340
+ this.elementRef.nativeElement?.focus();
341
+ }
342
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
343
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.1", type: TalosPasswordInputDirective, isStandalone: true, selector: "input[talosPasswordInput], input[talosPassword], input[talos-password-input]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, masked: { classPropertyName: "masked", publicName: "masked", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { maskChange: "maskChange" }, host: { properties: { "type": "masked() ? \"password\" : \"text\"", "class.input-sm": "size() === \"sm\"", "class.input-md": "size() === \"md\"", "class.input-lg": "size() === \"lg\"", "class.is-invalid": "invalid()", "attr.aria-invalid": "invalid()" }, classAttribute: "talos-input talos-password-input-directive" }, ngImport: i0 });
344
+ }
345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputDirective, decorators: [{
346
+ type: Directive,
347
+ args: [{
348
+ selector: 'input[talosPasswordInput], input[talosPassword], input[talos-password-input]',
349
+ host: {
350
+ 'class': 'talos-input talos-password-input-directive',
351
+ '[type]': 'masked() ? "password" : "text"',
352
+ '[class.input-sm]': 'size() === "sm"',
353
+ '[class.input-md]': 'size() === "md"',
354
+ '[class.input-lg]': 'size() === "lg"',
355
+ '[class.is-invalid]': 'invalid()',
356
+ '[attr.aria-invalid]': 'invalid()'
357
+ }
358
+ }]
359
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], masked: [{ type: i0.Input, args: [{ isSignal: true, alias: "masked", required: false }] }], maskChange: [{ type: i0.Output, args: ["maskChange"] }] } });
360
+
361
+ class TalosPasswordInputModule {
362
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
363
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputModule, imports: [TalosPasswordInputComponent, TalosPasswordInputDirective], exports: [TalosPasswordInputComponent, TalosPasswordInputDirective] });
364
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputModule, imports: [TalosPasswordInputComponent] });
365
+ }
366
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosPasswordInputModule, decorators: [{
367
+ type: NgModule,
368
+ args: [{
369
+ imports: [TalosPasswordInputComponent, TalosPasswordInputDirective],
370
+ exports: [TalosPasswordInputComponent, TalosPasswordInputDirective]
371
+ }]
372
+ }] });
373
+
374
+ /**
375
+ * Generated bundle index. Do not edit.
376
+ */
377
+
378
+ export { DEFAULT_PASSWORD_RULES, DEFAULT_STRENGTH_LABELS, TalosPasswordInputComponent, TalosPasswordInputDirective, TalosPasswordInputModule };
379
+ //# sourceMappingURL=weeehaoooz-talos-ui-form-password-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weeehaoooz-talos-ui-form-password-input.mjs","sources":["../../../projects/talos-ui/form/password-input/password-input.types.ts","../../../projects/talos-ui/form/password-input/password-input.component.ts","../../../projects/talos-ui/form/password-input/password-input.component.html","../../../projects/talos-ui/form/password-input/password-input.directive.ts","../../../projects/talos-ui/form/password-input/password-input.module.ts","../../../projects/talos-ui/form/password-input/weeehaoooz-talos-ui-form-password-input.ts"],"sourcesContent":["export type PasswordStrengthLevel = 'very-weak' | 'weak' | 'fair' | 'good' | 'strong' | 'very-strong';\n\nexport type PasswordMeterVariant = 'segmented' | 'continuous';\n\nexport type PasswordInputSize = 'sm' | 'md' | 'lg';\n\n/**\n * Developer-configurable rule definition for password validation and strength scoring.\n */\nexport interface PasswordRule {\n /** Unique identifier for the rule */\n id: string;\n\n /** Human-readable description displayed in checklists or tooltips */\n label: string;\n\n /** Minimum character length requirement */\n minLength?: number;\n\n /** Regular expression pattern that must match */\n pattern?: RegExp;\n\n /** Custom validator function returning true when criteria is met */\n validator?: (password: string) => boolean;\n\n /** Optional weight or scoring contribution for this rule (default: 1) */\n weight?: number;\n\n /** Optional hint or helper text explaining this rule */\n hint?: string;\n}\n\n/**\n * Status of an individual evaluated rule.\n */\nexport interface PasswordRuleStatus {\n /** The rule evaluated */\n rule: PasswordRule;\n\n /** Whether the rule requirement was satisfied */\n passed: boolean;\n}\n\n/**\n * Result of a password strength evaluation.\n */\nexport interface PasswordStrengthResult {\n /** Overall score as a percentage (0 - 100) */\n score: number;\n\n /** Strength classification level */\n level: PasswordStrengthLevel;\n\n /** Localized or custom display label for the strength level */\n levelLabel: string;\n\n /** Number of rules satisfied */\n passedCount: number;\n\n /** Total number of evaluated rules */\n totalRules: number;\n\n /** Detailed list of each rule and its pass/fail state */\n rules: PasswordRuleStatus[];\n\n /** Whether all rules (or required criteria) are satisfied */\n isValid: boolean;\n}\n\n/**\n * Default rule set provided out-of-the-box.\n */\nexport const DEFAULT_PASSWORD_RULES: PasswordRule[] = [\n {\n id: 'min-length',\n label: 'At least 8 characters',\n minLength: 8,\n validator: (p: string) => p.length >= 8,\n weight: 1\n },\n {\n id: 'lowercase',\n label: 'At least 1 lowercase letter (a-z)',\n pattern: /[a-z]/,\n weight: 1\n },\n {\n id: 'uppercase',\n label: 'At least 1 uppercase letter (A-Z)',\n pattern: /[A-Z]/,\n weight: 1\n },\n {\n id: 'number',\n label: 'At least 1 number (0-9)',\n pattern: /[0-9]/,\n weight: 1\n },\n {\n id: 'special',\n label: 'At least 1 special character (!@#$%^&*)',\n pattern: /[^A-Za-z0-9]/,\n weight: 1\n }\n];\n\nexport const DEFAULT_STRENGTH_LABELS: Record<PasswordStrengthLevel, string> = {\n 'very-weak': 'Very Weak',\n 'weak': 'Weak',\n 'fair': 'Fair',\n 'good': 'Good',\n 'strong': 'Strong',\n 'very-strong': 'Very Strong'\n};\n","import {\n Component,\n ElementRef,\n ViewChild,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n LucideLock,\n LucideEye,\n LucideEyeOff,\n LucideCheck,\n LucideX\n} from '@lucide/angular';\nimport {\n DEFAULT_PASSWORD_RULES,\n DEFAULT_STRENGTH_LABELS,\n PasswordMeterVariant,\n PasswordInputSize,\n PasswordRule,\n PasswordRuleStatus,\n PasswordStrengthLevel,\n PasswordStrengthResult\n} from './password-input.types';\n\nlet uniquePasswordId = 0;\n\n@Component({\n selector: 'talos-password-input, talos-password-field',\n imports: [\n LucideLock,\n LucideEye,\n LucideEyeOff,\n LucideCheck,\n LucideX\n ],\n templateUrl: './password-input.component.html',\n styleUrl: './password-input.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TalosPasswordInputComponent),\n multi: true\n }\n ],\n host: {\n 'class': 'talos-password-host',\n '[class.is-disabled]': 'effectiveDisabled()',\n '[class.is-readonly]': 'readonly()',\n '[class.is-invalid]': 'effectiveInvalid()',\n '[class.is-focused]': 'isFocused()',\n '[class.password-sm]': 'size() === \"sm\"',\n '[class.password-md]': 'size() === \"md\"',\n '[class.password-lg]': 'size() === \"lg\"'\n }\n})\nexport class TalosPasswordInputComponent implements ControlValueAccessor {\n @ViewChild('inputEl') inputElementRef?: ElementRef<HTMLInputElement>;\n\n private readonly autoId = `talos-password-${++uniquePasswordId}`;\n\n // ─── Value & Sizing Inputs ──────────────────────────────────────────\n readonly value = input<string>('');\n readonly placeholder = input<string>('Enter password');\n readonly size = input<PasswordInputSize>('md');\n readonly disabled = input<boolean>(false);\n readonly readonly = input<boolean>(false);\n readonly invalid = input<boolean>(false);\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly autocomplete = input<string>('current-password');\n readonly ariaLabel = input<string>('Password');\n\n // ─── Visual & Prefix / Suffix Features ──────────────────────────────\n readonly showPrefixIcon = input<boolean>(true);\n readonly allowToggleMask = input<boolean>(true);\n readonly masked = input<boolean>(true);\n readonly maskToggleAriaLabel = input<string>('Toggle password visibility');\n\n // ─── Strength Meter & Rules Configuration ───────────────────────────\n readonly showStrengthMeter = input<boolean>(false);\n readonly meterVariant = input<PasswordMeterVariant>('segmented');\n readonly showStrengthLabel = input<boolean>(true);\n readonly showRuleList = input<boolean>(false);\n readonly rules = input<PasswordRule[] | undefined, PasswordRule[] | undefined>(DEFAULT_PASSWORD_RULES, {\n transform: (val) => val ?? DEFAULT_PASSWORD_RULES\n });\n readonly strengthLabels = input<Record<PasswordStrengthLevel, string> | undefined, Record<PasswordStrengthLevel, string> | undefined>(DEFAULT_STRENGTH_LABELS, {\n transform: (val) => val ?? DEFAULT_STRENGTH_LABELS\n });\n readonly strengthCalculator = input<((password: string, rules: PasswordRule[]) => PasswordStrengthResult) | undefined>(undefined);\n\n // ─── Outputs ────────────────────────────────────────────────────────\n readonly valueChange = output<string>();\n readonly maskChange = output<boolean>();\n readonly strengthChange = output<PasswordStrengthResult>();\n readonly inputFocus = output<FocusEvent>();\n readonly inputBlur = output<FocusEvent>();\n\n // ─── Internal Reactive State ────────────────────────────────────────\n protected readonly innerValue = signal<string>('');\n protected readonly isMasked = signal<boolean>(true);\n protected readonly isFocused = signal<boolean>(false);\n protected readonly formDisabled = signal<boolean>(false);\n\n private onChange: (val: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly elementId = computed(() => this.id() || this.autoId);\n readonly strengthMeterId = computed(() => `${this.elementId()}-strength-meter`);\n\n readonly effectiveDisabled = computed(() => this.disabled() || this.formDisabled());\n readonly effectiveInvalid = computed(() => this.invalid());\n\n // ─── Strength Computation ───────────────────────────────────────────\n readonly strengthResult = computed<PasswordStrengthResult>(() => {\n const pwd = this.innerValue();\n const activeRules = this.rules() ?? DEFAULT_PASSWORD_RULES;\n const customCalc = this.strengthCalculator();\n\n if (customCalc) {\n return customCalc(pwd, activeRules);\n }\n\n return this.calculateStrength(pwd, activeRules);\n });\n\n /** Number of active segments for the 4-segment or 5-segment meter */\n readonly activeSegmentCount = computed<number>(() => {\n const score = this.strengthResult().score;\n if (score <= 0) return 0;\n if (score <= 25) return 1;\n if (score <= 50) return 2;\n if (score <= 75) return 3;\n return 4;\n });\n\n constructor() {\n // Sync external [value] input\n effect(() => {\n const val = this.value();\n untracked(() => {\n if (val !== undefined && val !== this.innerValue()) {\n this.innerValue.set(val);\n }\n });\n });\n\n // Sync external [masked] input\n effect(() => {\n const m = this.masked();\n untracked(() => {\n this.isMasked.set(m);\n });\n });\n\n // Emit strengthChange whenever strengthResult changes\n effect(() => {\n const res = this.strengthResult();\n untracked(() => {\n this.strengthChange.emit(res);\n });\n });\n }\n\n // ─── Mask Toggle ───────────────────────────────────────────────────\n toggleMask(): void {\n if (this.effectiveDisabled() || !this.allowToggleMask()) return;\n const next = !this.isMasked();\n this.isMasked.set(next);\n this.maskChange.emit(next);\n }\n\n // ─── Input Events ──────────────────────────────────────────────────\n protected onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const val = input.value;\n this.innerValue.set(val);\n this.onChange(val);\n this.valueChange.emit(val);\n }\n\n protected onFocus(event: FocusEvent): void {\n this.isFocused.set(true);\n this.inputFocus.emit(event);\n }\n\n protected onBlur(event: FocusEvent): void {\n this.isFocused.set(false);\n this.onTouched();\n this.inputBlur.emit(event);\n }\n\n /** Focus the input programmatically */\n focus(): void {\n this.inputElementRef?.nativeElement.focus();\n }\n\n // ─── ControlValueAccessor ──────────────────────────────────────────\n writeValue(value: unknown): void {\n const stringVal = value == null ? '' : String(value);\n this.innerValue.set(stringVal);\n }\n\n registerOnChange(fn: (val: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled.set(isDisabled);\n }\n\n // ─── Default Strength Evaluation ───────────────────────────────────\n private calculateStrength(password: string, ruleList: PasswordRule[]): PasswordStrengthResult {\n const labels = this.strengthLabels() ?? DEFAULT_STRENGTH_LABELS;\n\n if (!password || ruleList.length === 0) {\n return {\n score: 0,\n level: 'very-weak',\n levelLabel: labels['very-weak'] ?? 'Very Weak',\n passedCount: 0,\n totalRules: ruleList.length,\n rules: ruleList.map(r => ({ rule: r, passed: false })),\n isValid: false\n };\n }\n\n let totalWeight = 0;\n let passedWeight = 0;\n let passedCount = 0;\n\n const evaluatedRules: PasswordRuleStatus[] = ruleList.map(r => {\n const weight = r.weight ?? 1;\n totalWeight += weight;\n\n let passed = false;\n if (r.validator) {\n passed = r.validator(password);\n } else if (r.pattern) {\n passed = r.pattern.test(password);\n } else if (r.minLength !== undefined) {\n passed = password.length >= r.minLength;\n }\n\n if (passed) {\n passedWeight += weight;\n passedCount++;\n }\n\n return { rule: r, passed };\n });\n\n const score = totalWeight > 0 ? Math.round((passedWeight / totalWeight) * 100) : 0;\n\n let level: PasswordStrengthLevel = 'very-weak';\n if (score === 0) {\n level = 'very-weak';\n } else if (score <= 25) {\n level = 'weak';\n } else if (score <= 50) {\n level = 'fair';\n } else if (score <= 75) {\n level = 'good';\n } else if (score < 100) {\n level = 'strong';\n } else {\n level = 'very-strong';\n }\n\n return {\n score,\n level,\n levelLabel: labels[level] ?? level,\n passedCount,\n totalRules: ruleList.length,\n rules: evaluatedRules,\n isValid: passedCount === ruleList.length\n };\n }\n}\n","<div class=\"talos-password-control-wrapper\">\n @if (showPrefixIcon()) {\n <span class=\"password-prefix-icon\" aria-hidden=\"true\">\n <svg lucideLock [size]=\"16\"></svg>\n </span>\n }\n\n <ng-content select=\"[prefix], [talosPrefix], [talosTextPrefix]\"></ng-content>\n\n <input\n #inputEl\n class=\"password-native-input\"\n [type]=\"isMasked() ? 'password' : 'text'\"\n [value]=\"innerValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.id]=\"elementId()\"\n [attr.name]=\"name() || null\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"effectiveInvalid()\"\n [attr.aria-describedby]=\"showStrengthMeter() ? strengthMeterId() : null\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n\n <ng-content select=\"[suffix], [talosSuffix], [talosPostfix], [talosTextSuffix], [talosTextPostfix]\"></ng-content>\n\n @if (allowToggleMask()) {\n <button\n type=\"button\"\n class=\"password-mask-toggle-btn\"\n [disabled]=\"effectiveDisabled()\"\n [attr.aria-label]=\"isMasked() ? 'Show password' : 'Hide password'\"\n [attr.title]=\"isMasked() ? 'Show password' : 'Hide password'\"\n (click)=\"toggleMask()\"\n tabindex=\"-1\"\n >\n @if (isMasked()) {\n <svg lucideEye [size]=\"16\" aria-hidden=\"true\"></svg>\n } @else {\n <svg lucideEyeOff [size]=\"16\" aria-hidden=\"true\"></svg>\n }\n </button>\n }\n</div>\n\n@if (showStrengthMeter()) {\n <div\n class=\"password-strength-container\"\n [attr.id]=\"strengthMeterId()\"\n [class.has-value]=\"!!innerValue()\"\n >\n <div class=\"password-strength-header\">\n @if (meterVariant() === 'segmented') {\n <div\n class=\"strength-meter-segments\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 1\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 2\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 3\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n <span\n class=\"meter-segment\"\n [class.active]=\"activeSegmentCount() >= 4\"\n [class]=\"'level-' + strengthResult().level\"\n ></span>\n </div>\n } @else {\n <div\n class=\"strength-meter-continuous\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"strengthResult().score\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuetext]=\"strengthResult().levelLabel\"\n >\n <div\n class=\"meter-continuous-bar\"\n [style.width.%]=\"strengthResult().score\"\n [class]=\"'level-' + strengthResult().level\"\n ></div>\n </div>\n }\n\n @if (showStrengthLabel()) {\n <span class=\"strength-label\" [class]=\"'level-' + strengthResult().level\">\n {{ strengthResult().levelLabel }}\n </span>\n }\n </div>\n\n @if (showRuleList()) {\n <ul class=\"password-rule-list\" aria-label=\"Password requirements\">\n @for (item of strengthResult().rules; track item.rule.id) {\n <li\n class=\"rule-item\"\n [class.is-passed]=\"item.passed\"\n [class.is-unmet]=\"!item.passed\"\n >\n <span class=\"rule-icon\" aria-hidden=\"true\">\n @if (item.passed) {\n <svg lucideCheck [size]=\"13\"></svg>\n } @else {\n <svg lucideX [size]=\"13\"></svg>\n }\n </span>\n <span class=\"rule-text\">{{ item.rule.label }}</span>\n </li>\n }\n </ul>\n }\n </div>\n}\n","import { Directive, ElementRef, inject, input, output, signal } from '@angular/core';\nimport { PasswordInputSize } from './password-input.types';\n\n@Directive({\n selector: 'input[talosPasswordInput], input[talosPassword], input[talos-password-input]',\n host: {\n 'class': 'talos-input talos-password-input-directive',\n '[type]': 'masked() ? \"password\" : \"text\"',\n '[class.input-sm]': 'size() === \"sm\"',\n '[class.input-md]': 'size() === \"md\"',\n '[class.input-lg]': 'size() === \"lg\"',\n '[class.is-invalid]': 'invalid()',\n '[attr.aria-invalid]': 'invalid()'\n }\n})\nexport class TalosPasswordInputDirective {\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n\n /** Sizing variation for the input */\n readonly size = input<PasswordInputSize>('md');\n\n /** Whether the input is in an invalid error state */\n readonly invalid = input<boolean>(false);\n\n /** Whether the password characters are masked */\n readonly masked = input<boolean>(true);\n\n /** Emitted when masked state changes */\n readonly maskChange = output<boolean>();\n\n /** Internal toggle method */\n toggleMask(): void {\n const nextState = !this.masked();\n this.maskChange.emit(nextState);\n }\n\n /** Focus the underlying input element */\n focus(): void {\n this.elementRef.nativeElement?.focus();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { TalosPasswordInputComponent } from './password-input.component';\nimport { TalosPasswordInputDirective } from './password-input.directive';\n\n@NgModule({\n imports: [TalosPasswordInputComponent, TalosPasswordInputDirective],\n exports: [TalosPasswordInputComponent, TalosPasswordInputDirective]\n})\nexport class TalosPasswordInputModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}