Browse Source

Scroll preview to the top to show navigation whenever editing navigation settings

master
Andrew Kingston 4 years ago
parent
commit
b281e233b3
  1. 164
      packages/client/src/components/app/Layout.svelte

164
packages/client/src/components/app/Layout.svelte

@ -38,6 +38,8 @@
"Extra small": "xs", "Extra small": "xs",
} }
let mobileOpen = false
// Set some layout context. This isn't used in bindings but can be used // Set some layout context. This isn't used in bindings but can be used
// determine things about the current app layout. // determine things about the current app layout.
$: mobile = $context.device.mobile $: mobile = $context.device.mobile
@ -58,7 +60,25 @@
$context.device.width, $context.device.width,
$context.device.height $context.device.height
) )
let mobileOpen = false
// Scroll navigation into view if selected
$: {
if (
$builderStore.inBuilder &&
$builderStore.selectedComponentId === "navigation"
) {
const node = document.getElementsByClassName("nav-wrapper")?.[0]
if (node) {
console.log("scroll")
node.style.scrollMargin = "100px"
node.scrollIntoView({
behavior: "smooth",
block: "start",
inline: "start",
})
}
}
}
const isInternal = url => { const isInternal = url => {
return url.startsWith("/") return url.startsWith("/")
@ -111,76 +131,85 @@
> >
{#if typeClass !== "none"} {#if typeClass !== "none"}
<div <div
class="nav-wrapper" class="interactive component navigation"
class:sticky data-id="navigation"
class:hidden={$routeStore.queryParams?.peek} data-name="Navigation"
class:clickable={$builderStore.inBuilder} data-icon="Link"
on:click={$builderStore.inBuilder ? builderStore.actions.clickNav : null}
style={navStyle}
> >
<div class="nav nav--{typeClass} size--{navWidthClass}"> <div
<div class="nav-header"> class="nav-wrapper"
{#if validLinks?.length} class:sticky
<div class="burger"> class:hidden={$routeStore.queryParams?.peek}
<Icon class:clickable={$builderStore.inBuilder}
hoverable on:click={$builderStore.inBuilder
name="ShowMenu" ? builderStore.actions.clickNav
on:click={() => (mobileOpen = !mobileOpen)} : null}
/> style={navStyle}
</div> >
{/if} <div class="nav nav--{typeClass} size--{navWidthClass}">
<div class="logo"> <div class="nav-header">
{#if !hideLogo} {#if validLinks?.length}
<img <div class="burger">
src={logoUrl || "https://i.imgur.com/Xhdt1YP.png"} <Icon
alt={title} hoverable
/> name="ShowMenu"
{/if} on:click={() => (mobileOpen = !mobileOpen)}
{#if !hideTitle && title} />
<Heading size="S">{title}</Heading> </div>
{/if} {/if}
</div> <div class="logo">
<div class="portal"> {#if !hideLogo}
<Icon hoverable name="Apps" on:click={navigateToPortal} /> <img
</div> src={logoUrl || "https://i.imgur.com/Xhdt1YP.png"}
</div> alt={title}
<div />
class="mobile-click-handler"
class:visible={mobileOpen}
on:click={() => (mobileOpen = false)}
/>
{#if validLinks?.length}
<div class="links" class:visible={mobileOpen}>
{#each validLinks as { text, url }}
{#if isInternal(url)}
<a
class={FieldTypes.LINK}
href={url}
use:linkable
on:click={close}
use:active={url}
>
{text}
</a>
{:else}
<a
class={FieldTypes.LINK}
href={ensureExternal(url)}
on:click={close}
>
{text}
</a>
{/if} {/if}
{/each} {#if !hideTitle && title}
<div class="close"> <Heading size="S">{title}</Heading>
<Icon {/if}
hoverable </div>
name="Close" <div class="portal">
on:click={() => (mobileOpen = false)} <Icon hoverable name="Apps" on:click={navigateToPortal} />
/>
</div> </div>
</div> </div>
{/if} <div
class="mobile-click-handler"
class:visible={mobileOpen}
on:click={() => (mobileOpen = false)}
/>
{#if validLinks?.length}
<div class="links" class:visible={mobileOpen}>
{#each validLinks as { text, url }}
{#if isInternal(url)}
<a
class={FieldTypes.LINK}
href={url}
use:linkable
on:click={close}
use:active={url}
>
{text}
</a>
{:else}
<a
class={FieldTypes.LINK}
href={ensureExternal(url)}
on:click={close}
>
{text}
</a>
{/if}
{/each}
<div class="close">
<Icon
hoverable
name="Close"
on:click={() => (mobileOpen = false)}
/>
</div>
</div>
{/if}
</div>
</div> </div>
</div> </div>
{/if} {/if}
@ -193,6 +222,9 @@
<style> <style>
/* Main components */ /* Main components */
.component {
display: contents;
}
.layout { .layout {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

Loading…
Cancel
Save