@mintlify/msft-sdk 1.1.7 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/content-components/default-components.js +58 -37
  2. package/dist/components/content-components/default-components.js.map +1 -1
  3. package/dist/components/content-components/table/index.js +1 -1
  4. package/dist/components/content-components/tabs/tabs.js +1 -1
  5. package/dist/components/content-components/tabs/tabs.js.map +1 -1
  6. package/dist/components/docsLayout.js +62 -0
  7. package/dist/components/docsLayout.js.map +1 -0
  8. package/dist/components/docsPage.js +133 -0
  9. package/dist/components/docsPage.js.map +1 -0
  10. package/dist/components/nav-tree/dropdown-menu.js +1 -1
  11. package/dist/components/nav-tree/dropdown-menu.js.map +1 -1
  12. package/dist/components/nav-tree/index.js +101 -160
  13. package/dist/components/nav-tree/index.js.map +1 -1
  14. package/dist/components/page-context-menu.js +78 -72
  15. package/dist/components/page-context-menu.js.map +1 -1
  16. package/dist/components/toc/index.js +10 -10
  17. package/dist/components/toc/index.js.map +1 -1
  18. package/dist/index.d.ts +186 -210
  19. package/dist/index.js +36 -113
  20. package/dist/index.js.map +1 -1
  21. package/dist/parser/convert-html-to-mdx.js +7 -6
  22. package/dist/parser/convert-html-to-mdx.js.map +1 -1
  23. package/dist/plugins/sanitize/rehype-unwrap-image-links.js +12 -0
  24. package/dist/plugins/sanitize/rehype-unwrap-image-links.js.map +1 -0
  25. package/dist/styles.css +1 -1
  26. package/package.json +1 -1
  27. package/dist/components/page.js +0 -120
  28. package/dist/components/page.js.map +0 -1
  29. package/dist/plugins/extract-headings.js +0 -28
  30. package/dist/plugins/extract-headings.js.map +0 -1
