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