@k2b/ui 0.24.0 → 0.26.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 (166) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/actions/Dropdown.js +67 -52
  3. package/dist/browser/actions/Dropdown.js.map +1 -1
  4. package/dist/browser/actions/GestureMenu.js +5 -5
  5. package/dist/browser/actions/GestureMenu.js.map +1 -1
  6. package/dist/browser/actions/SpotlightSearch.js +13 -6
  7. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  8. package/dist/browser/actions/Toolbar.js +75 -1
  9. package/dist/browser/actions/Toolbar.js.map +1 -1
  10. package/dist/browser/content/Calendar.js +1539 -911
  11. package/dist/browser/content/Calendar.js.map +1 -1
  12. package/dist/browser/content/CalendarDayView.js +5 -4
  13. package/dist/browser/content/CalendarDayView.js.map +1 -1
  14. package/dist/browser/content/CalendarWeekView.js +5 -4
  15. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  16. package/dist/browser/content/Kbd.js +51 -0
  17. package/dist/browser/content/Kbd.js.map +1 -0
  18. package/dist/browser/content/LabelChip.js +38 -0
  19. package/dist/browser/content/LabelChip.js.map +1 -0
  20. package/dist/browser/content/MarkdownView.js +2 -1
  21. package/dist/browser/content/MarkdownView.js.map +1 -1
  22. package/dist/browser/content/Steps.js +34 -0
  23. package/dist/browser/content/Steps.js.map +1 -0
  24. package/dist/browser/content/Timeline.js +3 -3
  25. package/dist/browser/content/Timeline.js.map +1 -1
  26. package/dist/browser/content/VirtualFeed.js +33 -1
  27. package/dist/browser/content/VirtualFeed.js.map +1 -1
  28. package/dist/browser/content/calendar-dialogs.js +32 -60
  29. package/dist/browser/content/calendar-dialogs.js.map +1 -1
  30. package/dist/browser/content/calendar-month-scroll.js +80 -0
  31. package/dist/browser/content/calendar-month-scroll.js.map +1 -0
  32. package/dist/browser/content/calendar-time-view.js +0 -1
  33. package/dist/browser/content/calendar-time-view.js.map +1 -1
  34. package/dist/browser/content/index.js +4 -1
  35. package/dist/browser/content/index.js.map +1 -1
  36. package/dist/browser/content/markdown-info-blocks.js +33 -5
  37. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  38. package/dist/browser/feedback/prompts.js +17 -3
  39. package/dist/browser/feedback/prompts.js.map +1 -1
  40. package/dist/browser/index.js +1 -0
  41. package/dist/browser/index.js.map +1 -1
  42. package/dist/browser/inputs/Combobox.js +22 -3
  43. package/dist/browser/inputs/Combobox.js.map +1 -1
  44. package/dist/browser/inputs/QrScanner.js +2 -1
  45. package/dist/browser/inputs/QrScanner.js.map +1 -1
  46. package/dist/browser/intl/index.js +1 -0
  47. package/dist/browser/intl/index.js.map +1 -1
  48. package/dist/browser/intl/shortcut-messages.js +77 -0
  49. package/dist/browser/intl/shortcut-messages.js.map +1 -0
  50. package/dist/browser/intl/shortcut.js +123 -0
  51. package/dist/browser/intl/shortcut.js.map +1 -0
  52. package/dist/browser/layout/AppWorkspace.js +355 -338
  53. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  54. package/dist/browser/layout/TableOfContents.js +115 -0
  55. package/dist/browser/layout/TableOfContents.js.map +1 -0
  56. package/dist/browser/layout/app-workspace-controller.js +7 -50
  57. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  58. package/dist/browser/layout/index.js +1 -0
  59. package/dist/browser/layout/index.js.map +1 -1
  60. package/dist/browser/layout/scroll-fade.js +14 -9
  61. package/dist/browser/layout/scroll-fade.js.map +1 -1
  62. package/dist/browser/layout/sidebar-scroll-memory.js +38 -0
  63. package/dist/browser/layout/sidebar-scroll-memory.js.map +1 -0
  64. package/dist/browser/layout/table-of-contents-messages.js +19 -0
  65. package/dist/browser/layout/table-of-contents-messages.js.map +1 -0
  66. package/dist/browser/motion.js +7 -0
  67. package/dist/browser/motion.js.map +1 -0
  68. package/dist/browser/surfaces/LinkCard.js +40 -24
  69. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  70. package/dist/ssr/actions/Dropdown.js +11 -5
  71. package/dist/ssr/actions/Dropdown.js.map +1 -1
  72. package/dist/ssr/actions/GestureMenu.js +5 -5
  73. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  74. package/dist/ssr/actions/SpotlightSearch.js +9 -3
  75. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  76. package/dist/ssr/actions/Toolbar.js +67 -1
  77. package/dist/ssr/actions/Toolbar.js.map +1 -1
  78. package/dist/ssr/content/Calendar.js +864 -312
  79. package/dist/ssr/content/Calendar.js.map +1 -1
  80. package/dist/ssr/content/CalendarDayView.js +5 -4
  81. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  82. package/dist/ssr/content/CalendarWeekView.js +5 -4
  83. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  84. package/dist/ssr/content/Kbd.js +38 -0
  85. package/dist/ssr/content/Kbd.js.map +1 -0
  86. package/dist/ssr/content/LabelChip.js +21 -0
  87. package/dist/ssr/content/LabelChip.js.map +1 -0
  88. package/dist/ssr/content/MarkdownView.js +2 -1
  89. package/dist/ssr/content/MarkdownView.js.map +1 -1
  90. package/dist/ssr/content/Steps.js +14 -0
  91. package/dist/ssr/content/Steps.js.map +1 -0
  92. package/dist/ssr/content/Timeline.js +3 -3
  93. package/dist/ssr/content/Timeline.js.map +1 -1
  94. package/dist/ssr/content/VirtualFeed.js +33 -1
  95. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  96. package/dist/ssr/content/calendar-dialogs.js +12 -32
  97. package/dist/ssr/content/calendar-dialogs.js.map +1 -1
  98. package/dist/ssr/content/calendar-month-scroll.js +80 -0
  99. package/dist/ssr/content/calendar-month-scroll.js.map +1 -0
  100. package/dist/ssr/content/calendar-time-view.js +0 -1
  101. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  102. package/dist/ssr/content/index.js +4 -1
  103. package/dist/ssr/content/index.js.map +1 -1
  104. package/dist/ssr/content/markdown-info-blocks.js +33 -5
  105. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/ssr/feedback/prompts.js +17 -3
  107. package/dist/ssr/feedback/prompts.js.map +1 -1
  108. package/dist/ssr/index.js +1 -0
  109. package/dist/ssr/index.js.map +1 -1
  110. package/dist/ssr/inputs/Combobox.js +18 -3
  111. package/dist/ssr/inputs/Combobox.js.map +1 -1
  112. package/dist/ssr/inputs/QrScanner.js +2 -1
  113. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  114. package/dist/ssr/intl/index.js +1 -0
  115. package/dist/ssr/intl/index.js.map +1 -1
  116. package/dist/ssr/intl/shortcut-messages.js +77 -0
  117. package/dist/ssr/intl/shortcut-messages.js.map +1 -0
  118. package/dist/ssr/intl/shortcut.js +123 -0
  119. package/dist/ssr/intl/shortcut.js.map +1 -0
  120. package/dist/ssr/layout/AppWorkspace.js +77 -72
  121. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  122. package/dist/ssr/layout/TableOfContents.js +79 -0
  123. package/dist/ssr/layout/TableOfContents.js.map +1 -0
  124. package/dist/ssr/layout/app-workspace-controller.js +7 -50
  125. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  126. package/dist/ssr/layout/index.js +1 -0
  127. package/dist/ssr/layout/index.js.map +1 -1
  128. package/dist/ssr/layout/scroll-fade.js +14 -9
  129. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  130. package/dist/ssr/layout/sidebar-scroll-memory.js +38 -0
  131. package/dist/ssr/layout/sidebar-scroll-memory.js.map +1 -0
  132. package/dist/ssr/layout/table-of-contents-messages.js +19 -0
  133. package/dist/ssr/layout/table-of-contents-messages.js.map +1 -0
  134. package/dist/ssr/motion.js +7 -0
  135. package/dist/ssr/motion.js.map +1 -0
  136. package/dist/ssr/surfaces/LinkCard.js +26 -10
  137. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  138. package/dist/styles.css +1 -1
  139. package/dist/types/actions/Dropdown.d.ts +12 -0
  140. package/dist/types/actions/SpotlightSearch.d.ts +2 -0
  141. package/dist/types/content/Calendar.d.ts +16 -6
  142. package/dist/types/content/Kbd.d.ts +16 -0
  143. package/dist/types/content/LabelChip.d.ts +12 -0
  144. package/dist/types/content/MarkdownView.d.ts +2 -1
  145. package/dist/types/content/Steps.d.ts +12 -0
  146. package/dist/types/content/VirtualFeed.d.ts +8 -0
  147. package/dist/types/content/calendar-dialogs.d.ts +0 -2
  148. package/dist/types/content/calendar-month-scroll.d.ts +25 -0
  149. package/dist/types/content/calendar-time-view.d.ts +0 -1
  150. package/dist/types/content/index.d.ts +7 -1
  151. package/dist/types/content/markdown-info-blocks.d.ts +21 -4
  152. package/dist/types/feedback/prompts.d.ts +8 -2
  153. package/dist/types/index.d.ts +1 -0
  154. package/dist/types/inputs/Combobox.d.ts +1 -0
  155. package/dist/types/intl/index.d.ts +2 -0
  156. package/dist/types/intl/shortcut-messages.d.ts +35 -0
  157. package/dist/types/intl/shortcut.d.ts +29 -0
  158. package/dist/types/layout/AppWorkspace.d.ts +3 -1
  159. package/dist/types/layout/TableOfContents.d.ts +24 -0
  160. package/dist/types/layout/index.d.ts +2 -0
  161. package/dist/types/layout/scroll-fade.d.ts +2 -0
  162. package/dist/types/layout/sidebar-scroll-memory.d.ts +6 -0
  163. package/dist/types/layout/table-of-contents-messages.d.ts +4 -0
  164. package/dist/types/motion.d.ts +6 -0
  165. package/dist/types/surfaces/LinkCard.d.ts +3 -0
  166. package/package.json +3 -3
