@nanoporetech-digital/components 2.12.0 → 2.13.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 (132) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cjs/index.cjs.js +4 -2
  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 +266 -124
  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.helpers.js +2 -2
  16. package/dist/collection/components/alert/alert.helpers.js.map +1 -1
  17. package/dist/collection/components/alert/alert.js +1 -1
  18. package/dist/collection/components/algolia/algolia-filter.js +2 -2
  19. package/dist/collection/components/algolia/algolia-input.js +5 -5
  20. package/dist/collection/components/algolia/algolia-results.js +1 -1
  21. package/dist/collection/components/algolia/algolia.js +6 -6
  22. package/dist/collection/components/checkbox/checkbox-group.js +2 -2
  23. package/dist/collection/components/checkbox/checkbox.js +3 -3
  24. package/dist/collection/components/datalist/datalist.js +1 -1
  25. package/dist/collection/components/date-input/date-input.js +8 -8
  26. package/dist/collection/components/date-picker/date-picker.js +5 -5
  27. package/dist/collection/components/details/details.js +1 -1
  28. package/dist/collection/components/dialog/dialog.js +1 -1
  29. package/dist/collection/components/dropdown/dropdown.js +1 -1
  30. package/dist/collection/components/field-validator/field-validator-interface.js.map +1 -1
  31. package/dist/collection/components/field-validator/field-validator.js +345 -130
  32. package/dist/collection/components/field-validator/field-validator.js.map +1 -1
  33. package/dist/collection/components/file-upload/file-upload.css +0 -1
  34. package/dist/collection/components/file-upload/file-upload.js +4 -4
  35. package/dist/collection/components/global-nav/global-nav.js +4 -4
  36. package/dist/collection/components/grid/grid-item.js +1 -1
  37. package/dist/collection/components/icon/icon.js +1 -1
  38. package/dist/collection/components/input/input.js +37 -8
  39. package/dist/collection/components/input/input.js.map +1 -1
  40. package/dist/collection/components/nav-item/nav-item.js +4 -4
  41. package/dist/collection/components/range/range.js +4 -4
  42. package/dist/collection/components/resize-observe/resize-observe.js +1 -1
  43. package/dist/collection/components/select/select.js +8 -7
  44. package/dist/collection/components/select/select.js.map +1 -1
  45. package/dist/collection/components/slides/slides.js +7 -7
  46. package/dist/collection/components/tabs/tab-group.js +2 -2
  47. package/dist/collection/index.js +1 -0
  48. package/dist/collection/index.js.map +1 -1
  49. package/dist/components/index.js +3 -2
  50. package/dist/components/index.js.map +1 -1
  51. package/dist/components/input.js +17 -3
  52. package/dist/components/input.js.map +1 -1
  53. package/dist/components/nano-field-validator.js +271 -126
  54. package/dist/components/nano-field-validator.js.map +1 -1
  55. package/dist/components/nano-file-upload.js +1 -1
  56. package/dist/components/nano-file-upload.js.map +1 -1
  57. package/dist/components/select.js +1 -0
  58. package/dist/components/select.js.map +1 -1
  59. package/dist/custom-elements/index.js +288 -132
  60. package/dist/custom-elements/index.js.map +1 -1
  61. package/dist/esm/index.js +3 -2
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/loader.js +1 -1
  64. package/dist/esm/nano-components.js +1 -1
  65. package/dist/esm/nano-field-validator.entry.js +266 -124
  66. package/dist/esm/nano-field-validator.entry.js.map +1 -1
  67. package/dist/esm/nano-file-upload.entry.js +1 -1
  68. package/dist/esm/nano-file-upload.entry.js.map +1 -1
  69. package/dist/esm/nano-input.entry.js +16 -3
  70. package/dist/esm/nano-input.entry.js.map +1 -1
  71. package/dist/esm/nano-nav-item_2.entry.js +1 -0
  72. package/dist/esm/nano-nav-item_2.entry.js.map +1 -1
  73. package/dist/esm-es5/index.js +2 -2
  74. package/dist/esm-es5/index.js.map +1 -1
  75. package/dist/esm-es5/loader.js +1 -1
  76. package/dist/esm-es5/loader.js.map +1 -1
  77. package/dist/esm-es5/nano-components.js +1 -1
  78. package/dist/esm-es5/nano-components.js.map +1 -1
  79. package/dist/esm-es5/nano-field-validator.entry.js +2 -2
  80. package/dist/esm-es5/nano-field-validator.entry.js.map +1 -1
  81. package/dist/esm-es5/nano-file-upload.entry.js +1 -1
  82. package/dist/esm-es5/nano-file-upload.entry.js.map +1 -1
  83. package/dist/esm-es5/nano-input.entry.js +1 -1
  84. package/dist/esm-es5/nano-input.entry.js.map +1 -1
  85. package/dist/esm-es5/nano-nav-item_2.entry.js +1 -1
  86. package/dist/esm-es5/nano-nav-item_2.entry.js.map +1 -1
  87. package/dist/nano-components/index.esm.js +1 -1
  88. package/dist/nano-components/index.esm.js.map +1 -1
  89. package/dist/nano-components/nano-components.esm.js +1 -1
  90. package/dist/nano-components/nano-components.esm.js.map +1 -1
  91. package/dist/nano-components/p-085e03db.system.entry.js +5 -0
  92. package/dist/nano-components/p-085e03db.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-a07cf44c.system.entry.js +5 -0
  98. package/dist/nano-components/{p-4558a9c6.system.entry.js.map → p-a07cf44c.system.entry.js.map} +1 -1
  99. package/dist/nano-components/{p-96d9b8b9.system.entry.js → p-c2bbf0fb.system.entry.js} +2 -2
  100. package/dist/nano-components/p-c2bbf0fb.system.entry.js.map +1 -0
  101. package/dist/nano-components/{p-72893d12.system.entry.js → p-cb512cff.system.entry.js} +2 -2
  102. package/dist/nano-components/p-cb512cff.system.entry.js.map +1 -0
  103. package/dist/nano-components/p-e35226a9.entry.js +5 -0
  104. package/dist/nano-components/p-e35226a9.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/nano-components/p-f62a40ea.system.js +5 -0
  110. package/dist/nano-components/{p-3258c568.system.js.map → p-f62a40ea.system.js.map} +1 -1
  111. package/dist/themes/nanopore.css +1 -1
  112. package/dist/themes/nanopore.css.map +1 -1
  113. package/dist/types/components/alert/alert.helpers.d.ts +2 -2
  114. package/dist/types/components/field-validator/field-validator-interface.d.ts +5 -1
  115. package/dist/types/components/field-validator/field-validator.d.ts +68 -12
  116. package/dist/types/components/input/input.d.ts +6 -1
  117. package/dist/types/components.d.ts +25 -3
  118. package/dist/types/index.d.ts +1 -0
  119. package/docs-json.json +65 -3
  120. package/docs-vscode.json +6 -2
  121. package/package.json +2 -2
  122. package/dist/nano-components/p-01667573.entry.js.map +0 -1
  123. package/dist/nano-components/p-055f7d35.entry.js.map +0 -1
  124. package/dist/nano-components/p-2b478ca1.system.entry.js +0 -5
  125. package/dist/nano-components/p-2b478ca1.system.entry.js.map +0 -1
  126. package/dist/nano-components/p-3258c568.system.js +0 -5
  127. package/dist/nano-components/p-4558a9c6.system.entry.js +0 -5
  128. package/dist/nano-components/p-5f4fc2b4.entry.js +0 -5
  129. package/dist/nano-components/p-5f4fc2b4.entry.js.map +0 -1
  130. package/dist/nano-components/p-72893d12.system.entry.js.map +0 -1
  131. package/dist/nano-components/p-91614b43.entry.js +0 -5
  132. package/dist/nano-components/p-96d9b8b9.system.entry.js.map +0 -1
