@nanoporetech-digital/components 2.12.0 → 2.13.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 (129) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/index.cjs.js +2 -0
  3. package/dist/cjs/index.cjs.js.map +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/nano-components.cjs.js +1 -1
  6. package/dist/cjs/nano-field-validator.cjs.entry.js +250 -118
  7. package/dist/cjs/nano-field-validator.cjs.entry.js.map +1 -1
  8. package/dist/cjs/nano-file-upload.cjs.entry.js +1 -1
  9. package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nano-input.cjs.entry.js +16 -3
  11. package/dist/cjs/nano-input.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nano-nav-item_2.cjs.entry.js +1 -0
  13. package/dist/cjs/nano-nav-item_2.cjs.entry.js.map +1 -1
  14. package/dist/collection/components/accordion/accordion.js +1 -1
  15. package/dist/collection/components/alert/alert.js +1 -1
  16. package/dist/collection/components/algolia/algolia-filter.js +2 -2
  17. package/dist/collection/components/algolia/algolia-input.js +5 -5
  18. package/dist/collection/components/algolia/algolia-results.js +1 -1
  19. package/dist/collection/components/algolia/algolia.js +6 -6
  20. package/dist/collection/components/checkbox/checkbox-group.js +2 -2
  21. package/dist/collection/components/checkbox/checkbox.js +3 -3
  22. package/dist/collection/components/datalist/datalist.js +1 -1
  23. package/dist/collection/components/date-input/date-input.js +8 -8
  24. package/dist/collection/components/date-picker/date-picker.js +5 -5
  25. package/dist/collection/components/details/details.js +1 -1
  26. package/dist/collection/components/dialog/dialog.js +1 -1
  27. package/dist/collection/components/dropdown/dropdown.js +1 -1
  28. package/dist/collection/components/field-validator/field-validator-interface.js.map +1 -1
  29. package/dist/collection/components/field-validator/field-validator.js +329 -124
  30. package/dist/collection/components/field-validator/field-validator.js.map +1 -1
  31. package/dist/collection/components/file-upload/file-upload.css +0 -1
  32. package/dist/collection/components/file-upload/file-upload.js +4 -4
  33. package/dist/collection/components/global-nav/global-nav.js +4 -4
  34. package/dist/collection/components/grid/grid-item.js +1 -1
  35. package/dist/collection/components/icon/icon.js +1 -1
  36. package/dist/collection/components/input/input.js +37 -8
  37. package/dist/collection/components/input/input.js.map +1 -1
  38. package/dist/collection/components/nav-item/nav-item.js +4 -4
  39. package/dist/collection/components/range/range.js +4 -4
  40. package/dist/collection/components/resize-observe/resize-observe.js +1 -1
  41. package/dist/collection/components/select/select.js +8 -7
  42. package/dist/collection/components/select/select.js.map +1 -1
  43. package/dist/collection/components/slides/slides.js +7 -7
  44. package/dist/collection/components/tabs/tab-group.js +2 -2
  45. package/dist/collection/index.js +1 -0
  46. package/dist/collection/index.js.map +1 -1
  47. package/dist/components/index.js +1 -0
  48. package/dist/components/index.js.map +1 -1
  49. package/dist/components/input.js +17 -3
  50. package/dist/components/input.js.map +1 -1
  51. package/dist/components/nano-field-validator.js +255 -120
  52. package/dist/components/nano-field-validator.js.map +1 -1
  53. package/dist/components/nano-file-upload.js +1 -1
  54. package/dist/components/nano-file-upload.js.map +1 -1
  55. package/dist/components/select.js +1 -0
  56. package/dist/components/select.js.map +1 -1
  57. package/dist/custom-elements/index.js +270 -124
  58. package/dist/custom-elements/index.js.map +1 -1
  59. package/dist/esm/index.js +1 -0
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/loader.js +1 -1
  62. package/dist/esm/nano-components.js +1 -1
  63. package/dist/esm/nano-field-validator.entry.js +250 -118
  64. package/dist/esm/nano-field-validator.entry.js.map +1 -1
  65. package/dist/esm/nano-file-upload.entry.js +1 -1
  66. package/dist/esm/nano-file-upload.entry.js.map +1 -1
  67. package/dist/esm/nano-input.entry.js +16 -3
  68. package/dist/esm/nano-input.entry.js.map +1 -1
  69. package/dist/esm/nano-nav-item_2.entry.js +1 -0
  70. package/dist/esm/nano-nav-item_2.entry.js.map +1 -1
  71. package/dist/esm-es5/index.js +2 -2
  72. package/dist/esm-es5/index.js.map +1 -1
  73. package/dist/esm-es5/loader.js +1 -1
  74. package/dist/esm-es5/loader.js.map +1 -1
  75. package/dist/esm-es5/nano-components.js +1 -1
  76. package/dist/esm-es5/nano-components.js.map +1 -1
  77. package/dist/esm-es5/nano-field-validator.entry.js +2 -2
  78. package/dist/esm-es5/nano-field-validator.entry.js.map +1 -1
  79. package/dist/esm-es5/nano-file-upload.entry.js +1 -1
  80. package/dist/esm-es5/nano-file-upload.entry.js.map +1 -1
  81. package/dist/esm-es5/nano-input.entry.js +1 -1
  82. package/dist/esm-es5/nano-input.entry.js.map +1 -1
  83. package/dist/esm-es5/nano-nav-item_2.entry.js +1 -1
  84. package/dist/esm-es5/nano-nav-item_2.entry.js.map +1 -1
  85. package/dist/nano-components/index.esm.js +1 -1
  86. package/dist/nano-components/index.esm.js.map +1 -1
  87. package/dist/nano-components/nano-components.esm.js +1 -1
  88. package/dist/nano-components/nano-components.esm.js.map +1 -1
  89. package/dist/nano-components/p-0d699368.system.js +5 -0
  90. package/dist/nano-components/{p-3258c568.system.js.map → p-0d699368.system.js.map} +1 -1
  91. package/dist/nano-components/p-18863670.system.entry.js +5 -0
  92. package/dist/nano-components/p-18863670.system.entry.js.map +1 -0
  93. package/dist/nano-components/p-53957ec6.system.js +1 -1
  94. package/dist/nano-components/p-53957ec6.system.js.map +1 -1
  95. package/dist/nano-components/{p-01667573.entry.js → p-634a58f7.entry.js} +2 -2
  96. package/dist/nano-components/p-634a58f7.entry.js.map +1 -0
  97. package/dist/nano-components/p-7f051c20.entry.js +5 -0
  98. package/dist/nano-components/p-7f051c20.entry.js.map +1 -0
  99. package/dist/nano-components/p-a07cf44c.system.entry.js +5 -0
  100. package/dist/nano-components/{p-4558a9c6.system.entry.js.map → p-a07cf44c.system.entry.js.map} +1 -1
  101. package/dist/nano-components/{p-96d9b8b9.system.entry.js → p-c2bbf0fb.system.entry.js} +2 -2
  102. package/dist/nano-components/p-c2bbf0fb.system.entry.js.map +1 -0
  103. package/dist/nano-components/{p-72893d12.system.entry.js → p-cb512cff.system.entry.js} +2 -2
  104. package/dist/nano-components/p-cb512cff.system.entry.js.map +1 -0
  105. package/dist/nano-components/p-e9fddc1a.entry.js +5 -0
  106. package/dist/nano-components/{p-91614b43.entry.js.map → p-e9fddc1a.entry.js.map} +1 -1
  107. package/dist/nano-components/{p-055f7d35.entry.js → p-ed0bdea9.entry.js} +2 -2
  108. package/dist/nano-components/p-ed0bdea9.entry.js.map +1 -0
  109. package/dist/themes/nanopore.css +1 -1
  110. package/dist/themes/nanopore.css.map +1 -1
  111. package/dist/types/components/field-validator/field-validator-interface.d.ts +5 -1
  112. package/dist/types/components/field-validator/field-validator.d.ts +61 -12
  113. package/dist/types/components/input/input.d.ts +6 -1
  114. package/dist/types/components.d.ts +25 -3
  115. package/dist/types/index.d.ts +1 -0
  116. package/docs-json.json +65 -3
  117. package/docs-vscode.json +6 -2
  118. package/package.json +2 -2
  119. package/dist/nano-components/p-01667573.entry.js.map +0 -1
  120. package/dist/nano-components/p-055f7d35.entry.js.map +0 -1
  121. package/dist/nano-components/p-2b478ca1.system.entry.js +0 -5
  122. package/dist/nano-components/p-2b478ca1.system.entry.js.map +0 -1
  123. package/dist/nano-components/p-3258c568.system.js +0 -5
  124. package/dist/nano-components/p-4558a9c6.system.entry.js +0 -5
  125. package/dist/nano-components/p-5f4fc2b4.entry.js +0 -5
  126. package/dist/nano-components/p-5f4fc2b4.entry.js.map +0 -1
  127. package/dist/nano-components/p-72893d12.system.entry.js.map +0 -1
  128. package/dist/nano-components/p-91614b43.entry.js +0 -5
  129. package/dist/nano-components/p-96d9b8b9.system.entry.js.map +0 -1
