@mieweb/ui 0.7.3-dev.9 → 0.8.0-dev.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/dist/brands/index.cjs +12 -12
- package/dist/brands/index.js +3 -3
- package/dist/chunk-3IMM2PM4.js +259 -0
- package/dist/chunk-3IMM2PM4.js.map +1 -0
- package/dist/chunk-3SHLOF4V.cjs +128 -0
- package/dist/chunk-3SHLOF4V.cjs.map +1 -0
- package/dist/chunk-3TXOFAXP.cjs +139 -0
- package/dist/chunk-3TXOFAXP.cjs.map +1 -0
- package/dist/{chunk-ZBI52NP2.cjs → chunk-56QJHQ5C.cjs} +156 -39
- package/dist/chunk-56QJHQ5C.cjs.map +1 -0
- package/dist/chunk-5JZIDILK.cjs +164 -0
- package/dist/chunk-5JZIDILK.cjs.map +1 -0
- package/dist/chunk-5MXO6PEV.cjs +78 -0
- package/dist/chunk-5MXO6PEV.cjs.map +1 -0
- package/dist/chunk-5QZ73PZC.js +62 -0
- package/dist/chunk-5QZ73PZC.js.map +1 -0
- package/dist/chunk-6NZXWKUE.js +3 -0
- package/dist/chunk-6NZXWKUE.js.map +1 -0
- package/dist/chunk-6SCQ7FKT.js +115 -0
- package/dist/chunk-6SCQ7FKT.js.map +1 -0
- package/dist/{chunk-KFLDXJEE.js → chunk-753Z3NXL.js} +46 -15
- package/dist/chunk-753Z3NXL.js.map +1 -0
- package/dist/{chunk-S3MKIDYG.cjs → chunk-7AECNMYV.cjs} +46 -15
- package/dist/chunk-7AECNMYV.cjs.map +1 -0
- package/dist/chunk-7IKLGH3Z.cjs +92 -0
- package/dist/chunk-7IKLGH3Z.cjs.map +1 -0
- package/dist/chunk-7L7OPISJ.cjs +291 -0
- package/dist/chunk-7L7OPISJ.cjs.map +1 -0
- package/dist/chunk-7RV6CAP6.cjs +106 -0
- package/dist/chunk-7RV6CAP6.cjs.map +1 -0
- package/dist/{chunk-LC7YHZXM.js → chunk-A5YOIJKL.js} +5 -5
- package/dist/{chunk-LC7YHZXM.js.map → chunk-A5YOIJKL.js.map} +1 -1
- package/dist/{chunk-CVZYOMEW.js → chunk-AESFOMSH.js} +325 -3
- package/dist/chunk-AESFOMSH.js.map +1 -0
- package/dist/{chunk-RBS3GHDZ.cjs → chunk-BOW7ZGI2.cjs} +4 -4
- package/dist/{chunk-RBS3GHDZ.cjs.map → chunk-BOW7ZGI2.cjs.map} +1 -1
- package/dist/{chunk-WUNWHOLA.cjs → chunk-BSDBI6H7.cjs} +116 -26
- package/dist/chunk-BSDBI6H7.cjs.map +1 -0
- package/dist/chunk-CG4ZKJLE.js +84 -0
- package/dist/chunk-CG4ZKJLE.js.map +1 -0
- package/dist/{chunk-Z4PECE5S.js → chunk-DX64KLSN.js} +2 -2
- package/dist/{chunk-Z4PECE5S.js.map → chunk-DX64KLSN.js.map} +1 -1
- package/dist/chunk-ELYGV32O.cjs +230 -0
- package/dist/chunk-ELYGV32O.cjs.map +1 -0
- package/dist/{chunk-QUUBTNMH.js → chunk-EPSB4WTL.js} +45 -15
- package/dist/chunk-EPSB4WTL.js.map +1 -0
- package/dist/chunk-F57VRLKP.js +708 -0
- package/dist/chunk-F57VRLKP.js.map +1 -0
- package/dist/{chunk-5IDYOJHO.cjs → chunk-G7EQ3JPX.cjs} +45 -15
- package/dist/chunk-G7EQ3JPX.cjs.map +1 -0
- package/dist/{chunk-FKLUSYFP.cjs → chunk-GQVL2JKQ.cjs} +4 -4
- package/dist/{chunk-FKLUSYFP.cjs.map → chunk-GQVL2JKQ.cjs.map} +1 -1
- package/dist/{chunk-3D4ITDLO.js → chunk-GXODR6V4.js} +3 -3
- package/dist/{chunk-3D4ITDLO.js.map → chunk-GXODR6V4.js.map} +1 -1
- package/dist/{chunk-AFGADE3B.js → chunk-H3YO5GBM.js} +117 -27
- package/dist/chunk-H3YO5GBM.js.map +1 -0
- package/dist/chunk-HK3AMH3Q.cjs +151 -0
- package/dist/chunk-HK3AMH3Q.cjs.map +1 -0
- package/dist/chunk-HQ3XPCHG.js +114 -0
- package/dist/chunk-HQ3XPCHG.js.map +1 -0
- package/dist/chunk-I44YNYI6.cjs +4 -0
- package/dist/chunk-I44YNYI6.cjs.map +1 -0
- package/dist/{chunk-5FAWCLPY.js → chunk-IILJGFI5.js} +40 -29
- package/dist/chunk-IILJGFI5.js.map +1 -0
- package/dist/{chunk-XFRQFWSY.js → chunk-IYXCFIMP.js} +8 -8
- package/dist/{chunk-XFRQFWSY.js.map → chunk-IYXCFIMP.js.map} +1 -1
- package/dist/{chunk-6J7UGYT5.cjs → chunk-JHGMZX4I.cjs} +47 -7
- package/dist/chunk-JHGMZX4I.cjs.map +1 -0
- package/dist/chunk-JHZW3Y62.js +142 -0
- package/dist/chunk-JHZW3Y62.js.map +1 -0
- package/dist/{chunk-JDHIBJ5K.cjs → chunk-JWTCEWQ4.cjs} +2 -2
- package/dist/{chunk-JDHIBJ5K.cjs.map → chunk-JWTCEWQ4.cjs.map} +1 -1
- package/dist/{chunk-URHXR5SC.cjs → chunk-KVE7PQ5P.cjs} +7 -7
- package/dist/{chunk-URHXR5SC.cjs.map → chunk-KVE7PQ5P.cjs.map} +1 -1
- package/dist/{chunk-MJFF4AXH.cjs → chunk-L6D4CKLV.cjs} +325 -3
- package/dist/chunk-L6D4CKLV.cjs.map +1 -0
- package/dist/chunk-L6MDULYB.js +87 -0
- package/dist/chunk-L6MDULYB.js.map +1 -0
- package/dist/{chunk-SYIFEJSF.cjs → chunk-LQHI44OZ.cjs} +13 -13
- package/dist/{chunk-SYIFEJSF.cjs.map → chunk-LQHI44OZ.cjs.map} +1 -1
- package/dist/{chunk-HIDV32ZX.js → chunk-LZU7YBXG.js} +3 -3
- package/dist/{chunk-HIDV32ZX.js.map → chunk-LZU7YBXG.js.map} +1 -1
- package/dist/chunk-N5O47VGS.cjs +109 -0
- package/dist/chunk-N5O47VGS.cjs.map +1 -0
- package/dist/chunk-NGSDBWKA.cjs +84 -0
- package/dist/chunk-NGSDBWKA.cjs.map +1 -0
- package/dist/chunk-NMBYU7D7.cjs +31 -0
- package/dist/chunk-NMBYU7D7.cjs.map +1 -0
- package/dist/{chunk-P6L74SKG.js → chunk-QGZC43L7.js} +47 -7
- package/dist/chunk-QGZC43L7.js.map +1 -0
- package/dist/{chunk-FTRGZOVJ.js → chunk-QHTDWIED.js} +3 -3
- package/dist/{chunk-FTRGZOVJ.js.map → chunk-QHTDWIED.js.map} +1 -1
- package/dist/chunk-RUGHNFQG.js +28 -0
- package/dist/chunk-RUGHNFQG.js.map +1 -0
- package/dist/{chunk-Q6A4RVAN.cjs → chunk-SK7H3Z67.cjs} +37 -37
- package/dist/{chunk-Q6A4RVAN.cjs.map → chunk-SK7H3Z67.cjs.map} +1 -1
- package/dist/{chunk-MO65V64I.js → chunk-TXRQQMG5.js} +2 -2
- package/dist/{chunk-MO65V64I.js.map → chunk-TXRQQMG5.js.map} +1 -1
- package/dist/{chunk-3YDTZUI6.cjs → chunk-U5TTXN45.cjs} +42 -31
- package/dist/chunk-U5TTXN45.cjs.map +1 -0
- package/dist/chunk-WBGUYSWY.js +90 -0
- package/dist/chunk-WBGUYSWY.js.map +1 -0
- package/dist/{chunk-LJBWCUKP.cjs → chunk-WIYQI35R.cjs} +2 -2
- package/dist/{chunk-LJBWCUKP.cjs.map → chunk-WIYQI35R.cjs.map} +1 -1
- package/dist/chunk-WKSUL2ZN.js +56 -0
- package/dist/chunk-WKSUL2ZN.js.map +1 -0
- package/dist/chunk-X5ZPYYMS.js +105 -0
- package/dist/chunk-X5ZPYYMS.js.map +1 -0
- package/dist/{chunk-DLBV42JD.js → chunk-XBKOZRDO.js} +156 -39
- package/dist/chunk-XBKOZRDO.js.map +1 -0
- package/dist/{chunk-XB54G7WS.cjs → chunk-XJTFZLWH.cjs} +2 -86
- package/dist/chunk-XJTFZLWH.cjs.map +1 -0
- package/dist/chunk-XMECP2MD.js +208 -0
- package/dist/chunk-XMECP2MD.js.map +1 -0
- package/dist/{chunk-GTHNWP4P.js → chunk-XUVEF2RQ.js} +4 -87
- package/dist/chunk-XUVEF2RQ.js.map +1 -0
- package/dist/chunk-XWYKLEKG.js +269 -0
- package/dist/chunk-XWYKLEKG.js.map +1 -0
- package/dist/chunk-Y6YSJPVC.js +129 -0
- package/dist/chunk-Y6YSJPVC.js.map +1 -0
- package/dist/chunk-YVIH26FG.cjs +736 -0
- package/dist/chunk-YVIH26FG.cjs.map +1 -0
- package/dist/chunk-Z5S5JEJD.cjs +286 -0
- package/dist/chunk-Z5S5JEJD.cjs.map +1 -0
- package/dist/chunk-ZO4L6C2Y.cjs +137 -0
- package/dist/chunk-ZO4L6C2Y.cjs.map +1 -0
- package/dist/{collabKit-QZL4P5T5.js → collabKit-A643VH2I.js} +7 -3
- package/dist/collabKit-A643VH2I.js.map +1 -0
- package/dist/{collabKit-UF7E6V3N.cjs → collabKit-Q4A36LDA.cjs} +7 -3
- package/dist/collabKit-Q4A36LDA.cjs.map +1 -0
- package/dist/components/Accordion/index.cjs +13 -0
- package/dist/components/Accordion/index.cjs.map +1 -0
- package/dist/components/Accordion/index.d.cts +50 -0
- package/dist/components/Accordion/index.d.ts +50 -0
- package/dist/components/Accordion/index.js +4 -0
- package/dist/components/Accordion/index.js.map +1 -0
- package/dist/components/Alert/index.d.cts +1 -1
- package/dist/components/Alert/index.d.ts +1 -1
- package/dist/components/Autocomplete/index.cjs +4 -3
- package/dist/components/Autocomplete/index.d.cts +20 -3
- package/dist/components/Autocomplete/index.d.ts +20 -3
- package/dist/components/Autocomplete/index.js +3 -2
- package/dist/components/Badge/index.d.cts +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/Card/index.d.cts +1 -1
- package/dist/components/Card/index.d.ts +1 -1
- package/dist/components/Checkbox/index.cjs +5 -4
- package/dist/components/Checkbox/index.d.cts +9 -1
- package/dist/components/Checkbox/index.d.ts +9 -1
- package/dist/components/Checkbox/index.js +2 -1
- package/dist/components/ClampedText/index.cjs +13 -0
- package/dist/components/ClampedText/index.cjs.map +1 -0
- package/dist/components/ClampedText/index.d.cts +33 -0
- package/dist/components/ClampedText/index.d.ts +33 -0
- package/dist/components/ClampedText/index.js +4 -0
- package/dist/components/ClampedText/index.js.map +1 -0
- package/dist/components/CopyButton/index.cjs +13 -0
- package/dist/components/CopyButton/index.cjs.map +1 -0
- package/dist/components/CopyButton/index.d.cts +29 -0
- package/dist/components/CopyButton/index.d.ts +29 -0
- package/dist/components/CopyButton/index.js +4 -0
- package/dist/components/CopyButton/index.js.map +1 -0
- package/dist/components/CustomizableDashboard/index.cjs +43 -0
- package/dist/components/CustomizableDashboard/index.cjs.map +1 -0
- package/dist/components/CustomizableDashboard/index.d.cts +195 -0
- package/dist/components/CustomizableDashboard/index.d.ts +195 -0
- package/dist/components/CustomizableDashboard/index.js +10 -0
- package/dist/components/CustomizableDashboard/index.js.map +1 -0
- package/dist/components/DateInput/index.cjs +4 -3
- package/dist/components/DateInput/index.d.cts +1 -0
- package/dist/components/DateInput/index.d.ts +1 -0
- package/dist/components/DateInput/index.js +3 -2
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.js +3 -2
- package/dist/components/FilterSummaryBar/index.cjs +13 -0
- package/dist/components/FilterSummaryBar/index.cjs.map +1 -0
- package/dist/components/FilterSummaryBar/index.d.cts +53 -0
- package/dist/components/FilterSummaryBar/index.d.ts +53 -0
- package/dist/components/FilterSummaryBar/index.js +4 -0
- package/dist/components/FilterSummaryBar/index.js.map +1 -0
- package/dist/components/FreshnessBadge/index.cjs +25 -0
- package/dist/components/FreshnessBadge/index.cjs.map +1 -0
- package/dist/components/FreshnessBadge/index.d.cts +49 -0
- package/dist/components/FreshnessBadge/index.d.ts +49 -0
- package/dist/components/FreshnessBadge/index.js +4 -0
- package/dist/components/FreshnessBadge/index.js.map +1 -0
- package/dist/components/GlossaryTooltip/index.cjs +15 -0
- package/dist/components/GlossaryTooltip/index.cjs.map +1 -0
- package/dist/components/GlossaryTooltip/index.d.cts +64 -0
- package/dist/components/GlossaryTooltip/index.d.ts +64 -0
- package/dist/components/GlossaryTooltip/index.js +6 -0
- package/dist/components/GlossaryTooltip/index.js.map +1 -0
- package/dist/components/Input/index.cjs +20 -3
- package/dist/components/Input/index.d.cts +37 -2
- package/dist/components/Input/index.d.ts +37 -2
- package/dist/components/Input/index.js +2 -1
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +21 -0
- package/dist/components/KeyboardShortcutsOverlay/index.cjs.map +1 -0
- package/dist/components/KeyboardShortcutsOverlay/index.d.cts +54 -0
- package/dist/components/KeyboardShortcutsOverlay/index.d.ts +54 -0
- package/dist/components/KeyboardShortcutsOverlay/index.js +8 -0
- package/dist/components/KeyboardShortcutsOverlay/index.js.map +1 -0
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/MediaEditor/index.cjs +10 -9
- package/dist/components/MediaEditor/index.js +5 -4
- package/dist/components/PhoneInput/index.cjs +5 -4
- package/dist/components/PhoneInput/index.js +3 -2
- package/dist/components/Progress/index.d.cts +1 -1
- package/dist/components/Progress/index.d.ts +1 -1
- package/dist/components/Radio/index.cjs +5 -4
- package/dist/components/Radio/index.d.cts +9 -1
- package/dist/components/Radio/index.d.ts +9 -1
- package/dist/components/Radio/index.js +2 -1
- package/dist/components/ReadingProgressBar/index.cjs +13 -0
- package/dist/components/ReadingProgressBar/index.cjs.map +1 -0
- package/dist/components/ReadingProgressBar/index.d.cts +20 -0
- package/dist/components/ReadingProgressBar/index.d.ts +20 -0
- package/dist/components/ReadingProgressBar/index.js +4 -0
- package/dist/components/ReadingProgressBar/index.js.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +7 -6
- package/dist/components/RichTextEditor/index.js +4 -3
- package/dist/components/SectionSpyNav/index.cjs +15 -0
- package/dist/components/SectionSpyNav/index.cjs.map +1 -0
- package/dist/components/SectionSpyNav/index.d.cts +63 -0
- package/dist/components/SectionSpyNav/index.d.ts +63 -0
- package/dist/components/SectionSpyNav/index.js +6 -0
- package/dist/components/SectionSpyNav/index.js.map +1 -0
- package/dist/components/Select/index.cjs +5 -3
- package/dist/components/Select/index.d.cts +56 -9
- package/dist/components/Select/index.d.ts +56 -9
- package/dist/components/Select/index.js +3 -1
- package/dist/components/Slider/index.d.cts +2 -2
- package/dist/components/Slider/index.d.ts +2 -2
- package/dist/components/SourceTip/index.cjs +15 -0
- package/dist/components/SourceTip/index.cjs.map +1 -0
- package/dist/components/SourceTip/index.d.cts +58 -0
- package/dist/components/SourceTip/index.d.ts +58 -0
- package/dist/components/SourceTip/index.js +6 -0
- package/dist/components/SourceTip/index.js.map +1 -0
- package/dist/components/Sparkline/index.cjs +13 -0
- package/dist/components/Sparkline/index.cjs.map +1 -0
- package/dist/components/Sparkline/index.d.cts +53 -0
- package/dist/components/Sparkline/index.d.ts +53 -0
- package/dist/components/Sparkline/index.js +4 -0
- package/dist/components/Sparkline/index.js.map +1 -0
- package/dist/components/Spinner/index.d.cts +1 -1
- package/dist/components/Spinner/index.d.ts +1 -1
- package/dist/components/SuperChat/index.cjs +8 -7
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +4 -3
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +2 -22
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
- package/dist/components/SuperChat/plugins/index.js +1 -21
- package/dist/components/SuperChat/plugins/index.js.map +1 -1
- package/dist/components/Text/index.d.cts +1 -1
- package/dist/components/Text/index.d.ts +1 -1
- package/dist/components/Textarea/index.cjs +5 -3
- package/dist/components/Textarea/index.d.cts +19 -1
- package/dist/components/Textarea/index.d.ts +19 -1
- package/dist/components/Textarea/index.js +3 -1
- package/dist/datavis.cjs +1 -1
- package/dist/datavis.js +1 -1
- package/dist/esheet.cjs +11 -10
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +8 -7
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +27 -17
- package/dist/hooks/index.d.cts +16 -1
- package/dist/hooks/index.d.ts +16 -1
- package/dist/hooks/index.js +3 -1
- package/dist/index.cjs +1026 -651
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +83 -10
- package/dist/index.d.ts +83 -10
- package/dist/index.js +316 -53
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +200 -68
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.css +129 -0
- package/dist/kerebron.d.cts +52 -3
- package/dist/kerebron.d.ts +52 -3
- package/dist/kerebron.js +201 -69
- package/dist/kerebron.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/utils/index.cjs +9 -9
- package/dist/utils/index.js +1 -1
- package/package.json +9 -4
- package/dist/chunk-3YDTZUI6.cjs.map +0 -1
- package/dist/chunk-5FAWCLPY.js.map +0 -1
- package/dist/chunk-5IDYOJHO.cjs.map +0 -1
- package/dist/chunk-6ECKH4DJ.cjs +0 -147
- package/dist/chunk-6ECKH4DJ.cjs.map +0 -1
- package/dist/chunk-6J7UGYT5.cjs.map +0 -1
- package/dist/chunk-AFGADE3B.js.map +0 -1
- package/dist/chunk-CVZYOMEW.js.map +0 -1
- package/dist/chunk-DLBV42JD.js.map +0 -1
- package/dist/chunk-GTHNWP4P.js.map +0 -1
- package/dist/chunk-KFLDXJEE.js.map +0 -1
- package/dist/chunk-MJFF4AXH.cjs.map +0 -1
- package/dist/chunk-P6L74SKG.js.map +0 -1
- package/dist/chunk-QUUBTNMH.js.map +0 -1
- package/dist/chunk-S3MKIDYG.cjs.map +0 -1
- package/dist/chunk-WUNWHOLA.cjs.map +0 -1
- package/dist/chunk-XB54G7WS.cjs.map +0 -1
- package/dist/chunk-YXCE2HSK.js +0 -124
- package/dist/chunk-YXCE2HSK.js.map +0 -1
- package/dist/chunk-ZBI52NP2.cjs.map +0 -1
- package/dist/collabKit-QZL4P5T5.js.map +0 -1
- package/dist/collabKit-UF7E6V3N.cjs.map +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useScrollSpy.ts
|
|
6
|
+
function useScrollSpy({
|
|
7
|
+
selectors,
|
|
8
|
+
ids,
|
|
9
|
+
rootMargin = "0px 0px -60% 0px",
|
|
10
|
+
threshold = 0,
|
|
11
|
+
root,
|
|
12
|
+
enabled = true
|
|
13
|
+
} = {}) {
|
|
14
|
+
const [activeId, setActiveId] = react.useState(null);
|
|
15
|
+
const visibleEntries = react.useRef(
|
|
16
|
+
/* @__PURE__ */ new Map()
|
|
17
|
+
);
|
|
18
|
+
const rootEl = root?.current ?? null;
|
|
19
|
+
react.useEffect(() => {
|
|
20
|
+
if (!enabled) return;
|
|
21
|
+
const container = rootEl ?? document;
|
|
22
|
+
function resolveElements() {
|
|
23
|
+
let els = [];
|
|
24
|
+
if (ids && ids.length > 0) {
|
|
25
|
+
els = ids.map((id) => document.getElementById(id)).filter((el) => el !== null);
|
|
26
|
+
} else if (selectors) {
|
|
27
|
+
els = Array.from(container.querySelectorAll(selectors));
|
|
28
|
+
}
|
|
29
|
+
return els.filter((el) => el.id);
|
|
30
|
+
}
|
|
31
|
+
let intersectionObserver = null;
|
|
32
|
+
let mutationObserver = null;
|
|
33
|
+
function startObserving() {
|
|
34
|
+
const elements = resolveElements();
|
|
35
|
+
if (elements.length === 0) return false;
|
|
36
|
+
intersectionObserver = new IntersectionObserver(
|
|
37
|
+
(entries2) => {
|
|
38
|
+
for (const entry of entries2) {
|
|
39
|
+
if (entry.isIntersecting) {
|
|
40
|
+
visibleEntries.current.set(entry.target.id, entry);
|
|
41
|
+
} else {
|
|
42
|
+
visibleEntries.current.delete(entry.target.id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (visibleEntries.current.size > 0) {
|
|
46
|
+
let topmost = null;
|
|
47
|
+
let topmostTop = Infinity;
|
|
48
|
+
for (const [id, entry] of visibleEntries.current) {
|
|
49
|
+
const top = entry.boundingClientRect.top;
|
|
50
|
+
if (top < topmostTop) {
|
|
51
|
+
topmostTop = top;
|
|
52
|
+
topmost = id;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (topmost) {
|
|
56
|
+
setActiveId(topmost);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
root: rootEl,
|
|
62
|
+
rootMargin,
|
|
63
|
+
threshold
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
for (const el of elements) {
|
|
67
|
+
intersectionObserver.observe(el);
|
|
68
|
+
}
|
|
69
|
+
mutationObserver?.disconnect();
|
|
70
|
+
mutationObserver = null;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
if (!startObserving()) {
|
|
74
|
+
const watchRoot = rootEl ?? document.body;
|
|
75
|
+
mutationObserver = new MutationObserver(() => {
|
|
76
|
+
startObserving();
|
|
77
|
+
});
|
|
78
|
+
mutationObserver.observe(watchRoot, { childList: true, subtree: true });
|
|
79
|
+
}
|
|
80
|
+
const entries = visibleEntries.current;
|
|
81
|
+
return () => {
|
|
82
|
+
mutationObserver?.disconnect();
|
|
83
|
+
intersectionObserver?.disconnect();
|
|
84
|
+
entries.clear();
|
|
85
|
+
};
|
|
86
|
+
}, [selectors, ids, rootMargin, threshold, rootEl, enabled]);
|
|
87
|
+
return { activeId };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
exports.useScrollSpy = useScrollSpy;
|
|
91
|
+
//# sourceMappingURL=chunk-7IKLGH3Z.cjs.map
|
|
92
|
+
//# sourceMappingURL=chunk-7IKLGH3Z.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useScrollSpy.ts"],"names":["useState","useRef","useEffect","entries"],"mappings":"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","file":"chunk-7IKLGH3Z.cjs","sourcesContent":["import { useEffect, useState, useRef, type RefObject } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface UseScrollSpyOptions {\n /** CSS selector for the elements to observe (e.g. 'h2, h3, h4') */\n selectors?: string;\n /** Explicit list of element IDs to observe (alternative to selectors) */\n ids?: string[];\n /** IntersectionObserver root margin (default: '0px 0px -60% 0px') */\n rootMargin?: string;\n /** IntersectionObserver threshold (default: 0) */\n threshold?: number | number[];\n /** Scroll container element ref. Defaults to document viewport. */\n root?: RefObject<HTMLElement | null>;\n /** Whether the hook is active (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseScrollSpyReturn {\n /** The ID of the currently active (in-view) element */\n activeId: string | null;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Tracks which section is currently in the viewport using IntersectionObserver.\n * Pairs naturally with `TableOfContents` to highlight the active heading.\n *\n * @example\n * ```tsx\n * function DocsPage() {\n * const { activeId } = useScrollSpy({ selectors: 'h2, h3' });\n * return (\n * <aside>\n * <TableOfContents activeId={activeId} />\n * </aside>\n * );\n * }\n * ```\n */\nexport function useScrollSpy({\n selectors,\n ids,\n rootMargin = '0px 0px -60% 0px',\n threshold = 0,\n root,\n enabled = true,\n}: UseScrollSpyOptions = {}): UseScrollSpyReturn {\n const [activeId, setActiveId] = useState<string | null>(null);\n const visibleEntries = useRef<Map<string, IntersectionObserverEntry>>(\n new Map()\n );\n\n // Track root.current so the effect re-runs when the ref attaches\n const rootEl = root?.current ?? null;\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = rootEl ?? document;\n\n // Resolve target elements from the DOM\n function resolveElements(): Element[] {\n let els: Element[] = [];\n if (ids && ids.length > 0) {\n els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n } else if (selectors) {\n els = Array.from(container.querySelectorAll(selectors));\n }\n return els.filter((el) => el.id);\n }\n\n let intersectionObserver: IntersectionObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n function startObserving(): boolean {\n const elements = resolveElements();\n if (elements.length === 0) return false;\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n visibleEntries.current.set(entry.target.id, entry);\n } else {\n visibleEntries.current.delete(entry.target.id);\n }\n }\n\n // Pick the topmost visible heading (by DOM order)\n if (visibleEntries.current.size > 0) {\n let topmost: string | null = null;\n let topmostTop = Infinity;\n\n for (const [id, entry] of visibleEntries.current) {\n const top = entry.boundingClientRect.top;\n if (top < topmostTop) {\n topmostTop = top;\n topmost = id;\n }\n }\n\n if (topmost) {\n setActiveId(topmost);\n }\n }\n },\n {\n root: rootEl,\n rootMargin,\n threshold,\n }\n );\n\n for (const el of elements) {\n intersectionObserver.observe(el);\n }\n\n // Elements found — stop watching for new DOM nodes\n mutationObserver?.disconnect();\n mutationObserver = null;\n return true;\n }\n\n // If target elements don't exist yet (e.g. headings mount after ToC),\n // watch for DOM changes and retry until they appear.\n if (!startObserving()) {\n const watchRoot = rootEl ?? document.body;\n mutationObserver = new MutationObserver(() => {\n startObserving();\n });\n mutationObserver.observe(watchRoot, { childList: true, subtree: true });\n }\n\n const entries = visibleEntries.current;\n return () => {\n mutationObserver?.disconnect();\n intersectionObserver?.disconnect();\n entries.clear();\n };\n }, [selectors, ids, rootMargin, threshold, rootEl, enabled]);\n\n return { activeId };\n}\n"]}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFHY3K6PL_cjs = require('./chunk-FHY3K6PL.cjs');
|
|
4
|
+
var chunkMYFZYUPR_cjs = require('./chunk-MYFZYUPR.cjs');
|
|
5
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var reactDom = require('react-dom');
|
|
8
|
+
var lucideReact = require('lucide-react');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
30
|
+
|
|
31
|
+
var HIDE_GRACE_MS = 180;
|
|
32
|
+
function GlossaryTooltip({
|
|
33
|
+
children,
|
|
34
|
+
term,
|
|
35
|
+
definition,
|
|
36
|
+
category,
|
|
37
|
+
keyFact,
|
|
38
|
+
source,
|
|
39
|
+
related,
|
|
40
|
+
href,
|
|
41
|
+
maxDefinitionLength = 190,
|
|
42
|
+
underline = true,
|
|
43
|
+
className
|
|
44
|
+
}) {
|
|
45
|
+
const [open, setOpen] = React__namespace.useState(false);
|
|
46
|
+
const [pinned, setPinned] = React__namespace.useState(false);
|
|
47
|
+
const timer = React__namespace.useRef(null);
|
|
48
|
+
const suppressFocusShow = React__namespace.useRef(false);
|
|
49
|
+
const { anchorRef, floatingRef, style } = chunkMYFZYUPR_cjs.useAnchoredPosition({
|
|
50
|
+
open,
|
|
51
|
+
placement: "top",
|
|
52
|
+
offset: 10,
|
|
53
|
+
viewportPadding: 8,
|
|
54
|
+
allowFlip: true
|
|
55
|
+
});
|
|
56
|
+
const clearHideTimer = () => {
|
|
57
|
+
if (timer.current) {
|
|
58
|
+
clearTimeout(timer.current);
|
|
59
|
+
timer.current = null;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const show = React__namespace.useCallback(() => {
|
|
63
|
+
clearHideTimer();
|
|
64
|
+
setOpen(true);
|
|
65
|
+
}, []);
|
|
66
|
+
const scheduleHide = React__namespace.useCallback(() => {
|
|
67
|
+
if (pinned) return;
|
|
68
|
+
clearHideTimer();
|
|
69
|
+
timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);
|
|
70
|
+
}, [pinned]);
|
|
71
|
+
const close = React__namespace.useCallback(() => {
|
|
72
|
+
clearHideTimer();
|
|
73
|
+
setPinned(false);
|
|
74
|
+
setOpen(false);
|
|
75
|
+
if (floatingRef.current?.contains(document.activeElement)) {
|
|
76
|
+
suppressFocusShow.current = true;
|
|
77
|
+
anchorRef.current?.querySelector("a,button")?.focus();
|
|
78
|
+
}
|
|
79
|
+
}, [anchorRef, floatingRef]);
|
|
80
|
+
React__namespace.useEffect(() => () => clearHideTimer(), []);
|
|
81
|
+
React__namespace.useEffect(() => {
|
|
82
|
+
if (pinned) floatingRef.current?.focus();
|
|
83
|
+
}, [pinned, floatingRef]);
|
|
84
|
+
chunkFHY3K6PL_cjs.useEscapeKey(close, open);
|
|
85
|
+
React__namespace.useEffect(() => {
|
|
86
|
+
if (!open || !pinned) return;
|
|
87
|
+
const onPointer = (e) => {
|
|
88
|
+
const t = e.target;
|
|
89
|
+
if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))
|
|
90
|
+
return;
|
|
91
|
+
close();
|
|
92
|
+
};
|
|
93
|
+
document.addEventListener("mousedown", onPointer);
|
|
94
|
+
document.addEventListener("touchstart", onPointer);
|
|
95
|
+
return () => {
|
|
96
|
+
document.removeEventListener("mousedown", onPointer);
|
|
97
|
+
document.removeEventListener("touchstart", onPointer);
|
|
98
|
+
};
|
|
99
|
+
}, [open, pinned, close, anchorRef, floatingRef]);
|
|
100
|
+
const togglePin = React__namespace.useCallback(() => {
|
|
101
|
+
if (pinned) close();
|
|
102
|
+
else {
|
|
103
|
+
setPinned(true);
|
|
104
|
+
show();
|
|
105
|
+
}
|
|
106
|
+
}, [pinned, close, show]);
|
|
107
|
+
const onTriggerClick = (e) => {
|
|
108
|
+
const coarse = typeof window !== "undefined" && window.matchMedia("(hover: none)").matches;
|
|
109
|
+
if (href) {
|
|
110
|
+
if (!coarse) return;
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
}
|
|
113
|
+
togglePin();
|
|
114
|
+
};
|
|
115
|
+
const onTriggerKeyDown = (e) => {
|
|
116
|
+
if (href) return;
|
|
117
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
togglePin();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const onDialogKeyDown = (e) => {
|
|
123
|
+
if (e.target !== e.currentTarget) return;
|
|
124
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
125
|
+
e.preventDefault();
|
|
126
|
+
close();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const onTriggerFocus = () => {
|
|
130
|
+
if (suppressFocusShow.current) {
|
|
131
|
+
suppressFocusShow.current = false;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
show();
|
|
135
|
+
};
|
|
136
|
+
const onBlurCapture = (e) => {
|
|
137
|
+
const next = e.relatedTarget;
|
|
138
|
+
if (next && (anchorRef.current?.contains(next) || floatingRef.current?.contains(next)))
|
|
139
|
+
return;
|
|
140
|
+
scheduleHide();
|
|
141
|
+
};
|
|
142
|
+
const limit = Math.max(1, maxDefinitionLength);
|
|
143
|
+
const short = definition.length > limit ? `${definition.slice(0, limit - 1).trimEnd()}\u2026` : definition;
|
|
144
|
+
const triggerClasses = chunkS5RVSXDV_cjs.cn(
|
|
145
|
+
"cursor-help",
|
|
146
|
+
underline && "decoration-primary-400/70 underline decoration-dashed underline-offset-4",
|
|
147
|
+
className
|
|
148
|
+
);
|
|
149
|
+
const triggerProps = {
|
|
150
|
+
onClick: onTriggerClick,
|
|
151
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
152
|
+
triggerClasses,
|
|
153
|
+
href && "text-primary-800 dark:text-primary-400 font-medium"
|
|
154
|
+
)
|
|
155
|
+
};
|
|
156
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
157
|
+
"span",
|
|
158
|
+
{
|
|
159
|
+
ref: anchorRef,
|
|
160
|
+
className: "relative inline",
|
|
161
|
+
onMouseEnter: show,
|
|
162
|
+
onMouseLeave: scheduleHide,
|
|
163
|
+
onFocus: onTriggerFocus,
|
|
164
|
+
onBlur: onBlurCapture,
|
|
165
|
+
children: [
|
|
166
|
+
href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
167
|
+
"a",
|
|
168
|
+
{
|
|
169
|
+
href,
|
|
170
|
+
"aria-expanded": open,
|
|
171
|
+
"aria-haspopup": "dialog",
|
|
172
|
+
...triggerProps,
|
|
173
|
+
children
|
|
174
|
+
}
|
|
175
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
176
|
+
"button",
|
|
177
|
+
{
|
|
178
|
+
type: "button",
|
|
179
|
+
"aria-expanded": open,
|
|
180
|
+
"aria-haspopup": "dialog",
|
|
181
|
+
"aria-label": `${term} \u2014 show definition`,
|
|
182
|
+
onKeyDown: onTriggerKeyDown,
|
|
183
|
+
...triggerProps,
|
|
184
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
185
|
+
"inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]",
|
|
186
|
+
triggerProps.className
|
|
187
|
+
),
|
|
188
|
+
children
|
|
189
|
+
}
|
|
190
|
+
),
|
|
191
|
+
open && reactDom.createPortal(
|
|
192
|
+
/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */
|
|
193
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
194
|
+
"span",
|
|
195
|
+
{
|
|
196
|
+
ref: floatingRef,
|
|
197
|
+
role: "dialog",
|
|
198
|
+
"aria-label": term,
|
|
199
|
+
tabIndex: -1,
|
|
200
|
+
onMouseEnter: show,
|
|
201
|
+
onMouseLeave: scheduleHide,
|
|
202
|
+
onBlurCapture,
|
|
203
|
+
onKeyDown: onDialogKeyDown,
|
|
204
|
+
className: "focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2",
|
|
205
|
+
style,
|
|
206
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10", children: [
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-start justify-between gap-2", children: [
|
|
208
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "block min-w-0", children: [
|
|
209
|
+
category && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase", children: category }),
|
|
210
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm leading-snug font-semibold text-white", children: term })
|
|
211
|
+
] }),
|
|
212
|
+
pinned && /* @__PURE__ */ jsxRuntime.jsx(
|
|
213
|
+
"button",
|
|
214
|
+
{
|
|
215
|
+
type: "button",
|
|
216
|
+
onClick: close,
|
|
217
|
+
"aria-label": "Close definition",
|
|
218
|
+
className: "shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white",
|
|
219
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { "aria-hidden": "true", className: "h-3.5 w-3.5" })
|
|
220
|
+
}
|
|
221
|
+
)
|
|
222
|
+
] }) }),
|
|
223
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "block px-3.5 py-2.5", children: [
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground block text-[13px] leading-relaxed", children: short }),
|
|
225
|
+
keyFact && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "mt-2 flex items-start gap-1.5", children: [
|
|
226
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
227
|
+
lucideReact.Diamond,
|
|
228
|
+
{
|
|
229
|
+
"aria-hidden": "true",
|
|
230
|
+
className: "text-primary-500 mt-0.5 h-3 w-3 shrink-0"
|
|
231
|
+
}
|
|
232
|
+
),
|
|
233
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground min-w-0 text-xs leading-relaxed font-medium", children: keyFact })
|
|
234
|
+
] })
|
|
235
|
+
] }),
|
|
236
|
+
(source || related && related.length > 0 || href) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "border-border bg-muted/50 block border-t px-3.5 py-2", children: [
|
|
237
|
+
related && related.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-1.5 flex flex-wrap gap-1", children: related.map(
|
|
238
|
+
(r) => r.href ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
239
|
+
"a",
|
|
240
|
+
{
|
|
241
|
+
href: r.href,
|
|
242
|
+
className: "border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium",
|
|
243
|
+
children: r.term
|
|
244
|
+
},
|
|
245
|
+
r.term
|
|
246
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
247
|
+
"span",
|
|
248
|
+
{
|
|
249
|
+
className: "border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium",
|
|
250
|
+
children: r.term
|
|
251
|
+
},
|
|
252
|
+
r.term
|
|
253
|
+
)
|
|
254
|
+
) }),
|
|
255
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center justify-between gap-2", children: [
|
|
256
|
+
source ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
257
|
+
"a",
|
|
258
|
+
{
|
|
259
|
+
href: source.url,
|
|
260
|
+
target: "_blank",
|
|
261
|
+
rel: "noopener noreferrer",
|
|
262
|
+
className: "text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold",
|
|
263
|
+
children: source.label
|
|
264
|
+
}
|
|
265
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
266
|
+
href && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
267
|
+
"a",
|
|
268
|
+
{
|
|
269
|
+
href,
|
|
270
|
+
className: "text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium",
|
|
271
|
+
children: [
|
|
272
|
+
"Full definition",
|
|
273
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { "aria-hidden": "true", className: "h-3 w-3" })
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
] })
|
|
278
|
+
] })
|
|
279
|
+
] })
|
|
280
|
+
}
|
|
281
|
+
),
|
|
282
|
+
document.body
|
|
283
|
+
)
|
|
284
|
+
]
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
exports.GlossaryTooltip = GlossaryTooltip;
|
|
290
|
+
//# sourceMappingURL=chunk-7L7OPISJ.cjs.map
|
|
291
|
+
//# sourceMappingURL=chunk-7L7OPISJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/GlossaryTooltip/GlossaryTooltip.tsx"],"names":["React","useAnchoredPosition","useEscapeKey","cn","jsxs","jsx","createPortal","X","Diamond","ArrowRight"],"mappings":"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","file":"chunk-7L7OPISJ.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ArrowRight, Diamond, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Authoritative source link shown in the card footer. */\nexport interface GlossarySource {\n label: string;\n url: string;\n}\n\n/** Sibling term shown as a lateral \"hop\" chip. */\nexport interface GlossaryRelatedTerm {\n term: string;\n href?: string;\n}\n\nexport interface GlossaryTooltipProps {\n /** Visible, in-flow trigger text (may be a plural or abbreviation match). */\n children: React.ReactNode;\n /** Canonical term name, shown as the card heading. */\n term: string;\n definition: string;\n /** Human-readable category label, shown as a badge in the header. */\n category?: string;\n /** Optional single key fact, shown with a diamond marker. */\n keyFact?: string;\n /** Optional authoritative source link, shown in the footer. */\n source?: GlossarySource;\n /** Optional sibling terms, shown as chips. */\n related?: GlossaryRelatedTerm[];\n /**\n * Full glossary page for the term. When set, the trigger is a real link —\n * desktop clicks navigate while hover previews; touch taps pin the card.\n */\n href?: string;\n /** Truncation limit for the in-card definition (default 190 chars). */\n maxDefinitionLength?: number;\n /** Dashed underline marking the term as hoverable (default true). */\n underline?: boolean;\n className?: string;\n}\n\nconst HIDE_GRACE_MS = 180;\n\n// =============================================================================\n// GlossaryTooltip\n// =============================================================================\n\n/**\n * A rich \"what does this term mean?\" hover card: category badge, canonical\n * term, truncated definition, optional key fact, source link, and related\n * term chips. The provenance sibling is `SourceTip` (\"what backs this\n * claim?\") — the two share the same interaction grammar.\n *\n * Trigger and card are phrasing content (`span`/`a`/`button` only), so it is\n * valid inside `<p>` prose. The card portals to `body` with fixed\n * positioning, flipping and clamping to stay in the viewport. On touch, a\n * tap pins the card instead of navigating; Escape or an outside tap closes.\n *\n * @example\n * ```tsx\n * <GlossaryTooltip\n * term=\"OSHA recordable\"\n * definition=\"A work-related injury or illness that meets OSHA reporting criteria…\"\n * category=\"Compliance\"\n * href=\"/glossary/osha-recordable\"\n * >\n * OSHA recordables\n * </GlossaryTooltip>\n * ```\n */\nexport function GlossaryTooltip({\n children,\n term,\n definition,\n category,\n keyFact,\n source,\n related,\n href,\n maxDefinitionLength = 190,\n underline = true,\n className,\n}: GlossaryTooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n // True while close() restores focus to the trigger, so the trigger's\n // focus-show doesn't immediately reopen a card the user just dismissed.\n const suppressFocusShow = React.useRef(false);\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLSpanElement,\n HTMLSpanElement\n >({\n open,\n placement: 'top',\n offset: 10,\n viewportPadding: 8,\n allowFlip: true,\n });\n\n const clearHideTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n };\n\n const show = React.useCallback(() => {\n clearHideTimer();\n setOpen(true);\n }, []);\n\n const scheduleHide = React.useCallback(() => {\n if (pinned) return;\n clearHideTimer();\n timer.current = setTimeout(() => setOpen(false), HIDE_GRACE_MS);\n }, [pinned]);\n\n const close = React.useCallback(() => {\n clearHideTimer();\n setPinned(false);\n setOpen(false);\n // Return focus to the trigger if it was inside the card.\n if (floatingRef.current?.contains(document.activeElement)) {\n suppressFocusShow.current = true;\n (anchorRef.current?.querySelector('a,button') as HTMLElement)?.focus();\n }\n }, [anchorRef, floatingRef]);\n\n React.useEffect(() => () => clearHideTimer(), []);\n\n // A pinned card is a non-modal dialog: move focus into it so its links\n // and close button are reachable by keyboard.\n React.useEffect(() => {\n if (pinned) floatingRef.current?.focus();\n }, [pinned, floatingRef]);\n\n useEscapeKey(close, open);\n\n // Pinned cards close on an outside tap; hover cards close on their own.\n React.useEffect(() => {\n if (!open || !pinned) return;\n const onPointer = (e: Event) => {\n const t = e.target as Node;\n if (anchorRef.current?.contains(t) || floatingRef.current?.contains(t))\n return;\n close();\n };\n document.addEventListener('mousedown', onPointer);\n document.addEventListener('touchstart', onPointer);\n return () => {\n document.removeEventListener('mousedown', onPointer);\n document.removeEventListener('touchstart', onPointer);\n };\n }, [open, pinned, close, anchorRef, floatingRef]);\n\n const togglePin = React.useCallback(() => {\n if (pinned) close();\n else {\n setPinned(true);\n show();\n }\n }, [pinned, close, show]);\n\n // Linked terms: desktop clicks navigate, coarse pointers pin instead.\n // Unlinked (button) terms: any click toggles the pin — hover previews,\n // click holds the card open.\n const onTriggerClick = (e: React.MouseEvent) => {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia('(hover: none)').matches;\n if (href) {\n if (!coarse) return;\n e.preventDefault();\n }\n togglePin();\n };\n\n const onTriggerKeyDown = (e: React.KeyboardEvent) => {\n if (href) return; // links keep native Enter navigation\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePin();\n }\n };\n\n // Focus lives on the dialog container once pinned, so Enter/Space there\n // (not on a link or the close button inside) must also unpin.\n const onDialogKeyDown = (e: React.KeyboardEvent<HTMLSpanElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n close();\n }\n };\n\n const onTriggerFocus = () => {\n if (suppressFocusShow.current) {\n suppressFocusShow.current = false;\n return;\n }\n show();\n };\n\n const onBlurCapture = (e: React.FocusEvent<HTMLSpanElement>) => {\n const next = e.relatedTarget as Node | null;\n if (\n next &&\n (anchorRef.current?.contains(next) || floatingRef.current?.contains(next))\n )\n return;\n scheduleHide();\n };\n\n const limit = Math.max(1, maxDefinitionLength);\n const short =\n definition.length > limit\n ? `${definition.slice(0, limit - 1).trimEnd()}…`\n : definition;\n\n const triggerClasses = cn(\n 'cursor-help',\n underline &&\n 'decoration-primary-400/70 underline decoration-dashed underline-offset-4',\n className\n );\n\n const triggerProps = {\n onClick: onTriggerClick,\n className: cn(\n triggerClasses,\n href && 'text-primary-800 dark:text-primary-400 font-medium'\n ),\n };\n\n return (\n <span\n ref={anchorRef}\n className=\"relative inline\"\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onFocus={onTriggerFocus}\n onBlur={onBlurCapture}\n >\n {href ? (\n <a\n href={href}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n {...triggerProps}\n >\n {children}\n </a>\n ) : (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`${term} — show definition`}\n onKeyDown={onTriggerKeyDown}\n {...triggerProps}\n className={cn(\n 'inline appearance-none border-0 bg-transparent p-0 text-inherit [font:inherit]',\n triggerProps.className\n )}\n >\n {children}\n </button>\n )}\n {open &&\n createPortal(\n /* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keyboard dismissal on a focused non-modal dialog container is the WAI-ARIA pattern; links inside keep their own semantics */\n <span\n ref={floatingRef}\n role=\"dialog\"\n aria-label={term}\n tabIndex={-1}\n onMouseEnter={show}\n onMouseLeave={scheduleHide}\n onBlurCapture={onBlurCapture}\n onKeyDown={onDialogKeyDown}\n className=\"focus-visible:ring-ring z-50 block w-80 rounded-lg outline-none focus-visible:ring-2\"\n style={style}\n >\n <span className=\"border-border bg-card block overflow-hidden rounded-lg border text-start font-normal tracking-normal normal-case shadow-xl ring-1 ring-black/5 dark:ring-white/10\">\n <span className=\"from-primary-700 to-primary-600 block bg-gradient-to-br px-3.5 py-2.5\">\n <span className=\"flex items-start justify-between gap-2\">\n <span className=\"block min-w-0\">\n {category && (\n <span className=\"mb-1 inline-flex rounded-full bg-white/15 px-2 py-0.5 text-[10px] font-bold tracking-wide text-white uppercase\">\n {category}\n </span>\n )}\n <span className=\"block text-sm leading-snug font-semibold text-white\">\n {term}\n </span>\n </span>\n {pinned && (\n <button\n type=\"button\"\n onClick={close}\n aria-label=\"Close definition\"\n className=\"shrink-0 rounded p-0.5 text-white/70 hover:bg-white/10 hover:text-white\"\n >\n <X aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </span>\n </span>\n\n <span className=\"block px-3.5 py-2.5\">\n <span className=\"text-muted-foreground block text-[13px] leading-relaxed\">\n {short}\n </span>\n {keyFact && (\n <span className=\"mt-2 flex items-start gap-1.5\">\n <Diamond\n aria-hidden=\"true\"\n className=\"text-primary-500 mt-0.5 h-3 w-3 shrink-0\"\n />\n <span className=\"text-foreground min-w-0 text-xs leading-relaxed font-medium\">\n {keyFact}\n </span>\n </span>\n )}\n </span>\n\n {(source || (related && related.length > 0) || href) && (\n <span className=\"border-border bg-muted/50 block border-t px-3.5 py-2\">\n {related && related.length > 0 && (\n <span className=\"mb-1.5 flex flex-wrap gap-1\">\n {related.map((r) =>\n r.href ? (\n <a\n key={r.term}\n href={r.href}\n className=\"border-border bg-card text-foreground hover:border-primary-400 hover:text-primary-800 dark:hover:text-primary-400 rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </a>\n ) : (\n <span\n key={r.term}\n className=\"border-border bg-card text-muted-foreground rounded-full border px-2 py-0.5 text-[11px] font-medium\"\n >\n {r.term}\n </span>\n )\n )}\n </span>\n )}\n <span className=\"flex items-center justify-between gap-2\">\n {source ? (\n <a\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary-800 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300 min-w-0 truncate text-[11px] font-semibold\"\n >\n {source.label}\n </a>\n ) : (\n <span />\n )}\n {href && (\n <a\n href={href}\n className=\"text-muted-foreground hover:text-foreground inline-flex shrink-0 items-center gap-0.5 text-[11px] font-medium\"\n >\n Full definition\n <ArrowRight aria-hidden=\"true\" className=\"h-3 w-3\" />\n </a>\n )}\n </span>\n </span>\n )}\n </span>\n </span>,\n document.body\n )}\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
26
|
+
|
|
27
|
+
var Sparkline = React__namespace.forwardRef(
|
|
28
|
+
function Sparkline2({
|
|
29
|
+
data,
|
|
30
|
+
selectedKey,
|
|
31
|
+
onSelect,
|
|
32
|
+
label,
|
|
33
|
+
ariaLabel,
|
|
34
|
+
height = 32,
|
|
35
|
+
formatValue,
|
|
36
|
+
className,
|
|
37
|
+
...props
|
|
38
|
+
}, ref) {
|
|
39
|
+
const max = React__namespace.useMemo(
|
|
40
|
+
() => Math.max(1, ...data.map((d) => d.value)),
|
|
41
|
+
[data]
|
|
42
|
+
);
|
|
43
|
+
const interactive = Boolean(onSelect);
|
|
44
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
45
|
+
"div",
|
|
46
|
+
{
|
|
47
|
+
ref,
|
|
48
|
+
className: chunkS5RVSXDV_cjs.cn("flex items-end gap-3", className),
|
|
49
|
+
...props,
|
|
50
|
+
children: [
|
|
51
|
+
label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground w-16 shrink-0 pb-0.5 text-[10px] leading-tight font-medium tracking-wider uppercase", children: label }),
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
className: "flex flex-1 items-end gap-[2px]",
|
|
56
|
+
style: { height },
|
|
57
|
+
role: "group",
|
|
58
|
+
"aria-label": ariaLabel ?? label ?? "Activity over time",
|
|
59
|
+
children: data.map((point) => {
|
|
60
|
+
const heightPct = point.value === 0 ? 6 : Math.max(12, Math.round(point.value / max * 100));
|
|
61
|
+
const isSelected = selectedKey === point.key;
|
|
62
|
+
const display = point.label ?? point.key;
|
|
63
|
+
const valueText = formatValue ? formatValue(point) : String(point.value);
|
|
64
|
+
const title = `${display} \u2014 ${valueText}`;
|
|
65
|
+
const barClasses = chunkS5RVSXDV_cjs.cn(
|
|
66
|
+
"min-w-[3px] flex-1 rounded-sm transition-colors",
|
|
67
|
+
isSelected ? "bg-primary-500 hover:bg-primary-500/90" : point.value > 0 ? "bg-primary-500/40 hover:bg-primary-500/70" : "bg-muted hover:bg-muted-foreground/20"
|
|
68
|
+
);
|
|
69
|
+
return interactive ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
onClick: () => onSelect?.(isSelected ? null : point.key),
|
|
74
|
+
"aria-pressed": isSelected,
|
|
75
|
+
title,
|
|
76
|
+
"aria-label": title,
|
|
77
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
78
|
+
barClasses,
|
|
79
|
+
"focus-visible:ring-ring cursor-pointer focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none"
|
|
80
|
+
),
|
|
81
|
+
style: { height: `${heightPct}%` }
|
|
82
|
+
},
|
|
83
|
+
point.key
|
|
84
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
85
|
+
"span",
|
|
86
|
+
{
|
|
87
|
+
role: "img",
|
|
88
|
+
title,
|
|
89
|
+
"aria-label": title,
|
|
90
|
+
className: barClasses,
|
|
91
|
+
style: { height: `${heightPct}%` }
|
|
92
|
+
},
|
|
93
|
+
point.key
|
|
94
|
+
);
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
exports.Sparkline = Sparkline;
|
|
105
|
+
//# sourceMappingURL=chunk-7RV6CAP6.cjs.map
|
|
106
|
+
//# sourceMappingURL=chunk-7RV6CAP6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Sparkline/Sparkline.tsx"],"names":["React","Sparkline","jsxs","cn","jsx"],"mappings":"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","file":"chunk-7RV6CAP6.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SparklinePoint {\n /** Stable key for selection (e.g. a day key like \"2026-08-22\"). */\n key: string;\n /** Human label for tooltips and accessible names (defaults to key). */\n label?: string;\n value: number;\n}\n\nexport interface SparklineProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'onSelect'\n> {\n /** Pre-bucketed points in display order (e.g. one per day). */\n data: SparklinePoint[];\n /** Selected point key — that bar is highlighted. */\n selectedKey?: string | null;\n /**\n * Makes bars clickable; clicking the selected bar reports `null`\n * (deselect). Omit for a read-only sparkline.\n */\n onSelect?: (key: string | null) => void;\n /** Track label rendered before the bars (e.g. \"All activity\"). */\n label?: string;\n /**\n * Accessible name for the bar group. Defaults to the visible `label`\n * (so multiple tracks stay distinguishable), else \"Activity over time\".\n */\n ariaLabel?: string;\n /** Bar track height in px (default 32). */\n height?: number;\n /** Formats the value for tooltips/accessible names (default `String`). */\n formatValue?: (point: SparklinePoint) => string;\n}\n\n// =============================================================================\n// Sparkline\n// =============================================================================\n\n/**\n * A compact bar sparkline for activity-over-time strips — timelines,\n * table rows, dashboard headers. Bars scale to the series maximum;\n * zero-value bars render as a low baseline stub. With `onSelect`, bars\n * become toggle buttons for filtering the view to one bucket.\n *\n * Data arrives pre-bucketed (the host owns date math), keeping the\n * component pure. For full charting, reach for DataVis instead.\n *\n * @example\n * ```tsx\n * <Sparkline\n * label=\"All activity\"\n * data={days.map((d) => ({ key: d.iso, label: d.pretty, value: d.count }))}\n * selectedKey={day}\n * onSelect={setDay}\n * />\n * ```\n */\nexport const Sparkline = React.forwardRef<HTMLDivElement, SparklineProps>(\n function Sparkline(\n {\n data,\n selectedKey,\n onSelect,\n label,\n ariaLabel,\n height = 32,\n formatValue,\n className,\n ...props\n },\n ref\n ) {\n const max = React.useMemo(\n () => Math.max(1, ...data.map((d) => d.value)),\n [data]\n );\n\n const interactive = Boolean(onSelect);\n\n return (\n <div\n ref={ref}\n className={cn('flex items-end gap-3', className)}\n {...props}\n >\n {label && (\n <span className=\"text-muted-foreground w-16 shrink-0 pb-0.5 text-[10px] leading-tight font-medium tracking-wider uppercase\">\n {label}\n </span>\n )}\n <div\n className=\"flex flex-1 items-end gap-[2px]\"\n style={{ height }}\n role=\"group\"\n aria-label={ariaLabel ?? label ?? 'Activity over time'}\n >\n {data.map((point) => {\n const heightPct =\n point.value === 0\n ? 6\n : Math.max(12, Math.round((point.value / max) * 100));\n const isSelected = selectedKey === point.key;\n const display = point.label ?? point.key;\n const valueText = formatValue\n ? formatValue(point)\n : String(point.value);\n const title = `${display} — ${valueText}`;\n\n const barClasses = cn(\n 'min-w-[3px] flex-1 rounded-sm transition-colors',\n isSelected\n ? 'bg-primary-500 hover:bg-primary-500/90'\n : point.value > 0\n ? 'bg-primary-500/40 hover:bg-primary-500/70'\n : 'bg-muted hover:bg-muted-foreground/20'\n );\n\n return interactive ? (\n <button\n key={point.key}\n type=\"button\"\n onClick={() => onSelect?.(isSelected ? null : point.key)}\n aria-pressed={isSelected}\n title={title}\n aria-label={title}\n className={cn(\n barClasses,\n 'focus-visible:ring-ring cursor-pointer focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none'\n )}\n style={{ height: `${heightPct}%` }}\n />\n ) : (\n <span\n key={point.key}\n role=\"img\"\n title={title}\n aria-label={title}\n className={barClasses}\n style={{ height: `${heightPct}%` }}\n />\n );\n })}\n </div>\n </div>\n );\n }\n);\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Slider } from './chunk-OTQ72WX3.js';
|
|
2
2
|
import { MediaPlayer } from './chunk-EMMYFHOT.js';
|
|
3
|
-
import { Checkbox } from './chunk-
|
|
4
|
-
import { Select } from './chunk-
|
|
3
|
+
import { Checkbox } from './chunk-753Z3NXL.js';
|
|
4
|
+
import { Select } from './chunk-XBKOZRDO.js';
|
|
5
5
|
import { Modal, ModalHeader, ModalTitle, ModalClose, ModalBody, ModalFooter } from './chunk-XMCIXHGH.js';
|
|
6
|
-
import { Input } from './chunk-
|
|
6
|
+
import { Input } from './chunk-3IMM2PM4.js';
|
|
7
7
|
import { Button } from './chunk-D2GID3YK.js';
|
|
8
8
|
import { useTranscriptEdits, DEFAULT_FILLER_WORDS } from './chunk-UUI7WXI5.js';
|
|
9
9
|
import { isSilenceType, PLAYBACK_SPEEDS } from './chunk-6CGM5H4J.js';
|
|
@@ -1999,5 +1999,5 @@ var MediaEditor = React6.forwardRef(
|
|
|
1999
1999
|
MediaEditor.displayName = "MediaEditor";
|
|
2000
2000
|
|
|
2001
2001
|
export { FillerWordsModal, MediaEditor, SilenceSettingsModal, SpeedMarkerMenu, WordEditorModal };
|
|
2002
|
-
//# sourceMappingURL=chunk-
|
|
2003
|
-
//# sourceMappingURL=chunk-
|
|
2002
|
+
//# sourceMappingURL=chunk-A5YOIJKL.js.map
|
|
2003
|
+
//# sourceMappingURL=chunk-A5YOIJKL.js.map
|