@unofficialbox/box-open-elements 0.21.0 → 0.23.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.
Files changed (115) hide show
  1. package/README.md +13 -12
  2. package/dist/components/actions/menu-item.js +1 -1
  3. package/dist/components/actions/menu.js +1 -1
  4. package/dist/components/collections/carousel.js +1 -1
  5. package/dist/components/collections/draggable-list.js +1 -1
  6. package/dist/components/collections/grid-view.js +1 -1
  7. package/dist/components/collections/pagination.js +1 -1
  8. package/dist/components/collections/result-blocks.d.ts +13 -1
  9. package/dist/components/collections/result-blocks.js +22 -10
  10. package/dist/components/collections/tree-grid.js +1 -1
  11. package/dist/components/feedback/alert.js +1 -1
  12. package/dist/components/feedback/chip.js +1 -1
  13. package/dist/components/feedback/empty-state.js +1 -1
  14. package/dist/components/feedback/nudge.js +1 -1
  15. package/dist/components/feedback/status-icon.d.ts +2 -0
  16. package/dist/components/feedback/status-icon.js +6 -5
  17. package/dist/components/feedback/toast.js +1 -1
  18. package/dist/components/files/drop-zone.js +1 -1
  19. package/dist/components/forms/category-selector.js +1 -1
  20. package/dist/components/forms/checkbox-group.js +1 -1
  21. package/dist/components/forms/checkbox.js +1 -1
  22. package/dist/components/forms/combobox.js +1 -1
  23. package/dist/components/forms/date-field.js +1 -1
  24. package/dist/components/forms/dropdown.js +1 -1
  25. package/dist/components/forms/multi-select.js +1 -1
  26. package/dist/components/forms/number-input.js +1 -1
  27. package/dist/components/forms/radio-group.js +1 -1
  28. package/dist/components/forms/range-slider.js +1 -1
  29. package/dist/components/forms/slider.js +1 -1
  30. package/dist/components/forms/tile-group.js +1 -1
  31. package/dist/components/layout/sidebar-toggle-button.js +1 -1
  32. package/dist/components/navigation/accordion.js +1 -1
  33. package/dist/components/navigation/tabs.js +1 -1
  34. package/dist/components/output/code-block.js +1 -1
  35. package/dist/components/overlays/dialog.js +1 -1
  36. package/dist/components/overlays/drawer.js +1 -1
  37. package/dist/components/overlays/guide-tooltip.js +1 -1
  38. package/dist/components/overlays/popover.js +1 -1
  39. package/dist/components/overlays/tooltip.js +1 -1
  40. package/dist/foundations/motion/scroll-pin.d.ts +10 -2
  41. package/dist/foundations/motion/scroll-pin.js +43 -7
  42. package/dist/foundations/motion/tokens.d.ts +1 -0
  43. package/dist/foundations/motion/tokens.js +1 -0
  44. package/dist/foundations/profiles/built-ins.js +8 -0
  45. package/dist/foundations/profiles/registry.d.ts +1 -0
  46. package/dist/foundations/profiles/registry.js +1 -0
  47. package/dist/foundations/profiles/types.d.ts +1 -0
  48. package/dist/foundations/status/index.d.ts +4 -2
  49. package/dist/foundations/status/index.js +10 -6
  50. package/dist/foundations/theming/controller.js +3 -1
  51. package/dist/foundations/tokens/box-defaults.d.ts +2 -0
  52. package/dist/foundations/tokens/box-defaults.js +32 -5
  53. package/dist/foundations/tokens/index.d.ts +1 -1
  54. package/dist/foundations/tokens/index.js +1 -1
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.js +1 -1
  57. package/dist/patterns/agent-chat/agent-chat.js +9 -10
  58. package/dist/patterns/agent-chat/controller.js +8 -4
  59. package/dist/patterns/agent-chat/ndjson.d.ts +1 -0
  60. package/dist/patterns/agent-chat/ndjson.js +20 -4
  61. package/dist/patterns/agent-chat/types.d.ts +7 -0
  62. package/dist/patterns/agent-workspace/agent-workspace.d.ts +13 -1
  63. package/dist/patterns/agent-workspace/agent-workspace.js +47 -15
  64. package/dist/patterns/agent-workspace/controller.d.ts +7 -1
  65. package/dist/patterns/agent-workspace/controller.js +41 -3
  66. package/dist/patterns/call-console/call-console.d.ts +10 -0
  67. package/dist/patterns/call-console/call-console.js +23 -8
  68. package/dist/patterns/call-console/controller.d.ts +2 -1
  69. package/dist/patterns/call-console/controller.js +5 -3
  70. package/dist/patterns/call-console/http-transport.js +13 -2
  71. package/dist/patterns/call-console/types.d.ts +1 -1
  72. package/dist/patterns/call-console/types.js +2 -2
  73. package/dist/patterns/comments/comment-thread.js +1 -1
  74. package/dist/patterns/content-explorer/adapters/action-menu.js +1 -1
  75. package/dist/patterns/content-explorer/adapters/list.js +1 -1
  76. package/dist/patterns/content-explorer/adapters/table.js +1 -1
  77. package/dist/patterns/content-explorer/adapters/toolbar.js +1 -1
  78. package/dist/patterns/content-uploader/content-uploader.js +1 -1
  79. package/dist/patterns/file-request/file-request-builder.js +1 -1
  80. package/dist/patterns/flow-builder/flow-builder.d.ts +45 -14
  81. package/dist/patterns/flow-builder/flow-builder.js +54 -11
  82. package/dist/patterns/flow-builder/model.d.ts +57 -9
  83. package/dist/patterns/flow-builder/model.js +20 -8
  84. package/dist/patterns/flow-builder/primitives.d.ts +17 -7
  85. package/dist/patterns/flow-builder/primitives.js +80 -16
  86. package/dist/patterns/governance/governance-panel.js +1 -1
  87. package/dist/patterns/insights/chart-panel.js +1 -1
  88. package/dist/patterns/insights/metric-card.js +1 -1
  89. package/dist/patterns/item/bulk-action-bar.js +1 -1
  90. package/dist/patterns/item/item-details-panel.js +1 -1
  91. package/dist/patterns/item/item-form.js +1 -1
  92. package/dist/patterns/item/preview-header.js +1 -1
  93. package/dist/patterns/metadata/metadata-filter-builder.js +1 -1
  94. package/dist/patterns/metadata/metadata-inspector.js +1 -1
  95. package/dist/patterns/preview/annotation-inspector.js +1 -1
  96. package/dist/patterns/preview/annotation-toolbar.js +1 -1
  97. package/dist/patterns/run/progress.d.ts +1 -1
  98. package/dist/patterns/run/progress.js +1 -1
  99. package/dist/patterns/run/run-summary.js +18 -4
  100. package/dist/patterns/run/run-trace.js +19 -5
  101. package/dist/patterns/search/filter-bar.js +1 -1
  102. package/dist/patterns/search/saved-view-picker.js +1 -1
  103. package/dist/patterns/search/search-results-header.js +1 -1
  104. package/dist/patterns/share/invite-collaborators-modal.js +1 -1
  105. package/dist/patterns/share/permission-matrix.js +1 -1
  106. package/dist/patterns/share/share-panel.js +1 -1
  107. package/dist/patterns/share/unified-share-modal.js +1 -1
  108. package/dist/patterns/task/review-queue-item.js +1 -1
  109. package/dist/patterns/task/task-assignment-panel.js +1 -1
  110. package/dist/patterns/undo/index.js +5 -3
  111. package/docs/api-guidelines.md +284 -0
  112. package/docs/foundations/motion.md +83 -0
  113. package/docs/patterns/agent-ui-guidelines.md +57 -0
  114. package/docs/patterns/agent-ui.md +197 -0
  115. package/package.json +6 -2
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  Browse the full catalog on the **[live docs site](https://unofficialbox.github.io/box-open-elements)** — live previews, an events/properties inspector, per-framework code snippets (React / Angular / Vue / Svelte / HTML), and the foundations pages.
14
14
 
15
- The library is organized around three layers (see [docs/taxonomy.md](./docs/taxonomy.md) for the canonical model):
15
+ The library is organized around three layers (see [taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/taxonomy.md) for the canonical model):
16
16
 
17
17
  - **Foundations** — design decisions as data: tokens, color, typography, iconography, accessibility, theming
18
18
  - **Components** — accessible Web Components for single controls, organized by category
@@ -75,7 +75,7 @@ selection.toggleSelection("1");
75
75
  - optimized component entrypoints: `@unofficialbox/box-open-elements/<name>`
76
76
  - patterns: `@unofficialbox/box-open-elements/patterns/<area>` and `@unofficialbox/box-open-elements/patterns/<area>/<module>`
77
77
 
78
- See [docs/api-guidelines.md](./docs/api-guidelines.md).
78
+ See the versioned [API guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/api-guidelines.md).
79
79
 
80
80
  ## Developing
81
81
 
@@ -89,16 +89,17 @@ bun run docs # build + serve the docs site at http://localhost:4600
89
89
 
90
90
  ## Documentation
91
91
 
92
- The docs index is at [docs/README.md](./docs/README.md). The most important entries:
93
-
94
- - [Taxonomy](./docs/taxonomy.md)
95
- - [Architecture](./docs/architecture.md)
96
- - [API Guidelines](./docs/api-guidelines.md)
97
- - [Components catalog](./docs/components/catalog.md) and [patterns catalog](./docs/patterns/catalog.md)
98
- - [Using with React, Angular, Vue, and Svelte](./docs/integration/frameworks.md)
99
- - [Design Tokens](./docs/foundations/tokens.md)
100
- - [Content Explorer](./docs/patterns/content-explorer.md)
101
- - [Box Server Integration](./docs/integration/box-server.md)
92
+ The versioned docs index is at [docs/README.md](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/README.md). The most important entries:
93
+
94
+ - [Taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/taxonomy.md)
95
+ - [Architecture](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/architecture.md)
96
+ - [API Guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/api-guidelines.md)
97
+ - [Components catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/components/catalog.md) and [patterns catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/patterns/catalog.md)
98
+ - [Using with React, Angular, Vue, and Svelte](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/integration/frameworks.md)
99
+ - [Design Tokens](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/foundations/tokens.md)
100
+ - [Content Explorer](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/patterns/content-explorer.md)
101
+ - [Box Server Integration](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/integration/box-server.md)
102
+ - [Agent UI guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/patterns/agent-ui-guidelines.md), [building blocks](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/patterns/agent-ui.md), and [motion](https://github.com/unofficialbox/box-open-elements/blob/v0.23.0/docs/foundations/motion.md)
102
103
 
103
104
  ## Contributing
104
105
 
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeControl, boeOverlay } from "../../foundations/geometry/index.js";
3
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
3
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
4
4
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-menu-item";
6
6
  const menuItemStyles = `
@@ -1,7 +1,7 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { applyRovingTabindex, focusRovingItem, nextRovingIndex, } from "../../foundations/a11y/index.js";
3
3
  import { boeControl, boeOverlay, boeSpace } from "../../foundations/geometry/index.js";
4
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
4
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
5
5
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
6
6
  const DEFAULT_TAG_NAME = "box-menu";
7
7
  const escapeHtml = (value) => value
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-carousel";
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeRadius } from "../../foundations/geometry/index.js";
4
4
  const DEFAULT_TAG_NAME = "box-draggable-list";
5
5
  const escapeHtml = (value) => value
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  import { boxIconography } from "../../foundations/icons/index.js";
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-pagination";
@@ -1,5 +1,11 @@
1
1
  import { BaseElement } from "../../core/element.js";
2
2
  export type CheckStatus = "pass" | "warn" | "fail" | "info";
3
+ export type ResultLabels = Record<CheckStatus, string>;
4
+ export interface ResultRenderOptions {
5
+ labels?: Partial<ResultLabels>;
6
+ linkSuffix?: string;
7
+ selectableDocuments?: boolean;
8
+ }
3
9
  export type ResultBlock = {
4
10
  id?: string;
5
11
  } & ({
@@ -40,13 +46,19 @@ export type ResultBlock = {
40
46
  });
41
47
  export declare const resultDocumentIds: (blocks: readonly ResultBlock[]) => string[];
42
48
  /** Pure escaped renderer also usable by host-composed conversations. */
43
- export declare function renderResultBlock(block: ResultBlock): string;
49
+ export declare function renderResultBlock(block: ResultBlock, options?: ResultRenderOptions): string;
44
50
  export declare const resultBlockStyles: string;
45
51
  export declare class ResultBlocks extends BaseElement {
46
52
  static readonly tagName: string;
53
+ static get observedAttributes(): string[];
47
54
  private value;
55
+ private verdictLabels;
48
56
  get blocks(): ResultBlock[];
49
57
  set blocks(value: ResultBlock[]);
58
+ get labels(): Partial<ResultLabels>;
59
+ set labels(value: Partial<ResultLabels>);
60
+ get selectableDocuments(): boolean;
61
+ set selectableDocuments(value: boolean);
50
62
  get documentIds(): string[];
51
63
  protected renderTemplate(): void;
52
64
  protected setupListeners(): void;
@@ -1,28 +1,30 @@
1
1
  import { BaseElement } from "../../core/element.js";
2
2
  import { isSafeHref } from "../../patterns/internal/safe-href.js";
3
- import { boeStatusGlyph, boeStatusStyles, statusLabel, toStatusKind } from "../../foundations/status/index.js";
3
+ import { boeStatusGlyph, boeStatusStyles, toStatusKind } from "../../foundations/status/index.js";
4
4
  import { boeEntrance, boeEntranceKeyframes, boeReducedMotionPolicy, boeStaggerStyles } from "../../foundations/motion/index.js";
5
5
  const escape = (s) => s.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6
- const verdict = (s) => ({ pass: "Within policy", warn: "Needs exception", fail: "Outside policy", info: "Information" })[s];
6
+ const defaultLabels = { pass: "Within policy", warn: "Needs exception", fail: "Outside policy", info: "Information" };
7
+ const verdict = (s, labels = {}) => labels[s] ?? defaultLabels[s];
7
8
  const glyph = (s) => boeStatusGlyph(toStatusKind(s));
8
9
  export const resultDocumentIds = (blocks) => [...new Set(blocks.flatMap(b => b.type === "documents" ? b.items.map(i => i.id) : []))];
9
10
  /** Pure escaped renderer also usable by host-composed conversations. */
10
- export function renderResultBlock(block) {
11
+ export function renderResultBlock(block, options = {}) {
11
12
  const heading = block.title ? `<h3 part="title">${escape(block.title)}</h3>` : "";
12
13
  if (block.type === "facts")
13
14
  return `${heading}<dl part="facts">${block.rows.map(r => `<div part="row"><dt>${escape(r.label)}</dt><dd>${escape(r.value)}</dd></div>`).join("")}</dl>`;
14
15
  if (block.type === "checks")
15
- return `${heading}<ul part="checks">${block.rows.map(r => `<li part="row">${glyph(r.status)}<div><strong>${escape(r.label)}</strong>${r.detail ? `<p>${escape(r.detail)}</p>` : ""}</div><span part="verdict" data-status="${r.status}">${escape(r.value ?? verdict(r.status))}</span></li>`).join("")}</ul>`;
16
+ return `${heading}<ul part="checks">${block.rows.map(r => `<li part="row">${glyph(r.status)}<div><strong>${escape(r.label)}</strong>${r.detail ? `<p>${escape(r.detail)}</p>` : ""}</div><span part="verdict" data-status="${r.status}">${escape(r.value ?? verdict(r.status, options.labels))}</span></li>`).join("")}</ul>`;
16
17
  if (block.type === "documents")
17
18
  return `${heading}<ul part="documents">${block.items.map(i => {
18
19
  const content = `<svg aria-hidden="true" width="16" height="20" viewBox="0 0 16 20"><path d="M2 1h8l4 4v14H2zM10 1v5h4" fill="none" stroke="currentColor"/></svg><span><strong>${escape(i.name)}</strong>${i.detail ? `<small>${escape(i.detail)}</small>` : ""}</span>`;
19
- return `<li part="row">${i.href && isSafeHref(i.href) ? `<a part="document" data-document-id="${escape(i.id)}" href="${escape(i.href)}" target="_blank" rel="noopener noreferrer">${content}</a>` : `<button part="document" data-document-id="${escape(i.id)}">${content}</button>`}</li>`;
20
+ const link = i.href && isSafeHref(i.href);
21
+ return `<li part="row">${link ? `<a part="document" data-document-id="${escape(i.id)}" href="${escape(i.href)}" target="_blank" rel="noopener noreferrer">${content}<span part="external" aria-hidden="true">↗</span><span class="sr">${escape(options.linkSuffix ?? " (opens in new tab)")}</span></a>` : options.selectableDocuments ? `<button part="document" data-document-id="${escape(i.id)}">${content}</button>` : `<span part="document">${content}</span>`}</li>`;
20
22
  }).join("")}</ul>`;
21
- return `${heading}<div part="table-frame" role="region" aria-label="${escape(block.title ?? "Results")}" tabindex="0"><table><thead><tr>${block.columns.map(c => `<th scope="col">${escape(c)}</th>`).join("")}</tr></thead><tbody>${block.rows.map(r => `<tr>${r.cells.map((cell, index) => index === 0 ? `<th scope="row">${r.status ? `${glyph(r.status)}<span class="sr">${statusLabel(toStatusKind(r.status))}: </span>` : ""}${escape(cell)}${r.note ? `<small>${escape(r.note)}</small>` : ""}</th>` : `<td>${escape(cell)}</td>`).join("")}</tr>`).join("")}</tbody></table></div>${block.footnote ? `<p>${escape(block.footnote)}</p>` : ""}`;
23
+ return `${heading}<div part="table-frame" role="region" aria-label="${escape(block.title ?? "Results")}" tabindex="0"><table><thead><tr>${block.columns.map(c => `<th scope="col">${escape(c)}</th>`).join("")}</tr></thead><tbody>${block.rows.map(r => `<tr>${r.cells.map((cell, index) => index === 0 ? `<th scope="row">${r.status ? glyph(r.status) : ""}${escape(cell)}${r.note ? `<small>${escape(r.note)}</small>` : r.status ? `<span class="sr"> (${escape(verdict(r.status, options.labels))})</span>` : ""}</th>` : `<td>${escape(cell)}</td>`).join("")}</tr>`).join("")}</tbody></table></div>${block.footnote ? `<p>${escape(block.footnote)}</p>` : ""}`;
22
24
  }
23
25
  export const resultBlockStyles = `
24
26
  :host { display:block; min-width:0; color:var(--boe-token-text-text,#222); font:inherit; }
25
- :host([hidden]){display:none !important} *{box-sizing:border-box} h3{font-size:1em;margin:0 0 .5rem} dl,ul{padding:0;margin:0;list-style:none}
27
+ :host([hidden]){display:none !important} *{box-sizing:border-box} h3{font-size:var(--boe-result-title-size,1em);margin:0 0 .5rem} :host([title-style="eyebrow"]) h3{font-size:.72em;letter-spacing:.08em;text-transform:uppercase;color:var(--boe-token-text-text-secondary,#666)} dl,ul{padding:0;margin:0;list-style:none}
26
28
  [part="row"]{border-bottom:1px solid var(--boe-token-stroke-stroke,#ddd);padding:.7rem 0;display:flex;gap:.6rem;align-items:baseline}
27
29
  dt{color:var(--boe-token-text-text-secondary,#666)} dd{margin:0 0 0 auto;font-variant-numeric:tabular-nums}
28
30
  [part="facts"] [part="row"]{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);overflow-wrap:anywhere}
@@ -31,17 +33,25 @@ dt{color:var(--boe-token-text-text-secondary,#666)} dd{margin:0 0 0 auto;font-va
31
33
  p{margin:.25rem 0;color:var(--boe-token-text-text-secondary,#666)} small{display:block;font-weight:normal;color:var(--boe-token-text-text-secondary,#666)}
32
34
  [part="verdict"]{margin-left:auto;text-align:right} [data-status="warn"]{color:var(--boe-token-text-status-text-warning,#946400)} [data-status="fail"]{color:var(--boe-token-text-status-text-error,#c52a46)}
33
35
  [part="document"]{display:flex;gap:.6rem;align-items:center;width:100%;text-align:left;color:inherit;font:inherit;background:none;border:0;text-decoration:none;cursor:pointer}
34
- [part="table-frame"]{overflow:auto;max-width:100%} table{border-collapse:collapse;min-width:100%;font-variant-numeric:tabular-nums} td,th{padding:.7rem;text-align:left;border-bottom:1px solid var(--boe-token-stroke-stroke,#ddd)} td:last-child{font-weight:600;background:var(--boe-token-surface-surface-secondary,#f7f7f7)}
36
+ span[part="document"]{cursor:default}
37
+ [part="table-frame"]{overflow:auto;max-width:100%} table{border-collapse:collapse;min-width:100%;font-variant-numeric:tabular-nums} td,th{padding:.7rem;text-align:left;border-bottom:1px solid var(--boe-token-stroke-stroke,#ddd)} td:last-child{font-weight:600}
35
38
  .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
36
39
  [part="block"]{${boeEntrance()}${boeStaggerStyles};margin-block:1rem;min-width:0;container:boe-result-block / inline-size}
37
40
  ${boeEntranceKeyframes}${boeStatusStyles}${boeReducedMotionPolicy}`;
38
41
  const DEFAULT_TAG_NAME = "box-result-blocks";
39
42
  export class ResultBlocks extends BaseElement {
40
43
  static tagName = DEFAULT_TAG_NAME;
44
+ static get observedAttributes() { return ["title-style", "link-suffix", "selectable-documents"]; }
41
45
  value = [];
46
+ verdictLabels = {};
42
47
  get blocks() { return this.value; }
43
48
  set blocks(value) { this.value = value; if (this.isRendered)
44
49
  this.update(); }
50
+ get labels() { return this.verdictLabels; }
51
+ set labels(value) { this.verdictLabels = value; if (this.isRendered)
52
+ this.update(); }
53
+ get selectableDocuments() { return this.hasAttribute("selectable-documents"); }
54
+ set selectableDocuments(value) { this.toggleAttribute("selectable-documents", value); }
45
55
  get documentIds() { return resultDocumentIds(this.value); }
46
56
  renderTemplate() { this.shadowRoot.innerHTML = `<style>${resultBlockStyles}</style><div part="blocks"></div>`; }
47
57
  setupListeners() {
@@ -55,15 +65,17 @@ export class ResultBlocks extends BaseElement {
55
65
  const parent = this.shadowRoot.querySelector('[part="blocks"]');
56
66
  this.value.forEach((block, index) => {
57
67
  let node = parent.children[index];
58
- const signature = JSON.stringify(block);
68
+ const options = { labels: this.verdictLabels, linkSuffix: this.getAttribute("link-suffix") ?? undefined, selectableDocuments: this.selectableDocuments };
69
+ const signature = JSON.stringify([block, options]);
59
70
  if (!node) {
60
71
  node = document.createElement("section");
61
72
  node.setAttribute("part", "block");
62
73
  parent.append(node);
63
74
  }
75
+ node.setAttribute("aria-label", block.title ?? ({ facts: "Facts", checks: "Checks", table: "Results", documents: "Documents" }[block.type]));
64
76
  node.style.setProperty("--i", String(index));
65
77
  if (node.dataset.signature !== signature) {
66
- node.innerHTML = renderResultBlock(block);
78
+ node.innerHTML = renderResultBlock(block, options);
67
79
  node.dataset.signature = signature;
68
80
  }
69
81
  });
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
2
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-tree-grid";
@@ -2,7 +2,7 @@ import { BaseElement } from "../../core/index.js";
2
2
  import { FeedbackAnnouncement } from "../../foundations/a11y/announcer.js";
3
3
  import { toneAccessibleLabel, toneIcon } from "./tone.js";
4
4
  import { boeRadius, boeSpace } from "../../foundations/geometry/index.js";
5
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
5
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
6
6
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
7
7
  const DEFAULT_TAG_NAME = "box-alert";
8
8
  const alertStyles = `
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/index.js";
2
+ import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  const DEFAULT_TAG_NAME = "box-chip";
5
5
  const chipStyles = `
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeRadius } from "../../foundations/geometry/index.js";
3
- import { boeBrandInteractiveStyles } from "../../foundations/tokens/index.js";
3
+ import { boeBrandInteractiveStyles } from "../../foundations/tokens/interaction.js";
4
4
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-empty-state";
6
6
  const emptyStateStyles = `
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeRadius } from "../../foundations/geometry/index.js";
3
- import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/index.js";
3
+ import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/interaction.js";
4
4
  const DEFAULT_TAG_NAME = "box-nudge";
5
5
  const nudgeStyles = `
6
6
  :host {
@@ -5,6 +5,8 @@ export declare class StatusIcon extends BaseElement {
5
5
  static get observedAttributes(): string[];
6
6
  get kind(): StatusKind;
7
7
  set kind(value: StatusKind);
8
+ get label(): string;
9
+ set label(value: string);
8
10
  protected renderTemplate(): void;
9
11
  protected update(): void;
10
12
  }
@@ -1,16 +1,17 @@
1
1
  import { BaseElement } from "../../core/element.js";
2
- import { boeStatusGlyph, boeStatusStyles, statusLabel, toStatusKind } from "../../foundations/status/index.js";
3
- import { boeEntranceKeyframes, boeReducedMotionPolicy } from "../../foundations/motion/index.js";
2
+ import { boeStatusDocumentStyles, boeStatusGlyph, statusLabel, toStatusKind } from "../../foundations/status/index.js";
4
3
  const DEFAULT_TAG_NAME = "box-status-icon";
5
4
  export class StatusIcon extends BaseElement {
6
5
  static tagName = DEFAULT_TAG_NAME;
7
- static get observedAttributes() { return ["kind"]; }
6
+ static get observedAttributes() { return ["kind", "label"]; }
8
7
  get kind() { return toStatusKind(this.getAttribute("kind") ?? "pending"); }
9
8
  set kind(value) { this.setAttribute("kind", value); }
9
+ get label() { return this.getAttribute("label") ?? statusLabel(this.kind); }
10
+ set label(value) { this.setAttribute("label", value); }
10
11
  renderTemplate() {
11
12
  this.shadowRoot.innerHTML = `<style>:host{display:inline-flex} :host([hidden]){display:none !important}
12
13
  .label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
13
- ${boeEntranceKeyframes}${boeStatusStyles}${boeReducedMotionPolicy}</style><span part="glyph"></span><span class="label" part="label"></span>`;
14
+ ${boeStatusDocumentStyles}</style><span part="glyph"></span><span class="label" part="label"></span>`;
14
15
  }
15
16
  update() {
16
17
  if (!this.isRendered)
@@ -20,7 +21,7 @@ export class StatusIcon extends BaseElement {
20
21
  glyph.setAttribute("data-kind", this.kind);
21
22
  glyph.innerHTML = boeStatusGlyph(this.kind);
22
23
  }
23
- this.shadowRoot.querySelector('[part="label"]').textContent = statusLabel(this.kind);
24
+ this.shadowRoot.querySelector('[part="label"]').textContent = this.label;
24
25
  }
25
26
  }
26
27
  StatusIcon.register();
@@ -2,7 +2,7 @@ import { BaseElement } from "../../core/index.js";
2
2
  import { FeedbackAnnouncement } from "../../foundations/a11y/announcer.js";
3
3
  import { toneAccessibleLabel, toneIcon } from "./tone.js";
4
4
  import { boeRadius, boeSpace } from "../../foundations/geometry/index.js";
5
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
5
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
6
6
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
7
7
  const DEFAULT_TAG_NAME = "box-toast";
8
8
  const TOAST_MODES = new Set(["dismissible", "sticky"]);
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { captureDropEntries, collectEntries, entriesFromFileList, } from "../../foundations/files/index.js";
3
- import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/index.js";
3
+ import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/interaction.js";
4
4
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
5
5
  import { boeRadius } from "../../foundations/geometry/index.js";
6
6
  const DEFAULT_TAG_NAME = "box-drop-zone";
@@ -1,7 +1,7 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
3
3
  import { boeOverlay, boeRadius } from "../../foundations/geometry/index.js";
4
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
4
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
5
5
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
6
6
  const DEFAULT_TAG_NAME = "box-category-selector";
7
7
  const escapeHtml = (value) => value
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formDataFromNamedValues, formErrorMessageMarkup, stringValuesFromFormValue, } from "../../core/index.js";
2
- import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/index.js";
2
+ import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-checkbox-group";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
2
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeControl, boeRadius, boeSpace } from "../../foundations/geometry/index.js";
4
4
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-checkbox";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeOverlay, boeRadius } from "../../foundations/geometry/index.js";
5
5
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, boeFormFieldSupportStyles, formDescriptionMarkup, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-date-field";
@@ -1,7 +1,7 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formErrorMessageMarkup, } from "../../core/index.js";
2
2
  import { boeControl, boeOverlay, boeRadius, boeSpace } from "../../foundations/geometry/index.js";
3
3
  import { FocusRestore, applyRovingTabindex, focusRovingItem, nextRovingIndex, } from "../../foundations/a11y/index.js";
4
- import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/index.js";
4
+ import { boeFocusVisibleStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/interaction.js";
5
5
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
6
6
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
7
7
  const DEFAULT_TAG_NAME = "box-dropdown";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formDataFromNamedValues, formErrorMessageMarkup, stringValuesFromFormValue, } from "../../core/index.js";
2
- import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/index.js";
2
+ import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-multi-select";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, boeFormFieldSupportStyles, formDescriptionMarkup, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeControl, boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-number-input";
@@ -1,5 +1,5 @@
1
1
  import { FORM_ERROR_MESSAGE_ID, FormAssociatedElement, boeFormFieldErrorStyles, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/index.js";
2
+ import { boeFocusRingShadow, boeFocusVisibleStyles, } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-radio-group";
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formDataFromRange, formErrorMessageMarkup, rangeFromFormValue, } from "../../core/index.js";
2
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
2
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
3
3
  const DEFAULT_TAG_NAME = "box-range-slider";
4
4
  const parseNumber = (value, fallback) => {
5
5
  if (value == null || value === "") {
@@ -1,5 +1,5 @@
1
1
  import { FormAssociatedElement, boeFormFieldErrorStyles, formErrorMessageMarkup, } from "../../core/index.js";
2
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
2
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
3
3
  const DEFAULT_TAG_NAME = "box-slider";
4
4
  const parseNumber = (value, fallback) => {
5
5
  if (value == null || value === "") {
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeRadius } from "../../foundations/geometry/index.js";
3
- import { boeFocusRingShadow } from "../../foundations/tokens/index.js";
3
+ import { boeFocusRingShadow } from "../../foundations/tokens/interaction.js";
4
4
  const DEFAULT_TAG_NAME = "box-tile-group";
5
5
  const escapeHtml = (value) => value
6
6
  .replaceAll("&", "&amp;")
@@ -1,5 +1,5 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
2
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
3
3
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
4
4
  import { boeRadius } from "../../foundations/geometry/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-sidebar-toggle-button";
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeRadius } from "../../foundations/geometry/index.js";
3
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
3
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
4
4
  const DEFAULT_TAG_NAME = "box-accordion";
5
5
  const escapeHtml = (value) => value
6
6
  .replaceAll("&", "&amp;")
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeControl, boeRadius, boeSpace } from "../../foundations/geometry/index.js";
3
- import { boeFocusVisibleStyles, } from "../../foundations/tokens/index.js";
3
+ import { boeFocusVisibleStyles, } from "../../foundations/tokens/interaction.js";
4
4
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
5
5
  const DEFAULT_TAG_NAME = "box-tabs";
6
6
  const escapeHtml = (value) => value
@@ -1,6 +1,6 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { boeRadius } from "../../foundations/geometry/index.js";
3
- import { boeFocusVisibleStyles } from "../../foundations/tokens/index.js";
3
+ import { boeFocusVisibleStyles } from "../../foundations/tokens/interaction.js";
4
4
  const DEFAULT_TAG_NAME = "box-code-block";
5
5
  const COPY_ICON = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" focusable="false"><rect x="5.5" y="5.5" width="8" height="8" rx="1.5"/><path d="M10.5 3.5v-1a1 1 0 00-1-1h-7a1 1 0 00-1 1v7a1 1 0 001 1h1"/></svg>`;
6
6
  const COPIED_ICON = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M3 8.5l3.2 3.2L13 5"/></svg>`;
@@ -2,7 +2,7 @@ import { BaseElement } from "../../core/index.js";
2
2
  import { dismissModal, promoteModal } from "../../foundations/overlay/index.js";
3
3
  import { FocusRestore, trapTabKey } from "../../foundations/a11y/index.js";
4
4
  import { boeControl, boeOverlay, boeRadius, boeSpace } from "../../foundations/geometry/index.js";
5
- import { boeBrandInteractiveStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/index.js";
5
+ import { boeBrandInteractiveStyles, boeNeutralInteractiveStyles, } from "../../foundations/tokens/interaction.js";
6
6
  const DEFAULT_TAG_NAME = "box-dialog";
7
7
  const dialogStyles = `
8
8
  :host {
@@ -2,7 +2,7 @@ import { BaseElement } from "../../core/index.js";
2
2
  import { FocusRestore, trapTabKey } from "../../foundations/a11y/index.js";
3
3
  import { dismissModal, promoteModal } from "../../foundations/overlay/index.js";
4
4
  import { boeControl, boeOverlay, boePanel, boeRadius, boeSpace, } from "../../foundations/geometry/index.js";
5
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
5
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
6
6
  const DEFAULT_TAG_NAME = "box-drawer";
7
7
  const drawerStyles = `
8
8
  :host {
@@ -1,7 +1,7 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { dismissPopover, promotePopover } from "../../foundations/overlay/index.js";
3
3
  import { boeControl, boeOverlay, boeRadius, boeSpace } from "../../foundations/geometry/index.js";
4
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
4
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
5
5
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
6
6
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
7
7
  const DEFAULT_TAG_NAME = "box-guide-tooltip";
@@ -2,7 +2,7 @@ import { BaseElement } from "../../core/index.js";
2
2
  import { dismissPopover, promotePopover } from "../../foundations/overlay/index.js";
3
3
  import { FocusRestore, getTabbableElements } from "../../foundations/a11y/index.js";
4
4
  import { boeControl, boeOverlay, boeRadius } from "../../foundations/geometry/index.js";
5
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
5
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
6
6
  import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
7
7
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
8
8
  const DEFAULT_TAG_NAME = "box-popover";
@@ -1,7 +1,7 @@
1
1
  import { BaseElement } from "../../core/index.js";
2
2
  import { dismissPopover, promotePopover } from "../../foundations/overlay/index.js";
3
3
  import { boeRadius } from "../../foundations/geometry/index.js";
4
- import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
4
+ import { boeNeutralInteractiveStyles } from "../../foundations/tokens/interaction.js";
5
5
  import { parsePlacement, trackAnchor, } from "../../foundations/overlay/index.js";
6
6
  const DEFAULT_TAG_NAME = "box-tooltip";
7
7
  const DEFAULT_TRIGGER_LABEL = "More information";
@@ -1,16 +1,24 @@
1
+ export interface ScrollPinState {
2
+ pinned: boolean;
3
+ behind: boolean;
4
+ }
1
5
  /** Scroll following is changed by user intent, never by resize-induced scroll events. */
2
6
  export declare class ScrollPinController {
3
7
  private readonly viewport;
4
8
  private readonly onChange;
5
9
  pinned: boolean;
10
+ behind: boolean;
6
11
  private cleanup;
7
12
  private observer?;
8
13
  private pointer;
9
14
  private lastTop;
15
+ private lastHeight;
16
+ private content;
17
+ private lastNotified?;
10
18
  private touchY;
11
- constructor(viewport: HTMLElement, onChange?: (showJump: boolean) => void);
19
+ constructor(viewport: HTMLElement, onChange?: (state: ScrollPinState) => void);
12
20
  connect(content?: Element): void;
13
- private atBottom;
21
+ atBottom(): boolean;
14
22
  private notify;
15
23
  unpin(): void;
16
24
  contentChanged(newMessage?: boolean): void;