@@ -1,155 +1,161 @@
1
- import { jsxs as i, jsx as e, Fragment as f } from "react/jsx-runtime";
2
- import { useState as h, useRef as P, useEffect as w } from "react";
3
- import { CopyRegular as k, MarkdownRegular as C, ChevronDownRegular as F, ArrowUpRightRegular as T, DocumentOnePageSparkleRegular as A, DocumentOnePageMultipleSparkleRegular as I } from "@fluentui/react-icons";
4
- import { copyMarkdownToClipboard as S } from "../hooks/useMarkdownCopy.js";
5
- import { cn as x } from "../utils/cn.js";
6
- const B = ({
7
- className: v,
1
+ import { jsxs as n, jsx as e, Fragment as N } from "react/jsx-runtime";
2
+ import { useState as _, useRef as E, useEffect as R } from "react";
3
+ import { CopyRegular as O, MarkdownRegular as T, ChevronDownRegular as j, ArrowUpRightRegular as y, DocumentOnePageSparkleRegular as V, DocumentOnePageMultipleSparkleRegular as z } from "@fluentui/react-icons";
4
+ import { copyMarkdownToClipboard as B } from "../hooks/useMarkdownCopy.js";
5
+ import { cn as u } from "../utils/cn.js";
6
+ const J = ({
7
+ className: L,
8
8
  pathname: d,
9
- markdownContent: u,
10
- onCopyMarkdown: n,
11
- onViewMarkdown: p,
12
- allPages: N,
13
- baseUrl: _
9
+ markdownContent: p,
10
+ onCopyMarkdown: i,
11
+ onCopyPage: f,
12
+ onViewMarkdown: g,
13
+ onViewLlmsTxt: h,
14
+ onViewLlmsFullTxt: k,
15
+ allPages: P,
16
+ baseUrl: F,
17
+ customActions: w
14
18
  }) => {
15
- const [r, s] = h(!1), [a, g] = h(!1), c = P(null);
16
- w(() => {
19
+ const [m, o] = _(!1), [a, v] = _(!1), c = E(null);
20
+ R(() => {
17
21
  if (a) {
18
22
  const t = setTimeout(() => {
19
- g(!1);
23
+ v(!1);
20
24
  }, 2e3);
21
25
  return () => clearTimeout(t);
22
26
  }
23
- }, [a]), w(() => {
24
- const t = (b) => {
25
- c.current && !c.current.contains(b.target) && s(!1);
27
+ }, [a]), R(() => {
28
+ const t = (x) => {
29
+ c.current && !c.current.contains(x.target) && o(!1);
26
30
  };
27
- return r && document.addEventListener("mousedown", t), () => {
31
+ return m && document.addEventListener("mousedown", t), () => {
28
32
  document.removeEventListener("mousedown", t);
29
33
  };
30
- }, [r]);
31
- const R = async () => {
32
- g(!0);
34
+ }, [m]);
35
+ const I = async () => {
36
+ v(!0);
33
37
  try {
34
- if (u) {
38
+ if (f)
39
+ await f(), i == null || i();
40
+ else if (p) {
35
41
  const t = new ClipboardItem({
36
- "text/plain": new Blob([u], { type: "text/plain" })
42
+ "text/plain": new Blob([p], { type: "text/plain" })
37
43
  });
38
- await navigator.clipboard.write([t]), n == null || n();
44
+ await navigator.clipboard.write([t]), i == null || i();
39
45
  } else
40
- S({
46
+ B({
41
47
  pathname: d,
42
48
  onSuccess: () => {
43
- n == null || n();
49
+ i == null || i();
44
50
  }
45
51
  });
46
52
  } catch (t) {
47
53
  console.error("Failed to copy markdown:", t);
48
54
  }
49
- }, y = () => {
50
- p ? p(d) : window.open(`${d}.md`, "_blank");
51
- }, L = () => {
52
- window.open("/docs/llms.txt", "_blank");
53
- }, O = () => {
54
- window.open("/docs/llms-full.txt", "_blank");
55
- }, l = (t) => () => {
56
- s(!1), t();
57
- }, m = [
55
+ }, S = () => {
56
+ g ? g(d) : window.open(`${d}.md`, "_blank");
57
+ }, A = () => {
58
+ h ? h() : window.open("/docs/llms.txt", "_blank");
59
+ }, D = () => {
60
+ k ? k() : window.open("/docs/llms-full.txt", "_blank");
61
+ }, r = (t) => () => {
62
+ o(!1), t();
63
+ }, b = [
58
64
  {
59
65
  id: "copy",
60
66
  title: "Copy Page",
61
67
  description: "Copy page as markdown",
62
- icon: k,
63
- action: l(R)
68
+ icon: O,
69
+ action: r(I)
64
70
  },
65
71
  {
66
72
  id: "view",
67
73
  title: "View as Markdown",
68
74
  description: "View this page as plain text",
69
- icon: C,
70
- action: l(y),
75
+ icon: T,
76
+ action: r(S),
71
77
  externalLink: !0
72
78
  }
73
79
  ];
74
- N && _ && (m.push({
80
+ P && F && (b.push({
75
81
  id: "llms",
76
82
  title: "View llms.txt",
77
83
  description: "View generated llms.txt file",
78
- icon: A,
79
- action: l(L),
84
+ icon: V,
85
+ action: r(A),
80
86
  externalLink: !0
81
- }), m.push({
87
+ }), b.push({
82
88
  id: "llms-full",
83
89
  title: "View llms-full.txt",
84
90
  description: "Generated llms-full.txt file",
85
- icon: I,
86
- action: l(O),
91
+ icon: z,
92
+ action: r(D),
87
93
  externalLink: !0
88
94
  }));
89
- const o = m[0];
90
- return /* @__PURE__ */ i(
95
+ const l = w ? w.map((t) => ({
96
+ ...t,
97
+ action: r(t.action)
98
+ })) : b, s = l[0];
99
+ return /* @__PURE__ */ n(
91
100
  "div",
92
101
  {
93
- className: x(
94
- "mint:flex mint:items-center mint:flex-shrink-0",
95
- v
96
- ),
102
+ className: u("mint:flex mint:items-center mint:shrink-0", L),
97
103
  ref: c,
98
104
  children: [
99
105
  /* @__PURE__ */ e(
100
106
  "button",
101
107
  {
102
- className: x(
108
+ className: u(
103
109
  "mint:rounded-xl mint:py-1.5 mint:px-3 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]",
104
- m.length > 1 && "mint:rounded-tr-none mint:rounded-br-none mint:border-r-0",
110
+ l.length > 1 && "mint:rounded-tr-none mint:rounded-br-none mint:border-r-0",
105
111
  a && "mint:text-[#6b7280] mint:dark:text-[#9ca3af]"
106
112
  ),
107
113
  onClick: () => {
108
- o.action();
114
+ s.action();
109
115
  },
110
- children: /* @__PURE__ */ e("div", { className: "mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:text-[#242424] mint:dark:text-[#dbdbdb]", children: o.id === "copy" ? /* @__PURE__ */ i(f, { children: [
111
- /* @__PURE__ */ e(k, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }),
116
+ children: /* @__PURE__ */ e("div", { className: "mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:text-[#242424] mint:dark:text-[#dbdbdb]", children: s.id === "copy" ? /* @__PURE__ */ n(N, { children: [
117
+ /* @__PURE__ */ e(O, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }),
112
118
  /* @__PURE__ */ e("span", { children: a ? "Copied" : "Copy Page" })
113
- ] }) : /* @__PURE__ */ i(f, { children: [
114
- /* @__PURE__ */ e(o.icon, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }),
115
- /* @__PURE__ */ e("span", { children: o.title })
119
+ ] }) : /* @__PURE__ */ n(N, { children: [
120
+ /* @__PURE__ */ e(s.icon, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }),
121
+ /* @__PURE__ */ e("span", { children: s.title })
116
122
  ] }) })
117
123
  }
118
124
  ),
119
- m.length > 1 && /* @__PURE__ */ i("div", { className: "mint:relative", children: [
125
+ l.length > 1 && /* @__PURE__ */ n("div", { className: "mint:relative", children: [
120
126
  /* @__PURE__ */ e(
121
127
  "button",
122
128
  {
123
129
  className: "mint:rounded-none mint:rounded-tr-xl mint:rounded-br-xl mint:py-1.5 mint:px-2 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]",
124
- onClick: () => s(!r),
130
+ onClick: () => o(!m),
125
131
  children: /* @__PURE__ */ e(
126
- F,
132
+ j,
127
133
  {
128
- className: x(
134
+ className: u(
129
135
  "mint:w-4 mint:h-4 mint:transition-transform mint:duration-150",
130
- r && "mint:rotate-180"
136
+ m && "mint:rotate-180"
131
137
  )
132
138
  }
133
139
  )
134
140
  }
135
141
  ),
136
- r && /* @__PURE__ */ e("div", { className: "mint:absolute mint:right-0 mint:top-full mint:mt-1 mint:z-50 mint:max-h-[420px] mint:py-1.5 mint:min-w-[240px] mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:rounded-xl mint:shadow-[0_20px_25px_-5px_rgba(0,0,0,0.1),0_10px_10px_-5px_rgba(0,0,0,0.04)] mint:overflow-y-auto", children: m.map((t, b) => /* @__PURE__ */ i(
142
+ m && /* @__PURE__ */ e("div", { className: "mint:absolute mint:right-0 mint:top-full mint:mt-1 mint:z-50 mint:max-h-[420px] mint:py-1.5 mint:min-w-[240px] mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:rounded-xl mint:shadow-[0_20px_25px_-5px_rgba(0,0,0,0.1),0_10px_10px_-5px_rgba(0,0,0,0.04)] mint:overflow-y-auto", children: l.map((t, x) => /* @__PURE__ */ n(
137
143
  "button",
138
144
  {
139
145
  onClick: t.action,
140
146
  className: "mint:w-full mint:flex mint:items-center mint:gap-3 mint:py-2 mint:px-2.5 mint:cursor-pointer mint:rounded-xl mint:transition-colors mint:duration-150 mint:border-none mint:bg-none mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]",
141
147
  children: [
142
- /* @__PURE__ */ e("div", { className: "mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:rounded-lg mint:p-1 mint:flex-shrink-0", children: /* @__PURE__ */ e(t.icon, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }) }),
143
- /* @__PURE__ */ i("div", { className: "mint:flex mint:flex-col mint:flex-1 mint:min-w-0 mint:text-left", children: [
144
- /* @__PURE__ */ i("div", { className: "mint:text-sm mint:font-medium mint:text-[#1f2937] mint:dark:text-[#d1d5db] mint:flex mint:items-center mint:gap-1.5", children: [
148
+ /* @__PURE__ */ e("div", { className: "mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:rounded-lg mint:p-1 mint:shrink-0", children: /* @__PURE__ */ e(t.icon, { className: "mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]" }) }),
149
+ /* @__PURE__ */ n("div", { className: "mint:flex mint:flex-col mint:flex-1 mint:min-w-0 mint:text-left", children: [
150
+ /* @__PURE__ */ n("div", { className: "mint:text-sm mint:font-medium mint:text-[#1f2937] mint:dark:text-[#d1d5db] mint:flex mint:items-center mint:gap-1.5", children: [
145
151
  t.title,
146
- t.externalLink && /* @__PURE__ */ e(T, { className: "mint:w-3 mint:h-3 mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:flex-shrink-0" })
152
+ t.externalLink && /* @__PURE__ */ e(y, { className: "mint:w-3 mint:h-3 mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:shrink-0" })
147
153
  ] }),
148
154
  /* @__PURE__ */ e("div", { className: "mint:text-xs mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:mt-0.5", children: t.description })
149
155
  ] })
150
156
  ]
151
157
  },
152
- t.id + b
158
+ t.id + x
153
159
  )) })
154
160
  ] })
155
161
  ]
@@ -157,6 +163,6 @@ const B = ({
157
163
  );
158
164
  };
159
165
  export {
160
- B as PageContextMenu
166
+ J as PageContextMenu
161
167
  };
162
168
  //# sourceMappingURL=page-context-menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page-context-menu.js","sources":["../../src/components/page-context-menu.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport {\n CopyRegular,\n MarkdownRegular,\n ChevronDownRegular,\n ArrowUpRightRegular,\n DocumentTextRegular,\n DocumentOnePageSparkleRegular,\n DocumentOnePageMultipleSparkleRegular,\n} from \"@fluentui/react-icons\";\nimport { copyMarkdownToClipboard } from \"../hooks/useMarkdownCopy\";\nimport type { LlmsPageConfig } from \"../utils/generate-llms-txt\";\nimport { cn } from \"../utils/cn\";\n\ntype ContextualOption = {\n id: string;\n title: string;\n description: string;\n icon: React.ElementType;\n action: () => void;\n externalLink?: boolean;\n};\n\nexport interface PageContextMenuProps {\n className?: string;\n pathname: string;\n markdownContent?: string;\n onCopyMarkdown?: () => void;\n onViewMarkdown?: (pathname: string) => void;\n allPages?: LlmsPageConfig[];\n baseUrl?: string;\n}\n\nexport const PageContextMenu = ({\n className,\n pathname,\n markdownContent,\n onCopyMarkdown,\n onViewMarkdown,\n allPages,\n baseUrl,\n}: PageContextMenuProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isCopied) {\n const timeout = setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n return () => clearTimeout(timeout);\n }\n }, [isCopied]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n\n const copyPageAsMarkdown = async () => {\n setIsCopied(true);\n try {\n if (markdownContent) {\n const clipboardItem = new ClipboardItem({\n \"text/plain\": new Blob([markdownContent], { type: \"text/plain\" }),\n });\n await navigator.clipboard.write([clipboardItem]);\n onCopyMarkdown?.();\n } else {\n copyMarkdownToClipboard({\n pathname,\n onSuccess: () => {\n onCopyMarkdown?.();\n },\n });\n }\n } catch (error) {\n console.error(\"Failed to copy markdown:\", error);\n }\n };\n\n const viewAsMarkdown = () => {\n if (onViewMarkdown) {\n onViewMarkdown(pathname);\n } else {\n window.open(`${pathname}.md`, \"_blank\");\n }\n };\n\n const viewLlmsTxtFile = () => {\n window.open(\"/docs/llms.txt\", \"_blank\");\n };\n\n const viewLlmsFullTxtFile = () => {\n window.open(\"/docs/llms-full.txt\", \"_blank\");\n };\n\n const wrapAction = (actionFn: () => void) => {\n return () => {\n setIsOpen(false);\n actionFn();\n };\n };\n\n const options: ContextualOption[] = [\n {\n id: \"copy\",\n title: \"Copy Page\",\n description: \"Copy page as markdown\",\n icon: CopyRegular,\n action: wrapAction(copyPageAsMarkdown),\n },\n {\n id: \"view\",\n title: \"View as Markdown\",\n description: \"View this page as plain text\",\n icon: MarkdownRegular,\n action: wrapAction(viewAsMarkdown),\n externalLink: true,\n },\n ];\n\n if (allPages && baseUrl) {\n options.push({\n id: \"llms\",\n title: \"View llms.txt\",\n description: \"View generated llms.txt file\",\n icon: DocumentOnePageSparkleRegular,\n action: wrapAction(viewLlmsTxtFile),\n externalLink: true,\n });\n options.push({\n id: \"llms-full\",\n title: \"View llms-full.txt\",\n description: \"Generated llms-full.txt file\",\n icon: DocumentOnePageMultipleSparkleRegular,\n action: wrapAction(viewLlmsFullTxtFile),\n externalLink: true,\n });\n }\n\n const firstOption = options[0];\n\n return (\n <div\n className={cn(\n \"mint:flex mint:items-center mint:flex-shrink-0\",\n className\n )}\n ref={dropdownRef}\n >\n <button\n className={cn(\n \"mint:rounded-xl mint:py-1.5 mint:px-3 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\",\n options.length > 1 &&\n \"mint:rounded-tr-none mint:rounded-br-none mint:border-r-0\",\n isCopied && \"mint:text-[#6b7280] mint:dark:text-[#9ca3af]\"\n )}\n onClick={() => {\n void firstOption.action();\n }}\n >\n <div className=\"mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:text-[#242424] mint:dark:text-[#dbdbdb]\">\n {firstOption.id === \"copy\" ? (\n <>\n <CopyRegular className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n <span>{isCopied ? \"Copied\" : \"Copy Page\"}</span>\n </>\n ) : (\n <>\n <firstOption.icon className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n <span>{firstOption.title}</span>\n </>\n )}\n </div>\n </button>\n\n {options.length > 1 && (\n <div className=\"mint:relative\">\n <button\n className=\"mint:rounded-none mint:rounded-tr-xl mint:rounded-br-xl mint:py-1.5 mint:px-2 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\"\n onClick={() => setIsOpen(!isOpen)}\n >\n <ChevronDownRegular\n className={cn(\n \"mint:w-4 mint:h-4 mint:transition-transform mint:duration-150\",\n isOpen && \"mint:rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"mint:absolute mint:right-0 mint:top-full mint:mt-1 mint:z-50 mint:max-h-[420px] mint:py-1.5 mint:min-w-[240px] mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:rounded-xl mint:shadow-[0_20px_25px_-5px_rgba(0,0,0,0.1),0_10px_10px_-5px_rgba(0,0,0,0.04)] mint:overflow-y-auto\">\n {options.map((option, index) => (\n <button\n key={option.id + index}\n onClick={option.action}\n className=\"mint:w-full mint:flex mint:items-center mint:gap-3 mint:py-2 mint:px-2.5 mint:cursor-pointer mint:rounded-xl mint:transition-colors mint:duration-150 mint:border-none mint:bg-none mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\"\n >\n <div className=\"mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:rounded-lg mint:p-1 mint:flex-shrink-0\">\n <option.icon className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n </div>\n <div className=\"mint:flex mint:flex-col mint:flex-1 mint:min-w-0 mint:text-left\">\n <div className=\"mint:text-sm mint:font-medium mint:text-[#1f2937] mint:dark:text-[#d1d5db] mint:flex mint:items-center mint:gap-1.5\">\n {option.title}\n {option.externalLink && (\n <ArrowUpRightRegular className=\"mint:w-3 mint:h-3 mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:flex-shrink-0\" />\n )}\n </div>\n <div className=\"mint:text-xs mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:mt-0.5\">\n {option.description}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["PageContextMenu","className","pathname","markdownContent","onCopyMarkdown","onViewMarkdown","allPages","baseUrl","isOpen","setIsOpen","useState","isCopied","setIsCopied","dropdownRef","useRef","useEffect","timeout","handleClickOutside","event","copyPageAsMarkdown","clipboardItem","copyMarkdownToClipboard","error","viewAsMarkdown","viewLlmsTxtFile","viewLlmsFullTxtFile","wrapAction","actionFn","options","CopyRegular","MarkdownRegular","DocumentOnePageSparkleRegular","DocumentOnePageMultipleSparkleRegular","firstOption","jsxs","cn","jsx","Fragment","ChevronDownRegular","option","index","ArrowUpRightRegular"],"mappings":"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"}
1
+ {"version":3,"file":"page-context-menu.js","sources":["../../src/components/page-context-menu.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from \"react\";\nimport {\n CopyRegular,\n MarkdownRegular,\n ChevronDownRegular,\n ArrowUpRightRegular,\n DocumentOnePageSparkleRegular,\n DocumentOnePageMultipleSparkleRegular,\n} from \"@fluentui/react-icons\";\nimport { copyMarkdownToClipboard } from \"../hooks/useMarkdownCopy\";\nimport type { LlmsPageConfig } from \"../utils/generate-llms-txt\";\nimport { cn } from \"../utils/cn\";\n\nexport type ContextualOption = {\n id: string;\n title: string;\n description: string;\n icon: React.ElementType;\n action: () => void;\n externalLink?: boolean;\n};\n\nexport interface PageContextMenuProps {\n className?: string;\n pathname: string;\n markdownContent?: string;\n /** Callback fired after markdown is successfully copied */\n onCopyMarkdown?: () => void;\n /** Custom handler for \"Copy Page\" action. If provided, replaces default copy behavior. */\n onCopyPage?: () => void | Promise<void>;\n /** Custom handler for \"View as Markdown\" action. If provided, replaces default view behavior. */\n onViewMarkdown?: (pathname: string) => void;\n /** Custom handler for \"View llms.txt\" action. If provided, replaces default behavior. */\n onViewLlmsTxt?: () => void;\n /** Custom handler for \"View llms-full.txt\" action. If provided, replaces default behavior. */\n onViewLlmsFullTxt?: () => void;\n allPages?: LlmsPageConfig[];\n baseUrl?: string;\n customActions?: ContextualOption[];\n}\n\nexport const PageContextMenu = ({\n className,\n pathname,\n markdownContent,\n onCopyMarkdown,\n onCopyPage,\n onViewMarkdown,\n onViewLlmsTxt,\n onViewLlmsFullTxt,\n allPages,\n baseUrl,\n customActions,\n}: PageContextMenuProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isCopied, setIsCopied] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isCopied) {\n const timeout = setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n return () => clearTimeout(timeout);\n }\n }, [isCopied]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isOpen]);\n\n const copyPageAsMarkdown = async () => {\n setIsCopied(true);\n try {\n // Use custom copy handler if provided\n if (onCopyPage) {\n await onCopyPage();\n onCopyMarkdown?.();\n } else if (markdownContent) {\n const clipboardItem = new ClipboardItem({\n \"text/plain\": new Blob([markdownContent], { type: \"text/plain\" }),\n });\n await navigator.clipboard.write([clipboardItem]);\n onCopyMarkdown?.();\n } else {\n copyMarkdownToClipboard({\n pathname,\n onSuccess: () => {\n onCopyMarkdown?.();\n },\n });\n }\n } catch (error) {\n console.error(\"Failed to copy markdown:\", error);\n }\n };\n\n const viewAsMarkdown = () => {\n if (onViewMarkdown) {\n onViewMarkdown(pathname);\n } else {\n window.open(`${pathname}.md`, \"_blank\");\n }\n };\n\n const viewLlmsTxtFile = () => {\n if (onViewLlmsTxt) {\n onViewLlmsTxt();\n } else {\n window.open(\"/docs/llms.txt\", \"_blank\");\n }\n };\n\n const viewLlmsFullTxtFile = () => {\n if (onViewLlmsFullTxt) {\n onViewLlmsFullTxt();\n } else {\n window.open(\"/docs/llms-full.txt\", \"_blank\");\n }\n };\n\n const wrapAction = (actionFn: () => void) => {\n return () => {\n setIsOpen(false);\n actionFn();\n };\n };\n\n const defaultOptions: ContextualOption[] = [\n {\n id: \"copy\",\n title: \"Copy Page\",\n description: \"Copy page as markdown\",\n icon: CopyRegular,\n action: wrapAction(copyPageAsMarkdown),\n },\n {\n id: \"view\",\n title: \"View as Markdown\",\n description: \"View this page as plain text\",\n icon: MarkdownRegular,\n action: wrapAction(viewAsMarkdown),\n externalLink: true,\n },\n ];\n\n if (allPages && baseUrl) {\n defaultOptions.push({\n id: \"llms\",\n title: \"View llms.txt\",\n description: \"View generated llms.txt file\",\n icon: DocumentOnePageSparkleRegular,\n action: wrapAction(viewLlmsTxtFile),\n externalLink: true,\n });\n defaultOptions.push({\n id: \"llms-full\",\n title: \"View llms-full.txt\",\n description: \"Generated llms-full.txt file\",\n icon: DocumentOnePageMultipleSparkleRegular,\n action: wrapAction(viewLlmsFullTxtFile),\n externalLink: true,\n });\n }\n\n // Use custom actions if provided, otherwise use default options\n const options: ContextualOption[] = customActions\n ? customActions.map((action) => ({\n ...action,\n action: wrapAction(action.action),\n }))\n : defaultOptions;\n\n const firstOption = options[0];\n\n return (\n <div\n className={cn(\"mint:flex mint:items-center mint:shrink-0\", className)}\n ref={dropdownRef}\n >\n <button\n className={cn(\n \"mint:rounded-xl mint:py-1.5 mint:px-3 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\",\n options.length > 1 &&\n \"mint:rounded-tr-none mint:rounded-br-none mint:border-r-0\",\n isCopied && \"mint:text-[#6b7280] mint:dark:text-[#9ca3af]\"\n )}\n onClick={() => {\n void firstOption.action();\n }}\n >\n <div className=\"mint:flex mint:items-center mint:gap-2 mint:text-sm mint:font-medium mint:text-[#242424] mint:dark:text-[#dbdbdb]\">\n {firstOption.id === \"copy\" ? (\n <>\n <CopyRegular className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n <span>{isCopied ? \"Copied\" : \"Copy Page\"}</span>\n </>\n ) : (\n <>\n <firstOption.icon className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n <span>{firstOption.title}</span>\n </>\n )}\n </div>\n </button>\n\n {options.length > 1 && (\n <div className=\"mint:relative\">\n <button\n className=\"mint:rounded-none mint:rounded-tr-xl mint:rounded-br-xl mint:py-1.5 mint:px-2 mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:text-[#374151] mint:dark:text-[#d1d5db] mint:cursor-pointer mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\"\n onClick={() => setIsOpen(!isOpen)}\n >\n <ChevronDownRegular\n className={cn(\n \"mint:w-4 mint:h-4 mint:transition-transform mint:duration-150\",\n isOpen && \"mint:rotate-180\"\n )}\n />\n </button>\n\n {isOpen && (\n <div className=\"mint:absolute mint:right-0 mint:top-full mint:mt-1 mint:z-50 mint:max-h-[420px] mint:py-1.5 mint:min-w-[240px] mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:bg-white mint:dark:bg-[#1a1a1a] mint:rounded-xl mint:shadow-[0_20px_25px_-5px_rgba(0,0,0,0.1),0_10px_10px_-5px_rgba(0,0,0,0.04)] mint:overflow-y-auto\">\n {options.map((option, index) => (\n <button\n key={option.id + index}\n onClick={option.action}\n className=\"mint:w-full mint:flex mint:items-center mint:gap-3 mint:py-2 mint:px-2.5 mint:cursor-pointer mint:rounded-xl mint:transition-colors mint:duration-150 mint:border-none mint:bg-none mint:hover:bg-[rgba(75,85,99,0.05)] mint:dark:hover:bg-[rgba(229,231,235,0.05)]\"\n >\n <div className=\"mint:border mint:border-[#e5e7eb] mint:dark:border-[rgba(255,255,255,0.07)] mint:rounded-lg mint:p-1 mint:shrink-0\">\n <option.icon className=\"mint:w-5 mint:h-5 mint:text-[#424242] mint:dark:text-[#b2b2b2]\" />\n </div>\n <div className=\"mint:flex mint:flex-col mint:flex-1 mint:min-w-0 mint:text-left\">\n <div className=\"mint:text-sm mint:font-medium mint:text-[#1f2937] mint:dark:text-[#d1d5db] mint:flex mint:items-center mint:gap-1.5\">\n {option.title}\n {option.externalLink && (\n <ArrowUpRightRegular className=\"mint:w-3 mint:h-3 mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:shrink-0\" />\n )}\n </div>\n <div className=\"mint:text-xs mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:mt-0.5\">\n {option.description}\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n"],"names":["PageContextMenu","className","pathname","markdownContent","onCopyMarkdown","onCopyPage","onViewMarkdown","onViewLlmsTxt","onViewLlmsFullTxt","allPages","baseUrl","customActions","isOpen","setIsOpen","useState","isCopied","setIsCopied","dropdownRef","useRef","useEffect","timeout","handleClickOutside","event","copyPageAsMarkdown","clipboardItem","copyMarkdownToClipboard","error","viewAsMarkdown","viewLlmsTxtFile","viewLlmsFullTxtFile","wrapAction","actionFn","defaultOptions","CopyRegular","MarkdownRegular","DocumentOnePageSparkleRegular","DocumentOnePageMultipleSparkleRegular","options","action","firstOption","jsxs","cn","jsx","Fragment","ChevronDownRegular","option","index","ArrowUpRightRegular"],"mappings":";;;;;AAyCO,MAAMA,IAAkB,CAAC;AAAA,EAC9B,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC;AACF,MAA4B;AAC1B,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAAUC,CAAW,IAAIF,EAAS,EAAK,GACxCG,IAAcC,EAAuB,IAAI;AAE/C,EAAAC,EAAU,MAAM;AACd,QAAIJ,GAAU;AACZ,YAAMK,IAAU,WAAW,MAAM;AAC/B,QAAAJ,EAAY,EAAK;AAAA,MACnB,GAAG,GAAI;AACP,aAAO,MAAM,aAAaI,CAAO;AAAA,IACnC;AAAA,EACF,GAAG,CAACL,CAAQ,CAAC,GAEbI,EAAU,MAAM;AACd,UAAME,IAAqB,CAACC,MAAsB;AAChD,MACEL,EAAY,WACZ,CAACA,EAAY,QAAQ,SAASK,EAAM,MAAc,KAElDT,EAAU,EAAK;AAAA,IAEnB;AAEA,WAAID,KACF,SAAS,iBAAiB,aAAaS,CAAkB,GAGpD,MAAM;AACX,eAAS,oBAAoB,aAAaA,CAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAACT,CAAM,CAAC;AAEX,QAAMW,IAAqB,YAAY;AACrC,IAAAP,EAAY,EAAI;AAChB,QAAI;AAEF,UAAIX;AACF,cAAMA,EAAA,GACND,KAAA,QAAAA;AAAA,eACSD,GAAiB;AAC1B,cAAMqB,IAAgB,IAAI,cAAc;AAAA,UACtC,cAAc,IAAI,KAAK,CAACrB,CAAe,GAAG,EAAE,MAAM,aAAA,CAAc;AAAA,QAAA,CACjE;AACD,cAAM,UAAU,UAAU,MAAM,CAACqB,CAAa,CAAC,GAC/CpB,KAAA,QAAAA;AAAA,MACF;AACE,QAAAqB,EAAwB;AAAA,UACtB,UAAAvB;AAAA,UACA,WAAW,MAAM;AACf,YAAAE,KAAA,QAAAA;AAAA,UACF;AAAA,QAAA,CACD;AAAA,IAEL,SAASsB,GAAO;AACd,cAAQ,MAAM,4BAA4BA,CAAK;AAAA,IACjD;AAAA,EACF,GAEMC,IAAiB,MAAM;AAC3B,IAAIrB,IACFA,EAAeJ,CAAQ,IAEvB,OAAO,KAAK,GAAGA,CAAQ,OAAO,QAAQ;AAAA,EAE1C,GAEM0B,IAAkB,MAAM;AAC5B,IAAIrB,IACFA,EAAA,IAEA,OAAO,KAAK,kBAAkB,QAAQ;AAAA,EAE1C,GAEMsB,IAAsB,MAAM;AAChC,IAAIrB,IACFA,EAAA,IAEA,OAAO,KAAK,uBAAuB,QAAQ;AAAA,EAE/C,GAEMsB,IAAa,CAACC,MACX,MAAM;AACX,IAAAlB,EAAU,EAAK,GACfkB,EAAA;AAAA,EACF,GAGIC,IAAqC;AAAA,IACzC;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC;AAAA,MACN,QAAQH,EAAWP,CAAkB;AAAA,IAAA;AAAA,IAEvC;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMW;AAAA,MACN,QAAQJ,EAAWH,CAAc;AAAA,MACjC,cAAc;AAAA,IAAA;AAAA,EAChB;AAGF,EAAIlB,KAAYC,MACdsB,EAAe,KAAK;AAAA,IAClB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMG;AAAA,IACN,QAAQL,EAAWF,CAAe;AAAA,IAClC,cAAc;AAAA,EAAA,CACf,GACDI,EAAe,KAAK;AAAA,IAClB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAMI;AAAA,IACN,QAAQN,EAAWD,CAAmB;AAAA,IACtC,cAAc;AAAA,EAAA,CACf;AAIH,QAAMQ,IAA8B1B,IAChCA,EAAc,IAAI,CAAC2B,OAAY;AAAA,IAC7B,GAAGA;AAAA,IACH,QAAQR,EAAWQ,EAAO,MAAM;AAAA,EAAA,EAChC,IACFN,GAEEO,IAAcF,EAAQ,CAAC;AAE7B,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,6CAA6CxC,CAAS;AAAA,MACpE,KAAKgB;AAAA,MAEL,UAAA;AAAA,QAAA,gBAAAyB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAJ,EAAQ,SAAS,KACf;AAAA,cACFtB,KAAY;AAAA,YAAA;AAAA,YAEd,SAAS,MAAM;AACb,cAAKwB,EAAY,OAAA;AAAA,YACnB;AAAA,YAEA,4BAAC,OAAA,EAAI,WAAU,qHACZ,UAAAA,EAAY,OAAO,SAClB,gBAAAC,EAAAG,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAD,EAACT,GAAA,EAAY,WAAU,iEAAA,CAAiE;AAAA,cACxF,gBAAAS,EAAC,QAAA,EAAM,UAAA3B,IAAW,WAAW,YAAA,CAAY;AAAA,YAAA,EAAA,CAC3C,IAEA,gBAAAyB,EAAAG,GAAA,EACE,UAAA;AAAA,cAAA,gBAAAD,EAACH,EAAY,MAAZ,EAAiB,WAAU,iEAAA,CAAiE;AAAA,cAC7F,gBAAAG,EAAC,QAAA,EAAM,UAAAH,EAAY,MAAA,CAAM;AAAA,YAAA,EAAA,CAC3B,EAAA,CAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGDF,EAAQ,SAAS,KAChB,gBAAAG,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,UAAA,gBAAAE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM7B,EAAU,CAACD,CAAM;AAAA,cAEhC,UAAA,gBAAA8B;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,WAAWH;AAAA,oBACT;AAAA,oBACA7B,KAAU;AAAA,kBAAA;AAAA,gBACZ;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAGDA,uBACE,OAAA,EAAI,WAAU,yVACZ,UAAAyB,EAAQ,IAAI,CAACQ,GAAQC,MACpB,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,SAASK,EAAO;AAAA,cAChB,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAH,EAAC,OAAA,EAAI,WAAU,sHACb,UAAA,gBAAAA,EAACG,EAAO,MAAP,EAAY,WAAU,iEAAA,CAAiE,EAAA,CAC1F;AAAA,gBACA,gBAAAL,EAAC,OAAA,EAAI,WAAU,mEACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uHACZ,UAAA;AAAA,oBAAAK,EAAO;AAAA,oBACPA,EAAO,gBACN,gBAAAH,EAACK,GAAA,EAAoB,WAAU,+EAAA,CAA+E;AAAA,kBAAA,GAElH;AAAA,kBACA,gBAAAL,EAAC,OAAA,EAAI,WAAU,yEACZ,YAAO,YAAA,CACV;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,YAjBKG,EAAO,KAAKC;AAAA,UAAA,CAmBpB,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
@@ -1,4 +1,4 @@
1
- import { jsx as d, jsxs as S } from "react/jsx-runtime";
1
+ import { jsx as d, jsxs as k } from "react/jsx-runtime";
2
2
  import { useState as y, useRef as w, useEffect as B } from "react";
3
3
  import { cn as A } from "../../utils/cn.js";
4
4
  function j({ toc: i }) {
@@ -21,16 +21,16 @@ function j({ toc: i }) {
21
21
  if (!e) return (p = i[0]) == null ? void 0 : p.slug;
22
22
  const r = window.getComputedStyle(document.documentElement), E = parseFloat(
23
23
  r.getPropertyValue("--scroll-mt") || "0"
24
- ), R = parseFloat(r.fontSize), k = E * R + 100, h = e.scrollTop, f = i.map((s) => {
24
+ ), R = parseFloat(r.fontSize), C = E * R + 100, h = e.scrollTop, f = i.map((s) => {
25
25
  const v = document.getElementById(s.slug);
26
26
  if (!v) return null;
27
- const C = v.getBoundingClientRect(), I = e.getBoundingClientRect(), L = C.top - I.top + h;
28
- return { id: s.slug, top: L };
27
+ const I = v.getBoundingClientRect(), L = e.getBoundingClientRect(), S = I.top - L.top + h;
28
+ return { id: s.slug, top: S };
29
29
  }).filter(Boolean);
30
30
  if (f.length === 0) return (b = i[0]) == null ? void 0 : b.slug;
31
31
  let a = f[0];
32
32
  for (const s of f)
33
- h + k >= s.top && (a = s);
33
+ h + C >= s.top && (a = s);
34
34
  return a == null ? void 0 : a.id;
35
35
  }, l = () => {
36
36
  if (o.current) return;
@@ -44,17 +44,17 @@ function j({ toc: i }) {
44
44
  return n || (u = setTimeout(l, 100)), () => {
45
45
  u && clearTimeout(u), t.current && clearTimeout(t.current), window.removeEventListener("hashchange", m), e ? e.removeEventListener("scroll", l) : window.removeEventListener("scroll", l);
46
46
  };
47
- }, [i]), /* @__PURE__ */ d("ul", { className: "mint:flex mint:flex-col mint:gap-1 mint:text-sm mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:left-[0.15rem] mint:before:top-0 mint:before:bottom-0 mint:before:w-[3px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full", children: i.map((n, m) => {
47
+ }, [i]), /* @__PURE__ */ d("ul", { className: "mint:flex mint:flex-col mint:gap-2 mint:text-sm mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:top-0 mint:before:bottom-0 mint:before:w-[3px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full", children: i.map((n, m) => {
48
48
  const e = x === n.slug;
49
- return /* @__PURE__ */ S("li", { className: "mint:relative", children: [
50
- e && /* @__PURE__ */ d("div", { className: "mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[3px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-[1]" }),
49
+ return /* @__PURE__ */ k("li", { className: "mint:relative", children: [
50
+ e && /* @__PURE__ */ d("div", { className: "mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[3px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-1" }),
51
51
  /* @__PURE__ */ d(
52
52
  "a",
53
53
  {
54
54
  href: `#${n.slug}`,
55
55
  className: A(
56
- "mint:block mint:pl-6 mint:leading-[1.625] mint:transition-colors mint:duration-150 mint:no-underline",
57
- e ? "mint:text-[#643fb2] mint:dark:text-[#c9aaf9]" : "mint:hover:text-[#111827] mint:dark:hover:text-[#d1d5db]"
56
+ "mint:block mint:pl-6 mint:leading-relaxed mint:transition-colors mint:duration-150 mint:no-underline",
57
+ e ? "mint:text-[#643fb2] mint:dark:text-[#c9aaf9] font-semibold" : "mint:text-[#424242] mint:hover:text-[#111827] mint:dark:hover:text-[#d1d5db]"
58
58
  ),
59
59
  children: n.title
60
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/toc/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport type { TocItem } from \"../../types\";\nimport { cn } from \"../../utils/cn\";\n\ninterface TableOfContentsProps {\n toc: TocItem[];\n}\n\nexport function TableOfContents({ toc }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState(\"\");\n const ignoreScrollRef = useRef(false);\n const ignoreTimeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n ignoreScrollRef.current = false;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n ignoreScrollRef.current = true;\n ignoreTimeoutRef.current = setTimeout(() => {\n ignoreScrollRef.current = false;\n }, 1000);\n } else {\n setActiveId(toc[0]?.slug || \"\");\n }\n\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n ignoreScrollRef.current = true;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n ignoreTimeoutRef.current = setTimeout(() => {\n ignoreScrollRef.current = false;\n }, 1000);\n }\n };\n\n const scrollContainer = document.getElementById(\"main-content\");\n\n const getActiveHeading = () => {\n if (!scrollContainer) return toc[0]?.slug;\n\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(\n style.getPropertyValue(\"--scroll-mt\") || \"0\"\n );\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize + 100;\n\n const scrollY = scrollContainer.scrollTop;\n\n const headingPositions = toc\n .map((item) => {\n const element = document.getElementById(item.slug);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect();\n const relativeTop = rect.top - containerRect.top + scrollY;\n\n return { id: item.slug, top: relativeTop };\n })\n .filter(Boolean) as Array<{ id: string; top: number }>;\n\n if (headingPositions.length === 0) return toc[0]?.slug;\n\n let currentHeading = headingPositions[0];\n for (const heading of headingPositions) {\n if (scrollY + scrollOffset >= heading.top) {\n currentHeading = heading;\n }\n }\n\n return currentHeading?.id;\n };\n\n const handleScroll = () => {\n if (ignoreScrollRef.current) return;\n\n const newActiveId = getActiveHeading();\n if (newActiveId) {\n setActiveId(newActiveId);\n }\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n\n if (scrollContainer) {\n scrollContainer.addEventListener(\"scroll\", handleScroll, {\n passive: true,\n });\n } else {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n }\n\n let timeoutId: NodeJS.Timeout | undefined;\n if (!hash) {\n timeoutId = setTimeout(handleScroll, 100);\n }\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (ignoreTimeoutRef.current) clearTimeout(ignoreTimeoutRef.current);\n window.removeEventListener(\"hashchange\", handleHashChange);\n if (scrollContainer) {\n scrollContainer.removeEventListener(\"scroll\", handleScroll);\n } else {\n window.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, [toc]);\n\n return (\n <ul className=\"mint:flex mint:flex-col mint:gap-1 mint:text-sm mint:text-[#6b7280] mint:dark:text-[#9ca3af] mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:left-[0.15rem] mint:before:top-0 mint:before:bottom-0 mint:before:w-[3px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full\">\n {toc.map((item, index) => {\n const isActive = activeId === item.slug;\n return (\n <li key={`${item.slug}-${index}`} className=\"mint:relative\">\n {isActive && (\n <div className=\"mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[3px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-[1]\" />\n )}\n <a\n href={`#${item.slug}`}\n className={cn(\n \"mint:block mint:pl-6 mint:leading-[1.625] mint:transition-colors mint:duration-150 mint:no-underline\",\n isActive\n ? \"mint:text-[#643fb2] mint:dark:text-[#c9aaf9]\"\n : \"mint:hover:text-[#111827] mint:dark:hover:text-[#d1d5db]\"\n )}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"names":["TableOfContents","toc","activeId","setActiveId","useState","ignoreScrollRef","useRef","ignoreTimeoutRef","useEffect","hash","_a","handleHashChange","scrollContainer","getActiveHeading","style","scrollMtRem","fontSize","scrollOffset","scrollY","headingPositions","item","element","rect","containerRect","relativeTop","_b","currentHeading","heading","handleScroll","newActiveId","timeoutId","jsx","index","isActive","jsxs","cn"],"mappings":";;;AAQO,SAASA,EAAgB,EAAE,KAAAC,KAA6B;AAC7D,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAE,GACrCC,IAAkBC,EAAO,EAAK,GAC9BC,IAAmBD,EAAA;AAEzB,SAAAE,EAAU,MAAM;;AACd,QAAIP,EAAI,WAAW,EAAG;AAEtB,IAAAI,EAAgB,UAAU,IACtBE,EAAiB,WACnB,aAAaA,EAAiB,OAAO;AAGvC,UAAME,IAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AACzC,IAAIA,KACFN,EAAYM,CAAI,GAChBJ,EAAgB,UAAU,IAC1BE,EAAiB,UAAU,WAAW,MAAM;AAC1C,MAAAF,EAAgB,UAAU;AAAA,IAC5B,GAAG,GAAI,KAEPF,IAAYO,IAAAT,EAAI,CAAC,MAAL,gBAAAS,EAAQ,SAAQ,EAAE;AAGhC,UAAMC,IAAmB,MAAM;AAC7B,YAAMF,IAAO,OAAO,SAAS,KAAK,MAAM,CAAC;AACzC,MAAIA,MACFN,EAAYM,CAAI,GAChBJ,EAAgB,UAAU,IACtBE,EAAiB,WACnB,aAAaA,EAAiB,OAAO,GAEvCA,EAAiB,UAAU,WAAW,MAAM;AAC1C,QAAAF,EAAgB,UAAU;AAAA,MAC5B,GAAG,GAAI;AAAA,IAEX,GAEMO,IAAkB,SAAS,eAAe,cAAc,GAExDC,IAAmB,MAAM;;AAC7B,UAAI,CAACD,EAAiB,SAAOF,IAAAT,EAAI,CAAC,MAAL,gBAAAS,EAAQ;AAErC,YAAMI,IAAQ,OAAO,iBAAiB,SAAS,eAAe,GACxDC,IAAc;AAAA,QAClBD,EAAM,iBAAiB,aAAa,KAAK;AAAA,MAAA,GAErCE,IAAW,WAAWF,EAAM,QAAQ,GACpCG,IAAeF,IAAcC,IAAW,KAExCE,IAAUN,EAAgB,WAE1BO,IAAmBlB,EACtB,IAAI,CAACmB,MAAS;AACb,cAAMC,IAAU,SAAS,eAAeD,EAAK,IAAI;AACjD,YAAI,CAACC,EAAS,QAAO;AAErB,cAAMC,IAAOD,EAAQ,sBAAA,GACfE,IAAgBX,EAAgB,sBAAA,GAChCY,IAAcF,EAAK,MAAMC,EAAc,MAAML;AAEnD,eAAO,EAAE,IAAIE,EAAK,MAAM,KAAKI,EAAA;AAAA,MAC/B,CAAC,EACA,OAAO,OAAO;AAEjB,UAAIL,EAAiB,WAAW,EAAG,SAAOM,IAAAxB,EAAI,CAAC,MAAL,gBAAAwB,EAAQ;AAElD,UAAIC,IAAiBP,EAAiB,CAAC;AACvC,iBAAWQ,KAAWR;AACpB,QAAID,IAAUD,KAAgBU,EAAQ,QACpCD,IAAiBC;AAIrB,aAAOD,KAAA,gBAAAA,EAAgB;AAAA,IACzB,GAEME,IAAe,MAAM;AACzB,UAAIvB,EAAgB,QAAS;AAE7B,YAAMwB,IAAchB,EAAA;AACpB,MAAIgB,KACF1B,EAAY0B,CAAW;AAAA,IAE3B;AAEA,WAAO,iBAAiB,cAAclB,CAAgB,GAElDC,IACFA,EAAgB,iBAAiB,UAAUgB,GAAc;AAAA,MACvD,SAAS;AAAA,IAAA,CACV,IAED,OAAO,iBAAiB,UAAUA,GAAc,EAAE,SAAS,IAAM;AAGnE,QAAIE;AACJ,WAAKrB,MACHqB,IAAY,WAAWF,GAAc,GAAG,IAGnC,MAAM;AACX,MAAIE,kBAAwBA,CAAS,GACjCvB,EAAiB,WAAS,aAAaA,EAAiB,OAAO,GACnE,OAAO,oBAAoB,cAAcI,CAAgB,GACrDC,IACFA,EAAgB,oBAAoB,UAAUgB,CAAY,IAE1D,OAAO,oBAAoB,UAAUA,CAAY;AAAA,IAErD;AAAA,EACF,GAAG,CAAC3B,CAAG,CAAC,GAGN,gBAAA8B,EAAC,QAAG,WAAU,qWACX,YAAI,IAAI,CAACX,GAAMY,MAAU;AACxB,UAAMC,IAAW/B,MAAakB,EAAK;AACnC,WACE,gBAAAc,EAAC,MAAA,EAAiC,WAAU,iBACzC,UAAA;AAAA,MAAAD,KACC,gBAAAF,EAAC,OAAA,EAAI,WAAU,wIAAA,CAAwI;AAAA,MAEzJ,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM,IAAIX,EAAK,IAAI;AAAA,UACnB,WAAWe;AAAA,YACT;AAAA,YACAF,IACI,iDACA;AAAA,UAAA;AAAA,UAGL,UAAAb,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IACR,EAAA,GAdO,GAAGA,EAAK,IAAI,IAAIY,CAAK,EAe9B;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/toc/index.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport type { TocItem } from \"../../types\";\nimport { cn } from \"../../utils/cn\";\n\ninterface TableOfContentsProps {\n toc: TocItem[];\n}\n\nexport function TableOfContents({ toc }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState(\"\");\n const ignoreScrollRef = useRef(false);\n const ignoreTimeoutRef = useRef<NodeJS.Timeout>();\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n ignoreScrollRef.current = false;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n ignoreScrollRef.current = true;\n ignoreTimeoutRef.current = setTimeout(() => {\n ignoreScrollRef.current = false;\n }, 1000);\n } else {\n setActiveId(toc[0]?.slug || \"\");\n }\n\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1);\n if (hash) {\n setActiveId(hash);\n ignoreScrollRef.current = true;\n if (ignoreTimeoutRef.current) {\n clearTimeout(ignoreTimeoutRef.current);\n }\n ignoreTimeoutRef.current = setTimeout(() => {\n ignoreScrollRef.current = false;\n }, 1000);\n }\n };\n\n const scrollContainer = document.getElementById(\"main-content\");\n\n const getActiveHeading = () => {\n if (!scrollContainer) return toc[0]?.slug;\n\n const style = window.getComputedStyle(document.documentElement);\n const scrollMtRem = parseFloat(\n style.getPropertyValue(\"--scroll-mt\") || \"0\"\n );\n const fontSize = parseFloat(style.fontSize);\n const scrollOffset = scrollMtRem * fontSize + 100;\n\n const scrollY = scrollContainer.scrollTop;\n\n const headingPositions = toc\n .map((item) => {\n const element = document.getElementById(item.slug);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n const containerRect = scrollContainer.getBoundingClientRect();\n const relativeTop = rect.top - containerRect.top + scrollY;\n\n return { id: item.slug, top: relativeTop };\n })\n .filter(Boolean) as Array<{ id: string; top: number }>;\n\n if (headingPositions.length === 0) return toc[0]?.slug;\n\n let currentHeading = headingPositions[0];\n for (const heading of headingPositions) {\n if (scrollY + scrollOffset >= heading.top) {\n currentHeading = heading;\n }\n }\n\n return currentHeading?.id;\n };\n\n const handleScroll = () => {\n if (ignoreScrollRef.current) return;\n\n const newActiveId = getActiveHeading();\n if (newActiveId) {\n setActiveId(newActiveId);\n }\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n\n if (scrollContainer) {\n scrollContainer.addEventListener(\"scroll\", handleScroll, {\n passive: true,\n });\n } else {\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n }\n\n let timeoutId: NodeJS.Timeout | undefined;\n if (!hash) {\n timeoutId = setTimeout(handleScroll, 100);\n }\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (ignoreTimeoutRef.current) clearTimeout(ignoreTimeoutRef.current);\n window.removeEventListener(\"hashchange\", handleHashChange);\n if (scrollContainer) {\n scrollContainer.removeEventListener(\"scroll\", handleScroll);\n } else {\n window.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, [toc]);\n\n return (\n <ul className=\"mint:flex mint:flex-col mint:gap-2 mint:text-sm mint:font-medium mint:relative mint:pl-[0.15rem] mint:before:content-[''] mint:before:absolute mint:before:top-0 mint:before:bottom-0 mint:before:w-[3px] mint:before:bg-[#f2f3f3] mint:dark:before:bg-[#222223] mint:before:rounded-full\">\n {toc.map((item, index) => {\n const isActive = activeId === item.slug;\n return (\n <li key={`${item.slug}-${index}`} className=\"mint:relative\">\n {isActive && (\n <div className=\"mint:absolute mint:left-0 mint:top-0 mint:bottom-0 mint:w-[3px] mint:rounded-full mint:bg-[#643fb2] mint:dark:bg-[#c9aaf9] mint:z-1\" />\n )}\n <a\n href={`#${item.slug}`}\n className={cn(\n \"mint:block mint:pl-6 mint:leading-relaxed mint:transition-colors mint:duration-150 mint:no-underline\",\n isActive\n ? \"mint:text-[#643fb2] mint:dark:text-[#c9aaf9] font-semibold\"\n : \"mint:text-[#424242] mint:hover:text-[#111827] mint:dark:hover:text-[#d1d5db]\"\n )}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n );\n}\n"],"names":["TableOfContents","toc","activeId","setActiveId","useState","ignoreScrollRef","useRef","ignoreTimeoutRef","useEffect","hash","_a","handleHashChange","scrollContainer","getActiveHeading","style","scrollMtRem","fontSize","scrollOffset","scrollY","headingPositions","item","element","rect","containerRect","relativeTop","_b","currentHeading","heading","handleScroll","newActiveId","timeoutId","jsx","index","isActive","jsxs","cn"],"mappings":"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"}