unpoly-rails 3.6.1.1 → 3.7.0.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.
@@ -5,7 +5,7 @@
5
5
  /***/ (() => {
6
6
 
7
7
  window.up = {
8
- version: '3.6.1'
8
+ version: '3.7.0'
9
9
  };
10
10
 
11
11
 
@@ -954,15 +954,7 @@ up.element = (function () {
954
954
  return Node.prototype.contains.call(root, element);
955
955
  }
956
956
  function ancestor(element, selector) {
957
- let parentElement = element.parentElement;
958
- if (parentElement) {
959
- if (parentElement.matches(selector)) {
960
- return parentElement;
961
- }
962
- else {
963
- return ancestor(parentElement, selector);
964
- }
965
- }
957
+ return element.parentNode?.closest(selector);
966
958
  }
967
959
  function around(element, selector) {
968
960
  return getList(element.closest(selector), subtree(element, selector));
@@ -1992,11 +1984,18 @@ const u = up.util;
1992
1984
  up.RenderJob = (_a = class RenderJob {
1993
1985
  constructor(options) {
1994
1986
  this.options = up.RenderOptions.preprocess(options);
1995
- this._rendered = this._execute();
1996
1987
  }
1997
- async _execute() {
1988
+ execute() {
1989
+ this._rendered = this._executePromise();
1990
+ return this;
1991
+ }
1992
+ getPreflightFragments() {
1993
+ return this._getChange().getPreflightProps().fragments;
1994
+ }
1995
+ async _executePromise() {
1998
1996
  try {
1999
- let result = await this._makeChange();
1997
+ this._guardRender();
1998
+ let result = await this._getChange().execute();
2000
1999
  this._handleResult(result);
2001
2000
  return result;
2002
2001
  }
@@ -2039,21 +2038,19 @@ up.RenderJob = (_a = class RenderJob {
2039
2038
  }
2040
2039
  }
2041
2040
  }
2042
- _makeChange() {
2043
- this._guardRender();
2041
+ _getChange() {
2044
2042
  if (this.options.url) {
2045
2043
  let onRequest = (request) => this._handleAbortOption(request);
2046
- this.change = new up.Change.FromURL({ ...this.options, onRequest });
2044
+ return new up.Change.FromURL({ ...this.options, onRequest });
2047
2045
  }
2048
2046
  else if (this.options.response) {
2049
- this.change = new up.Change.FromResponse(this.options);
2050
- this._handleAbortOption(null);
2047
+ let onRender = () => this._handleAbortOption(null);
2048
+ return new up.Change.FromResponse({ ...this.options, onRender });
2051
2049
  }
2052
2050
  else {
2053
- this.change = new up.Change.FromContent(this.options);
2054
- this._handleAbortOption(null);
2051
+ let onRender = () => this._handleAbortOption(null);
2052
+ return new up.Change.FromContent({ ...this.options, onRender });
2055
2053
  }
2056
- return this.change.execute();
2057
2054
  }
2058
2055
  _guardRender() {
2059
2056
  up.browser.assertConfirmed(this.options);
@@ -2070,7 +2067,7 @@ up.RenderJob = (_a = class RenderJob {
2070
2067
  let { abort } = this.options;
2071
2068
  if (!abort || !up.network.isBusy())
2072
2069
  return;
2073
- let { fragments, layer, origin, newLayer } = this.change.getPreflightProps();
2070
+ let { fragments, layer, origin, newLayer } = this._getChange().getPreflightProps();
2074
2071
  let abortOptions = {
2075
2072
  except: request,
2076
2073
  logOnce: ['up.render()', 'Change with { abort } option will abort other requests'],
@@ -2097,7 +2094,8 @@ up.RenderJob = (_a = class RenderJob {
2097
2094
  (() => {
2098
2095
  u.delegate(_a.prototype, ['then', 'catch', 'finally'], function () { return this._rendered; });
2099
2096
  u.memoizeMethod(_a.prototype, {
2100
- _awaitFinished: true
2097
+ _awaitFinished: true,
2098
+ _getChange: true,
2101
2099
  });
2102
2100
  })(),
2103
2101
  _a);
@@ -2272,7 +2270,8 @@ up.Change.OpenLayer = class OpenLayer extends up.Change.Addition {
2272
2270
  const fragmentFocus = new up.FragmentFocus({
2273
2271
  fragment: this._content,
2274
2272
  layer: this.layer,
2275
- autoMeans: ['autofocus', 'layer']
2273
+ autoMeans: ['autofocus', 'layer'],
2274
+ inputDevice: this.options.inputDevice,
2276
2275
  });
2277
2276
  fragmentFocus.process(this.options.focus);
2278
2277
  }
@@ -2745,7 +2744,7 @@ up.Change.CloseLayer = class CloseLayer extends up.Change.Removal {
2745
2744
  this._layer.overlayFocus.teardown();
2746
2745
  formerParent.overlayFocus?.moveToFront();
2747
2746
  let newFocusElement = this._layer.origin || formerParent.element;
2748
- newFocusElement.focus({ preventScroll: true });
2747
+ up.focus(newFocusElement, { preventScroll: true });
2749
2748
  }
2750
2749
  };
2751
2750
 
@@ -3033,6 +3032,7 @@ up.Change.FromContent = (_a = class FromContent extends up.Change {
3033
3032
  if (assets) {
3034
3033
  up.script.assertAssetsOK(assets, plan.options);
3035
3034
  }
3035
+ this.options.onRender?.();
3036
3036
  }
3037
3037
  _getResponseDoc() {
3038
3038
  if (this._preview)
@@ -3482,6 +3482,7 @@ up.EventListener = class EventListener extends up.Record {
3482
3482
  'baseLayer',
3483
3483
  'passive',
3484
3484
  'once',
3485
+ 'capture',
3485
3486
  'beforeBoot',
3486
3487
  ];
3487
3488
  }
@@ -3501,7 +3502,7 @@ up.EventListener = class EventListener extends up.Record {
3501
3502
  this.element.addEventListener(...this._addListenerArg());
3502
3503
  }
3503
3504
  _addListenerArg() {
3504
- let options = u.compactObject(u.pick(this, ['once', 'passive']));
3505
+ let options = u.compactObject(u.pick(this, ['once', 'passive', 'capture']));
3505
3506
  return [this.eventType, this.nativeCallback, options];
3506
3507
  }
3507
3508
  unbind() {
@@ -3585,6 +3586,7 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
3585
3586
  'baseLayer',
3586
3587
  'passive',
3587
3588
  'once',
3589
+ 'capture',
3588
3590
  'beforeBoot',
3589
3591
  ];
3590
3592
  }
@@ -3647,88 +3649,102 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
3647
3649
 
3648
3650
  const u = up.util;
3649
3651
  up.FieldWatcher = class FieldWatcher {
3650
- constructor(fields, options, callback) {
3651
- this._callback = callback;
3652
- this._fields = fields;
3652
+ constructor(root, options, callback) {
3653
3653
  this._options = options;
3654
+ this._root = root;
3655
+ this._scope = up.form.getScope(root);
3656
+ this._callback = callback;
3654
3657
  this._batch = options.batch;
3655
- this._unbindFns = [];
3656
- }
3657
- _fieldOptions(field) {
3658
- let options = u.copy(this._options);
3659
- return up.form.watchOptions(field, options, { defaults: { event: 'input' } });
3658
+ this._abortable = options.abortable;
3660
3659
  }
3661
3660
  start() {
3662
3661
  this._scheduledValues = null;
3663
3662
  this._processedValues = this._readFieldValues();
3664
3663
  this._currentTimer = null;
3665
3664
  this._callbackRunning = false;
3666
- for (let field of this._fields) {
3667
- this._watchField(field);
3665
+ this._unbindFns = [];
3666
+ this._watchFieldsWithin(this._root);
3667
+ this._root.addEventListener('up:fragment:inserted', ({ target }) => {
3668
+ if (target !== this._root)
3669
+ this._watchFieldsWithin(target);
3670
+ });
3671
+ for (let abortableElement of this._abortableElements()) {
3672
+ this._unbindFns.push(up.fragment.onAborted(abortableElement, () => this._abort()));
3668
3673
  }
3669
- }
3670
- _watchField(field) {
3671
- let _fieldOptions = this._fieldOptions(field);
3672
- this._unbindFns.push(up.on(field, _fieldOptions.event, (event) => this._check(event, _fieldOptions)));
3673
- this._unbindFns.push(up.fragment.onAborted(field, () => this._cancelTimer()));
3674
+ this._unbindFns.push(up.on(this._scope, 'reset', () => this._onFormReset()));
3674
3675
  }
3675
3676
  stop() {
3677
+ this._abort();
3676
3678
  for (let unbindFn of this._unbindFns)
3677
3679
  unbindFn();
3678
- this._cancelTimer();
3679
3680
  }
3680
- _cancelTimer() {
3681
- clearTimeout(this._currentTimer);
3682
- this._currentTimer = null;
3681
+ _fieldOptions(field) {
3682
+ let rootOptions = u.copy(this._options);
3683
+ return up.form.watchOptions(field, rootOptions, { defaults: { event: 'input' } });
3684
+ }
3685
+ _abortableElements() {
3686
+ if (this._abortable === false) {
3687
+ return [];
3688
+ }
3689
+ else {
3690
+ return u.wrapList(this._abortable ?? this._scope);
3691
+ }
3692
+ }
3693
+ _watchFieldsWithin(container) {
3694
+ for (let field of up.form.fields(container)) {
3695
+ this._watchField(field);
3696
+ }
3683
3697
  }
3684
- _isAnyFieldAttached() {
3685
- return u.some(this._fields, 'isConnected');
3698
+ _watchField(field) {
3699
+ let fieldOptions = this._fieldOptions(field);
3700
+ this._unbindFns.push(up.on(field, fieldOptions.event, () => this._check(fieldOptions)));
3701
+ }
3702
+ _abort() {
3703
+ this._scheduledValues = null;
3686
3704
  }
3687
- _scheduleValues(values, event, _fieldOptions) {
3688
- this._cancelTimer();
3705
+ _scheduleValues(values, fieldOptions) {
3706
+ clearTimeout(this._currentTimer);
3689
3707
  this._scheduledValues = values;
3690
- let delay = u.evalOption(_fieldOptions.delay, event);
3708
+ let delay = fieldOptions.delay || 0;
3691
3709
  this._currentTimer = u.timer(delay, () => {
3692
- this._currentTimer = null;
3693
- if (this._isAnyFieldAttached()) {
3694
- this.scheduledFieldOptions = _fieldOptions;
3695
- this._requestCallback();
3696
- }
3697
- else {
3698
- this._scheduledValues = null;
3699
- }
3710
+ this._scheduledFieldOptions = fieldOptions;
3711
+ this._requestCallback();
3700
3712
  });
3701
3713
  }
3702
3714
  _isNewValues(values) {
3703
3715
  return !u.isEqual(values, this._processedValues) && !u.isEqual(this._scheduledValues, values);
3704
3716
  }
3705
3717
  async _requestCallback() {
3706
- let _fieldOptions = this.scheduledFieldOptions;
3707
- if ((this._scheduledValues !== null) && !this._currentTimer && !this._callbackRunning) {
3708
- const diff = this._changedValues(this._processedValues, this._scheduledValues);
3709
- this._processedValues = this._scheduledValues;
3710
- this._scheduledValues = null;
3711
- this._callbackRunning = true;
3712
- this.scheduledFieldOptions = null;
3713
- let callbackOptions = { ..._fieldOptions, disable: false };
3714
- const callbackReturnValues = [];
3715
- if (this._batch) {
3716
- callbackReturnValues.push(this._runCallback(diff, callbackOptions));
3717
- }
3718
- else {
3719
- for (let name in diff) {
3720
- const value = diff[name];
3721
- callbackReturnValues.push(this._runCallback(value, name, callbackOptions));
3722
- }
3723
- }
3724
- if (u.some(callbackReturnValues, u.isPromise)) {
3725
- let callbackDone = Promise.allSettled(callbackReturnValues);
3726
- up.form.disableWhile(callbackDone, _fieldOptions);
3727
- await callbackDone;
3718
+ if (!this._scheduledValues)
3719
+ return;
3720
+ if (this._callbackRunning)
3721
+ return;
3722
+ if (!this._scope.isConnected)
3723
+ return;
3724
+ let fieldOptions = this._scheduledFieldOptions;
3725
+ const diff = this._changedValues(this._processedValues, this._scheduledValues);
3726
+ this._processedValues = this._scheduledValues;
3727
+ this._scheduledValues = null;
3728
+ this._callbackRunning = true;
3729
+ this._scheduledFieldOptions = null;
3730
+ let callbackOptions = { ...fieldOptions, disable: false };
3731
+ const callbackReturnValues = [];
3732
+ if (this._batch) {
3733
+ callbackReturnValues.push(this._runCallback(diff, callbackOptions));
3734
+ }
3735
+ else {
3736
+ for (let name in diff) {
3737
+ const value = diff[name];
3738
+ callbackReturnValues.push(this._runCallback(value, name, callbackOptions));
3728
3739
  }
3729
- this._callbackRunning = false;
3730
- this._requestCallback();
3731
3740
  }
3741
+ if (u.some(callbackReturnValues, u.isPromise)) {
3742
+ let callbackDone = Promise.allSettled(callbackReturnValues);
3743
+ up.form.disableWhile(callbackDone, fieldOptions);
3744
+ await callbackDone;
3745
+ }
3746
+ this._callbackRunning = false;
3747
+ this._requestCallback();
3732
3748
  }
3733
3749
  _runCallback(...args) {
3734
3750
  return up.error.guard(() => this._callback(...args));
@@ -3748,14 +3764,17 @@ up.FieldWatcher = class FieldWatcher {
3748
3764
  return changes;
3749
3765
  }
3750
3766
  _readFieldValues() {
3751
- return up.Params.fromFields(this._fields).toObject();
3767
+ return up.Params.fromContainer(this._root).toObject();
3752
3768
  }
3753
- _check(event, _fieldOptions) {
3769
+ _check(fieldOptions = {}) {
3754
3770
  const values = this._readFieldValues();
3755
3771
  if (this._isNewValues(values)) {
3756
- this._scheduleValues(values, event, _fieldOptions);
3772
+ this._scheduleValues(values, fieldOptions);
3757
3773
  }
3758
3774
  }
3775
+ _onFormReset() {
3776
+ u.task(() => this._check());
3777
+ }
3759
3778
  };
3760
3779
 
3761
3780
 
@@ -4091,7 +4110,8 @@ up.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {
4091
4110
  keys() {
4092
4111
  return super.keys().concat([
4093
4112
  'hash',
4094
- 'focusCapsule'
4113
+ 'focusCapsule',
4114
+ 'inputDevice',
4095
4115
  ]);
4096
4116
  }
4097
4117
  processPrimitive(opt) {
@@ -4148,7 +4168,7 @@ up.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {
4148
4168
  }
4149
4169
  _focusElement(element) {
4150
4170
  if (element) {
4151
- up.focus(element, { force: true, ...PREVENT_SCROLL_OPTIONS });
4171
+ up.focus(element, { force: true, ...PREVENT_SCROLL_OPTIONS, inputDevice: this.inputDevice });
4152
4172
  return true;
4153
4173
  }
4154
4174
  }
@@ -5789,8 +5809,11 @@ up.Params = class Params {
5789
5809
  return this.entries.length === 0;
5790
5810
  }
5791
5811
  static fromForm(form) {
5792
- form = up.fragment.get(form);
5793
- return this.fromFields(up.form.fields(form));
5812
+ return this.fromContainer(form);
5813
+ }
5814
+ static fromContainer(container) {
5815
+ let fields = up.form.fields(container);
5816
+ return this.fromFields(fields);
5794
5817
  }
5795
5818
  static fromFields(fields) {
5796
5819
  const params = new (this)();
@@ -5974,7 +5997,7 @@ up.RenderOptions = (function () {
5974
5997
  function preprocess(options) {
5975
5998
  up.migrate.preprocessRenderOptions?.(options);
5976
5999
  const defaults = u.merge(GLOBAL_DEFAULTS, navigateDefaults(options));
5977
- return u.merge(u.omit(defaults, LATE_KEYS), { defaults }, options, preloadOverrides(options));
6000
+ return u.merge(u.omit(defaults, LATE_KEYS), { defaults }, { inputDevice: up.event.inputDevice }, options, preloadOverrides(options));
5978
6001
  }
5979
6002
  function finalize(preprocessedOptions, lateDefaults) {
5980
6003
  return u.merge(preprocessedOptions.defaults, lateDefaults, preprocessedOptions);
@@ -7014,14 +7037,14 @@ const u = up.util;
7014
7037
  up.RevealMotion = class RevealMotion {
7015
7038
  constructor(element, options = {}) {
7016
7039
  this._element = element;
7017
- this._options = options;
7018
- this._viewport = e.get(this._options.viewport) || up.viewport.get(this._element);
7040
+ this._viewport = e.get(options.viewport) || up.viewport.get(this._element);
7019
7041
  this._obstructionsLayer = up.layer.get(this._viewport);
7042
+ this._behavior = options.behavior ?? 'instant';
7020
7043
  const viewportConfig = up.viewport.config;
7021
- this._snap = this._options.snap ?? this._options.revealSnap ?? viewportConfig.revealSnap;
7022
- this._padding = this._options.padding ?? this._options.revealPadding ?? viewportConfig.revealPadding;
7023
- this._top = this._options.top ?? this._options.revealTop ?? viewportConfig.revealTop;
7024
- this._max = this._options.max ?? this._options.revealMax ?? viewportConfig.revealMax;
7044
+ this._snap = options.snap ?? options.revealSnap ?? viewportConfig.revealSnap;
7045
+ this._padding = options.padding ?? options.revealPadding ?? viewportConfig.revealPadding;
7046
+ this._top = options.top ?? options.revealTop ?? viewportConfig.revealTop;
7047
+ this._max = options.max ?? options.revealMax ?? viewportConfig.revealMax;
7025
7048
  this._topObstructionSelector = viewportConfig.selector('fixedTopSelectors');
7026
7049
  this._bottomObstructionSelector = viewportConfig.selector('fixedBottomSelectors');
7027
7050
  }
@@ -7055,7 +7078,7 @@ up.RevealMotion = class RevealMotion {
7055
7078
  newScrollTop = 0;
7056
7079
  }
7057
7080
  if (newScrollTop !== originalScrollTop) {
7058
- this._viewport.scrollTo({ ...this._options, top: newScrollTop });
7081
+ this._viewport.scrollTo({ top: newScrollTop, behavior: this._behavior });
7059
7082
  }
7060
7083
  }
7061
7084
  _getViewportRect() {
@@ -7534,6 +7557,16 @@ up.event = (function () {
7534
7557
  up.emit(element, forkedEvent);
7535
7558
  }
7536
7559
  on('up:click', 'a[up-emit]', executeEmitAttr);
7560
+ let inputDevices = ['unknown'];
7561
+ function getInputDevice() {
7562
+ return u.last(inputDevices);
7563
+ }
7564
+ function observeInputDevice(newModality) {
7565
+ inputDevices.push(newModality);
7566
+ setTimeout(() => inputDevices.pop());
7567
+ }
7568
+ on('keydown keyup', { capture: true }, () => observeInputDevice('key'));
7569
+ on('pointerdown pointerup', { capture: true }, () => observeInputDevice('pointer'));
7537
7570
  on('up:framework:reset', reset);
7538
7571
  return {
7539
7572
  on,
@@ -7546,6 +7579,7 @@ up.event = (function () {
7546
7579
  isUnmodified,
7547
7580
  fork,
7548
7581
  keyModifiers,
7582
+ get inputDevice() { return getInputDevice(); }
7549
7583
  };
7550
7584
  })();
7551
7585
  up.on = up.event.on;
@@ -8208,7 +8242,7 @@ up.fragment = (function () {
8208
8242
  }
8209
8243
  const render = up.mockable((...args) => {
8210
8244
  let options = parseTargetAndOptions(args);
8211
- return new up.RenderJob(options);
8245
+ return new up.RenderJob(options).execute();
8212
8246
  });
8213
8247
  const navigate = up.mockable((...args) => {
8214
8248
  const options = parseTargetAndOptions(args);
@@ -8689,6 +8723,7 @@ up.viewport = (function () {
8689
8723
  revealPadding: 0,
8690
8724
  revealTop: false,
8691
8725
  revealMax() { return 0.5 * window.innerHeight; },
8726
+ autoFocusVisible({ element, inputDevice }) { return inputDevice === 'key' || up.form.isField(element); }
8692
8727
  }));
8693
8728
  const bodyShifter = new up.BodyShifter();
8694
8729
  up.compiler(config.selectorFn('anchoredRightSelectors'), function (element) {
@@ -8707,25 +8742,35 @@ up.viewport = (function () {
8707
8742
  motion.start();
8708
8743
  return up.migrate.formerlyAsync?.('up.reveal()') || true;
8709
8744
  }
8710
- function doFocus(element, options = {}) {
8711
- if (options.force) {
8712
- makeFocusable(element);
8745
+ function doFocus(element, { preventScroll, force, inputDevice, focusVisible } = {}) {
8746
+ if (force) {
8747
+ if (!element.hasAttribute('tabindex') && element.tabIndex === -1) {
8748
+ element.setAttribute('tabindex', '-1');
8749
+ }
8713
8750
  }
8714
- element.focus({ preventScroll: true });
8715
- if (!options.preventScroll) {
8751
+ inputDevice ??= up.event.inputDevice;
8752
+ focusVisible ??= 'auto';
8753
+ focusVisible = u.evalAutoOption(focusVisible, config.autoFocusVisible, { element, inputDevice });
8754
+ element.focus({
8755
+ preventScroll: true,
8756
+ focusVisible,
8757
+ });
8758
+ removeFocusClasses(element);
8759
+ element.classList.add(focusVisible ? 'up-focus-visible' : 'up-focus-hidden');
8760
+ if (!preventScroll) {
8716
8761
  return reveal(element);
8717
8762
  }
8718
8763
  }
8764
+ function removeFocusClasses(element) {
8765
+ element?.classList.remove('up-focus-hidden', 'up-focus-visible');
8766
+ }
8767
+ up.on('focusin', function ({ relatedTarget }) {
8768
+ removeFocusClasses(relatedTarget);
8769
+ });
8719
8770
  function tryFocus(element, options) {
8720
8771
  doFocus(element, options);
8721
8772
  return element === document.activeElement;
8722
8773
  }
8723
- function makeFocusable(element) {
8724
- if (!element.hasAttribute('tabindex') && element.tabIndex === -1) {
8725
- element.setAttribute('tabindex', '-1');
8726
- element.classList.add('up-focusable-content');
8727
- }
8728
- }
8729
8774
  function revealHash(hash = location.hash, options) {
8730
8775
  let match = firstHashTarget(hash, options);
8731
8776
  if (match) {
@@ -9998,8 +10043,11 @@ up.form = (function () {
9998
10043
  return config.selector('submitButtonSelectors');
9999
10044
  }
10000
10045
  const submit = up.mockable((form, options) => {
10001
- return up.render(submitOptions(form, options));
10046
+ return buildSubmitJob(form, options).execute();
10002
10047
  });
10048
+ function buildSubmitJob(form, options) {
10049
+ return new up.RenderJob(submitOptions(form, options));
10050
+ }
10003
10051
  function submitOptions(form, options, parserOptions) {
10004
10052
  form = getForm(form);
10005
10053
  options = u.options(options);
@@ -10016,6 +10064,9 @@ up.form = (function () {
10016
10064
  parser.include(up.link.followOptions);
10017
10065
  return options;
10018
10066
  }
10067
+ function getPreflightFragments(form) {
10068
+ return buildSubmitJob(form).getPreflightFragments();
10069
+ }
10019
10070
  function watchOptions(field, options, parserOptions = {}) {
10020
10071
  options = u.options(options);
10021
10072
  let parser = new up.OptionsParser(field, options, { ...parserOptions, closest: true, attrPrefix: 'up-watch-' });
@@ -10081,7 +10132,7 @@ up.form = (function () {
10081
10132
  return u.noop;
10082
10133
  let missingOption = (key) => { up.fail("Cannot process { disable: '%s' } option without { %s }", disable, key); };
10083
10134
  let getOrigin = () => origin || missingOption('origin');
10084
- let getOriginForm = () => getContainer(getOrigin());
10135
+ let getOriginForm = () => getScope(getOrigin());
10085
10136
  let containers;
10086
10137
  if (disable === true) {
10087
10138
  containers = [getOriginForm()];
@@ -10124,17 +10175,13 @@ up.form = (function () {
10124
10175
  button.focus();
10125
10176
  }
10126
10177
  });
10127
- function watch(container, ...args) {
10128
- const fields = findFields(container);
10129
- const unnamedFields = u.reject(fields, 'name');
10130
- if (unnamedFields.length) {
10131
- up.puts('up.watch()', 'Will not watch fields without a [name]: %o', unnamedFields);
10132
- }
10133
- const callback = u.extractCallback(args) || watchCallbackFromElement(container) || up.fail('No callback given for up.watch()');
10178
+ function watch(root, ...args) {
10179
+ root = up.element.get(root);
10180
+ const callback = u.extractCallback(args) || watchCallbackFromElement(root) || up.fail('No callback given for up.watch()');
10134
10181
  let options = u.extractOptions(args);
10135
- const watch = new up.FieldWatcher(fields, options, callback);
10136
- watch.start();
10137
- return () => watch.stop();
10182
+ const watcher = new up.FieldWatcher(root, options, callback);
10183
+ watcher.start();
10184
+ return () => watcher.stop();
10138
10185
  }
10139
10186
  function watchCallbackFromElement(element) {
10140
10187
  let rawCallback = element.getAttribute('up-watch');
@@ -10142,8 +10189,11 @@ up.form = (function () {
10142
10189
  return up.NonceableCallback.fromString(rawCallback).toFunction('value', 'name').bind(element);
10143
10190
  }
10144
10191
  }
10145
- function autosubmit(target, options) {
10146
- return watch(target, options, (_value, _name, renderOptions) => submit(target, renderOptions));
10192
+ function autosubmit(target, options = {}) {
10193
+ const form = getForm(target);
10194
+ options.abortable ??= [form, ...getPreflightFragments(form)];
10195
+ const onChange = (_value, _name, renderOptions) => submit(target, renderOptions);
10196
+ return watch(target, options, onChange);
10147
10197
  }
10148
10198
  function getGroupSelectors() {
10149
10199
  return up.migrate.migratedFormGroupSelectors?.() || config.groupSelectors;
@@ -10197,7 +10247,7 @@ up.form = (function () {
10197
10247
  }
10198
10248
  }
10199
10249
  else if (field.matches('input[type=radio]')) {
10200
- const form = getContainer(field);
10250
+ const form = getScope(field);
10201
10251
  const groupName = field.getAttribute('name');
10202
10252
  const checkedButton = form.querySelector(`input[type=radio]${e.attrSelector('name', groupName)}:checked`);
10203
10253
  if (checkedButton) {
@@ -10226,7 +10276,7 @@ up.form = (function () {
10226
10276
  }
10227
10277
  function switchTargets(switcher, options = {}) {
10228
10278
  const targetSelector = options.target || options.target || switcher.getAttribute('up-switch');
10229
- const form = getContainer(switcher);
10279
+ const form = getScope(switcher);
10230
10280
  targetSelector || up.fail("No switch target given for %o", switcher);
10231
10281
  const fieldValues = switcherValues(switcher);
10232
10282
  for (let target of up.fragment.all(form, targetSelector)) {
@@ -10253,7 +10303,7 @@ up.form = (function () {
10253
10303
  return u.parseTokens(str, { json: true });
10254
10304
  }
10255
10305
  function findSwitcherForTarget(target) {
10256
- const form = getContainer(target);
10306
+ const form = getScope(target);
10257
10307
  const switchers = form.querySelectorAll('[up-switch]');
10258
10308
  const switcher = u.find(switchers, function (switcher) {
10259
10309
  const targetSelector = switcher.getAttribute('up-switch');
@@ -10265,7 +10315,7 @@ up.form = (function () {
10265
10315
  const element = up.fragment.get(elementOrSelector, options);
10266
10316
  return element.form || element.closest('form');
10267
10317
  }
10268
- function getContainer(element, options) {
10318
+ function getScope(element, options) {
10269
10319
  return getForm(element, options) || up.layer.get(element).element;
10270
10320
  }
10271
10321
  function focusedField() {
@@ -10321,6 +10371,7 @@ up.form = (function () {
10321
10371
  groupSolution: findGroupSolution,
10322
10372
  groupSelectors: getGroupSelectors,
10323
10373
  get: getForm,
10374
+ getScope,
10324
10375
  };
10325
10376
  })();
10326
10377
  up.submit = up.form.submit;
@@ -1,6 +1,6 @@
1
1
  [hidden][hidden]{display:none !important}
2
2
  up-wrapper{display:inline-block}
3
- up-bounds{position:absolute}.up-focusable-content:focus,.up-focusable-content:focus-visible{outline:0}
3
+ up-bounds{position:absolute}.up-focus-hidden:focus-visible{outline:none !important}
4
4
  .up-request-loader{display:none}up-progress-bar{position:fixed;top:0;left:0;z-index:999999999;height:3px;background-color:#007bff}
5
5
  up-focus-trap{position:fixed;top:0;left:0;width:0;height:0}up-cover-viewport,up-drawer-viewport,up-modal-viewport,up-drawer-backdrop,up-modal-backdrop,up-cover,up-drawer,up-modal{top:0;left:0;bottom:0;right:0}up-drawer-box,up-modal-box{box-shadow:0 0 10px 1px rgba(0,0,0,.3)}up-popup{box-shadow:0 0 4px rgba(0,0,0,.3)}up-popup:focus,up-cover-box:focus,up-drawer-box:focus,up-modal-box:focus,up-cover:focus,up-drawer:focus,up-modal:focus,up-popup:focus-visible,up-cover-box:focus-visible,up-drawer-box:focus-visible,up-modal-box:focus-visible,up-cover:focus-visible,up-drawer:focus-visible,up-modal:focus-visible{outline:none}up-cover,up-drawer,up-modal{z-index:2000;position:fixed}up-drawer-backdrop,up-modal-backdrop{position:absolute;background:rgba(0,0,0,.4)}up-cover-viewport,up-drawer-viewport,up-modal-viewport{position:absolute;overflow-y:scroll;overflow-x:hidden;overscroll-behavior:contain;display:flex;align-items:flex-start;justify-content:center}up-popup,up-cover-box,up-drawer-box,up-modal-box{position:relative;box-sizing:border-box;max-width:100%;background-color:#fff;padding:20px;overflow-x:hidden}up-popup-content,up-cover-content,up-drawer-content,up-modal-content{display:block}up-popup{z-index:1000}up-popup-dismiss,up-cover-dismiss,up-drawer-dismiss,up-modal-dismiss{color:#888;position:absolute;top:10px;right:10px;font-size:1.7rem;line-height:.5}up-modal[nesting="0"] up-modal-viewport{padding:25px 15px}up-modal[nesting="1"] up-modal-viewport{padding:50px 30px}up-modal[nesting="2"] up-modal-viewport{padding:75px 45px}up-modal[nesting="3"] up-modal-viewport{padding:100px 60px}up-modal[nesting="4"] up-modal-viewport{padding:125px 75px}up-modal[size=small] up-modal-box{width:350px}up-modal[size=medium] up-modal-box{width:650px}up-modal[size=large] up-modal-box{width:1000px}up-modal[size=grow] up-modal-box{width:auto}up-modal[size=full] up-modal-box{width:100%}up-drawer-viewport{justify-content:flex-start}up-drawer[position=right] up-drawer-viewport{justify-content:flex-end}up-drawer-box{min-height:100vh}up-drawer[size=small] up-drawer-box{width:150px}up-drawer[size=medium] up-drawer-box{width:340px}up-drawer[size=large] up-drawer-box{width:600px}up-drawer[size=grow] up-drawer-box{width:auto}up-drawer[size=full] up-drawer-box{width:100%}up-cover-box{width:100%;min-height:100vh;padding:0}up-popup{padding:15px;text-align:left}up-popup[size=small]{width:180px}up-popup[size=medium]{width:300px}up-popup[size=large]{width:550px}up-popup[size=grow] up-popup{width:auto}up-popup[size=full] up-popup{width:100%}
6
6
  [up-href],[up-clickable]{cursor:pointer}