element-book 26.16.0 → 26.17.0

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.
@@ -35,7 +35,9 @@ function traverseAndInsertNewControls(controlsWrapper, urlBreadcrumbs, newValues
35
35
  * @category Internal
36
36
  */
37
37
  export function createNewControls(controlsWrapper, breadcrumbsForNewValue, newValues) {
38
- const newControls = { ...controlsWrapper };
38
+ const newControls = {
39
+ ...controlsWrapper,
40
+ };
39
41
  traverseAndInsertNewControls(newControls, [
40
42
  /** Empty string represents the breadcrumb for the root node */
41
43
  '',
@@ -42,7 +42,12 @@ export function createBookTreeFromEntries({ entries, debug, }) {
42
42
  return cachedTree;
43
43
  }
44
44
  const tree = createEmptyBookTreeRoot();
45
- entries.forEach((newEntry) => addEntryToTree({ tree, newEntry, debug, manuallyAdded: true }));
45
+ entries.forEach((newEntry) => addEntryToTree({
46
+ tree,
47
+ newEntry,
48
+ debug,
49
+ manuallyAdded: true,
50
+ }));
46
51
  const flattenedNodes = flattenTree(tree);
47
52
  const bookTree = {
48
53
  tree,
@@ -65,7 +70,12 @@ function getOrAddImmediateParent(tree, entry, debug) {
65
70
  if (debug) {
66
71
  console.info(`parent of ${entry.title} not found in tree; adding it now.`);
67
72
  }
68
- addEntryToTree({ tree, newEntry: entry.parent, debug, manuallyAdded: false });
73
+ addEntryToTree({
74
+ tree,
75
+ newEntry: entry.parent,
76
+ debug,
77
+ manuallyAdded: false,
78
+ });
69
79
  const immediateParentAfterAdding = traverseToImmediateParent(entry, tree);
70
80
  if (!immediateParentAfterAdding) {
71
81
  throw new Error(`Failed to find node despite having just added it: ${listUrlBreadcrumbs(entry, false).join(' > ')}`);
@@ -105,7 +115,12 @@ function addEntryToTree({ tree, newEntry, debug, manuallyAdded, }) {
105
115
  immediateParent.children[newEntryUrlBreadcrumb] = newNode;
106
116
  if (isBookEntry(newEntry, BookEntryType.Page) &&
107
117
  Object.values(newEntry.elementExamples).length) {
108
- Object.values(newEntry.elementExamples).forEach((elementExample) => addEntryToTree({ tree, newEntry: elementExample, debug, manuallyAdded }));
118
+ Object.values(newEntry.elementExamples).forEach((elementExample) => addEntryToTree({
119
+ tree,
120
+ newEntry: elementExample,
121
+ debug,
122
+ manuallyAdded,
123
+ }));
109
124
  }
110
125
  }
111
126
  export function traverseToImmediateParent(entryOrNode, currentTree) {
package/dist/index.d.ts CHANGED
@@ -11,7 +11,6 @@ export * from './data/book-tree/book-tree-node.js';
11
11
  export * from './routing/book-routing.js';
12
12
  export * from './ui/color-theme/color-theme.js';
13
13
  export * from './ui/color-theme/create-color-theme.js';
14
- export * from './ui/elements/element-book-app/element-book-app-slots.js';
15
14
  export * from './ui/elements/element-book-app/element-book-app.element.js';
16
15
  export * from './ui/elements/element-book-app/element-book-config.js';
17
16
  export * from './ui/elements/element-book-app/global-values.js';
package/dist/index.js CHANGED
@@ -11,7 +11,6 @@ export * from './data/book-tree/book-tree-node.js';
11
11
  export * from './routing/book-routing.js';
12
12
  export * from './ui/color-theme/color-theme.js';
13
13
  export * from './ui/color-theme/create-color-theme.js';
14
- export * from './ui/elements/element-book-app/element-book-app-slots.js';
15
14
  export * from './ui/elements/element-book-app/element-book-app.element.js';
16
15
  export * from './ui/elements/element-book-app/element-book-config.js';
17
16
  export * from './ui/elements/element-book-app/global-values.js';
@@ -4,7 +4,9 @@ import { unsafeCSS } from 'element-vir';
4
4
  function colorsObjectToCssResult(colors) {
5
5
  return mapObjectValues(colors, (key, value) => {
6
6
  if (value instanceof Color) {
7
- return unsafeCSS(value.toString({ format: 'hex' }));
7
+ return unsafeCSS(value.toString({
8
+ format: 'hex',
9
+ }));
8
10
  }
9
11
  else {
10
12
  return colorsObjectToCssResult(value);
@@ -74,12 +76,26 @@ export function createTheme({ themeColor: inputThemeColor = defaultThemeStartCol
74
76
  const foregroundColor = new Color(foregroundColorString);
75
77
  const colors = {
76
78
  nav: {
77
- hover: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 93 }) }),
78
- active: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 90 }) }),
79
- selected: createColorPair({ background: themeColor.clone().set({ 'hsl.l': 85 }) }),
79
+ hover: createColorPair({
80
+ background: themeColor.clone().set({
81
+ 'hsl.l': 93,
82
+ }),
83
+ }),
84
+ active: createColorPair({
85
+ background: themeColor.clone().set({
86
+ 'hsl.l': 90,
87
+ }),
88
+ }),
89
+ selected: createColorPair({
90
+ background: themeColor.clone().set({
91
+ 'hsl.l': 85,
92
+ }),
93
+ }),
80
94
  },
81
95
  accent: {
82
- icon: themeColor.clone().set({ 'hsl.l': 40 }),
96
+ icon: themeColor.clone().set({
97
+ 'hsl.l': 40,
98
+ }),
83
99
  },
84
100
  page: {
85
101
  background: backgroundColor,
@@ -7,7 +7,6 @@ import { BookMainRoute, defaultBookFullRoute } from '../../../routing/book-routi
7
7
  import { colorThemeCssVars } from '../../color-theme/color-theme.js';
8
8
  import { BookRouteLink } from '../common/book-route-link.element.js';
9
9
  import { defineBookElement } from '../define-book-element.js';
10
- import { ElementBookSlotName } from '../element-book-app/element-book-app-slots.js';
11
10
  import { shouldShowTreeNodeInNav } from './book-nav-filter.js';
12
11
  export const BookNav = defineBookElement()({
13
12
  tagName: 'book-nav',
@@ -97,7 +96,9 @@ export const BookNav = defineBookElement()({
97
96
  >
98
97
  <div class="title-text">
99
98
  ${renderIf(isBookTreeNode(treeNode, BookEntryType.ElementExample), html `
100
- <${ViraIcon.assign({ icon: Element16Icon })}></${ViraIcon}>
99
+ <${ViraIcon.assign({
100
+ icon: Element16Icon,
101
+ })}></${ViraIcon}>
101
102
  `)}
102
103
  ${treeNode.entry.title}
103
104
  </div>
@@ -110,7 +111,7 @@ export const BookNav = defineBookElement()({
110
111
  route: defaultBookFullRoute,
111
112
  router: inputs.router,
112
113
  })}>
113
- <slot name=${ElementBookSlotName.NavHeader}>Book</slot>
114
+ <slot>Book</slot>
114
115
  </${BookRouteLink}>
115
116
  <ul>
116
117
  ${navTreeTemplates}
@@ -32,4 +32,4 @@ export declare const ElementBookApp: import("element-vir").DeclarativeElementDef
32
32
  originalWindowTitle: string | undefined;
33
33
  }, {
34
34
  pathUpdate: import("element-vir").DefineEvent<readonly string[]>;
35
- }, "element-book-app-", "element-book-app-", readonly [], readonly []>;
35
+ }, "element-book-app-", "element-book-app-", readonly ["footer", "navHeader"], readonly []>;
@@ -14,7 +14,6 @@ import { BookNav } from '../book-nav/book-nav.element.js';
14
14
  import { BookError } from '../common/book-error.element.js';
15
15
  import { BookPageControls } from '../entry-display/book-page/book-page-controls.element.js';
16
16
  import { BookEntryDisplay } from '../entry-display/entry-display/book-entry-display.element.js';
17
- import { ElementBookSlotName } from './element-book-app-slots.js';
18
17
  import { getCurrentNodes } from './get-current-nodes.js';
19
18
  /**
20
19
  * The element-book app itself. Instantiate one of these where you want your element-book pages to
@@ -40,6 +39,18 @@ export const ElementBookApp = defineElement()({
40
39
  events: {
41
40
  pathUpdate: defineElementEvent(),
42
41
  },
42
+ slotNames: [
43
+ /**
44
+ * Used to specify a footer for the main element example viewer. It always appears at the
45
+ * bottom of the viewer's scroll area.
46
+ */
47
+ 'footer',
48
+ /**
49
+ * Used to specify a header above the navigation sidebar. This is a particularly good place
50
+ * for branding.
51
+ */
52
+ 'navHeader',
53
+ ],
43
54
  styles: css `
44
55
  :host {
45
56
  display: flex;
@@ -79,10 +90,12 @@ export const ElementBookApp = defineElement()({
79
90
  cleanup({ state, updateState }) {
80
91
  if (state.router) {
81
92
  state.router.destroy();
82
- updateState({ router: undefined });
93
+ updateState({
94
+ router: undefined,
95
+ });
83
96
  }
84
97
  },
85
- render: ({ state, inputs, host, updateState, dispatch, events }) => {
98
+ render: ({ state, inputs, host, updateState, dispatch, events, slotNames }) => {
86
99
  if (inputs._debug) {
87
100
  console.info('rendering element-book app');
88
101
  }
@@ -99,7 +112,9 @@ export const ElementBookApp = defineElement()({
99
112
  function updateWindowTitle(topNodeTitle) {
100
113
  if (!inputs.preventWindowTitleChange) {
101
114
  if (!state.originalWindowTitle) {
102
- updateState({ originalWindowTitle: document.title });
115
+ updateState({
116
+ originalWindowTitle: document.title,
117
+ });
103
118
  }
104
119
  document.title = [
105
120
  state.originalWindowTitle,
@@ -133,11 +148,15 @@ export const ElementBookApp = defineElement()({
133
148
  try {
134
149
  if (inputs.elementBookRoutePaths &&
135
150
  !check.jsonEquals(inputs.elementBookRoutePaths, state.currentRoute.paths)) {
136
- updateRoutes({ paths: makeWritable(inputs.elementBookRoutePaths) });
151
+ updateRoutes({
152
+ paths: makeWritable(inputs.elementBookRoutePaths),
153
+ });
137
154
  }
138
155
  if (inputs.internalRouterConfig?.useInternalRouter && !state.router) {
139
156
  const router = createBookRouter(inputs.internalRouterConfig.basePath);
140
- updateState({ router });
157
+ updateState({
158
+ router,
159
+ });
141
160
  router.listen(true, (fullRoute) => {
142
161
  updateState({
143
162
  currentRoute: fullRoute,
@@ -201,7 +220,9 @@ export const ElementBookApp = defineElement()({
201
220
  `;
202
221
  }
203
222
  if (inputs._debug) {
204
- console.info({ currentControls });
223
+ console.info({
224
+ currentControls,
225
+ });
205
226
  }
206
227
  return html `
207
228
  <div
@@ -211,7 +232,9 @@ export const ElementBookApp = defineElement()({
211
232
  if (!areRoutesNew(newRoute)) {
212
233
  return;
213
234
  }
214
- updateState({ loading: true });
235
+ updateState({
236
+ loading: true,
237
+ });
215
238
  updateRoutes(newRoute);
216
239
  const navElement = host.shadowRoot.querySelector(BookNav.tagName);
217
240
  if (!(navElement instanceof BookNav)) {
@@ -241,10 +264,7 @@ export const ElementBookApp = defineElement()({
241
264
  ? undefined
242
265
  : state.currentRoute.paths.slice(1),
243
266
  })}>
244
- <slot
245
- name=${ElementBookSlotName.NavHeader}
246
- slot=${ElementBookSlotName.NavHeader}
247
- ></slot>
267
+ <slot name=${slotNames.navHeader}></slot>
248
268
  </${BookNav}>
249
269
  `}
250
270
  <${BookEntryDisplay.assign({
@@ -261,19 +281,21 @@ export const ElementBookApp = defineElement()({
261
281
  await waitForAnimationFrame();
262
282
  const entryDisplay = host.shadowRoot.querySelector(BookEntryDisplay.tagName);
263
283
  if (entryDisplay) {
264
- entryDisplay.scroll({ top: 0, behavior: 'instant' });
284
+ entryDisplay.scroll({
285
+ top: 0,
286
+ behavior: 'instant',
287
+ });
265
288
  }
266
289
  else {
267
290
  console.error(`Failed to find '${BookEntryDisplay.tagName}' for scrolling.`);
268
291
  }
269
292
  await waitForAnimationFrame();
270
- updateState({ loading: !event.detail });
293
+ updateState({
294
+ loading: !event.detail,
295
+ });
271
296
  })}
272
297
  >
273
- <slot
274
- name=${ElementBookSlotName.Footer}
275
- slot=${ElementBookSlotName.Footer}
276
- ></slot>
298
+ <slot name=${slotNames.footer}></slot>
277
299
  </${BookEntryDisplay}>
278
300
  </div>
279
301
  `;
@@ -38,7 +38,9 @@ export const BookBreadcrumbsBar = defineBookElement()({
38
38
  }
39
39
  const preThrottleValue = inputElement.value;
40
40
  // throttle it a bit
41
- await wait({ milliseconds: 200 });
41
+ await wait({
42
+ milliseconds: 200,
43
+ });
42
44
  if (inputElement.value !== preThrottleValue) {
43
45
  return;
44
46
  }
@@ -87,7 +87,9 @@ export const BookPageControls = defineBookElement()({
87
87
  return html `
88
88
  <div class="control-wrapper">
89
89
  ${renderIf(index === 0, html `
90
- <${ViraIcon.assign({ icon: Options24Icon })}
90
+ <${ViraIcon.assign({
91
+ icon: Options24Icon,
92
+ })}
91
93
  class="options-icon"
92
94
  ></${ViraIcon}>
93
95
  `)}
@@ -153,7 +155,7 @@ function createControlInput(value, controlInit, valueChange) {
153
155
  return html `
154
156
  <${ViraInput.assign({
155
157
  value,
156
- allowedInputs: /\d/,
158
+ allowedInputs: /[\d.]/,
157
159
  })}
158
160
  ${listen(ViraInput.events.valueChange, (event) => {
159
161
  valueChange(event.detail);
@@ -72,7 +72,9 @@ export const BookPageWrapper = defineBookElement()({
72
72
  ${headerTemplate}
73
73
  ${error
74
74
  ? html `
75
- <${BookError.assign({ message: error.message })}></${BookError}>
75
+ <${BookError.assign({
76
+ message: error.message,
77
+ })}></${BookError}>
76
78
  `
77
79
  : html `
78
80
  <${BookEntryDescription.assign({
@@ -2,7 +2,6 @@ import { css, defineElementEvent, html, onDomCreated, renderIf } from 'element-v
2
2
  import { LoaderAnimated24Icon, ViraIcon, viraAnimationDurations } from 'vira';
3
3
  import { extractSearchQuery } from '../../../../routing/book-routing.js';
4
4
  import { defineBookElement } from '../../define-book-element.js';
5
- import { ElementBookSlotName } from '../../element-book-app/element-book-app-slots.js';
6
5
  import { BookBreadcrumbsBar } from '../book-breadcrumbs-bar.element.js';
7
6
  import { createNodeTemplates } from './create-node-templates.js';
8
7
  export const BookEntryDisplay = defineBookElement()({
@@ -101,22 +100,26 @@ export const BookEntryDisplay = defineBookElement()({
101
100
  })}
102
101
  class="loading"
103
102
  >
104
- <${ViraIcon.assign({ icon: LoaderAnimated24Icon })}></${ViraIcon}>
103
+ <${ViraIcon.assign({
104
+ icon: LoaderAnimated24Icon,
105
+ })}></${ViraIcon}>
105
106
  </div>
106
107
  ${renderIf(!!state.lastElement, html `
107
108
  ${state.lastElement}
108
- <slot name=${ElementBookSlotName.Footer}></slot>
109
+ <slot></slot>
109
110
  `)}
110
111
  `, html `
111
112
  <div
112
113
  ${onDomCreated((element) => {
113
- updateState({ lastElement: element });
114
+ updateState({
115
+ lastElement: element,
116
+ });
114
117
  })}
115
118
  class="all-book-entries-wrapper"
116
119
  >
117
120
  ${entryTemplates}
118
121
  </div>
119
- <slot name=${ElementBookSlotName.Footer}></slot>
122
+ <slot></slot>
120
123
  `)}
121
124
  `;
122
125
  },
@@ -97,9 +97,13 @@ export const BookLazyEntry = defineBookElement()({
97
97
  if (state.placeholderElement) {
98
98
  unobserveElement(state.placeholderElement);
99
99
  }
100
- updateState({ placeholderElement: element });
100
+ updateState({
101
+ placeholderElement: element,
102
+ });
101
103
  observedElements.set(element, () => {
102
- updateState({ hasRendered: true });
104
+ updateState({
105
+ hasRendered: true,
106
+ });
103
107
  });
104
108
  getSharedObserver().observe(element);
105
109
  })}
@@ -43,7 +43,11 @@ function getFlattenedControlsFromHiddenParents(currentNodes, currentControls, cu
43
43
  ...currentControls.breadcrumbs,
44
44
  },
45
45
  };
46
- }, { config: {}, current: {}, breadcrumbs: {} });
46
+ }, {
47
+ config: {},
48
+ current: {},
49
+ breadcrumbs: {},
50
+ });
47
51
  }
48
52
  export function createNodeTemplates({ blockNavigation, currentNodes, isTopLevel, router, isSearching, controls, originalTree, }) {
49
53
  if (!currentNodes.length && isSearching) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "element-book",
3
- "version": "26.16.0",
3
+ "version": "26.17.0",
4
4
  "keywords": [
5
5
  "book",
6
6
  "design system",
@@ -41,30 +41,30 @@
41
41
  "test:docs": "virmator docs check"
42
42
  },
43
43
  "dependencies": {
44
- "@augment-vir/assert": "^31.59.0",
45
- "@augment-vir/common": "^31.59.0",
46
- "@augment-vir/web": "^31.59.0",
47
- "@electrovir/color": "^1.7.6",
44
+ "@augment-vir/assert": "^31.67.0",
45
+ "@augment-vir/common": "^31.67.0",
46
+ "@augment-vir/web": "^31.67.0",
47
+ "@electrovir/color": "^1.7.8",
48
48
  "colorjs.io": "^0.6.1",
49
- "date-vir": "^8.1.0",
50
- "lit-css-vars": "^3.3.0",
49
+ "date-vir": "^8.2.0",
50
+ "lit-css-vars": "^3.5.0",
51
51
  "spa-router-vir": "^6.4.1",
52
52
  "typed-event-target": "^4.1.0"
53
53
  },
54
54
  "devDependencies": {
55
- "@augment-vir/test": "^31.59.0",
56
- "@web/dev-server-esbuild": "^1.0.4",
55
+ "@augment-vir/test": "^31.67.0",
56
+ "@web/dev-server-esbuild": "^1.0.5",
57
57
  "@web/test-runner": "^0.20.2",
58
58
  "@web/test-runner-commands": "^0.9.0",
59
59
  "@web/test-runner-playwright": "^0.11.1",
60
60
  "@web/test-runner-visual-regression": "^0.10.0",
61
- "element-vir": "^26.14.3",
61
+ "element-vir": "^26.14.4",
62
62
  "istanbul-smart-text-reporter": "^1.1.5",
63
63
  "markdown-code-example-inserter": "^3.0.3",
64
- "type-fest": "^5.4.1",
65
- "typedoc": "^0.28.16",
64
+ "type-fest": "^5.4.4",
65
+ "typedoc": "^0.28.17",
66
66
  "typescript": "5.9.3",
67
- "vira": "^29.0.0"
67
+ "vira": "^30.0.0"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "element-vir": ">=17",
@@ -1,17 +0,0 @@
1
- /**
2
- * Slots to be used on an element-book app instance for inserting custom HTML into the app.
3
- *
4
- * @category Main
5
- */
6
- export declare enum ElementBookSlotName {
7
- /**
8
- * Used to specify a footer for the main element example viewer. It always appears at the bottom
9
- * of the viewer's scroll area.
10
- */
11
- Footer = "book-footer",
12
- /**
13
- * Used to specify a header above the navigation sidebar. This is a particularly good place for
14
- * branding.
15
- */
16
- NavHeader = "book-nav-header"
17
- }
@@ -1,18 +0,0 @@
1
- /**
2
- * Slots to be used on an element-book app instance for inserting custom HTML into the app.
3
- *
4
- * @category Main
5
- */
6
- export var ElementBookSlotName;
7
- (function (ElementBookSlotName) {
8
- /**
9
- * Used to specify a footer for the main element example viewer. It always appears at the bottom
10
- * of the viewer's scroll area.
11
- */
12
- ElementBookSlotName["Footer"] = "book-footer";
13
- /**
14
- * Used to specify a header above the navigation sidebar. This is a particularly good place for
15
- * branding.
16
- */
17
- ElementBookSlotName["NavHeader"] = "book-nav-header";
18
- })(ElementBookSlotName || (ElementBookSlotName = {}));