unpoly-rails 3.6.1.1 → 3.7.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/assets/unpoly/unpoly.css +2 -2
- data/assets/unpoly/unpoly.es6.js +213 -158
- data/assets/unpoly/unpoly.es6.min.js +1 -1
- data/assets/unpoly/unpoly.js +178 -127
- data/assets/unpoly/unpoly.min.css +1 -1
- data/assets/unpoly/unpoly.min.js +1 -1
- data/lib/unpoly/rails/version.rb +1 -1
- metadata +3 -3
data/assets/unpoly/unpoly.js
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
/***/ (() => {
|
6
6
|
|
7
7
|
window.up = {
|
8
|
-
version: '3.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
2043
|
-
this._guardRender();
|
2041
|
+
_getChange() {
|
2044
2042
|
if (this.options.url) {
|
2045
2043
|
let onRequest = (request) => this._handleAbortOption(request);
|
2046
|
-
|
2044
|
+
return new up.Change.FromURL({ ...this.options, onRequest });
|
2047
2045
|
}
|
2048
2046
|
else if (this.options.response) {
|
2049
|
-
|
2050
|
-
this.
|
2047
|
+
let onRender = () => this._handleAbortOption(null);
|
2048
|
+
return new up.Change.FromResponse({ ...this.options, onRender });
|
2051
2049
|
}
|
2052
2050
|
else {
|
2053
|
-
|
2054
|
-
this.
|
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.
|
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
|
-
|
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(
|
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.
|
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
|
-
|
3667
|
-
|
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
|
-
|
3681
|
-
|
3682
|
-
|
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
|
-
|
3685
|
-
|
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,
|
3688
|
-
this.
|
3705
|
+
_scheduleValues(values, fieldOptions) {
|
3706
|
+
clearTimeout(this._currentTimer);
|
3689
3707
|
this._scheduledValues = values;
|
3690
|
-
let delay =
|
3708
|
+
let delay = fieldOptions.delay || 0;
|
3691
3709
|
this._currentTimer = u.timer(delay, () => {
|
3692
|
-
this.
|
3693
|
-
|
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
|
-
|
3707
|
-
|
3708
|
-
|
3709
|
-
|
3710
|
-
|
3711
|
-
|
3712
|
-
|
3713
|
-
|
3714
|
-
|
3715
|
-
|
3716
|
-
|
3717
|
-
|
3718
|
-
|
3719
|
-
|
3720
|
-
|
3721
|
-
|
3722
|
-
|
3723
|
-
|
3724
|
-
|
3725
|
-
|
3726
|
-
|
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.
|
3767
|
+
return up.Params.fromContainer(this._root).toObject();
|
3752
3768
|
}
|
3753
|
-
_check(
|
3769
|
+
_check(fieldOptions = {}) {
|
3754
3770
|
const values = this._readFieldValues();
|
3755
3771
|
if (this._isNewValues(values)) {
|
3756
|
-
this._scheduleValues(values,
|
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
|
-
|
5793
|
-
|
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.
|
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 =
|
7022
|
-
this._padding =
|
7023
|
-
this._top =
|
7024
|
-
this._max =
|
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({
|
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,
|
8711
|
-
if (
|
8712
|
-
|
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
|
-
|
8715
|
-
|
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
|
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 = () =>
|
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(
|
10128
|
-
|
10129
|
-
const
|
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
|
10136
|
-
|
10137
|
-
return () =>
|
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
|
-
|
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 =
|
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 =
|
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 =
|
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
|
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-
|
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}
|