@gunkin/uiify 0.0.14-alpha → 0.0.16-alpha
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 +46 -1
- package/agents/components.md +80 -0
- package/agents/index.md +179 -0
- package/agents/reference/components/accordion.md +35 -0
- package/agents/reference/components/alert-modal.md +63 -0
- package/agents/reference/components/breadcrumb.md +72 -0
- package/agents/reference/components/button.md +40 -0
- package/agents/reference/components/candle-chart.md +107 -0
- package/agents/reference/components/carousel.md +274 -0
- package/agents/reference/components/checkbox.md +32 -0
- package/agents/reference/components/collapsible.md +26 -0
- package/agents/reference/components/color-picker.md +33 -0
- package/agents/reference/components/combobox.md +193 -0
- package/agents/reference/components/context-menu.md +129 -0
- package/agents/reference/components/drawer.md +215 -0
- package/agents/reference/components/dropdown-menu.md +178 -0
- package/agents/reference/components/field.md +76 -0
- package/agents/reference/components/file-upload.md +131 -0
- package/agents/reference/components/form.md +28 -0
- package/agents/reference/components/header.md +44 -0
- package/agents/reference/components/hover-card.md +54 -0
- package/agents/reference/components/input.md +29 -0
- package/agents/reference/components/line-chart.md +104 -0
- package/agents/reference/components/modal.md +106 -0
- package/agents/reference/components/number-field.md +60 -0
- package/agents/reference/components/otp-input.md +68 -0
- package/agents/reference/components/pagination.md +112 -0
- package/agents/reference/components/popup.md +111 -0
- package/agents/reference/components/radio-group.md +37 -0
- package/agents/reference/components/rating.md +43 -0
- package/agents/reference/components/segmented-control.md +51 -0
- package/agents/reference/components/select.md +60 -0
- package/agents/reference/components/skeleton.md +29 -0
- package/agents/reference/components/slider.md +71 -0
- package/agents/reference/components/spinner.md +34 -0
- package/agents/reference/components/switch.md +27 -0
- package/agents/reference/components/table-of-contents.md +185 -0
- package/agents/reference/components/table.md +189 -0
- package/agents/reference/components/tabs.md +42 -0
- package/agents/reference/components/tags-input.md +123 -0
- package/agents/reference/components/textarea.md +31 -0
- package/agents/reference/components/toast.md +151 -0
- package/agents/reference/components/toggle-group.md +50 -0
- package/agents/reference/components/toggle.md +26 -0
- package/agents/reference/components/toolbar.md +69 -0
- package/agents/reference/components/tooltip.md +76 -0
- package/agents/reference/components/virtual-scroll.md +97 -0
- package/agents/reference/elements/choice.md +55 -0
- package/agents/reference/elements/details.md +45 -0
- package/agents/reference/elements/dialog.md +43 -0
- package/agents/reference/elements/invoker.md +28 -0
- package/agents/reference/elements/popover.md +53 -0
- package/dist/components/alert-modal/AlertModalParts.js +1 -1
- package/dist/components/alert-modal/AlertModalParts.js.map +1 -1
- package/dist/components/button/Button.d.ts.map +1 -1
- package/dist/components/button/Button.js +5 -3
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/button/index.d.ts +1 -1
- package/dist/components/button/index.d.ts.map +1 -1
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button/types.d.ts +5 -4
- package/dist/components/button/types.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
- package/dist/components/carousel/CarouselMarkup.js +8 -0
- package/dist/components/carousel/CarouselMarkup.js.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/DropdownMenu.js +0 -2
- package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
- package/dist/components/dropdown-menu/types.d.ts +0 -1
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.d.ts.map +1 -1
- package/dist/components/internal/choice-family/ChoiceGroup.js +2 -3
- package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
- package/dist/components/internal/choice-family/types.d.ts +2 -2
- package/dist/components/internal/choice-family/types.d.ts.map +1 -1
- package/dist/components/pagination/Pagination.d.ts.map +1 -1
- package/dist/components/pagination/Pagination.js +11 -0
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
- package/dist/components/pagination/PaginationShell.js +26 -1
- package/dist/components/pagination/PaginationShell.js.map +1 -1
- package/dist/components/segmented-control/SegmentedControl.d.ts.map +1 -1
- package/dist/components/segmented-control/SegmentedControl.js +1 -0
- package/dist/components/segmented-control/SegmentedControl.js.map +1 -1
- package/dist/components/segmented-control/client/SegmentedControlClient.d.ts.map +1 -1
- package/dist/components/segmented-control/client/SegmentedControlClient.js +1 -0
- package/dist/components/segmented-control/client/SegmentedControlClient.js.map +1 -1
- package/dist/components/table-of-contents/TableOfContents.d.ts +22 -0
- package/dist/components/table-of-contents/TableOfContents.d.ts.map +1 -0
- package/dist/components/table-of-contents/TableOfContents.js +142 -0
- package/dist/components/table-of-contents/TableOfContents.js.map +1 -0
- package/dist/components/table-of-contents/client/TableOfContentsClient.d.ts +18 -0
- package/dist/components/table-of-contents/client/TableOfContentsClient.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/TableOfContentsClient.js +140 -0
- package/dist/components/table-of-contents/client/TableOfContentsClient.js.map +1 -0
- package/dist/components/table-of-contents/client/TableOfContentsClientParts.d.ts +7 -0
- package/dist/components/table-of-contents/client/TableOfContentsClientParts.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/TableOfContentsClientParts.js +48 -0
- package/dist/components/table-of-contents/client/TableOfContentsClientParts.js.map +1 -0
- package/dist/components/table-of-contents/client/index.d.ts +5 -0
- package/dist/components/table-of-contents/client/index.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/index.js +23 -0
- package/dist/components/table-of-contents/client/index.js.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-context.d.ts +3 -0
- package/dist/components/table-of-contents/client/table-of-contents-context.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-context.js +7 -0
- package/dist/components/table-of-contents/client/table-of-contents-context.js.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-interactions.d.ts +3 -0
- package/dist/components/table-of-contents/client/table-of-contents-interactions.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-interactions.js +144 -0
- package/dist/components/table-of-contents/client/table-of-contents-interactions.js.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-pointer.d.ts +3 -0
- package/dist/components/table-of-contents/client/table-of-contents-pointer.d.ts.map +1 -0
- package/dist/components/table-of-contents/client/table-of-contents-pointer.js +94 -0
- package/dist/components/table-of-contents/client/table-of-contents-pointer.js.map +1 -0
- package/dist/components/table-of-contents/client.d.ts +1 -0
- package/dist/components/table-of-contents/client.js +1 -0
- package/dist/components/table-of-contents/index.d.ts +3 -0
- package/dist/components/table-of-contents/index.d.ts.map +1 -0
- package/dist/components/table-of-contents/index.js +21 -0
- package/dist/components/table-of-contents/index.js.map +1 -0
- package/dist/components/table-of-contents/scrollspy-selection.d.ts +4 -0
- package/dist/components/table-of-contents/scrollspy-selection.d.ts.map +1 -0
- package/dist/components/table-of-contents/scrollspy-selection.js +31 -0
- package/dist/components/table-of-contents/scrollspy-selection.js.map +1 -0
- package/dist/components/table-of-contents/scrollspy.d.ts +4 -0
- package/dist/components/table-of-contents/scrollspy.d.ts.map +1 -0
- package/dist/components/table-of-contents/scrollspy.js +178 -0
- package/dist/components/table-of-contents/scrollspy.js.map +1 -0
- package/dist/components/table-of-contents/types.d.ts +123 -0
- package/dist/components/table-of-contents/types.d.ts.map +1 -0
- package/dist/components/table-of-contents/types.js +1 -0
- package/dist/components/table-of-contents/types.js.map +1 -0
- package/dist/components/table-of-contents.d.ts +1 -0
- package/dist/components/table-of-contents.js +1 -0
- package/dist/components/toggle/Toggle.d.ts.map +1 -1
- package/dist/components/toggle/Toggle.js +12 -1
- package/dist/components/toggle/Toggle.js.map +1 -1
- package/dist/components/toggle-group/ToggleGroup.d.ts +1 -1
- package/dist/components/toggle-group/ToggleGroup.d.ts.map +1 -1
- package/dist/components/toggle-group/ToggleGroup.js +6 -1
- package/dist/components/toggle-group/ToggleGroup.js.map +1 -1
- package/dist/components/toggle-group/client/ToggleGroupClient.d.ts +1 -1
- package/dist/components/toggle-group/client/ToggleGroupClient.d.ts.map +1 -1
- package/dist/components/toggle-group/client/ToggleGroupClient.js +19 -6
- package/dist/components/toggle-group/client/ToggleGroupClient.js.map +1 -1
- package/dist/components/toggle-group/types.d.ts +3 -3
- package/dist/components/toggle-group/types.d.ts.map +1 -1
- package/dist/components/toolbar/ToolbarShell.d.ts.map +1 -1
- package/dist/components/toolbar/ToolbarShell.js +5 -2
- package/dist/components/toolbar/ToolbarShell.js.map +1 -1
- package/dist/components/toolbar/types.d.ts +2 -1
- package/dist/components/toolbar/types.d.ts.map +1 -1
- package/dist/core/render-native-invoker.d.ts +1 -1
- package/dist/core/render-native-invoker.d.ts.map +1 -1
- package/dist/core/render-native-invoker.js.map +1 -1
- package/dist/styles/index.css +1 -1
- package/package.json +4 -2
- package/skills/uiify/SKILL.md +167 -0
- package/skills/uiify/scripts/lint.mjs +56 -0
- package/skills/uiify/scripts/static.mjs +95 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { resolveTableOfContentsId } from "../scrollspy-selection.js";
|
|
2
|
+
function attachTableOfContentsInteractions({
|
|
3
|
+
root,
|
|
4
|
+
getOpen,
|
|
5
|
+
requestOpen,
|
|
6
|
+
controlled,
|
|
7
|
+
openOnHover,
|
|
8
|
+
openDelay,
|
|
9
|
+
closeDelay
|
|
10
|
+
}) {
|
|
11
|
+
const doc = root.ownerDocument, view = doc.defaultView;
|
|
12
|
+
const part = (name) => [...root.querySelectorAll(`[data-part="${name}"]`)].find(
|
|
13
|
+
(node) => node.closest("[data-uiify-table-of-contents]") === root
|
|
14
|
+
) ?? null;
|
|
15
|
+
const panel = () => part("content");
|
|
16
|
+
const trigger = () => part("trigger");
|
|
17
|
+
const within = (node) => node instanceof view.Node && (panel()?.contains(node) || trigger()?.contains(node));
|
|
18
|
+
let timer = 0, toggleTimer = 0, pinned = false, transient = false, suppressed = false, returnFocus = false, navigating = false, destroyed = false;
|
|
19
|
+
const clear = () => {
|
|
20
|
+
view.clearTimeout(timer);
|
|
21
|
+
timer = 0;
|
|
22
|
+
};
|
|
23
|
+
const focused = () => panel()?.contains(doc.activeElement);
|
|
24
|
+
const enter = (event) => {
|
|
25
|
+
const pointer = event;
|
|
26
|
+
if (pointer.pointerType !== "mouse" || !within(pointer.target) || within(pointer.relatedTarget))
|
|
27
|
+
return;
|
|
28
|
+
clear();
|
|
29
|
+
if (!openOnHover || suppressed || getOpen()) return;
|
|
30
|
+
timer = view.setTimeout(() => {
|
|
31
|
+
timer = 0;
|
|
32
|
+
transient = true;
|
|
33
|
+
requestOpen(true);
|
|
34
|
+
}, openDelay);
|
|
35
|
+
};
|
|
36
|
+
const leave = (event) => {
|
|
37
|
+
if (within(event.relatedTarget)) return;
|
|
38
|
+
suppressed = false;
|
|
39
|
+
clear();
|
|
40
|
+
if (transient && !pinned && !focused())
|
|
41
|
+
timer = view.setTimeout(() => {
|
|
42
|
+
timer = 0;
|
|
43
|
+
transient = false;
|
|
44
|
+
requestOpen(false);
|
|
45
|
+
}, closeDelay);
|
|
46
|
+
};
|
|
47
|
+
const focus = () => clear();
|
|
48
|
+
const blur = (event) => {
|
|
49
|
+
if (!root.contains(event.relatedTarget) && transient && !pinned) {
|
|
50
|
+
clear();
|
|
51
|
+
timer = view.setTimeout(() => requestOpen(false), closeDelay);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const before = (event) => {
|
|
55
|
+
if (event.target !== panel()) return;
|
|
56
|
+
const next = event.newState === "open";
|
|
57
|
+
if (!next) {
|
|
58
|
+
returnFocus = !navigating && (focused() ?? false);
|
|
59
|
+
navigating = false;
|
|
60
|
+
clear();
|
|
61
|
+
transient = false;
|
|
62
|
+
pinned = false;
|
|
63
|
+
suppressed = true;
|
|
64
|
+
}
|
|
65
|
+
if (next !== getOpen()) {
|
|
66
|
+
requestOpen(next);
|
|
67
|
+
if (controlled && event.cancelable) event.preventDefault();
|
|
68
|
+
}
|
|
69
|
+
view.clearTimeout(toggleTimer);
|
|
70
|
+
toggleTimer = view.setTimeout(() => {
|
|
71
|
+
const surface = panel();
|
|
72
|
+
if (destroyed || !surface?.isConnected) return;
|
|
73
|
+
const actual = surface.matches(":popover-open");
|
|
74
|
+
if (controlled && actual !== getOpen()) {
|
|
75
|
+
if (getOpen()) surface.showPopover();
|
|
76
|
+
else surface.hidePopover();
|
|
77
|
+
} else if (!actual && returnFocus) {
|
|
78
|
+
returnFocus = false;
|
|
79
|
+
trigger()?.focus({ preventScroll: true });
|
|
80
|
+
}
|
|
81
|
+
}, 0);
|
|
82
|
+
};
|
|
83
|
+
root.addEventListener("pointerover", enter);
|
|
84
|
+
root.addEventListener("pointerout", leave);
|
|
85
|
+
root.addEventListener("focusin", focus);
|
|
86
|
+
root.addEventListener("focusout", blur);
|
|
87
|
+
root.addEventListener("beforetoggle", before, true);
|
|
88
|
+
return {
|
|
89
|
+
click(event) {
|
|
90
|
+
if (event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)
|
|
91
|
+
return;
|
|
92
|
+
const element = event.target.closest(
|
|
93
|
+
'[data-part="trigger"], [data-part="link"]'
|
|
94
|
+
);
|
|
95
|
+
if (!element || element.closest("[data-uiify-table-of-contents]") !== root) return;
|
|
96
|
+
if (element === trigger()) {
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
clear();
|
|
99
|
+
const rail = event.target.closest('[data-part="rail"]');
|
|
100
|
+
const indicator = event.target.closest('[data-part="indicator"]') ?? rail?.querySelector('[data-part="indicator"][data-highlighted]');
|
|
101
|
+
const id = indicator?.getAttribute("data-uiify-toc-value");
|
|
102
|
+
if (rail && id && event.detail > 0 && event.pointerType !== "touch") {
|
|
103
|
+
const link = [...root.querySelectorAll('[data-part="link"]')].find(
|
|
104
|
+
(node) => node.closest("[data-uiify-table-of-contents]") === root && node.getAttribute("data-uiify-toc-value") === id
|
|
105
|
+
);
|
|
106
|
+
if (link) {
|
|
107
|
+
link.click();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (transient && getOpen()) {
|
|
112
|
+
transient = false;
|
|
113
|
+
pinned = true;
|
|
114
|
+
} else {
|
|
115
|
+
pinned = !getOpen();
|
|
116
|
+
transient = false;
|
|
117
|
+
suppressed = !pinned;
|
|
118
|
+
requestOpen(pinned);
|
|
119
|
+
}
|
|
120
|
+
} else if (!element.hasAttribute("download") && (!element.getAttribute("target") || element.getAttribute("target") === "_self") && resolveTableOfContentsId(element.getAttribute("href") ?? "", doc.URL) !== null) {
|
|
121
|
+
clear();
|
|
122
|
+
navigating = true;
|
|
123
|
+
pinned = false;
|
|
124
|
+
transient = false;
|
|
125
|
+
suppressed = true;
|
|
126
|
+
requestOpen(false);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
destroy() {
|
|
130
|
+
destroyed = true;
|
|
131
|
+
clear();
|
|
132
|
+
view.clearTimeout(toggleTimer);
|
|
133
|
+
root.removeEventListener("pointerover", enter);
|
|
134
|
+
root.removeEventListener("pointerout", leave);
|
|
135
|
+
root.removeEventListener("focusin", focus);
|
|
136
|
+
root.removeEventListener("focusout", blur);
|
|
137
|
+
root.removeEventListener("beforetoggle", before, true);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export {
|
|
142
|
+
attachTableOfContentsInteractions
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=table-of-contents-interactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/table-of-contents/client/table-of-contents-interactions.ts"],"sourcesContent":["import { resolveTableOfContentsId } from \"../scrollspy-selection.js\";\nimport type { TableOfContentsInteractionOptions, TableOfContentsInteractions } from \"../types.js\";\n\nexport function attachTableOfContentsInteractions({\n root,\n getOpen,\n requestOpen,\n controlled,\n openOnHover,\n openDelay,\n closeDelay,\n}: TableOfContentsInteractionOptions): TableOfContentsInteractions {\n const doc = root.ownerDocument,\n view = doc.defaultView!;\n const part = (name: string) =>\n [...root.querySelectorAll<HTMLElement>(`[data-part=\"${name}\"]`)].find(\n (node) => node.closest(\"[data-uiify-table-of-contents]\") === root,\n ) ?? null;\n const panel = () => part(\"content\");\n const trigger = () => part(\"trigger\");\n const within = (node: EventTarget | null) =>\n node instanceof view.Node && (panel()?.contains(node) || trigger()?.contains(node));\n let timer = 0,\n toggleTimer = 0,\n pinned = false,\n transient = false,\n suppressed = false,\n returnFocus = false,\n navigating = false,\n destroyed = false;\n const clear = () => {\n view.clearTimeout(timer);\n timer = 0;\n };\n const focused = () => panel()?.contains(doc.activeElement);\n const enter = (event: Event) => {\n const pointer = event as PointerEvent;\n if (pointer.pointerType !== \"mouse\" || !within(pointer.target) || within(pointer.relatedTarget))\n return;\n clear();\n if (!openOnHover || suppressed || getOpen()) return;\n timer = view.setTimeout(() => {\n timer = 0;\n transient = true;\n requestOpen(true);\n }, openDelay);\n };\n const leave = (event: Event) => {\n if (within((event as PointerEvent).relatedTarget)) return;\n suppressed = false;\n clear();\n if (transient && !pinned && !focused())\n timer = view.setTimeout(() => {\n timer = 0;\n transient = false;\n requestOpen(false);\n }, closeDelay);\n };\n const focus = () => clear();\n const blur = (event: Event) => {\n if (\n !root.contains((event as FocusEvent).relatedTarget as Node | null) &&\n transient &&\n !pinned\n ) {\n clear();\n timer = view.setTimeout(() => requestOpen(false), closeDelay);\n }\n };\n const before = (event: Event) => {\n if (event.target !== panel()) return;\n const next = (event as ToggleEvent).newState === \"open\";\n if (!next) {\n returnFocus = !navigating && (focused() ?? false);\n navigating = false;\n clear();\n transient = false;\n pinned = false;\n suppressed = true;\n }\n if (next !== getOpen()) {\n requestOpen(next);\n if (controlled && event.cancelable) event.preventDefault();\n }\n view.clearTimeout(toggleTimer);\n toggleTimer = view.setTimeout(() => {\n const surface = panel();\n if (destroyed || !surface?.isConnected) return;\n const actual = surface.matches(\":popover-open\");\n if (controlled && actual !== getOpen()) {\n if (getOpen()) surface.showPopover();\n else surface.hidePopover();\n } else if (!actual && returnFocus) {\n returnFocus = false;\n trigger()?.focus({ preventScroll: true });\n }\n }, 0);\n };\n root.addEventListener(\"pointerover\", enter);\n root.addEventListener(\"pointerout\", leave);\n root.addEventListener(\"focusin\", focus);\n root.addEventListener(\"focusout\", blur);\n root.addEventListener(\"beforetoggle\", before, true);\n return {\n click(event) {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n event.altKey\n )\n return;\n const element = (event.target as Element).closest(\n '[data-part=\"trigger\"], [data-part=\"link\"]',\n );\n if (!element || element.closest(\"[data-uiify-table-of-contents]\") !== root) return;\n if (element === trigger()) {\n event.preventDefault();\n clear();\n const rail = (event.target as Element).closest('[data-part=\"rail\"]');\n const indicator =\n (event.target as Element).closest('[data-part=\"indicator\"]') ??\n rail?.querySelector('[data-part=\"indicator\"][data-highlighted]');\n const id = indicator?.getAttribute(\"data-uiify-toc-value\");\n if (rail && id && event.detail > 0 && (event as PointerEvent).pointerType !== \"touch\") {\n const link = [...root.querySelectorAll<HTMLAnchorElement>('[data-part=\"link\"]')].find(\n (node) =>\n node.closest(\"[data-uiify-table-of-contents]\") === root &&\n node.getAttribute(\"data-uiify-toc-value\") === id,\n );\n if (link) {\n link.click();\n return;\n }\n }\n if (transient && getOpen()) {\n transient = false;\n pinned = true;\n } else {\n pinned = !getOpen();\n transient = false;\n suppressed = !pinned;\n requestOpen(pinned);\n }\n } else if (\n !element.hasAttribute(\"download\") &&\n (!element.getAttribute(\"target\") || element.getAttribute(\"target\") === \"_self\") &&\n resolveTableOfContentsId(element.getAttribute(\"href\") ?? \"\", doc.URL) !== null\n ) {\n clear();\n navigating = true;\n pinned = false;\n transient = false;\n suppressed = true;\n requestOpen(false);\n }\n },\n destroy() {\n destroyed = true;\n clear();\n view.clearTimeout(toggleTimer);\n root.removeEventListener(\"pointerover\", enter);\n root.removeEventListener(\"pointerout\", leave);\n root.removeEventListener(\"focusin\", focus);\n root.removeEventListener(\"focusout\", blur);\n root.removeEventListener(\"beforetoggle\", before, true);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-of-contents-pointer.d.ts","sourceRoot":"","sources":["../../../../src/components/table-of-contents/client/table-of-contents-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAEjE,wBAAgB,4BAA4B,CAAC,EAAE,IAAI,EAAE,EAAE,6BAA6B,GAAG,MAAM,IAAI,CA+FhG"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
function attachTableOfContentsPointer({ root }) {
|
|
2
|
+
const view = root.ownerDocument.defaultView;
|
|
3
|
+
const rail = root.querySelector('[data-part="rail"]');
|
|
4
|
+
if (!rail) return () => {
|
|
5
|
+
};
|
|
6
|
+
let nodes = [], centers = /* @__PURE__ */ new Map(), frame = 0, y = null;
|
|
7
|
+
const select = (id) => {
|
|
8
|
+
for (const node of root.querySelectorAll("[data-uiify-toc-value]"))
|
|
9
|
+
if (node.closest("[data-uiify-table-of-contents]") === root)
|
|
10
|
+
node.toggleAttribute(
|
|
11
|
+
"data-highlighted",
|
|
12
|
+
id !== null && node.getAttribute("data-uiify-toc-value") === id
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
const measure = () => {
|
|
16
|
+
observer.disconnect();
|
|
17
|
+
centers.clear();
|
|
18
|
+
nodes = [...rail.querySelectorAll('[data-part="indicator"]')];
|
|
19
|
+
nodes.forEach((node, index) => {
|
|
20
|
+
node.style.setProperty("--uiify-toc-index", String(index));
|
|
21
|
+
observer.observe(node);
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
const observer = new view.IntersectionObserver((entries) => {
|
|
25
|
+
for (const entry of entries)
|
|
26
|
+
centers.set(entry.target, entry.boundingClientRect.top + entry.boundingClientRect.height / 2);
|
|
27
|
+
});
|
|
28
|
+
const resize = new view.ResizeObserver(measure);
|
|
29
|
+
resize.observe(rail);
|
|
30
|
+
const mutations = new view.MutationObserver(measure);
|
|
31
|
+
mutations.observe(rail, { childList: true, subtree: true });
|
|
32
|
+
const reset = () => {
|
|
33
|
+
y = null;
|
|
34
|
+
rail.style.removeProperty("--uiify-toc-pointer");
|
|
35
|
+
select(null);
|
|
36
|
+
};
|
|
37
|
+
const move = (event) => {
|
|
38
|
+
if (event.pointerType !== "mouse") return;
|
|
39
|
+
y = event.clientY;
|
|
40
|
+
if (frame) return;
|
|
41
|
+
frame = view.requestAnimationFrame(() => {
|
|
42
|
+
frame = 0;
|
|
43
|
+
if (y === null || centers.size !== nodes.length || !nodes.length) return;
|
|
44
|
+
let index = 0;
|
|
45
|
+
for (let i = 1; i < nodes.length; i++) {
|
|
46
|
+
const previous = centers.get(nodes[i - 1]), next = centers.get(nodes[i]);
|
|
47
|
+
index = i - 1 + (y - previous) / (next - previous || 1);
|
|
48
|
+
if (y <= next) break;
|
|
49
|
+
}
|
|
50
|
+
rail.style.setProperty("--uiify-toc-pointer", String(index));
|
|
51
|
+
const nearest = nodes[Math.max(0, Math.min(nodes.length - 1, Math.round(index)))];
|
|
52
|
+
select(nearest?.getAttribute("data-uiify-toc-value") ?? null);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const highlight = (event) => {
|
|
56
|
+
const target = event.type.endsWith("out") ? event.relatedTarget : event.target;
|
|
57
|
+
const link = target instanceof view.Element ? target.closest('[data-part="link"]') : null;
|
|
58
|
+
const id = link?.closest("[data-uiify-table-of-contents]") === root ? link.getAttribute("data-uiify-toc-value") : null;
|
|
59
|
+
select(id);
|
|
60
|
+
};
|
|
61
|
+
rail.addEventListener("pointermove", move);
|
|
62
|
+
rail.addEventListener("pointerleave", reset);
|
|
63
|
+
root.addEventListener("pointerover", highlight);
|
|
64
|
+
root.addEventListener("focusin", highlight);
|
|
65
|
+
root.addEventListener("pointerout", highlight);
|
|
66
|
+
root.addEventListener("focusout", highlight);
|
|
67
|
+
const scroll = () => {
|
|
68
|
+
if (!frame)
|
|
69
|
+
frame = view.requestAnimationFrame(() => {
|
|
70
|
+
frame = 0;
|
|
71
|
+
measure();
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
view.addEventListener("scroll", scroll, true);
|
|
75
|
+
measure();
|
|
76
|
+
return () => {
|
|
77
|
+
observer.disconnect();
|
|
78
|
+
resize.disconnect();
|
|
79
|
+
mutations.disconnect();
|
|
80
|
+
if (frame) view.cancelAnimationFrame(frame);
|
|
81
|
+
rail.removeEventListener("pointermove", move);
|
|
82
|
+
rail.removeEventListener("pointerleave", reset);
|
|
83
|
+
root.removeEventListener("pointerover", highlight);
|
|
84
|
+
root.removeEventListener("focusin", highlight);
|
|
85
|
+
root.removeEventListener("pointerout", highlight);
|
|
86
|
+
root.removeEventListener("focusout", highlight);
|
|
87
|
+
view.removeEventListener("scroll", scroll, true);
|
|
88
|
+
reset();
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
attachTableOfContentsPointer
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=table-of-contents-pointer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/table-of-contents/client/table-of-contents-pointer.ts"],"sourcesContent":["import type { TableOfContentsPointerOptions } from \"../types.js\";\n\nexport function attachTableOfContentsPointer({ root }: TableOfContentsPointerOptions): () => void {\n const view = root.ownerDocument.defaultView!;\n const rail = root.querySelector<HTMLElement>('[data-part=\"rail\"]');\n if (!rail) return () => {};\n let nodes: HTMLElement[] = [],\n centers = new Map<Element, number>(),\n frame = 0,\n y: number | null = null;\n const select = (id: string | null) => {\n for (const node of root.querySelectorAll(\"[data-uiify-toc-value]\"))\n if (node.closest(\"[data-uiify-table-of-contents]\") === root)\n node.toggleAttribute(\n \"data-highlighted\",\n id !== null && node.getAttribute(\"data-uiify-toc-value\") === id,\n );\n };\n const measure = () => {\n observer.disconnect();\n centers.clear();\n nodes = [...rail.querySelectorAll<HTMLElement>('[data-part=\"indicator\"]')];\n nodes.forEach((node, index) => {\n node.style.setProperty(\"--uiify-toc-index\", String(index));\n observer.observe(node);\n });\n };\n const observer = new view.IntersectionObserver((entries) => {\n for (const entry of entries)\n centers.set(entry.target, entry.boundingClientRect.top + entry.boundingClientRect.height / 2);\n });\n const resize = new view.ResizeObserver(measure);\n resize.observe(rail);\n const mutations = new view.MutationObserver(measure);\n mutations.observe(rail, { childList: true, subtree: true });\n const reset = () => {\n y = null;\n rail.style.removeProperty(\"--uiify-toc-pointer\");\n select(null);\n };\n const move = (event: PointerEvent) => {\n if (event.pointerType !== \"mouse\") return;\n y = event.clientY;\n if (frame) return;\n frame = view.requestAnimationFrame(() => {\n frame = 0;\n if (y === null || centers.size !== nodes.length || !nodes.length) return;\n let index = 0;\n for (let i = 1; i < nodes.length; i++) {\n const previous = centers.get(nodes[i - 1]!)!,\n next = centers.get(nodes[i]!)!;\n index = i - 1 + (y - previous) / (next - previous || 1);\n if (y <= next) break;\n }\n rail.style.setProperty(\"--uiify-toc-pointer\", String(index));\n const nearest = nodes[Math.max(0, Math.min(nodes.length - 1, Math.round(index)))];\n select(nearest?.getAttribute(\"data-uiify-toc-value\") ?? null);\n });\n };\n const highlight = (event: Event) => {\n const target = event.type.endsWith(\"out\") ? (event as FocusEvent).relatedTarget : event.target;\n const link = target instanceof view.Element ? target.closest('[data-part=\"link\"]') : null;\n const id =\n link?.closest(\"[data-uiify-table-of-contents]\") === root\n ? link.getAttribute(\"data-uiify-toc-value\")\n : null;\n select(id);\n };\n rail.addEventListener(\"pointermove\", move);\n rail.addEventListener(\"pointerleave\", reset);\n root.addEventListener(\"pointerover\", highlight);\n root.addEventListener(\"focusin\", highlight);\n root.addEventListener(\"pointerout\", highlight);\n root.addEventListener(\"focusout\", highlight);\n const scroll = () => {\n if (!frame)\n frame = view.requestAnimationFrame(() => {\n frame = 0;\n measure();\n });\n };\n view.addEventListener(\"scroll\", scroll, true);\n measure();\n return () => {\n observer.disconnect();\n resize.disconnect();\n mutations.disconnect();\n if (frame) view.cancelAnimationFrame(frame);\n rail.removeEventListener(\"pointermove\", move);\n rail.removeEventListener(\"pointerleave\", reset);\n root.removeEventListener(\"pointerover\", highlight);\n root.removeEventListener(\"focusin\", highlight);\n root.removeEventListener(\"pointerout\", highlight);\n root.removeEventListener(\"focusout\", highlight);\n view.removeEventListener(\"scroll\", scroll, true);\n reset();\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./client/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./client/index.js";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { TableOfContents, TableOfContentsRoot, TableOfContentsTrigger, TableOfContentsRail, TableOfContentsIndicator, TableOfContentsContent, TableOfContentsList, TableOfContentsLink, } from "./TableOfContents.js";
|
|
2
|
+
export type { TableOfContentsLevel, TableOfContentsRootOwnProps, TableOfContentsRootProps, TableOfContentsTriggerOwnProps, TableOfContentsTriggerProps, TableOfContentsRailOwnProps, TableOfContentsRailProps, TableOfContentsIndicatorOwnProps, TableOfContentsIndicatorProps, TableOfContentsContentOwnProps, TableOfContentsContentProps, TableOfContentsListOwnProps, TableOfContentsListProps, TableOfContentsLinkOwnProps, TableOfContentsLinkProps, } from "./types.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/table-of-contents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,wBAAwB,EACxB,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,gCAAgC,EAChC,6BAA6B,EAC7B,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TableOfContents,
|
|
3
|
+
TableOfContentsRoot,
|
|
4
|
+
TableOfContentsTrigger,
|
|
5
|
+
TableOfContentsRail,
|
|
6
|
+
TableOfContentsIndicator,
|
|
7
|
+
TableOfContentsContent,
|
|
8
|
+
TableOfContentsList,
|
|
9
|
+
TableOfContentsLink
|
|
10
|
+
} from "./TableOfContents.js";
|
|
11
|
+
export {
|
|
12
|
+
TableOfContents,
|
|
13
|
+
TableOfContentsContent,
|
|
14
|
+
TableOfContentsIndicator,
|
|
15
|
+
TableOfContentsLink,
|
|
16
|
+
TableOfContentsList,
|
|
17
|
+
TableOfContentsRail,
|
|
18
|
+
TableOfContentsRoot,
|
|
19
|
+
TableOfContentsTrigger
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/table-of-contents/index.ts"],"sourcesContent":["export {\n TableOfContents,\n TableOfContentsRoot,\n TableOfContentsTrigger,\n TableOfContentsRail,\n TableOfContentsIndicator,\n TableOfContentsContent,\n TableOfContentsList,\n TableOfContentsLink,\n} from \"./TableOfContents.js\";\nexport type {\n TableOfContentsLevel,\n TableOfContentsRootOwnProps,\n TableOfContentsRootProps,\n TableOfContentsTriggerOwnProps,\n TableOfContentsTriggerProps,\n TableOfContentsRailOwnProps,\n TableOfContentsRailProps,\n TableOfContentsIndicatorOwnProps,\n TableOfContentsIndicatorProps,\n TableOfContentsContentOwnProps,\n TableOfContentsContentProps,\n TableOfContentsListOwnProps,\n TableOfContentsListProps,\n TableOfContentsLinkOwnProps,\n TableOfContentsLinkProps,\n} from \"./types.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TableOfContentsScrollSnapshot } from "./types.js";
|
|
2
|
+
export declare function resolveTableOfContentsId(href: string, documentUrl: string): string | null;
|
|
3
|
+
export declare function getTableOfContentsValue({ targets, viewportStart, viewportEnd, offset, contentEnd, }: TableOfContentsScrollSnapshot): string | null;
|
|
4
|
+
//# sourceMappingURL=scrollspy-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollspy-selection.d.ts","sourceRoot":"","sources":["../../../src/components/table-of-contents/scrollspy-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAezF;AAED,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,aAAa,EACb,WAAW,EACX,MAAM,EACN,UAAU,GACX,EAAE,6BAA6B,GAAG,MAAM,GAAG,IAAI,CAQ/C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function resolveTableOfContentsId(href, documentUrl) {
|
|
2
|
+
try {
|
|
3
|
+
const base = new URL(documentUrl);
|
|
4
|
+
const link = new URL(href, base);
|
|
5
|
+
if (link.origin !== base.origin || link.pathname !== base.pathname || link.search !== base.search || link.hash.length < 2)
|
|
6
|
+
return null;
|
|
7
|
+
return decodeURIComponent(link.hash.slice(1));
|
|
8
|
+
} catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function getTableOfContentsValue({
|
|
13
|
+
targets,
|
|
14
|
+
viewportStart,
|
|
15
|
+
viewportEnd,
|
|
16
|
+
offset,
|
|
17
|
+
contentEnd
|
|
18
|
+
}) {
|
|
19
|
+
const visible = targets.filter((target) => target.visible);
|
|
20
|
+
if (contentEnd !== null && viewportStart > 0 && contentEnd <= viewportEnd + 1)
|
|
21
|
+
return visible.at(-1)?.value ?? null;
|
|
22
|
+
let active = visible[0]?.value ?? null;
|
|
23
|
+
for (const target of visible)
|
|
24
|
+
if (target.start <= viewportStart + offset + 1) active = target.value;
|
|
25
|
+
return active;
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
getTableOfContentsValue,
|
|
29
|
+
resolveTableOfContentsId
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=scrollspy-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/table-of-contents/scrollspy-selection.ts"],"sourcesContent":["import type { TableOfContentsScrollSnapshot } from \"./types.js\";\n\nexport function resolveTableOfContentsId(href: string, documentUrl: string): string | null {\n try {\n const base = new URL(documentUrl);\n const link = new URL(href, base);\n if (\n link.origin !== base.origin ||\n link.pathname !== base.pathname ||\n link.search !== base.search ||\n link.hash.length < 2\n )\n return null;\n return decodeURIComponent(link.hash.slice(1));\n } catch {\n return null;\n }\n}\n\nexport function getTableOfContentsValue({\n targets,\n viewportStart,\n viewportEnd,\n offset,\n contentEnd,\n}: TableOfContentsScrollSnapshot): string | null {\n const visible = targets.filter((target) => target.visible);\n if (contentEnd !== null && viewportStart > 0 && contentEnd <= viewportEnd + 1)\n return visible.at(-1)?.value ?? null;\n let active = visible[0]?.value ?? null;\n for (const target of visible)\n if (target.start <= viewportStart + offset + 1) active = target.value;\n return active;\n}\n"],"mappings":"AAEO,SAAS,yBAAyB,MAAc,aAAoC;AACzF,MAAI;AACF,UAAM,OAAO,IAAI,IAAI,WAAW;AAChC,UAAM,OAAO,IAAI,IAAI,MAAM,IAAI;AAC/B,QACE,KAAK,WAAW,KAAK,UACrB,KAAK,aAAa,KAAK,YACvB,KAAK,WAAW,KAAK,UACrB,KAAK,KAAK,SAAS;AAEnB,aAAO;AACT,WAAO,mBAAmB,KAAK,KAAK,MAAM,CAAC,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,QAAM,UAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO;AACzD,MAAI,eAAe,QAAQ,gBAAgB,KAAK,cAAc,cAAc;AAC1E,WAAO,QAAQ,GAAG,EAAE,GAAG,SAAS;AAClC,MAAI,SAAS,QAAQ,CAAC,GAAG,SAAS;AAClC,aAAW,UAAU;AACnB,QAAI,OAAO,SAAS,gBAAgB,SAAS,EAAG,UAAS,OAAO;AAClE,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TableOfContentsObserver, TableOfContentsObserverOptions } from "./types.js";
|
|
2
|
+
export { getTableOfContentsValue, resolveTableOfContentsId } from "./scrollspy-selection.js";
|
|
3
|
+
export declare function observeTableOfContents({ root, scrollTarget, contentTarget, offset, onValueChange, }: TableOfContentsObserverOptions): TableOfContentsObserver;
|
|
4
|
+
//# sourceMappingURL=scrollspy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollspy.d.ts","sourceRoot":"","sources":["../../../src/components/table-of-contents/scrollspy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,uBAAuB,EACvB,8BAA8B,EAE/B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE7F,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,MAAM,EACN,aAAa,GACd,EAAE,8BAA8B,GAAG,uBAAuB,CAyK1D"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { getTableOfContentsValue, resolveTableOfContentsId } from "./scrollspy-selection.js";
|
|
2
|
+
import { getTableOfContentsValue as getTableOfContentsValue2, resolveTableOfContentsId as resolveTableOfContentsId2 } from "./scrollspy-selection.js";
|
|
3
|
+
function observeTableOfContents({
|
|
4
|
+
root,
|
|
5
|
+
scrollTarget,
|
|
6
|
+
contentTarget,
|
|
7
|
+
offset,
|
|
8
|
+
onValueChange
|
|
9
|
+
}) {
|
|
10
|
+
const doc = root.ownerDocument;
|
|
11
|
+
const view = doc.defaultView;
|
|
12
|
+
let scrollNode = null;
|
|
13
|
+
let content = null;
|
|
14
|
+
let host = null;
|
|
15
|
+
let observer = null;
|
|
16
|
+
let nodes = [];
|
|
17
|
+
let positions = /* @__PURE__ */ new Map();
|
|
18
|
+
let contentEnd = null;
|
|
19
|
+
let viewportSize = 0;
|
|
20
|
+
let frame = 0;
|
|
21
|
+
let generation = 0;
|
|
22
|
+
let destroyed = false;
|
|
23
|
+
let last;
|
|
24
|
+
const resized = /* @__PURE__ */ new Set();
|
|
25
|
+
const emit = (value) => {
|
|
26
|
+
if (last !== value) {
|
|
27
|
+
last = value;
|
|
28
|
+
onValueChange(value);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const position = () => {
|
|
32
|
+
return scrollNode ? scrollNode.scrollTop : view.scrollY;
|
|
33
|
+
};
|
|
34
|
+
const update = () => {
|
|
35
|
+
if (positions.size !== nodes.length || !viewportSize) return;
|
|
36
|
+
const start = position();
|
|
37
|
+
emit(
|
|
38
|
+
getTableOfContentsValue({
|
|
39
|
+
targets: nodes.flatMap((node) => {
|
|
40
|
+
const target = positions.get(node);
|
|
41
|
+
return target ? [target] : [];
|
|
42
|
+
}),
|
|
43
|
+
viewportStart: start,
|
|
44
|
+
viewportEnd: start + viewportSize,
|
|
45
|
+
offset,
|
|
46
|
+
contentEnd
|
|
47
|
+
})
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
const scroll = () => {
|
|
51
|
+
if (!frame)
|
|
52
|
+
frame = view.requestAnimationFrame(() => {
|
|
53
|
+
frame = 0;
|
|
54
|
+
update();
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const schedule = () => {
|
|
58
|
+
if (frame) view.cancelAnimationFrame(frame);
|
|
59
|
+
frame = view.requestAnimationFrame(() => {
|
|
60
|
+
frame = 0;
|
|
61
|
+
refresh();
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const resize = new view.ResizeObserver(schedule);
|
|
65
|
+
const mutations = new view.MutationObserver((changes) => {
|
|
66
|
+
if (changes.some((change) => !root.contains(change.target))) schedule();
|
|
67
|
+
});
|
|
68
|
+
const links = new view.MutationObserver(schedule);
|
|
69
|
+
links.observe(root, {
|
|
70
|
+
subtree: true,
|
|
71
|
+
childList: true,
|
|
72
|
+
attributes: true,
|
|
73
|
+
attributeFilter: ["href"]
|
|
74
|
+
});
|
|
75
|
+
function refresh() {
|
|
76
|
+
if (destroyed) return;
|
|
77
|
+
generation++;
|
|
78
|
+
observer?.disconnect();
|
|
79
|
+
mutations.disconnect();
|
|
80
|
+
scrollNode = scrollTarget === void 0 ? null : doc.getElementById(scrollTarget);
|
|
81
|
+
content = contentTarget === void 0 ? doc.documentElement : doc.getElementById(contentTarget);
|
|
82
|
+
const nextHost = scrollTarget !== void 0 && !scrollNode ? null : scrollNode ?? view;
|
|
83
|
+
if (host !== nextHost) {
|
|
84
|
+
host?.removeEventListener("scroll", scroll);
|
|
85
|
+
host = nextHost;
|
|
86
|
+
host?.addEventListener("scroll", scroll, { passive: true });
|
|
87
|
+
}
|
|
88
|
+
if (!host || !content) {
|
|
89
|
+
emit(null);
|
|
90
|
+
mutations.observe(doc.documentElement, { subtree: true, childList: true });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const values = /* @__PURE__ */ new Map();
|
|
94
|
+
for (const link of root.querySelectorAll('[data-part="link"][href]')) {
|
|
95
|
+
if (link.closest("[data-uiify-table-of-contents]") !== root) continue;
|
|
96
|
+
const value = resolveTableOfContentsId(link.getAttribute("href"), doc.URL);
|
|
97
|
+
const node = value === null ? null : doc.getElementById(value);
|
|
98
|
+
if (node && content.contains(node)) values.set(node, value);
|
|
99
|
+
}
|
|
100
|
+
nodes = [...values.keys()].sort((a, b) => a.compareDocumentPosition(b) & 2 ? 1 : -1);
|
|
101
|
+
positions = /* @__PURE__ */ new Map();
|
|
102
|
+
contentEnd = null;
|
|
103
|
+
viewportSize = 0;
|
|
104
|
+
if (!nodes.length) emit(null);
|
|
105
|
+
const current = generation;
|
|
106
|
+
observer = new view.IntersectionObserver(
|
|
107
|
+
(entries) => {
|
|
108
|
+
if (destroyed || generation !== current) return;
|
|
109
|
+
const start = position();
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
const rect = entry.boundingClientRect;
|
|
112
|
+
const origin = entry.rootBounds?.top ?? 0;
|
|
113
|
+
viewportSize = entry.rootBounds?.height ?? viewportSize;
|
|
114
|
+
if (entry.target === content) contentEnd = rect.bottom + start - origin;
|
|
115
|
+
const value = values.get(entry.target);
|
|
116
|
+
if (value !== void 0)
|
|
117
|
+
positions.set(entry.target, {
|
|
118
|
+
value,
|
|
119
|
+
start: rect.top + start - origin,
|
|
120
|
+
visible: rect.width > 0 && rect.height > 0
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
update();
|
|
124
|
+
},
|
|
125
|
+
{ root: scrollNode, threshold: [0, 1] }
|
|
126
|
+
);
|
|
127
|
+
const observed = /* @__PURE__ */ new Set([content, ...nodes, ...scrollNode ? [scrollNode] : []]);
|
|
128
|
+
for (const node of resized)
|
|
129
|
+
if (!observed.has(node)) {
|
|
130
|
+
resize.unobserve(node);
|
|
131
|
+
resized.delete(node);
|
|
132
|
+
}
|
|
133
|
+
for (const node of observed) {
|
|
134
|
+
if (node !== scrollNode) observer.observe(node);
|
|
135
|
+
if (!resized.has(node)) {
|
|
136
|
+
resize.observe(node);
|
|
137
|
+
resized.add(node);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const boundaries = contentTarget !== void 0 ? [content] : new Set(
|
|
141
|
+
nodes.map((node) => {
|
|
142
|
+
const parent = node.closest("article, main") ?? node.parentElement;
|
|
143
|
+
return parent && parent !== doc.body && parent !== doc.documentElement ? parent : node;
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
for (const boundary of boundaries)
|
|
147
|
+
mutations.observe(boundary, {
|
|
148
|
+
subtree: true,
|
|
149
|
+
childList: true,
|
|
150
|
+
attributes: true,
|
|
151
|
+
attributeFilter: ["id", "hidden", "open", "class", "style"]
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
view.addEventListener("resize", schedule);
|
|
155
|
+
view.addEventListener("hashchange", scroll);
|
|
156
|
+
refresh();
|
|
157
|
+
return {
|
|
158
|
+
refresh,
|
|
159
|
+
destroy() {
|
|
160
|
+
destroyed = true;
|
|
161
|
+
generation++;
|
|
162
|
+
observer?.disconnect();
|
|
163
|
+
resize.disconnect();
|
|
164
|
+
mutations.disconnect();
|
|
165
|
+
links.disconnect();
|
|
166
|
+
host?.removeEventListener("scroll", scroll);
|
|
167
|
+
view.removeEventListener("resize", schedule);
|
|
168
|
+
view.removeEventListener("hashchange", scroll);
|
|
169
|
+
if (frame) view.cancelAnimationFrame(frame);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
getTableOfContentsValue2 as getTableOfContentsValue,
|
|
175
|
+
observeTableOfContents,
|
|
176
|
+
resolveTableOfContentsId2 as resolveTableOfContentsId
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=scrollspy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/table-of-contents/scrollspy.ts"],"sourcesContent":["import { getTableOfContentsValue, resolveTableOfContentsId } from \"./scrollspy-selection.js\";\nimport type {\n TableOfContentsObserver,\n TableOfContentsObserverOptions,\n TableOfContentsTargetSnapshot,\n} from \"./types.js\";\nexport { getTableOfContentsValue, resolveTableOfContentsId } from \"./scrollspy-selection.js\";\n\nexport function observeTableOfContents({\n root,\n scrollTarget,\n contentTarget,\n offset,\n onValueChange,\n}: TableOfContentsObserverOptions): TableOfContentsObserver {\n const doc = root.ownerDocument;\n const view = doc.defaultView!;\n let scrollNode: HTMLElement | null = null;\n let content: HTMLElement | null = null;\n let host: EventTarget | null = null;\n let observer: IntersectionObserver | null = null;\n let nodes: HTMLElement[] = [];\n let positions = new Map<Element, TableOfContentsTargetSnapshot>();\n let contentEnd: number | null = null;\n let viewportSize = 0;\n let frame = 0;\n let generation = 0;\n let destroyed = false;\n let last: string | null | undefined;\n const resized = new Set<Element>();\n const emit = (value: string | null) => {\n if (last !== value) {\n last = value;\n onValueChange(value);\n }\n };\n const position = () => {\n // banned-read-ok: A scroll offset is the required input, not a layout measurement; geometry comes from observers.\n return scrollNode ? scrollNode.scrollTop : view.scrollY;\n };\n const update = () => {\n if (positions.size !== nodes.length || !viewportSize) return;\n const start = position();\n emit(\n getTableOfContentsValue({\n targets: nodes.flatMap((node) => {\n const target = positions.get(node);\n return target ? [target] : [];\n }),\n viewportStart: start,\n viewportEnd: start + viewportSize,\n offset,\n contentEnd,\n }),\n );\n };\n const scroll = () => {\n if (!frame)\n frame = view.requestAnimationFrame(() => {\n frame = 0;\n update();\n });\n };\n const schedule = () => {\n if (frame) view.cancelAnimationFrame(frame);\n frame = view.requestAnimationFrame(() => {\n frame = 0;\n refresh();\n });\n };\n const resize = new view.ResizeObserver(schedule);\n const mutations = new view.MutationObserver((changes) => {\n if (changes.some((change) => !root.contains(change.target))) schedule();\n });\n const links = new view.MutationObserver(schedule);\n links.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: [\"href\"],\n });\n function refresh() {\n if (destroyed) return;\n generation++;\n observer?.disconnect();\n mutations.disconnect();\n scrollNode = scrollTarget === undefined ? null : doc.getElementById(scrollTarget);\n content = contentTarget === undefined ? doc.documentElement : doc.getElementById(contentTarget);\n const nextHost = scrollTarget !== undefined && !scrollNode ? null : (scrollNode ?? view);\n if (host !== nextHost) {\n host?.removeEventListener(\"scroll\", scroll);\n host = nextHost;\n host?.addEventListener(\"scroll\", scroll, { passive: true });\n }\n if (!host || !content) {\n emit(null);\n mutations.observe(doc.documentElement, { subtree: true, childList: true });\n return;\n }\n const values = new Map<HTMLElement, string>();\n for (const link of root.querySelectorAll('[data-part=\"link\"][href]')) {\n if (link.closest(\"[data-uiify-table-of-contents]\") !== root) continue;\n const value = resolveTableOfContentsId(link.getAttribute(\"href\")!, doc.URL);\n const node = value === null ? null : doc.getElementById(value);\n if (node && content.contains(node)) values.set(node, value!);\n }\n nodes = [...values.keys()].sort((a, b) => (a.compareDocumentPosition(b) & 2 ? 1 : -1));\n positions = new Map();\n contentEnd = null;\n viewportSize = 0;\n if (!nodes.length) emit(null);\n const current = generation;\n observer = new view.IntersectionObserver(\n (entries) => {\n if (destroyed || generation !== current) return;\n const start = position();\n for (const entry of entries) {\n const rect = entry.boundingClientRect;\n const origin = entry.rootBounds?.top ?? 0;\n viewportSize = entry.rootBounds?.height ?? viewportSize;\n if (entry.target === content) contentEnd = rect.bottom + start - origin;\n const value = values.get(entry.target as HTMLElement);\n if (value !== undefined)\n positions.set(entry.target, {\n value,\n start: rect.top + start - origin,\n visible: rect.width > 0 && rect.height > 0,\n });\n }\n update();\n },\n { root: scrollNode, threshold: [0, 1] },\n );\n const observed = new Set<Element>([content, ...nodes, ...(scrollNode ? [scrollNode] : [])]);\n for (const node of resized)\n if (!observed.has(node)) {\n resize.unobserve(node);\n resized.delete(node);\n }\n for (const node of observed) {\n if (node !== scrollNode) observer.observe(node);\n if (!resized.has(node)) {\n resize.observe(node);\n resized.add(node);\n }\n }\n const boundaries =\n contentTarget !== undefined\n ? [content]\n : new Set(\n nodes.map((node) => {\n const parent = node.closest(\"article, main\") ?? node.parentElement;\n return parent && parent !== doc.body && parent !== doc.documentElement\n ? parent\n : node;\n }),\n );\n for (const boundary of boundaries)\n mutations.observe(boundary, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: [\"id\", \"hidden\", \"open\", \"class\", \"style\"],\n });\n }\n view.addEventListener(\"resize\", schedule);\n view.addEventListener(\"hashchange\", scroll);\n refresh();\n return {\n refresh,\n destroy() {\n destroyed = true;\n generation++;\n observer?.disconnect();\n resize.disconnect();\n mutations.disconnect();\n links.disconnect();\n host?.removeEventListener(\"scroll\", scroll);\n view.removeEventListener(\"resize\", schedule);\n view.removeEventListener(\"hashchange\", scroll);\n if (frame) view.cancelAnimationFrame(frame);\n },\n };\n}\n"],"mappings":"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","names":["getTableOfContentsValue","resolveTableOfContentsId"]}
|