@@ -0,0 +1,115 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { className as _$className } from "solid-js/web";
3
+ import { effect as _$effect } from "solid-js/web";
4
+ import { getNextElement as _$getNextElement } from "solid-js/web";
5
+ import { createComponent as _$createComponent } from "solid-js/web";
6
+ import { insert as _$insert } from "solid-js/web";
7
+ import { memo as _$memo } from "solid-js/web";
8
+ import { setAttribute as _$setAttribute } from "solid-js/web";
9
+ var _tmpl$ = /*#__PURE__*/_$template(`<nav><p class=k2b-toc__title></p><ol class=k2b-toc__list>`),
10
+ _tmpl$2 = /*#__PURE__*/_$template(`<li><a class=k2b-toc__link>`);
11
+ import { createEffect, createSignal, createUniqueId, For, onCleanup, Show, untrack } from "solid-js";
12
+ import { resolveMaybeAccessor } from "../inputs/field-contract";
13
+ import { assertStableUiId } from "./stable-id";
14
+ import { useTableOfContentsMessages } from "./table-of-contents-messages";
15
+ /**
16
+ * Native section links with a scroll spy on the window or a content container.
17
+ * @example <TableOfContents items={[{ id: "sharing", label: "Sharing" }]} sticky />
18
+ */
19
+ export function TableOfContents(props) {
20
+ const t = useTableOfContentsMessages();
21
+ const headingId = assertStableUiId(`k2b-toc-${createUniqueId().replace(/[^a-zA-Z0-9_-]/g, "-")}`, "TableOfContents heading id");
22
+ const [active, setActive] = createSignal(props.items[0]?.id);
23
+ createEffect(() => {
24
+ // Reading every id here makes a changed id or a store update recompute the active section.
25
+ const ids = props.items.map(item => item.id);
26
+ const root = resolveMaybeAccessor(props.scrollRoot);
27
+ const target = root ?? window;
28
+ let frame;
29
+ const update = () => {
30
+ frame = undefined;
31
+ const box = root?.getBoundingClientRect();
32
+ const top = box ? box.top + (root?.clientTop ?? 0) : 0;
33
+ const height = root?.clientHeight ?? window.innerHeight;
34
+ const line = top + height / 4;
35
+ const headings = ids.map(id => ({
36
+ id,
37
+ box: document.getElementById(id)?.getBoundingClientRect()
38
+ }));
39
+ let next = ids[0];
40
+ for (const heading of headings) if (heading.box && heading.box.top <= line) next = heading.id;
41
+ const last = headings.at(-1);
42
+ const atEnd = root ? root.scrollHeight - root.clientHeight - root.scrollTop <= 4 : document.documentElement.scrollHeight - window.innerHeight - window.scrollY <= 4;
43
+ if (atEnd && last?.box && last.box.top < top + height && last.box.bottom > top) next = last.id;
44
+ if (next !== active()) {
45
+ setActive(next);
46
+ props.onActiveChange?.(next);
47
+ }
48
+ };
49
+ const schedule = () => {
50
+ if (frame === undefined) frame = requestAnimationFrame(update);
51
+ };
52
+ target.addEventListener("scroll", schedule, {
53
+ passive: true
54
+ });
55
+ window.addEventListener("resize", schedule);
56
+ const observer = typeof ResizeObserver === "undefined" ? undefined : new ResizeObserver(schedule);
57
+ // No scroll or window resize happens when the root, a block above a heading, or a heading's own section changes size.
58
+ const observed = new Set([root ?? document.documentElement, ...(root?.children ?? [document.body]), ...ids.map(id => document.getElementById(id)?.parentElement)]);
59
+ for (const element of observed) if (element) observer?.observe(element);
60
+ untrack(update);
61
+ onCleanup(() => {
62
+ target.removeEventListener("scroll", schedule);
63
+ window.removeEventListener("resize", schedule);
64
+ observer?.disconnect();
65
+ if (frame !== undefined) cancelAnimationFrame(frame);
66
+ });
67
+ });
68
+ return _$createComponent(Show, {
69
+ get when() {
70
+ return props.items.length > 0;
71
+ },
72
+ get children() {
73
+ var _el$ = _$getNextElement(_tmpl$),
74
+ _el$2 = _el$.firstChild,
75
+ _el$3 = _el$2.nextSibling;
76
+ _$setAttribute(_el$, "aria-labelledby", headingId);
77
+ _$setAttribute(_el$2, "id", headingId);
78
+ _$insert(_el$2, () => props.title ?? t().title);
79
+ _$insert(_el$3, _$createComponent(For, {
80
+ get each() {
81
+ return props.items;
82
+ },
83
+ children: item => (() => {
84
+ var _el$4 = _$getNextElement(_tmpl$2),
85
+ _el$5 = _el$4.firstChild;
86
+ _$insert(_el$5, () => item.label);
87
+ _$effect(_p$ => {
88
+ var _v$3 = `#${item.id}`,
89
+ _v$4 = active() === item.id ? "location" : undefined;
90
+ _v$3 !== _p$.e && _$setAttribute(_el$5, "href", _p$.e = _v$3);
91
+ _v$4 !== _p$.t && _$setAttribute(_el$5, "aria-current", _p$.t = _v$4);
92
+ return _p$;
93
+ }, {
94
+ e: undefined,
95
+ t: undefined
96
+ });
97
+ return _el$4;
98
+ })()
99
+ }));
100
+ _$effect(_p$ => {
101
+ var _v$ = `k2b-toc${props.class ? ` ${props.class}` : ""}`,
102
+ _v$2 = props.sticky ? "true" : undefined;
103
+ _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
104
+ _v$2 !== _p$.t && _$setAttribute(_el$, "data-sticky", _p$.t = _v$2);
105
+ return _p$;
106
+ }, {
107
+ e: undefined,
108
+ t: undefined
109
+ });
110
+ return _el$;
111
+ }
112
+ });
113
+ }
114
+ export default TableOfContents;
115
+ //# sourceMappingURL=TableOfContents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["layout/TableOfContents.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, For, type JSX, onCleanup, Show, untrack } from \"solid-js\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { assertStableUiId } from \"./stable-id\";\nimport { useTableOfContentsMessages } from \"./table-of-contents-messages\";\n\nexport type TableOfContentsItem = { id: string; label: string };\nexport type TableOfContentsProps = {\n items: readonly TableOfContentsItem[];\n /** Visible heading and navigation name. Defaults to the localized \"On this page\". */\n title?: string;\n /** Element whose scrolling decides the active section. Defaults to the window. */\n scrollRoot?: MaybeAccessor<HTMLElement | undefined>;\n /** Stay in view inside the caller's layout. */\n sticky?: boolean;\n /** Called when another section becomes active. */\n onActiveChange?: (id: string | undefined) => void;\n class?: string;\n};\n\n/**\n * Native section links with a scroll spy on the window or a content container.\n * @example <TableOfContents items={[{ id: \"sharing\", label: \"Sharing\" }]} sticky />\n */\nexport function TableOfContents(props: TableOfContentsProps): JSX.Element {\n const t = useTableOfContentsMessages();\n const headingId = assertStableUiId(`k2b-toc-${createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\")}`, \"TableOfContents heading id\");\n const [active, setActive] = createSignal(props.items[0]?.id);\n createEffect(() => {\n // Reading every id here makes a changed id or a store update recompute the active section.\n const ids = props.items.map((item) => item.id);\n const root = resolveMaybeAccessor(props.scrollRoot);\n const target = root ?? window;\n let frame: number | undefined;\n const update = () => {\n frame = undefined;\n const box = root?.getBoundingClientRect();\n const top = box ? box.top + (root?.clientTop ?? 0) : 0;\n const height = root?.clientHeight ?? window.innerHeight;\n const line = top + height / 4;\n const headings = ids.map((id) => ({ id, box: document.getElementById(id)?.getBoundingClientRect() }));\n let next = ids[0];\n for (const heading of headings) if (heading.box && heading.box.top <= line) next = heading.id;\n const last = headings.at(-1);\n const atEnd = root\n ? root.scrollHeight - root.clientHeight - root.scrollTop <= 4\n : document.documentElement.scrollHeight - window.innerHeight - window.scrollY <= 4;\n if (atEnd && last?.box && last.box.top < top + height && last.box.bottom > top) next = last.id;\n if (next !== active()) {\n setActive(next);\n props.onActiveChange?.(next);\n }\n };\n const schedule = () => {\n if (frame === undefined) frame = requestAnimationFrame(update);\n };\n target.addEventListener(\"scroll\", schedule, { passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(schedule);\n // No scroll or window resize happens when the root, a block above a heading, or a heading's own section changes size.\n const observed = new Set<Element | null | undefined>([\n root ?? document.documentElement,\n ...(root?.children ?? [document.body]),\n ...ids.map((id) => document.getElementById(id)?.parentElement),\n ]);\n for (const element of observed) if (element) observer?.observe(element);\n untrack(update);\n onCleanup(() => {\n target.removeEventListener(\"scroll\", schedule);\n window.removeEventListener(\"resize\", schedule);\n observer?.disconnect();\n if (frame !== undefined) cancelAnimationFrame(frame);\n });\n });\n return (\n <Show when={props.items.length > 0}>\n <nav\n class={`k2b-toc${props.class ? ` ${props.class}` : \"\"}`}\n data-sticky={props.sticky ? \"true\" : undefined}\n aria-labelledby={headingId}\n >\n <p class=\"k2b-toc__title\" id={headingId}>\n {props.title ?? t().title}\n </p>\n <ol class=\"k2b-toc__list\">\n <For each={props.items}>\n {(item) => (\n <li>\n <a class=\"k2b-toc__link\" href={`#${item.id}`} aria-current={active() === item.id ? \"location\" : undefined}>\n {item.label}\n </a>\n </li>\n )}\n </For>\n </ol>\n </nav>\n </Show>\n );\n}\nexport default TableOfContents;\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import { suppressTextSelection } from "../internal/text-selection";
2
+ import { prefersReducedMotion } from "../motion";
2
3
  import { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspacePanelVariable, appWorkspaceResizeLimits, fitAppWorkspacePaneSizes, normalizeAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, shouldCollapseAppWorkspaceSidebar } from "./app-workspace-state";
