Skip to content

Commit 613a3df

Browse files
committed
[breaking] add embedded option, turned off by default
Closes #7940 Adds a new option which defaults to false. If true, events related to navigation etc are listened to on the target element rather the html root
1 parent a999fce commit 613a3df

File tree

7 files changed

+26
-10
lines changed

7 files changed

+26
-10
lines changed

.changeset/popular-crabs-shop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
[breaking] add embedded option, turned off by default

packages/kit/src/core/config/options.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ const options = object(
129129
checkOrigin: boolean(true)
130130
}),
131131

132+
embedded: boolean(false),
133+
132134
// TODO: remove this for the 1.0 release
133135
endpointExtensions: error(
134136
(keypath) => `${keypath} has been renamed to config.kit.moduleExtensions`

packages/kit/src/exports/vite/build/utils.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ export function get_default_build_config({ config, input, ssr, outDir }) {
147147
__SVELTEKIT_APP_VERSION_FILE__: JSON.stringify(`${config.kit.appDir}/version.json`),
148148
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: JSON.stringify(config.kit.version.pollInterval),
149149
__SVELTEKIT_BROWSER__: ssr ? 'false' : 'true',
150-
__SVELTEKIT_DEV__: 'false'
150+
__SVELTEKIT_DEV__: 'false',
151+
__SVELTEKIT_EMBEDDED__: config.kit.embedded ? 'true' : 'false'
151152
},
152153
publicDir: ssr ? false : config.kit.files.assets,
153154
resolve: {

packages/kit/src/exports/vite/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ function kit() {
248248
define: {
249249
__SVELTEKIT_APP_VERSION_POLL_INTERVAL__: '0',
250250
__SVELTEKIT_BROWSER__: config_env.ssrBuild ? 'false' : 'true',
251-
__SVELTEKIT_DEV__: 'true'
251+
__SVELTEKIT_DEV__: 'true',
252+
__SVELTEKIT_EMBEDDED__: svelte_config.kit.embedded ? 'true' : 'false'
252253
},
253254
publicDir: svelte_config.kit.files.assets,
254255
resolve: {

packages/kit/src/runtime/client/client.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ function check_for_removed_attributes() {
8888
* @returns {import('./types').Client}
8989
*/
9090
export function create_client({ target, base }) {
91+
const container = __SVELTEKIT_EMBEDDED__ ? target : document.documentElement;
9192
/** @type {Array<((url: URL) => boolean)>} */
9293
const invalidated = [];
9394

@@ -1194,7 +1195,7 @@ export function create_client({ target, base }) {
11941195
/** @type {NodeJS.Timeout} */
11951196
let mousemove_timeout;
11961197

1197-
target.addEventListener('mousemove', (event) => {
1198+
container.addEventListener('mousemove', (event) => {
11981199
const target = /** @type {Element} */ (event.target);
11991200

12001201
clearTimeout(mousemove_timeout);
@@ -1208,8 +1209,8 @@ export function create_client({ target, base }) {
12081209
preload(/** @type {Element} */ (event.composedPath()[0]), 1);
12091210
}
12101211

1211-
target.addEventListener('mousedown', tap);
1212-
target.addEventListener('touchstart', tap, { passive: true });
1212+
container.addEventListener('mousedown', tap);
1213+
container.addEventListener('touchstart', tap, { passive: true });
12131214

12141215
const observer = new IntersectionObserver(
12151216
(entries) => {
@@ -1228,7 +1229,7 @@ export function create_client({ target, base }) {
12281229
* @param {number} priority
12291230
*/
12301231
function preload(element, priority) {
1231-
const a = find_anchor(element, target);
1232+
const a = find_anchor(element, container);
12321233
if (!a) return;
12331234

12341235
const { url, external } = get_link_info(a, base);
@@ -1248,7 +1249,7 @@ export function create_client({ target, base }) {
12481249
function after_navigate() {
12491250
observer.disconnect();
12501251

1251-
for (const a of target.querySelectorAll('a')) {
1252+
for (const a of container.querySelectorAll('a')) {
12521253
const { url, external } = get_link_info(a, base);
12531254
if (external) continue;
12541255

@@ -1452,14 +1453,14 @@ export function create_client({ target, base }) {
14521453
}
14531454

14541455
/** @param {MouseEvent} event */
1455-
target.addEventListener('click', (event) => {
1456+
container.addEventListener('click', (event) => {
14561457
// Adapted from https://github.com/visionmedia/page.js
14571458
// MIT license https://github.com/visionmedia/page.js#license
14581459
if (event.button || event.which !== 1) return;
14591460
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
14601461
if (event.defaultPrevented) return;
14611462

1462-
const a = find_anchor(/** @type {Element} */ (event.composedPath()[0]), target);
1463+
const a = find_anchor(/** @type {Element} */ (event.composedPath()[0]), container);
14631464
if (!a) return;
14641465

14651466
const { url, external, has } = get_link_info(a, base);
@@ -1529,7 +1530,7 @@ export function create_client({ target, base }) {
15291530
});
15301531
});
15311532

1532-
target.addEventListener('submit', (event) => {
1533+
container.addEventListener('submit', (event) => {
15331534
if (event.defaultPrevented) return;
15341535

15351536
const form = /** @type {HTMLFormElement} */ (

packages/kit/types/index.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,11 @@ export interface KitConfig {
325325
*/
326326
checkOrigin?: boolean;
327327
};
328+
/**
329+
* Whether or not the app is embedded inside a larger app. If `true`, SvelteKit will add its event listeners related to navigation etc on the parent of `%sveltekit.body%` instead of `window`.
330+
* @default false
331+
*/
332+
embedded?: boolean;
328333
/**
329334
* Environment variable configuration
330335
*/

packages/kit/types/internal.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,4 +385,5 @@ declare global {
385385
const __SVELTEKIT_APP_VERSION_POLL_INTERVAL__: number;
386386
const __SVELTEKIT_BROWSER__: boolean;
387387
const __SVELTEKIT_DEV__: boolean;
388+
const __SVELTEKIT_EMBEDDED__: boolean;
388389
}

0 commit comments

Comments
 (0)