@@ -2642,10 +2642,10 @@ async function nanoShowToast(message, position = 'tr', icon, alertOptions, butto
2642
2642
  /**
2643
2643
  * `nano-alert` helper to create alert notifications imperatively.
2644
2644
  * @param message - a JS template string e.g. `<h4>Hello</h4> ${aVariable}`
2645
- * @param buttons - { classes: string; content: string; handler: () => {} }[]
2645
+ * @param buttons
2646
2646
  * @param icon - name for the `nano-icon`
2647
2647
  * @param label - descriptive label for assitive technology
2648
- * @param alertOptions - { color: Color, duration: number, closable: boolean }
2648
+ * @param alertOptions
2649
2649
  * @returns `Promise<void>`
2650
2650
  */
2651
2651
  function nanoShowAlert(message, buttons = [], label, icon = 'light/info-circle', alertOptions = {}) {
@@ -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) => this.getName(field) === 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) => {
13364
- const found = validationState.find((v) => v.name === field.name);
13416
+ this.allFields.forEach(async (field) => {
13417
+ const found = validationState.find((v) => v.name === this.getName(field));
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
- name: field.name,
13378
- valid: !field.invalid,
13379
- value: this._store.state[field.name],
13458
+ name: this.getName(field),
13459
+ value: this._store.state[this.getName(field)],
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) => this.getName(f) === 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)
@@ -13407,118 +13506,149 @@ let FieldValidator = class extends H {
13407
13506
  subtree: true,
13408
13507
  });