3
4
  import { installScrollFades } from "./scroll-fade";
4
5
  const HANDLE_SELECTOR = "[data-app-workspace-resize]";
@@ -10,8 +11,6 @@ const COMPACT_QUERY = "(min-width: 48rem) and (max-width: 63.999rem)";
10
11
  const FOCUSABLE_SELECTOR = ["a[href]", "button:not([disabled])", "input:not([disabled]):not([type='hidden'])", "select:not([disabled])", "textarea:not([disabled])", "[tabindex]:not([tabindex='-1'])"].join(",");
11
12
  /** Text entry, menus, dialogs, and open popups keep their own keys. */
12
13
  const KEY_OWNER_SELECTOR = "input, textarea, select, [contenteditable]:not([contenteditable='false']), [role='textbox'], [role='combobox'], [role='searchbox'], [role='spinbutton'], [role='menu'], [role='listbox'], [role='dialog'], dialog, [aria-haspopup]:not([aria-haspopup='false'])[aria-expanded='true']";
13
- const LABEL_SELECTOR = ".k2b-app-workspace__sidebar-item-label[data-marquee='true']";
14
- const LABEL_TEXT_SELECTOR = ".k2b-app-workspace__sidebar-item-label-text";
15
14
  const ITEM_SELECTOR = ".k2b-app-workspace__sidebar-item";
