@unabridged/midwest 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/app/assets/javascript/midwest/index.ts +8 -2
  2. package/app/assets/javascript/midwest.js +725 -20
  3. package/app/assets/javascript/midwest.js.map +1 -1
  4. package/app/assets/stylesheets/midwest.css +1 -1
  5. package/app/assets/stylesheets/midwest.tailwind.css +6 -1
  6. package/dist/css/midwest.css +1 -1
  7. package/dist/javascript/collection/app/assets/javascript/midwest/index.js +8 -2
  8. package/dist/javascript/collection/app/assets/javascript/midwest/index.js.map +1 -1
  9. package/dist/javascript/collection/app/components/midwest/code_block_component/code_block_component_controller.js +17 -0
  10. package/dist/javascript/collection/app/components/midwest/code_block_component/code_block_component_controller.js.map +1 -0
  11. package/dist/javascript/collection/app/components/midwest/dialog_component/dialog_component_controller.js.map +1 -1
  12. package/dist/javascript/collection/app/components/midwest/form/date_picker_component/date_picker_component_controller.js +243 -0
  13. package/dist/javascript/collection/app/components/midwest/form/date_picker_component/date_picker_component_controller.js.map +1 -0
  14. package/dist/javascript/collection/app/components/midwest/form/file_component/file_component_controller.js +35 -1
  15. package/dist/javascript/collection/app/components/midwest/form/file_component/file_component_controller.js.map +1 -1
  16. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js +72 -2
  17. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js.map +1 -1
  18. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js +12 -0
  19. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js.map +1 -1
  20. package/dist/javascript/collection/app/components/midwest/form/time_picker_component/time_picker_component_controller.js +164 -0
  21. package/dist/javascript/collection/app/components/midwest/form/time_picker_component/time_picker_component_controller.js.map +1 -0
  22. package/dist/javascript/collection/app/components/midwest/password_requirements_component/password_requirements_component_controller.js +194 -0
  23. package/dist/javascript/collection/app/components/midwest/password_requirements_component/password_requirements_component_controller.js.map +1 -0
  24. package/dist/javascript/midwest.js +725 -20
  25. package/dist/javascript/midwest.js.map +1 -1
  26. package/package.json +1 -1