13409
13508
  }
13509
+ /**
13510
+ * During spec tests, mockelement props aren't set - only attributes.
13511
+ * This irons out that kink
13512
+ * @param field
13513
+ * @returns
13514
+ */
13515
+ getName(field) {
13516
+ return field.name || field.getAttribute('name');
13517
+ }
13410
13518
  /** Checks for new `nano-...` fields and adds them to our watch array and value store */
13411
13519
  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);
13520
+ let nanoFields = Array.from(this.host.querySelectorAll(this.nanoFieldSelector));
13521
+ let plainFields = Array.from(this.host.querySelectorAll(this.extraFieldSelector)).filter((e) => !e.closest(this.nanoFieldSelector));
13522
+ nanoFields = nanoFields.filter((f) => !!this.getName(f) && !!this.getName(f).length);
13523
+ plainFields = plainFields.filter((f) => !!this.getName(f) && !!this.getName(f).length);
13420
13524
  // do we have any currently un-watched fields?
13421
- if (!fields.filter((f) => !this.fields.includes(f)).length)
13525
+ if (![...nanoFields, ...plainFields].filter((f) => !this.allFields.includes(f)).length)
13422
13526
  return;
13423
13527
  // setup the initial store state / refresh on new fields
13424
- this.fields = fields;
13425
- this.storeToFields(this.fields);
13528
+ this.nanoFields = nanoFields;
13529
+ this.plainFields = plainFields;
13530
+ this.allFields = [...nanoFields, ...plainFields];
13531
+ this.storeToFields(this.allFields);
13426
13532
  this.validateOnChange();
13427
- this.fieldsToStore(this.fields);
13533
+ this.fieldsToStore(this.allFields);
13428
13534
  this.nanoPayloadChange.emit(this._store.state);
13429
13535
  }
