From 30bad4e62948cf8585446a1db6db8c806646c864 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 4 Dec 2024 16:53:20 -0500 Subject: [PATCH 1/6] WIP better nav --- .../src/lib/components/SelectIcon.svelte | 83 ++++++++++++++++--- .../playground/[id]/AppControls.svelte | 32 ++++++- .../routes/tutorial/[...slug]/Controls.svelte | 52 +++++++----- packages/site-kit/src/lib/actions/focus.ts | 9 +- packages/site-kit/src/lib/styles/index.css | 1 + .../site-kit/src/lib/styles/utils/nav.css | 52 ++++++++++++ 6 files changed, 190 insertions(+), 39 deletions(-) create mode 100644 packages/site-kit/src/lib/styles/utils/nav.css diff --git a/apps/svelte.dev/src/lib/components/SelectIcon.svelte b/apps/svelte.dev/src/lib/components/SelectIcon.svelte index 991221459b..a413adacbc 100644 --- a/apps/svelte.dev/src/lib/components/SelectIcon.svelte +++ b/apps/svelte.dev/src/lib/components/SelectIcon.svelte @@ -1,25 +1,66 @@ -
- - -
+ + diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte index 14ff90479d..178d5c7fd3 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte @@ -1,5 +1,5 @@ - { - goto(`/tutorial/${e.currentTarget.value}`); - }} - > - {#each index as part} - - {#each part.chapters as chapter} - + +
+ {#each index as part} +
+ {part.title} + + {#each part.chapters as chapter} +
+ {chapter.title} - {#each chapter.exercises as exercise} - + +
{/each} - {/each} - - {/each} +
+ {/each} +
elements, + // except for the elements that are their direct children node.querySelectorAll( - 'a[href], button, input, textarea, select, summary, [tabindex]:not([tabindex="-1"])' + ':where(a[href], button, input, textarea, select, summary, [tabindex]:not([tabindex="-1"])):not(details:not([open]) *), summary:not(details:not([open]) details *)' ) ); @@ -31,10 +33,6 @@ export function focusable_children(node: HTMLElement) { while ((node = reordered[i])) { i += d; - if (node.matches('details:not([open]) *')) { - continue; - } - if (!selector || node.matches(selector)) { node.focus(); return; @@ -60,6 +58,7 @@ export function trap(node: HTMLElement, { reset_focus = true }: { reset_focus?: if (e.shiftKey) { group.prev(); } else { + console.log('next', group); group.next(); } } diff --git a/packages/site-kit/src/lib/styles/index.css b/packages/site-kit/src/lib/styles/index.css index e336fe3089..af9bf0c95a 100644 --- a/packages/site-kit/src/lib/styles/index.css +++ b/packages/site-kit/src/lib/styles/index.css @@ -12,4 +12,5 @@ @import './text.css'; @import './utils/buttons.css'; @import './utils/dividers.css'; +@import './utils/nav.css'; @import './utils/twoslash.css'; diff --git a/packages/site-kit/src/lib/styles/utils/nav.css b/packages/site-kit/src/lib/styles/utils/nav.css new file mode 100644 index 0000000000..b7bb3c2df6 --- /dev/null +++ b/packages/site-kit/src/lib/styles/utils/nav.css @@ -0,0 +1,52 @@ +.secondary-nav-dropdown { + max-height: 50rem; + width: 30rem; + font: var(--sk-font-ui-medium); + + details { + padding-left: 1rem; + + summary { + position: relative; + font: inherit; + display: block; + user-select: none; + + &::before { + content: ''; + position: absolute; + top: 0.3rem; + left: -2rem; + width: 1.8rem; + height: 1.8rem; + background: url($lib/icons/chevron.svg) no-repeat 50% 50%; + background-size: 100%; + rotate: -90deg; + } + + [open] > &::before { + rotate: none; + } + } + + ul { + font: inherit; + list-style: none; + margin: 0; + padding-left: 1rem; + } + } + + & > details { + padding-left: 2rem; + } + + a:not([aria-current='page']) { + color: inherit; + } + + /* necessary for reasons i don't fully understand */ + & > details[open]:last-child:not(:has([aria-current='page'])) { + padding-bottom: 1rem; + } +} From 82dd821e96192fd19b7eca89c7272387f02aed21 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Dec 2024 12:41:05 -0500 Subject: [PATCH 2/6] fixes --- .../src/lib/components/SelectIcon.svelte | 17 +++++++++++++++-- .../(authed)/playground/[id]/AppControls.svelte | 9 +-------- .../routes/tutorial/[...slug]/Controls.svelte | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/svelte.dev/src/lib/components/SelectIcon.svelte b/apps/svelte.dev/src/lib/components/SelectIcon.svelte index a413adacbc..19f41e7cec 100644 --- a/apps/svelte.dev/src/lib/components/SelectIcon.svelte +++ b/apps/svelte.dev/src/lib/components/SelectIcon.svelte @@ -5,7 +5,7 @@ import { Icon } from '@sveltejs/site-kit/components'; import type { Snippet } from 'svelte'; - let { children }: { children: Snippet } = $props(); + let { children, label }: { children: Snippet; label: string } = $props(); let open = $state(false); @@ -25,6 +25,15 @@
{ + const details = e.target as HTMLDetailsElement; + + if (details === e.currentTarget || !details.open) { + return; + } + + details.scrollIntoView(); + }} ontoggle={(e) => { const details = e.currentTarget; if (!details.open) return; @@ -36,6 +45,7 @@ // except parents of the current one const current = details.querySelector(`[href="${$page.url.pathname}"]`); + if (!current) return; let node = current as Element; @@ -44,9 +54,12 @@ (node as HTMLDetailsElement).open = true; } } + + current.scrollIntoView(); + current.focus(); }} > - + diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte b/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte index 65dbd8a25c..7f48590cd4 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte @@ -181,14 +181,7 @@ - { - goto(`/playground/${e.currentTarget.value}`); - }} - > +
Create new diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte index 178d5c7fd3..6c7b4d5e27 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte @@ -16,7 +16,7 @@ - +
{#each index as part}
From 657e3407499f126f24935c33ff75821c70fc836a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Dec 2024 12:47:55 -0500 Subject: [PATCH 3/6] fix --- apps/svelte.dev/src/lib/components/SelectIcon.svelte | 2 +- packages/site-kit/src/lib/actions/focus.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/svelte.dev/src/lib/components/SelectIcon.svelte b/apps/svelte.dev/src/lib/components/SelectIcon.svelte index 19f41e7cec..b694db22cf 100644 --- a/apps/svelte.dev/src/lib/components/SelectIcon.svelte +++ b/apps/svelte.dev/src/lib/components/SelectIcon.svelte @@ -44,7 +44,7 @@ } // except parents of the current one - const current = details.querySelector(`[href="${$page.url.pathname}"]`); + const current = details.querySelector(`[href="${$page.url.pathname}"]`) as HTMLAnchorElement | null; if (!current) return; let node = current as Element; diff --git a/packages/site-kit/src/lib/actions/focus.ts b/packages/site-kit/src/lib/actions/focus.ts index 03c62d2676..77d7b825e5 100644 --- a/packages/site-kit/src/lib/actions/focus.ts +++ b/packages/site-kit/src/lib/actions/focus.ts @@ -58,7 +58,6 @@ export function trap(node: HTMLElement, { reset_focus = true }: { reset_focus?: if (e.shiftKey) { group.prev(); } else { - console.log('next', group); group.next(); } } From 005a1d4dea8dcfb5b822fe874fcb6158d28af561 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Dec 2024 12:55:44 -0500 Subject: [PATCH 4/6] arrow key controls --- .../src/lib/components/SelectIcon.svelte | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/apps/svelte.dev/src/lib/components/SelectIcon.svelte b/apps/svelte.dev/src/lib/components/SelectIcon.svelte index b694db22cf..78738ac13b 100644 --- a/apps/svelte.dev/src/lib/components/SelectIcon.svelte +++ b/apps/svelte.dev/src/lib/components/SelectIcon.svelte @@ -1,7 +1,7 @@ - +
{#each index as part}
@@ -43,7 +43,7 @@
{/each}
-
+ Date: Thu, 5 Dec 2024 13:36:47 -0500 Subject: [PATCH 6/6] fix --- .../src/lib/components/ModalDropdown.svelte | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/svelte.dev/src/lib/components/ModalDropdown.svelte b/apps/svelte.dev/src/lib/components/ModalDropdown.svelte index 9fe7ec250d..c5456c24ae 100644 --- a/apps/svelte.dev/src/lib/components/ModalDropdown.svelte +++ b/apps/svelte.dev/src/lib/components/ModalDropdown.svelte @@ -77,9 +77,6 @@ > - - -
{@render children()}
@@ -100,13 +97,15 @@ } summary { + position: absolute; display: flex; align-items: center; justify-content: center; user-select: none; } - .modal-background { + details[open] summary::before { + content: ''; position: fixed; left: 0; top: 0; @@ -120,7 +119,7 @@ .contents { position: absolute; z-index: 9999; - background: white; + background: var(--sk-bg-2); padding: 1rem; border-radius: var(--sk-border-radius); filter: var(--sk-shadow); @@ -133,7 +132,7 @@ color: var(--sk-fg-3); line-height: 1; background-size: 1.8rem; - z-index: 999; + z-index: 9999; } .icon:hover,