16
15
  const clamp = (value, min, max) => Math.round(Math.min(max, Math.max(min, value)));
17
16
  const eventElement = event => event.target instanceof Element ? event.target : null;
@@ -164,25 +163,6 @@ const reconcilePanes = (root, layoutState, active = null) => {
164
163
  fits.forEach((fit, index) => updateHandleValue(root, fit.handle, "pane", sizes[index]));
165
164
  };
166
165
 
167
- /**
168
- * Marquee support for a truncated sidebar label.
169
- *
170
- * The animation needs to know how far to travel, and that is only knowable
171
- * once the label has been laid out — so it is measured lazily, on the same
172
- * hover/focus that triggers it, and published as a custom property. Labels
173
- * that fit get no `data-overflow`, so they never animate. A revealed row action
174
- * pads the label's fading end, so the text is measured against the content box.
175
- */
176
- const measureLabel = label => {
177
- const text = label.querySelector(LABEL_TEXT_SELECTOR);
178
- if (!text) return;
179
- const style = getComputedStyle(label);
180
- const width = label.clientWidth - (Number.parseFloat(style.paddingLeft) || 0) - (Number.parseFloat(style.paddingRight) || 0);
181
- const overflow = Math.max(0, text.scrollWidth - width);
182
- label.style.setProperty("--k2b-sidebar-label-overflow", `${overflow}px`);
183
- if (overflow > 2) label.dataset.overflow = "true";else delete label.dataset.overflow;
184
- };
185
-
186
166
  /** An open overlay remembers the regions it made inert, so it leaves the application's own `inert` alone. */
