diff --git a/package-lock.json b/package-lock.json index 9e57b83..f6483f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gitverse", - "version": "0.7.0", + "version": "0.8.0-rc.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gitverse", - "version": "0.7.0", + "version": "0.8.0-rc.0", "dependencies": { "d3-dag": "1.2.1", "d3-hierarchy": "3.1.2", diff --git a/package.json b/package.json index d8e6bc5..bd1cba2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gitverse", - "version": "0.7.0", + "version": "0.8.0-rc.0", "private": true, "type": "module", "scripts": { diff --git a/src/ui/GithubLink.svelte b/src/ui/GithubLink.svelte new file mode 100644 index 0000000..2ded9a7 --- /dev/null +++ b/src/ui/GithubLink.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/src/ui/Layout.svelte b/src/ui/Layout.svelte index b8b0942..632eb13 100644 --- a/src/ui/Layout.svelte +++ b/src/ui/Layout.svelte @@ -2,17 +2,24 @@ import Terminal from './Terminal.svelte'; import Graph from './Graph.svelte'; import ResetButton from './ResetButton.svelte'; + import GithubLink from './GithubLink.svelte';
{` ██████╗ ██╗████████╗██╗ ██╗███████╗██████╗ ███████╗███████╗
+ class="absolute top-3 right-16 z-10 font-mono text-terminal-dim/80 text-xs leading-tight select-none pointer-events-none max-sm:hidden">{` ██████╗ ██╗████████╗██╗ ██╗███████╗██████╗ ███████╗███████╗
██╔════╝ ██║╚══██╔══╝██║ ██║██╔════╝██╔══██╗██╔════╝██╔════╝
██║ ███╗██║ ██║ ██║ ██║█████╗ ██████╔╝███████╗█████╗
██║ ██║██║ ██║ ╚██╗ ██╔╝██╔══╝ ██╔══██╗╚════██║██╔══╝
diff --git a/tests/e2e/a11y.spec.ts b/tests/e2e/a11y.spec.ts
index c45eb18..7e9e636 100644
--- a/tests/e2e/a11y.spec.ts
+++ b/tests/e2e/a11y.spec.ts
@@ -170,3 +170,11 @@ test('unknown command shows a dim hint line', async ({ page }) => {
await expect(page.getByText(/command not found/)).toBeVisible();
await expect(page.getByText(/type 'help' to see available commands/)).toBeVisible();
});
+
+test('GitHub source link points to the repo in a safe new tab', async ({ page }) => {
+ const link = page.getByRole('link', { name: 'View source on GitHub' });
+ await expect(link).toHaveAttribute('href', 'https://github.com/opariffazman/gitverse');
+ await expect(link).toHaveAttribute('target', '_blank');
+ // Opener isolation so the new tab can't navigate this one (tabnabbing).
+ await expect(link).toHaveAttribute('rel', /noopener/);
+});