13430
13536
  storeToFields(fields) {
13431
13537
  fields.forEach((field) => {
13432
- const fieldName = field.name;
13538
+ var _a;
13539
+ const fieldName = this.getName(field);
13433
13540
  if (!fieldName.length ||
13434
13541
  typeof this._store.state[fieldName] === 'undefined')
13435
13542
  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;
13543
+ if (field.tagName === 'NANO-CHECKBOX' ||
13544
+ ['radio', 'checkbox'].includes(field.type)) {
13545
+ let cb = field;
13546
+ if (cb.type === 'radio' ||
13547
+ cb.type === 'segment' ||
13548
+ cb.type === 'segment-pill') {
13549
+ // single radio type control
13550
+ if (this._store.state[fieldName] === cb.value)
13551
+ cb.checked = true;
13552
+ else
13553
+ cb.checked = false;
13554
+ }
13555
+ else if (Array.isArray(this._store.state[fieldName])) {
13556
+ // multiple checkbox like controls
13557
+ if (this._store.state[fieldName].includes(cb.value))
13558
+ cb.checked = true;
13559
+ else
13560
+ cb.checked = false;
13561
+ }
13562
+ else {
13563
+ // single checkbox like control
13564
+ if (this._store.state[fieldName] === cb.value)
13565
+ cb.checked = true;
13566
+ else
13567
+ cb.checked = false;
13568
+ }
13569
+ return;
13467
13570
  }
13571
+ if (field.tagName === 'NANO-FILE-UPLOAD') {
13572
+ const ff = field;
13573
+ // this can only work if the field is empty rn... a one-time deal
13574
+ if (!((_a = ff.files) === null || _a === void 0 ? void 0 : _a.length))
13575
+ ff.files = this._store.state[fieldName];
13576
+ return;
13577
+ }
13578
+ // default
13579
+ field.value = this._store.state[fieldName];
13468
13580
  });
13469
13581
  }
13470
13582
  /** Loops through all `nano-...` fields and extracts their values into our store */
13471
13583
  fieldsToStore(fields) {
13472
13584
  fields.forEach((field) => {
13473
- const fieldName = field.name;
13585
+ const fieldName = this.getName(field);
13474
13586
  if (!fieldName.length)
13475
13587
  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);
13588
+ if (field.tagName === 'NANO-CHECKBOX' ||
13589
+ ['radio', 'checkbox'].includes(field.type)) {
13590
+ let cb = field;
13591
+ if (cb.type === 'radio' ||
13592
+ cb.type === 'segment' ||
13593
+ cb.type === 'segment-pill') {
13594
+ // radio type control - only one can be checked
13595
+ if (cb.checked)
13596
+ this._store.state[fieldName] = cb.value;
13597
+ }
13598
+ else if (this.allFields.filter((f) => !!this.getName(field) &&
13599
+ (f.tagName === 'NANO-CHECKBOX' ||
13600
+ f.type === 'checkbox')).length > 1) {
13601
+ // multiple checkbox type control
13602
+ const currentArr = Array.isArray(this._store.state[fieldName])
13603
+ ? this._store.state[fieldName]
13604
+ : [];
13605
+ if (cb.checked) {
13606
+ // checked
13607
+ if (!this._store.state[fieldName].includes(cb.value)) {
13608
+ this._store.state[fieldName] = [...currentArr, cb.value];
13502
13609
  }
13503
13610
  }
13504
13611
  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] = '';
13612
+ // unchecked
13613
+ this._store.state[fieldName] = currentArr.filter((v) => v !== cb.value);
13510
13614
  }
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;
13615
+ }
13616
+ else {
13617
+ // single checkbox - on or off
13618
+ if (cb.checked)
13619
+ this._store.state[fieldName] = cb.value;
13620
+ else
13621
+ this._store.state[fieldName] = '';
13622
+ }
13623
+ return;
13624
+ }
13625
+ if (field.tagName === 'NANO-FILE-UPLOAD') {
13626
+ const ff = field;
13627
+ if (!this.fileStateEqual(fieldName, ff))
13628
+ this._store.state[fieldName] = ff.files;
13629
+ return;
13518
13630
  }
13631
+ // default
13632
+ this._store.state[fieldName] = field.value;
13519
13633
  });
13520
13634
  }
