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.
Files changed (121) hide show
  1. package/README.md +5 -5
  2. package/dist/data/book-entry/base-book-entry.d.ts +20 -0
  3. package/dist/data/book-entry/book-element-example/book-element-example.d.ts +32 -0
  4. package/dist/data/book-entry/book-entry-type.d.ts +9 -0
  5. package/dist/data/book-entry/book-entry-type.js +9 -0
  6. package/dist/data/book-entry/book-entry.d.ts +8 -0
  7. package/dist/data/book-entry/book-entry.js +4 -0
  8. package/dist/data/book-entry/book-page/book-page-controls.d.ts +41 -0
  9. package/dist/data/book-entry/book-page/book-page-controls.js +49 -0
  10. package/dist/data/book-entry/book-page/book-page.d.ts +12 -0
  11. package/dist/data/book-entry/book-page/book-page.js +1 -0
  12. package/dist/data/book-entry/book-page/current-controls.d.ts +12 -0
  13. package/dist/data/book-entry/book-page/current-controls.js +62 -0
  14. package/dist/data/book-entry/book-page/define-book-page.d.ts +18 -0
  15. package/dist/data/book-entry/book-page/define-book-page.js +34 -0
  16. package/dist/data/book-entry/book-root.d.ts +7 -0
  17. package/dist/data/book-entry/book-root.js +1 -0
  18. package/dist/data/book-entry/url-breadcrumbs.d.ts +7 -0
  19. package/dist/data/book-entry/url-breadcrumbs.js +24 -0
  20. package/dist/data/book-entry/verify-book-entry.d.ts +6 -0
  21. package/dist/data/book-entry/verify-book-entry.js +18 -0
  22. package/dist/data/book-tree/book-tree-node.d.ts +27 -0
  23. package/dist/data/book-tree/book-tree-node.js +1 -0
  24. package/dist/data/book-tree/book-tree.d.ts +16 -0
  25. package/dist/data/book-tree/book-tree.js +148 -0
  26. package/dist/data/book-tree/search-nodes.d.ts +5 -0
  27. package/dist/data/book-tree/search-nodes.js +56 -0
  28. package/dist/data/book-tree/tree-cache.d.ts +4 -0
  29. package/dist/data/book-tree/tree-cache.js +8 -0
  30. package/dist/index.d.ts +5 -6
  31. package/dist/index.js +5 -6
  32. package/dist/routing/book-routing.d.ts +10 -0
  33. package/dist/routing/book-routing.js +18 -0
  34. package/dist/routing/create-book-router.d.ts +2 -0
  35. package/dist/routing/{create-element-book-router.js → create-book-router.js} +8 -8
  36. package/dist/ui/elements/book-breadcrumbs.element.d.ts +5 -0
  37. package/dist/ui/elements/{element-book-breadcrumbs.element.js → book-breadcrumbs.element.js} +9 -9
  38. package/dist/ui/elements/book-nav.element.d.ts +7 -0
  39. package/dist/ui/elements/book-nav.element.js +114 -0
  40. package/dist/ui/elements/common/book-error.element.d.ts +3 -0
  41. package/dist/ui/elements/common/book-error.element.js +27 -0
  42. package/dist/ui/elements/common/book-route-link.element.d.ts +5 -0
  43. package/dist/ui/elements/common/{element-book-route-link.element.js → book-route-link.element.js} +5 -5
  44. package/dist/ui/elements/define-book-element.d.ts +2 -2
  45. package/dist/ui/elements/define-book-element.js +1 -1
  46. package/dist/ui/elements/element-book-app/element-book-app-slots.d.ts +2 -2
  47. package/dist/ui/elements/element-book-app/element-book-app-slots.js +2 -2
  48. package/dist/ui/elements/element-book-app/element-book-app.element.d.ts +7 -2
  49. package/dist/ui/elements/element-book-app/element-book-app.element.js +76 -29
  50. package/dist/ui/elements/element-book-app/element-book-config.d.ts +4 -2
  51. package/dist/ui/elements/element-book-app/get-current-nodes.d.ts +3 -0
  52. package/dist/ui/elements/element-book-app/get-current-nodes.js +23 -0
  53. package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.d.ts +6 -0
  54. package/dist/ui/elements/entry-display/book-breadcrumbs-bar.element.js +65 -0
  55. package/dist/ui/elements/entry-display/book-entry-description.element.d.ts +3 -0
  56. package/dist/ui/elements/entry-display/book-entry-description.element.js +34 -0
  57. package/dist/ui/elements/entry-display/book-entry-display.element.d.ts +12 -0
  58. package/dist/ui/elements/entry-display/book-entry-display.element.js +173 -0
  59. package/dist/ui/elements/entry-display/book-page/book-page-controls.element.d.ts +17 -0
  60. package/dist/ui/elements/entry-display/book-page/book-page-controls.element.js +147 -0
  61. package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.d.ts +10 -0
  62. package/dist/ui/elements/entry-display/book-page/book-page-wrapper.element.js +92 -0
  63. package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.d.ts +7 -0
  64. package/dist/ui/elements/entry-display/element-example/book-element-example-controls.element.js +36 -0
  65. package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.d.ts +9 -0
  66. package/dist/ui/elements/entry-display/element-example/book-element-example-viewer.element.js +57 -0
  67. package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.d.ts +9 -0
  68. package/dist/ui/elements/entry-display/element-example/book-element-example-wrapper.element.js +49 -0
  69. package/dist/ui/events/change-route.event.d.ts +1 -1
  70. package/dist/util/type.d.ts +40 -0
  71. package/dist/util/type.js +1 -0
  72. package/package.json +15 -11
  73. package/dist/data/element-book-entry/element-book-chapter/element-book-chapter.d.ts +0 -22
  74. package/dist/data/element-book-entry/element-book-chapter/element-book-chapter.js +0 -16
  75. package/dist/data/element-book-entry/element-book-entry-type.d.ts +0 -8
  76. package/dist/data/element-book-entry/element-book-entry-type.js +0 -9
  77. package/dist/data/element-book-entry/element-book-entry.d.ts +0 -14
  78. package/dist/data/element-book-entry/element-book-entry.js +0 -22
  79. package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control-type.d.ts +0 -13
  80. package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control-type.js +0 -7
  81. package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control.d.ts +0 -13
  82. package/dist/data/element-book-entry/element-book-page/element-book-page-controls/element-book-page-control.js +0 -4
  83. package/dist/data/element-book-entry/element-book-page/element-book-page-example.d.ts +0 -22
  84. package/dist/data/element-book-entry/element-book-page/element-book-page.d.ts +0 -23
  85. package/dist/data/element-book-entry/element-book-page/element-book-page.js +0 -41
  86. package/dist/data/element-book-entry/entry-tree/entry-tree-search.d.ts +0 -8
  87. package/dist/data/element-book-entry/entry-tree/entry-tree-search.js +0 -66
  88. package/dist/data/element-book-entry/entry-tree/entry-tree.d.ts +0 -18
  89. package/dist/data/element-book-entry/entry-tree/entry-tree.js +0 -87
  90. package/dist/data/element-book-entry/entry-tree/tree-cache.d.ts +0 -5
  91. package/dist/data/element-book-entry/entry-tree/tree-cache.js +0 -8
  92. package/dist/data/element-book-entry/entry-tree/walk-entry-tree.d.ts +0 -8
  93. package/dist/data/element-book-entry/entry-tree/walk-entry-tree.js +0 -85
  94. package/dist/routing/create-element-book-router.d.ts +0 -2
  95. package/dist/routing/element-book-routing.d.ts +0 -10
  96. package/dist/routing/element-book-routing.js +0 -18
  97. package/dist/ui/elements/common/element-book-route-link.element.d.ts +0 -5
  98. package/dist/ui/elements/element-book-app/get-current-entry.d.ts +0 -4
  99. package/dist/ui/elements/element-book-app/get-current-entry.js +0 -17
  100. package/dist/ui/elements/element-book-breadcrumbs.element.d.ts +0 -5
  101. package/dist/ui/elements/element-book-nav.element.d.ts +0 -7
  102. package/dist/ui/elements/element-book-nav.element.js +0 -129
  103. package/dist/ui/elements/entry-display/element-book-entry-display.element.d.ts +0 -7
  104. package/dist/ui/elements/entry-display/element-book-entry-display.element.js +0 -280
  105. package/dist/ui/elements/entry-display/element-book-example-controls.element.d.ts +0 -4
  106. package/dist/ui/elements/entry-display/element-book-example-controls.element.js +0 -26
  107. package/dist/ui/elements/entry-display/element-book-example-viewer.element.d.ts +0 -6
  108. package/dist/ui/elements/entry-display/element-book-example-viewer.element.js +0 -43
  109. package/dist/ui/elements/entry-display/element-book-page-controls.element.d.ts +0 -11
  110. package/dist/ui/elements/entry-display/element-book-page-controls.element.js +0 -65
  111. package/dist/ui/elements/entry-display/element-book-page-examples.element.d.ts +0 -7
  112. package/dist/ui/elements/entry-display/element-book-page-examples.element.js +0 -102
  113. package/dist/ui/icons/element-16.icon.d.ts +0 -1
  114. package/dist/ui/icons/element-16.icon.js +0 -18
  115. package/dist/ui/icons/element-24.icon.d.ts +0 -1
  116. package/dist/ui/icons/element-24.icon.js +0 -18
  117. package/dist/utilities/type.d.ts +0 -3
  118. /package/dist/data/{element-book-entry/element-book-page/element-book-page-example.js → book-entry/base-book-entry.js} +0 -0
  119. /package/dist/{utilities/type.js → data/book-entry/book-element-example/book-element-example.js} +0 -0
  120. /package/dist/{utilities/search.d.ts → util/fuzzy-search.d.ts} +0 -0
  121. /package/dist/{utilities/search.js → util/fuzzy-search.js} +0 -0