@@ -0,0 +1,194 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+
3
+ const VALIDATORS = {
4
+ min_length: (v, n) => v.length >= n,
5
+ uppercase: (v, n) => (v.match(/[A-Z]/g) || []).length >= n,
6
+ lowercase: (v, n) => (v.match(/[a-z]/g) || []).length >= n,
7
+ number: (v, n) => (v.match(/[0-9]/g) || []).length >= n,
8
+ special: (v, n) => (v.match(/[^A-Za-z0-9]/g) || []).length >= n
9
+ };
10
+ class PasswordRequirements extends Controller {
11
+ static targets = ["requirement", "list", "complete", "strength", "strengthLabel", "inline", "panel"];
12
+ static values = {
13
+ input: { type: String, default: "" },
14
+ anchored: { type: Boolean, default: false },
15
+ anchorName: { type: String, default: "" },
16
+ inline: { type: Boolean, default: false },
17
+ inlineAnchorName: { type: String, default: "" }
18
+ };
19
+ sourceElement = null;
20
+ inputListener = null;
21
+ focusListener = null;
22
+ blurListener = null;
23
+ connect() {
24
+ if (!this.inputValue)
25
+ return;
26
+ this.sourceElement = document.querySelector(this.inputValue);
27
+ if (!this.sourceElement)
28
+ return;
29
+ this.inputListener = () => this.validate();
30
+ this.sourceElement.addEventListener("input", this.inputListener);
31
+ this.applyAnchorNames();
32
+ if (this.inlineValue) {
33
+ this.sourceElement.classList.add("has-inline-password-requirements");
34
+ }
35
+ if (this.anchoredValue) {
36
+ this.applyAnchor();
37
+ }
38
+ this.validate();
39
+ }
40
+ disconnect() {
41
+ if (this.sourceElement) {
42
+ if (this.inputListener)
43
+ this.sourceElement.removeEventListener("input", this.inputListener);
44
+ if (this.focusListener)
45
+ this.sourceElement.removeEventListener("focus", this.focusListener);
46
+ if (this.blurListener)
47
+ this.sourceElement.removeEventListener("blur", this.blurListener);
48
+ if (this.anchoredValue || this.inlineValue) {
49
+ this.sourceElement.style.removeProperty("anchor-name");
50
+ }
51
+ if (this.inlineValue) {
52
+ this.sourceElement.classList.remove("has-inline-password-requirements");
53
+ }
54
+ }
55
+ this.inputListener = null;
56
+ this.focusListener = null;
57
+ this.blurListener = null;
58
+ this.sourceElement = null;
59
+ }
60
+ applyAnchorNames() {
61
+ if (!this.sourceElement)
62
+ return;
63
+ const names = [];
64
+ if (this.anchoredValue && this.anchorNameValue)
65
+ names.push(this.anchorNameValue);
66
+ if (this.inlineValue && this.inlineAnchorNameValue)
67
+ names.push(this.inlineAnchorNameValue);
68
+ if (names.length > 0) {
69
+ this.sourceElement.style.setProperty("anchor-name", names.join(", "));
70
+ }
71
+ }
72
+ applyAnchor() {
73
+ if (!this.sourceElement || !this.anchorNameValue)
74
+ return;
75
+ this.focusListener = () => this.showPopover();
76
+ this.blurListener = () => this.hidePopover();
77
+ this.sourceElement.addEventListener("focus", this.focusListener);
78
+ this.sourceElement.addEventListener("blur", this.blurListener);
79
+ if (document.activeElement === this.sourceElement) {
80
+ this.showPopover();
81
+ }
82
+ }
83
+ get popoverElement() {
84
+ return this.hasPanelTarget ? this.panelTarget : this.element;
85
+ }
86
+ showPopover() {
87
+ try {
88
+ this.popoverElement.showPopover?.();
89
+ } catch {
90
+ }
91
+ }
92
+ hidePopover() {
93
+ try {
94
+ this.popoverElement.hidePopover?.();
95
+ } catch {
96
+ }
97
+ }
98
+ validate() {
99
+ const value = this.sourceElement?.value ?? "";
100
+ let allMet = true;
101
+ let metCount = 0;
102
+ const total = this.requirementTargets.length;
103
+ this.requirementTargets.forEach((li) => {
104
+ const type = li.dataset.requirementType ?? "";
105
+ let met = false;
106
+ if (type === "pattern") {
107
+ const pattern = li.dataset.requirementPattern;
108
+ if (pattern) {
109
+ try {
110
+ met = new RegExp(pattern).test(value);
111
+ } catch {
112
+ met = false;
113
+ }
114
+ }
115
+ } else {
116
+ const count = parseInt(li.dataset.requirementCount ?? "1", 10);
117
+ const validator = VALIDATORS[type];
118
+ met = validator ? validator(value, count) : false;
119
+ }
120
+ li.classList.toggle("is-met", met);
121
+ const label = li.querySelector(".requirement-label")?.textContent ?? "";
122
+ li.setAttribute("aria-label", `${label}: ${met ? "met" : "not met"}`);
123
+ if (met)
124
+ metCount++;
125
+ if (!met)
126
+ allMet = false;
127
+ });
128
+ const complete = allMet && value.length > 0;
129
+ this.popoverElement.classList.toggle("is-complete", complete);
130
+ if (this.hasListTarget)
131
+ this.listTarget.hidden = complete;
132
+ if (this.hasCompleteTarget)
133
+ this.completeTarget.hidden = !complete;
134
+ if (this.hasStrengthTarget)
135
+ this.updateStrength(metCount, total, value.length > 0);
136
+ if (this.inlineValue)
137
+ this.updateInlineIndicator(metCount, total, value.length > 0);
138
+ }
139
+ updateStrength(met, total, hasValue) {
140
+ const percentage = total > 0 && hasValue ? Math.round(met / total * 100) : 0;
141
+ const fill = this.strengthTarget.querySelector(".progress-fill");
142
+ const track = this.strengthTarget.querySelector('[role="progressbar"]');
143
+ if (fill)
144
+ fill.style.width = `${percentage}%`;
145
+ if (track)
146
+ track.setAttribute("aria-valuenow", String(percentage));
147
+ let state = "danger";
148
+ let label = "Weak";
149
+ if (percentage >= 100) {
150
+ state = "success";
151
+ label = "Strong";
152
+ } else if (percentage >= 60) {
153
+ state = "alert";
154
+ label = "Fair";
155
+ }
156
+ const meter = this.strengthTarget.querySelector(".midwest-progress-bar");
157
+ if (meter) {
158
+ meter.classList.remove("theme-red", "theme-yellow", "theme-green");
159
+ const themeClass = { danger: "theme-red", alert: "theme-yellow", success: "theme-green" }[state];
160
+ if (themeClass)
161
+ meter.classList.add(themeClass);
162
+ }
163
+ if (this.hasStrengthLabelTarget) {
164
+ this.strengthLabelTarget.textContent = label;
165
+ }
166
+ }
167
+ updateInlineIndicator(met, total, hasValue) {
168
+ if (!this.hasInlineTarget)
169
+ return;
170
+ const el = this.inlineTarget;
171
+ const percentage = total > 0 && hasValue ? Math.round(met / total * 100) : 0;
172
+ const fill = el.querySelector(".progress-circular-fill");
173
+ const svg = el.querySelector('[role="progressbar"]');
174
+ if (fill) {
175
+ const r = parseFloat(fill.getAttribute("r") ?? "0");
176
+ const circumference = 2 * Math.PI * r;
177
+ const offset = circumference * (1 - percentage / 100);
178
+ fill.setAttribute("stroke-dashoffset", String(offset));
179
+ }
180
+ if (svg)
181
+ svg.setAttribute("aria-valuenow", String(percentage));
182
+ let themeClass = "theme-red";
183
+ if (percentage >= 100) {
184
+ themeClass = "theme-green";
185
+ } else if (percentage >= 60) {
186
+ themeClass = "theme-yellow";
187
+ }
188
+ el.classList.remove("theme-red", "theme-yellow", "theme-green");
189
+ el.classList.add(themeClass);
190
+ }
191
+ }
192
+
193
+ export { PasswordRequirements as default };
194
+ //# sourceMappingURL=password_requirements_component_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password_requirements_component_controller.js","sources":["../../../../../../../app/components/midwest/password_requirements_component/password_requirements_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\nconst VALIDATORS: Record<string, (value: string, count: number) => boolean> = {\n min_length: (v, n) => v.length >= n,\n uppercase: (v, n) => (v.match(/[A-Z]/g) || []).length >= n,\n lowercase: (v, n) => (v.match(/[a-z]/g) || []).length >= n,\n number: (v, n) => (v.match(/[0-9]/g) || []).length >= n,\n special: (v, n) => (v.match(/[^A-Za-z0-9]/g) || []).length >= n\n}\n\ntype PopoverElement = HTMLElement & { showPopover?(): void; hidePopover?(): void }\n\nexport default class PasswordRequirements extends Controller<PopoverElement> {\n static targets = ['requirement', 'list', 'complete', 'strength', 'strengthLabel', 'inline', 'panel']\n static values = {\n input: { type: String, default: '' },\n anchored: { type: Boolean, default: false },\n anchorName: { type: String, default: '' },\n inline: { type: Boolean, default: false },\n inlineAnchorName: { type: String, default: '' }\n }\n\n declare readonly requirementTargets: HTMLElement[]\n declare readonly hasListTarget: boolean\n declare readonly listTarget: HTMLElement\n declare readonly hasCompleteTarget: boolean\n declare readonly completeTarget: HTMLElement\n declare readonly hasStrengthTarget: boolean\n declare readonly strengthTarget: HTMLElement\n declare readonly hasStrengthLabelTarget: boolean\n declare readonly strengthLabelTarget: HTMLElement\n declare readonly hasInlineTarget: boolean\n declare readonly inlineTarget: HTMLElement\n declare readonly hasPanelTarget: boolean\n declare readonly panelTarget: PopoverElement\n declare inputValue: string\n declare anchoredValue: boolean\n declare anchorNameValue: string\n declare inlineValue: boolean\n declare inlineAnchorNameValue: string\n\n private sourceElement: HTMLInputElement | null = null\n private inputListener: (() => void) | null = null\n private focusListener: (() => void) | null = null\n private blurListener: (() => void) | null = null\n\n connect () {\n if (!this.inputValue) return\n\n this.sourceElement = document.querySelector<HTMLInputElement>(this.inputValue)\n if (!this.sourceElement) return\n\n this.inputListener = () => this.validate()\n this.sourceElement.addEventListener('input', this.inputListener)\n\n this.applyAnchorNames()\n\n if (this.inlineValue) {\n this.sourceElement.classList.add('has-inline-password-requirements')\n }\n\n if (this.anchoredValue) {\n this.applyAnchor()\n }\n\n this.validate()\n }\n\n disconnect () {\n if (this.sourceElement) {\n if (this.inputListener) this.sourceElement.removeEventListener('input', this.inputListener)\n if (this.focusListener) this.sourceElement.removeEventListener('focus', this.focusListener)\n if (this.blurListener) this.sourceElement.removeEventListener('blur', this.blurListener)\n\n if (this.anchoredValue || this.inlineValue) {\n this.sourceElement.style.removeProperty('anchor-name')\n }\n if (this.inlineValue) {\n this.sourceElement.classList.remove('has-inline-password-requirements')\n }\n }\n\n this.inputListener = null\n this.focusListener = null\n this.blurListener = null\n this.sourceElement = null\n }\n\n private applyAnchorNames () {\n if (!this.sourceElement) return\n\n const names: string[] = []\n if (this.anchoredValue && this.anchorNameValue) names.push(this.anchorNameValue)\n if (this.inlineValue && this.inlineAnchorNameValue) names.push(this.inlineAnchorNameValue)\n if (names.length > 0) {\n this.sourceElement.style.setProperty('anchor-name', names.join(', '))\n }\n }\n\n private applyAnchor () {\n if (!this.sourceElement || !this.anchorNameValue) return\n\n this.focusListener = () => this.showPopover()\n this.blurListener = () => this.hidePopover()\n\n this.sourceElement.addEventListener('focus', this.focusListener)\n this.sourceElement.addEventListener('blur', this.blurListener)\n\n if (document.activeElement === this.sourceElement) {\n this.showPopover()\n }\n }\n\n private get popoverElement (): PopoverElement {\n return this.hasPanelTarget ? this.panelTarget : this.element\n }\n\n private showPopover () {\n try {\n this.popoverElement.showPopover?.()\n } catch { /* already open */ }\n }\n\n private hidePopover () {\n try {\n this.popoverElement.hidePopover?.()\n } catch { /* already hidden */ }\n }\n\n private validate () {\n const value = this.sourceElement?.value ?? ''\n let allMet = true\n let metCount = 0\n const total = this.requirementTargets.length\n\n this.requirementTargets.forEach(li => {\n const type = li.dataset.requirementType ?? ''\n let met = false\n\n if (type === 'pattern') {\n const pattern = li.dataset.requirementPattern\n if (pattern) {\n try {\n met = new RegExp(pattern).test(value)\n } catch {\n met = false\n }\n }\n } else {\n const count = parseInt(li.dataset.requirementCount ?? '1', 10)\n const validator = VALIDATORS[type]\n met = validator ? validator(value, count) : false\n }\n\n li.classList.toggle('is-met', met)\n\n const label = li.querySelector('.requirement-label')?.textContent ?? ''\n li.setAttribute('aria-label', `${label}: ${met ? 'met' : 'not met'}`)\n\n if (met) metCount++\n if (!met) allMet = false\n })\n\n const complete = allMet && value.length > 0\n this.popoverElement.classList.toggle('is-complete', complete)\n\n if (this.hasListTarget) this.listTarget.hidden = complete\n if (this.hasCompleteTarget) this.completeTarget.hidden = !complete\n if (this.hasStrengthTarget) this.updateStrength(metCount, total, value.length > 0)\n if (this.inlineValue) this.updateInlineIndicator(metCount, total, value.length > 0)\n }\n\n private updateStrength (met: number, total: number, hasValue: boolean) {\n const percentage = total > 0 && hasValue ? Math.round((met / total) * 100) : 0\n const fill = this.strengthTarget.querySelector<HTMLElement>('.progress-fill')\n const track = this.strengthTarget.querySelector<HTMLElement>('[role=\"progressbar\"]')\n\n if (fill) fill.style.width = `${percentage}%`\n if (track) track.setAttribute('aria-valuenow', String(percentage))\n\n let state = 'danger'\n let label = 'Weak'\n if (percentage >= 100) {\n state = 'success'\n label = 'Strong'\n } else if (percentage >= 60) {\n state = 'alert'\n label = 'Fair'\n }\n\n const meter = this.strengthTarget.querySelector('.midwest-progress-bar')\n if (meter) {\n meter.classList.remove('theme-red', 'theme-yellow', 'theme-green')\n const themeClass = { danger: 'theme-red', alert: 'theme-yellow', success: 'theme-green' }[state]\n if (themeClass) meter.classList.add(themeClass)\n }\n\n if (this.hasStrengthLabelTarget) {\n this.strengthLabelTarget.textContent = label\n }\n }\n\n private updateInlineIndicator (met: number, total: number, hasValue: boolean) {\n if (!this.hasInlineTarget) return\n\n const el = this.inlineTarget\n const percentage = total > 0 && hasValue ? Math.round((met / total) * 100) : 0\n\n const fill = el.querySelector<SVGCircleElement>('.progress-circular-fill')\n const svg = el.querySelector<SVGElement>('[role=\"progressbar\"]')\n\n if (fill) {\n const r = parseFloat(fill.getAttribute('r') ?? '0')\n const circumference = 2 * Math.PI * r\n const offset = circumference * (1 - percentage / 100)\n fill.setAttribute('stroke-dashoffset', String(offset))\n }\n\n if (svg) svg.setAttribute('aria-valuenow', String(percentage))\n\n let themeClass = 'theme-red'\n if (percentage >= 100) {\n themeClass = 'theme-green'\n } else if (percentage >= 60) {\n themeClass = 'theme-yellow'\n }\n\n el.classList.remove('theme-red', 'theme-yellow', 'theme-green')\n el.classList.add(themeClass)\n }\n}\n"],"names":[],"mappings":"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"}