13521
- /** Checks for user defined validations */
13635
+ /**
13636
+ * Tries to ascertain whether the current model
13637
+ * value is the same as the `nano-file-upload` value
13638
+ * @param fieldName - the key to access from the data store
13639
+ * @param field - the nano-file-upload field to assess against
13640
+ * @returns true for equal, false for not equal
13641
+ */
13642
+ fileStateEqual(fieldName, field) {
13643
+ return (JSON.stringify(this._store.state[fieldName]) ===
13644
+ JSON.stringify(field.files) ||
13645
+ this._store.state[fieldName] == field.files);
13646
+ }
13647
+ /**
13648
+ * Checks for user defined validations
13649
+ * @param key - current key of the data model to validate
13650
+ * @param newVal - the newly set, incoming value to validate
13651
+ */
13522
13652
  async validate(key, newVal) {
13523
13653
  if (!this.validation)
13524
13654
  return;
@@ -13531,21 +13661,33 @@ let FieldValidator = class extends H {
13531
13661
  // collection loop into a promise
13532
13662
  await Promise.all(Object.entries(res).map(async ([key, o]) => {
13533
13663
  // switch on/off validation messages
13534
- const field = this.fields.find((f) => f.name === key);
13664
+ const field = this.allFields.find((f) => this.getName(f) === key);
13535
13665
  let validityTarget = field;
13536
13666
  if (field.tagName === 'NANO-CHECKBOX') {
13667
+ // if we have a checkbox-group, set the validation message there
13537
13668
  const cbg = field.closest('nano-checkbox-group');
13538
13669
  validityTarget = cbg || field;
13539
13670
  }
13540
- // status is now valid - clear the error
13541
- if (validityTarget.validityMessage === o.msg && o.valid)
13671
+ if ((validityTarget.validityMessage ||
13672
+ validityTarget.validationMessage) === o.msg &&
13673
+ o.valid) {
13674
+ // status is now valid - clear the error
13542
13675
  await this.setFieldError(validityTarget, '');
13543
- // status is invalid. Set the error
13676
+ }
13544
13677
  else if (!o.valid) {
13678
+ // status is invalid. Set the error
13545
13679
  await this.setFieldError(validityTarget, o.msg);
13546
13680
  }
13547
13681
  }));
13548
13682
  }
13683
+ /** Loops through all store entries and checks custom validation */
13684
+ async validateAllFields() {
13685
+ // This forces our loop to `await` and finish sequentially ... silly async stencil methods
13686
+ await Object.entries(this._store.state).reduce(async (memo, [key, value]) => {
13687
+ await memo;
13688
+ await this.validate(key, value);
13689
+ }, undefined);
13690
+ }
13549
13691
  /**
13550
13692
  * Utility to smooth out setting error messages
13551
13693
  * (it's a different method on `nano-checkbox` 'cos they don't show errors themselves)
@@ -13553,18 +13695,13 @@ let FieldValidator = class extends H {
13553
13695
  * @param msg
13554
13696
  */
13555
13697
  async setFieldError(field, msg) {
13556
- if (field['showError'])
13698
+ if (field['showError']) {
13557
13699
  await field.showError(msg);
13558
- else
13700
+ }
13701
+ else if (field['setError'])
13559
13702
  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);
13703
+ else
13704
+ field.setCustomValidity(msg);
13568
13705
  }
13569
13706
  scrollToFirstInvalid() {
13570
13707
  if (!this.scrollToInvalid)
@@ -13593,17 +13730,21 @@ let FieldValidator = class extends H {
13593
13730
  requestAnimationFrame(() => {
13594
13731
  this.setupFields();
13595
13732
  this.attachSlotObserver();
13596
- this._store.on('set', (key, value) => this.handleStoreChange(key, value));
13597
13733
  this.host.addEventListener('nanoChange', this.handleFieldChange);
13734
+ this.host.addEventListener('input', this.handlePlainFieldChange);
13735
+ this.host.addEventListener('change', this.handlePlainFieldChange);
13598
13736
  this.host.addEventListener('submit', this.handleSubmit);
13737
+ this._store.on('set', this.handleStoreChange);
13599
13738
  });
13600
13739
  }
13601
13740
  disconnectedCallback() {
13602
13741
  if (this.mo)
13603
13742
  this.mo.disconnect();
13604
- this._store.reset();
13605
13743
  this.host.removeEventListener('nanoChange', this.handleFieldChange);
13744
+ this.host.removeEventListener('input', this.handlePlainFieldChange);
13745
+ this.host.removeEventListener('change', this.handlePlainFieldChange);
13606
13746
  this.host.removeEventListener('submit', this.handleSubmit);
13747
+ this._store.reset();
13607
13748
  if (this.activeForm)
13608
13749
  this.activeForm.removeEventListener('invalid', this.handleFormInvalid, true);
13609
13750
  }
@@ -13613,11 +13754,12 @@ let FieldValidator = class extends H {
13613
13754
  get host() { return this; }
13614
13755
  static get watchers() { return {
13615
13756
  "userForm": ["userFormChange"],
13616
- "validateOn": ["validateOnChange"]
13757
+ "validateOn": ["validateOnChange"],
13758
+ "extraFieldSelector": ["attachSlotObserver"]
13617
13759
  }; }
13618
13760
  };
13619
13761
 
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}";
13762
+ 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
13763
 