187
167
 
188
168
  /**
@@ -319,7 +299,6 @@ export const installAppWorkspaceController = (options = {}) => {
319
299
  const phone = typeof window.matchMedia === "function" ? window.matchMedia("(max-width: 47.999rem)") : null;
320
300
  const wide = typeof window.matchMedia === "function" ? window.matchMedia("(min-width: 48rem)") : null;
321
301
  const touchDrawer = typeof window.matchMedia === "function" ? window.matchMedia(`${COMPACT_QUERY} and (pointer: coarse)`) : null;
322
- const reducedMotion = typeof window.matchMedia === "function" ? window.matchMedia("(prefers-reduced-motion: reduce)") : null;
323
302
  const detailSelector = ".k2b-app-workspace__detail";
324
303
  const grabberSelector = ".k2b-app-workspace__detail-grabber";
325
304
  const detailHidden = new WeakMap();
@@ -487,7 +466,7 @@ export const installAppWorkspaceController = (options = {}) => {
487
466
  // edge, so the workspace clips while the panel moves (see the stylesheet).
488
467
  const slide = (root, aside) => {
489
468
  slides.get(root)?.();
490
- if (!root.hasAttribute("data-workspace-motion") || reducedMotion?.matches || !wide?.matches) return;
469
+ if (!root.hasAttribute("data-workspace-motion") || prefersReducedMotion() || !wide?.matches) return;
491
470
  const end = () => {
492
471
  aside.removeEventListener("transitionend", onEnd);
493
472
  aside.removeEventListener("transitioncancel", onEnd);
@@ -515,7 +494,7 @@ export const installAppWorkspaceController = (options = {}) => {
515
494
  revealFrames.set(root, requestAnimationFrame(() => {
516
495
  revealFrames.delete(root);
517
496
  if (!aside.hidden && aside.isConnected && snapshot.item.isConnected && mainElement(root)?.contains(snapshot.item) && snapshot.item.closest(ROOT_SELECTOR) === root) {
518
- const behavior = reducedMotion?.matches ? "auto" : "smooth";
497
+ const behavior = prefersReducedMotion() ? "auto" : "smooth";
519
498
  const main = mainElement(root);
520
499
  const cell = snapshot.cell;
521
500
  const target = cell?.isConnected && main?.contains(cell) ? cell : snapshot.item;
@@ -584,7 +563,7 @@ export const installAppWorkspaceController = (options = {}) => {
584
563
  if (aside.hidden) {
585
564
  if (pendingTitle?.aside === aside) cancelTitle();
586
565
  if (panelStep === aside) panelStep = null;
587
- if (root.hasAttribute("data-workspace-motion") && !reducedMotion?.matches && wide?.matches) {
566
+ if (root.hasAttribute("data-workspace-motion") && !prefersReducedMotion() && wide?.matches) {
588
567
  // Closing holds the detail column until the slide ends; anchor after Main widens.
589
568
  const cancel = () => {
590
569
  root.removeEventListener("transitionend", onTransitionEnd);
@@ -1080,43 +1059,23 @@ export const installAppWorkspaceController = (options = {}) => {
1080
1059
  if (handle && kind && root && controlsResizableRegion(root, handle, kind)) {
1081
1060
  updateHandleValue(root, handle, kind, currentSize(root, handle, kind));
1082
1061
  }
1083
- const label = eventElement(event)?.closest(ITEM_SELECTOR)?.querySelector(LABEL_SELECTOR);
1084
- if (label) requestAnimationFrame(() => measureLabel(label));
1085
- };
1086
-
1087
- // Measured on entry rather than on every render: `scrollWidth` forces layout,
1088
- // and a sidebar can hold hundreds of rows.
1089
- const onPointerOver = event => {
1090
- const label = eventElement(event)?.closest(LABEL_SELECTOR);
1091
- if (!label || event.relatedTarget instanceof Node && label.contains(event.relatedTarget)) return;
1092
- requestAnimationFrame(() => measureLabel(label));
1093
- };
1094
-
1095
- // A resize changes every label's available width, so the cached measurement
1096
- // is dropped and taken again on the next hover or focus.
1097
- const clearMeasuredLabels = () => {
1098
- eventRoot.querySelectorAll(LABEL_SELECTOR).forEach(label => {
1099
- delete label.dataset.overflow;
1100
- label.style.removeProperty("--k2b-sidebar-label-overflow");
1101
- });
1102
1062
  };
1103
1063
 
1104
1064
  // Geometry can change without a window resize: a parent can resize the
1105
1065
  // workspace, or a detail/pane can open. All sources share one frame so a
1106
1066
  // transition performs at most one layout reconciliation.
1107
1067
  let reconcileFrame = null;
1108
- const scheduleReconcile = (clearLabels = false) => {
1109
- if (clearLabels) clearMeasuredLabels();
1068
+ const scheduleReconcile = () => {
1110
1069
  if (reconcileFrame !== null) return;
1111
1070
  reconcileFrame = requestAnimationFrame(() => {
1112
1071
  reconcileFrame = null;
1113
1072
  reconcile();
1114
1073
  });
1115
1074
  };
1116
- const onResize = () => scheduleReconcile(true);
1075
+ const onResize = () => scheduleReconcile();
1117
1076
  const observedRoots = new Set();
1118
1077
  const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => {
1119
- scheduleReconcile(true);
1078
+ scheduleReconcile();
1120
1079
  });
1121
1080
  const syncObservedRoots = () => {
1122
1081
  for (const elements of [touchedDetails, titleTabIndices, motionRoots]) {
@@ -1206,7 +1165,6 @@ export const installAppWorkspaceController = (options = {}) => {
1206
1165
  compact?.addEventListener("change", onCompactChange);
1207
1166
  eventRoot.addEventListener("keydown", onKeyDown);
1208
1167
  eventRoot.addEventListener("focusin", onFocusIn);
1209
- eventRoot.addEventListener("pointerover", onPointerOver);
1210
1168
  window.addEventListener("resize", onResize);
1211
1169
  syncObservedRoots();
1212
1170
  mutationObserver?.observe(eventRoot, {
@@ -1265,7 +1223,6 @@ export const installAppWorkspaceController = (options = {}) => {
1265
1223
  compact?.removeEventListener("change", onCompactChange);
1266
1224
  eventRoot.removeEventListener("keydown", onKeyDown);
1267
1225
  eventRoot.removeEventListener("focusin", onFocusIn);
1268
- eventRoot.removeEventListener("pointerover", onPointerOver);
1269
1226
  window.removeEventListener("resize", onResize);
1270
1227
  };
1271
1228
  };