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
@@ -1,219 +0,0 @@
1
- import {check} from '@augment-vir/assert';
2
- import {type Values} from '@augment-vir/common';
3
- import {extractEventTarget} from '@augment-vir/web';
4
- import {css, defineElementEvent, html, listen, renderIf} from 'element-vir';
5
- import {Options24Icon, ViraIcon, ViraInput} from 'vira';
6
- import {
7
- type BookPageControl,
8
- type BookPageControlInit,
9
- BookPageControlType,
10
- type BookPageControlsValues,
11
- isControlInitType,
12
- } from '../../../../data/book-entry/book-page/book-page-controls.js';
13
- import {type BookPage} from '../../../../data/book-entry/book-page/book-page.js';
14
- import {colorThemeCssVars} from '../../../color-theme/color-theme.js';
15
- import {defineBookElement} from '../../define-book-element.js';
16
-
17
- export const BookPageControls = defineBookElement<{
18
- config: BookPage['controls'];
19
- /**
20
- * If an object (or Record) is given for this input, then each key of the object must correspond
21
- * to one of the controls from the input config and the value for each key will be the
22
- * breadcrumbs for that specific config.
23
- */
24
- fullUrlBreadcrumbs: ReadonlyArray<string> | Record<string, ReadonlyArray<string>>;
25
- currentValues: Record<string, BookPageControl['initValue']>;
26
- }>()({
27
- tagName: 'book-page-controls',
28
- events: {
29
- controlValueChange: defineElementEvent<{
30
- fullUrlBreadcrumbs: ReadonlyArray<string>;
31
- newValues: BookPageControlsValues;
32
- }>(),
33
- },
34
- hostClasses: {
35
- 'book-page-controls-has-controls': ({inputs}) => !!Object.keys(inputs.config).length,
36
- },
37
- styles: ({hostClasses}) => css`
38
- :host {
39
- display: flex;
40
- flex-wrap: wrap;
41
- align-items: flex-end;
42
- padding-left: 36px;
43
- align-content: flex-start;
44
- gap: 16px;
45
- row-gap: 10px;
46
- color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
47
- }
48
-
49
- ${hostClasses['book-page-controls-has-controls'].selector} {
50
- margin-top: 8px;
51
- }
52
-
53
- .control-wrapper {
54
- position: relative;
55
- display: flex;
56
- gap: 4px;
57
- flex-direction: column;
58
- }
59
-
60
- .error {
61
- font-weight: bold;
62
- color: red;
63
- }
64
-
65
- ${ViraInput} {
66
- height: 24px;
67
- max-width: 128px;
68
- }
69
-
70
- ${ViraIcon}.options-icon {
71
- position: absolute;
72
- left: 0;
73
- bottom: 0;
74
- margin-left: -32px;
75
- }
76
- `,
77
- render({inputs, dispatch, events}) {
78
- if (!Object.entries(inputs.config).length) {
79
- return '';
80
- }
81
-
82
- return Object.entries(inputs.config).map(
83
- (
84
- [
85
- controlName,
86
- controlInit,
87
- ],
88
- index,
89
- ) => {
90
- if (controlInit.controlType === BookPageControlType.Hidden) {
91
- return '';
92
- }
93
-
94
- const controlInputTemplate = createControlInput(
95
- inputs.currentValues[controlName],
96
- controlInit,
97
- (newValue) => {
98
- const fullUrlBreadcrumbs = check.isArray(inputs.fullUrlBreadcrumbs)
99
- ? inputs.fullUrlBreadcrumbs
100
- : inputs.fullUrlBreadcrumbs[controlName];
101
-
102
- if (!fullUrlBreadcrumbs) {
103
- throw new Error(
104
- `Failed to find breadcrumbs from given control name: '${controlName}'`,
105
- );
106
- }
107
-
108
- dispatch(
109
- new events.controlValueChange({
110
- fullUrlBreadcrumbs,
111
- newValues: {
112
- ...inputs.currentValues,
113
- [controlName]: newValue,
114
- },
115
- }),
116
- );
117
- },
118
- );
119
- return html`
120
- <div class="control-wrapper">
121
- ${renderIf(
122
- index === 0,
123
- html`
124
- <${ViraIcon.assign({icon: Options24Icon})}
125
- class="options-icon"
126
- ></${ViraIcon}>
127
- `,
128
- )}
129
- <label class="control-wrapper">
130
- <span>${controlName}</span>
131
- ${controlInputTemplate}
132
- </label>
133
- </div>
134
- `;
135
- },
136
- );
137
- },
138
- });
139
-
140
- function createControlInput(
141
- value: string,
142
- controlInit: BookPageControlInit<any>,
143
- valueChange: (newValue: Values<BookPageControlsValues>) => void,
144
- ) {
145
- if (isControlInitType(controlInit, BookPageControlType.Hidden)) {
146
- return '';
147
- } else if (isControlInitType(controlInit, BookPageControlType.Checkbox)) {
148
- return html`
149
- <input
150
- type="checkbox"
151
- ?checked=${value}
152
- ${listen('input', (event) => {
153
- const inputElement = extractEventTarget(event, HTMLInputElement);
154
-
155
- valueChange(inputElement.checked);
156
- })}
157
- />
158
- `;
159
- } else if (isControlInitType(controlInit, BookPageControlType.Color)) {
160
- return html`
161
- <input
162
- type="color"
163
- .value=${value}
164
- ${listen('input', (event) => {
165
- const inputElement = extractEventTarget(event, HTMLInputElement);
166
-
167
- valueChange(inputElement.value);
168
- })}
169
- />
170
- `;
171
- } else if (isControlInitType(controlInit, BookPageControlType.Text)) {
172
- return html`
173
- <${ViraInput.assign({
174
- value,
175
- showClearButton: true,
176
- disableBrowserHelps: true,
177
- })}
178
- ${listen(ViraInput.events.valueChange, (event) => {
179
- valueChange(event.detail);
180
- })}
181
- ></${ViraInput}>
182
- `;
183
- } else if (isControlInitType(controlInit, BookPageControlType.Number)) {
184
- return html`
185
- <input
186
- type="number"
187
- .value=${value}
188
- ${listen('input', (event) => {
189
- const inputElement = extractEventTarget(event, HTMLInputElement);
190
-
191
- valueChange(inputElement.value);
192
- })}
193
- />
194
- `;
195
- } else if (isControlInitType(controlInit, BookPageControlType.Dropdown)) {
196
- return html`
197
- <select
198
- .value=${value}
199
- ${listen('input', (event) => {
200
- const selectElement = extractEventTarget(event, HTMLSelectElement);
201
-
202
- valueChange(selectElement.value);
203
- })}
204
- >
205
- ${controlInit.options.map((optionLabel) => {
206
- return html`
207
- <option ?selected=${optionLabel === value} value=${optionLabel}>
208
- ${optionLabel}
209
- </option>
210
- `;
211
- })}
212
- </select>
213
- `;
214
- } else {
215
- return html`
216
- <p class="error">${controlInit.controlType} controls are not implemented yet.</p>
217
- `;
218
- }
219
- }
@@ -1,105 +0,0 @@
1
- import {combineErrors} from '@augment-vir/common';
2
- import {css, html} from 'element-vir';
3
- import {type BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
4
- import {
5
- type ControlsWrapper,
6
- traverseControls,
7
- } from '../../../../data/book-entry/book-page/controls-wrapper.js';
8
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
9
- import {type BookRouter} from '../../../../routing/book-router.js';
10
- import {BookMainRoute, type ValidBookPaths} from '../../../../routing/book-routing.js';
11
- import {BookError} from '../../common/book-error.element.js';
12
- import {BookRouteLink} from '../../common/book-route-link.element.js';
13
- import {defineBookElement} from '../../define-book-element.js';
14
- import {BookEntryDescription} from '../book-entry-description.element.js';
15
- import {BookPageControls} from './book-page-controls.element.js';
16
-
17
- export const BookPageWrapper = defineBookElement<{
18
- isTopLevel: boolean;
19
- pageNode: BookTreeNode<BookEntryType.Page>;
20
- router: BookRouter | undefined;
21
- controls: ControlsWrapper;
22
- }>()({
23
- tagName: 'book-page-wrapper',
24
- styles: css`
25
- :host {
26
- display: block;
27
- }
28
-
29
- h2,
30
- h3 {
31
- margin: 0;
32
- padding: 0;
33
- font-size: 1.5em;
34
- display: flex;
35
- align-items: center;
36
- gap: 8px;
37
- }
38
-
39
- .page-header .title-group {
40
- align-items: flex-start;
41
- display: flex;
42
- flex-direction: column;
43
- }
44
-
45
- ${BookRouteLink} {
46
- display: inline-block;
47
- }
48
- `,
49
- render({inputs}) {
50
- const titleTemplate = inputs.isTopLevel
51
- ? html`
52
- <h2 class="header-with-icon">${inputs.pageNode.entry.title}</h2>
53
- `
54
- : html`
55
- <h3 class="header-with-icon">${inputs.pageNode.entry.title}</h3>
56
- `;
57
-
58
- const linkPaths: ValidBookPaths = [
59
- BookMainRoute.Book,
60
- ...inputs.pageNode.fullUrlBreadcrumbs,
61
- ];
62
-
63
- const error = inputs.pageNode.entry.errors.length
64
- ? combineErrors(inputs.pageNode.entry.errors)
65
- : undefined;
66
- if (error) {
67
- console.error(error);
68
- }
69
-
70
- return html`
71
- <div class="page-header block-entry">
72
- <div class="title-group">
73
- <${BookRouteLink.assign({
74
- route: {
75
- paths: linkPaths,
76
- hash: undefined,
77
- search: undefined,
78
- },
79
- router: inputs.router,
80
- })}>
81
- ${titleTemplate}
82
- </${BookRouteLink}>
83
- ${error
84
- ? html`
85
- <${BookError.assign({message: error.message})}></${BookError}>
86
- `
87
- : html`
88
- <${BookEntryDescription.assign({
89
- descriptionParagraphs:
90
- inputs.pageNode.entry.descriptionParagraphs,
91
- })}></${BookEntryDescription}>
92
- <${BookPageControls.assign({
93
- config: inputs.pageNode.entry.controls,
94
- currentValues: traverseControls(
95
- inputs.controls,
96
- inputs.pageNode.fullUrlBreadcrumbs,
97
- ),
98
- fullUrlBreadcrumbs: inputs.pageNode.fullUrlBreadcrumbs,
99
- })}></${BookPageControls}>
100
- `}
101
- </div>
102
- </div>
103
- `;
104
- },
105
- });
@@ -1,42 +0,0 @@
1
- import {css, html} from 'element-vir';
2
- import {type BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
3
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
4
- import {type BookRouter} from '../../../../routing/book-router.js';
5
- import {BookMainRoute, type ValidBookPaths} from '../../../../routing/book-routing.js';
6
- import {colorThemeCssVars} from '../../../color-theme/color-theme.js';
7
- import {BookRouteLink} from '../../common/book-route-link.element.js';
8
- import {defineBookElement} from '../../define-book-element.js';
9
-
10
- export const BookElementExampleControls = defineBookElement<{
11
- elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
12
- router: BookRouter | undefined;
13
- }>()({
14
- tagName: 'book-element-example-controls',
15
- styles: css`
16
- :host {
17
- display: flex;
18
- color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
19
- border-bottom: 1px solid currentColor;
20
- padding: 0 8px 4px;
21
- }
22
- `,
23
- render({inputs}) {
24
- const linkPaths: ValidBookPaths = [
25
- BookMainRoute.Book,
26
- ...inputs.elementExampleNode.fullUrlBreadcrumbs,
27
- ];
28
-
29
- return html`
30
- <${BookRouteLink.assign({
31
- route: {
32
- paths: linkPaths,
33
- hash: undefined,
34
- search: undefined,
35
- },
36
- router: inputs.router,
37
- })}>
38
- ${inputs.elementExampleNode.entry.title}
39
- </${BookRouteLink}>
40
- `;
41
- },
42
- });
@@ -1,79 +0,0 @@
1
- import {combineErrors, extractErrorMessage} from '@augment-vir/common';
2
- import {html, renderIf} from 'element-vir';
3
- import {type BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
4
- import {type BookPageControlsValues} from '../../../../data/book-entry/book-page/book-page-controls.js';
5
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
6
- import {unsetInternalState} from '../../../../data/unset.js';
7
- import {BookError} from '../../common/book-error.element.js';
8
- import {defineBookElement} from '../../define-book-element.js';
9
-
10
- export const BookElementExampleViewer = defineBookElement<{
11
- elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
12
- currentPageControls: BookPageControlsValues;
13
- }>()({
14
- tagName: 'book-element-example-viewer',
15
- state() {
16
- return {
17
- isUnset: unsetInternalState,
18
- } as any;
19
- },
20
- render({state, inputs, updateState}) {
21
- try {
22
- if (inputs.elementExampleNode.entry.errors.length) {
23
- throw combineErrors(inputs.elementExampleNode.entry.errors);
24
- }
25
-
26
- if (
27
- /** This is a check to make sure the input entry _does_ match the expected type. */
28
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
29
- !inputs.elementExampleNode.entry.render ||
30
- typeof inputs.elementExampleNode.entry.render === 'string'
31
- ) {
32
- throw new Error(
33
- `Failed to render example '${inputs.elementExampleNode.entry.title}': render is not a function`,
34
- );
35
- }
36
-
37
- if (state.isUnset === unsetInternalState) {
38
- updateState({
39
- isUnset: undefined,
40
- ...inputs.elementExampleNode.entry.state?.(),
41
- });
42
- }
43
-
44
- const output = inputs.elementExampleNode.entry.render({
45
- state,
46
- updateState,
47
- controls: inputs.currentPageControls,
48
- });
49
- if (output instanceof Promise) {
50
- throw new TypeError('render output cannot be a promise');
51
- }
52
-
53
- return html`
54
- ${renderIf(
55
- !!inputs.elementExampleNode.entry.styles,
56
- html`
57
- <style>
58
- ${inputs.elementExampleNode.entry.styles}
59
- </style>
60
- `,
61
- )}
62
- ${output}
63
- `;
64
- } catch (error) {
65
- console.error('ERROR HERE', extractErrorMessage(error));
66
- console.error(error);
67
- return html`
68
- <${BookError.assign({
69
- message: `${
70
- inputs.elementExampleNode.entry.title
71
- } failed: ${extractErrorMessage(error)}`,
72
- })}></${BookError}>
73
- `;
74
- }
75
- },
76
- options: {
77
- allowPolymorphicState: true,
78
- },
79
- });
@@ -1,61 +0,0 @@
1
- import {omitObjectKeys} from '@augment-vir/common';
2
- import {css, html} from 'element-vir';
3
- import {type BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
4
- import {type BookPageControlsValues} from '../../../../data/book-entry/book-page/book-page-controls.js';
5
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
6
- import {type BookRouter} from '../../../../routing/book-router.js';
7
- import {colorThemeCssVars} from '../../../color-theme/color-theme.js';
8
- import {defineBookElement} from '../../define-book-element.js';
9
- import {BookElementExampleControls} from './book-element-example-controls.element.js';
10
- import {BookElementExampleViewer} from './book-element-example-viewer.element.js';
11
-
12
- export const BookElementExampleWrapper = defineBookElement<{
13
- elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
14
- currentPageControls: BookPageControlsValues;
15
- router: BookRouter | undefined;
16
- }>()({
17
- tagName: 'book-element-example-wrapper',
18
- styles: css`
19
- :host {
20
- display: inline-block;
21
- max-width: 100%;
22
- }
23
-
24
- .examples-wrapper {
25
- display: flex;
26
- gap: 32px;
27
- flex-wrap: wrap;
28
- }
29
-
30
- .error {
31
- color: red;
32
- font-weight: bold;
33
- }
34
-
35
- .individual-example-wrapper {
36
- display: flex;
37
- flex-direction: column;
38
- gap: 24px;
39
- max-width: 100%;
40
- align-items: flex-start;
41
- }
42
-
43
- ${BookElementExampleControls} {
44
- color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
45
- }
46
-
47
- :host(:hover) ${BookElementExampleControls} {
48
- color: ${colorThemeCssVars['element-book-accent-icon-color'].value};
49
- }
50
- `,
51
- render({inputs}) {
52
- return html`
53
- <div class="individual-example-wrapper">
54
- <${BookElementExampleControls.assign(
55
- omitObjectKeys(inputs, ['currentPageControls']),
56
- )}></${BookElementExampleControls}>
57
- <${BookElementExampleViewer.assign(inputs)}></${BookElementExampleViewer}>
58
- </div>
59
- `;
60
- },
61
- });
@@ -1,183 +0,0 @@
1
- import {check} from '@augment-vir/assert';
2
- import {mapObjectValues} from '@augment-vir/common';
3
- import {
4
- type HTMLTemplateResult,
5
- type HtmlInterpolation,
6
- classMap,
7
- html,
8
- nothing,
9
- repeat,
10
- } from 'element-vir';
11
- import {BookEntryType} from '../../../../data/book-entry/book-entry-type.js';
12
- import {
13
- type BookPageControlsInitBase,
14
- type BookPageControlsValues,
15
- } from '../../../../data/book-entry/book-page/book-page-controls.js';
16
- import {
17
- type ControlsWrapper,
18
- traverseControls,
19
- } from '../../../../data/book-entry/book-page/controls-wrapper.js';
20
- import {type BookTreeNode} from '../../../../data/book-tree/book-tree-node.js';
21
- import {isBookTreeNode, traverseToImmediateParent} from '../../../../data/book-tree/book-tree.js';
22
- import {type BookRouter} from '../../../../routing/book-router.js';
23
- import {BookError} from '../../common/book-error.element.js';
24
- import {BookPageControls} from '../book-page/book-page-controls.element.js';
25
- import {BookPageWrapper} from '../book-page/book-page-wrapper.element.js';
26
- import {BookElementExampleWrapper} from '../element-example/book-element-example-wrapper.element.js';
27
-
28
- type FlattenedControls = {
29
- config: BookPageControlsInitBase;
30
- current: BookPageControlsValues;
31
- breadcrumbs: Record<string, ReadonlyArray<string>>;
32
- };
33
-
34
- function getFlattenedControlsFromHiddenParents(
35
- currentNodes: ReadonlyArray<BookTreeNode>,
36
- currentControls: ControlsWrapper,
37
- currentNode: BookTreeNode,
38
- originalTree: Readonly<BookTreeNode<BookEntryType.Root>>,
39
- ): FlattenedControls | undefined {
40
- const parent = traverseToImmediateParent(currentNode, originalTree);
41
- const allControls: FlattenedControls[] = [];
42
-
43
- if (parent) {
44
- const parentControls = getFlattenedControlsFromHiddenParents(
45
- currentNodes,
46
- currentControls,
47
- parent,
48
- originalTree,
49
- );
50
- if (parentControls) {
51
- allControls.push(parentControls);
52
- }
53
- }
54
- if (isBookTreeNode(currentNode, BookEntryType.Page) && !currentNodes.includes(currentNode)) {
55
- const currentEntryControls = traverseControls(
56
- currentControls,
57
- currentNode.fullUrlBreadcrumbs,
58
- );
59
- allControls.push({
60
- config: currentNode.entry.controls,
61
- current: currentEntryControls,
62
- breadcrumbs: mapObjectValues(currentEntryControls, () => {
63
- return currentNode.fullUrlBreadcrumbs;
64
- }),
65
- });
66
- }
67
- return allControls.reduce(
68
- (accum, currentControls) => {
69
- return {
70
- config: {
71
- ...accum.config,
72
- ...currentControls.config,
73
- },
74
- current: {
75
- ...accum.current,
76
- ...currentControls.current,
77
- },
78
- breadcrumbs: {
79
- ...accum.breadcrumbs,
80
- ...currentControls.breadcrumbs,
81
- },
82
- };
83
- },
84
- {config: {}, current: {}, breadcrumbs: {}},
85
- );
86
- }
87
-
88
- export function createNodeTemplates({
89
- currentNodes,
90
- isTopLevel,
91
- router,
92
- isSearching,
93
- controls,
94
- originalTree,
95
- }: {
96
- currentNodes: ReadonlyArray<BookTreeNode>;
97
- isTopLevel: boolean;
98
- router: BookRouter | undefined;
99
- isSearching: boolean;
100
- controls: ControlsWrapper;
101
- originalTree: Readonly<BookTreeNode<BookEntryType.Root>>;
102
- }): HtmlInterpolation[] {
103
- if (!currentNodes.length && isSearching) {
104
- return [
105
- html`
106
- No results
107
- `,
108
- ];
109
- }
110
-
111
- const hiddenAncestorControls = check.isLengthAtLeast(currentNodes, 1)
112
- ? getFlattenedControlsFromHiddenParents(
113
- currentNodes,
114
- controls,
115
- currentNodes[0],
116
- originalTree,
117
- )
118
- : undefined;
119
-
120
- const hiddenAncestorControlsTemplate =
121
- hiddenAncestorControls &&
122
- Object.values(hiddenAncestorControls.config).length &&
123
- check.isLengthAtLeast(currentNodes, 1)
124
- ? html`
125
- <${BookPageControls.assign({
126
- config: hiddenAncestorControls.config,
127
- currentValues: hiddenAncestorControls.current,
128
- fullUrlBreadcrumbs: hiddenAncestorControls.breadcrumbs,
129
- })}></${BookPageControls}>
130
- `
131
- : nothing;
132
-
133
- const templates = repeat(
134
- currentNodes,
135
- (node) => node.fullUrlBreadcrumbs.join('>'),
136
- (currentNode): HTMLTemplateResult | typeof nothing => {
137
- if (isBookTreeNode(currentNode, BookEntryType.Page)) {
138
- return html`
139
- <${BookPageWrapper.assign({
140
- isTopLevel,
141
- pageNode: currentNode,
142
- controls,
143
- router,
144
- })}
145
- class="block-entry"
146
- ></${BookPageWrapper}>
147
- `;
148
- } else if (isBookTreeNode(currentNode, BookEntryType.ElementExample)) {
149
- const controlsForElementExample = traverseControls(
150
- controls,
151
- currentNode.fullUrlBreadcrumbs.slice(0, -1),
152
- );
153
-
154
- return html`
155
- <${BookElementExampleWrapper.assign({
156
- elementExampleNode: currentNode,
157
- currentPageControls: controlsForElementExample,
158
- router,
159
- })}
160
- class="inline-entry ${classMap({
161
- 'block-entry': currentNode.entry.isVertical,
162
- })}"
163
- ></${BookElementExampleWrapper}>
164
- `;
165
- } else if (isBookTreeNode(currentNode, BookEntryType.Root)) {
166
- return nothing;
167
- } else {
168
- return html`
169
- <${BookError.assign({
170
- message: `Unknown entry type for rendering: '${currentNode.entry.entryType}'`,
171
- })}
172
- class="block-entry"
173
- ></${BookError}>
174
- `;
175
- }
176
- },
177
- );
178
-
179
- return [
180
- hiddenAncestorControlsTemplate,
181
- templates,
182
- ];
183
- }