element-book 26.14.1 → 26.15.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.
@@ -5,4 +5,3 @@ export declare const BookNav: import("element-vir").DeclarativeElementDefinition
5
5
  selectedPath: ReadonlyArray<string> | undefined;
6
6
  router: BookRouter | undefined;
7
7
  }, {}, {}, "book-nav-", "book-nav-internal-indent", readonly [], readonly []>;
8
- export declare function scrollSelectedNavElementIntoView(bookNavInstance: typeof BookNav.InstanceType): Promise<void>;
@@ -1,5 +1,4 @@
1
1
  import { check } from '@augment-vir/assert';
2
- import { checkIfEntirelyInScrollView, waitForAnimationFrame } from '@augment-vir/web';
3
2
  import { classMap, css, html, renderIf } from 'element-vir';
4
3
  import { Element16Icon, ViraIcon } from 'vira';
5
4
  import { BookEntryType } from '../../../data/book-entry/book-entry-type.js';
@@ -119,14 +118,3 @@ export const BookNav = defineBookElement()({
119
118
  `;
120
119
  },
121
120
  });
122
- export async function scrollSelectedNavElementIntoView(bookNavInstance) {
123
- await waitForAnimationFrame(2);
124
- const selected = bookNavInstance.shadowRoot.querySelector('.selected');
125
- if (!selected) {
126
- throw new Error('Failed to find selected nav tree element.');
127
- }
128
- if (await checkIfEntirelyInScrollView(selected)) {
129
- return;
130
- }
131
- selected.scrollIntoView({ behavior: 'smooth', block: 'center' });
132
- }
@@ -1,7 +1,7 @@
1
1
  import { check } from '@augment-vir/assert';
2
2
  import { extractErrorMessage, makeWritable } from '@augment-vir/common';
3
3
  import { waitForAnimationFrame } from '@augment-vir/web';
4
- import { css, defineElement, defineElementEvent, html, listen } from 'element-vir';
4
+ import { css, defineElement, defineElementEvent, html, listen, nothing } from 'element-vir';
5
5
  import { createNewControls, updateTreeControls, } from '../../../data/book-entry/book-page/controls-wrapper.js';
6
6
  import { createBookTreeFromEntries } from '../../../data/book-tree/book-tree.js';
7
7
  import { searchFlattenedNodes } from '../../../data/book-tree/search-nodes.js';
@@ -10,7 +10,7 @@ import { defaultBookFullRoute, extractSearchQuery, } from '../../../routing/book
10
10
  import { colorThemeCssVars, setThemeCssVars, } from '../../color-theme/color-theme.js';
11
11
  import { createTheme } from '../../color-theme/create-color-theme.js';
12
12
  import { ChangeRouteEvent } from '../../events/change-route.event.js';
13
- import { BookNav, scrollSelectedNavElementIntoView } from '../book-nav/book-nav.element.js';
13
+ 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';
@@ -76,11 +76,6 @@ export const ElementBookApp = defineElement()({
76
76
  max-width: min(400px, 40%);
77
77
  }
78
78
  `,
79
- init({ host, state }) {
80
- setTimeout(async () => {
81
- await scrollNav(host, extractSearchQuery(state.currentRoute.paths), state.currentRoute);
82
- }, 500);
83
- },
84
79
  cleanup({ state, updateState }) {
85
80
  if (state.router) {
86
81
  state.router.destroy();
@@ -211,7 +206,7 @@ export const ElementBookApp = defineElement()({
211
206
  return html `
212
207
  <div
213
208
  class="root"
214
- ${listen(ChangeRouteEvent, async (event) => {
209
+ ${listen(ChangeRouteEvent, (event) => {
215
210
  const newRoute = event.detail;
216
211
  if (!areRoutesNew(newRoute)) {
217
212
  return;
@@ -222,7 +217,6 @@ export const ElementBookApp = defineElement()({
222
217
  if (!(navElement instanceof BookNav)) {
223
218
  throw new TypeError(`Failed to find child '${BookNav.tagName}'`);
224
219
  }
225
- await scrollNav(host, searchQuery, state.currentRoute);
226
220
  })}
227
221
  ${listen(BookPageControls.events.controlValueChange, (event) => {
228
222
  if (!state.treeBasedControls) {
@@ -237,17 +231,24 @@ export const ElementBookApp = defineElement()({
237
231
  });
238
232
  })}
239
233
  >
240
- <${BookNav.assign({
241
- flattenedNodes: originalTree.flattenedNodes,
242
- router: state.router,
243
- selectedPath: searchQuery ? undefined : state.currentRoute.paths.slice(1),
244
- })}>
245
- <slot
246
- name=${ElementBookSlotName.NavHeader}
247
- slot=${ElementBookSlotName.NavHeader}
248
- ></slot>
249
- </${BookNav}>
234
+ ${inputs.blockNavigation
235
+ ? nothing
236
+ : html `
237
+ <${BookNav.assign({
238
+ flattenedNodes: originalTree.flattenedNodes,
239
+ router: state.router,
240
+ selectedPath: searchQuery
241
+ ? undefined
242
+ : state.currentRoute.paths.slice(1),
243
+ })}>
244
+ <slot
245
+ name=${ElementBookSlotName.NavHeader}
246
+ slot=${ElementBookSlotName.NavHeader}
247
+ ></slot>
248
+ </${BookNav}>
249
+ `}
250
250
  <${BookEntryDisplay.assign({
251
+ blockNavigation: !!inputs.blockNavigation,
251
252
  controls: currentControls,
252
253
  currentNodes,
253
254
  currentRoute: state.currentRoute,
@@ -285,17 +286,3 @@ export const ElementBookApp = defineElement()({
285
286
  }
286
287
  },
287
288
  });
288
- async function scrollNav(host, searchQuery, currentRoutes) {
289
- /** If there is a search query, then there will be no selected nav to scroll to. */
290
- if (searchQuery) {
291
- return;
292
- }
293
- if (currentRoutes.paths.length <= 1) {
294
- return;
295
- }
296
- const navElement = host.shadowRoot.querySelector(BookNav.tagName);
297
- if (!(navElement instanceof BookNav)) {
298
- throw new TypeError(`Failed to find child '${BookNav.tagName}'`);
299
- }
300
- await scrollSelectedNavElementIntoView(navElement);
301
- }
@@ -23,6 +23,7 @@ export type OptionalConfig = {
23
23
  _debug: boolean;
24
24
  globalValues: GlobalValues;
25
25
  preventWindowTitleChange: boolean;
26
+ blockNavigation: boolean;
26
27
  } & RequireExactlyOne<Readonly<{
27
28
  /**
28
29
  * Set this internal router config if element-book is intended to be the current website's
@@ -3,6 +3,7 @@ import { type ControlsWrapper } from '../../../../data/book-entry/book-page/cont
3
3
  import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
4
4
  import { type BookRouter } from '../../../../routing/book-router.js';
5
5
  export declare const BookPageWrapper: import("element-vir").DeclarativeElementDefinition<"book-page-wrapper", {
6
+ blockNavigation: boolean;
6
7
  isTopLevel: boolean;
7
8
  pageNode: BookTreeNode<BookEntryType.Page>;
8
9
  router: BookRouter | undefined;
@@ -52,19 +52,24 @@ export const BookPageWrapper = defineBookElement()({
52
52
  if (error) {
53
53
  console.error(error);
54
54
  }
55
+ const headerTemplate = inputs.blockNavigation
56
+ ? titleTemplate
57
+ : html `
58
+ <${BookRouteLink.assign({
59
+ route: {
60
+ paths: linkPaths,
61
+ hash: undefined,
62
+ search: undefined,
63
+ },
64
+ router: inputs.router,
65
+ })}>
66
+ ${titleTemplate}
67
+ </${BookRouteLink}>
68
+ `;
55
69
  return html `
56
70
  <div class="page-header block-entry">
57
71
  <div class="title-group">
58
- <${BookRouteLink.assign({
59
- route: {
60
- paths: linkPaths,
61
- hash: undefined,
62
- search: undefined,
63
- },
64
- router: inputs.router,
65
- })}>
66
- ${titleTemplate}
67
- </${BookRouteLink}>
72
+ ${headerTemplate}
68
73
  ${error
69
74
  ? html `
70
75
  <${BookError.assign({ message: error.message })}></${BookError}>
@@ -1,7 +1,8 @@
1
1
  import { type BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
2
2
  import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
3
3
  import { type BookRouter } from '../../../../routing/book-router.js';
4
- export declare const BookElementExampleControls: import("element-vir").DeclarativeElementDefinition<"book-element-example-controls", {
4
+ export declare const BookElementExampleTitle: import("element-vir").DeclarativeElementDefinition<"book-element-example-title", {
5
+ blockNavigation: boolean;
5
6
  elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
6
7
  router: BookRouter | undefined;
7
- }, {}, {}, "book-element-example-controls-", "book-element-example-controls-", readonly [], readonly []>;
8
+ }, {}, {}, "book-element-example-title-", "book-element-example-title-", readonly [], readonly []>;
@@ -3,8 +3,8 @@ import { BookMainRoute } from '../../../../routing/book-routing.js';
3
3
  import { colorThemeCssVars } from '../../../color-theme/color-theme.js';
4
4
  import { BookRouteLink } from '../../common/book-route-link.element.js';
5
5
  import { defineBookElement } from '../../define-book-element.js';
6
- export const BookElementExampleControls = defineBookElement()({
7
- tagName: 'book-element-example-controls',
6
+ export const BookElementExampleTitle = defineBookElement()({
7
+ tagName: 'book-element-example-title',
8
8
  styles: css `
9
9
  :host {
10
10
  display: flex;
@@ -14,6 +14,9 @@ export const BookElementExampleControls = defineBookElement()({
14
14
  }
15
15
  `,
16
16
  render({ inputs }) {
17
+ if (inputs.blockNavigation) {
18
+ return inputs.elementExampleNode.entry.title;
19
+ }
17
20
  const linkPaths = [
18
21
  BookMainRoute.Book,
19
22
  ...inputs.elementExampleNode.fullUrlBreadcrumbs,
@@ -3,6 +3,7 @@ import { type BookPageControlsValues } from '../../../../data/book-entry/book-pa
3
3
  import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
4
4
  import { type BookRouter } from '../../../../routing/book-router.js';
5
5
  export declare const BookElementExampleWrapper: import("element-vir").DeclarativeElementDefinition<"book-element-example-wrapper", {
6
+ blockNavigation: boolean;
6
7
  elementExampleNode: BookTreeNode<BookEntryType.ElementExample>;
7
8
  currentPageControls: BookPageControlsValues;
8
9
  router: BookRouter | undefined;
@@ -1,8 +1,7 @@
1
- import { omitObjectKeys } from '@augment-vir/common';
2
1
  import { css, html } from 'element-vir';
3
2
  import { colorThemeCssVars } from '../../../color-theme/color-theme.js';
4
3
  import { defineBookElement } from '../../define-book-element.js';
5
- import { BookElementExampleControls } from './book-element-example-controls.element.js';
4
+ import { BookElementExampleTitle } from './book-element-example-title.element.js';
6
5
  import { BookElementExampleViewer } from './book-element-example-viewer.element.js';
7
6
  export const BookElementExampleWrapper = defineBookElement()({
8
7
  tagName: 'book-element-example-wrapper',
@@ -31,18 +30,22 @@ export const BookElementExampleWrapper = defineBookElement()({
31
30
  align-items: flex-start;
32
31
  }
33
32
 
34
- ${BookElementExampleControls} {
33
+ ${BookElementExampleTitle} {
35
34
  color: ${colorThemeCssVars['element-book-page-foreground-faint-level-1-color'].value};
36
35
  }
37
36
 
38
- :host(:hover) ${BookElementExampleControls} {
37
+ :host(:hover) ${BookElementExampleTitle} {
39
38
  color: ${colorThemeCssVars['element-book-accent-icon-color'].value};
40
39
  }
41
40
  `,
42
41
  render({ inputs }) {
43
42
  return html `
44
43
  <div class="individual-example-wrapper">
45
- <${BookElementExampleControls.assign(omitObjectKeys(inputs, ['currentPageControls']))}></${BookElementExampleControls}>
44
+ <${BookElementExampleTitle.assign({
45
+ blockNavigation: inputs.blockNavigation,
46
+ elementExampleNode: inputs.elementExampleNode,
47
+ router: inputs.router,
48
+ })}></${BookElementExampleTitle}>
46
49
  <${BookElementExampleViewer.assign(inputs)}></${BookElementExampleViewer}>
47
50
  </div>
48
51
  `;
@@ -4,6 +4,7 @@ import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js'
4
4
  import { type BookRouter } from '../../../../routing/book-router.js';
5
5
  import { type BookFullRoute } from '../../../../routing/book-routing.js';
6
6
  export declare const BookEntryDisplay: import("element-vir").DeclarativeElementDefinition<"book-entry-display", {
7
+ blockNavigation: boolean;
7
8
  controls: ControlsWrapper;
8
9
  currentNodes: ReadonlyArray<BookTreeNode>;
9
10
  currentRoute: Readonly<BookFullRoute>;
@@ -33,6 +33,7 @@ export const BookEntryDisplay = defineBookElement()({
33
33
  }
34
34
 
35
35
  .inline-entry {
36
+ display: inline-block;
36
37
  margin: 8px;
37
38
 
38
39
  &.block-entry {
@@ -78,6 +79,7 @@ export const BookEntryDisplay = defineBookElement()({
78
79
  render: ({ inputs, dispatch, events, state, updateState }) => {
79
80
  const currentSearch = extractSearchQuery(inputs.currentRoute.paths);
80
81
  const entryTemplates = createNodeTemplates({
82
+ blockNavigation: inputs.blockNavigation,
81
83
  currentNodes: inputs.currentNodes,
82
84
  isTopLevel: true,
83
85
  router: inputs.router,
@@ -3,7 +3,8 @@ import { BookEntryType } from '../../../../data/book-entry/book-entry-type.js';
3
3
  import { type ControlsWrapper } from '../../../../data/book-entry/book-page/controls-wrapper.js';
4
4
  import { type BookTreeNode } from '../../../../data/book-tree/book-tree-node.js';
5
5
  import { type BookRouter } from '../../../../routing/book-router.js';
6
- export declare function createNodeTemplates({ currentNodes, isTopLevel, router, isSearching, controls, originalTree, }: {
6
+ export declare function createNodeTemplates({ blockNavigation, currentNodes, isTopLevel, router, isSearching, controls, originalTree, }: {
7
+ blockNavigation: boolean;
7
8
  currentNodes: ReadonlyArray<BookTreeNode>;
8
9
  isTopLevel: boolean;
9
10
  router: BookRouter | undefined;
@@ -45,7 +45,7 @@ function getFlattenedControlsFromHiddenParents(currentNodes, currentControls, cu
45
45
  };
46
46
  }, { config: {}, current: {}, breadcrumbs: {} });
47
47
  }
48
- export function createNodeTemplates({ currentNodes, isTopLevel, router, isSearching, controls, originalTree, }) {
48
+ export function createNodeTemplates({ blockNavigation, currentNodes, isTopLevel, router, isSearching, controls, originalTree, }) {
49
49
  if (!currentNodes.length && isSearching) {
50
50
  return [
51
51
  html `
@@ -71,6 +71,7 @@ export function createNodeTemplates({ currentNodes, isTopLevel, router, isSearch
71
71
  if (isBookTreeNode(currentNode, BookEntryType.Page)) {
72
72
  return html `
73
73
  <${BookPageWrapper.assign({
74
+ blockNavigation,
74
75
  isTopLevel,
75
76
  pageNode: currentNode,
76
77
  controls,
@@ -84,6 +85,7 @@ export function createNodeTemplates({ currentNodes, isTopLevel, router, isSearch
84
85
  const controlsForElementExample = traverseControls(controls, currentNode.fullUrlBreadcrumbs.slice(0, -1));
85
86
  const content = html `
86
87
  <${BookElementExampleWrapper.assign({
88
+ blockNavigation,
87
89
  elementExampleNode: currentNode,
88
90
  currentPageControls: controlsForElementExample,
89
91
  router,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "element-book",
3
- "version": "26.14.1",
3
+ "version": "26.15.0",
4
4
  "keywords": [
5
5
  "book",
6
6
  "design system",
@@ -14,7 +14,7 @@
14
14
  "storybook",
15
15
  "system"
16
16
  ],
17
- "homepage": "https://electrovir.github.io/element-book/element-book",
17
+ "homepage": "https://electrovir.github.io/element-book",
18
18
  "bugs": {
19
19
  "url": "https://github.com/electrovir/element-book/issues"
20
20
  },
@@ -41,29 +41,29 @@
41
41
  "test:docs": "virmator docs check"
42
42
  },
43
43
  "dependencies": {
44
- "@augment-vir/assert": "^31.57.3",
45
- "@augment-vir/common": "^31.57.3",
46
- "@augment-vir/web": "^31.57.3",
47
- "colorjs.io": "0.5.2",
44
+ "@augment-vir/assert": "^31.58.0",
45
+ "@augment-vir/common": "^31.58.0",
46
+ "@augment-vir/web": "^31.58.0",
47
+ "colorjs.io": "^0.6.0",
48
48
  "date-vir": "^8.1.0",
49
49
  "lit-css-vars": "^3.0.11",
50
50
  "spa-router-vir": "^6.4.1",
51
51
  "typed-event-target": "^4.1.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@augment-vir/test": "^31.57.3",
54
+ "@augment-vir/test": "^31.58.0",
55
55
  "@web/dev-server-esbuild": "^1.0.4",
56
56
  "@web/test-runner": "^0.20.2",
57
57
  "@web/test-runner-commands": "^0.9.0",
58
58
  "@web/test-runner-playwright": "^0.11.1",
59
59
  "@web/test-runner-visual-regression": "^0.10.0",
60
- "element-vir": "^26.14.0",
60
+ "element-vir": "^26.14.1",
61
61
  "istanbul-smart-text-reporter": "^1.1.5",
62
62
  "markdown-code-example-inserter": "^3.0.3",
63
- "type-fest": "^5.3.1",
64
- "typedoc": "^0.28.15",
63
+ "type-fest": "^5.4.1",
64
+ "typedoc": "^0.28.16",
65
65
  "typescript": "5.9.3",
66
- "vira": "^28.13.0"
66
+ "vira": "^28.19.5"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "element-vir": ">=17",