@@ -1,13 +0,0 @@
1
- import { ElementBookPageControlTypeEnum, ElementBookPageControlValueType } from './element-book-page-control-type';
2
- export type ElementBookPageControl<ControlType extends ElementBookPageControlTypeEnum> = {
3
- controlType: ControlType;
4
- initValue: ElementBookPageControlValueType[ControlType];
5
- controlName: string;
6
- };
7
- export type ElementBookPageControlInit<ControlType extends ElementBookPageControlTypeEnum> = Omit<ElementBookPageControl<ControlType>, 'controlName'>;
8
- /** Define a page control. This doesn't do anything fancy but it helps immensely with type inference. */
9
- export declare function definePageControl<ControlType extends ElementBookPageControlTypeEnum>(controlInit: ElementBookPageControlInit<ControlType>): ElementBookPageControlInit<ControlType>;
10
- export type ElementBookPageControlMap = Record<string, ElementBookPageControlInit<ElementBookPageControlTypeEnum>>;
11
- export type PageControlsToValues<Controls extends ElementBookPageControlMap> = {
12
- [ControlName in keyof Controls]: Controls[ControlName]['initValue'];
13
- };
@@ -1,4 +0,0 @@
1
- /** Define a page control. This doesn't do anything fancy but it helps immensely with type inference. */
2
- export function definePageControl(controlInit) {
3
- return controlInit;
4
- }
@@ -1,22 +0,0 @@
1
- import { RequireNonVoid } from '@augment-vir/common';
2
- import { PropertyInitMapBase, RenderParams, TypedEvent } from 'element-vir';
3
- import { CSSResult } from 'lit';
4
- import { ElementBookPageControlMap, PageControlsToValues } from './element-book-page-controls/element-book-page-control';
5
- export type ElementBookPageExampleRenderParams<ParentControls extends ElementBookPageControlMap, StateInit extends PropertyInitMapBase> = Pick<RenderParams<any, any, StateInit, any, any, any>, 'state' | 'updateState'> & {
6
- controls: PageControlsToValues<ParentControls>;
7
- };
8
- export type ElementBookPageExampleInit<ParentControls extends ElementBookPageControlMap, StateInit extends PropertyInitMapBase, RenderOutput> = {
9
- /** This example's title. Each title in a page must be unique. */
10
- title: string;
11
- /** Initialize the state for this example. */
12
- stateInitStatic?: StateInit;
13
- /** Specify which events this example should intercept (so the user can see them). */
14
- capturedEvents?: ReadonlyArray<string | TypedEvent>;
15
- /**
16
- * Style the example. You can even use the :host selector to style this specific example's
17
- * wrapper element!
18
- */
19
- styles?: CSSResult;
20
- /** Render the example. */
21
- renderCallback: RequireNonVoid<RenderOutput, (renderParams: ElementBookPageExampleRenderParams<ParentControls, StateInit>) => RenderOutput, 'renderCallback is missing a return statement'>;
22
- };
@@ -1,23 +0,0 @@
1
- import { Overwrite } from '@augment-vir/common';
2
- import { PropertyInitMapBase } from 'element-vir';
3
- import { SetOptional } from 'type-fest';
4
- import { BaseElementBookEntry } from '../element-book-chapter/element-book-chapter';
5
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
6
- import { ElementBookPageControlMap } from './element-book-page-controls/element-book-page-control';
7
- import { ElementBookPageExampleInit } from './element-book-page-example';
8
- export type ElementBookPage<Controls extends ElementBookPageControlMap = ElementBookPageControlMap> = Overwrite<BaseElementBookEntry, {
9
- entryType: ElementBookEntryTypeEnum.Page;
10
- }> & {
11
- controls: Controls;
12
- examples: Record<string, ElementBookPageExampleInit<any, any, any> | Error>;
13
- pageBreadcrumbs: ReadonlyArray<string>;
14
- };
15
- export type PageControlsFromPage<Page extends ElementBookPage<any>> = Page extends ElementBookPage<infer Controls> ? Controls : never;
16
- export type DefinePageExamplesCallback<ParentPageControls extends ElementBookPageControlMap> = (params: {
17
- defineExample: DefineExampleCallback<ParentPageControls>;
18
- }) => void;
19
- export type DefineExampleCallback<ParentPageControls extends ElementBookPageControlMap> = <StateInit extends PropertyInitMapBase = {}, RenderOutput = any>(exampleInit: ElementBookPageExampleInit<ParentPageControls, StateInit, RenderOutput>) => void;
20
- export type ElementBookPageInit<Controls extends ElementBookPageControlMap> = Overwrite<SetOptional<Omit<ElementBookPage<Controls>, 'entryType' | 'allExampleTitles' | 'pageBreadcrumbs' | 'examples'>, 'controls'>, {
21
- defineExamplesCallback?: DefinePageExamplesCallback<Controls>;
22
- }>;
23
- export declare function defineElementBookPage<Controls extends ElementBookPageControlMap = {}>(pageSetup: ElementBookPageInit<Controls>): ElementBookPage<Controls>;
@@ -1,41 +0,0 @@
1
- import { combineErrors } from '@augment-vir/common';
2
- import { listBreadcrumbs } from '../element-book-entry';
3
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
4
- function insertElementExample(parentExamples, parentBreadcrumbs, exampleInit) {
5
- const errors = [];
6
- const failureMessage = `Failed to define example '${parentBreadcrumbs
7
- .concat(exampleInit.title)
8
- .join(' > ')}'`;
9
- if (parentExamples.hasOwnProperty(exampleInit.title)) {
10
- errors.push(new Error(`${failureMessage}: title '${exampleInit.title}' is already being used.`));
11
- }
12
- else if (!exampleInit.title) {
13
- errors.push(new Error(`${failureMessage}: example title is missing or empty.`));
14
- }
15
- if (errors.length) {
16
- parentExamples[exampleInit.title] = combineErrors(errors);
17
- }
18
- else {
19
- parentExamples[exampleInit.title] = exampleInit;
20
- }
21
- }
22
- export function defineElementBookPage(pageSetup) {
23
- if (!pageSetup.title) {
24
- throw new Error(`Cannot have an element-book page with an empty title.`);
25
- }
26
- const allExamples = {};
27
- const page = {
28
- entryType: ElementBookEntryTypeEnum.Page,
29
- ...pageSetup,
30
- examples: allExamples,
31
- controls: pageSetup.controls ?? {},
32
- pageBreadcrumbs: [],
33
- };
34
- page.pageBreadcrumbs = listBreadcrumbs(page);
35
- if (pageSetup.defineExamplesCallback) {
36
- pageSetup.defineExamplesCallback({
37
- defineExample: (exampleInit) => insertElementExample(allExamples, page.pageBreadcrumbs, exampleInit),
38
- });
39
- }
40
- return page;
41
- }
@@ -1,8 +0,0 @@
1
- import { ElementBookEntry } from '../element-book-entry';
2
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
3
- import { EntryTreeNode } from './entry-tree';
4
- export declare function createSearchedTree({ entries, startTree, searchQuery, }: {
5
- entries: ReadonlyArray<ElementBookEntry>;
6
- startTree: Readonly<EntryTreeNode<ElementBookEntryTypeEnum.Root>>;
7
- searchQuery: string;
8
- }): EntryTreeNode;
@@ -1,66 +0,0 @@
1
- import { filterObject, isTruthy } from '@augment-vir/common';
2
- import { fuzzySearch } from '../../../utilities/search';
3
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
4
- import { createEmptyEntryTreeRoot } from './entry-tree';
5
- import { addTreeToCache, getTreeFromCache } from './tree-cache';
6
- export function createSearchedTree({ entries, startTree, searchQuery, }) {
7
- const cachedSearchTree = getTreeFromCache(entries, searchQuery);
8
- if (cachedSearchTree) {
9
- return cachedSearchTree;
10
- }
11
- const newTree = createEmptyEntryTreeRoot('Search Results');
12
- recursivelySearchTree(startTree, newTree, searchQuery);
13
- addTreeToCache(entries, searchQuery, newTree);
14
- return newTree;
15
- }
16
- function recursivelySearchTree(oldTreeNode, newNode, searchQuery) {
17
- if (oldTreeNode.entry.entryType !== ElementBookEntryTypeEnum.Root &&
18
- fuzzySearch({
19
- searchIn: oldTreeNode.entry.title,
20
- searchQuery: searchQuery,
21
- })) {
22
- newNode.children = oldTreeNode.children;
23
- return true;
24
- }
25
- if ('examples' in oldTreeNode.entry) {
26
- const filteredExamples = filterObject(oldTreeNode.entry.examples, (exampleName) => fuzzySearch({
27
- searchIn: exampleName,
28
- searchQuery,
29
- }));
30
- const newEntry = {
31
- ...oldTreeNode.entry,
32
- examples: filteredExamples,
33
- };
34
- newNode.entry = newEntry;
35
- if (Object.values(newEntry.examples).length) {
36
- return true;
37
- }
38
- else {
39
- return false;
40
- }
41
- }
42
- const searchedChildEntries = Object.entries(oldTreeNode.children)
43
- .map(([childName, childNode,]) => {
44
- const newChildNode = {
45
- ...childNode,
46
- children: {},
47
- };
48
- if (recursivelySearchTree(childNode, newChildNode, searchQuery)) {
49
- return [
50
- childName,
51
- newChildNode,
52
- ];
53
- }
54
- else {
55
- return undefined;
56
- }
57
- })
58
- .filter(isTruthy);
59
- if (searchedChildEntries.length) {
60
- newNode.children = Object.fromEntries(searchedChildEntries);
61
- return true;
62
- }
63
- else {
64
- return false;
65
- }
66
- }
@@ -1,18 +0,0 @@
1
- import { ElementBookEntry } from '../element-book-entry';
2
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
3
- export declare function doesNodeHaveEntryType<EntryType extends ElementBookEntryTypeEnum>(node: EntryTreeNode<any>, entryType: EntryType): node is EntryTreeNode<EntryType>;
4
- declare const markerKeyName = "isElementBookEntryTreeNode";
5
- export type EntryTreeNode<EntryType extends ElementBookEntryTypeEnum = any> = {
6
- [markerKeyName]: true;
7
- entry: Extract<ElementBookEntry, {
8
- entryType: EntryType;
9
- }>;
10
- /** Breadcrumb is different from entry.title because it's modified to support URLs. */
11
- breadcrumb: string;
12
- children: Record<string, EntryTreeNode>;
13
- };
14
- export declare function isEntryNode<SpecificType extends ElementBookEntryTypeEnum>(input: unknown, entryType: SpecificType): input is EntryTreeNode<SpecificType>;
15
- export declare function createEmptyEntryTreeRoot(title: string | undefined): EntryTreeNode<ElementBookEntryTypeEnum.Root>;
16
- export declare function entriesToTree(entries: ReadonlyArray<ElementBookEntry>, everythingTitle: string | undefined): EntryTreeNode<ElementBookEntryTypeEnum.Root>;
17
- export declare function findEntryByBreadcrumbs(breadcrumbs: ReadonlyArray<string>, tree: Readonly<EntryTreeNode>): Readonly<EntryTreeNode> | undefined;
18
- export {};
@@ -1,87 +0,0 @@
1
- import { isLengthAtLeast, typedHasProperties } from '@augment-vir/common';
2
- import { listBreadcrumbs, titleToBreadcrumb } from '../element-book-entry';
3
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
4
- import { addTreeToCache, getTreeFromCache } from './tree-cache';
5
- export function doesNodeHaveEntryType(node, entryType) {
6
- return node.entry.entryType === entryType;
7
- }
8
- const markerKeyName = 'isElementBookEntryTreeNode';
9
- export function isEntryNode(input, entryType) {
10
- return !!(typedHasProperties(input, [
11
- markerKeyName,
12
- 'entry',
13
- ]) &&
14
- input[markerKeyName] &&
15
- input.entry.entryType === entryType);
16
- }
17
- export function createEmptyEntryTreeRoot(title) {
18
- const rootNode = {
19
- [markerKeyName]: true,
20
- entry: {
21
- entryType: ElementBookEntryTypeEnum.Root,
22
- title: title || 'Everything',
23
- parent: undefined,
24
- },
25
- breadcrumb: '',
26
- children: {},
27
- };
28
- return rootNode;
29
- }
30
- export function entriesToTree(entries, everythingTitle) {
31
- const baseTree = createBaseTree(entries, everythingTitle);
32
- return baseTree;
33
- }
34
- function createBaseTree(entries, everythingTitle) {
35
- const cachedTree = getTreeFromCache(entries, '');
36
- if (cachedTree) {
37
- return cachedTree;
38
- }
39
- const tree = createEmptyEntryTreeRoot(everythingTitle);
40
- entries.forEach((newEntry) => {
41
- /**
42
- * The type for newEntry does not include Error but if errors occur during entry definition
43
- * they will be replaced with errors.
44
- */
45
- if (newEntry instanceof Error) {
46
- throw newEntry;
47
- }
48
- const immediateParent = traverseToImmediateParent(newEntry, tree);
49
- const breadcrumb = titleToBreadcrumb(newEntry.title);
50
- if (breadcrumb in immediateParent.children) {
51
- throw new Error(`Cannot create duplicate entry '${breadcrumb}'${immediateParent.breadcrumb ? ` in parent '${immediateParent.breadcrumb}'.` : ''}`);
52
- }
53
- const newNode = {
54
- [markerKeyName]: true,
55
- children: {},
56
- breadcrumb,
57
- entry: newEntry,
58
- };
59
- immediateParent.children[breadcrumb] = newNode;
60
- });
61
- addTreeToCache(entries, '', tree);
62
- return tree;
63
- }
64
- function traverseToImmediateParent(entry, currentTree) {
65
- const topDownAncestryChain = listBreadcrumbs(entry)
66
- // reverse so we get the top most ancestor first in the list
67
- .reverse();
68
- const immediateParentNode = topDownAncestryChain.reduce((currentAncestor, nextBreadcrumb) => {
69
- const nextAncestor = currentAncestor.children[nextBreadcrumb];
70
- if (!nextAncestor) {
71
- throw new Error(`Failed to find parent ElementBookEntry by name of '${nextBreadcrumb}' in entry '${currentAncestor.entry.title}'`);
72
- }
73
- return nextAncestor;
74
- }, currentTree);
75
- return immediateParentNode;
76
- }
77
- export function findEntryByBreadcrumbs(breadcrumbs, tree) {
78
- if (!isLengthAtLeast(breadcrumbs, 1)) {
79
- return tree;
80
- }
81
- const nextBreadcrumb = breadcrumbs[0];
82
- const nextTree = tree.children[nextBreadcrumb];
83
- if (!nextTree) {
84
- return undefined;
85
- }
86
- return findEntryByBreadcrumbs(breadcrumbs.slice(1), nextTree);
87
- }
@@ -1,5 +0,0 @@
1
- import { ElementBookEntry } from '../element-book-entry';
2
- import { ElementBookEntryTypeEnum } from '../element-book-entry-type';
3
- import { EntryTreeNode } from './entry-tree';
4
- export declare function getTreeFromCache(entries: ReadonlyArray<ElementBookEntry>, searchString: string): EntryTreeNode<ElementBookEntryTypeEnum.Root> | undefined;
5
- export declare function addTreeToCache(entries: ReadonlyArray<ElementBookEntry>, searchString: string, tree: EntryTreeNode<ElementBookEntryTypeEnum.Root>): void;
@@ -1,8 +0,0 @@
1
- import { getOrSetFromMap } from '@augment-vir/common';
2
- const treeCache = new Map();
3
- export function getTreeFromCache(entries, searchString) {
4
- return treeCache.get(entries)?.get(searchString);
5
- }
6
- export function addTreeToCache(entries, searchString, tree) {
7
- getOrSetFromMap(treeCache, entries, () => new Map()).set(searchString, tree);
8
- }
@@ -1,8 +0,0 @@
1
- import { MaybePromise } from '@augment-vir/common';
2
- import { EntryTreeNode } from './entry-tree';
3
- /**
4
- * Walk the whole given tree, calling callback on each node. If callback returns the boolean false
5
- * exactly, then all walking will abort. If callback returns a promise, this function will return a
6
- * promise. Otherwise, it will not return a promise.
7
- */
8
- export declare function walkEntryTree<CallbackReturn extends MaybePromise<void | boolean>>(startNode: Readonly<EntryTreeNode>, callback: (node: Readonly<EntryTreeNode>) => CallbackReturn): CallbackReturn;
@@ -1,85 +0,0 @@
1
- /**
2
- * Walk the whole given tree, calling callback on each node. If callback returns the boolean false
3
- * exactly, then all walking will abort. If callback returns a promise, this function will return a
4
- * promise. Otherwise, it will not return a promise.
5
- */
6
- export function walkEntryTree(startNode, callback) {
7
- // this inner function is for easier typing purposes
8
- function innerWalk() {
9
- const outerResult = callback(startNode);
10
- if (outerResult === false) {
11
- return false;
12
- }
13
- let abort = false;
14
- if (outerResult instanceof Promise) {
15
- return new Promise(async (resolve, reject) => {
16
- try {
17
- const outerResolvedResult = await outerResult;
18
- if (outerResolvedResult === false) {
19
- return;
20
- }
21
- await Promise.all(Object.values(startNode.children).map(async (child) => {
22
- if (abort) {
23
- return false;
24
- }
25
- const result = await walkEntryTree(child, callback);
26
- if (result === false) {
27
- abort = true;
28
- return false;
29
- }
30
- return result;
31
- }));
32
- if (abort) {
33
- return resolve(false);
34
- }
35
- else {
36
- return resolve();
37
- }
38
- }
39
- catch (error) {
40
- return reject(error);
41
- }
42
- });
43
- }
44
- else {
45
- let gotPromise = false;
46
- const childResults = Object.values(startNode.children).map((child) => {
47
- if (abort) {
48
- return false;
49
- }
50
- const result = walkEntryTree(child, callback);
51
- if (result === false) {
52
- abort = true;
53
- }
54
- else if (result instanceof Promise) {
55
- gotPromise = true;
56
- }
57
- return result;
58
- });
59
- if (gotPromise) {
60
- return new Promise(async (resolve, reject) => {
61
- try {
62
- if (abort) {
63
- return resolve(false);
64
- }
65
- const results = await Promise.all(childResults);
66
- if (results.some((result) => result === false)) {
67
- return resolve(false);
68
- }
69
- else {
70
- return resolve();
71
- }
72
- }
73
- catch (error) {
74
- return reject(error);
75
- }
76
- });
77
- }
78
- else if (abort) {
79
- return false;
80
- }
81
- return;
82
- }
83
- }
84
- return innerWalk();
85
- }
@@ -1,2 +0,0 @@
1
- import { ElementBookRouter } from './element-book-routing';
2
- export declare function createElementBookRouter(baseRoute: string | undefined): ElementBookRouter;
@@ -1,10 +0,0 @@
1
- import { FullRoute, SpaRouter } from 'spa-router-vir';
2
- export declare enum ElementBookMainRoute {
3
- Search = "search",
4
- Book = "book"
5
- }
6
- export type ValidElementBookPaths = [ElementBookMainRoute.Search, string] | [ElementBookMainRoute.Book, ...string[]];
7
- export type ElementBookFullRoute = Required<Readonly<FullRoute<ValidElementBookPaths, undefined | Record<string, string>, undefined>>>;
8
- export declare function extractSearchQuery(paths: Readonly<ValidElementBookPaths>): string;
9
- export declare const defaultElementBookFullRoute: Readonly<ElementBookFullRoute>;
10
- export type ElementBookRouter = ElementBookFullRoute extends FullRoute<infer Paths, infer Search, infer Hash> ? Readonly<SpaRouter<Paths, Search, Hash>> : never;
@@ -1,18 +0,0 @@
1
- export var ElementBookMainRoute;
2
- (function (ElementBookMainRoute) {
3
- ElementBookMainRoute["Search"] = "search";
4
- ElementBookMainRoute["Book"] = "book";
5
- })(ElementBookMainRoute || (ElementBookMainRoute = {}));
6
- export function extractSearchQuery(paths) {
7
- if (paths[0] === ElementBookMainRoute.Book) {
8
- return '';
9
- }
10
- else {
11
- return paths[1] ? decodeURIComponent(paths[1]) : '';
12
- }
13
- }
14
- export const defaultElementBookFullRoute = {
15
- hash: undefined,
16
- paths: [ElementBookMainRoute.Book],
17
- search: undefined,
18
- };
@@ -1,5 +0,0 @@
1
- import { ElementBookFullRoute, ElementBookRouter } from '../../../routing/element-book-routing';
2
- export declare const ElementBookRouteLink: import("element-vir").DeclarativeElementDefinition<"element-book-route-link", {
3
- route: Partial<ElementBookFullRoute>;
4
- router: ElementBookRouter | undefined;
5
- }, {}, {}, `element-book-route-link-${string}`, "element-book-route-link-anchor-padding", import("lit-html").HTMLTemplateResult>;
@@ -1,4 +0,0 @@
1
- import { ElementBookEntryTypeEnum } from '../../../data/element-book-entry/element-book-entry-type';
2
- import { EntryTreeNode } from '../../../data/element-book-entry/entry-tree/entry-tree';
3
- import { ElementBookFullRoute, ValidElementBookPaths } from '../../../routing/element-book-routing';
4
- export declare function getCurrentTreeEntry(entriesTree: EntryTreeNode<ElementBookEntryTypeEnum.Root>, paths: Readonly<ValidElementBookPaths>, updateRoutes: (newRoute: Partial<ElementBookFullRoute>) => void): EntryTreeNode;
@@ -1,17 +0,0 @@
1
- import { findEntryByBreadcrumbs, } from '../../../data/element-book-entry/entry-tree/entry-tree';
2
- import { ElementBookMainRoute, defaultElementBookFullRoute, } from '../../../routing/element-book-routing';
3
- export function getCurrentTreeEntry(entriesTree, paths, updateRoutes) {
4
- if (paths[0] === ElementBookMainRoute.Search) {
5
- return entriesTree;
6
- }
7
- const entryTreeNodeByInitialPath = findEntryByBreadcrumbs(paths.slice(1), entriesTree);
8
- if (!entryTreeNodeByInitialPath) {
9
- updateRoutes(defaultElementBookFullRoute);
10
- }
11
- const currentEntryTreeNode = findEntryByBreadcrumbs(paths.slice(1), entriesTree);
12
- if (!currentEntryTreeNode) {
13
- throw new Error(`Tried to self-correct for invalid path ${paths.join('/')}
14
- but failed to do so.`);
15
- }
16
- return currentEntryTreeNode;
17
- }
@@ -1,5 +0,0 @@
1
- import { ElementBookFullRoute, ElementBookRouter } from '../../routing/element-book-routing';
2
- export declare const ElementBookBreadcrumbs: import("element-vir").DeclarativeElementDefinition<"element-book-breadcrumbs", {
3
- currentRoute: Readonly<ElementBookFullRoute>;
4
- router: ElementBookRouter;
5
- }, {}, {}, `element-book-breadcrumbs-${string}`, `element-book-breadcrumbs-${string}`, import("lit-html").HTMLTemplateResult | import("lit-html").HTMLTemplateResult[]>;
@@ -1,7 +0,0 @@
1
- import { EntryTreeNode } from '../../data/element-book-entry/entry-tree/entry-tree';
2
- import { ElementBookRouter } from '../../routing/element-book-routing';
3
- export declare const ElementBookNav: import("element-vir").DeclarativeElementDefinition<"element-book-nav", {
4
- tree: EntryTreeNode;
5
- selectedPath: ReadonlyArray<string>;
6
- router: ElementBookRouter | undefined;
7
- }, {}, {}, `element-book-nav-${string}`, `element-book-nav-${string}`, import("lit-html").HTMLTemplateResult>;
@@ -1,129 +0,0 @@
1
- import { areJsonEqual } from '@augment-vir/common';
2
- import { VirIcon } from '@electrovir/icon-element';
3
- import { assign, classMap, css, html, renderIf } from 'element-vir';
4
- import { ElementBookEntryTypeEnum } from '../../data/element-book-entry/element-book-entry-type';
5
- import { ElementBookMainRoute } from '../../routing/element-book-routing';
6
- import { colorThemeCssVars } from '../color-theme/color-theme';
7
- import { Element16Icon } from '../icons/element-16.icon';
8
- import { ElementBookRouteLink } from './common/element-book-route-link.element';
9
- import { defineElementBookElement } from './define-book-element';
10
- import { ElementBookSlotName } from './element-book-app/element-book-app-slots';
11
- export const ElementBookNav = defineElementBookElement()({
12
- tagName: 'element-book-nav',
13
- styles: css `
14
- :host {
15
- display: flex;
16
- flex-direction: column;
17
- padding: 16px 0;
18
- background-color: ${colorThemeCssVars['element-book-page-background-faint-level-2-color'].value};
19
- }
20
-
21
- .title-row:hover {
22
- background-color: ${colorThemeCssVars['element-book-nav-hover-background-color'].value};
23
- color: ${colorThemeCssVars['element-book-nav-hover-foreground-color'].value};
24
- }
25
-
26
- .title-row:active {
27
- background-color: ${colorThemeCssVars['element-book-nav-active-background-color']
28
- .value};
29
- color: ${colorThemeCssVars['element-book-nav-active-foreground-color'].value};
30
- }
31
-
32
- .title-row {
33
- display: block;
34
- ${ElementBookRouteLink.cssVars['element-book-route-link-anchor-padding']
35
- .name}: 1px 24px 1px calc(calc(16px * var(--indent, 0)) + 8px);
36
- }
37
-
38
- ${ElementBookRouteLink} {
39
- font-size: 20px;
40
- }
41
-
42
- ul {
43
- list-style: none;
44
- padding: 0;
45
- margin: 0;
46
- }
47
-
48
- .selected,
49
- .selected:hover {
50
- background-color: ${colorThemeCssVars['element-book-nav-selected-background-color']
51
- .value};
52
- color: ${colorThemeCssVars['element-book-nav-selected-foreground-color'].value};
53
- pointer-events: none;
54
- }
55
-
56
- .title-text {
57
- white-space: nowrap;
58
- text-overflow: ellipsis;
59
- display: inline-flex;
60
- gap: 8px;
61
- align-items: center;
62
- font-size: 0.75em;
63
- }
64
-
65
- ${VirIcon} {
66
- display: inline-flex;
67
- color: ${colorThemeCssVars['element-book-accent-icon-color'].value};
68
- }
69
- `,
70
- renderCallback({ inputs }) {
71
- const navTree = createNavigationTree({
72
- indent: 0,
73
- entryTreeNode: inputs.tree,
74
- rootPath: [],
75
- router: inputs.router,
76
- selectedPath: inputs.selectedPath.slice(1),
77
- });
78
- return html `
79
- <ul>
80
- ${navTree}
81
- </ul>
82
- `;
83
- },
84
- });
85
- function createNavigationTree({ indent, entryTreeNode, rootPath, selectedPath, router, }) {
86
- const entryPath = entryTreeNode.breadcrumb
87
- ? rootPath.concat(entryTreeNode.breadcrumb)
88
- : rootPath;
89
- const isPage = entryTreeNode.entry.entryType === ElementBookEntryTypeEnum.Page;
90
- const childTemplates = Object.values(entryTreeNode.children).map((child) => {
91
- return createNavigationTree({
92
- indent: indent + 1,
93
- entryTreeNode: child,
94
- rootPath: entryPath,
95
- selectedPath,
96
- router,
97
- });
98
- });
99
- return html `
100
- <div class="nav-tree-entry" style="--indent: ${indent};">
101
- <slot name=${ElementBookSlotName.NavHeader}></slot>
102
- <li class=${entryTreeNode.entry.entryType}>
103
- <${ElementBookRouteLink}
104
- ${assign(ElementBookRouteLink, {
105
- router: router,
106
- route: {
107
- paths: [
108
- ElementBookMainRoute.Book,
109
- ...entryPath,
110
- ],
111
- },
112
- })}
113
- class=${classMap({
114
- 'title-row': true,
115
- selected: areJsonEqual(selectedPath, entryPath),
116
- })}
117
- >
118
- <div class="title-text">
119
- ${renderIf(isPage, html `
120
- <${VirIcon} ${assign(VirIcon, { icon: Element16Icon })}></${VirIcon}>
121
- `)}
122
- ${entryTreeNode.entry.title}
123
- </div>
124
- </${ElementBookRouteLink}>
125
- </li>
126
- ${childTemplates}
127
- </div>
128
- `;
129
- }
@@ -1,7 +0,0 @@
1
- import { EntryTreeNode } from '../../../data/element-book-entry/entry-tree/entry-tree';
2
- import { ElementBookFullRoute, ElementBookRouter } from '../../../routing/element-book-routing';
3
- export declare const ElementBookEntryDisplay: import("element-vir").DeclarativeElementDefinition<"element-book-entry-display", {
4
- currentRoute: Readonly<ElementBookFullRoute>;
5
- currentNode: Readonly<EntryTreeNode>;
6
- router: ElementBookRouter;
7
- }, {}, {}, `element-book-entry-display-${string}`, `element-book-entry-display-${string}`, import("lit-html").HTMLTemplateResult>;