element-book 26.12.0 → 26.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{src/data/book-entry/base-book-entry.ts → dist/data/book-entry/base-book-entry.d.ts} +2 -3
- package/dist/data/book-entry/base-book-entry.js +1 -0
- package/{src/data/book-entry/book-entry-type.ts → dist/data/book-entry/book-entry-type.d.ts} +5 -9
- package/dist/data/book-entry/book-entry-type.js +14 -0
- package/dist/data/book-entry/book-entry.d.ts +17 -0
- package/dist/data/book-entry/book-entry.js +9 -0
- package/dist/data/book-entry/book-page/book-page-controls.d.ts +92 -0
- package/dist/data/book-entry/book-page/book-page-controls.js +70 -0
- package/dist/data/book-entry/book-page/book-page.d.ts +63 -0
- package/dist/data/book-entry/book-page/book-page.js +2 -0
- package/dist/data/book-entry/book-page/controls-wrapper.d.ts +32 -0
- package/dist/data/book-entry/book-page/controls-wrapper.js +65 -0
- package/dist/data/book-entry/book-page/define-book-page.d.ts +58 -0
- package/dist/data/book-entry/book-page/define-book-page.js +52 -0
- package/dist/data/book-entry/book-root.d.ts +12 -0
- package/dist/data/book-entry/book-root.js +1 -0
- package/dist/data/book-entry/url-breadcrumbs.d.ts +23 -0
- package/{src/data/book-entry/url-breadcrumbs.ts → dist/data/book-entry/url-breadcrumbs.js} +8 -17
- package/dist/data/book-entry/verify-book-entry.d.ts +3 -0
- package/{src/data/book-entry/verify-book-entry.ts → dist/data/book-entry/verify-book-entry.js} +3 -9
- package/{src/data/book-tree/book-tree-node.ts → dist/data/book-tree/book-tree-node.d.ts} +9 -15
- package/dist/data/book-tree/book-tree-node.js +6 -0
- package/dist/data/book-tree/book-tree.d.ts +13 -0
- package/dist/data/book-tree/book-tree.js +136 -0
- package/dist/data/book-tree/search-nodes.d.ts +5 -0
- package/dist/data/book-tree/search-nodes.js +74 -0
- package/dist/data/book-tree/tree-cache.d.ts +4 -0
- package/dist/data/book-tree/tree-cache.js +8 -0
- package/dist/data/unset.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/routing/book-router.d.ts +4 -0
- package/{src/routing/book-router.ts → dist/routing/book-router.js} +12 -16
- package/{src/routing/book-routing.ts → dist/routing/book-routing.d.ts} +6 -21
- package/dist/routing/book-routing.js +33 -0
- package/dist/ui/color-theme/color-theme.d.ts +57 -0
- package/dist/ui/color-theme/color-theme.js +94 -0
- package/dist/ui/color-theme/create-color-theme.d.ts +32 -0
- package/dist/ui/color-theme/create-color-theme.js +93 -0
- package/dist/ui/elements/book-breadcrumbs.element.d.ts +6 -0
- package/dist/ui/elements/book-breadcrumbs.element.js +50 -0
- package/dist/ui/elements/book-nav/book-nav-filter.d.ts +2 -0
- package/dist/ui/elements/book-nav/book-nav-filter.js +15 -0
- package/dist/ui/elements/book-nav/book-nav.element.d.ts +8 -0
- package/{src/ui/elements/book-nav/book-nav.element.ts → dist/ui/elements/book-nav/book-nav.element.js} +44 -65
- package/dist/ui/elements/common/book-error.element.d.ts +3 -0
- package/{src/ui/elements/common/book-error.element.ts → dist/ui/elements/common/book-error.element.js} +8 -12
- package/dist/ui/elements/common/book-route-link.element.d.ts +6 -0
- package/dist/ui/elements/common/book-route-link.element.js +40 -0
- package/dist/ui/elements/define-book-element.d.ts +2 -0
- package/dist/ui/elements/define-book-element.js +2 -0
- package/{src/ui/elements/element-book-app/element-book-app-slots.ts → dist/ui/elements/element-book-app/element-book-app-slots.d.ts} +3 -3
- package/dist/ui/elements/element-book-app/element-book-app-slots.js +18 -0
- package/dist/ui/elements/element-book-app/element-book-app.element.d.ts +35 -0
- package/dist/ui/elements/element-book-app/element-book-app.element.js +301 -0
- package/dist/ui/elements/element-book-app/element-book-config.d.ts +48 -0
- package/dist/ui/elements/element-book-app/element-book-config.js +1 -0
- package/dist/ui/elements/element-book-app/get-current-nodes.d.ts +3 -0
- package/dist/ui/elements/element-book-app/get-current-nodes.js +18 -0
- package/dist/ui/elements/element-book-app/global-values.js +1 -0
- package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.d.ts +7 -0
- package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.js +60 -0
- package/dist/ui/elements/entry-display/book-entry-description.element.d.ts +4 -0
- package/{src/ui/elements/entry-display/book-entry-description.element.ts → dist/ui/elements/entry-display/book-entry-description.element.js} +7 -10
- package/dist/ui/elements/entry-display/book-page/book-page-controls.element.d.ts +17 -0
- package/dist/ui/elements/entry-display/book-page/book-page-controls.element.js +172 -0
- package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.d.ts +10 -0
- package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.js +86 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.d.ts +7 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.js +34 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.d.ts +7 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.js +61 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.d.ts +9 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.js +50 -0
- package/dist/ui/elements/entry-display/entry-display/book-entry-display.element.d.ts +18 -0
- package/{src/ui/elements/entry-display/entry-display/book-entry-display.element.ts → dist/ui/elements/entry-display/entry-display/book-entry-display.element.js} +27 -49
- package/dist/ui/elements/entry-display/entry-display/create-node-templates.d.ts +13 -0
- package/dist/ui/elements/entry-display/entry-display/create-node-templates.js +113 -0
- package/dist/ui/events/change-route.event.d.ts +1 -0
- package/dist/ui/events/change-route.event.js +2 -0
- package/dist/util/fuzzy-search.d.ts +34 -0
- package/{src/util/fuzzy-search.ts → dist/util/fuzzy-search.js} +5 -13
- package/{src/util/type.ts → dist/util/type.d.ts} +4 -3
- package/dist/util/type.js +1 -0
- package/package.json +5 -5
- package/src/data/book-entry/book-entry.ts +0 -23
- package/src/data/book-entry/book-page/book-page-controls.ts +0 -159
- package/src/data/book-entry/book-page/book-page.ts +0 -110
- package/src/data/book-entry/book-page/controls-wrapper.ts +0 -119
- package/src/data/book-entry/book-page/define-book-page.ts +0 -171
- package/src/data/book-entry/book-root.ts +0 -16
- package/src/data/book-tree/book-tree.ts +0 -225
- package/src/data/book-tree/search-nodes.ts +0 -104
- package/src/data/book-tree/tree-cache.ts +0 -13
- package/src/ui/color-theme/color-theme.ts +0 -152
- package/src/ui/color-theme/create-color-theme.ts +0 -139
- package/src/ui/elements/book-breadcrumbs.element.ts +0 -60
- package/src/ui/elements/book-nav/book-nav-filter.ts +0 -30
- package/src/ui/elements/common/book-route-link.element.ts +0 -48
- package/src/ui/elements/define-book-element.ts +0 -5
- package/src/ui/elements/element-book-app/element-book-app.element.ts +0 -380
- package/src/ui/elements/element-book-app/element-book-config.ts +0 -52
- package/src/ui/elements/element-book-app/get-current-nodes.ts +0 -35
- package/src/ui/elements/entry-display/book-breadcrumbs-bar.element.ts +0 -78
- package/src/ui/elements/entry-display/book-page/book-page-controls.element.ts +0 -219
- package/src/ui/elements/entry-display/book-page/book-page-wrapper.element.ts +0 -105
- package/src/ui/elements/entry-display/element-example/book-element-example-controls.element.ts +0 -42
- package/src/ui/elements/entry-display/element-example/book-element-example-viewer.element.ts +0 -79
- package/src/ui/elements/entry-display/element-example/book-element-example-wrapper.element.ts +0 -61
- package/src/ui/elements/entry-display/entry-display/create-node-templates.ts +0 -183
- package/src/ui/events/change-route.event.ts +0 -6
- /package/{src/data/unset.ts → dist/data/unset.js} +0 -0
- /package/{src/index.ts → dist/index.d.ts} +0 -0
- /package/{src/ui/elements/element-book-app/global-values.ts → dist/ui/elements/element-book-app/global-values.d.ts} +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { mapObjectValues } from '@augment-vir/common';
|
|
2
|
+
import Color from 'colorjs.io';
|
|
3
|
+
import { unsafeCSS } from 'element-vir';
|
|
4
|
+
function colorsObjectToCssResult(colors) {
|
|
5
|
+
return mapObjectValues(colors, (key, value) => {
|
|
6
|
+
if (value instanceof Color) {
|
|
7
|
+
return unsafeCSS(value.toString({ format: 'hex' }));
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
return colorsObjectToCssResult(value);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The default theme color.
|
|
16
|
+
*
|
|
17
|
+
* @category Internal
|
|
18
|
+
*/
|
|
19
|
+
export const defaultThemeStartColor = 'dodgerblue';
|
|
20
|
+
function calculateTextColorString(color) {
|
|
21
|
+
const onWhite = Math.abs(color.contrast('white', 'APCA'));
|
|
22
|
+
const onBlack = Math.abs(color.contrast('black', 'APCA'));
|
|
23
|
+
const textColorString = onWhite > onBlack ? 'white' : 'black';
|
|
24
|
+
return textColorString;
|
|
25
|
+
}
|
|
26
|
+
function createColorPair({ background, foreground, }) {
|
|
27
|
+
return {
|
|
28
|
+
background: background ?? new Color(calculateTextColorString(foreground)),
|
|
29
|
+
foreground: foreground ?? new Color(calculateTextColorString(background)),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Theme style options for the element-book app.
|
|
34
|
+
*
|
|
35
|
+
* @category Internal
|
|
36
|
+
*/
|
|
37
|
+
export var ThemeStyle;
|
|
38
|
+
(function (ThemeStyle) {
|
|
39
|
+
ThemeStyle["Dark"] = "dark";
|
|
40
|
+
ThemeStyle["Light"] = "light";
|
|
41
|
+
})(ThemeStyle || (ThemeStyle = {}));
|
|
42
|
+
function flipBackForeground(input) {
|
|
43
|
+
return input === 'black' ? 'white' : 'black';
|
|
44
|
+
}
|
|
45
|
+
const faintForegroundColors = {
|
|
46
|
+
black: {
|
|
47
|
+
foregroundFaint1: new Color('#ccc'),
|
|
48
|
+
foregroundFaint2: new Color('#eee'),
|
|
49
|
+
},
|
|
50
|
+
white: {
|
|
51
|
+
foregroundFaint1: new Color('#ccc'),
|
|
52
|
+
foregroundFaint2: new Color('#eee'),
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const faintBackgroundColors = {
|
|
56
|
+
black: {
|
|
57
|
+
backgroundFaint1: new Color('#666'),
|
|
58
|
+
backgroundFaint2: new Color('#444'),
|
|
59
|
+
},
|
|
60
|
+
white: {
|
|
61
|
+
backgroundFaint1: new Color('#ccc'),
|
|
62
|
+
backgroundFaint2: new Color('#fafafa'),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Creates a theme from the given theme configuration.
|
|
67
|
+
*
|
|
68
|
+
* @category Internal
|
|
69
|
+
*/
|
|
70
|
+
export function createTheme({ themeColor: inputThemeColor = defaultThemeStartColor, themeStyle = ThemeStyle.Light, } = {}) {
|
|
71
|
+
const themeColor = new Color(inputThemeColor);
|
|
72
|
+
const backgroundColor = new Color(themeStyle === ThemeStyle.Dark ? 'black' : 'white');
|
|
73
|
+
const foregroundColorString = calculateTextColorString(backgroundColor);
|
|
74
|
+
const foregroundColor = new Color(foregroundColorString);
|
|
75
|
+
const colors = {
|
|
76
|
+
nav: {
|
|
77
|
+
hover: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 93 }) }),
|
|
78
|
+
active: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 90 }) }),
|
|
79
|
+
selected: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 85 }) }),
|
|
80
|
+
},
|
|
81
|
+
accent: {
|
|
82
|
+
icon: themeColor.clone().set({ 'hsl.l': 40 }),
|
|
83
|
+
},
|
|
84
|
+
page: {
|
|
85
|
+
background: backgroundColor,
|
|
86
|
+
...faintBackgroundColors[flipBackForeground(foregroundColorString)],
|
|
87
|
+
foreground: foregroundColor,
|
|
88
|
+
...faintForegroundColors[foregroundColorString],
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const convertedToCssResults = colorsObjectToCssResult(colors);
|
|
92
|
+
return convertedToCssResults;
|
|
93
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BookRouter } from '../../routing/book-router.js';
|
|
2
|
+
import { type BookFullRoute } from '../../routing/book-routing.js';
|
|
3
|
+
export declare const BookBreadcrumbs: import("element-vir").DeclarativeElementDefinition<"book-breadcrumbs", {
|
|
4
|
+
currentRoute: Readonly<BookFullRoute>;
|
|
5
|
+
router: Readonly<BookRouter> | undefined;
|
|
6
|
+
}, {}, {}, "book-breadcrumbs-", "book-breadcrumbs-", readonly [], readonly []>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { css, html } from 'element-vir';
|
|
2
|
+
import { BookMainRoute } from '../../routing/book-routing.js';
|
|
3
|
+
import { BookRouteLink } from './common/book-route-link.element.js';
|
|
4
|
+
import { defineBookElement } from './define-book-element.js';
|
|
5
|
+
export const BookBreadcrumbs = defineBookElement()({
|
|
6
|
+
tagName: 'book-breadcrumbs',
|
|
7
|
+
styles: css `
|
|
8
|
+
:host {
|
|
9
|
+
display: flex;
|
|
10
|
+
color: #999;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.spacer {
|
|
14
|
+
padding: 0 4px;
|
|
15
|
+
}
|
|
16
|
+
`,
|
|
17
|
+
render: ({ inputs }) => {
|
|
18
|
+
const bookPaths = inputs.currentRoute.paths.slice(1);
|
|
19
|
+
if (!bookPaths.length) {
|
|
20
|
+
return html `
|
|
21
|
+
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
24
|
+
return bookPaths.map((currentPath, pathIndex, pathsArray) => {
|
|
25
|
+
const isLastPath = pathIndex >= pathsArray.length - 1;
|
|
26
|
+
const fullPathSoFar = pathsArray.slice(0, pathIndex + 1);
|
|
27
|
+
const spacer = isLastPath
|
|
28
|
+
? ''
|
|
29
|
+
: html `
|
|
30
|
+
<span class="spacer">></span>
|
|
31
|
+
`;
|
|
32
|
+
return html `
|
|
33
|
+
<${BookRouteLink.assign({
|
|
34
|
+
route: {
|
|
35
|
+
hash: undefined,
|
|
36
|
+
search: undefined,
|
|
37
|
+
paths: [
|
|
38
|
+
BookMainRoute.Book,
|
|
39
|
+
...fullPathSoFar,
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
router: inputs.router,
|
|
43
|
+
})}>
|
|
44
|
+
${currentPath}
|
|
45
|
+
</${BookRouteLink}>
|
|
46
|
+
${spacer}
|
|
47
|
+
`;
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { check } from '@augment-vir/assert';
|
|
2
|
+
import { BookEntryType } from '../../../data/book-entry/book-entry-type.js';
|
|
3
|
+
export function shouldShowTreeNodeInNav(currentNode, selectedPath) {
|
|
4
|
+
if (currentNode.entry.entryType === BookEntryType.Root) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
if (currentNode.entry.entryType === BookEntryType.Page) {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
const isParentSelected = check.jsonEquals(selectedPath, currentNode.fullUrlBreadcrumbs.slice(0, -1));
|
|
11
|
+
if (isParentSelected) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
return check.jsonEquals(selectedPath?.slice(0, -1), currentNode.fullUrlBreadcrumbs.slice(0, -1));
|
|
15
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type BookTreeNode } from '../../../data/book-tree/book-tree-node.js';
|
|
2
|
+
import { type BookRouter } from '../../../routing/book-router.js';
|
|
3
|
+
export declare const BookNav: import("element-vir").DeclarativeElementDefinition<"book-nav", {
|
|
4
|
+
flattenedNodes: ReadonlyArray<Readonly<BookTreeNode>>;
|
|
5
|
+
selectedPath: ReadonlyArray<string> | undefined;
|
|
6
|
+
router: BookRouter | undefined;
|
|
7
|
+
}, {}, {}, "book-nav-", "book-nav-internal-indent", readonly [], readonly []>;
|
|
8
|
+
export declare function scrollSelectedNavElementIntoView(bookNavInstance: typeof BookNav.InstanceType): Promise<void>;
|
|
@@ -1,35 +1,26 @@
|
|
|
1
|
-
import {check} from '@augment-vir/assert';
|
|
2
|
-
import {checkIfEntirelyInScrollView, waitForAnimationFrame} from '@augment-vir/web';
|
|
3
|
-
import {classMap, css, html, renderIf} from 'element-vir';
|
|
4
|
-
import {Element16Icon, ViraIcon} from 'vira';
|
|
5
|
-
import {BookEntryType} from '../../../data/book-entry/book-entry-type.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
import {shouldShowTreeNodeInNav} from './book-nav-filter.js';
|
|
15
|
-
|
|
16
|
-
export const BookNav = defineBookElement<{
|
|
17
|
-
flattenedNodes: ReadonlyArray<Readonly<BookTreeNode>>;
|
|
18
|
-
selectedPath: ReadonlyArray<string> | undefined;
|
|
19
|
-
router: BookRouter | undefined;
|
|
20
|
-
}>()({
|
|
1
|
+
import { check } from '@augment-vir/assert';
|
|
2
|
+
import { checkIfEntirelyInScrollView, waitForAnimationFrame } from '@augment-vir/web';
|
|
3
|
+
import { classMap, css, html, renderIf } from 'element-vir';
|
|
4
|
+
import { Element16Icon, ViraIcon } from 'vira';
|
|
5
|
+
import { BookEntryType } from '../../../data/book-entry/book-entry-type.js';
|
|
6
|
+
import { isBookTreeNode } from '../../../data/book-tree/book-tree.js';
|
|
7
|
+
import { BookMainRoute, defaultBookFullRoute } from '../../../routing/book-routing.js';
|
|
8
|
+
import { colorThemeCssVars } from '../../color-theme/color-theme.js';
|
|
9
|
+
import { BookRouteLink } from '../common/book-route-link.element.js';
|
|
10
|
+
import { defineBookElement } from '../define-book-element.js';
|
|
11
|
+
import { ElementBookSlotName } from '../element-book-app/element-book-app-slots.js';
|
|
12
|
+
import { shouldShowTreeNodeInNav } from './book-nav-filter.js';
|
|
13
|
+
export const BookNav = defineBookElement()({
|
|
21
14
|
tagName: 'book-nav',
|
|
22
15
|
cssVars: {
|
|
23
16
|
'book-nav-internal-indent': '0',
|
|
24
17
|
},
|
|
25
|
-
styles: ({cssVars}) => css`
|
|
18
|
+
styles: ({ cssVars }) => css `
|
|
26
19
|
:host {
|
|
27
20
|
display: flex;
|
|
28
21
|
flex-direction: column;
|
|
29
22
|
padding: 16px 0;
|
|
30
|
-
background-color: ${colorThemeCssVars[
|
|
31
|
-
'element-book-page-background-faint-level-2-color'
|
|
32
|
-
].value};
|
|
23
|
+
background-color: ${colorThemeCssVars['element-book-page-background-faint-level-2-color'].value};
|
|
33
24
|
}
|
|
34
25
|
|
|
35
26
|
.title-row:hover {
|
|
@@ -39,15 +30,15 @@ export const BookNav = defineBookElement<{
|
|
|
39
30
|
|
|
40
31
|
.title-row:active {
|
|
41
32
|
background-color: ${colorThemeCssVars['element-book-nav-active-background-color']
|
|
42
|
-
|
|
33
|
+
.value};
|
|
43
34
|
color: ${colorThemeCssVars['element-book-nav-active-foreground-color'].value};
|
|
44
35
|
}
|
|
45
36
|
|
|
46
37
|
.title-row {
|
|
47
38
|
display: block;
|
|
48
39
|
${BookRouteLink.cssVars['book-route-link-anchor-padding']
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
.name}: 1px 24px 1px calc(calc(16px * ${cssVars['book-nav-internal-indent']
|
|
41
|
+
.value}) + 8px);
|
|
51
42
|
}
|
|
52
43
|
|
|
53
44
|
ul {
|
|
@@ -59,7 +50,7 @@ export const BookNav = defineBookElement<{
|
|
|
59
50
|
.selected,
|
|
60
51
|
.selected:hover {
|
|
61
52
|
background-color: ${colorThemeCssVars['element-book-nav-selected-background-color']
|
|
62
|
-
|
|
53
|
+
.value};
|
|
63
54
|
color: ${colorThemeCssVars['element-book-nav-selected-foreground-color'].value};
|
|
64
55
|
pointer-events: none;
|
|
65
56
|
}
|
|
@@ -79,52 +70,47 @@ export const BookNav = defineBookElement<{
|
|
|
79
70
|
color: ${colorThemeCssVars['element-book-accent-icon-color'].value};
|
|
80
71
|
}
|
|
81
72
|
`,
|
|
82
|
-
render({inputs}) {
|
|
73
|
+
render({ inputs }) {
|
|
83
74
|
const navTreeTemplates = inputs.flattenedNodes.map((treeNode) => {
|
|
84
75
|
if (!shouldShowTreeNodeInNav(treeNode, inputs.selectedPath)) {
|
|
85
76
|
return;
|
|
86
77
|
}
|
|
87
|
-
const liStyle = css`
|
|
78
|
+
const liStyle = css `
|
|
88
79
|
--book-nav-internal-indent: ${treeNode.fullUrlBreadcrumbs.length - 1};
|
|
89
80
|
`;
|
|
90
|
-
|
|
91
|
-
return html`
|
|
81
|
+
return html `
|
|
92
82
|
<li style=${liStyle}>
|
|
93
83
|
<${BookRouteLink.assign({
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
84
|
+
router: inputs.router,
|
|
85
|
+
route: {
|
|
86
|
+
paths: [
|
|
87
|
+
BookMainRoute.Book,
|
|
88
|
+
...treeNode.fullUrlBreadcrumbs,
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
})}
|
|
102
92
|
class=${classMap({
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
93
|
+
'title-row': true,
|
|
94
|
+
selected: inputs.selectedPath
|
|
95
|
+
? check.jsonEquals(inputs.selectedPath, treeNode.fullUrlBreadcrumbs)
|
|
96
|
+
: false,
|
|
97
|
+
})}
|
|
108
98
|
>
|
|
109
99
|
<div class="title-text">
|
|
110
|
-
${renderIf(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
<${ViraIcon.assign({icon: Element16Icon})}></${ViraIcon}>
|
|
114
|
-
`,
|
|
115
|
-
)}
|
|
100
|
+
${renderIf(isBookTreeNode(treeNode, BookEntryType.ElementExample), html `
|
|
101
|
+
<${ViraIcon.assign({ icon: Element16Icon })}></${ViraIcon}>
|
|
102
|
+
`)}
|
|
116
103
|
${treeNode.entry.title}
|
|
117
104
|
</div>
|
|
118
105
|
</${BookRouteLink}>
|
|
119
106
|
</li>
|
|
120
107
|
`;
|
|
121
108
|
});
|
|
122
|
-
|
|
123
|
-
return html`
|
|
109
|
+
return html `
|
|
124
110
|
<${BookRouteLink.assign({
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
111
|
+
route: defaultBookFullRoute,
|
|
112
|
+
router: inputs.router,
|
|
113
|
+
})}>
|
|
128
114
|
<slot name=${ElementBookSlotName.NavHeader}>Book</slot>
|
|
129
115
|
</${BookRouteLink}>
|
|
130
116
|
<ul>
|
|
@@ -133,21 +119,14 @@ export const BookNav = defineBookElement<{
|
|
|
133
119
|
`;
|
|
134
120
|
},
|
|
135
121
|
});
|
|
136
|
-
|
|
137
|
-
export async function scrollSelectedNavElementIntoView(
|
|
138
|
-
bookNavInstance: typeof BookNav.InstanceType,
|
|
139
|
-
) {
|
|
122
|
+
export async function scrollSelectedNavElementIntoView(bookNavInstance) {
|
|
140
123
|
await waitForAnimationFrame(2);
|
|
141
|
-
|
|
142
124
|
const selected = bookNavInstance.shadowRoot.querySelector('.selected');
|
|
143
|
-
|
|
144
125
|
if (!selected) {
|
|
145
126
|
throw new Error('Failed to find selected nav tree element.');
|
|
146
127
|
}
|
|
147
|
-
|
|
148
128
|
if (await checkIfEntirelyInScrollView(selected)) {
|
|
149
129
|
return;
|
|
150
130
|
}
|
|
151
|
-
|
|
152
|
-
selected.scrollIntoView({behavior: 'smooth', block: 'center'});
|
|
131
|
+
selected.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
153
132
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {check} from '@augment-vir/assert';
|
|
2
|
-
import {css, html} from 'element-vir';
|
|
3
|
-
import {defineBookElement} from '../define-book-element.js';
|
|
4
|
-
|
|
5
|
-
export const BookError = defineBookElement<{message: string | ReadonlyArray<string>}>()({
|
|
1
|
+
import { check } from '@augment-vir/assert';
|
|
2
|
+
import { css, html } from 'element-vir';
|
|
3
|
+
import { defineBookElement } from '../define-book-element.js';
|
|
4
|
+
export const BookError = defineBookElement()({
|
|
6
5
|
tagName: 'book-error',
|
|
7
|
-
styles: css`
|
|
6
|
+
styles: css `
|
|
8
7
|
:host {
|
|
9
8
|
display: flex;
|
|
10
9
|
flex-direction: column;
|
|
@@ -17,13 +16,10 @@ export const BookError = defineBookElement<{message: string | ReadonlyArray<stri
|
|
|
17
16
|
padding: 0;
|
|
18
17
|
}
|
|
19
18
|
`,
|
|
20
|
-
render({inputs}) {
|
|
19
|
+
render({ inputs }) {
|
|
21
20
|
const paragraphs = check.isArray(inputs.message) ? inputs.message : [inputs.message];
|
|
22
|
-
|
|
23
|
-
return paragraphs.map(
|
|
24
|
-
(paragraph) => html`
|
|
21
|
+
return paragraphs.map((paragraph) => html `
|
|
25
22
|
<p>${paragraph}</p>
|
|
26
|
-
|
|
27
|
-
);
|
|
23
|
+
`);
|
|
28
24
|
},
|
|
29
25
|
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BookRouter } from '../../../routing/book-router.js';
|
|
2
|
+
import { type BookFullRoute } from '../../../routing/book-routing.js';
|
|
3
|
+
export declare const BookRouteLink: import("element-vir").DeclarativeElementDefinition<"book-route-link", {
|
|
4
|
+
route: Partial<BookFullRoute>;
|
|
5
|
+
router: Readonly<BookRouter> | undefined;
|
|
6
|
+
}, {}, {}, "book-route-link-", "book-route-link-anchor-padding", readonly [], readonly []>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { css, html, listen } from 'element-vir';
|
|
2
|
+
import { shouldClickEventTriggerRouteChange } from 'spa-router-vir';
|
|
3
|
+
import { ChangeRouteEvent } from '../../events/change-route.event.js';
|
|
4
|
+
import { defineBookElement } from '../define-book-element.js';
|
|
5
|
+
export const BookRouteLink = defineBookElement()({
|
|
6
|
+
tagName: 'book-route-link',
|
|
7
|
+
cssVars: {
|
|
8
|
+
'book-route-link-anchor-padding': '',
|
|
9
|
+
},
|
|
10
|
+
styles: ({ cssVars }) => css `
|
|
11
|
+
a {
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
display: block;
|
|
14
|
+
padding: ${cssVars['book-route-link-anchor-padding'].value};
|
|
15
|
+
text-decoration: inherit;
|
|
16
|
+
color: inherit;
|
|
17
|
+
height: 100%;
|
|
18
|
+
width: 100%;
|
|
19
|
+
}
|
|
20
|
+
`,
|
|
21
|
+
render: ({ inputs, dispatch }) => {
|
|
22
|
+
const linkUrl = inputs.router?.createRouteUrl({
|
|
23
|
+
...inputs.route,
|
|
24
|
+
}) ?? '#';
|
|
25
|
+
return html `
|
|
26
|
+
<a
|
|
27
|
+
href=${linkUrl}
|
|
28
|
+
${listen('click', (clickEvent) => {
|
|
29
|
+
if (!inputs.router || shouldClickEventTriggerRouteChange(clickEvent)) {
|
|
30
|
+
clickEvent.preventDefault();
|
|
31
|
+
window.scrollTo(0, 0);
|
|
32
|
+
dispatch(new ChangeRouteEvent(inputs.route));
|
|
33
|
+
}
|
|
34
|
+
})}
|
|
35
|
+
>
|
|
36
|
+
<slot></slot>
|
|
37
|
+
</a>
|
|
38
|
+
`;
|
|
39
|
+
},
|
|
40
|
+
});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type BookTagName = `book-${string}`;
|
|
2
|
+
export declare const defineBookElement: <Inputs extends {}>(...errorParams: import("element-vir").DeclarativeElementInputErrorParams<Inputs>) => <const TagName extends `book-${string}`, State extends {}, EventsInit extends {}, const HostClassKeys extends `${TagName}-${string}` = `${TagName}-`, const CssVarKeys extends `${TagName}-${string}` = `${TagName}-`, const SlotNames extends ReadonlyArray<string> = readonly [], const TestIds extends ReadonlyArray<string> = readonly []>(inputs: import("element-vir").DeclarativeElementInit<TagName, Inputs, State, EventsInit, HostClassKeys, CssVarKeys, SlotNames, TestIds>) => import("element-vir").DeclarativeElementDefinition<TagName, Inputs, State, EventsInit, HostClassKeys, CssVarKeys, SlotNames, TestIds>;
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @category Main
|
|
5
5
|
*/
|
|
6
|
-
export enum ElementBookSlotName {
|
|
6
|
+
export declare enum ElementBookSlotName {
|
|
7
7
|
/**
|
|
8
8
|
* Used to specify a footer for the main element example viewer. It always appears at the bottom
|
|
9
9
|
* of the viewer's scroll area.
|
|
10
10
|
*/
|
|
11
|
-
Footer =
|
|
11
|
+
Footer = "book-footer",
|
|
12
12
|
/**
|
|
13
13
|
* Used to specify a header above the navigation sidebar. This is a particularly good place for
|
|
14
14
|
* branding.
|
|
15
15
|
*/
|
|
16
|
-
NavHeader =
|
|
16
|
+
NavHeader = "book-nav-header"
|
|
17
17
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slots to be used on an element-book app instance for inserting custom HTML into the app.
|
|
3
|
+
*
|
|
4
|
+
* @category Main
|
|
5
|
+
*/
|
|
6
|
+
export var ElementBookSlotName;
|
|
7
|
+
(function (ElementBookSlotName) {
|
|
8
|
+
/**
|
|
9
|
+
* Used to specify a footer for the main element example viewer. It always appears at the bottom
|
|
10
|
+
* of the viewer's scroll area.
|
|
11
|
+
*/
|
|
12
|
+
ElementBookSlotName["Footer"] = "book-footer";
|
|
13
|
+
/**
|
|
14
|
+
* Used to specify a header above the navigation sidebar. This is a particularly good place for
|
|
15
|
+
* branding.
|
|
16
|
+
*/
|
|
17
|
+
ElementBookSlotName["NavHeader"] = "book-nav-header";
|
|
18
|
+
})(ElementBookSlotName || (ElementBookSlotName = {}));
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ControlsWrapper } from '../../../data/book-entry/book-page/controls-wrapper.js';
|
|
2
|
+
import { type BookRouter } from '../../../routing/book-router.js';
|
|
3
|
+
import { type ColorTheme } from '../../color-theme/color-theme.js';
|
|
4
|
+
import { type ThemeConfig } from '../../color-theme/create-color-theme.js';
|
|
5
|
+
import { type ElementBookConfig } from './element-book-config.js';
|
|
6
|
+
import { type GlobalValues } from './global-values.js';
|
|
7
|
+
/**
|
|
8
|
+
* Current color theme state used inside of {@link ElementBookApp}.
|
|
9
|
+
*
|
|
10
|
+
* @category Internal
|
|
11
|
+
*/
|
|
12
|
+
export type ColorThemeState = {
|
|
13
|
+
config: ThemeConfig | undefined;
|
|
14
|
+
theme: ColorTheme;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The element-book app itself. Instantiate one of these where you want your element-book pages to
|
|
18
|
+
* render. Make sure to also provide an array of pages to actually render!
|
|
19
|
+
*
|
|
20
|
+
* @category Main
|
|
21
|
+
*/
|
|
22
|
+
export declare const ElementBookApp: import("element-vir").DeclarativeElementDefinition<"element-book-app", ElementBookConfig, {
|
|
23
|
+
currentRoute: Readonly<Readonly<Required<import("spa-router-vir").SpaRoute<import("../../../routing/book-routing.js").ValidBookPaths, undefined, undefined>>>>;
|
|
24
|
+
router: undefined | BookRouter;
|
|
25
|
+
loading: boolean;
|
|
26
|
+
colors: ColorThemeState;
|
|
27
|
+
treeBasedControls: {
|
|
28
|
+
pages: ElementBookConfig["pages"];
|
|
29
|
+
lastGlobalInputs: GlobalValues;
|
|
30
|
+
controls: ControlsWrapper;
|
|
31
|
+
} | undefined;
|
|
32
|
+
originalWindowTitle: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
pathUpdate: import("element-vir").DefineEvent<readonly string[]>;
|
|
35
|
+
}, "element-book-app-", "element-book-app-", readonly [], readonly []>;
|