@swiftbrowser/web 0.17.7 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node/dist/node/apps.d.ts +5 -0
- package/node/dist/node/apps.d.ts.map +1 -1
- package/node/dist/node/apps.js +3 -0
- package/node/dist/node/apps.js.map +1 -1
- package/node/dist/node/config.d.ts +2 -0
- package/node/dist/node/config.d.ts.map +1 -1
- package/node/dist/node/config.js +2 -0
- package/node/dist/node/config.js.map +1 -1
- package/package.json +1 -1
- package/public/_headers +5 -0
- package/src/animation.ts +60 -27
- package/src/appFiles.ts +21 -16
- package/src/audioRecorder.ts +392 -0
- package/src/editorSelection.ts +80 -0
- package/src/files.ts +442 -0
- package/src/gestureComposition.ts +92 -0
- package/src/hostRequests.ts +50 -5
- package/src/interaction.ts +108 -27
- package/src/layout/engine.ts +295 -19
- package/src/layout/types.ts +6 -0
- package/src/layoutDom.ts +13 -5
- package/src/main.ts +10 -1
- package/src/notifications.ts +134 -1
- package/src/pinch.ts +9 -1
- package/src/pinnedViews.ts +131 -0
- package/src/plainEditor.ts +79 -0
- package/src/protocol.ts +307 -14
- package/src/renderer.ts +354 -43
- package/src/richEditor.ts +330 -0
- package/src/scrollGeometry.ts +79 -0
- package/src/scrollTransition.ts +145 -0
- package/src/styles.css +142 -11
- package/src/symbols.ts +22 -0
- package/src/touchPaging.ts +23 -2
- package/src/undo.ts +126 -0
- package/src/video.ts +59 -8
- package/src/vite-env.d.ts +2 -0
package/node/dist/node/apps.d.ts
CHANGED
|
@@ -51,6 +51,11 @@ export interface AppSpec {
|
|
|
51
51
|
* page's callback page (docs/ops-protocol.md, "Signing in").
|
|
52
52
|
*/
|
|
53
53
|
urlSchemes?: string[];
|
|
54
|
+
/**
|
|
55
|
+
* The Web Push application server key (a VAPID public key, base64url) the
|
|
56
|
+
* app's `registerForRemoteNotifications` subscribes with (src/notifications.ts).
|
|
57
|
+
*/
|
|
58
|
+
webPushKey?: string;
|
|
54
59
|
/**
|
|
55
60
|
* A CORS proxy (packages/cors-proxy): the page retries a cross-origin GET or
|
|
56
61
|
* HEAD the browser refused through `<corsProxy>?url=<target>` (src/corsProxy.ts).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../apps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,gHAAgH;IAChH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,eAAO,MAAM,QAAQ,QAAqB,CAAC;AAE3C,sCAAsC;AACtC,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../apps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,gHAAgH;IAChH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,eAAO,MAAM,QAAQ,QAAqB,CAAC;AAE3C,sCAAsC;AACtC,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,CAEjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAkDhE"}
|
package/node/dist/node/apps.js
CHANGED
|
@@ -58,6 +58,9 @@ export function validateAppSpecs(specs) {
|
|
|
58
58
|
if (spec.corsProxy !== undefined && (typeof spec.corsProxy !== 'string' || !/^https?:\/\/[^\s]+$/.test(spec.corsProxy))) {
|
|
59
59
|
throw new Error(`${label}: "corsProxy" must be an http(s) URL`);
|
|
60
60
|
}
|
|
61
|
+
if (spec.webPushKey !== undefined && (typeof spec.webPushKey !== 'string' || !/^[A-Za-z0-9_-]{80,96}$/.test(spec.webPushKey))) {
|
|
62
|
+
throw new Error(`${label}: "webPushKey" must be a VAPID public key (base64url, 65 bytes)`);
|
|
63
|
+
}
|
|
61
64
|
if (spec.blockedHosts !== undefined && (!Array.isArray(spec.blockedHosts) || !spec.blockedHosts.every((h) => typeof h === 'string' && /^[A-Za-z0-9.-]+$/.test(h)))) {
|
|
62
65
|
throw new Error(`${label}: "blockedHosts" must be an array of host names`);
|
|
63
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../apps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../apps.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,8 @@ export interface LandingApp {
|
|
|
67
67
|
urlSchemes?: string[];
|
|
68
68
|
/** The app's CORS proxy (`AppSpec.corsProxy`); the page retries refused cross-origin reads through it. */
|
|
69
69
|
corsProxy?: string;
|
|
70
|
+
/** The app's Web Push application server key (`AppSpec.webPushKey`); the page passes it to the app as `SB_WEB_PUSH_KEY`. */
|
|
71
|
+
webPushKey?: string;
|
|
70
72
|
/** Hosts the app's requests may not reach (`AppSpec.blockedHosts`). */
|
|
71
73
|
blockedHosts?: string[];
|
|
72
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAKvC,OAAO,EAAmD,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChI,OAAO,EAAE,KAAK,iBAAiB,EAAyC,MAAM,0BAA0B,CAAC;AAEzG,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,UAAU,CAG9F;AAED,qGAAqG;AACrG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oHAAoH;IACpH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAOD;;;;;GAKG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAoBhC;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAKvC,OAAO,EAAmD,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAChI,OAAO,EAAE,KAAK,iBAAiB,EAAyC,MAAM,0BAA0B,CAAC;AAEzG,OAAO,EAAmC,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,UAAU,CAG9F;AAED,qGAAqG;AACrG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oHAAoH;IACpH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4HAA4H;IAC5H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAOD;;;;;GAKG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAoBhC;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,EAAE,CAYnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAoEjE"}
|
package/node/dist/node/config.js
CHANGED
|
@@ -76,6 +76,8 @@ export function landingApps(specs) {
|
|
|
76
76
|
entry.urlSchemes = [...spec.urlSchemes];
|
|
77
77
|
if (spec.corsProxy)
|
|
78
78
|
entry.corsProxy = spec.corsProxy;
|
|
79
|
+
if (spec.webPushKey)
|
|
80
|
+
entry.webPushKey = spec.webPushKey;
|
|
79
81
|
if (spec.blockedHosts?.length)
|
|
80
82
|
entry.blockedHosts = [...spec.blockedHosts];
|
|
81
83
|
return entry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAqD,MAAM,2BAA2B,CAAC;AAChI,OAAO,EAA0B,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AAuC1E,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,OAAuD;IAChF,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/public/_headers
CHANGED
|
@@ -28,3 +28,8 @@
|
|
|
28
28
|
# plugins/asset-catalogs.ts). Not content-hashed: always revalidate.
|
|
29
29
|
/catalog/*
|
|
30
30
|
Cache-Control: no-cache
|
|
31
|
+
|
|
32
|
+
# The service worker (Web Push): always revalidate, and its scope is the site.
|
|
33
|
+
/sw.js
|
|
34
|
+
Cache-Control: no-cache
|
|
35
|
+
Service-Worker-Allowed: /
|
package/src/animation.ts
CHANGED
|
@@ -458,7 +458,7 @@ export interface AnimatorOptions {
|
|
|
458
458
|
}
|
|
459
459
|
|
|
460
460
|
export class Animator {
|
|
461
|
-
/** The element clones of removed elements are appended to (the screen)
|
|
461
|
+
/** The element clones of removed elements are appended to (the screen), unless they were in a sheet: `placeClone`. */
|
|
462
462
|
private readonly root: HTMLElement;
|
|
463
463
|
private readonly selfAnimating: ReadonlySet<string>;
|
|
464
464
|
private readonly playOwnFrames: AnimatorOptions['playOwnFrames'];
|
|
@@ -470,7 +470,7 @@ export class Animator {
|
|
|
470
470
|
}
|
|
471
471
|
|
|
472
472
|
/** Commits waiting for the next animation frame (`commitNextFrame`), in order. */
|
|
473
|
-
private pending: { pass: PassRecord; animation: Animation | undefined; frames: readonly FrameChange[] }[] = [];
|
|
473
|
+
private pending: { pass: PassRecord; animation: Animation | undefined; frames: readonly FrameChange[]; onCommitted?: ((started: globalThis.Animation[]) => void) | undefined }[] = [];
|
|
474
474
|
private pendingFrame: number | null = null;
|
|
475
475
|
|
|
476
476
|
/**
|
|
@@ -481,13 +481,14 @@ export class Animator {
|
|
|
481
481
|
* callback, they cost the frame its one layout and the tweens still start
|
|
482
482
|
* on it. In a hidden page nothing paints, so the commit runs now.
|
|
483
483
|
*/
|
|
484
|
-
commitNextFrame(pass: PassRecord, animation: Animation | undefined, frames: readonly FrameChange[] = []): void {
|
|
484
|
+
commitNextFrame(pass: PassRecord, animation: Animation | undefined, frames: readonly FrameChange[] = [], onCommitted?: (started: globalThis.Animation[]) => void): void {
|
|
485
485
|
if (typeof requestAnimationFrame !== 'function' || (typeof document !== 'undefined' && document.hidden)) {
|
|
486
486
|
this.flushCommits();
|
|
487
|
-
this.commit(pass, animation, frames);
|
|
487
|
+
const started = this.commit(pass, animation, frames, onCommitted !== undefined);
|
|
488
|
+
onCommitted?.(started);
|
|
488
489
|
return;
|
|
489
490
|
}
|
|
490
|
-
this.pending.push({ pass, animation, frames });
|
|
491
|
+
this.pending.push({ pass, animation, frames, onCommitted });
|
|
491
492
|
this.pendingFrame ??= requestAnimationFrame(() => this.flushCommits());
|
|
492
493
|
}
|
|
493
494
|
|
|
@@ -499,7 +500,16 @@ export class Animator {
|
|
|
499
500
|
}
|
|
500
501
|
const pending = this.pending;
|
|
501
502
|
this.pending = [];
|
|
502
|
-
for (const { pass, animation, frames } of pending)
|
|
503
|
+
for (const { pass, animation, frames, onCommitted } of pending) {
|
|
504
|
+
const started = this.commit(pass, animation, frames, onCommitted !== undefined);
|
|
505
|
+
onCommitted?.(started);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/** Every animation running under the root (the exit clones' included), when the browser can list them. */
|
|
510
|
+
private runningAnimations(): globalThis.Animation[] {
|
|
511
|
+
const root = this.root as HTMLElement & { getAnimations?: (options?: { subtree?: boolean }) => globalThis.Animation[] };
|
|
512
|
+
return typeof root.getAnimations === 'function' ? root.getAnimations({ subtree: true }) : [];
|
|
503
513
|
}
|
|
504
514
|
|
|
505
515
|
/** Computed values of the animated properties, or null when not rendered. */
|
|
@@ -536,9 +546,17 @@ export class Animator {
|
|
|
536
546
|
* (`withAnimation`); subtrees whose `animationToken` changed use their own
|
|
537
547
|
* animation instead, as `.animation(_:value:)` overrides the transaction.
|
|
538
548
|
* An `implicit` change (an inspector shown or hidden) animates even without
|
|
539
|
-
* one, with the commit's animation or `default`.
|
|
549
|
+
* one, with the commit's animation or `default`. With `collect`, returns
|
|
550
|
+
* the animations the commit started (a `withAnimation` completion waits
|
|
551
|
+
* for them); else an empty array.
|
|
540
552
|
*/
|
|
541
|
-
commit(pass: PassRecord, commitAnimation: Animation | undefined, frames: readonly FrameChange[] = []):
|
|
553
|
+
commit(pass: PassRecord, commitAnimation: Animation | undefined, frames: readonly FrameChange[] = [], collect = false): globalThis.Animation[] {
|
|
554
|
+
const before = collect ? new Set(this.runningAnimations()) : null;
|
|
555
|
+
this.animate(pass, commitAnimation, frames);
|
|
556
|
+
return before ? this.runningAnimations().filter((animation) => !before.has(animation)) : [];
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
private animate(pass: PassRecord, commitAnimation: Animation | undefined, frames: readonly FrameChange[]): void {
|
|
542
560
|
const tokenRoots = new Map<HTMLElement, Animation | undefined>();
|
|
543
561
|
for (const [el, rec] of pass.updated) {
|
|
544
562
|
if (rec.tokenChanged) tokenRoots.set(el, rec.implicit ? commitAnimation : rec.animation);
|
|
@@ -760,15 +778,7 @@ export class Animator {
|
|
|
760
778
|
clone.classList.add(EXIT_CLONE_CLASS);
|
|
761
779
|
clone.setAttribute('aria-hidden', 'true');
|
|
762
780
|
clone.toggleAttribute('inert', true);
|
|
763
|
-
|
|
764
|
-
s.position = 'absolute';
|
|
765
|
-
s.left = `${change.rect.left}px`;
|
|
766
|
-
s.top = `${change.rect.top}px`;
|
|
767
|
-
s.width = `${change.rect.width}px`;
|
|
768
|
-
s.height = `${change.rect.height}px`;
|
|
769
|
-
s.margin = '0';
|
|
770
|
-
s.pointerEvents = 'none';
|
|
771
|
-
this.root.append(clone);
|
|
781
|
+
this.placeClone(clone, change.rect, change.el);
|
|
772
782
|
const timing = baseTiming(timingFor(animation));
|
|
773
783
|
const rolls = change.kind === 'numericText';
|
|
774
784
|
const away = change.countsDown ? '0 45%' : '0 -45%';
|
|
@@ -813,7 +823,8 @@ export class Animator {
|
|
|
813
823
|
const sx = from.width > 0 ? to.width / from.width : 1;
|
|
814
824
|
const sy = from.height > 0 ? to.height / from.height : 1;
|
|
815
825
|
const timing = baseTiming(timingFor(animation));
|
|
816
|
-
|
|
826
|
+
const shift = CLONE_SHIFT.get(clone) ?? { x: 0, y: 0 };
|
|
827
|
+
clone.style.transformOrigin = `${from.left - shift.x - parseFloat(clone.style.left || '0')}px ${from.top - shift.y - parseFloat(clone.style.top || '0')}px`;
|
|
817
828
|
clone.animate(
|
|
818
829
|
[{ transform: 'none' }, { transform: `translate(${to.left - from.left}px, ${to.top - from.top}px) scale(${sx}, ${sy})` }],
|
|
819
830
|
{ ...timing, fill: 'forwards', composite: 'add' },
|
|
@@ -982,6 +993,33 @@ export class Animator {
|
|
|
982
993
|
}
|
|
983
994
|
}
|
|
984
995
|
|
|
996
|
+
/**
|
|
997
|
+
* Put a clone at `rect` (relative to the root) in the layer `from` is in:
|
|
998
|
+
* the root, or the sheet it is in (a full-screen cover's slides), which is
|
|
999
|
+
* drawn over the presenting tree; at the root, a clone of something in a
|
|
1000
|
+
* sheet would play under the sheet, unseen.
|
|
1001
|
+
*/
|
|
1002
|
+
private placeClone(clone: HTMLElement, rect: DOMRect, from: HTMLElement | null): void {
|
|
1003
|
+
const sheet = from?.closest<HTMLElement>('.sb-sheet');
|
|
1004
|
+
const layer = sheet && this.root.contains(sheet) ? sheet : this.root;
|
|
1005
|
+
let shift = { x: 0, y: 0 };
|
|
1006
|
+
if (layer !== this.root) {
|
|
1007
|
+
const base = this.rootRect();
|
|
1008
|
+
const box = layer.getBoundingClientRect();
|
|
1009
|
+
shift = { x: box.left - base.left, y: box.top - base.top };
|
|
1010
|
+
CLONE_SHIFT.set(clone, shift);
|
|
1011
|
+
}
|
|
1012
|
+
const s = clone.style;
|
|
1013
|
+
s.position = 'absolute';
|
|
1014
|
+
s.left = `${rect.left - shift.x}px`;
|
|
1015
|
+
s.top = `${rect.top - shift.y}px`;
|
|
1016
|
+
s.width = `${rect.width}px`;
|
|
1017
|
+
s.height = `${rect.height}px`;
|
|
1018
|
+
s.margin = '0';
|
|
1019
|
+
s.pointerEvents = 'none';
|
|
1020
|
+
layer.append(clone);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
985
1023
|
/**
|
|
986
1024
|
* Re-insert a visual clone of a removed element at its old position and
|
|
987
1025
|
* play its transition backwards; the clone is dropped when done.
|
|
@@ -1000,15 +1038,7 @@ export class Animator {
|
|
|
1000
1038
|
if (rec.el !== parent && isBarToolbar(parent)) clone.dataset['sbBarItem'] = parent.dataset['sbPlacement'] ?? '';
|
|
1001
1039
|
clone.setAttribute('aria-hidden', 'true');
|
|
1002
1040
|
clone.toggleAttribute('inert', true);
|
|
1003
|
-
|
|
1004
|
-
s.position = 'absolute';
|
|
1005
|
-
s.left = `${rec.rect.left}px`;
|
|
1006
|
-
s.top = `${rec.rect.top}px`;
|
|
1007
|
-
s.width = `${rec.rect.width}px`;
|
|
1008
|
-
s.height = `${rec.rect.height}px`;
|
|
1009
|
-
s.margin = '0';
|
|
1010
|
-
s.pointerEvents = 'none';
|
|
1011
|
-
this.root.append(clone);
|
|
1041
|
+
this.placeClone(clone, rec.rect, parent);
|
|
1012
1042
|
|
|
1013
1043
|
const from: Keyframe = {};
|
|
1014
1044
|
const to: Keyframe = {};
|
|
@@ -1046,6 +1076,9 @@ function isDrawn(el: HTMLElement): boolean {
|
|
|
1046
1076
|
return true;
|
|
1047
1077
|
}
|
|
1048
1078
|
|
|
1079
|
+
/** How far an exit clone's layer (a sheet) is from the animation root, when it is not the root: `placeClone`. */
|
|
1080
|
+
const CLONE_SHIFT = new WeakMap<HTMLElement, { x: number; y: number }>();
|
|
1081
|
+
|
|
1049
1082
|
/** Transitions are stored by the renderer per element (see `setTransition`). */
|
|
1050
1083
|
const TRANSITIONS = new WeakMap<HTMLElement, Transition>();
|
|
1051
1084
|
|
package/src/appFiles.ts
CHANGED
|
@@ -125,26 +125,42 @@ export interface FilesPersistence {
|
|
|
125
125
|
clear(): Promise<void>;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
/** A row of the `entries` store: a file's bytes or a directory, with when it was last written where the writer said. */
|
|
129
|
+
export interface EntryRow {
|
|
129
130
|
path: string;
|
|
130
131
|
data?: Uint8Array;
|
|
131
132
|
directory?: boolean;
|
|
133
|
+
/** Milliseconds since the epoch; rows the module wrote (and older rows) have none. */
|
|
134
|
+
modified?: number;
|
|
132
135
|
}
|
|
133
136
|
|
|
134
|
-
const ENTRIES = 'entries';
|
|
137
|
+
export const ENTRIES = 'entries';
|
|
135
138
|
|
|
136
139
|
export function filesDatabaseName(app: string): string {
|
|
137
140
|
return `sb-files:${app}`;
|
|
138
141
|
}
|
|
139
142
|
|
|
140
|
-
|
|
143
|
+
/** The app's files database, opened (and made) once per `app`; `factory` is the browser's unless a test passes one. */
|
|
144
|
+
export function openFilesDatabase(app: string, factory: IDBFactory = indexedDB): Promise<IDBDatabase> {
|
|
145
|
+
return new Promise((resolve, reject) => {
|
|
146
|
+
const open = factory.open(filesDatabaseName(app), 1);
|
|
147
|
+
open.onupgradeneeded = () => {
|
|
148
|
+
if (!open.result.objectStoreNames.contains(ENTRIES)) open.result.createObjectStore(ENTRIES, { keyPath: 'path' });
|
|
149
|
+
};
|
|
150
|
+
open.onsuccess = () => resolve(open.result);
|
|
151
|
+
open.onerror = () => reject(open.error ?? new Error(`could not open ${filesDatabaseName(app)}`));
|
|
152
|
+
open.onblocked = () => reject(new Error(`${filesDatabaseName(app)} is blocked by another tab`));
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function request<T>(req: IDBRequest<T>): Promise<T> {
|
|
141
157
|
return new Promise((resolve, reject) => {
|
|
142
158
|
req.onsuccess = () => resolve(req.result);
|
|
143
159
|
req.onerror = () => reject(req.error ?? new Error('IndexedDB request failed'));
|
|
144
160
|
});
|
|
145
161
|
}
|
|
146
162
|
|
|
147
|
-
function done(transaction: IDBTransaction): Promise<void> {
|
|
163
|
+
export function done(transaction: IDBTransaction): Promise<void> {
|
|
148
164
|
return new Promise((resolve, reject) => {
|
|
149
165
|
transaction.oncomplete = () => resolve();
|
|
150
166
|
transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted'));
|
|
@@ -155,18 +171,7 @@ function done(transaction: IDBTransaction): Promise<void> {
|
|
|
155
171
|
/** The app's home in IndexedDB (`factory` is the browser's unless a test passes one). */
|
|
156
172
|
export function indexedDBFiles(app: string, factory: IDBFactory = indexedDB): FilesPersistence {
|
|
157
173
|
let opened: Promise<IDBDatabase> | null = null;
|
|
158
|
-
const database = (): Promise<IDBDatabase> =>
|
|
159
|
-
opened ??= new Promise((resolve, reject) => {
|
|
160
|
-
const open = factory.open(filesDatabaseName(app), 1);
|
|
161
|
-
open.onupgradeneeded = () => {
|
|
162
|
-
if (!open.result.objectStoreNames.contains(ENTRIES)) open.result.createObjectStore(ENTRIES, { keyPath: 'path' });
|
|
163
|
-
};
|
|
164
|
-
open.onsuccess = () => resolve(open.result);
|
|
165
|
-
open.onerror = () => reject(open.error ?? new Error(`could not open ${filesDatabaseName(app)}`));
|
|
166
|
-
open.onblocked = () => reject(new Error(`${filesDatabaseName(app)} is blocked by another tab`));
|
|
167
|
-
});
|
|
168
|
-
return opened;
|
|
169
|
-
};
|
|
174
|
+
const database = (): Promise<IDBDatabase> => (opened ??= openFilesDatabase(app, factory));
|
|
170
175
|
let queue: Promise<void> = Promise.resolve();
|
|
171
176
|
|
|
172
177
|
return {
|