@@ -13225,8 +13225,15 @@ let FieldValidator = class extends H {
13225
13225
  this.nanoSubmit = createEvent(this, "nanoSubmit", 7);
13226
13226
  this.nanoInvalid = createEvent(this, "nanoInvalid", 7);
13227
13227
  this.submitted = false;
13228
- this.fields = [];
13229
- // annoyingly, whenever we attempt to checkValidty it fires `invalid` events.
13228
+ this.allFields = [];
13229
+ this.nanoFieldSelector = `
13230
+ nano-input,
13231
+ nano-select,
13232
+ nano-file-upload,
13233
+ nano-date-input,
13234
+ nano-checkbox
13235
+ `;
13236
+ // annoyingly, whenever we attempt to `checkValidty()` it fires `invalid` events.
13230
13237
  // this is used to prevent infinite loops / multiple calls
13231
13238
  this.internalValidate = false;
13232
13239
  // Public API
@@ -13235,12 +13242,27 @@ let FieldValidator = class extends H {
13235
13242
  /** Tries to scroll to the first invalid field on submit */
13236
13243
  this.scrollToInvalid = true;
13237
13244
  this._dirty = false;
13245
+ /** By default, `nano-field-validator` will also track all native form field elements.
13246
+ * You can add extra web-component form fields to listen to
13247
+ * (as long as they match the standard form field spec) by using the `fieldSelector` prop.
13248
+ */
13249
+ this.extraFieldSelector = 'input, select, textarea';
13238
13250
  // Event handlers
13239
- /** Fired whenever store values change and potentially checks validity */
13251
+ /**
13252
+ * Fired whenever store values change and potentially checks validity
13253
+ * @param key - the key of the store that's just changed
13254
+ * @param newVal - the incoming, new value
13255
+ */
13240
13256
  this.handleStoreChange = async (key, newVal) => {
13241
- const found = this.fields.find((field) => field.name === key);
13242
- if (found && found.value !== newVal)
13257
+ const found = this.allFields.find((field) => field.name === key);
13258
+ // field update has come programmatically (not from ui),
13259
+ // so let's update the underlying ui field
13260
+ if ((found &&
13261
+ found.tagName === 'NANO-FILE-UPLOAD' &&
13262
+ !this.fileStateEqual(key, found)) ||
13263
+ (found.tagName !== 'NANO-FILE-UPLOAD' && found.value !== newVal)) {
13243
13264
  this.storeToFields([found]);
13265
+ }
13244
13266
  if (this.validateOn === 'dirty' && this.dirty) {
13245
13267
  this.internalValidate = true;
13246
13268
  await this.validateAllFields();
@@ -13249,17 +13271,40 @@ let FieldValidator = class extends H {
13249
13271
  }
13250
13272
  this.nanoPayloadChange.emit(this._store.state);
13251
13273
  };
13252
- /** Handles field value changes and passes to store */
13274
+ /**
13275
+ * Handles nano field value changes and passes to store
13276
+ * @param ev - the incoming change event
13277
+ */
13253
13278
  this.handleFieldChange = (ev) => {
13279
+ if (!this.nanoFields.includes(ev.target))
13280
+ return;
13254
13281
  this._dirty = true;
13255
13282
  this.fieldsToStore([ev.target]);
13256
13283
  };
13257
- /** Handles default field validation events */
13284
+ /**
13285
+ * Handles non-nano field value changes and passes to store
13286
+ * @param ev - the incoming change event
13287
+ */
13288
+ this.handlePlainFieldChange = (ev) => {
13289
+ if (!this.plainFields.includes(ev.target))
13290
+ return;
13291
+ this.fieldsToStore([ev.target]);
13292
+ };
13293
+ /**
13294
+ * Handles default field validation events
13295
+ * @param ev - the invalid event
13296
+ */
13258
13297
  this.handleFormInvalid = async (ev) => {
13259
- ev.preventDefault();
13298
+ // if it's a non-nano field, we'll let default html5 validation do it's thing
13299
+ if (!this.plainFields.includes(ev.target)) {
13300
+ ev.preventDefault();
13301
+ }
13260
13302
  this._valid = false;
13303
+ // whenever `checkValidity` is called, this handler is in-turn called.
13304
+ // this flag is used to stop infinite loops
13261
13305
  if (this.internalValidate)
13262
13306
  return;
13307
+ // a submit must have happened to if 'submitThenDirty' turn on 'dirty' checking now
13263
13308
  if (this.validateOn === 'submitThenDirty')
13264
13309
  this.validateOn = 'dirty';
13265
13310
  this.submitted = true;
@@ -13279,7 +13324,10 @@ let FieldValidator = class extends H {
13279
13324
  this.scrollToFirstInvalid();
13280
13325
  this.nanoInvalid.emit();
13281
13326
  };
13282
- /** stops default form submission, checks if valid, then submits manually */
13327
+ /**
13328
+ * stops default form submission, checks if valid, then submits manually
13329
+ * @param e - a submit event from the nested form element
13330
+ */
13283
13331
  this.handleSubmit = async (e) => {
13284
13332
  e.preventDefault();
13285
13333
  if (this.validateOn === 'submitThenDirty')
@@ -13304,6 +13352,7 @@ let FieldValidator = class extends H {
13304
13352
  return this._activeForm;
13305
13353
  }
13306
13354
  set activeForm(form) {
13355
+ // manages event listners on whatever form is used (slotted on created here)
13307
13356
  if (!form)
13308
13357
  return;
13309
13358
  if (this._activeForm) {
@@ -13314,7 +13363,7 @@ let FieldValidator = class extends H {
13314
13363
  }
13315
13364
  /** Sync up validateOn with all fields */
13316
13365
  validateOnChange() {
13317
- this.fields.forEach((field) => {
13366
+ this.nanoFields.forEach((field) => {
13318
13367
  if (field.tagName === 'NANO-CHECKBOX') {
13319
13368
  const cbg = field.closest('nano-checkbox-group');
13320
13369
  if (cbg)
@@ -13342,7 +13391,7 @@ let FieldValidator = class extends H {
13342
13391
  get payload() {
13343
13392
  return this._store.state;
13344
13393
  }
13345
- /** Returns true if validation errors will be displayed to the user */
13394
+ /** Returns true if validation errors will be displayed to the user. @readonly */
13346
13395
  get showValidation() {
13347
13396
  return (this.validateOn === 'dirty' && this.dirty) || this.submitted;
13348
13397
  }
@@ -13359,26 +13408,58 @@ let FieldValidator = class extends H {
13359
13408
  ```
13360
13409
  */
13361
13410
  get validationState() {
13411
+ // TODO - migrate nano-fields away from using proprietary methods in a bid to be closer to the spec
13412
+ // this is big and ugly.
13413
+ // why? Cos' it must unify checking validity state for both
13414
+ // `nano-...` and plain form fields.
13362
13415
  const validationState = [];
13363
- this.fields.forEach(async (field) => {
13416
+ this.allFields.forEach(async (field) => {
13364
13417
  const found = validationState.find((v) => v.name === field.name);
13418
+ let pf;
13419
+ let nf;
13365
13420
  if (found) {
13366
- found.validityMessage = field.validityMessage.length
13367
- ? field.validityMessage
13368
- : found.validityMessage;
13421
+ if (field.validationMessage) {
13422
+ pf = field;
13423
+ found.validityMessage = pf.validationMessage.length
13424
+ ? pf.validationMessage
13425
+ : found.validityMessage;
13426
+ this.internalValidate = true;
13427
+ if (found.valid && !pf.checkValidity())
13428
+ found.valid = false;
13429
+ this.internalValidate = false;
13430
+ }
13431
+ else if (field.validityMessage) {
13432
+ nf = field;
13433
+ found.validityMessage = nf.validityMessage.length
13434
+ ? nf.validityMessage
13435
+ : nf.validityMessage;
13436
+ if (found.valid && nf.invalid)
13437
+ found.valid = false;
13438
+ }
13369
13439
  if (!found.fields.find((f) => f === field))
13370
13440
  found.fields.push(field);
13371
- if (found.valid && field.invalid)
13372
- found.valid = false;
13373
- return;
13441
+ }
13442
+ let valid;
13443
+ let validityMessage;
13444
+ if (field.checkValidity) {
13445
+ pf = field;
13446
+ this.internalValidate = true;
13447
+ valid = pf.checkValidity();
13448
+ this.internalValidate = false;
13449
+ validityMessage = pf.validationMessage;
13450
+ }
13451
+ else {
13452
+ nf = field;
13453
+ valid = !nf.invalid;
13454
+ validityMessage = nf.validityMessage;
13374
13455
  }
13375
13456
  validationState.push({
13376
13457
  fields: [field],
13377
13458
  name: field.name,
13378
- valid: !field.invalid,
13379
13459
  value: this._store.state[field.name],
13380
13460
  dirty: false,
13381
- validityMessage: field.validityMessage,
13461
+ valid,
13462
+ validityMessage,
13382
13463
  });
13383
13464
  });
13384
13465
  return validationState;
@@ -13390,6 +13471,24 @@ let FieldValidator = class extends H {
13390
13471
  async setStore(state) {
13391
13472
  Object.entries(state).forEach(([key, val]) => (this.store.state[key] = val));
13392
13473
  }
13474
+ /**
13475
+ * Sets custom validity for all / some form fields.
13476
+ * @param validity - a validity object of `{fieldName: errorString}` pairs. Set as an empty string to clear the error.
13477
+ */
13478
+ async setCustomValidity(validity) {
13479
+ return await Promise.all(Object.entries(validity).map(async ([key, err]) => {
13480
+ const field = this.allFields.find((f) => f.name === key);
13481
+ if (!!field)
13482
+ await this.setFieldError(field, err);
13483
+ }));
13484
+ }
13485
+ /**
13486
+ * Clear all custom validation.
13487
+ * @param validity
13488
+ */
13489
+ async resetValidity() {
13490
+ return await Promise.all(this.allFields.map(async (field) => await this.setFieldError(field, '')));
13491
+ }
13393
13492
  // private methods
13394
13493
  attachSlotObserver() {
13395
13494
  if (!!this.mo)
@@ -13409,62 +13508,66 @@ let FieldValidator = class extends H {
13409
13508
  }
13410
13509
  /** Checks for new `nano-...` fields and adds them to our watch array and value store */
13411
13510
  setupFields() {
13412
- let fields = Array.from(this.host.querySelectorAll(`
13413
- nano-input,
13414
- nano-select,
13415
- nano-file-upload,
13416
- nano-date-input,
13417
- nano-checkbox
13418
- `));
13419
- fields = fields.filter((f) => !!f.name && !!f.name.length);
13511
+ let nanoFields = Array.from(this.host.querySelectorAll(this.nanoFieldSelector));
13512
+ let plainFields = Array.from(this.host.querySelectorAll(this.extraFieldSelector)).filter((e) => !e.closest(this.nanoFieldSelector));
13513
+ nanoFields = nanoFields.filter((f) => !!f.name && !!f.name.length);
13514
+ plainFields = plainFields.filter((f) => !!f.name && !!f.name.length);
13420
13515
  // do we have any currently un-watched fields?
13421
- if (!fields.filter((f) => !this.fields.includes(f)).length)
13516
+ if (![...nanoFields, ...plainFields].filter((f) => !this.allFields.includes(f)).length)
13422
13517
  return;
13423
13518
  // setup the initial store state / refresh on new fields
13424
- this.fields = fields;
13425
- this.storeToFields(this.fields);
13519
+ this.nanoFields = nanoFields;
13520
+ this.plainFields = plainFields;
13521
+ this.allFields = [...nanoFields, ...plainFields];
13522
+ this.storeToFields(this.allFields);
13426
13523
  this.validateOnChange();
13427
- this.fieldsToStore(this.fields);
13524
+ this.fieldsToStore(this.allFields);
13428
13525
  this.nanoPayloadChange.emit(this._store.state);
13429
13526
  }
13430
13527
  storeToFields(fields) {
13431
13528
  fields.forEach((field) => {
13529
+ var _a;
13432
13530
  const fieldName = field.name;
13433
13531
  if (!fieldName.length ||
13434
13532
  typeof this._store.state[fieldName] === 'undefined')
13435
13533
  return;
13436
- switch (field.tagName) {
13437
- case 'NANO-CHECKBOX':
13438
- let cb = field;
13439
- if (cb.type === 'radio' ||
13440
- cb.type === 'segment' ||
13441
- cb.type === 'segment-pill') {
13442
- if (this._store.state[fieldName] === cb.value)
13443
- cb.checked = true;
13444
- else
13445
- cb.checked = false;
13446
- }
13447
- else if (Array.isArray(this._store.state[fieldName])) {
13448
- if (this._store.state[fieldName].includes(cb.value))
13449
- cb.checked = true;
13450
- else
13451
- cb.checked = false;
13452
- }
13453
- else {
13454
- if (this._store.state[fieldName] === cb.value)
13455
- cb.checked = true;
13456
- else
13457
- cb.checked = false;
13458
- }
13459
- break;
13460
- case 'NANO-FILE-UPLOAD':
13461
- field.files =
13462
- this._store.state[fieldName];
13463
- break;
13464
- default:
13465
- field.value = this._store.state[fieldName];
13466
- break;
13534
+ if (field.tagName === 'NANO-CHECKBOX' ||
13535
+ ['radio', 'checkbox'].includes(field.type)) {
13536
+ let cb = field;
13537
+ if (cb.type === 'radio' ||
13538
+ cb.type === 'segment' ||
13539
+ cb.type === 'segment-pill') {
13540
+ // single radio type control
13541
+ if (this._store.state[fieldName] === cb.value)
13542
+ cb.checked = true;
13543
+ else
13544
+ cb.checked = false;
13545
+ }
13546
+ else if (Array.isArray(this._store.state[fieldName])) {
13547
+ // multiple checkbox like controls
13548
+ if (this._store.state[fieldName].includes(cb.value))
13549
+ cb.checked = true;
13550
+ else
13551
+ cb.checked = false;
13552
+ }
13553
+ else {
13554
+ // single checkbox like control
13555
+ if (this._store.state[fieldName] === cb.value)
13556
+ cb.checked = true;
13557
+ else
13558
+ cb.checked = false;
13559
+ }
13560
+ return;
13561
+ }
13562
+ if (field.tagName === 'NANO-FILE-UPLOAD') {
13563
+ const ff = field;
13564
+ // this can only work if the field is empty rn... a one-time deal
13565
+ if (!((_a = ff.files) === null || _a === void 0 ? void 0 : _a.length))
13566
+ ff.files = this._store.state[fieldName];
13567
+ return;
13467
13568
  }
13569
+ // default
13570
+ field.value = this._store.state[fieldName];
13468
13571
  });
13469
13572
  }
13470
13573
  /** Loops through all `nano-...` fields and extracts their values into our store */
@@ -13473,52 +13576,70 @@ let FieldValidator = class extends H {
13473
13576
  const fieldName = field.name;
13474
13577
  if (!fieldName.length)
13475
13578
  return;
13476
- switch (field.tagName) {
13477
- case 'NANO-CHECKBOX':
13478
- let cb = field;
13479
- if (cb.type === 'radio' ||
13480
- cb.type === 'segment' ||
13481
- cb.type === 'segment-pill') {
13482
- // radio type control - only one can be checked
13483
- if (cb.checked)
13484
- this._store.state[fieldName] = cb.value;
13485
- else if (!cb.checked &&
13486
- (cb.value === this._store.state[fieldName] ||
13487
- !this._store.state[fieldName]))
13488
- this._store.state[fieldName] = '';
13489
- }
13490
- else if (this.fields.filter((f) => f.name === fieldName && f.tagName === 'NANO-CHECKBOX').length > 1) {
13491
- // multiple checkbox type control
13492
- const currentArr = Array.isArray(this._store.state[fieldName])
13493
- ? this._store.state[fieldName]
13494
- : [];
13495
- if (cb.checked) {
13496
- if (!this._store.state[fieldName].includes(cb.value)) {
13497
- this._store.state[fieldName] = [...currentArr, cb.value];
13498
- }
13499
- }
13500
- else {
13501
- this._store.state[fieldName] = currentArr.filter((v) => v !== cb.value);
13579
+ if (field.tagName === 'NANO-CHECKBOX' ||
13580
+ ['radio', 'checkbox'].includes(field.type)) {
13581
+ let cb = field;
13582
+ if (cb.type === 'radio' ||
13583
+ cb.type === 'segment' ||
13584
+ cb.type === 'segment-pill') {
13585
+ // radio type control - only one can be checked
13586
+ if (cb.checked)
13587
+ this._store.state[fieldName] = cb.value;
13588
+ }
13589
+ else if (this.allFields.filter((f) => f.name === fieldName &&
13590
+ (f.tagName === 'NANO-CHECKBOX' ||
13591
+ f.type === 'checkbox')).length > 1) {
13592
+ // multiple checkbox type control
13593
+ const currentArr = Array.isArray(this._store.state[fieldName])
13594
+ ? this._store.state[fieldName]
13595
+ : [];
13596
+ if (cb.checked) {
13597
+ // checked
13598
+ if (!this._store.state[fieldName].includes(cb.value)) {
13599
+ this._store.state[fieldName] = [...currentArr, cb.value];
13502
13600
  }
13503
13601
  }
13504
13602
  else {
13505
- // single checkbox - on or off
13506
- if (cb.checked)
13507
- this._store.state[fieldName] = cb.value;
13508
- else
13509
- this._store.state[fieldName] = '';
13603
+ // unchecked
13604
+ this._store.state[fieldName] = currentArr.filter((v) => v !== cb.value);
13510
13605
  }
13511
- break;
13512
- case 'NANO-FILE-UPLOAD':
13513
- this._store.state[fieldName] = field.files;
13514
- break;
13515
- default:
13516
- this._store.state[fieldName] = field.value;
13517
- break;
13606
+ }
13607
+ else {
13608
+ // single checkbox - on or off
13609
+ if (cb.checked)
13610
+ this._store.state[fieldName] = cb.value;
13611
+ else
13612
+ this._store.state[fieldName] = '';
13613
+ }
13614
+ return;
13518
13615
  }
13616
+ if (field.tagName === 'NANO-FILE-UPLOAD') {
13617
+ const ff = field;
13618
+ if (!this.fileStateEqual(fieldName, ff))
13619
+ this._store.state[fieldName] = ff.files;
13620
+ return;
13621
+ }
13622
+ // default
13623
+ this._store.state[fieldName] = field.value;
13519
13624
  });
13520
13625
  }
13521
- /** Checks for user defined validations */
13626
+ /**
13627
+ * Tries to ascertain whether the current model
13628
+ * value is the same as the `nano-file-upload` value
13629
+ * @param fieldName - the key to access from the data store
13630
+ * @param field - the nano-file-upload field to assess against
13631
+ * @returns true for equal, false for not equal
13632
+ */
13633
+ fileStateEqual(fieldName, field) {
13634
+ return (JSON.stringify(this._store.state[fieldName]) ===
13635
+ JSON.stringify(field.files) ||
13636
+ this._store.state[fieldName] == field.files);
13637
+ }
13638
+ /**
13639
+ * Checks for user defined validations
13640
+ * @param key - current key of the data model to validate
13641
+ * @param newVal - the newly set, incoming value to validate
13642
+ */
13522
13643
  async validate(key, newVal) {
13523
13644
  if (!this.validation)
13524
13645
  return;
@@ -13531,21 +13652,33 @@ let FieldValidator = class extends H {
13531
13652
  // collection loop into a promise
13532
13653
  await Promise.all(Object.entries(res).map(async ([key, o]) => {
13533
13654
  // switch on/off validation messages
13534
- const field = this.fields.find((f) => f.name === key);
13655
+ const field = this.allFields.find((f) => f.name === key);
13535
13656
  let validityTarget = field;
13536
13657
  if (field.tagName === 'NANO-CHECKBOX') {
13658
+ // if we have a checkbox-group, set the validation message there
13537
13659
  const cbg = field.closest('nano-checkbox-group');
13538
13660
  validityTarget = cbg || field;
13539
13661
  }
13540
- // status is now valid - clear the error
13541
- if (validityTarget.validityMessage === o.msg && o.valid)
13662
+ if ((validityTarget.validityMessage ||
13663
+ validityTarget.validationMessage) === o.msg &&
13664
+ o.valid) {
13665
+ // status is now valid - clear the error
13542
13666
  await this.setFieldError(validityTarget, '');
13543
- // status is invalid. Set the error
13667
+ }
13544
13668
  else if (!o.valid) {
13669
+ // status is invalid. Set the error
13545
13670
  await this.setFieldError(validityTarget, o.msg);
13546
13671
  }
13547
13672
  }));
13548
13673
  }
13674
+ /** Loops through all store entries and checks custom validation */
13675
+ async validateAllFields() {
13676
+ // This forces our loop to `await` and finish sequentially ... silly async stencil methods
13677
+ await Object.entries(this._store.state).reduce(async (memo, [key, value]) => {
13678
+ await memo;
13679
+ await this.validate(key, value);
13680
+ }, undefined);
13681
+ }
13549
13682
  /**
13550
13683
  * Utility to smooth out setting error messages
13551
13684
  * (it's a different method on `nano-checkbox` 'cos they don't show errors themselves)
@@ -13555,16 +13688,10 @@ let FieldValidator = class extends H {
13555
13688
  async setFieldError(field, msg) {
13556
13689
  if (field['showError'])
13557
13690
  await field.showError(msg);
13558
- else
13691
+ else if (field['setError'])
13559
13692
  await field.setError(msg);
13560
- }
13561
- /** Loops through all store entries and checks field validity */
13562
- async validateAllFields() {
13563
- // This forces our loop to `await` and finish sequentially ... silly async stencil methods
13564
- await Object.entries(this._store.state).reduce(async (memo, [key, value]) => {
13565
- await memo;
13566
- await this.validate(key, value);
13567
- }, undefined);
13693
+ else
13694
+ field.setCustomValidity(msg);
13568
13695
  }
13569
13696
  scrollToFirstInvalid() {
13570
13697
  if (!this.scrollToInvalid)
@@ -13593,17 +13720,21 @@ let FieldValidator = class extends H {
13593
13720
  requestAnimationFrame(() => {
13594
13721
  this.setupFields();
13595
13722
  this.attachSlotObserver();
13596
- this._store.on('set', (key, value) => this.handleStoreChange(key, value));
13597
13723
  this.host.addEventListener('nanoChange', this.handleFieldChange);
13724
+ this.host.addEventListener('input', this.handlePlainFieldChange);
13725
+ this.host.addEventListener('change', this.handlePlainFieldChange);
13598
13726
  this.host.addEventListener('submit', this.handleSubmit);
13727
+ this._store.on('set', this.handleStoreChange);
13599
13728
  });
13600
13729
  }
13601
13730
  disconnectedCallback() {
13602
13731
  if (this.mo)
13603
13732
  this.mo.disconnect();
13604
- this._store.reset();
13605
13733
  this.host.removeEventListener('nanoChange', this.handleFieldChange);
13734
+ this.host.removeEventListener('input', this.handlePlainFieldChange);
13735
+ this.host.removeEventListener('change', this.handlePlainFieldChange);
13606
13736
  this.host.removeEventListener('submit', this.handleSubmit);
13737
+ this._store.reset();
13607
13738
  if (this.activeForm)
13608
13739
  this.activeForm.removeEventListener('invalid', this.handleFormInvalid, true);
13609
13740
  }
@@ -13613,11 +13744,12 @@ let FieldValidator = class extends H {
13613
13744
  get host() { return this; }
13614
13745
  static get watchers() { return {
13615
13746
  "userForm": ["userFormChange"],
13616
- "validateOn": ["validateOnChange"]
13747
+ "validateOn": ["validateOnChange"],
13748
+ "extraFieldSelector": ["attachSlotObserver"]
13617
13749
  }; }
13618
13750
  };
13619
13751
 
13620
- const fileUploadCss = ".sc-nano-file-upload-h{-webkit-box-sizing:border-box;box-sizing:border-box}*.sc-nano-file-upload,*.sc-nano-file-upload::before,*.sc-nano-file-upload::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden].sc-nano-file-upload{display:none !important}.sc-nano-file-upload-h{min-height:1rem;display:block;--invalid-msg-color:var(--nano-color-danger, #ef4135);--invalid-msg-font-size:var(--nano-input-help-font-size, 0.75em);--help-msg-color:var(--nano-input-help-color, #616d6e);--label-color:var(--nano-input-label-color, \"currentColor\");--label-font-size:var(--nano-input-label-color, 1em);--label-padding:var(--nano-input-padding-bottom, var(--nano-input-padding, 6px));--label-color--invalid:var(--nano-input-label-color-invalid, \"currentColor\");--drop-bg:#f2f7f9;--drop-text:#756f6a;--drop-height:3.5em;--drop-border-tint:var(--nano-color-primary-rgb, 0, 116, 149);--drop-border-width:2px;--drop-border-radius:5px;--drop-bg--invalid:var(--nano-input-background-color, white);--drop-border--invalid:var(--nano-color-danger-rgb, 239, 65, 53);--btn-bg:var(--nano-color-primary, #007495);--btn-text:var(--nano-color-primary-contrast, #fff);--btn-icon-size:var(--nano-btn-icon-size, 1.4em);--btn-padding-top:var(--nano-btn-padding-top, 0.5em);--btn-padding-bottom:var(--nano-btn-padding-bottom, 0.5em);--btn-padding-start:var(--nano-btn-padding-start, 1em);--btn-padding-end:var(--nano-btn-padding-end, 1em)}[disabled].sc-nano-file-upload-h:not([disabled=false]){opacity:0.7}[disabled].sc-nano-file-upload-h:not([disabled=false]) *.sc-nano-file-upload{pointer-events:none !important}.file-upload__label.sc-nano-file-upload{font-size:var(--label-font-size);padding:0 0 var(--label-padding);margin:0;line-height:1}[invalid].sc-nano-file-upload-h:not([invalid=false]) .file-upload__label.sc-nano-file-upload{color:var(--label-color--invalid)}.file-upload__input.sc-nano-file-upload{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.file-upload__error.sc-nano-file-upload,.file-upload__help.sc-nano-file-upload,.file-upload__more.sc-nano-file-upload,.file-upload__label.sc-nano-file-upload{display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-upload__more.sc-nano-file-upload{height:1em;margin-left:3px;margin-right:0;margin-top:calc(var(--label-padding) / 2);margin-bottom:var(--label-padding);position:relative}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__more.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:3px;margin-inline-start:3px;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__error.sc-nano-file-upload,.file-upload__help.sc-nano-file-upload{top:0;left:0;position:absolute;font-size:var(--invalid-msg-font-size);line-height:1.2;-webkit-transition:0.3s ease-out opacity;transition:0.3s ease-out opacity}.file-upload--invalid.sc-nano-file-upload .file-upload__error.sc-nano-file-upload,.file-upload--invalid.sc-nano-file-upload .file-upload__help.sc-nano-file-upload{opacity:1}.file-upload__error.sc-nano-file-upload{color:var(--invalid-msg-color);font-stretch:condensed;opacity:0}.file-upload--invalid.sc-nano-file-upload .file-upload__error.sc-nano-file-upload{opacity:1}.file-upload__help.sc-nano-file-upload{font-style:italic;opacity:1;color:var(--help-msg-color)}.file-upload--invalid.sc-nano-file-upload .file-upload__help.sc-nano-file-upload{opacity:0}.file-upload__drop.sc-nano-file-upload{position:relative;width:100%;display:inline-block}.file-upload__drop-area.sc-nano-file-upload{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background-color:var(--drop-bg);color:var(--drop-text);min-height:var(--drop-height);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:0.9em;position:relative;-webkit-transition:background-color 0.15s ease-in-out;transition:background-color 0.15s ease-in-out;padding:0.5rem}[disabled].sc-nano-file-upload-h:not([disabled=false]) .file-upload__drop-area.sc-nano-file-upload{opacity:0.7}.file-upload--invalid.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload{background-color:var(--drop-bg--invalid)}.file-upload--dragging.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload{background-color:#fff}.file-upload__drop-area.sc-nano-file-upload::after{content:\"\";position:absolute;border-radius:var(--drop-border-radius);border-width:var(--drop-border-width);border-color:rgba(var(--drop-border-tint), 0.5);border-style:dashed;top:0;bottom:0;left:0;right:0;-webkit-transition:top 0.1s ease-in-out, bottom 0.1s ease-in-out, left 0.1s ease-in-out, right 0.1s ease-in-out;transition:top 0.1s ease-in-out, bottom 0.1s ease-in-out, left 0.1s ease-in-out, right 0.1s ease-in-out}.file-upload--invalid.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload::after{border-color:rgba(var(--drop-border--invalid), 1)}.file-upload--dragging.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload::after{top:5px;bottom:5px;left:5px;right:5px}.file-upload__drop-area.sc-nano-file-upload span.sc-nano-file-upload{color:rgba(var(--drop-border-tint), 1);text-decoration:underline;border-radius:2px;z-index:1;cursor:pointer;position:relative}.file-upload--focus.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload span.sc-nano-file-upload{-webkit-box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)))}.file-upload__list.sc-nano-file-upload{list-style:none;margin:0;padding:0}.file-upload__list-wrap.sc-nano-file-upload{position:relative;top:-4px}.file-upload__list-item.sc-nano-file-upload{width:100%;margin:0 0 2px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:hideListItem 0.3s ease-in-out forwards;animation:hideListItem 0.3s ease-in-out forwards}@-webkit-keyframes hideListItem{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes hideListItem{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}}.file-upload__list-item--active.sc-nano-file-upload{-webkit-animation:showListItem 0.3s ease-in-out forwards;animation:showListItem 0.3s ease-in-out forwards}@-webkit-keyframes showListItem{0%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes showListItem{0%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}}.file-upload__list.sc-nano-file-upload .list-title.sc-nano-file-upload{background:var(--nano-color-blue--faded);border-radius:5px;padding:5px 5px;margin-right:2px;display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:0.9em;color:var(--help-msg-color)}.file-upload__list.sc-nano-file-upload .list-button.sc-nano-file-upload{background:var(--nano-color-blue--faded);border-radius:5px;margin:2px}.file-upload__list.sc-nano-file-upload .list-error.sc-nano-file-upload{--color:rgba(var(--drop-border--invalid), 1)}.file-upload__button.sc-nano-file-upload{margin:0;padding:0;border:none;background-color:transparent;font:inherit;-webkit-box-align:center;text-decoration:none;color:inherit;-webkit-transition:background-color 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;transition:background-color 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;transition:background-color 100ms ease-in-out, box-shadow 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out;transition:background-color 100ms ease-in-out, box-shadow 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;padding-left:var(--nano-btn-padding-start, 1rem);padding-right:var(--nano-btn-padding-end, 1rem);padding-top:var(--nano-btn-padding-top, 0.5rem);padding-bottom:var(--nano-btn-padding-bottom, 0.5rem);-webkit-box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2));box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2));display:inline-block;border-radius:var(--nano-btn-border-radius, 5px);line-height:var(--nano-btn-line-height, 1.5rem);font-weight:500;cursor:pointer;background:rgba(0, 0, 0, 0.02);background-color:var(--btn-bg);color:var(--btn-text);--nano-btn-icon-size:var(--btn-icon-size);--nano-btn-line-height:var(--btn-icon-size);--nano-btn-padding-top:var(--btn-padding-top);--nano-btn-padding-bottom:var(--btn-padding-bottom);--nano-btn-padding-start:var(--btn-padding-start);--nano-btn-padding-end:var(--btn-padding-end);max-width:100%;font-size:0.9em}.file-upload__button.sc-nano-file-upload::-moz-focus-inner{border:0;padding:0}.file-upload__button.sc-nano-file-upload:hover,.file-upload__button.sc-nano-file-upload:focus{text-decoration:none;color:inherit}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--nano-btn-padding-start, 1rem);padding-inline-start:var(--nano-btn-padding-start, 1rem);-webkit-padding-end:var(--nano-btn-padding-end, 1rem);padding-inline-end:var(--nano-btn-padding-end, 1rem)}}@media print{.file-upload__button.sc-nano-file-upload{display:none}}.file-upload__button.sc-nano-file-upload:focus,.file-upload__button.button--focus.sc-nano-file-upload{outline:none;-webkit-box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)))}.file-upload__button.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0.5rem;margin-right:0;font-size:var(--nano-btn-icon-size, 1rem);vertical-align:middle;margin-top:-0.188rem;display:inline-block}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__button.button--icon-start.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0;margin-right:0.5rem}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.button--icon-start.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0.5rem;margin-inline-end:0.5rem}}.file-upload__button.sc-nano-file-upload:hover:not(.file-upload__button--disabled){-webkit-box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2))}.file-upload__button.sc-nano-file-upload:active:not(.button--disabled):not(:disabled){-webkit-box-shadow:none;box-shadow:none}.file-upload__button--disabled.sc-nano-file-upload,.file-upload__button.sc-nano-file-upload:disabled{opacity:0.6}.file-upload__button--disabled.sc-nano-file-upload:hover,.file-upload__button.sc-nano-file-upload:disabled:hover{cursor:default}.file-upload__button.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled),.file-upload__button.button--active.sc-nano-file-upload{background-color:var(--nano-color-primary-shade, #00637f);color:var(--btn-text)}.file-upload__button.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled).button--keyline,.file-upload__button.button--active.button--keyline.sc-nano-file-upload{background-color:var(--btn-bg);color:var(--btn-text)}.file-upload__button.sc-nano-file-upload:focus{color:var(--btn-text)}.file-upload__button.button--keyline.sc-nano-file-upload{background:transparent;border-style:var(--nano-btn-border-style, solid);border-width:var(--nano-btn-border-width, 2px);border-radius:var(--nano-btn-border-radius, 5px);color:var(--btn-bg);border-color:var(--btn-bg)}.file-upload__button.button--keyline.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled),.file-upload__button.button--keyline.sc-nano-file-upload:not(.button--focus),.file-upload__button.button--keyline.button--active.sc-nano-file-upload{-webkit-box-shadow:none;box-shadow:none}[disabled].sc-nano-file-upload-h:not([disabled=false]) .file-upload__button.sc-nano-file-upload{opacity:0.4}.file-upload--dragging.sc-nano-file-upload .file-upload__button.sc-nano-file-upload{--nano-btn-border-style:dashed}.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;font-size:inherit;padding:0;border:0;outline:none;background-color:transparent;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:auto;color:var(--clear-btn-color)}.is-invalid.sc-nano-file-upload-h .file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload{color:var(--clear-btn-color--invalid)}.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0.4rem;margin-right:0;margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0.4rem;margin-inline-start:0.4rem;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__button.sc-nano-file-upload .file-upload__btn-content.sc-nano-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.file-upload__button.sc-nano-file-upload .file-upload__btn-content.sc-nano-file-upload span.sc-nano-file-upload{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}";
13752
+ const fileUploadCss = ".sc-nano-file-upload-h{-webkit-box-sizing:border-box;box-sizing:border-box}*.sc-nano-file-upload,*.sc-nano-file-upload::before,*.sc-nano-file-upload::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden].sc-nano-file-upload{display:none !important}.sc-nano-file-upload-h{min-height:1rem;display:block;--invalid-msg-color:var(--nano-color-danger, #ef4135);--invalid-msg-font-size:var(--nano-input-help-font-size, 0.75em);--help-msg-color:var(--nano-input-help-color, #616d6e);--label-color:var(--nano-input-label-color, \"currentColor\");--label-font-size:var(--nano-input-label-color, 1em);--label-padding:var(--nano-input-padding-bottom, var(--nano-input-padding, 6px));--label-color--invalid:var(--nano-input-label-color-invalid, \"currentColor\");--drop-bg:#f2f7f9;--drop-text:#756f6a;--drop-height:3.5em;--drop-border-tint:var(--nano-color-primary-rgb, 0, 116, 149);--drop-border-width:2px;--drop-border-radius:5px;--drop-bg--invalid:var(--nano-input-background-color, white);--drop-border--invalid:var(--nano-color-danger-rgb, 239, 65, 53);--btn-bg:var(--nano-color-primary, #007495);--btn-text:var(--nano-color-primary-contrast, #fff);--btn-icon-size:var(--nano-btn-icon-size, 1.4em);--btn-padding-top:var(--nano-btn-padding-top, 0.5em);--btn-padding-bottom:var(--nano-btn-padding-bottom, 0.5em);--btn-padding-start:var(--nano-btn-padding-start, 1em);--btn-padding-end:var(--nano-btn-padding-end, 1em)}[disabled].sc-nano-file-upload-h:not([disabled=false]){opacity:0.7}[disabled].sc-nano-file-upload-h:not([disabled=false]) *.sc-nano-file-upload{pointer-events:none !important}.file-upload__label.sc-nano-file-upload{font-size:var(--label-font-size);padding:0 0 var(--label-padding);margin:0;line-height:1}[invalid].sc-nano-file-upload-h:not([invalid=false]) .file-upload__label.sc-nano-file-upload{color:var(--label-color--invalid)}.file-upload__input.sc-nano-file-upload{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.file-upload__error.sc-nano-file-upload,.file-upload__help.sc-nano-file-upload,.file-upload__more.sc-nano-file-upload,.file-upload__label.sc-nano-file-upload{display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.file-upload__more.sc-nano-file-upload{height:1em;margin-left:3px;margin-right:0;margin-top:calc(var(--label-padding) / 2);margin-bottom:var(--label-padding);position:relative}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__more.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:3px;margin-inline-start:3px;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__error.sc-nano-file-upload,.file-upload__help.sc-nano-file-upload{top:0;left:0;position:absolute;font-size:var(--invalid-msg-font-size);line-height:1.2;-webkit-transition:0.3s ease-out opacity;transition:0.3s ease-out opacity}.file-upload--invalid.sc-nano-file-upload .file-upload__error.sc-nano-file-upload,.file-upload--invalid.sc-nano-file-upload .file-upload__help.sc-nano-file-upload{opacity:1}.file-upload__error.sc-nano-file-upload{color:var(--invalid-msg-color);font-stretch:condensed;opacity:0}.file-upload--invalid.sc-nano-file-upload .file-upload__error.sc-nano-file-upload{opacity:1}.file-upload__help.sc-nano-file-upload{font-style:italic;opacity:1;color:var(--help-msg-color)}.file-upload--invalid.sc-nano-file-upload .file-upload__help.sc-nano-file-upload{opacity:0}.file-upload__drop.sc-nano-file-upload{position:relative;width:100%;display:inline-block}.file-upload__drop-area.sc-nano-file-upload{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background-color:var(--drop-bg);color:var(--drop-text);min-height:var(--drop-height);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:0.9em;position:relative;-webkit-transition:background-color 0.15s ease-in-out;transition:background-color 0.15s ease-in-out;padding:0.5rem}[disabled].sc-nano-file-upload-h:not([disabled=false]) .file-upload__drop-area.sc-nano-file-upload{opacity:0.7}.file-upload--invalid.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload{background-color:var(--drop-bg--invalid)}.file-upload--dragging.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload{background-color:#fff}.file-upload__drop-area.sc-nano-file-upload::after{content:\"\";position:absolute;border-radius:var(--drop-border-radius);border-width:var(--drop-border-width);border-color:rgba(var(--drop-border-tint), 0.5);border-style:dashed;top:0;bottom:0;left:0;right:0;-webkit-transition:top 0.1s ease-in-out, bottom 0.1s ease-in-out, left 0.1s ease-in-out, right 0.1s ease-in-out;transition:top 0.1s ease-in-out, bottom 0.1s ease-in-out, left 0.1s ease-in-out, right 0.1s ease-in-out}.file-upload--invalid.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload::after{border-color:rgba(var(--drop-border--invalid), 1)}.file-upload--dragging.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload::after{top:5px;bottom:5px;left:5px;right:5px}.file-upload__drop-area.sc-nano-file-upload span.sc-nano-file-upload{color:rgba(var(--drop-border-tint), 1);text-decoration:underline;border-radius:2px;z-index:1;cursor:pointer;position:relative}.file-upload--focus.sc-nano-file-upload .file-upload__drop-area.sc-nano-file-upload span.sc-nano-file-upload{-webkit-box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)))}.file-upload__list.sc-nano-file-upload{list-style:none;margin:0;padding:0}.file-upload__list-wrap.sc-nano-file-upload{position:relative;top:-4px}.file-upload__list-item.sc-nano-file-upload{width:100%;margin:0 0 2px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:hideListItem 0.3s ease-in-out forwards;animation:hideListItem 0.3s ease-in-out forwards}@-webkit-keyframes hideListItem{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes hideListItem{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}}.file-upload__list-item--active.sc-nano-file-upload{-webkit-animation:showListItem 0.3s ease-in-out forwards;animation:showListItem 0.3s ease-in-out forwards}@-webkit-keyframes showListItem{0%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes showListItem{0%{opacity:0;-webkit-transform:translateY(10px);transform:translateY(10px);-webkit-transform:translateZ(0);transform:translateZ(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:translateZ(0);transform:translateZ(0)}}.file-upload__list.sc-nano-file-upload .list-title.sc-nano-file-upload{background:var(--nano-color-blue--faded);border-radius:5px;padding:5px 5px;margin-right:2px;display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:0.9em;color:var(--help-msg-color)}.file-upload__list.sc-nano-file-upload .list-button.sc-nano-file-upload{background:var(--nano-color-blue--faded);border-radius:5px;margin:2px}.file-upload__list.sc-nano-file-upload .list-error.sc-nano-file-upload{--color:rgba(var(--drop-border--invalid), 1)}.file-upload__button.sc-nano-file-upload{padding:0;border:none;background-color:transparent;font:inherit;-webkit-box-align:center;text-decoration:none;color:inherit;-webkit-transition:background-color 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;transition:background-color 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;transition:background-color 100ms ease-in-out, box-shadow 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out;transition:background-color 100ms ease-in-out, box-shadow 100ms ease-in-out, border-color 100ms ease-in-out, color 100ms ease-in-out, -webkit-box-shadow 100ms ease-in-out;padding-left:var(--nano-btn-padding-start, 1rem);padding-right:var(--nano-btn-padding-end, 1rem);padding-top:var(--nano-btn-padding-top, 0.5rem);padding-bottom:var(--nano-btn-padding-bottom, 0.5rem);-webkit-box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2));box-shadow:var(--nano-layer-shadow-medium, 0 2px 4px rgba(0, 0, 0, 0.2));display:inline-block;border-radius:var(--nano-btn-border-radius, 5px);line-height:var(--nano-btn-line-height, 1.5rem);font-weight:500;cursor:pointer;background:rgba(0, 0, 0, 0.02);background-color:var(--btn-bg);color:var(--btn-text);--nano-btn-icon-size:var(--btn-icon-size);--nano-btn-line-height:var(--btn-icon-size);--nano-btn-padding-top:var(--btn-padding-top);--nano-btn-padding-bottom:var(--btn-padding-bottom);--nano-btn-padding-start:var(--btn-padding-start);--nano-btn-padding-end:var(--btn-padding-end);max-width:100%;font-size:0.9em}.file-upload__button.sc-nano-file-upload::-moz-focus-inner{border:0;padding:0}.file-upload__button.sc-nano-file-upload:hover,.file-upload__button.sc-nano-file-upload:focus{text-decoration:none;color:inherit}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload{padding-left:unset;padding-right:unset;-webkit-padding-start:var(--nano-btn-padding-start, 1rem);padding-inline-start:var(--nano-btn-padding-start, 1rem);-webkit-padding-end:var(--nano-btn-padding-end, 1rem);padding-inline-end:var(--nano-btn-padding-end, 1rem)}}@media print{.file-upload__button.sc-nano-file-upload{display:none}}.file-upload__button.sc-nano-file-upload:focus,.file-upload__button.button--focus.sc-nano-file-upload{outline:none;-webkit-box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));box-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)))}.file-upload__button.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0.5rem;margin-right:0;font-size:var(--nano-btn-icon-size, 1rem);vertical-align:middle;margin-top:-0.188rem;display:inline-block}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0.5rem;margin-inline-start:0.5rem;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__button.button--icon-start.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0;margin-right:0.5rem}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.button--icon-start.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0.5rem;margin-inline-end:0.5rem}}.file-upload__button.sc-nano-file-upload:hover:not(.file-upload__button--disabled){-webkit-box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2))}.file-upload__button.sc-nano-file-upload:active:not(.button--disabled):not(:disabled){-webkit-box-shadow:none;box-shadow:none}.file-upload__button--disabled.sc-nano-file-upload,.file-upload__button.sc-nano-file-upload:disabled{opacity:0.6}.file-upload__button--disabled.sc-nano-file-upload:hover,.file-upload__button.sc-nano-file-upload:disabled:hover{cursor:default}.file-upload__button.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled),.file-upload__button.button--active.sc-nano-file-upload{background-color:var(--nano-color-primary-shade, #00637f);color:var(--btn-text)}.file-upload__button.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled).button--keyline,.file-upload__button.button--active.button--keyline.sc-nano-file-upload{background-color:var(--btn-bg);color:var(--btn-text)}.file-upload__button.sc-nano-file-upload:focus{color:var(--btn-text)}.file-upload__button.button--keyline.sc-nano-file-upload{background:transparent;border-style:var(--nano-btn-border-style, solid);border-width:var(--nano-btn-border-width, 2px);border-radius:var(--nano-btn-border-radius, 5px);color:var(--btn-bg);border-color:var(--btn-bg)}.file-upload__button.button--keyline.sc-nano-file-upload:hover:not(.button--disabled):not(:disabled),.file-upload__button.button--keyline.sc-nano-file-upload:not(.button--focus),.file-upload__button.button--keyline.button--active.sc-nano-file-upload{-webkit-box-shadow:none;box-shadow:none}[disabled].sc-nano-file-upload-h:not([disabled=false]) .file-upload__button.sc-nano-file-upload{opacity:0.4}.file-upload--dragging.sc-nano-file-upload .file-upload__button.sc-nano-file-upload{--nano-btn-border-style:dashed}.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;font-size:inherit;padding:0;border:0;outline:none;background-color:transparent;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:auto;color:var(--clear-btn-color)}.is-invalid.sc-nano-file-upload-h .file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload{color:var(--clear-btn-color--invalid)}.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:0.4rem;margin-right:0;margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.file-upload__button.sc-nano-file-upload .file-upload__clear-btn.sc-nano-file-upload nano-icon.sc-nano-file-upload{margin-left:unset;margin-right:unset;-webkit-margin-start:0.4rem;margin-inline-start:0.4rem;-webkit-margin-end:0;margin-inline-end:0}}.file-upload__button.sc-nano-file-upload .file-upload__btn-content.sc-nano-file-upload{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.file-upload__button.sc-nano-file-upload .file-upload__btn-content.sc-nano-file-upload span.sc-nano-file-upload{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}";
13621
13753
 
13622
13754
  let fileInputIds = 0;
13623
13755
  let getDataTransfer = () => new DataTransfer();
@@ -16783,6 +16915,7 @@ let Input = class extends H {
16783
16915
  this.nativeInput.dispatchEvent(event);
16784
16916
  };
16785
16917
  this.validate = debounce$2(this.validate, 50);
16918
+ this.handleBlur = this.handleBlur.bind(this);
16786
16919
  }
16787
16920
  get nativeInputWrap() {
16788
16921
  return this._nativeInputWrap;
@@ -16868,6 +17001,15 @@ let Input = class extends H {
16868
17001
  this.nativeInput.click();
16869
17002
  }
16870
17003
  }
17004
+ /**
17005
+ * Sets focus and select the text on the specified `nano-input`. Use this method instead of the global
17006
+ * `input.select()`.
17007
+ */
17008
+ async select() {
17009
+ if (this.nativeInput) {
17010
+ this.nativeInput.select();
17011
+ }
17012
+ }
16871
17013
  /**
16872
17014
  * Returns the native `<input>` element used under the hood.
16873
17015
  */
@@ -16897,11 +17039,14 @@ let Input = class extends H {
16897
17039
  const kev = e;
16898
17040
  let target;
16899
17041
  raf(() => {
16900
- if (kev.key) {
17042
+ if (e instanceof KeyboardEvent && kev.key) {
16901
17043
  if (kev.key !== 'Tab')
16902
17044
  return;
16903
17045
  target = document.activeElement;
16904
17046
  }
17047
+ else if (e instanceof FocusEvent) {
17048
+ target = document.activeElement;
17049
+ }
16905
17050
  else
16906
17051
  target = e.target;
16907
17052
  if (closestElement(this.el.tagName.toLowerCase(), target) !== this.el) {
@@ -17004,10 +17149,10 @@ let Input = class extends H {
17004
17149
  disabled,
17005
17150
  clearControl: this.clearInput,
17006
17151
  }))(this);
17007
- return (h$1(Host$1, { "aria-disabled": this.disabled ? 'true' : null, dir: this.rtl ? 'rtl' : null, class: Object.assign(Object.assign({}, createColorClasses(this.color)), { 'has-value': this.hasValue(), 'has-focus': this.hasFocus, 'is-invalid': this._invalid }) }, h$1(FormControlWrap, Object.assign({}, wrapOptions), h$1(FormControl, Object.assign({}, controlOptions, { onClearText: this.clearTextInput, control: this.el, ref: (el) => (this.nativeInputWrap = el) }), this.type !== 'textarea' && (h$1("input", { id: this.inputId, class: "input__native-ctrl", ref: (input) => (this.nativeInput = input), "aria-labelledby": labelId + ' ' + moreId + ' ' + helperEndId, disabled: this.disabled, accept: this.accept, autoCapitalize: this.autocapitalise, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, inputMode: this.inputmode, form: this.form, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, size: this.size, type: this.type, value: value, onInput: this.onInput, onChange: this.onInput, onFocus: this.onFocus, onKeyDown: this.onKeydown, onInvalid: this.validate })), this.type === 'textarea' && (h$1("textarea", { rows: this.floatLabel ? 1 : this.rows, id: this.inputId, class: {
17152
+ return (h$1(Host$1, { "aria-disabled": this.disabled ? 'true' : null, dir: this.rtl ? 'rtl' : null, class: Object.assign(Object.assign({}, createColorClasses(this.color)), { 'has-value': this.hasValue(), 'has-focus': this.hasFocus, 'is-invalid': this._invalid }) }, h$1(FormControlWrap, Object.assign({}, wrapOptions), h$1(FormControl, Object.assign({}, controlOptions, { onClearText: this.clearTextInput, control: this.el, ref: (el) => (this.nativeInputWrap = el) }), this.type !== 'textarea' && (h$1("input", { id: this.inputId, class: "input__native-ctrl", ref: (input) => (this.nativeInput = input), "aria-labelledby": labelId + ' ' + moreId + ' ' + helperEndId, disabled: this.disabled, accept: this.accept, autoCapitalize: this.autocapitalise, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, inputMode: this.inputmode, form: this.form, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, size: this.size, type: this.type, value: value, onInput: this.onInput, onChange: this.onInput, onFocus: this.onFocus, onBlur: this.handleBlur, onKeyDown: this.onKeydown, onInvalid: this.validate })), this.type === 'textarea' && (h$1("textarea", { rows: this.floatLabel ? 1 : this.rows, id: this.inputId, class: {
17008
17153
  'input__native-ctrl': true,
17009
17154
  input__resizable: this.resize === 'true',
17010
- }, ref: (input) => (this.nativeInput = input), "aria-labelledby": labelId + ' ' + moreId + ' ' + helperEndId, disabled: this.disabled, autoCapitalize: this.autocapitalise, autoCorrect: this.autocorrect, autoFocus: this.autofocus, inputMode: this.inputmode, form: this.form, minLength: this.minlength, maxLength: this.maxlength, name: this.name, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, value: value, onInput: this.onInput, onChange: this.onInput, onFocus: this.onFocus, onKeyDown: this.onKeydown, onInvalid: this.validate }))), h$1("slot", null))));
17155
+ }, ref: (input) => (this.nativeInput = input), "aria-labelledby": labelId + ' ' + moreId + ' ' + helperEndId, disabled: this.disabled, autoCapitalize: this.autocapitalise, autoCorrect: this.autocorrect, autoFocus: this.autofocus, inputMode: this.inputmode, form: this.form, minLength: this.minlength, maxLength: this.maxlength, name: this.name, placeholder: this.placeholder, readOnly: this.readonly, required: this.required, spellcheck: this.spellcheck, value: value, onInput: this.onInput, onChange: this.onInput, onFocus: this.onFocus, onKeyDown: this.onKeydown, onInvalid: this.validate, onBlur: this.handleBlur }))), h$1("slot", null))));
17011
17156
  }
17012
17157
  get el() { return this; }
17013
17158
  static get watchers() { return {
@@ -18892,6 +19037,7 @@ let Select = class extends H {
18892
19037
  */
18893
19038
  // eslint-disable-next-line @stencil/no-unused-watch
18894
19039
  valueChanged() {
19040
+ this.customValidate();
18895
19041
  if (this.onInit) {
18896
19042
  if (this.multiple)
18897
19043
  this.currInsertIndex = this.value.length - 1;
@@ -25058,7 +25204,7 @@ const NanoDetails = /*@__PURE__*/proxyCustomElement(Details, [1,"nano-details",{
25058
25204
  const NanoDialog = /*@__PURE__*/proxyCustomElement(Dialog, [1,"nano-dialog",{"showRibbon":[4,"show-ribbon"],"open":[1540],"label":[1],"noHeader":[4,"no-header"],"noFooter":[4,"no-footer"],"noUserDismiss":[4,"no-user-dismiss"],"storeId":[1,"store-id"],"storeMethod":[1,"store-method"],"hoist":[4],"isVisible":[32],"noDismiss":[32],"hasFooter":[32]}]);
25059
25205
  const NanoDrawer = /*@__PURE__*/proxyCustomElement(Drawer, [1,"nano-drawer",{"open":[1540],"label":[1],"placement":[1],"contained":[4],"noHeader":[4,"no-header"],"type":[1],"contentSelector":[1,"content-selector"],"hasFooter":[32],"isVisible":[32]}]);
25060
25206
  const NanoDropdown = /*@__PURE__*/proxyCustomElement(Dropdown, [1,"nano-dropdown",{"autoOpen":[4,"auto-open"],"open":[1540],"closeOnSelect":[4,"close-on-select"],"containingElement":[1040],"tetherTo":[16],"placement":[1],"distance":[2],"skidding":[2],"hoist":[4],"dialogTitle":[1,"dialog-title"]},[[0,"nanoOpen","secondaryOpen"],[0,"nanoClose","secondaryClose"],[0,"nanoSelect","handlePanelSelect"]]]);
25061
- const NanoFieldValidator = /*@__PURE__*/proxyCustomElement(FieldValidator, [4,"nano-field-validator",{"validateOn":[1025,"validate-on"],"scrollToInvalid":[4,"scroll-to-invalid"],"dirty":[2564],"valid":[2564],"store":[2064],"payload":[2064],"showValidation":[2052,"show-validation"],"validationState":[2064],"validation":[16],"userForm":[32],"submitted":[32],"_dirty":[32],"_valid":[32],"_store":[32]}]);
25207
+ const NanoFieldValidator = /*@__PURE__*/proxyCustomElement(FieldValidator, [4,"nano-field-validator",{"validateOn":[1025,"validate-on"],"scrollToInvalid":[4,"scroll-to-invalid"],"dirty":[2564],"valid":[2564],"store":[2064],"payload":[2064],"showValidation":[2052,"show-validation"],"validationState":[2064],"extraFieldSelector":[1,"extra-field-selector"],"validation":[16],"submitted":[32],"userForm":[32],"_dirty":[32],"_valid":[32],"_store":[32]}]);
25062
25208
  const NanoFileUpload = /*@__PURE__*/proxyCustomElement(FileUpload, [6,"nano-file-upload",{"name":[1],"accept":[1],"capture":[1],"maxFileSize":[2,"max-file-size"],"maxFiles":[2,"max-files"],"label":[1],"placeholder":[1],"hideLabel":[4,"hide-label"],"required":[4],"disabled":[516],"clearInput":[4,"clear-input"],"showInlineError":[516,"show-inline-error"],"validateOn":[1025,"validate-on"],"form":[1],"invalid":[2564],"validityMessage":[2049,"validity-message"],"files":[6160],"value":[6145],"hasHelperSlot":[32],"hasLabelSlot":[32],"errorMessage":[32],"isDragging":[32],"fileList":[32],"hasFocus":[32],"_invalid":[32]},[[8,"click","globalClickHandler"],[8,"keydown","globalKeydownHandler"],[16,"reset","onReset"]]]);
25063
25209
  const NanoGlobalNav = /*@__PURE__*/proxyCustomElement(GlobalNav, [1,"nano-global-nav",{"env":[1],"ssoDataUrl":[1,"sso-data-url"],"ssoRedirect":[1,"sso-redirect"],"getMyAccountData":[4,"get-my-account-data"],"activeMyAccountSections":[16],"showSearch":[4,"show-search"],"showLogo":[4,"show-logo"],"logoUrl":[1,"logo-url"],"searchIndeces":[16],"myAccountUser":[1040],"searchAppId":[1025,"search-app-id"],"searchApiKey":[1025,"search-api-key"],"searchValue":[1025,"search-value"],"searchIndex":[1025,"search-index"],"cartCount":[1026,"cart-count"],"msgCount":[1026,"msg-count"],"cartUrl":[1025,"cart-url"],"msgUrl":[1025,"msg-url"],"hasLoggedinSlot":[32],"hasSiteSlot":[32],"hasPromotionSlot":[32],"aboutSlotLen":[32],"iconSlotLen":[32],"mainSlotLen":[32],"overflowSlotLen":[32],"searchSlotLen":[32],"internalSearchIndeces":[32],"thresholdReady":[32],"remoteDataReady":[32],"ready":[32],"isResizing":[32],"intersectRatio":[32],"threshold":[32],"modalOpen":[32],"modalIsOpen":[32],"searchBarShown":[32],"scrollingUp":[32],"searchLoading":[32],"showAutocomplete":[32],"secondaryMenuOpen":[32],"userMenuOpen":[32],"menuFullScreen":[32],"searchValInternal":[32]},[[0,"nanoOpen","secondaryOpen"],[0,"nanoClose","secondaryClose"]]]);
25064
25210
  const NanoGlobalSearchResults = /*@__PURE__*/proxyCustomElement(GlobalSearchResults, [1,"nano-global-search-results",{"algoliaEle":[32],"currentWidth":[32],"apiKey":[32],"appId":[32],"index":[32]},[[16,"nanoSearchReset","handleGlobalNavReset"],[16,"nanoSearchResult","handleGlobalNavSearch"],[0,"nanoChange","handleReorder"],[0,"nanoResultsShown","attachListeners"],[16,"nanoNewResults","attachResultListeners"]]]);
@@ -27606,6 +27752,6 @@ const index = /*#__PURE__*/Object.freeze({
27606
27752
  GESTURE_CONTROLLER: GESTURE_CONTROLLER
27607
27753
  });
27608
27754
 
27609
- export { NanoAccordion, NanoAlert, NanoAlgolia, NanoAlgoliaFilter, NanoAlgoliaInput, NanoAlgoliaPagination, NanoAlgoliaResults, NanoAspectRatio, NanoCheckbox, NanoCheckboxGroup, NanoDatalist, NanoDateInput, NanoDatePicker, NanoDetails, NanoDialog, NanoDrawer, NanoDropdown, NanoFieldValidator, NanoFileUpload, NanoGlobalNav, NanoGlobalSearchResults, NanoGrid, NanoGridItem, NanoHero, NanoIcon, NanoIconButton, NanoImg, NanoInput, NanoMenu, NanoMenuDrawer, NanoNavItem, NanoOption, NanoRange, NanoRating, NanoResizeObserve, NanoSelect, NanoSkeleton, NanoSlide, NanoSlides, NanoSpinner, NanoSplitPane, NanoSticker, NanoTab, NanoTabContent, NanoTabGroup, NanoTooltip, defineCustomElements, nanoCreateDialog, debounce$2 as nanoDebounce, raf as nanoRaf, nanoShowAlert, nanoShowToast, throttle as nanoThrottle, setAssetPath, setPlatformOptions };
27755
+ export { NanoAccordion, NanoAlert, NanoAlgolia, NanoAlgoliaFilter, NanoAlgoliaInput, NanoAlgoliaPagination, NanoAlgoliaResults, NanoAspectRatio, NanoCheckbox, NanoCheckboxGroup, NanoDatalist, NanoDateInput, NanoDatePicker, NanoDetails, NanoDialog, NanoDrawer, NanoDropdown, NanoFieldValidator, NanoFileUpload, NanoGlobalNav, NanoGlobalSearchResults, NanoGrid, NanoGridItem, NanoHero, NanoIcon, NanoIconButton, NanoImg, NanoInput, NanoMenu, NanoMenuDrawer, NanoNavItem, NanoOption, NanoRange, NanoRating, NanoResizeObserve, NanoSelect, NanoSkeleton, NanoSlide, NanoSlides, NanoSpinner, NanoSplitPane, NanoSticker, NanoTab, NanoTabContent, NanoTabGroup, NanoTooltip, defineCustomElements, nanoCreateDialog, debounce$2 as nanoDebounce, getTabbableElements as nanoGetTabElements, raf as nanoRaf, nanoShowAlert, nanoShowToast, throttle as nanoThrottle, setAssetPath, setPlatformOptions };
27610
27756
 
27611
27757
  //# sourceMappingURL=index.js.map