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,10 @@
|
|
|
1
|
+
import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
2
|
+
import { type ControlsWrapper } from '../../../../data/book-entry/book-page/controls-wrapper.js';
|
|
3
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
4
|
+
import { type BookRouter } from '../../../../routing/book-router.js';
|
|
5
|
+
export declare const BookPageWrapper: import("element-vir").DeclarativeElementDefinition<"book-page-wrapper", {
|
|
6
|
+
isTopLevel: boolean;
|
|
7
|
+
pageNode: BookTreeNode<BookEntryType.Page>;
|
|
8
|
+
router: BookRouter | undefined;
|
|
9
|
+
controls: ControlsWrapper;
|
|
10
|
+
}, {}, {}, "book-page-wrapper-", "book-page-wrapper-", readonly [], readonly []>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { combineErrors } from '@augment-vir/common';
|
|
2
|
+
import { css, html } from 'element-vir';
|
|
3
|
+
import { traverseControls, } from '../../../../data/book-entry/book-page/controls-wrapper.js';
|
|
4
|
+
import { BookMainRoute } from '../../../../routing/book-routing.js';
|
|
5
|
+
import { BookError } from '../../common/book-error.element.js';
|
|
6
|
+
import { BookRouteLink } from '../../common/book-route-link.element.js';
|
|
7
|
+
import { defineBookElement } from '../../define-book-element.js';
|
|
8
|
+
import { BookEntryDescription } from '../book-entry-description.element.js';
|
|
9
|
+
import { BookPageControls } from './book-page-controls.element.js';
|
|
10
|
+
export const BookPageWrapper = defineBookElement()({
|
|
11
|
+
tagName: 'book-page-wrapper',
|
|
12
|
+
styles: css `
|
|
13
|
+
:host {
|
|
14
|
+
display: block;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
h2,
|
|
18
|
+
h3 {
|
|
19
|
+
margin: 0;
|
|
20
|
+
padding: 0;
|
|
21
|
+
font-size: 1.5em;
|
|
22
|
+
display: flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: 8px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.page-header .title-group {
|
|
28
|
+
align-items: flex-start;
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
${BookRouteLink} {
|
|
34
|
+
display: inline-block;
|
|
35
|
+
}
|
|
36
|
+
`,
|
|
37
|
+
render({ inputs }) {
|
|
38
|
+
const titleTemplate = inputs.isTopLevel
|
|
39
|
+
? html `
|
|
40
|
+
<h2 class="header-with-icon">${inputs.pageNode.entry.title}</h2>
|
|
41
|
+
`
|
|
42
|
+
: html `
|
|
43
|
+
<h3 class="header-with-icon">${inputs.pageNode.entry.title}</h3>
|
|
44
|
+
`;
|
|
45
|
+
const linkPaths = [
|
|
46
|
+
BookMainRoute.Book,
|
|
47
|
+
...inputs.pageNode.fullUrlBreadcrumbs,
|
|
48
|
+
];
|
|
49
|
+
const error = inputs.pageNode.entry.errors.length
|
|
50
|
+
? combineErrors(inputs.pageNode.entry.errors)
|
|
51
|
+
: undefined;
|
|
52
|
+
if (error) {
|
|
53
|
+
console.error(error);
|
|
54
|
+
}
|
|
55
|
+
return html `
|
|
56
|
+
<div class="page-header block-entry">
|
|
57
|
+
<div class="title-group">
|
|
58
|
+
<${BookRouteLink.assign({
|
|
59
|
+
route: {
|
|
60
|
+
paths: linkPaths,
|
|
61
|
+
hash: undefined,
|
|
62
|
+
search: undefined,
|
|
63
|
+
},
|
|
64
|
+
router: inputs.router,
|
|
65
|
+
})}>
|
|
66
|
+
${titleTemplate}
|
|
67
|
+
</${BookRouteLink}>
|
|
68
|
+
${error
|
|
69
|
+
? html `
|
|
70
|
+
<${BookError.assign({ message: error.message })}></${BookError}>
|
|
71
|
+
`
|
|
72
|
+
: html `
|
|
73
|
+
<${BookEntryDescription.assign({
|
|
74
|
+
descriptionParagraphs: inputs.pageNode.entry.descriptionParagraphs,
|
|
75
|
+
})}></${BookEntryDescription}>
|
|
76
|
+
<${BookPageControls.assign({
|
|
77
|
+
config: inputs.pageNode.entry.controls,
|
|
78
|
+
currentValues: traverseControls(inputs.controls, inputs.pageNode.fullUrlBreadcrumbs),
|
|
79
|
+
fullUrlBreadcrumbs: inputs.pageNode.fullUrlBreadcrumbs,
|
|
80
|
+
})}></${BookPageControls}>
|
|
81
|
+
`}
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
`;
|
|
85
|
+
},
|
|
86
|
+
});
|
package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
2
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
3
|
+
import { type BookRouter } from '../../../../routing/book-router.js';
|
|
4
|
+
export declare const BookElementExampleControls: import("element-vir").DeclarativeElementDefinition<"book-element-example-controls", {
|
|
5
|
+
elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
|
|
6
|
+
router: BookRouter | undefined;
|
|
7
|
+
}, {}, {}, "book-element-example-controls-", "book-element-example-controls-", readonly [], readonly []>;
|
package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { css, html } from 'element-vir';
|
|
2
|
+
import { BookMainRoute } from '../../../../routing/book-routing.js';
|
|
3
|
+
import { colorThemeCssVars } from '../../../color-theme/color-theme.js';
|
|
4
|
+
import { BookRouteLink } from '../../common/book-route-link.element.js';
|
|
5
|
+
import { defineBookElement } from '../../define-book-element.js';
|
|
6
|
+
export const BookElementExampleControls = defineBookElement()({
|
|
7
|
+
tagName: 'book-element-example-controls',
|
|
8
|
+
styles: css `
|
|
9
|
+
:host {
|
|
10
|
+
display: flex;
|
|
11
|
+
color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
|
|
12
|
+
border-bottom: 1px solid currentColor;
|
|
13
|
+
padding: 0 8px 4px;
|
|
14
|
+
}
|
|
15
|
+
`,
|
|
16
|
+
render({ inputs }) {
|
|
17
|
+
const linkPaths = [
|
|
18
|
+
BookMainRoute.Book,
|
|
19
|
+
...inputs.elementExampleNode.fullUrlBreadcrumbs,
|
|
20
|
+
];
|
|
21
|
+
return html `
|
|
22
|
+
<${BookRouteLink.assign({
|
|
23
|
+
route: {
|
|
24
|
+
paths: linkPaths,
|
|
25
|
+
hash: undefined,
|
|
26
|
+
search: undefined,
|
|
27
|
+
},
|
|
28
|
+
router: inputs.router,
|
|
29
|
+
})}>
|
|
30
|
+
${inputs.elementExampleNode.entry.title}
|
|
31
|
+
</${BookRouteLink}>
|
|
32
|
+
`;
|
|
33
|
+
},
|
|
34
|
+
});
|
package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
2
|
+
import { type BookPageControlsValues } from '../../../../data/book-entry/book-page/book-page-controls.js';
|
|
3
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
4
|
+
export declare const BookElementExampleViewer: import("element-vir").DeclarativeElementDefinition<"book-element-example-viewer", {
|
|
5
|
+
elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
|
|
6
|
+
currentPageControls: BookPageControlsValues;
|
|
7
|
+
}, any, {}, "book-element-example-viewer-", "book-element-example-viewer-", readonly [], readonly []>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { combineErrors, extractErrorMessage } from '@augment-vir/common';
|
|
2
|
+
import { html, renderIf } from 'element-vir';
|
|
3
|
+
import { unsetInternalState } from '../../../../data/unset.js';
|
|
4
|
+
import { BookError } from '../../common/book-error.element.js';
|
|
5
|
+
import { defineBookElement } from '../../define-book-element.js';
|
|
6
|
+
export const BookElementExampleViewer = defineBookElement()({
|
|
7
|
+
tagName: 'book-element-example-viewer',
|
|
8
|
+
state() {
|
|
9
|
+
return {
|
|
10
|
+
isUnset: unsetInternalState,
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
render({ state, inputs, updateState }) {
|
|
14
|
+
try {
|
|
15
|
+
if (inputs.elementExampleNode.entry.errors.length) {
|
|
16
|
+
throw combineErrors(inputs.elementExampleNode.entry.errors);
|
|
17
|
+
}
|
|
18
|
+
if (
|
|
19
|
+
/** This is a check to make sure the input entry _does_ match the expected type. */
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
21
|
+
!inputs.elementExampleNode.entry.render ||
|
|
22
|
+
typeof inputs.elementExampleNode.entry.render === 'string') {
|
|
23
|
+
throw new Error(`Failed to render example '${inputs.elementExampleNode.entry.title}': render is not a function`);
|
|
24
|
+
}
|
|
25
|
+
if (state.isUnset === unsetInternalState) {
|
|
26
|
+
updateState({
|
|
27
|
+
isUnset: undefined,
|
|
28
|
+
...inputs.elementExampleNode.entry.state?.(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const output = inputs.elementExampleNode.entry.render({
|
|
32
|
+
state,
|
|
33
|
+
updateState,
|
|
34
|
+
controls: inputs.currentPageControls,
|
|
35
|
+
});
|
|
36
|
+
if (output instanceof Promise) {
|
|
37
|
+
throw new TypeError('render output cannot be a promise');
|
|
38
|
+
}
|
|
39
|
+
return html `
|
|
40
|
+
${renderIf(!!inputs.elementExampleNode.entry.styles, html `
|
|
41
|
+
<style>
|
|
42
|
+
${inputs.elementExampleNode.entry.styles}
|
|
43
|
+
</style>
|
|
44
|
+
`)}
|
|
45
|
+
${output}
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error('ERROR HERE', extractErrorMessage(error));
|
|
50
|
+
console.error(error);
|
|
51
|
+
return html `
|
|
52
|
+
<${BookError.assign({
|
|
53
|
+
message: `${inputs.elementExampleNode.entry.title} failed: ${extractErrorMessage(error)}`,
|
|
54
|
+
})}></${BookError}>
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
options: {
|
|
59
|
+
allowPolymorphicState: true,
|
|
60
|
+
},
|
|
61
|
+
});
|
package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
2
|
+
import { type BookPageControlsValues } from '../../../../data/book-entry/book-page/book-page-controls.js';
|
|
3
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
4
|
+
import { type BookRouter } from '../../../../routing/book-router.js';
|
|
5
|
+
export declare const BookElementExampleWrapper: import("element-vir").DeclarativeElementDefinition<"book-element-example-wrapper", {
|
|
6
|
+
elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
|
|
7
|
+
currentPageControls: BookPageControlsValues;
|
|
8
|
+
router: BookRouter | undefined;
|
|
9
|
+
}, {}, {}, "book-element-example-wrapper-", "book-element-example-wrapper-", readonly [], readonly []>;
|
package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { omitObjectKeys } from '@augment-vir/common';
|
|
2
|
+
import { css, html } from 'element-vir';
|
|
3
|
+
import { colorThemeCssVars } from '../../../color-theme/color-theme.js';
|
|
4
|
+
import { defineBookElement } from '../../define-book-element.js';
|
|
5
|
+
import { BookElementExampleControls } from './book-element-example-controls.element.js';
|
|
6
|
+
import { BookElementExampleViewer } from './book-element-example-viewer.element.js';
|
|
7
|
+
export const BookElementExampleWrapper = defineBookElement()({
|
|
8
|
+
tagName: 'book-element-example-wrapper',
|
|
9
|
+
styles: css `
|
|
10
|
+
:host {
|
|
11
|
+
display: inline-block;
|
|
12
|
+
max-width: 100%;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.examples-wrapper {
|
|
16
|
+
display: flex;
|
|
17
|
+
gap: 32px;
|
|
18
|
+
flex-wrap: wrap;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.error {
|
|
22
|
+
color: red;
|
|
23
|
+
font-weight: bold;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.individual-example-wrapper {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: column;
|
|
29
|
+
gap: 24px;
|
|
30
|
+
max-width: 100%;
|
|
31
|
+
align-items: flex-start;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
${BookElementExampleControls} {
|
|
35
|
+
color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:host(:hover) ${BookElementExampleControls} {
|
|
39
|
+
color: ${colorThemeCssVars['element-book-accent-icon-color'].value};
|
|
40
|
+
}
|
|
41
|
+
`,
|
|
42
|
+
render({ inputs }) {
|
|
43
|
+
return html `
|
|
44
|
+
<div class="individual-example-wrapper">
|
|
45
|
+
<${BookElementExampleControls.assign(omitObjectKeys(inputs, ['currentPageControls']))}></${BookElementExampleControls}>
|
|
46
|
+
<${BookElementExampleViewer.assign(inputs)}></${BookElementExampleViewer}>
|
|
47
|
+
</div>
|
|
48
|
+
`;
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
2
|
+
import { type ControlsWrapper } from '../../../../data/book-entry/book-page/controls-wrapper.js';
|
|
3
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
4
|
+
import { type BookRouter } from '../../../../routing/book-router.js';
|
|
5
|
+
import { type BookFullRoute } from '../../../../routing/book-routing.js';
|
|
6
|
+
export declare const BookEntryDisplay: import("element-vir").DeclarativeElementDefinition<"book-entry-display", {
|
|
7
|
+
controls: ControlsWrapper;
|
|
8
|
+
currentNodes: ReadonlyArray<BookTreeNode>;
|
|
9
|
+
currentRoute: Readonly<BookFullRoute>;
|
|
10
|
+
debug: boolean;
|
|
11
|
+
originalTree: Readonly<BookTreeNode<BookEntryType.Root>>;
|
|
12
|
+
router: BookRouter | undefined;
|
|
13
|
+
showLoading: boolean;
|
|
14
|
+
}, {
|
|
15
|
+
lastElement: undefined | Element;
|
|
16
|
+
}, {
|
|
17
|
+
loadingRender: import("element-vir").DefineEvent<boolean>;
|
|
18
|
+
}, "book-entry-display-", "book-entry-display-", readonly [], readonly []>;
|
|
@@ -1,31 +1,18 @@
|
|
|
1
|
-
import {css, defineElementEvent, html, onDomCreated, renderIf} from 'element-vir';
|
|
2
|
-
import {LoaderAnimated24Icon, ViraIcon, viraAnimationDurations} from 'vira';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import {ElementBookSlotName} from '../../element-book-app/element-book-app-slots.js';
|
|
10
|
-
import {BookBreadcrumbsBar} from '../book-breadcrumbs-bar.element.js';
|
|
11
|
-
import {createNodeTemplates} from './create-node-templates.js';
|
|
12
|
-
|
|
13
|
-
export const BookEntryDisplay = defineBookElement<{
|
|
14
|
-
controls: ControlsWrapper;
|
|
15
|
-
currentNodes: ReadonlyArray<BookTreeNode>;
|
|
16
|
-
currentRoute: Readonly<BookFullRoute>;
|
|
17
|
-
debug: boolean;
|
|
18
|
-
originalTree: Readonly<BookTreeNode<BookEntryType.Root>>;
|
|
19
|
-
router: BookRouter | undefined;
|
|
20
|
-
showLoading: boolean;
|
|
21
|
-
}>()({
|
|
1
|
+
import { css, defineElementEvent, html, onDomCreated, renderIf } from 'element-vir';
|
|
2
|
+
import { LoaderAnimated24Icon, ViraIcon, viraAnimationDurations } from 'vira';
|
|
3
|
+
import { extractSearchQuery } from '../../../../routing/book-routing.js';
|
|
4
|
+
import { defineBookElement } from '../../define-book-element.js';
|
|
5
|
+
import { ElementBookSlotName } from '../../element-book-app/element-book-app-slots.js';
|
|
6
|
+
import { BookBreadcrumbsBar } from '../book-breadcrumbs-bar.element.js';
|
|
7
|
+
import { createNodeTemplates } from './create-node-templates.js';
|
|
8
|
+
export const BookEntryDisplay = defineBookElement()({
|
|
22
9
|
tagName: 'book-entry-display',
|
|
23
10
|
state() {
|
|
24
11
|
return {
|
|
25
|
-
lastElement: undefined
|
|
12
|
+
lastElement: undefined,
|
|
26
13
|
};
|
|
27
14
|
},
|
|
28
|
-
styles: css`
|
|
15
|
+
styles: css `
|
|
29
16
|
:host {
|
|
30
17
|
display: flex;
|
|
31
18
|
flex-direction: column;
|
|
@@ -86,11 +73,10 @@ export const BookEntryDisplay = defineBookElement<{
|
|
|
86
73
|
}
|
|
87
74
|
`,
|
|
88
75
|
events: {
|
|
89
|
-
loadingRender: defineElementEvent
|
|
76
|
+
loadingRender: defineElementEvent(),
|
|
90
77
|
},
|
|
91
|
-
render: ({inputs, dispatch, events, state, updateState}) => {
|
|
78
|
+
render: ({ inputs, dispatch, events, state, updateState }) => {
|
|
92
79
|
const currentSearch = extractSearchQuery(inputs.currentRoute.paths);
|
|
93
|
-
|
|
94
80
|
const entryTemplates = createNodeTemplates({
|
|
95
81
|
currentNodes: inputs.currentNodes,
|
|
96
82
|
isTopLevel: true,
|
|
@@ -99,45 +85,37 @@ export const BookEntryDisplay = defineBookElement<{
|
|
|
99
85
|
controls: inputs.controls,
|
|
100
86
|
originalTree: inputs.originalTree,
|
|
101
87
|
});
|
|
102
|
-
|
|
103
|
-
return html`
|
|
88
|
+
return html `
|
|
104
89
|
<${BookBreadcrumbsBar.assign({
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
90
|
+
currentSearch,
|
|
91
|
+
currentRoute: inputs.currentRoute,
|
|
92
|
+
router: inputs.router,
|
|
93
|
+
})}></${BookBreadcrumbsBar}>
|
|
109
94
|
|
|
110
|
-
${renderIf(
|
|
111
|
-
inputs.showLoading,
|
|
112
|
-
html`
|
|
95
|
+
${renderIf(inputs.showLoading, html `
|
|
113
96
|
<div
|
|
114
97
|
${onDomCreated(() => {
|
|
115
|
-
|
|
116
|
-
|
|
98
|
+
dispatch(new events.loadingRender(true));
|
|
99
|
+
})}
|
|
117
100
|
class="loading"
|
|
118
101
|
>
|
|
119
|
-
<${ViraIcon.assign({icon: LoaderAnimated24Icon})}></${ViraIcon}>
|
|
102
|
+
<${ViraIcon.assign({ icon: LoaderAnimated24Icon })}></${ViraIcon}>
|
|
120
103
|
</div>
|
|
121
|
-
${renderIf(
|
|
122
|
-
!!state.lastElement,
|
|
123
|
-
html`
|
|
104
|
+
${renderIf(!!state.lastElement, html `
|
|
124
105
|
${state.lastElement}
|
|
125
106
|
<slot name=${ElementBookSlotName.Footer}></slot>
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
`,
|
|
129
|
-
html`
|
|
107
|
+
`)}
|
|
108
|
+
`, html `
|
|
130
109
|
<div
|
|
131
110
|
${onDomCreated((element) => {
|
|
132
|
-
|
|
133
|
-
|
|
111
|
+
updateState({ lastElement: element });
|
|
112
|
+
})}
|
|
134
113
|
class="all-book-entries-wrapper"
|
|
135
114
|
>
|
|
136
115
|
${entryTemplates}
|
|
137
116
|
</div>
|
|
138
117
|
<slot name=${ElementBookSlotName.Footer}></slot>
|
|
139
|
-
|
|
140
|
-
)}
|
|
118
|
+
`)}
|
|
141
119
|
`;
|
|
142
120
|
},
|
|
143
121
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type HtmlInterpolation } from 'element-vir';
|
|
2
|
+
import { BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
3
|
+
import { type ControlsWrapper } from '../../../../data/book-entry/book-page/controls-wrapper.js';
|
|
4
|
+
import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
|
|
5
|
+
import { type BookRouter } from '../../../../routing/book-router.js';
|
|
6
|
+
export declare function createNodeTemplates({ currentNodes, isTopLevel, router, isSearching, controls, originalTree, }: {
|
|
7
|
+
currentNodes: ReadonlyArray<BookTreeNode>;
|
|
8
|
+
isTopLevel: boolean;
|
|
9
|
+
router: BookRouter | undefined;
|
|
10
|
+
isSearching: boolean;
|
|
11
|
+
controls: ControlsWrapper;
|
|
12
|
+
originalTree: Readonly<BookTreeNode<BookEntryType.Root>>;
|
|
13
|
+
}): HtmlInterpolation[];
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { check } from '@augment-vir/assert';
|
|
2
|
+
import { mapObjectValues } from '@augment-vir/common';
|
|
3
|
+
import { classMap, html, nothing, repeat, } from 'element-vir';
|
|
4
|
+
import { BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
|
|
5
|
+
import { traverseControls, } from '../../../../data/book-entry/book-page/controls-wrapper.js';
|
|
6
|
+
import { isBookTreeNode, traverseToImmediateParent } from '../../../../data/book-tree/book-tree.js';
|
|
7
|
+
import { BookError } from '../../common/book-error.element.js';
|
|
8
|
+
import { BookPageControls } from '../book-page/book-page-controls.element.js';
|
|
9
|
+
import { BookPageWrapper } from '../book-page/book-page-wrapper.element.js';
|
|
10
|
+
import { BookElementExampleWrapper } from '../element-example/book-element-example-wrapper.element.js';
|
|
11
|
+
function getFlattenedControlsFromHiddenParents(currentNodes, currentControls, currentNode, originalTree) {
|
|
12
|
+
const parent = traverseToImmediateParent(currentNode, originalTree);
|
|
13
|
+
const allControls = [];
|
|
14
|
+
if (parent) {
|
|
15
|
+
const parentControls = getFlattenedControlsFromHiddenParents(currentNodes, currentControls, parent, originalTree);
|
|
16
|
+
if (parentControls) {
|
|
17
|
+
allControls.push(parentControls);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (isBookTreeNode(currentNode, BookEntryType.Page) && !currentNodes.includes(currentNode)) {
|
|
21
|
+
const currentEntryControls = traverseControls(currentControls, currentNode.fullUrlBreadcrumbs);
|
|
22
|
+
allControls.push({
|
|
23
|
+
config: currentNode.entry.controls,
|
|
24
|
+
current: currentEntryControls,
|
|
25
|
+
breadcrumbs: mapObjectValues(currentEntryControls, () => {
|
|
26
|
+
return currentNode.fullUrlBreadcrumbs;
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return allControls.reduce((accum, currentControls) => {
|
|
31
|
+
return {
|
|
32
|
+
config: {
|
|
33
|
+
...accum.config,
|
|
34
|
+
...currentControls.config,
|
|
35
|
+
},
|
|
36
|
+
current: {
|
|
37
|
+
...accum.current,
|
|
38
|
+
...currentControls.current,
|
|
39
|
+
},
|
|
40
|
+
breadcrumbs: {
|
|
41
|
+
...accum.breadcrumbs,
|
|
42
|
+
...currentControls.breadcrumbs,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}, { config: {}, current: {}, breadcrumbs: {} });
|
|
46
|
+
}
|
|
47
|
+
export function createNodeTemplates({ currentNodes, isTopLevel, router, isSearching, controls, originalTree, }) {
|
|
48
|
+
if (!currentNodes.length && isSearching) {
|
|
49
|
+
return [
|
|
50
|
+
html `
|
|
51
|
+
No results
|
|
52
|
+
`,
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
const hiddenAncestorControls = check.isLengthAtLeast(currentNodes, 1)
|
|
56
|
+
? getFlattenedControlsFromHiddenParents(currentNodes, controls, currentNodes[0], originalTree)
|
|
57
|
+
: undefined;
|
|
58
|
+
const hiddenAncestorControlsTemplate = hiddenAncestorControls &&
|
|
59
|
+
Object.values(hiddenAncestorControls.config).length &&
|
|
60
|
+
check.isLengthAtLeast(currentNodes, 1)
|
|
61
|
+
? html `
|
|
62
|
+
<${BookPageControls.assign({
|
|
63
|
+
config: hiddenAncestorControls.config,
|
|
64
|
+
currentValues: hiddenAncestorControls.current,
|
|
65
|
+
fullUrlBreadcrumbs: hiddenAncestorControls.breadcrumbs,
|
|
66
|
+
})}></${BookPageControls}>
|
|
67
|
+
`
|
|
68
|
+
: nothing;
|
|
69
|
+
const templates = repeat(currentNodes, (node) => node.fullUrlBreadcrumbs.join('>'), (currentNode) => {
|
|
70
|
+
if (isBookTreeNode(currentNode, BookEntryType.Page)) {
|
|
71
|
+
return html `
|
|
72
|
+
<${BookPageWrapper.assign({
|
|
73
|
+
isTopLevel,
|
|
74
|
+
pageNode: currentNode,
|
|
75
|
+
controls,
|
|
76
|
+
router,
|
|
77
|
+
})}
|
|
78
|
+
class="block-entry"
|
|
79
|
+
></${BookPageWrapper}>
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
else if (isBookTreeNode(currentNode, BookEntryType.ElementExample)) {
|
|
83
|
+
const controlsForElementExample = traverseControls(controls, currentNode.fullUrlBreadcrumbs.slice(0, -1));
|
|
84
|
+
return html `
|
|
85
|
+
<${BookElementExampleWrapper.assign({
|
|
86
|
+
elementExampleNode: currentNode,
|
|
87
|
+
currentPageControls: controlsForElementExample,
|
|
88
|
+
router,
|
|
89
|
+
})}
|
|
90
|
+
class="inline-entry ${classMap({
|
|
91
|
+
'block-entry': currentNode.entry.isVertical,
|
|
92
|
+
})}"
|
|
93
|
+
></${BookElementExampleWrapper}>
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
else if (isBookTreeNode(currentNode, BookEntryType.Root)) {
|
|
97
|
+
return nothing;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return html `
|
|
101
|
+
<${BookError.assign({
|
|
102
|
+
message: `Unknown entry type for rendering: '${currentNode.entry.entryType}'`,
|
|
103
|
+
})}
|
|
104
|
+
class="block-entry"
|
|
105
|
+
></${BookError}>
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return [
|
|
110
|
+
hiddenAncestorControlsTemplate,
|
|
111
|
+
templates,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ChangeRouteEvent: import("element-vir").DefinedTypedEvent<"element-book-change-route", Partial<Readonly<Required<import("spa-router-vir").SpaRoute<import("../../routing/book-routing.js").ValidBookPaths, undefined, undefined>>>>>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code adapted from
|
|
3
|
+
* https://github.com/bevacqua/fuzzysearch/blob/9873ea0546a47f5d96e037ff02b78b871c809d62/index.js
|
|
4
|
+
*
|
|
5
|
+
* That code has the following license:
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The MIT License (MIT)
|
|
9
|
+
*
|
|
10
|
+
* Copyright © 2015 Nicolas Bevacqua
|
|
11
|
+
*
|
|
12
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
13
|
+
* associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
14
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
|
15
|
+
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
* furnished to do so, subject to the following conditions:
|
|
17
|
+
*
|
|
18
|
+
* The above copyright notice and this permission notice shall be included in all copies or
|
|
19
|
+
* substantial portions of the Software.
|
|
20
|
+
*
|
|
21
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
|
22
|
+
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
23
|
+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
24
|
+
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fuzzySearch({
|
|
28
|
+
/** What you want to search for; the user search input. */
|
|
29
|
+
searchQuery,
|
|
30
|
+
/** What we're searching in. See if the searchQuery is found within this. */
|
|
31
|
+
searchIn, }: {
|
|
32
|
+
searchQuery: string;
|
|
33
|
+
searchIn: string;
|
|
34
|
+
}): boolean;
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*
|
|
6
6
|
* That code has the following license:
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
8
|
/**
|
|
10
9
|
* The MIT License (MIT)
|
|
11
10
|
*
|
|
@@ -27,16 +26,11 @@
|
|
|
27
26
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
28
27
|
*/
|
|
29
28
|
// cspell:enable
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
searchIn,
|
|
36
|
-
}: {
|
|
37
|
-
searchQuery: string;
|
|
38
|
-
searchIn: string;
|
|
39
|
-
}): boolean {
|
|
29
|
+
export function fuzzySearch({
|
|
30
|
+
/** What you want to search for; the user search input. */
|
|
31
|
+
searchQuery,
|
|
32
|
+
/** What we're searching in. See if the searchQuery is found within this. */
|
|
33
|
+
searchIn, }) {
|
|
40
34
|
const searchInLength = searchIn.length;
|
|
41
35
|
const searchQueryLength = searchQuery.length;
|
|
42
36
|
if (searchQueryLength > searchInLength) {
|
|
@@ -45,10 +39,8 @@ export function fuzzySearch({
|
|
|
45
39
|
if (searchQueryLength === searchInLength) {
|
|
46
40
|
return searchQuery === searchIn;
|
|
47
41
|
}
|
|
48
|
-
|
|
49
42
|
const lowercaseSearchIn = searchIn.toLowerCase();
|
|
50
43
|
const lowercaseSearchQuery = searchQuery.toLowerCase();
|
|
51
|
-
|
|
52
44
|
// eslint-disable-next-line sonarjs/no-labels
|
|
53
45
|
outer: for (let i = 0, j = 0; i < searchQueryLength; i++) {
|
|
54
46
|
const charCode = lowercaseSearchQuery.codePointAt(i);
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @category Internal
|
|
5
5
|
*/
|
|
6
|
-
export type NestedType<SubType> = {
|
|
7
|
-
|
|
6
|
+
export type NestedType<SubType> = {
|
|
7
|
+
[prop: PropertyKey]: SubType | NestedType<SubType>;
|
|
8
|
+
};
|
|
8
9
|
/**
|
|
9
10
|
* The TypeScript compiler is hard-coded to prevent recursion deeper than 50, so this helps us make
|
|
10
11
|
* sure we stay below that limit.
|
|
@@ -42,5 +43,5 @@ export type InfiniteRecursionLimiter = [
|
|
|
42
43
|
3,
|
|
43
44
|
2,
|
|
44
45
|
1,
|
|
45
|
-
0
|
|
46
|
+
0
|
|
46
47
|
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|