13622
13764
  let fileInputIds = 0;
13623
13765
  let getDataTransfer = () => new DataTransfer();
@@ -16783,6 +16925,7 @@ let Input = class extends H {
16783
16925
  this.nativeInput.dispatchEvent(event);
16784
16926
  };
16785
16927
  this.validate = debounce$2(this.validate, 50);
16928
+ this.handleBlur = this.handleBlur.bind(this);
16786
16929
  }
16787
16930
  get nativeInputWrap() {
16788
16931
  return this._nativeInputWrap;
@@ -16868,6 +17011,15 @@ let Input = class extends H {
16868
17011
  this.nativeInput.click();
16869
17012
  }
16870
17013
  }
17014
+ /**
17015
+ * Sets focus and select the text on the specified `nano-input`. Use this method instead of the global
17016
+ * `input.select()`.
17017
+ */
17018
+ async select() {
17019
+ if (this.nativeInput) {
17020
+ this.nativeInput.select();
17021
+ }
17022
+ }
16871
17023
  /**
16872
17024
  * Returns the native `<input>` element used under the hood.
16873
17025
  */
@@ -16897,11 +17049,14 @@ let Input = class extends H {
16897
17049
  const kev = e;
16898
17050
  let target;
16899
17051
  raf(() => {
16900
- if (kev.key) {
17052
+ if (e instanceof KeyboardEvent && kev.key) {
16901
17053
  if (kev.key !== 'Tab')
16902
17054
  return;
16903
17055
  target = document.activeElement;
16904
17056
  }
17057
+ else if (e instanceof FocusEvent) {
17058
+ target = document.activeElement;
17059
+ }
16905
17060
  else
16906
17061
  target = e.target;
16907
17062
  if (closestElement(this.el.tagName.toLowerCase(), target) !== this.el) {
@@ -17004,10 +17159,10 @@ let Input = class extends H {
17004
17159
  disabled,
17005
17160
  clearControl: this.clearInput,
17006
17161
  }))(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: {
17162
+ 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
17163
  'input__native-ctrl': true,
17009
17164
  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))));
17165
+ }, 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
17166
  }
17012
17167
  get el() { return this; }
17013
17168
  static get watchers() { return {
@@ -18892,6 +19047,7 @@ let Select = class extends H {
18892
19047
  */
18893
19048
  // eslint-disable-next-line @stencil/no-unused-watch
18894
19049
  valueChanged() {
19050
+ this.customValidate();
18895
19051
  if (this.onInit) {
18896
19052
  if (this.multiple)
18897
19053
  this.currInsertIndex = this.value.length - 1;
@@ -25058,7 +25214,7 @@ const NanoDetails = /*@__PURE__*/proxyCustomElement(Details, [1,"nano-details",{
25058
25214
  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
25215
  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
25216
  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]}]);
25217
+ 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
25218
  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
25219
  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
25220
  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 +27762,6 @@ const index = /*#__PURE__*/Object.freeze({
27606
27762
  GESTURE_CONTROLLER: GESTURE_CONTROLLER
27607
27763
  });
27608
27764
 
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 };
27765
+ 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
27766
 
27611
27767
  //# sourceMappingURL=index.js.map