mirror of
https://github.com/withastro/astro.git
synced 2024-12-30 22:03:56 -05:00
fix(toolbar): Make it so every built-in app can be closed by outside clicks (#10220)
* fix(toolbar): Make it so every built-in app can be closed by outside clicks * chore: changeset * test: add tests * test: fix test * ci: don't run bundle-size on dev-toolba
This commit is contained in:
parent
ae2a10e1a7
commit
1eadb1c529
8 changed files with 63 additions and 51 deletions
5
.changeset/kind-rice-clean.md
Normal file
5
.changeset/kind-rice-clean.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
"astro": patch
|
||||
---
|
||||
|
||||
Fixes some built-in apps of the dev toolbar not closing when clicking the page
|
1
.github/workflows/scripts.yml
vendored
1
.github/workflows/scripts.yml
vendored
|
@ -7,6 +7,7 @@ on:
|
|||
- "main"
|
||||
paths:
|
||||
- "packages/astro/src/runtime/client/**/*"
|
||||
- "!packages/astro/src/runtime/client/dev-toolbar/**/*"
|
||||
|
||||
# Automatically cancel in-progress actions on the same branch
|
||||
concurrency:
|
||||
|
|
|
@ -69,6 +69,10 @@ test.describe('Dev Toolbar', () => {
|
|||
await page.click('#go-to-b');
|
||||
await consolePromise;
|
||||
|
||||
toolbar = page.locator('astro-dev-toolbar');
|
||||
appButton = toolbar.locator('button[data-app-id="astro:home"]');
|
||||
await appButton.click();
|
||||
|
||||
astroAppCanvas = toolbar.locator('astro-dev-toolbar-app-canvas[data-app-id="astro:home"]');
|
||||
astroToolbarCards = await astroAppCanvas.locator('astro-dev-toolbar-card');
|
||||
await page.waitForSelector('astro-dev-toolbar-card');
|
||||
|
@ -290,4 +294,18 @@ test.describe('Dev Toolbar', () => {
|
|||
expect(serverRenderTime).not.toBe(null);
|
||||
expect(clientRenderTime).not.toBe(null);
|
||||
});
|
||||
|
||||
test('can quit apps by clicking outside the window', async ({ page, astro }) => {
|
||||
await page.goto(astro.resolveUrl('/'));
|
||||
|
||||
const toolbar = page.locator('astro-dev-toolbar');
|
||||
for (const appId of ['astro:home', 'astro:audit', 'astro:xray', 'astro:settings']) {
|
||||
const appButton = toolbar.locator(`button[data-app-id="${appId}"]`);
|
||||
await appButton.click();
|
||||
|
||||
await expect(appButton).toHaveClass('item active');
|
||||
await page.click('body');
|
||||
await expect(appButton).not.toHaveClass('active');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import type { DevToolbarApp, DevToolbarMetadata } from '../../../../@types/astro.js';
|
||||
import { isDefinedIcon, type Icon } from '../ui-library/icons.js';
|
||||
import { colorForIntegration, iconForIntegration } from './utils/icons.js';
|
||||
import { createWindowElement } from './utils/window.js';
|
||||
import { closeOnOutsideClick, createWindowElement } from './utils/window.js';
|
||||
|
||||
const astroLogo =
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 99 26" width="100"><path fill="#fff" d="M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z"/><path fill="url(#paint0_linear_386_2739)" d="M6.70402 22.1453c-1.17459-1.0737-1.51748-3.3297-1.02811-4.9641.84853 1.0304 2.02424 1.3569 3.24204 1.5411 1.88005.2844 3.72635.178 5.47285-.6813.1998-.0984.3844-.2292.6027-.3617.1639.4755.2065.9554.1493 1.4439-.1392 1.1898-.7313 2.1088-1.673 2.8054-.3765.2787-.775.5278-1.1639.7905-1.1948.8075-1.518 1.7544-1.0691 3.1318.0107.0336.0202.0671.0444.149-.6101-.273-1.0557-.6705-1.39518-1.1931-.3586-.5517-.52921-1.1619-.53819-1.8221-.00449-.3213-.00449-.6455-.0477-.9623-.10551-.7722-.46804-1.118-1.15102-1.1379-.70094-.0205-1.2554.4129-1.40244 1.0953-.01122.0523-.02749.1041-.04377.1649l.00112.0006Z"/><path fill="#fff" d="M0 16.909s3.47815-1.6944 6.96603-1.6944l2.62973-8.13858c.09846-.39359.38592-.66106.71044-.66106.3246 0 .612.26747.7105.66106l2.6297 8.13858c4.1309 0 6.966 1.6944 6.966 1.6944S14.7045.814589 14.693.782298C14.5234.306461 14.2371 0 13.8512 0H6.76183c-.38593 0-.66063.306461-.84174.782298C5.90733.81398 0 16.909 0 16.909ZM36.671 11.7318c0 1.4262-1.7739 2.2779-4.2302 2.2779-1.5985 0-2.1638-.3962-2.1638-1.2281 0-.8715.7018-1.2875 2.3003-1.2875 1.4426 0 2.6707.0198 4.0937.1981v.0396Zm.0195-1.7629c-.8772-.19808-2.2028-.31693-3.7818-.31693-4.6006 0-6.7644 1.08943-6.7644 3.62483 0 2.6344 1.4815 3.6446 4.9125 3.6446 2.9046 0 4.8735-.7328 5.5947-2.5354h.117c-.0195.4358-.039.8716-.039 1.2083 0 .931.156 1.0102.9162 1.0102h3.5869c-.1949-.5546-.3119-2.1194-.3119-3.4663 0-1.446.0585-2.5355.0585-4.00123 0-2.99098-1.7934-4.89253-7.4077-4.89253-2.4173 0-5.1074.41596-7.1543 1.03.1949.81213.4679 2.45617.6043 3.5258 1.774-.83193 4.2887-1.18847 6.2381-1.18847 2.6902 0 3.4309.61404 3.4309 1.86193v.4952ZM46.5325 12.5637c-.4874.0594-1.1502.0594-1.8325.0594-.7213 0-1.3841-.0198-1.8324-.0792 0 .1585-.0195.3367-.0195.4952 0 2.476 1.618 3.922 7.3102 3.922 5.3609 0 7.0958-1.4262 7.0958-3.9418 0-2.3769-1.1501-3.5456-6.238-3.8031-3.9573-.17827-4.3082-.61404-4.3082-1.10924 0-.57442.5068-.87154 3.158-.87154 2.7487 0 3.4894.37635 3.4894 1.16866v.17827c.3899-.01981 1.0917-.03961 1.813-.03961.6823 0 1.423.0198 1.8519.05942 0-.17827.0195-.33674.0195-.47539 0-2.91175-2.4172-3.86252-7.0958-3.86252-5.2634 0-7.0373 1.2875-7.0373 3.8031 0 2.25805 1.423 3.66445 6.472 3.88235 3.7233.1188 4.1327.5348 4.1327 1.1092 0 .6141-.6043.8914-3.2165.8914-3.0021 0-3.7623-.416-3.7623-1.2677v-.1189ZM63.6883 2.125c-1.423 1.32712-3.9768 2.65425-5.3998 3.01079.0195.73289.0195 2.07982.0195 2.81271l1.3061.01981c-.0195 1.40635-.039 3.10979-.039 4.23889 0 2.6344 1.3841 4.6152 5.6922 4.6152 1.813 0 3.0216-.1981 4.5226-.515-.1559-.9706-.3314-2.4562-.3898-3.5852-.8968.2971-2.0274.4556-3.275.4556-1.735 0-2.4368-.4754-2.4368-1.8422 0-1.1884 0-2.29767.0195-3.32768 2.2223.01981 4.4446.05943 5.7507.09904-.0195-1.03.0195-2.51559.078-3.50598-1.8909.03961-4.0157.05942-5.7702.05942.0195-.87154.039-1.70347.0585-2.5354h-.1365ZM75.3313 7.35427c.0195-1.03001.039-1.90156.0585-2.75329h-3.9183c.0585 1.70347.0585 3.44656.0585 6.00172 0 2.5553-.0195 4.3182-.0585 6.0018h4.4836c-.078-1.1885-.0975-3.189-.0975-4.8925 0-2.69388 1.0917-3.46638 3.5674-3.46638 1.1502 0 1.9689.13865 2.6902.39615.0195-1.01019.2144-2.97117.3314-3.84271-.7408-.21789-1.5595-.35655-2.5537-.35655-2.1249-.0198-3.6844.85174-4.4056 2.93156l-.156-.0198ZM94.8501 10.5235c0 2.1591-1.5595 3.1693-4.0157 3.1693-2.4368 0-3.9963-.9508-3.9963-3.1693 0-2.21846 1.579-3.05039 3.9963-3.05039 2.4367 0 4.0157.89135 4.0157 3.05039Zm4.0743-.099c0-4.29832-3.353-6.21968-8.09-6.21968-4.7566 0-7.9926 1.92136-7.9926 6.21968 0 4.2785 3.0216 6.5762 7.9731 6.5762 4.9904 0 8.1095-2.2977 8.1095-6.5762Z"/><defs><linearGradient id="paint0_linear_386_2739" x1="5.46011" x2="16.8017" y1="25.9999" y2="20.6412" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>';
|
||||
|
@ -34,7 +34,6 @@ export default {
|
|||
createCanvas();
|
||||
|
||||
document.addEventListener('astro:after-swap', createCanvas);
|
||||
document.addEventListener('astro:after-swap', fetchIntegrationData);
|
||||
|
||||
eventTarget.addEventListener('app-toggled', async (event) => {
|
||||
resetDebugButton();
|
||||
|
@ -45,6 +44,8 @@ export default {
|
|||
}
|
||||
});
|
||||
|
||||
closeOnOutsideClick(eventTarget);
|
||||
|
||||
function fetchIntegrationData() {
|
||||
fetch('https://astro.build/api/v1/dev-overlay/', {
|
||||
cache: 'no-cache',
|
||||
|
@ -372,8 +373,11 @@ export default {
|
|||
resetDebugButton();
|
||||
}, 3500);
|
||||
});
|
||||
|
||||
canvas.append(windowComponent);
|
||||
|
||||
// If we have integration data, rebuild that part of the UI as well
|
||||
// as it probably mean that the user had already open the app in this session (ex: view transitions)
|
||||
if (integrationData) refreshIntegrationList();
|
||||
}
|
||||
|
||||
function resetDebugButton() {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { finder } from '@medv/finder';
|
||||
import type { DevToolbarApp, DevToolbarMetadata } from '../../../../../@types/astro.js';
|
||||
import type { DevToolbarHighlight } from '../../ui-library/highlight.js';
|
||||
import {
|
||||
|
@ -6,9 +7,8 @@ import {
|
|||
getElementsPositionInDocument,
|
||||
positionHighlight,
|
||||
} from '../utils/highlight.js';
|
||||
import { createWindowElement } from '../utils/window.js';
|
||||
import { closeOnOutsideClick, createWindowElement } from '../utils/window.js';
|
||||
import { a11y } from './a11y.js';
|
||||
import { finder } from '@medv/finder';
|
||||
import { perf } from './perf.js';
|
||||
|
||||
const icon =
|
||||
|
@ -72,26 +72,7 @@ export default {
|
|||
document.addEventListener('astro:after-swap', async () => lint());
|
||||
document.addEventListener('astro:page-load', async () => refreshLintPositions);
|
||||
|
||||
function onPageClick(event: MouseEvent) {
|
||||
const target = event.target as Element | null;
|
||||
if (!target) return;
|
||||
if (!target.closest) return;
|
||||
if (target.closest('astro-dev-toolbar')) return;
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('toggle-app', {
|
||||
detail: {
|
||||
state: false,
|
||||
},
|
||||
})
|
||||
);
|
||||
}
|
||||
eventTarget.addEventListener('app-toggled', (event: any) => {
|
||||
if (event.detail.state === true) {
|
||||
document.addEventListener('click', onPageClick, true);
|
||||
} else {
|
||||
document.removeEventListener('click', onPageClick, true);
|
||||
}
|
||||
});
|
||||
closeOnOutsideClick(eventTarget);
|
||||
|
||||
async function lint() {
|
||||
audits.forEach(({ highlightElement }) => {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import type { DevToolbarApp } from '../../../../@types/astro.js';
|
||||
import { settings, type Settings } from '../settings.js';
|
||||
import { createWindowElement } from './utils/window.js';
|
||||
import { closeOnOutsideClick, createWindowElement } from './utils/window.js';
|
||||
|
||||
interface SettingRow {
|
||||
name: string;
|
||||
|
@ -49,11 +49,13 @@ export default {
|
|||
id: 'astro:settings',
|
||||
name: 'Settings',
|
||||
icon: 'gear',
|
||||
init(canvas) {
|
||||
init(canvas, eventTarget) {
|
||||
createSettingsWindow();
|
||||
|
||||
document.addEventListener('astro:after-swap', createSettingsWindow);
|
||||
|
||||
closeOnOutsideClick(eventTarget);
|
||||
|
||||
function createSettingsWindow() {
|
||||
const windowElement = createWindowElement(
|
||||
`<style>
|
||||
|
|
|
@ -3,3 +3,26 @@ export function createWindowElement(content: string) {
|
|||
windowElement.innerHTML = content;
|
||||
return windowElement;
|
||||
}
|
||||
|
||||
export function closeOnOutsideClick(eventTarget: EventTarget) {
|
||||
function onPageClick(event: MouseEvent) {
|
||||
const target = event.target as Element | null;
|
||||
if (!target) return;
|
||||
if (!target.closest) return;
|
||||
if (target.closest('astro-dev-toolbar')) return;
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('toggle-app', {
|
||||
detail: {
|
||||
state: false,
|
||||
},
|
||||
})
|
||||
);
|
||||
}
|
||||
eventTarget.addEventListener('app-toggled', (event: any) => {
|
||||
if (event.detail.state === true) {
|
||||
document.addEventListener('click', onPageClick, true);
|
||||
} else {
|
||||
document.removeEventListener('click', onPageClick, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import {
|
|||
getElementsPositionInDocument,
|
||||
positionHighlight,
|
||||
} from './utils/highlight.js';
|
||||
import { createWindowElement } from './utils/window.js';
|
||||
import { closeOnOutsideClick, createWindowElement } from './utils/window.js';
|
||||
|
||||
const icon =
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><path fill="#fff" d="M7.9 1.5v-.4a1.1 1.1 0 0 1 2.2 0v.4a1.1 1.1 0 1 1-2.2 0Zm-6.4 8.6a1.1 1.1 0 1 0 0-2.2h-.4a1.1 1.1 0 0 0 0 2.2h.4ZM12 3.7a1.1 1.1 0 0 0 1.4-.7l.4-1.1a1.1 1.1 0 0 0-2.1-.8l-.4 1.2a1.1 1.1 0 0 0 .7 1.4Zm-9.7 7.6-1.2.4a1.1 1.1 0 1 0 .8 2.1l1-.4a1.1 1.1 0 1 0-.6-2ZM20.8 17a1.9 1.9 0 0 1 0 2.6l-1.2 1.2a1.9 1.9 0 0 1-2.6 0l-4.3-4.2-1.6 3.6a1.9 1.9 0 0 1-1.7 1.2A1.9 1.9 0 0 1 7.5 20L2.7 5a1.9 1.9 0 0 1 2.4-2.4l15 5a1.9 1.9 0 0 1 .2 3.4l-3.7 1.6 4.2 4.3ZM19 18.3 14.6 14a1.9 1.9 0 0 1 .6-3l3.2-1.5L5.1 5.1l4.3 13.3 1.5-3.2a1.9 1.9 0 0 1 3-.6l4.4 4.4.7-.7Z"/></svg>';
|
||||
|
@ -23,29 +23,7 @@ export default {
|
|||
document.addEventListener('astro:after-swap', addIslandsOverlay);
|
||||
document.addEventListener('astro:page-load', refreshIslandsOverlayPositions);
|
||||
|
||||
function onPageClick(event: MouseEvent) {
|
||||
const target = event.target as Element | null;
|
||||
if (!target) return;
|
||||
if (!target.closest) return;
|
||||
if (target.closest('astro-dev-toolbar')) return;
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
eventTarget.dispatchEvent(
|
||||
new CustomEvent('toggle-app', {
|
||||
detail: {
|
||||
state: false,
|
||||
},
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
eventTarget.addEventListener('app-toggled', (event: any) => {
|
||||
if (event.detail.state === true) {
|
||||
document.addEventListener('click', onPageClick, true);
|
||||
} else {
|
||||
document.removeEventListener('click', onPageClick, true);
|
||||
}
|
||||
});
|
||||
closeOnOutsideClick(eventTarget);
|
||||
|
||||
function addIslandsOverlay() {
|
||||
islandsOverlays.forEach(({ highlightElement }) => {
|
||||
|
|
Loading…
Reference in a new issue