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.
Files changed (113) hide show
  1. package/{src/data/book-entry/base-book-entry.ts → dist/data/book-entry/base-book-entry.d.ts} +2 -3
  2. package/dist/data/book-entry/base-book-entry.js +1 -0
  3. package/{src/data/book-entry/book-entry-type.ts → dist/data/book-entry/book-entry-type.d.ts} +5 -9
  4. package/dist/data/book-entry/book-entry-type.js +14 -0
  5. package/dist/data/book-entry/book-entry.d.ts +17 -0
  6. package/dist/data/book-entry/book-entry.js +9 -0
  7. package/dist/data/book-entry/book-page/book-page-controls.d.ts +92 -0
  8. package/dist/data/book-entry/book-page/book-page-controls.js +70 -0
  9. package/dist/data/book-entry/book-page/book-page.d.ts +63 -0
  10. package/dist/data/book-entry/book-page/book-page.js +2 -0
  11. package/dist/data/book-entry/book-page/controls-wrapper.d.ts +32 -0
  12. package/dist/data/book-entry/book-page/controls-wrapper.js +65 -0
  13. package/dist/data/book-entry/book-page/define-book-page.d.ts +58 -0
  14. package/dist/data/book-entry/book-page/define-book-page.js +52 -0
  15. package/dist/data/book-entry/book-root.d.ts +12 -0
  16. package/dist/data/book-entry/book-root.js +1 -0
  17. package/dist/data/book-entry/url-breadcrumbs.d.ts +23 -0
  18. package/{src/data/book-entry/url-breadcrumbs.ts → dist/data/book-entry/url-breadcrumbs.js} +8 -17
  19. package/dist/data/book-entry/verify-book-entry.d.ts +3 -0
  20. package/{src/data/book-entry/verify-book-entry.ts → dist/data/book-entry/verify-book-entry.js} +3 -9
  21. package/{src/data/book-tree/book-tree-node.ts → dist/data/book-tree/book-tree-node.d.ts} +9 -15
  22. package/dist/data/book-tree/book-tree-node.js +6 -0
  23. package/dist/data/book-tree/book-tree.d.ts +13 -0
  24. package/dist/data/book-tree/book-tree.js +136 -0
  25. package/dist/data/book-tree/search-nodes.d.ts +5 -0
  26. package/dist/data/book-tree/search-nodes.js +74 -0
  27. package/dist/data/book-tree/tree-cache.d.ts +4 -0
  28. package/dist/data/book-tree/tree-cache.js +8 -0
  29. package/dist/data/unset.d.ts +1 -0
  30. package/dist/index.js +18 -0
  31. package/dist/routing/book-router.d.ts +4 -0
  32. package/{src/routing/book-router.ts → dist/routing/book-router.js} +12 -16
  33. package/{src/routing/book-routing.ts → dist/routing/book-routing.d.ts} +6 -21
  34. package/dist/routing/book-routing.js +33 -0
  35. package/dist/ui/color-theme/color-theme.d.ts +57 -0
  36. package/dist/ui/color-theme/color-theme.js +94 -0
  37. package/dist/ui/color-theme/create-color-theme.d.ts +32 -0
  38. package/dist/ui/color-theme/create-color-theme.js +93 -0
  39. package/dist/ui/elements/book-breadcrumbs.element.d.ts +6 -0
  40. package/dist/ui/elements/book-breadcrumbs.element.js +50 -0
  41. package/dist/ui/elements/book-nav/book-nav-filter.d.ts +2 -0
  42. package/dist/ui/elements/book-nav/book-nav-filter.js +15 -0
  43. package/dist/ui/elements/book-nav/book-nav.element.d.ts +8 -0
  44. package/{src/ui/elements/book-nav/book-nav.element.ts → dist/ui/elements/book-nav/book-nav.element.js} +44 -65
  45. package/dist/ui/elements/common/book-error.element.d.ts +3 -0
  46. package/{src/ui/elements/common/book-error.element.ts → dist/ui/elements/common/book-error.element.js} +8 -12
  47. package/dist/ui/elements/common/book-route-link.element.d.ts +6 -0
  48. package/dist/ui/elements/common/book-route-link.element.js +40 -0
  49. package/dist/ui/elements/define-book-element.d.ts +2 -0
  50. package/dist/ui/elements/define-book-element.js +2 -0
  51. 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
  52. package/dist/ui/elements/element-book-app/element-book-app-slots.js +18 -0
  53. package/dist/ui/elements/element-book-app/element-book-app.element.d.ts +35 -0
  54. package/dist/ui/elements/element-book-app/element-book-app.element.js +301 -0
  55. package/dist/ui/elements/element-book-app/element-book-config.d.ts +48 -0
  56. package/dist/ui/elements/element-book-app/element-book-config.js +1 -0
  57. package/dist/ui/elements/element-book-app/get-current-nodes.d.ts +3 -0
  58. package/dist/ui/elements/element-book-app/get-current-nodes.js +18 -0
  59. package/dist/ui/elements/element-book-app/global-values.js +1 -0
  60. package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.d.ts +7 -0
  61. package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.js +60 -0
  62. package/dist/ui/elements/entry-display/book-entry-description.element.d.ts +4 -0
  63. package/{src/ui/elements/entry-display/book-entry-description.element.ts → dist/ui/elements/entry-display/book-entry-description.element.js} +7 -10
  64. package/dist/ui/elements/entry-display/book-page/book-page-controls.element.d.ts +17 -0
  65. package/dist/ui/elements/entry-display/book-page/book-page-controls.element.js +172 -0
  66. package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.d.ts +10 -0
  67. package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.js +86 -0
  68. package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.d.ts +7 -0
  69. package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.js +34 -0
  70. package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.d.ts +7 -0
  71. package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.js +61 -0
  72. package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.d.ts +9 -0
  73. package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.js +50 -0
  74. package/dist/ui/elements/entry-display/entry-display/book-entry-display.element.d.ts +18 -0
  75. 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
  76. package/dist/ui/elements/entry-display/entry-display/create-node-templates.d.ts +13 -0
  77. package/dist/ui/elements/entry-display/entry-display/create-node-templates.js +113 -0
  78. package/dist/ui/events/change-route.event.d.ts +1 -0
  79. package/dist/ui/events/change-route.event.js +2 -0
  80. package/dist/util/fuzzy-search.d.ts +34 -0
  81. package/{src/util/fuzzy-search.ts → dist/util/fuzzy-search.js} +5 -13
  82. package/{src/util/type.ts → dist/util/type.d.ts} +4 -3
  83. package/dist/util/type.js +1 -0
  84. package/package.json +5 -5
  85. package/src/data/book-entry/book-entry.ts +0 -23
  86. package/src/data/book-entry/book-page/book-page-controls.ts +0 -159
  87. package/src/data/book-entry/book-page/book-page.ts +0 -110
  88. package/src/data/book-entry/book-page/controls-wrapper.ts +0 -119
  89. package/src/data/book-entry/book-page/define-book-page.ts +0 -171
  90. package/src/data/book-entry/book-root.ts +0 -16
  91. package/src/data/book-tree/book-tree.ts +0 -225
  92. package/src/data/book-tree/search-nodes.ts +0 -104
  93. package/src/data/book-tree/tree-cache.ts +0 -13
  94. package/src/ui/color-theme/color-theme.ts +0 -152
  95. package/src/ui/color-theme/create-color-theme.ts +0 -139
  96. package/src/ui/elements/book-breadcrumbs.element.ts +0 -60
  97. package/src/ui/elements/book-nav/book-nav-filter.ts +0 -30
  98. package/src/ui/elements/common/book-route-link.element.ts +0 -48
  99. package/src/ui/elements/define-book-element.ts +0 -5
  100. package/src/ui/elements/element-book-app/element-book-app.element.ts +0 -380
  101. package/src/ui/elements/element-book-app/element-book-config.ts +0 -52
  102. package/src/ui/elements/element-book-app/get-current-nodes.ts +0 -35
  103. package/src/ui/elements/entry-display/book-breadcrumbs-bar.element.ts +0 -78
  104. package/src/ui/elements/entry-display/book-page/book-page-controls.element.ts +0 -219
  105. package/src/ui/elements/entry-display/book-page/book-page-wrapper.element.ts +0 -105
  106. package/src/ui/elements/entry-display/element-example/book-element-example-controls.element.ts +0 -42
  107. package/src/ui/elements/entry-display/element-example/book-element-example-viewer.element.ts +0 -79
  108. package/src/ui/elements/entry-display/element-example/book-element-example-wrapper.element.ts +0 -61
  109. package/src/ui/elements/entry-display/entry-display/create-node-templates.ts +0 -183
  110. package/src/ui/events/change-route.event.ts +0 -6
  111. /package/{src/data/unset.ts → dist/data/unset.js} +0 -0
  112. /package/{src/index.ts → dist/index.d.ts} +0 -0
  113. /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
+ });
@@ -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 []>;
@@ -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
+ });
@@ -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
+ });
@@ -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 []>;
@@ -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 {type BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
4
- import {type ControlsWrapper} from '../../../../data/book-entry/book-page/controls-wrapper.js';
5
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
6
- import {type BookRouter} from '../../../../routing/book-router.js';
7
- import {type BookFullRoute, extractSearchQuery} from '../../../../routing/book-routing.js';
8
- import {defineBookElement} from '../../define-book-element.js';
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 as undefined | Element,
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<boolean>(),
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
- currentSearch,
106
- currentRoute: inputs.currentRoute,
107
- router: inputs.router,
108
- })}></${BookBreadcrumbsBar}>
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
- dispatch(new events.loadingRender(true));
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
- updateState({lastElement: element});
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,2 @@
1
+ import { defineTypedEvent } from 'element-vir';
2
+ export const ChangeRouteEvent = defineTypedEvent()('element-book-change-route');
@@ -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
- export function fuzzySearch({
32
- /** What you want to search for; the user search input. */
33
- searchQuery,
34
- /** What we're searching in. See if the searchQuery is found within this. */
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> = {[prop: PropertyKey]: SubType | 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 {};