@k2b/ui 0.23.0 → 0.25.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.
- package/README.md +2 -2
- package/dist/browser/actions/Dropdown.js +67 -52
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +3 -3
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +13 -6
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +75 -1
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/content/Calendar.js +1570 -923
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +2 -2
- package/dist/browser/content/CalendarDayView.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +29 -7
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/DataTable.js +45 -35
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Kbd.js +51 -0
- package/dist/browser/content/Kbd.js.map +1 -0
- package/dist/browser/content/LabelChip.js +38 -0
- package/dist/browser/content/LabelChip.js.map +1 -0
- package/dist/browser/content/MarkdownView.js +2 -1
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/Steps.js +34 -0
- package/dist/browser/content/Steps.js.map +1 -0
- package/dist/browser/content/VirtualFeed.js +33 -1
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +17 -4
- package/dist/browser/content/calendar-day-scroll.js.map +1 -1
- package/dist/browser/content/calendar-dialogs.js +32 -60
- package/dist/browser/content/calendar-dialogs.js.map +1 -1
- package/dist/browser/content/calendar-month-scroll.js +80 -0
- package/dist/browser/content/calendar-month-scroll.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +9 -4
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/index.js +4 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/markdown-info-blocks.js +33 -5
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/feedback/prompts.js +17 -3
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/intl/index.js +1 -0
- package/dist/browser/intl/index.js.map +1 -1
- package/dist/browser/intl/shortcut-messages.js +77 -0
- package/dist/browser/intl/shortcut-messages.js.map +1 -0
- package/dist/browser/intl/shortcut.js +123 -0
- package/dist/browser/intl/shortcut.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +345 -325
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/Navigation.js +18 -3
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +14 -0
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +505 -0
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -0
- package/dist/browser/layout/TableOfContents.js +115 -0
- package/dist/browser/layout/TableOfContents.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +15 -48
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js +1 -0
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/table-of-contents-messages.js +19 -0
- package/dist/browser/layout/table-of-contents-messages.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +40 -24
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +11 -5
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +3 -3
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +9 -3
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +67 -1
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/content/Calendar.js +895 -321
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +2 -2
- package/dist/ssr/content/CalendarDayView.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +28 -7
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +21 -17
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Kbd.js +38 -0
- package/dist/ssr/content/Kbd.js.map +1 -0
- package/dist/ssr/content/LabelChip.js +21 -0
- package/dist/ssr/content/LabelChip.js.map +1 -0
- package/dist/ssr/content/MarkdownView.js +2 -1
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/Steps.js +14 -0
- package/dist/ssr/content/Steps.js.map +1 -0
- package/dist/ssr/content/VirtualFeed.js +33 -1
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +17 -4
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -1
- package/dist/ssr/content/calendar-dialogs.js +12 -32
- package/dist/ssr/content/calendar-dialogs.js.map +1 -1
- package/dist/ssr/content/calendar-month-scroll.js +80 -0
- package/dist/ssr/content/calendar-month-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +8 -3
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/index.js +4 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/markdown-info-blocks.js +33 -5
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +17 -3
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/intl/index.js +1 -0
- package/dist/ssr/intl/index.js.map +1 -1
- package/dist/ssr/intl/shortcut-messages.js +77 -0
- package/dist/ssr/intl/shortcut-messages.js.map +1 -0
- package/dist/ssr/intl/shortcut.js +123 -0
- package/dist/ssr/intl/shortcut.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +67 -59
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +12 -2
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +14 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +271 -0
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -0
- package/dist/ssr/layout/TableOfContents.js +79 -0
- package/dist/ssr/layout/TableOfContents.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +15 -48
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js +1 -0
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/table-of-contents-messages.js +19 -0
- package/dist/ssr/layout/table-of-contents-messages.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +26 -10
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +12 -0
- package/dist/types/actions/SpotlightSearch.d.ts +2 -0
- package/dist/types/content/Calendar.d.ts +20 -7
- package/dist/types/content/CalendarWeekView.d.ts +1 -1
- package/dist/types/content/DataTable.d.ts +9 -0
- package/dist/types/content/Kbd.d.ts +16 -0
- package/dist/types/content/LabelChip.d.ts +12 -0
- package/dist/types/content/MarkdownView.d.ts +2 -1
- package/dist/types/content/Steps.d.ts +12 -0
- package/dist/types/content/VirtualFeed.d.ts +8 -0
- package/dist/types/content/calendar-day-scroll.d.ts +9 -4
- package/dist/types/content/calendar-dialogs.d.ts +0 -2
- package/dist/types/content/calendar-month-scroll.d.ts +25 -0
- package/dist/types/content/index.d.ts +7 -1
- package/dist/types/content/markdown-info-blocks.d.ts +21 -4
- package/dist/types/feedback/prompts.d.ts +8 -2
- package/dist/types/intl/index.d.ts +2 -0
- package/dist/types/intl/shortcut-messages.d.ts +35 -0
- package/dist/types/intl/shortcut.d.ts +29 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -1
- package/dist/types/layout/SidebarSwitcher.d.ts +65 -0
- package/dist/types/layout/TableOfContents.d.ts +24 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +4 -0
- package/dist/types/layout/table-of-contents-messages.d.ts +4 -0
- package/dist/types/surfaces/LinkCard.d.ts +3 -0
- package/package.json +4 -4
|
@@ -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":[]}
|
|
@@ -10,8 +10,6 @@ const COMPACT_QUERY = "(min-width: 48rem) and (max-width: 63.999rem)";
|
|
|
10
10
|
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
11
|
/** Text entry, menus, dialogs, and open popups keep their own keys. */
|
|
12
12
|
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
13
|
const ITEM_SELECTOR = ".k2b-app-workspace__sidebar-item";
|
|
16
14
|
const clamp = (value, min, max) => Math.round(Math.min(max, Math.max(min, value)));
|
|
17
15
|
const eventElement = event => event.target instanceof Element ? event.target : null;
|
|
@@ -164,25 +162,6 @@ const reconcilePanes = (root, layoutState, active = null) => {
|
|
|
164
162
|
fits.forEach((fit, index) => updateHandleValue(root, fit.handle, "pane", sizes[index]));
|
|
165
163
|
};
|
|
166
164
|
|
|
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
165
|
/** An open overlay remembers the regions it made inert, so it leaves the application's own `inert` alone. */
|
|
187
166
|
|
|
188
167
|
/**
|
|
@@ -521,11 +500,21 @@ export const installAppWorkspaceController = (options = {}) => {
|
|
|
521
500
|
const target = cell?.isConnected && main?.contains(cell) ? cell : snapshot.item;
|
|
522
501
|
if (phone?.matches && main) {
|
|
523
502
|
// The sheet covers Main's lower part, so the item ends 8px above it;
|
|
524
|
-
//
|
|
503
|
+
// the other edges include the scroller's scroll padding, like scrollIntoView.
|
|
525
504
|
const page = ownerDocument.scrollingElement;
|
|
526
505
|
const vertical = verticalScroller(target, main) ?? page;
|
|
527
506
|
const horizontal = scrollerOn("x", target, main) ?? page;
|
|
528
|
-
const bounds = scroller =>
|
|
507
|
+
const bounds = scroller => {
|
|
508
|
+
if (!scroller || scroller === page) return null;
|
|
509
|
+
const rect = scroller.getBoundingClientRect();
|
|
510
|
+
const style = ownerWindow.getComputedStyle(scroller);
|
|
511
|
+
const padding = value => Number.parseFloat(value) || 0;
|
|
512
|
+
return {
|
|
513
|
+
top: rect.top + padding(style.scrollPaddingTop),
|
|
514
|
+
left: rect.left + padding(style.scrollPaddingLeft),
|
|
515
|
+
right: rect.right - padding(style.scrollPaddingRight)
|
|
516
|
+
};
|
|
517
|
+
};
|
|
529
518
|
const box = target.getBoundingClientRect();
|
|
530
519
|
const top = Math.max(0, bounds(vertical)?.top ?? 0);
|
|
531
520
|
const left = Math.max(0, bounds(horizontal)?.left ?? 0);
|
|
@@ -1070,43 +1059,23 @@ export const installAppWorkspaceController = (options = {}) => {
|
|
|
1070
1059
|
if (handle && kind && root && controlsResizableRegion(root, handle, kind)) {
|
|
1071
1060
|
updateHandleValue(root, handle, kind, currentSize(root, handle, kind));
|
|
1072
1061
|
}
|
|
1073
|
-
const label = eventElement(event)?.closest(ITEM_SELECTOR)?.querySelector(LABEL_SELECTOR);
|
|
1074
|
-
if (label) requestAnimationFrame(() => measureLabel(label));
|
|
1075
|
-
};
|
|
1076
|
-
|
|
1077
|
-
// Measured on entry rather than on every render: `scrollWidth` forces layout,
|
|
1078
|
-
// and a sidebar can hold hundreds of rows.
|
|
1079
|
-
const onPointerOver = event => {
|
|
1080
|
-
const label = eventElement(event)?.closest(LABEL_SELECTOR);
|
|
1081
|
-
if (!label || event.relatedTarget instanceof Node && label.contains(event.relatedTarget)) return;
|
|
1082
|
-
requestAnimationFrame(() => measureLabel(label));
|
|
1083
|
-
};
|
|
1084
|
-
|
|
1085
|
-
// A resize changes every label's available width, so the cached measurement
|
|
1086
|
-
// is dropped and taken again on the next hover or focus.
|
|
1087
|
-
const clearMeasuredLabels = () => {
|
|
1088
|
-
eventRoot.querySelectorAll(LABEL_SELECTOR).forEach(label => {
|
|
1089
|
-
delete label.dataset.overflow;
|
|
1090
|
-
label.style.removeProperty("--k2b-sidebar-label-overflow");
|
|
1091
|
-
});
|
|
1092
1062
|
};
|
|
1093
1063
|
|
|
1094
1064
|
// Geometry can change without a window resize: a parent can resize the
|
|
1095
1065
|
// workspace, or a detail/pane can open. All sources share one frame so a
|
|
1096
1066
|
// transition performs at most one layout reconciliation.
|
|
1097
1067
|
let reconcileFrame = null;
|
|
1098
|
-
const scheduleReconcile = (
|
|
1099
|
-
if (clearLabels) clearMeasuredLabels();
|
|
1068
|
+
const scheduleReconcile = () => {
|
|
1100
1069
|
if (reconcileFrame !== null) return;
|
|
1101
1070
|
reconcileFrame = requestAnimationFrame(() => {
|
|
1102
1071
|
reconcileFrame = null;
|
|
1103
1072
|
reconcile();
|
|
1104
1073
|
});
|
|
1105
1074
|
};
|
|
1106
|
-
const onResize = () => scheduleReconcile(
|
|
1075
|
+
const onResize = () => scheduleReconcile();
|
|
1107
1076
|
const observedRoots = new Set();
|
|
1108
1077
|
const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => {
|
|
1109
|
-
scheduleReconcile(
|
|
1078
|
+
scheduleReconcile();
|
|
1110
1079
|
});
|
|
1111
1080
|
const syncObservedRoots = () => {
|
|
1112
1081
|
for (const elements of [touchedDetails, titleTabIndices, motionRoots]) {
|
|
@@ -1196,7 +1165,6 @@ export const installAppWorkspaceController = (options = {}) => {
|
|
|
1196
1165
|
compact?.addEventListener("change", onCompactChange);
|
|
1197
1166
|
eventRoot.addEventListener("keydown", onKeyDown);
|
|
1198
1167
|
eventRoot.addEventListener("focusin", onFocusIn);
|
|
1199
|
-
eventRoot.addEventListener("pointerover", onPointerOver);
|
|
1200
1168
|
window.addEventListener("resize", onResize);
|
|
1201
1169
|
syncObservedRoots();
|
|
1202
1170
|
mutationObserver?.observe(eventRoot, {
|
|
@@ -1255,7 +1223,6 @@ export const installAppWorkspaceController = (options = {}) => {
|
|
|
1255
1223
|
compact?.removeEventListener("change", onCompactChange);
|
|
1256
1224
|
eventRoot.removeEventListener("keydown", onKeyDown);
|
|
1257
1225
|
eventRoot.removeEventListener("focusin", onFocusIn);
|
|
1258
|
-
eventRoot.removeEventListener("pointerover", onPointerOver);
|
|
1259
1226
|
window.removeEventListener("resize", onResize);
|
|
1260
1227
|
};
|
|
1261
1228
|
};
|