mirror of
https://github.com/squidfunk/mkdocs-material.git
synced 2024-06-14 11:52:32 +03:00
Added navigation component
This commit is contained in:
parent
919fccd238
commit
e457d901b2
@ -34,7 +34,7 @@ import { ViewportOffset, getElement } from "../../ui"
|
||||
* Anchors
|
||||
*/
|
||||
export interface Anchors {
|
||||
done: HTMLAnchorElement[][] /* Read anchors */
|
||||
done: HTMLAnchorElement[][] /* Done anchors */
|
||||
next: HTMLAnchorElement[][] /* Next anchors */
|
||||
}
|
||||
|
||||
@ -158,7 +158,10 @@ export function watchAnchors(
|
||||
/* Return partition */
|
||||
return [done, next]
|
||||
}, [[], [...table]]),
|
||||
distinctUntilChanged((a, b) => a[0] === b[0] && a[1] === b[1])
|
||||
distinctUntilChanged((a, b) => {
|
||||
return a[0] === b[0]
|
||||
&& a[1] === b[1]
|
||||
})
|
||||
)
|
||||
|
||||
/* Extract anchors and return hot observable */
|
||||
|
@ -23,4 +23,5 @@
|
||||
export * from "./anchor"
|
||||
export * from "./container"
|
||||
export * from "./header"
|
||||
export * from "./navigation"
|
||||
export * from "./sidebar"
|
||||
|
82
src/assets/javascripts/component/navigation/index.ts
Normal file
82
src/assets/javascripts/component/navigation/index.ts
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2019 Martin Donath <martin.donath@squidfunk.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
import { Observable, of } from "rxjs"
|
||||
import { shareReplay } from "rxjs/operators"
|
||||
|
||||
import { getElement, getElements } from "../../ui"
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Types
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Navigation index
|
||||
*/
|
||||
export type NavigationIndex = Map<HTMLInputElement, HTMLElement>
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Functions
|
||||
* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Set navigation overflow scrolling
|
||||
*
|
||||
* @param nav - Navigation element
|
||||
* @param active - Whether overflow scrolling is active
|
||||
*/
|
||||
export function setNavigationOverflowScrolling(
|
||||
nav: HTMLElement, active: boolean
|
||||
): void {
|
||||
nav.style.webkitOverflowScrolling = active ? "touch" : ""
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Create an observable to index all navigation elements
|
||||
*
|
||||
* @param nav - Top-level navigation element
|
||||
*
|
||||
* @return Navigation index observable
|
||||
*/
|
||||
export function watchNavigationIndex(
|
||||
nav: HTMLElement
|
||||
): Observable<NavigationIndex> {
|
||||
const list = getElements("nav", nav)
|
||||
|
||||
/* Build index to map inputs to navigation lists */
|
||||
const index = new Map<HTMLInputElement, HTMLElement>()
|
||||
for (const item of list) {
|
||||
const label = getElement<HTMLLabelElement>("label", item)!
|
||||
if (typeof label !== "undefined") {
|
||||
const input = getElement<HTMLInputElement>(`#${label.htmlFor}`)!
|
||||
index.set(input, item)
|
||||
}
|
||||
}
|
||||
|
||||
/* Return navigation index */
|
||||
return of(index)
|
||||
.pipe(
|
||||
shareReplay({ bufferSize: 1, refCount: true })
|
||||
)
|
||||
}
|
@ -20,8 +20,9 @@
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
import { equals } from "ramda"
|
||||
import { Observable, combineLatest } from "rxjs"
|
||||
import { map, shareReplay } from "rxjs/operators"
|
||||
import { distinctUntilChanged, map, shareReplay } from "rxjs/operators"
|
||||
|
||||
import { ViewportOffset } from "../../ui"
|
||||
import { Container } from "../container"
|
||||
@ -112,8 +113,7 @@ export function watchSidebar(
|
||||
const height$ = combineLatest(offset$, container$)
|
||||
.pipe(
|
||||
map(([{ y }, { offset, height }]) => {
|
||||
return height - adjust
|
||||
+ Math.min(adjust, Math.max(0, y - offset))
|
||||
return height - adjust + Math.min(adjust, Math.max(0, y - offset))
|
||||
})
|
||||
)
|
||||
|
||||
@ -127,6 +127,7 @@ export function watchSidebar(
|
||||
return combineLatest(height$, lock$)
|
||||
.pipe(
|
||||
map(([height, lock]) => ({ height, lock })),
|
||||
distinctUntilChanged<Sidebar>(equals),
|
||||
shareReplay({ bufferSize: 1, refCount: true })
|
||||
)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user