@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.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs +237 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +93 -0
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-core.mjs +438 -0
- package/fesm2022/weeehaoooz-talos-ui-core.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +233 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +361 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +312 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +235 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +462 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +805 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +267 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +351 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +566 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +534 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +446 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +376 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +147 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +242 -0
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +514 -0
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +548 -0
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +692 -0
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +761 -0
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +896 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +872 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +119 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +135 -0
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +666 -0
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +147 -0
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +33 -0
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +455 -0
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +379 -0
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +297 -0
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +661 -0
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +346 -0
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +896 -0
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +252 -0
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +916 -0
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs +851 -0
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs +897 -0
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui.mjs +17058 -0
- package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -0
- package/package.json +203 -0
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.d.ts +3 -0
- package/schematics/ng-add/index.js +99 -0
- package/schematics/ng-add/schema.d.ts +10 -0
- package/schematics/ng-add/schema.js +2 -0
- package/schematics/ng-add/schema.json +52 -0
- package/styles/_alert.scss +56 -0
- package/styles/_badge.scss +279 -0
- package/styles/_button-group.scss +470 -0
- package/styles/_buttons.scss +442 -0
- package/styles/_card.scss +18 -0
- package/styles/_dialog.scss +116 -0
- package/styles/_drop-zone.scss +19 -0
- package/styles/_form-controls.scss +660 -0
- package/styles/_slide-toggle.scss +171 -0
- package/styles/_status-tag.scss +108 -0
- package/styles/_timeline.scss +19 -0
- package/styles/_tooltip.scss +32 -0
- package/styles/_typography.scss +279 -0
- package/styles/_variables.scss +590 -0
- package/styles/index.scss +15 -0
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts +59 -0
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-button-button.d.ts +38 -0
- package/types/weeehaoooz-talos-ui-button-button.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-core.d.ts +95 -0
- package/types/weeehaoooz-talos-ui-core.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +119 -0
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +135 -0
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +144 -0
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +83 -0
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +255 -0
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +204 -0
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +101 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +138 -0
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +161 -0
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +212 -0
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +259 -0
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +147 -0
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +32 -0
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-affix.d.ts +88 -0
- package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +113 -0
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +165 -0
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-chips.d.ts +152 -0
- package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +144 -0
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +138 -0
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +148 -0
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +44 -0
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +48 -0
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +227 -0
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts +42 -0
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-input.d.ts +15 -0
- package/types/weeehaoooz-talos-ui-form-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-otp.d.ts +111 -0
- package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts +145 -0
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-radio.d.ts +84 -0
- package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts +181 -0
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-rating.d.ts +110 -0
- package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts +195 -0
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +79 -0
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +192 -0
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-layout.d.ts +286 -0
- package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-nav.d.ts +384 -0
- package/types/weeehaoooz-talos-ui-nav.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui.d.ts +5050 -0
- 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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"}
|