secure-ui-components 0.1.0-beta.1

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 (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +310 -0
  3. package/dist/components/secure-datetime/secure-datetime.css +263 -0
  4. package/dist/components/secure-datetime/secure-datetime.d.ts +124 -0
  5. package/dist/components/secure-datetime/secure-datetime.d.ts.map +1 -0
  6. package/dist/components/secure-datetime/secure-datetime.js +610 -0
  7. package/dist/components/secure-datetime/secure-datetime.js.map +1 -0
  8. package/dist/components/secure-file-upload/secure-file-upload.css +334 -0
  9. package/dist/components/secure-file-upload/secure-file-upload.d.ts +150 -0
  10. package/dist/components/secure-file-upload/secure-file-upload.d.ts.map +1 -0
  11. package/dist/components/secure-file-upload/secure-file-upload.js +911 -0
  12. package/dist/components/secure-file-upload/secure-file-upload.js.map +1 -0
  13. package/dist/components/secure-form/secure-form.css +62 -0
  14. package/dist/components/secure-form/secure-form.d.ts +128 -0
  15. package/dist/components/secure-form/secure-form.d.ts.map +1 -0
  16. package/dist/components/secure-form/secure-form.js +697 -0
  17. package/dist/components/secure-form/secure-form.js.map +1 -0
  18. package/dist/components/secure-input/secure-input.css +168 -0
  19. package/dist/components/secure-input/secure-input.d.ts +114 -0
  20. package/dist/components/secure-input/secure-input.d.ts.map +1 -0
  21. package/dist/components/secure-input/secure-input.js +785 -0
  22. package/dist/components/secure-input/secure-input.js.map +1 -0
  23. package/dist/components/secure-select/secure-select.css +195 -0
  24. package/dist/components/secure-select/secure-select.d.ts +149 -0
  25. package/dist/components/secure-select/secure-select.d.ts.map +1 -0
  26. package/dist/components/secure-select/secure-select.js +634 -0
  27. package/dist/components/secure-select/secure-select.js.map +1 -0
  28. package/dist/components/secure-submit-button/secure-submit-button.css +135 -0
  29. package/dist/components/secure-submit-button/secure-submit-button.d.ts +61 -0
  30. package/dist/components/secure-submit-button/secure-submit-button.d.ts.map +1 -0
  31. package/dist/components/secure-submit-button/secure-submit-button.js +399 -0
  32. package/dist/components/secure-submit-button/secure-submit-button.js.map +1 -0
  33. package/dist/components/secure-table/secure-table.css +341 -0
  34. package/dist/components/secure-table/secure-table.d.ts +64 -0
  35. package/dist/components/secure-table/secure-table.d.ts.map +1 -0
  36. package/dist/components/secure-table/secure-table.js +567 -0
  37. package/dist/components/secure-table/secure-table.js.map +1 -0
  38. package/dist/components/secure-textarea/secure-textarea.css +153 -0
  39. package/dist/components/secure-textarea/secure-textarea.d.ts +111 -0
  40. package/dist/components/secure-textarea/secure-textarea.d.ts.map +1 -0
  41. package/dist/components/secure-textarea/secure-textarea.js +477 -0
  42. package/dist/components/secure-textarea/secure-textarea.js.map +1 -0
  43. package/dist/core/base-component.d.ts +134 -0
  44. package/dist/core/base-component.d.ts.map +1 -0
  45. package/dist/core/base-component.js +303 -0
  46. package/dist/core/base-component.js.map +1 -0
  47. package/dist/core/base.css +37 -0
  48. package/dist/core/security-config.d.ts +89 -0
  49. package/dist/core/security-config.d.ts.map +1 -0
  50. package/dist/core/security-config.js +273 -0
  51. package/dist/core/security-config.js.map +1 -0
  52. package/dist/core/types.d.ts +212 -0
  53. package/dist/core/types.d.ts.map +1 -0
  54. package/dist/core/types.js +7 -0
  55. package/dist/core/types.js.map +1 -0
  56. package/dist/index.d.ts +18 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +19 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/package.json +89 -0
  61. package/dist/styles/tokens.css +257 -0
  62. package/package.json +118 -0
@@ -0,0 +1,634 @@
1
+ /**
2
+ * @fileoverview Secure Select Component
3
+ *
4
+ * A security-first select dropdown component that implements progressive enhancement,
5
+ * tier-based validation, and audit logging.
6
+ *
7
+ * Progressive Enhancement Strategy:
8
+ * 1. Without JavaScript: Falls back to native HTML5 select with options
9
+ * 2. With JavaScript: Enhances with validation, audit logging, rate limiting
10
+ *
11
+ * Usage:
12
+ * <secure-select
13
+ * security-tier="authenticated"
14
+ * name="country"
15
+ * label="Country"
16
+ * required
17
+ * >
18
+ * <option value="">Select a country</option>
19
+ * <option value="us">United States</option>
20
+ * <option value="uk">United Kingdom</option>
21
+ * </secure-select>
22
+ *
23
+ * Multiple selection:
24
+ * <secure-select label="Languages" name="langs" multiple size="4">
25
+ * <option value="en">English</option>
26
+ * <option value="es">Spanish</option>
27
+ * </secure-select>
28
+ *
29
+ * Security Features:
30
+ * - XSS prevention via sanitization
31
+ * - Option value validation
32
+ * - Rate limiting for sensitive/critical tiers
33
+ * - Comprehensive audit logging
34
+ * - Visual security indicators
35
+ *
36
+ * @module secure-select
37
+ * @license MIT
38
+ */
39
+ import { SecureBaseComponent } from '../../core/base-component.js';
40
+ /**
41
+ * Secure Select Web Component
42
+ *
43
+ * Provides a security-hardened select dropdown with progressive enhancement.
44
+ * The component works as a standard form select without JavaScript and
45
+ * enhances with security features when JavaScript is available.
46
+ *
47
+ * @extends SecureBaseComponent
48
+ */
49
+ export class SecureSelect extends SecureBaseComponent {
50
+ /**
51
+ * Select element reference
52
+ * @private
53
+ */
54
+ #selectElement = null;
55
+ /**
56
+ * Label element reference
57
+ * @private
58
+ */
59
+ #labelElement = null;
60
+ /**
61
+ * Error container element reference
62
+ * @private
63
+ */
64
+ #errorContainer = null;
65
+ /**
66
+ * Unique ID for this select instance
67
+ * @private
68
+ */
69
+ #instanceId = `secure-select-${Math.random().toString(36).substr(2, 9)}`;
70
+ /**
71
+ * Valid option values
72
+ * @private
73
+ */
74
+ #validOptions = new Set();
75
+ /**
76
+ * Flag to track if options have been transferred from light DOM
77
+ * @private
78
+ */
79
+ #optionsTransferred = false;
80
+ /**
81
+ * Whether this is a multi-select instance
82
+ * @private
83
+ */
84
+ #isMultiple = false;
85
+ /**
86
+ * Observed attributes for this component
87
+ *
88
+ * @static
89
+ */
90
+ static get observedAttributes() {
91
+ return [
92
+ ...super.observedAttributes,
93
+ 'name',
94
+ 'label',
95
+ 'required',
96
+ 'multiple',
97
+ 'size',
98
+ 'value'
99
+ ];
100
+ }
101
+ /**
102
+ * Constructor
103
+ */
104
+ constructor() {
105
+ super();
106
+ }
107
+ /**
108
+ * Render the select component
109
+ *
110
+ * Security Note: We use a native <select> element wrapped in our web component
111
+ * to ensure progressive enhancement. The native select works without JavaScript,
112
+ * and we enhance it with security features when JS is available.
113
+ *
114
+ * @protected
115
+ */
116
+ render() {
117
+ const fragment = document.createDocumentFragment();
118
+ const config = this.config;
119
+ // Create container
120
+ const container = document.createElement('div');
121
+ container.className = 'select-container';
122
+ // Check if this is a multi-select
123
+ this.#isMultiple = this.hasAttribute('multiple');
124
+ // Create label
125
+ const label = this.getAttribute('label');
126
+ if (label) {
127
+ this.#labelElement = document.createElement('label');
128
+ this.#labelElement.htmlFor = this.#instanceId;
129
+ this.#labelElement.textContent = this.sanitizeValue(label);
130
+ // Add security tier suffix if configured
131
+ if (config.ui.labelSuffix) {
132
+ const suffix = document.createElement('span');
133
+ suffix.className = 'label-suffix';
134
+ suffix.textContent = config.ui.labelSuffix;
135
+ this.#labelElement.appendChild(suffix);
136
+ }
137
+ // Add security badge if configured
138
+ if (config.ui.showSecurityBadge) {
139
+ const badge = document.createElement('span');
140
+ badge.className = 'security-badge';
141
+ badge.textContent = config.name;
142
+ this.#labelElement.appendChild(badge);
143
+ }
144
+ container.appendChild(this.#labelElement);
145
+ }
146
+ // Create select wrapper for progressive enhancement
147
+ const selectWrapper = document.createElement('div');
148
+ selectWrapper.className = 'select-wrapper';
149
+ // Create the actual select element
150
+ this.#selectElement = document.createElement('select');
151
+ this.#selectElement.id = this.#instanceId;
152
+ this.#selectElement.className = 'select-field';
153
+ // Apply attributes from web component to native select
154
+ this.#applySelectAttributes();
155
+ // Set up event listeners
156
+ this.#attachEventListeners();
157
+ // Defer transferring options to allow light DOM to be fully parsed
158
+ // This handles the case where the component is created before its children
159
+ queueMicrotask(() => {
160
+ this.#transferOptions();
161
+ });
162
+ selectWrapper.appendChild(this.#selectElement);
163
+ container.appendChild(selectWrapper);
164
+ // Create error container
165
+ // role="alert" already implies aria-live="assertive" — do not override with polite
166
+ this.#errorContainer = document.createElement('div');
167
+ this.#errorContainer.className = 'error-container hidden';
168
+ this.#errorContainer.setAttribute('role', 'alert');
169
+ this.#errorContainer.id = `${this.#instanceId}-error`;
170
+ container.appendChild(this.#errorContainer);
171
+ // Add component styles (CSP-compliant via adoptedStyleSheets)
172
+ this.addComponentStyles(this.#getComponentStyles());
173
+ fragment.appendChild(container);
174
+ return fragment;
175
+ }
176
+ /**
177
+ * Apply attributes from the web component to the native select
178
+ *
179
+ * Security Note: This is where we enforce tier-specific security controls
180
+ * like validation rules.
181
+ *
182
+ * @private
183
+ */
184
+ #applySelectAttributes() {
185
+ const config = this.config;
186
+ // Name attribute (required for form submission)
187
+ const name = this.getAttribute('name');
188
+ if (name) {
189
+ this.#selectElement.name = this.sanitizeValue(name);
190
+ }
191
+ // Accessible name fallback when no visible label is provided
192
+ if (!this.getAttribute('label') && name) {
193
+ this.#selectElement.setAttribute('aria-label', this.sanitizeValue(name));
194
+ }
195
+ // Link select to its error container for screen readers
196
+ this.#selectElement.setAttribute('aria-describedby', `${this.#instanceId}-error`);
197
+ // Required attribute
198
+ if (this.hasAttribute('required') || config.validation.required) {
199
+ this.#selectElement.required = true;
200
+ this.#selectElement.setAttribute('aria-required', 'true');
201
+ }
202
+ // Multiple selection
203
+ if (this.hasAttribute('multiple')) {
204
+ this.#selectElement.multiple = true;
205
+ }
206
+ // Size attribute
207
+ const size = this.getAttribute('size');
208
+ if (size) {
209
+ this.#selectElement.size = parseInt(size, 10);
210
+ }
211
+ // Disabled state
212
+ if (this.hasAttribute('disabled')) {
213
+ this.#selectElement.disabled = true;
214
+ }
215
+ // Autocomplete control
216
+ if (!config.storage.allowAutocomplete) {
217
+ this.#selectElement.autocomplete = 'off';
218
+ }
219
+ }
220
+ /**
221
+ * Transfer option elements from light DOM to select element
222
+ *
223
+ * Security Note: We sanitize all option values and text to prevent XSS
224
+ *
225
+ * @private
226
+ */
227
+ #transferOptions() {
228
+ // Only transfer once to avoid clearing programmatically-added options
229
+ if (this.#optionsTransferred)
230
+ return;
231
+ this.#optionsTransferred = true;
232
+ // Get option elements from light DOM (original content)
233
+ const options = Array.from(this.querySelectorAll('option'));
234
+ // If no light DOM options, nothing to transfer
235
+ if (options.length === 0)
236
+ return;
237
+ // Track selected values (supports multiple selected attributes)
238
+ const selectedValues = [];
239
+ // Transfer each option to the select element
240
+ options.forEach((option) => {
241
+ const newOption = document.createElement('option');
242
+ // Sanitize value
243
+ const value = option.getAttribute('value') || '';
244
+ newOption.value = this.sanitizeValue(value);
245
+ this.#validOptions.add(newOption.value);
246
+ // Sanitize text content
247
+ newOption.textContent = this.sanitizeValue(option.textContent || '');
248
+ // Copy other attributes
249
+ if (option.hasAttribute('selected')) {
250
+ newOption.selected = true;
251
+ selectedValues.push(newOption.value);
252
+ }
253
+ if (option.hasAttribute('disabled')) {
254
+ newOption.disabled = true;
255
+ }
256
+ this.#selectElement.appendChild(newOption);
257
+ });
258
+ // Set initial value - attribute takes precedence over selected option
259
+ if (!this.#isMultiple) {
260
+ const initialValue = this.getAttribute('value');
261
+ if (initialValue) {
262
+ this.#selectElement.value = initialValue;
263
+ }
264
+ else if (selectedValues.length > 0) {
265
+ this.#selectElement.value = selectedValues[0];
266
+ }
267
+ }
268
+ // For multiple, the selected attributes on individual options already applied
269
+ }
270
+ /**
271
+ * Attach event listeners to the select
272
+ *
273
+ * @private
274
+ */
275
+ #attachEventListeners() {
276
+ // Focus event - audit logging
277
+ this.#selectElement.addEventListener('focus', () => {
278
+ this.audit('select_focused', {
279
+ name: this.#selectElement.name
280
+ });
281
+ });
282
+ // Change event - validation and audit logging
283
+ this.#selectElement.addEventListener('change', (e) => {
284
+ this.#handleChange(e);
285
+ });
286
+ // Blur event - final validation
287
+ this.#selectElement.addEventListener('blur', () => {
288
+ this.#validateAndShowErrors();
289
+ this.audit('select_blurred', {
290
+ name: this.#selectElement.name,
291
+ hasValue: this.#isMultiple
292
+ ? this.#selectElement.selectedOptions.length > 0
293
+ : this.#selectElement.value.length > 0
294
+ });
295
+ });
296
+ }
297
+ /**
298
+ * Handle change events
299
+ *
300
+ * Security Note: We validate that the selected value is in the list of valid options
301
+ * to prevent value injection attacks.
302
+ *
303
+ * @private
304
+ */
305
+ #handleChange(_event) {
306
+ if (this.#isMultiple) {
307
+ // Multi-select: validate all selected values
308
+ const selectedValues = Array.from(this.#selectElement.selectedOptions).map(opt => opt.value);
309
+ const invalidValues = selectedValues.filter(v => v && !this.#validOptions.has(v));
310
+ if (invalidValues.length > 0) {
311
+ this.#showError('Invalid option selected');
312
+ this.audit('invalid_option_detected', {
313
+ name: this.#selectElement.name,
314
+ attemptedValues: invalidValues
315
+ });
316
+ return;
317
+ }
318
+ // Clear previous errors
319
+ this.#clearErrors();
320
+ // Log the change
321
+ this.audit('select_changed', {
322
+ name: this.#selectElement.name,
323
+ values: selectedValues
324
+ });
325
+ // Dispatch custom event for parent forms
326
+ this.dispatchEvent(new CustomEvent('secure-select', {
327
+ detail: {
328
+ name: this.#selectElement.name,
329
+ value: selectedValues,
330
+ tier: this.securityTier
331
+ },
332
+ bubbles: true,
333
+ composed: true
334
+ }));
335
+ }
336
+ else {
337
+ // Single select: validate the selected value
338
+ const selectedValue = this.#selectElement.value;
339
+ if (selectedValue && !this.#validOptions.has(selectedValue)) {
340
+ this.#showError('Invalid option selected');
341
+ this.audit('invalid_option_detected', {
342
+ name: this.#selectElement.name,
343
+ attemptedValue: selectedValue
344
+ });
345
+ // Reset to empty value
346
+ this.#selectElement.value = '';
347
+ return;
348
+ }
349
+ // Clear previous errors
350
+ this.#clearErrors();
351
+ // Log the change
352
+ this.audit('select_changed', {
353
+ name: this.#selectElement.name,
354
+ value: selectedValue
355
+ });
356
+ // Dispatch custom event for parent forms
357
+ this.dispatchEvent(new CustomEvent('secure-select', {
358
+ detail: {
359
+ name: this.#selectElement.name,
360
+ value: selectedValue,
361
+ tier: this.securityTier
362
+ },
363
+ bubbles: true,
364
+ composed: true
365
+ }));
366
+ }
367
+ }
368
+ /**
369
+ * Validate the select and show error messages
370
+ *
371
+ * @private
372
+ */
373
+ #validateAndShowErrors() {
374
+ // Check rate limit first
375
+ const rateLimitCheck = this.checkRateLimit();
376
+ if (!rateLimitCheck.allowed) {
377
+ this.#showError(`Too many attempts. Please wait ${Math.ceil(rateLimitCheck.retryAfter / 1000)} seconds.`);
378
+ return;
379
+ }
380
+ const required = this.hasAttribute('required') || this.config.validation.required;
381
+ if (this.#isMultiple) {
382
+ // Multi-select: check if at least one option is selected
383
+ const selectedValues = Array.from(this.#selectElement.selectedOptions)
384
+ .map(opt => opt.value)
385
+ .filter(v => v !== '');
386
+ if (required && selectedValues.length === 0) {
387
+ this.#showError('Please select at least one option');
388
+ return;
389
+ }
390
+ // Validate all selected values are in valid options
391
+ const invalidValues = selectedValues.filter(v => !this.#validOptions.has(v));
392
+ if (invalidValues.length > 0) {
393
+ this.#showError('Invalid option selected');
394
+ return;
395
+ }
396
+ }
397
+ else {
398
+ // Single select: check required and valid option
399
+ if (required && !this.#selectElement.value) {
400
+ this.#showError('Please select an option');
401
+ return;
402
+ }
403
+ const selectedValue = this.#selectElement.value;
404
+ if (selectedValue && !this.#validOptions.has(selectedValue)) {
405
+ this.#showError('Invalid option selected');
406
+ return;
407
+ }
408
+ }
409
+ }
410
+ /**
411
+ * Show error message
412
+ *
413
+ * @private
414
+ */
415
+ #showError(message) {
416
+ this.#errorContainer.textContent = message;
417
+ // Force reflow so browser registers the hidden state with content,
418
+ // then remove hidden to trigger the CSS transition
419
+ void this.#errorContainer.offsetHeight;
420
+ this.#errorContainer.classList.remove('hidden');
421
+ this.#selectElement.classList.add('error');
422
+ this.#selectElement.setAttribute('aria-invalid', 'true');
423
+ }
424
+ /**
425
+ * Clear error messages
426
+ *
427
+ * @private
428
+ */
429
+ #clearErrors() {
430
+ // Start the hide animation first, clear text only after transition ends
431
+ this.#errorContainer.classList.add('hidden');
432
+ this.#errorContainer.addEventListener('transitionend', () => {
433
+ if (this.#errorContainer.classList.contains('hidden')) {
434
+ this.#errorContainer.textContent = '';
435
+ }
436
+ }, { once: true });
437
+ this.#selectElement.classList.remove('error');
438
+ this.#selectElement.removeAttribute('aria-invalid');
439
+ }
440
+ /**
441
+ * Get component-specific styles
442
+ *
443
+ * @private
444
+ */
445
+ #getComponentStyles() {
446
+ return new URL('./secure-select.css', import.meta.url).href;
447
+ }
448
+ /**
449
+ * Handle attribute changes
450
+ *
451
+ * @protected
452
+ */
453
+ handleAttributeChange(name, _oldValue, newValue) {
454
+ if (!this.#selectElement)
455
+ return;
456
+ switch (name) {
457
+ case 'disabled':
458
+ this.#selectElement.disabled = this.hasAttribute('disabled');
459
+ break;
460
+ case 'value':
461
+ if (newValue !== this.#selectElement.value) {
462
+ this.#selectElement.value = newValue || '';
463
+ }
464
+ break;
465
+ }
466
+ }
467
+ /**
468
+ * Get the current value
469
+ *
470
+ * @public
471
+ */
472
+ get value() {
473
+ if (!this.#selectElement)
474
+ return '';
475
+ // Multi-select: return comma-separated selected values
476
+ if (this.#isMultiple) {
477
+ return Array.from(this.#selectElement.selectedOptions)
478
+ .map(opt => opt.value)
479
+ .filter(v => v !== '')
480
+ .join(', ');
481
+ }
482
+ return this.#selectElement.value;
483
+ }
484
+ /**
485
+ * Set the value
486
+ *
487
+ * @public
488
+ */
489
+ set value(value) {
490
+ if (!this.#selectElement)
491
+ return;
492
+ if (this.#isMultiple) {
493
+ // Multi-select: accept comma-separated values
494
+ const values = value.split(',').map(v => v.trim()).filter(v => v !== '');
495
+ // Deselect all first
496
+ Array.from(this.#selectElement.options).forEach(opt => { opt.selected = false; });
497
+ // Select matching valid options
498
+ values.forEach(v => {
499
+ if (this.#validOptions.has(v)) {
500
+ const opt = Array.from(this.#selectElement.options).find(o => o.value === v);
501
+ if (opt)
502
+ opt.selected = true;
503
+ }
504
+ });
505
+ }
506
+ else {
507
+ if (this.#validOptions.has(value)) {
508
+ this.#selectElement.value = value;
509
+ }
510
+ }
511
+ }
512
+ /**
513
+ * Get the select name
514
+ *
515
+ * @public
516
+ */
517
+ get name() {
518
+ return this.#selectElement ? this.#selectElement.name : '';
519
+ }
520
+ /**
521
+ * Get selected options (for multiple select)
522
+ *
523
+ * @public
524
+ */
525
+ get selectedOptions() {
526
+ if (!this.#selectElement)
527
+ return [];
528
+ return Array.from(this.#selectElement.selectedOptions).map(opt => opt.value);
529
+ }
530
+ /**
531
+ * Check if the select is valid
532
+ *
533
+ * @public
534
+ */
535
+ get valid() {
536
+ const required = this.hasAttribute('required') || this.config.validation.required;
537
+ if (this.#isMultiple) {
538
+ const selectedValues = Array.from(this.#selectElement.selectedOptions)
539
+ .map(opt => opt.value)
540
+ .filter(v => v !== '');
541
+ if (required && selectedValues.length === 0) {
542
+ return false;
543
+ }
544
+ // All selected values must be valid
545
+ return selectedValues.every(v => this.#validOptions.has(v));
546
+ }
547
+ // Single select
548
+ if (required && !this.#selectElement.value) {
549
+ return false;
550
+ }
551
+ const selectedValue = this.#selectElement.value;
552
+ if (selectedValue && !this.#validOptions.has(selectedValue)) {
553
+ return false;
554
+ }
555
+ return true;
556
+ }
557
+ /**
558
+ * Focus the select
559
+ *
560
+ * @public
561
+ */
562
+ focus() {
563
+ if (this.#selectElement) {
564
+ this.#selectElement.focus();
565
+ }
566
+ }
567
+ /**
568
+ * Blur the select
569
+ *
570
+ * @public
571
+ */
572
+ blur() {
573
+ if (this.#selectElement) {
574
+ this.#selectElement.blur();
575
+ }
576
+ }
577
+ /**
578
+ * Add an option programmatically
579
+ *
580
+ * @public
581
+ */
582
+ addOption(value, text, selected = false) {
583
+ if (!this.#selectElement)
584
+ return;
585
+ const option = document.createElement('option');
586
+ option.value = this.sanitizeValue(value);
587
+ option.textContent = this.sanitizeValue(text);
588
+ option.selected = selected;
589
+ this.#validOptions.add(option.value);
590
+ this.#selectElement.appendChild(option);
591
+ }
592
+ /**
593
+ * Remove an option by value
594
+ *
595
+ * @public
596
+ */
597
+ removeOption(value) {
598
+ if (!this.#selectElement)
599
+ return;
600
+ const options = Array.from(this.#selectElement.options);
601
+ const option = options.find(opt => opt.value === value);
602
+ if (option) {
603
+ this.#selectElement.removeChild(option);
604
+ this.#validOptions.delete(value);
605
+ }
606
+ }
607
+ /**
608
+ * Clear all options
609
+ *
610
+ * @public
611
+ */
612
+ clearOptions() {
613
+ if (!this.#selectElement)
614
+ return;
615
+ this.#selectElement.innerHTML = '';
616
+ this.#validOptions.clear();
617
+ }
618
+ /**
619
+ * Cleanup on disconnect
620
+ *
621
+ * Note: We intentionally do NOT clear #validOptions here.
622
+ * When <secure-select> is inside a <secure-form>, the form moves its children
623
+ * into a <form> element, which triggers disconnect/reconnect. Clearing
624
+ * #validOptions on disconnect would leave the set empty after reconnect,
625
+ * causing all subsequent selections to be rejected as "invalid option".
626
+ */
627
+ disconnectedCallback() {
628
+ super.disconnectedCallback();
629
+ }
630
+ }
631
+ // Define the custom element
632
+ customElements.define('secure-select', SecureSelect);
633
+ export default SecureSelect;
634
+ //# sourceMappingURL=secure-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-select.js","sourceRoot":"","sources":["../../../src/components/secure-select/secure-select.ts"],"names":[],"mappings":"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"}