element-book 6.0.3 → 7.0.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/README.md +5 -5
- package/dist/data/book-entry/base-book-entry.d.ts +20 -0
- package/dist/data/book-entry/book-element-example/book-element-example.d.ts +32 -0
- package/dist/data/book-entry/book-entry-type.d.ts +9 -0
- package/dist/data/book-entry/book-entry-type.js +9 -0
- package/dist/data/book-entry/book-entry.d.ts +8 -0
- package/dist/data/book-entry/book-entry.js +4 -0
- package/dist/data/book-entry/book-page/book-page-controls.d.ts +41 -0
- package/dist/data/book-entry/book-page/book-page-controls.js +49 -0
- package/dist/data/book-entry/book-page/book-page.d.ts +12 -0
- package/dist/data/book-entry/book-page/book-page.js +1 -0
- package/dist/data/book-entry/book-page/current-controls.d.ts +12 -0
- package/dist/data/book-entry/book-page/current-controls.js +62 -0
- package/dist/data/book-entry/book-page/define-book-page.d.ts +18 -0
- package/dist/data/book-entry/book-page/define-book-page.js +34 -0
- package/dist/data/book-entry/book-root.d.ts +7 -0
- package/dist/data/book-entry/book-root.js +1 -0
- package/dist/data/book-entry/url-breadcrumbs.d.ts +7 -0
- package/dist/data/book-entry/url-breadcrumbs.js +24 -0
- package/dist/data/book-entry/verify-book-entry.d.ts +6 -0
- package/dist/data/book-entry/verify-book-entry.js +18 -0
- package/dist/data/book-tree/book-tree-node.d.ts +27 -0
- package/dist/data/book-tree/book-tree-node.js +1 -0
- package/dist/data/book-tree/book-tree.d.ts +16 -0
- package/dist/data/book-tree/book-tree.js +148 -0
- package/dist/data/book-tree/search-nodes.d.ts +5 -0
- package/dist/data/book-tree/search-nodes.js +56 -0
- package/dist/data/book-tree/tree-cache.d.ts +4 -0
- package/dist/data/book-tree/tree-cache.js +8 -0
- package/dist/index.d.ts +5 -6
- package/dist/index.js +5 -6
- package/dist/routing/book-routing.d.ts +10 -0
- package/dist/routing/book-routing.js +18 -0
- package/dist/routing/create-book-router.d.ts +2 -0
- package/dist/routing/{create-element-book-router.js → create-book-router.js} +8 -8
- package/dist/ui/elements/book-breadcrumbs.element.d.ts +5 -0
- package/dist/ui/elements/{element-book-breadcrumbs.element.js → book-breadcrumbs.element.js} +9 -9
- package/dist/ui/elements/book-nav.element.d.ts +7 -0
- package/dist/ui/elements/book-nav.element.js +114 -0
- package/dist/ui/elements/common/book-error.element.d.ts +3 -0
- package/dist/ui/elements/common/book-error.element.js +27 -0
- package/dist/ui/elements/common/book-route-link.element.d.ts +5 -0
- package/dist/ui/elements/common/{element-book-route-link.element.js → book-route-link.element.js} +5 -5
- package/dist/ui/elements/define-book-element.d.ts +2 -2
- package/dist/ui/elements/define-book-element.js +1 -1
- package/dist/ui/elements/element-book-app/element-book-app-slots.d.ts +2 -2
- package/dist/ui/elements/element-book-app/element-book-app-slots.js +2 -2
- package/dist/ui/elements/element-book-app/element-book-app.element.d.ts +7 -2
- package/dist/ui/elements/element-book-app/element-book-app.element.js +76 -29
- package/dist/ui/elements/element-book-app/element-book-config.d.ts +4 -2
- 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 +23 -0
- package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.d.ts +6 -0
- package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.js +65 -0
- package/dist/ui/elements/entry-display/book-entry-description.element.d.ts +3 -0
- package/dist/ui/elements/entry-display/book-entry-description.element.js +34 -0
- package/dist/ui/elements/entry-display/book-entry-display.element.d.ts +12 -0
- package/dist/ui/elements/entry-display/book-entry-display.element.js +173 -0
- 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 +147 -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 +92 -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 +36 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.d.ts +9 -0
- package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.js +57 -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 +49 -0
- package/dist/ui/events/change-route.event.d.ts +1 -1
- package/dist/util/type.d.ts +40 -0
- package/dist/util/type.js +1 -0
- package/package.json +15 -11
- package/dist/data/element-book-entry/element-book-chapter/element-book-chapter.d.ts +0 -22
- package/dist/data/element-book-entry/element-book-chapter/element-book-chapter.js +0 -16
- package/dist/data/element-book-entry/element-book-entry-type.d.ts +0 -8
- package/dist/data/element-book-entry/element-book-entry-type.js +0 -9
- package/dist/data/element-book-entry/element-book-entry.d.ts +0 -14
- package/dist/data/element-book-entry/element-book-entry.js +0 -22
- package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control-type.d.ts +0 -13
- package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control-type.js +0 -7
- package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control.d.ts +0 -13
- package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control.js +0 -4
- package/dist/data/element-book-entry/element-book-page/element-book-page-example.d.ts +0 -22
- package/dist/data/element-book-entry/element-book-page/element-book-page.d.ts +0 -23
- package/dist/data/element-book-entry/element-book-page/element-book-page.js +0 -41
- package/dist/data/element-book-entry/entry-tree/entry-tree-search.d.ts +0 -8
- package/dist/data/element-book-entry/entry-tree/entry-tree-search.js +0 -66
- package/dist/data/element-book-entry/entry-tree/entry-tree.d.ts +0 -18
- package/dist/data/element-book-entry/entry-tree/entry-tree.js +0 -87
- package/dist/data/element-book-entry/entry-tree/tree-cache.d.ts +0 -5
- package/dist/data/element-book-entry/entry-tree/tree-cache.js +0 -8
- package/dist/data/element-book-entry/entry-tree/walk-entry-tree.d.ts +0 -8
- package/dist/data/element-book-entry/entry-tree/walk-entry-tree.js +0 -85
- package/dist/routing/create-element-book-router.d.ts +0 -2
- package/dist/routing/element-book-routing.d.ts +0 -10
- package/dist/routing/element-book-routing.js +0 -18
- package/dist/ui/elements/common/element-book-route-link.element.d.ts +0 -5
- package/dist/ui/elements/element-book-app/get-current-entry.d.ts +0 -4
- package/dist/ui/elements/element-book-app/get-current-entry.js +0 -17
- package/dist/ui/elements/element-book-breadcrumbs.element.d.ts +0 -5
- package/dist/ui/elements/element-book-nav.element.d.ts +0 -7
- package/dist/ui/elements/element-book-nav.element.js +0 -129
- package/dist/ui/elements/entry-display/element-book-entry-display.element.d.ts +0 -7
- package/dist/ui/elements/entry-display/element-book-entry-display.element.js +0 -280
- package/dist/ui/elements/entry-display/element-book-example-controls.element.d.ts +0 -4
- package/dist/ui/elements/entry-display/element-book-example-controls.element.js +0 -26
- package/dist/ui/elements/entry-display/element-book-example-viewer.element.d.ts +0 -6
- package/dist/ui/elements/entry-display/element-book-example-viewer.element.js +0 -43
- package/dist/ui/elements/entry-display/element-book-page-controls.element.d.ts +0 -11
- package/dist/ui/elements/entry-display/element-book-page-controls.element.js +0 -65
- package/dist/ui/elements/entry-display/element-book-page-examples.element.d.ts +0 -7
- package/dist/ui/elements/entry-display/element-book-page-examples.element.js +0 -102
- package/dist/ui/icons/element-16.icon.d.ts +0 -1
- package/dist/ui/icons/element-16.icon.js +0 -18
- package/dist/ui/icons/element-24.icon.d.ts +0 -1
- package/dist/ui/icons/element-24.icon.js +0 -18
- package/dist/utilities/type.d.ts +0 -3
- /package/dist/data/{element-book-entry/element-book-page/element-book-page-example.js → book-entry/base-book-entry.js} +0 -0
- /package/dist/{utilities/type.js → data/book-entry/book-element-example/book-element-example.js} +0 -0
- /package/dist/{utilities/search.d.ts → util/fuzzy-search.d.ts} +0 -0
- /package/dist/{utilities/search.js → util/fuzzy-search.js} +0 -0
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
import { areJsonEqual, extractErrorMessage } from '@augment-vir/common';
|
|
2
2
|
import { assign, css, defineElement, defineElementEvent, html, listen } from 'element-vir';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { createControlsFromTree, createNewCurrentControls, } from '../../../data/book-entry/book-page/current-controls';
|
|
4
|
+
import { createBookTreeFromEntries } from '../../../data/book-tree/book-tree';
|
|
5
|
+
import { searchFlattenedNodes } from '../../../data/book-tree/search-nodes';
|
|
6
|
+
import { defaultBookFullRoute, extractSearchQuery, } from '../../../routing/book-routing';
|
|
7
|
+
import { createBookRouter } from '../../../routing/create-book-router';
|
|
7
8
|
import { colorThemeCssVars, setThemeCssVars } from '../../color-theme/color-theme';
|
|
8
9
|
import { createTheme } from '../../color-theme/create-color-theme';
|
|
9
10
|
import { ChangeRouteEvent } from '../../events/change-route.event';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { BookNav } from '../book-nav.element';
|
|
12
|
+
import { BookError } from '../common/book-error.element';
|
|
13
|
+
import { BookEntryDisplay } from '../entry-display/book-entry-display.element';
|
|
14
|
+
import { BookPageControls } from '../entry-display/book-page/book-page-controls.element';
|
|
12
15
|
import { ElementBookSlotName } from './element-book-app-slots';
|
|
13
|
-
import {
|
|
16
|
+
import { getCurrentNodes } from './get-current-nodes';
|
|
14
17
|
export const ElementBookApp = defineElement()({
|
|
15
18
|
tagName: 'element-book-app',
|
|
16
19
|
events: {
|
|
17
20
|
pathUpdate: defineElementEvent(),
|
|
18
21
|
},
|
|
19
22
|
stateInitStatic: {
|
|
20
|
-
currentRoute:
|
|
23
|
+
currentRoute: defaultBookFullRoute,
|
|
21
24
|
router: undefined,
|
|
22
25
|
colors: {
|
|
23
26
|
config: undefined,
|
|
24
27
|
theme: createTheme(undefined),
|
|
25
28
|
},
|
|
29
|
+
treeBasedCurrentControls: undefined,
|
|
26
30
|
},
|
|
27
31
|
styles: css `
|
|
28
32
|
:host {
|
|
@@ -45,14 +49,14 @@ export const ElementBookApp = defineElement()({
|
|
|
45
49
|
position: relative;
|
|
46
50
|
}
|
|
47
51
|
|
|
48
|
-
${
|
|
52
|
+
${BookEntryDisplay} {
|
|
49
53
|
flex-grow: 1;
|
|
50
54
|
overflow-x: hidden;
|
|
51
55
|
overflow-y: auto;
|
|
52
56
|
max-height: 100%;
|
|
53
57
|
}
|
|
54
58
|
|
|
55
|
-
${
|
|
59
|
+
${BookNav} {
|
|
56
60
|
flex-shrink: 0;
|
|
57
61
|
position: sticky;
|
|
58
62
|
overflow-x: hidden;
|
|
@@ -91,7 +95,7 @@ export const ElementBookApp = defineElement()({
|
|
|
91
95
|
updateRoutes({ paths: inputs.elementBookRoutePaths });
|
|
92
96
|
}
|
|
93
97
|
if (inputs.internalRouterConfig?.useInternalRouter && !state.router) {
|
|
94
|
-
const router =
|
|
98
|
+
const router = createBookRouter(inputs.internalRouterConfig.basePath);
|
|
95
99
|
updateState({ router });
|
|
96
100
|
router.addRouteListener(true, (fullRoute) => {
|
|
97
101
|
updateState({
|
|
@@ -115,54 +119,97 @@ export const ElementBookApp = defineElement()({
|
|
|
115
119
|
});
|
|
116
120
|
setThemeCssVars(host, newTheme);
|
|
117
121
|
}
|
|
118
|
-
const
|
|
122
|
+
const debug = inputs.debug ?? false;
|
|
123
|
+
const originalTree = createBookTreeFromEntries({
|
|
124
|
+
entries: inputs.entries,
|
|
125
|
+
everythingTitle: inputs.everythingTitle,
|
|
126
|
+
everythingDescriptionParagraphs: inputs.everythingDescriptionParagraphs ?? [],
|
|
127
|
+
debug,
|
|
128
|
+
});
|
|
129
|
+
if (!state.treeBasedCurrentControls ||
|
|
130
|
+
state.treeBasedCurrentControls.trigger !== inputs.entries) {
|
|
131
|
+
updateState({
|
|
132
|
+
treeBasedCurrentControls: {
|
|
133
|
+
trigger: inputs.entries,
|
|
134
|
+
currentControls: createControlsFromTree(originalTree.tree),
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
119
138
|
const searchQuery = extractSearchQuery(state.currentRoute.paths);
|
|
120
|
-
const
|
|
121
|
-
?
|
|
122
|
-
|
|
139
|
+
const searchedNodes = searchQuery
|
|
140
|
+
? searchFlattenedNodes({
|
|
141
|
+
flattenedNodes: originalTree.flattenedNodes,
|
|
123
142
|
searchQuery,
|
|
124
|
-
startTree: originalTree,
|
|
125
143
|
})
|
|
126
|
-
:
|
|
127
|
-
const
|
|
144
|
+
: undefined;
|
|
145
|
+
const currentNodes = searchedNodes ??
|
|
146
|
+
getCurrentNodes(originalTree.flattenedNodes, state.currentRoute.paths, updateRoutes);
|
|
147
|
+
const currentControls = state.treeBasedCurrentControls?.currentControls;
|
|
148
|
+
if (!currentControls) {
|
|
149
|
+
return html `
|
|
150
|
+
<${BookError}
|
|
151
|
+
${assign(BookError, { message: 'Failed to generate page controls.' })}
|
|
152
|
+
></${BookError}>
|
|
153
|
+
`;
|
|
154
|
+
}
|
|
155
|
+
if (inputs.debug) {
|
|
156
|
+
console.info({ currentControls });
|
|
157
|
+
}
|
|
128
158
|
return html `
|
|
129
159
|
<div
|
|
130
160
|
class="root"
|
|
131
161
|
${listen(ChangeRouteEvent, (event) => {
|
|
132
|
-
const entryDisplay = host.shadowRoot.querySelector(
|
|
162
|
+
const entryDisplay = host.shadowRoot.querySelector(BookEntryDisplay.tagName);
|
|
133
163
|
if (entryDisplay) {
|
|
134
164
|
entryDisplay.scroll({ top: 0, behavior: 'smooth' });
|
|
135
165
|
}
|
|
136
166
|
else {
|
|
137
|
-
console.error(`Failed to find '${
|
|
167
|
+
console.error(`Failed to find '${BookEntryDisplay.tagName}' for scrolling.`);
|
|
138
168
|
}
|
|
139
169
|
updateRoutes(event.detail);
|
|
170
|
+
})}
|
|
171
|
+
${listen(BookPageControls.events.controlValueChange, (event) => {
|
|
172
|
+
if (!state.treeBasedCurrentControls) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const newControls = createNewCurrentControls(currentControls, event.detail.fullUrlBreadcrumbs, event.detail.newValues);
|
|
176
|
+
updateState({
|
|
177
|
+
treeBasedCurrentControls: {
|
|
178
|
+
...state.treeBasedCurrentControls,
|
|
179
|
+
currentControls: newControls,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
140
182
|
})}
|
|
141
183
|
>
|
|
142
|
-
<${
|
|
143
|
-
${assign(
|
|
144
|
-
|
|
184
|
+
<${BookNav}
|
|
185
|
+
${assign(BookNav, {
|
|
186
|
+
flattenedNodes: originalTree.flattenedNodes,
|
|
145
187
|
router: state.router,
|
|
146
|
-
selectedPath:
|
|
188
|
+
selectedPath: searchQuery
|
|
189
|
+
? undefined
|
|
190
|
+
: state.currentRoute.paths.slice(1),
|
|
147
191
|
})}
|
|
148
192
|
>
|
|
149
193
|
<slot
|
|
150
194
|
name=${ElementBookSlotName.NavHeader}
|
|
151
195
|
slot=${ElementBookSlotName.NavHeader}
|
|
152
196
|
></slot>
|
|
153
|
-
</${
|
|
154
|
-
<${
|
|
155
|
-
${assign(
|
|
197
|
+
</${BookNav}>
|
|
198
|
+
<${BookEntryDisplay}
|
|
199
|
+
${assign(BookEntryDisplay, {
|
|
156
200
|
currentRoute: state.currentRoute,
|
|
157
|
-
|
|
201
|
+
currentNodes,
|
|
158
202
|
router: state.router,
|
|
203
|
+
debug,
|
|
204
|
+
currentControls,
|
|
205
|
+
originalTree: originalTree.tree,
|
|
159
206
|
})}
|
|
160
207
|
>
|
|
161
208
|
<slot
|
|
162
209
|
name=${ElementBookSlotName.Footer}
|
|
163
210
|
slot=${ElementBookSlotName.Footer}
|
|
164
211
|
></slot>
|
|
165
|
-
</${
|
|
212
|
+
</${BookEntryDisplay}>
|
|
166
213
|
</div>
|
|
167
214
|
`;
|
|
168
215
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { PartialAndUndefined } from '@augment-vir/common';
|
|
2
2
|
import { RequireExactlyOne } from 'type-fest';
|
|
3
|
-
import {
|
|
3
|
+
import { BookEntry } from '../../../data/book-entry/book-entry';
|
|
4
4
|
export type ElementBookConfig = {
|
|
5
5
|
/** All element-book entries in order. */
|
|
6
|
-
entries: ReadonlyArray<
|
|
6
|
+
entries: ReadonlyArray<BookEntry>;
|
|
7
7
|
} & PartialAndUndefined<OptionalConfig>;
|
|
8
8
|
type OptionalConfig = {
|
|
9
9
|
/** The base theme color from which all other element-book colors will be generated from. */
|
|
10
10
|
themeColor: string;
|
|
11
11
|
/** The title to use for the "Everything" nav link. */
|
|
12
12
|
everythingTitle: string;
|
|
13
|
+
everythingDescriptionParagraphs: ReadonlyArray<string>;
|
|
14
|
+
debug: boolean;
|
|
13
15
|
} & RequireExactlyOne<{
|
|
14
16
|
/**
|
|
15
17
|
* Set this internal router config if element-book is intended to be the current website's
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { BookTreeNode } from '../../../data/book-tree/book-tree-node';
|
|
2
|
+
import { BookFullRoute, ValidBookPaths } from '../../../routing/book-routing';
|
|
3
|
+
export declare function getCurrentNodes(flattenedNodes: ReadonlyArray<Readonly<BookTreeNode>>, currentPaths: Readonly<ValidBookPaths>, updateRoutes: (newRoute: Partial<BookFullRoute>) => void): BookTreeNode[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { doBreadcrumbsStartWith } from '../../../data/book-entry/url-breadcrumbs';
|
|
2
|
+
import { defaultBookFullRoute } from '../../../routing/book-routing';
|
|
3
|
+
export function getCurrentNodes(flattenedNodes, currentPaths, updateRoutes) {
|
|
4
|
+
const filteredNodes = filterNodes(flattenedNodes, currentPaths);
|
|
5
|
+
if (filteredNodes.length) {
|
|
6
|
+
return filteredNodes;
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
updateRoutes(defaultBookFullRoute);
|
|
10
|
+
}
|
|
11
|
+
const filteredNodesFromDefaultPath = filterNodes(flattenedNodes, defaultBookFullRoute.paths);
|
|
12
|
+
if (!filteredNodesFromDefaultPath) {
|
|
13
|
+
throw new Error(`Tried to self-correct for invalid path ${currentPaths.join('/')}
|
|
14
|
+
but failed to do so.`);
|
|
15
|
+
}
|
|
16
|
+
return filteredNodesFromDefaultPath;
|
|
17
|
+
}
|
|
18
|
+
function filterNodes(flattenedNodes, paths) {
|
|
19
|
+
return flattenedNodes.filter((node) => doBreadcrumbsStartWith({
|
|
20
|
+
searchFor: paths.slice(1),
|
|
21
|
+
searchIn: node.fullUrlBreadcrumbs,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BookFullRoute, BookRouter } from '../../../routing/book-routing';
|
|
2
|
+
export declare const BookBreadcrumbsBar: import("element-vir").DeclarativeElementDefinition<"book-breadcrumbs-bar", {
|
|
3
|
+
currentSearch: string;
|
|
4
|
+
currentRoute: BookFullRoute;
|
|
5
|
+
router: BookRouter;
|
|
6
|
+
}, {}, {}, `book-breadcrumbs-bar-${string}`, `book-breadcrumbs-bar-${string}`, import("lit-html").HTMLTemplateResult>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { wait } from '@augment-vir/common';
|
|
2
|
+
import { assign, css, html, listen, renderIf } from 'element-vir';
|
|
3
|
+
import { BookMainRoute, defaultBookFullRoute, } from '../../../routing/book-routing';
|
|
4
|
+
import { colorThemeCssVars } from '../../color-theme/color-theme';
|
|
5
|
+
import { ChangeRouteEvent } from '../../events/change-route.event';
|
|
6
|
+
import { BookBreadcrumbs } from '../book-breadcrumbs.element';
|
|
7
|
+
import { defineBookElement } from '../define-book-element';
|
|
8
|
+
export const BookBreadcrumbsBar = defineBookElement()({
|
|
9
|
+
tagName: 'book-breadcrumbs-bar',
|
|
10
|
+
styles: css `
|
|
11
|
+
:host {
|
|
12
|
+
position: sticky;
|
|
13
|
+
top: 0;
|
|
14
|
+
border-bottom: 1px solid
|
|
15
|
+
${colorThemeCssVars['element-book-page-foreground-faint-level-2-color'].value};
|
|
16
|
+
padding: 4px 8px;
|
|
17
|
+
background-color: ${colorThemeCssVars['element-book-page-background-color'].value};
|
|
18
|
+
z-index: 9999999999;
|
|
19
|
+
display: flex;
|
|
20
|
+
gap: 16px;
|
|
21
|
+
justify-content: space-between;
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
renderCallback({ inputs, dispatch }) {
|
|
25
|
+
return html `
|
|
26
|
+
${renderIf(!!inputs.currentSearch, html `
|
|
27
|
+
|
|
28
|
+
`, html `
|
|
29
|
+
<${BookBreadcrumbs}
|
|
30
|
+
${assign(BookBreadcrumbs, {
|
|
31
|
+
currentRoute: inputs.currentRoute,
|
|
32
|
+
router: inputs.router,
|
|
33
|
+
})}
|
|
34
|
+
></${BookBreadcrumbs}>
|
|
35
|
+
`)}
|
|
36
|
+
<input
|
|
37
|
+
placeholder="search"
|
|
38
|
+
.value=${inputs.currentSearch}
|
|
39
|
+
${listen('input', async (event) => {
|
|
40
|
+
const inputElement = event.currentTarget;
|
|
41
|
+
if (!(inputElement instanceof HTMLInputElement)) {
|
|
42
|
+
throw new Error('Failed to find input element for search.');
|
|
43
|
+
}
|
|
44
|
+
const preThrottleValue = inputElement.value;
|
|
45
|
+
// throttle it a bit
|
|
46
|
+
await wait(200);
|
|
47
|
+
if (inputElement.value !== preThrottleValue) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (inputElement.value) {
|
|
51
|
+
dispatch(new ChangeRouteEvent({
|
|
52
|
+
paths: [
|
|
53
|
+
BookMainRoute.Search,
|
|
54
|
+
encodeURIComponent(inputElement.value),
|
|
55
|
+
],
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
dispatch(new ChangeRouteEvent(defaultBookFullRoute));
|
|
60
|
+
}
|
|
61
|
+
})}
|
|
62
|
+
/>
|
|
63
|
+
`;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const BookEntryDescription: import("element-vir").DeclarativeElementDefinition<"book-entry-description", {
|
|
2
|
+
descriptionParagraphs: ReadonlyArray<string>;
|
|
3
|
+
}, {}, {}, `book-entry-description-${string}`, `book-entry-description-${string}`, import("lit-html").HTMLTemplateResult[]>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { css, html } from 'element-vir';
|
|
2
|
+
import { colorThemeCssVars } from '../../color-theme/color-theme';
|
|
3
|
+
import { defineBookElement } from '../define-book-element';
|
|
4
|
+
export const BookEntryDescription = defineBookElement()({
|
|
5
|
+
tagName: 'book-entry-description',
|
|
6
|
+
styles: css `
|
|
7
|
+
:host {
|
|
8
|
+
color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
gap: 8px;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:host(:hover) {
|
|
15
|
+
color: ${colorThemeCssVars['element-book-page-foreground-color'].value};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
p {
|
|
19
|
+
margin: 0;
|
|
20
|
+
padding: 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
p:first-child {
|
|
24
|
+
margin-top: 8px;
|
|
25
|
+
}
|
|
26
|
+
`,
|
|
27
|
+
renderCallback({ inputs }) {
|
|
28
|
+
return inputs.descriptionParagraphs.map((paragraph) => {
|
|
29
|
+
return html `
|
|
30
|
+
<p>${paragraph}</p>
|
|
31
|
+
`;
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BookEntryTypeEnum } from '../../../data/book-entry/book-entry-type';
|
|
2
|
+
import { CurrentControls } from '../../../data/book-entry/book-page/current-controls';
|
|
3
|
+
import { BookTreeNode } from '../../../data/book-tree/book-tree-node';
|
|
4
|
+
import { BookFullRoute, BookRouter } from '../../../routing/book-routing';
|
|
5
|
+
export declare const BookEntryDisplay: import("element-vir").DeclarativeElementDefinition<"book-entry-display", {
|
|
6
|
+
currentRoute: Readonly<BookFullRoute>;
|
|
7
|
+
currentNodes: ReadonlyArray<BookTreeNode>;
|
|
8
|
+
originalTree: Readonly<BookTreeNode<BookEntryTypeEnum.Root>>;
|
|
9
|
+
router: BookRouter;
|
|
10
|
+
debug: boolean;
|
|
11
|
+
currentControls: CurrentControls;
|
|
12
|
+
}, {}, {}, `book-entry-display-${string}`, `book-entry-display-${string}`, import("lit-html").HTMLTemplateResult>;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { assign, css, html, repeat } from 'element-vir';
|
|
2
|
+
import { BookEntryTypeEnum } from '../../../data/book-entry/book-entry-type';
|
|
3
|
+
import { isLengthAtLeast, mapObjectValues } from '@augment-vir/common';
|
|
4
|
+
import { traverseCurrentControls, } from '../../../data/book-entry/book-page/current-controls';
|
|
5
|
+
import { isBookTreeNode, traverseToImmediateParent } from '../../../data/book-tree/book-tree';
|
|
6
|
+
import { extractSearchQuery } from '../../../routing/book-routing';
|
|
7
|
+
import { BookError } from '../common/book-error.element';
|
|
8
|
+
import { defineBookElement } from '../define-book-element';
|
|
9
|
+
import { ElementBookSlotName } from '../element-book-app/element-book-app-slots';
|
|
10
|
+
import { BookBreadcrumbsBar } from './book-breadcrumbs-bar.element';
|
|
11
|
+
import { BookPageControls } from './book-page/book-page-controls.element';
|
|
12
|
+
import { BookPageWrapper } from './book-page/book-page-wrapper.element';
|
|
13
|
+
import { BookElementExampleWrapper } from './element-example/book-element-example-wrapper.element';
|
|
14
|
+
export const BookEntryDisplay = defineBookElement()({
|
|
15
|
+
tagName: 'book-entry-display',
|
|
16
|
+
styles: css `
|
|
17
|
+
:host {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.all-book-entries-wrapper {
|
|
23
|
+
flex-grow: 1;
|
|
24
|
+
padding: 32px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.inline-entry {
|
|
28
|
+
margin-top: 32px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.inline-entry + .inline-entry {
|
|
32
|
+
margin-left: 16px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
* + .block-entry {
|
|
36
|
+
margin-top: 32px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
h1 {
|
|
40
|
+
margin: 0;
|
|
41
|
+
padding: 0;
|
|
42
|
+
}
|
|
43
|
+
`,
|
|
44
|
+
renderCallback: ({ inputs }) => {
|
|
45
|
+
const currentSearch = extractSearchQuery(inputs.currentRoute.paths);
|
|
46
|
+
const entryTemplates = createNodeTemplates({
|
|
47
|
+
currentNodes: inputs.currentNodes,
|
|
48
|
+
isTopLevel: true,
|
|
49
|
+
router: inputs.router,
|
|
50
|
+
isSearching: !!currentSearch,
|
|
51
|
+
currentControls: inputs.currentControls,
|
|
52
|
+
originalTree: inputs.originalTree,
|
|
53
|
+
});
|
|
54
|
+
return html `
|
|
55
|
+
<${BookBreadcrumbsBar}
|
|
56
|
+
${assign(BookBreadcrumbsBar, {
|
|
57
|
+
currentSearch,
|
|
58
|
+
currentRoute: inputs.currentRoute,
|
|
59
|
+
router: inputs.router,
|
|
60
|
+
})}
|
|
61
|
+
></${BookBreadcrumbsBar}>
|
|
62
|
+
<div class="all-book-entries-wrapper">${entryTemplates}</div>
|
|
63
|
+
<slot name=${ElementBookSlotName.Footer}></slot>
|
|
64
|
+
`;
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
function getFlattenedControlsFromHiddenParents(currentNodes, currentControls, currentNode, originalTree) {
|
|
68
|
+
const parent = traverseToImmediateParent(currentNode, originalTree);
|
|
69
|
+
const allControls = [];
|
|
70
|
+
if (parent) {
|
|
71
|
+
const parentControls = getFlattenedControlsFromHiddenParents(currentNodes, currentControls, parent, originalTree);
|
|
72
|
+
if (parentControls) {
|
|
73
|
+
allControls.push(parentControls);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (isBookTreeNode(currentNode, BookEntryTypeEnum.Page) &&
|
|
77
|
+
!currentNodes.includes(currentNode)) {
|
|
78
|
+
const currentEntryControls = traverseCurrentControls(currentControls, currentNode.fullUrlBreadcrumbs);
|
|
79
|
+
allControls.push({
|
|
80
|
+
config: currentNode.entry.controls,
|
|
81
|
+
current: currentEntryControls,
|
|
82
|
+
breadcrumbs: mapObjectValues(currentEntryControls, () => {
|
|
83
|
+
return currentNode.fullUrlBreadcrumbs;
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return allControls.reduce((accum, currentControls) => {
|
|
88
|
+
return {
|
|
89
|
+
config: {
|
|
90
|
+
...accum.config,
|
|
91
|
+
...currentControls.config,
|
|
92
|
+
},
|
|
93
|
+
current: {
|
|
94
|
+
...accum.current,
|
|
95
|
+
...currentControls.current,
|
|
96
|
+
},
|
|
97
|
+
breadcrumbs: {
|
|
98
|
+
...accum.breadcrumbs,
|
|
99
|
+
...currentControls.breadcrumbs,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}, { config: {}, current: {}, breadcrumbs: {} });
|
|
103
|
+
}
|
|
104
|
+
function createNodeTemplates({ currentNodes, isTopLevel, router, isSearching, currentControls, originalTree, }) {
|
|
105
|
+
if (!currentNodes.length && isSearching) {
|
|
106
|
+
return [
|
|
107
|
+
html `
|
|
108
|
+
No results
|
|
109
|
+
`,
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
const hiddenAncestorControls = isLengthAtLeast(currentNodes, 1)
|
|
113
|
+
? getFlattenedControlsFromHiddenParents(currentNodes, currentControls, currentNodes[0], originalTree)
|
|
114
|
+
: undefined;
|
|
115
|
+
const hiddenAncestorControlsTemplate = hiddenAncestorControls && isLengthAtLeast(currentNodes, 1)
|
|
116
|
+
? html `
|
|
117
|
+
<${BookPageControls}
|
|
118
|
+
${assign(BookPageControls, {
|
|
119
|
+
config: hiddenAncestorControls.config,
|
|
120
|
+
currentValues: hiddenAncestorControls.current,
|
|
121
|
+
fullUrlBreadcrumbs: hiddenAncestorControls.breadcrumbs,
|
|
122
|
+
})}
|
|
123
|
+
></${BookPageControls}>
|
|
124
|
+
`
|
|
125
|
+
: '';
|
|
126
|
+
const templates = repeat(currentNodes, (node) => node.fullUrlBreadcrumbs.join('>'), (currentNode, index) => {
|
|
127
|
+
if (isBookTreeNode(currentNode, BookEntryTypeEnum.Page)) {
|
|
128
|
+
return html `
|
|
129
|
+
<${BookPageWrapper}
|
|
130
|
+
class="block-entry"
|
|
131
|
+
${assign(BookPageWrapper, {
|
|
132
|
+
isTopLevel,
|
|
133
|
+
pageNode: currentNode,
|
|
134
|
+
currentControls,
|
|
135
|
+
router,
|
|
136
|
+
})}
|
|
137
|
+
></${BookPageWrapper}>
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
else if (isBookTreeNode(currentNode, BookEntryTypeEnum.ElementExample)) {
|
|
141
|
+
const controlsForElementExample = traverseCurrentControls(currentControls, currentNode.fullUrlBreadcrumbs.slice(0, -1));
|
|
142
|
+
return html `
|
|
143
|
+
<${BookElementExampleWrapper}
|
|
144
|
+
class="inline-entry"
|
|
145
|
+
${assign(BookElementExampleWrapper, {
|
|
146
|
+
elementExampleNode: currentNode,
|
|
147
|
+
currentPageControls: controlsForElementExample,
|
|
148
|
+
router,
|
|
149
|
+
})}
|
|
150
|
+
></${BookElementExampleWrapper}>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
else if (isBookTreeNode(currentNode, BookEntryTypeEnum.Root)) {
|
|
154
|
+
return html `
|
|
155
|
+
<h1>${currentNode.entry.title}</h1>
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
return html `
|
|
160
|
+
<${BookError}
|
|
161
|
+
class="block-entry"
|
|
162
|
+
${assign(BookError, {
|
|
163
|
+
message: `Unknown entry type for rendering: '${currentNode.entry.entryType}'`,
|
|
164
|
+
})}
|
|
165
|
+
></${BookError}>
|
|
166
|
+
`;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
return [
|
|
170
|
+
hiddenAncestorControlsTemplate,
|
|
171
|
+
templates,
|
|
172
|
+
];
|
|
173
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BookPage } from '../../../../data/book-entry/book-page/book-page';
|
|
2
|
+
import { BookPageControl, BookPageControlsValues } from '../../../../data/book-entry/book-page/book-page-controls';
|
|
3
|
+
export declare const BookPageControls: import("element-vir").DeclarativeElementDefinition<"book-page-controls", {
|
|
4
|
+
config: BookPage['controls'];
|
|
5
|
+
/**
|
|
6
|
+
* If an object (or Record) is given for this input, then each key of the object must correspond
|
|
7
|
+
* to one of the controls from the input config and the value for each key will be the
|
|
8
|
+
* breadcrumbs for that specific config.
|
|
9
|
+
*/
|
|
10
|
+
fullUrlBreadcrumbs: ReadonlyArray<string> | Record<string, ReadonlyArray<string>>;
|
|
11
|
+
currentValues: Record<string, BookPageControl['initValue']>;
|
|
12
|
+
}, {}, {
|
|
13
|
+
controlValueChange: import("element-vir").DefinedTypedEventNameDefinition<{
|
|
14
|
+
fullUrlBreadcrumbs: ReadonlyArray<string>;
|
|
15
|
+
newValues: BookPageControlsValues;
|
|
16
|
+
}>;
|
|
17
|
+
}, "book-page-controls-has-controls", `book-page-controls-${string}`, "" | ("" | import("lit-html").HTMLTemplateResult)[]>;
|