@adminide-stack/yantra-help-browser 12.0.16-alpha.18 → 12.0.16-alpha.19

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 (26) hide show
  1. package/lib/pages/Markdown/MarkdownPageWithParams.d.ts.map +1 -1
  2. package/lib/pages/Markdown/MarkdownPageWithParams.js +1 -1
  3. package/lib/pages/Markdown/MarkdownPageWithParams.js.map +1 -1
  4. package/package.json +3 -3
  5. package/lib/pages/Markdown/components/MarkdownBreadcrumbs.d.ts +0 -13
  6. package/lib/pages/Markdown/components/MarkdownBreadcrumbs.d.ts.map +0 -1
  7. package/lib/pages/Markdown/components/MarkdownBreadcrumbs.js +0 -34
  8. package/lib/pages/Markdown/components/MarkdownBreadcrumbs.js.map +0 -1
  9. package/lib/pages/Markdown/components/MarkdownCopyButton.d.ts +0 -10
  10. package/lib/pages/Markdown/components/MarkdownCopyButton.d.ts.map +0 -1
  11. package/lib/pages/Markdown/components/MarkdownCopyButton.js +0 -229
  12. package/lib/pages/Markdown/components/MarkdownCopyButton.js.map +0 -1
  13. package/lib/pages/Markdown/components/MarkdownHeader.d.ts +0 -13
  14. package/lib/pages/Markdown/components/MarkdownHeader.d.ts.map +0 -1
  15. package/lib/pages/Markdown/components/MarkdownNavigation.d.ts +0 -15
  16. package/lib/pages/Markdown/components/MarkdownNavigation.d.ts.map +0 -1
  17. package/lib/pages/Markdown/components/MarkdownNavigation.js +0 -38
  18. package/lib/pages/Markdown/components/MarkdownNavigation.js.map +0 -1
  19. package/lib/pages/Markdown/components/MarkdownPage.d.ts +0 -41
  20. package/lib/pages/Markdown/components/MarkdownPage.d.ts.map +0 -1
  21. package/lib/pages/Markdown/components/MarkdownPage.js +0 -238
  22. package/lib/pages/Markdown/components/MarkdownPage.js.map +0 -1
  23. package/lib/pages/Markdown/components/MarkdownTableOfContents.d.ts +0 -15
  24. package/lib/pages/Markdown/components/MarkdownTableOfContents.d.ts.map +0 -1
  25. package/lib/pages/Markdown/components/MarkdownTableOfContents.js +0 -57
  26. package/lib/pages/Markdown/components/MarkdownTableOfContents.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPageWithParams.d.ts","sourceRoot":"","sources":["../../../src/pages/Markdown/MarkdownPageWithParams.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EA+D1C,CAAC"}
1
+ {"version":3,"file":"MarkdownPageWithParams.d.ts","sourceRoot":"","sources":["../../../src/pages/Markdown/MarkdownPageWithParams.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AASnD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EA+D1C,CAAC"}
@@ -1,4 +1,4 @@
1
- import {jsx}from'react/jsx-runtime';import {useState,useEffect}from'react';import {useParams}from'@remix-run/react';import {MarkdownPage}from'./components/MarkdownPage.js';import {getCategoryById,loadArticleContent}from'../../utils/markdownLoader.js';/**
1
+ import {jsx}from'react/jsx-runtime';import {useState,useEffect}from'react';import {useParams}from'@remix-run/react';import {MarkdownPage}from'@admin-layout/tailwind-ui/components/Markdown/MarkdownPage.js';import {getCategoryById,loadArticleContent}from'../../utils/markdownLoader.js';/**
2
2
  * Wrapper component that uses Remix useParams to automatically load article data.
3
3
  * This maintains backward compatibility with the existing routing structure.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPageWithParams.js","sources":["../../../src/pages/Markdown/MarkdownPageWithParams.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"2PAKA;;;;;AAKG;AACI,MAAM,sBAAsB,GAAa,MAAK;QAC3C;IACN,UAAe;IACf;MACM,SAAa,EAAA;QAEV,CAAA,QAAI,EAAE,WAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;QACX,CAAI,gBAAa,EAAC,mBAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;AACd,EAAA,MAAA,CAAA,YAAiB,EAAA,eAAQ,CAAA,GAAM,QAAA,CAAA,IAAA,CAAA;AAC3B,EAAA,SAAA,CAAA,MAAA;mBACW,EAAA;uBAEsC,GAAA,YAAA;yBAC7C,GAAA,MAAc,kBAAA,CAAA,WAAA,CAAA;AACd,QAAA,WAAA,CAAA,WAAc,CAAA;AACd;AACA,QAAA,IAAA,WAAA,EAAA;AAEA,UAAA,MAAA,QAAI,GAAY,eAAM,CAAC,WAAA,CAAA,UAAA,IAAA,UAAA,IAAA,EAAA,CAAA;gCACb,WAAuB,EAAA,QAAA;AAC7B,UAAA,MAAA,YAAA,GAAA,gBAAoB,CAAA,SAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,KAAA,WAAA,CAAA,IAAA,CAAA;AAChB,UAAA,IAAA,YAAA,GAAA,CAAA,EAAA;yCACe,CAAA,YAAA,GAAA,CAAA,CAAA;+BACV,CAAA;AACR,cAAA,UAAA,EAAC,WAAC,CAAA,UAAA,IAAA,UAAA,IAAA,EAAA;oBACP,IAAC,CAAA,IAAA;yBAAM,CAAC;;;AAIR,YAAA,mBAAgB,CAAA,IAAA,CAAA;;AAEZ,UAAA,IAAA,YAAA,IAAA,CAAA,IAAA,YAAgB,GAAA,gBAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACZ,YAAA,MAAA,IAAA,GAAA,gBAAuB,CAAA;4BACvB;qCACW,CAAA,UAAM,IAAA,UAAA,IAAA,EAAA;AACpB,cAAA,IAAA,EAAA,IAAA,CAAA,IAAE;qBACN,IAAA,CAAA;;;2BAEA,CAAA,IAAA,CAAA;;AAET;AACA,OAAA;iBACH,EAAA;AACL;KAEM,CAAA,WAAA,YAAmB,CAAC,CAAC;AAE3B,EAAA,MAAA,QACK,GAAA,QAAA,GACG,eAAiB,CAAA,QACP,CAAA,wBACV,IAAA,EAAA,CAAA,GAAa,IAAE;AAY3B,EAAE,OAAAA,GAAA,CAAA,YAAA,EAAA;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"MarkdownPageWithParams.js","sources":["../../../src/pages/Markdown/MarkdownPageWithParams.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"4RASA;;;;;AAKG;AACI,MAAM,sBAAsB,GAAa,MAAK;QAC3C;IACN,UAAe;IACf;MACM,SAAa,EAAA;QAEV,CAAA,QAAI,EAAE,WAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;QACX,CAAI,gBAAa,EAAC,mBAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;AACd,EAAA,MAAA,CAAA,YAAiB,EAAA,eAAQ,CAAA,GAAM,QAAA,CAAA,IAAA,CAAA;AAC3B,EAAA,SAAA,CAAA,MAAA;mBACW,EAAA;uBAEsC,GAAA,YAAA;yBAC7C,GAAA,MAAc,kBAAA,CAAA,WAAA,CAAA;AACd,QAAA,WAAA,CAAA,WAAc,CAAA;AACd;AACA,QAAA,IAAA,WAAA,EAAA;AAEA,UAAA,MAAA,QAAI,GAAY,eAAM,CAAC,WAAA,CAAA,UAAA,IAAA,UAAA,IAAA,EAAA,CAAA;gCACb,WAAuB,EAAA,QAAA;AAC7B,UAAA,MAAA,YAAA,GAAA,gBAAoB,CAAA,SAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,KAAA,WAAA,CAAA,IAAA,CAAA;AAChB,UAAA,IAAA,YAAA,GAAA,CAAA,EAAA;yCACe,CAAA,YAAA,GAAA,CAAA,CAAA;+BACV,CAAA;AACR,cAAA,UAAA,EAAC,WAAC,CAAA,UAAA,IAAA,UAAA,IAAA,EAAA;oBACP,IAAC,CAAA,IAAA;yBAAM,CAAC;;;AAIR,YAAA,mBAAgB,CAAA,IAAA,CAAA;;AAEZ,UAAA,IAAA,YAAA,IAAA,CAAA,IAAA,YAAgB,GAAA,gBAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACZ,YAAA,MAAA,IAAA,GAAA,gBAAuB,CAAA;4BACvB;qCACW,CAAA,UAAM,IAAA,UAAA,IAAA,EAAA;AACpB,cAAA,IAAA,EAAA,IAAA,CAAA,IAAE;qBACN,IAAA,CAAA;;;2BAEA,CAAA,IAAA,CAAA;;AAET;AACA,OAAA;iBACH,EAAA;AACL;KAEM,CAAA,WAAA,YAAmB,CAAC,CAAC;AAE3B,EAAA,MAAA,QACK,GAAA,QAAA,GACG,eAAiB,CAAA,QACP,CAAA,wBACV,IAAA,EAAA,CAAA,GAAa,IAAE;AAY3B,EAAE,OAAAA,GAAA,CAAA,YAAA,EAAA;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-help-browser",
3
- "version": "12.0.16-alpha.18",
3
+ "version": "12.0.16-alpha.19",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "Yantra App",
@@ -21,7 +21,7 @@
21
21
  "watch": "yarn build:lib:watch"
22
22
  },
23
23
  "dependencies": {
24
- "@admin-layout/tailwind-ui": "12.2.4-alpha.12",
24
+ "@admin-layout/tailwind-ui": "12.2.4-alpha.17",
25
25
  "@pubngo-stack/icons": "8.0.7",
26
26
  "@react-icons/all-files": "^4.1.0",
27
27
  "marked": "7.0.5",
@@ -70,5 +70,5 @@
70
70
  "typescript": {
71
71
  "definition": "lib/index.d.ts"
72
72
  },
73
- "gitHead": "5c09c881e4b35aed954383b1e1e84f5c3fad704d"
73
+ "gitHead": "dbb5bb83ac287af095083711fca9a09bf1d7fd02"
74
74
  }
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- interface MarkdownBreadcrumbsProps {
3
- categoryId: string;
4
- categoryTitle?: string;
5
- markdownTitle: string;
6
- className?: string;
7
- getHelpCenterLink: () => string;
8
- getCategoryLink: (categoryId: string) => string;
9
- helpCenterLabel: string;
10
- }
11
- export declare const MarkdownBreadcrumbs: React.FC<MarkdownBreadcrumbsProps>;
12
- export {};
13
- //# sourceMappingURL=MarkdownBreadcrumbs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownBreadcrumbs.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownBreadcrumbs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,wBAAwB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAwBlE,CAAC"}
@@ -1,34 +0,0 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const MarkdownBreadcrumbs = ({
2
- categoryId,
3
- categoryTitle,
4
- markdownTitle,
5
- className,
6
- getHelpCenterLink,
7
- getCategoryLink,
8
- helpCenterLabel
9
- }) => {
10
- return jsx("div", {
11
- className: cn('w-full max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16', className),
12
- children: jsxs("nav", {
13
- className: "flex items-center space-x-2 text-sm text-muted-foreground",
14
- children: [jsx(Link, {
15
- to: getHelpCenterLink(),
16
- className: "hover:text-foreground transition-colors",
17
- children: helpCenterLabel
18
- }), jsx("span", {
19
- className: "text-muted-foreground/60",
20
- children: "\u203A"
21
- }), jsx(Link, {
22
- to: getCategoryLink(categoryId),
23
- className: "hover:text-foreground transition-colors",
24
- children: categoryTitle || categoryId
25
- }), jsx("span", {
26
- className: "text-muted-foreground/60",
27
- children: "\u203A"
28
- }), jsx("span", {
29
- className: "text-primary",
30
- children: markdownTitle
31
- })]
32
- })
33
- });
34
- };export{MarkdownBreadcrumbs};//# sourceMappingURL=MarkdownBreadcrumbs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownBreadcrumbs.js","sources":["../../../../src/pages/Markdown/components/MarkdownBreadcrumbs.tsx"],"sourcesContent":[null],"names":[],"mappings":"4HAca,mBAAmB,GAAuC,CAAC;AASpE,EAAA,UACI;AAcR,EAAE,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- interface MarkdownCopyButtonProps {
3
- markdownTitle: string;
4
- markdownContent: string;
5
- markdownUrl?: string;
6
- className?: string;
7
- }
8
- export declare const MarkdownCopyButton: React.FC<MarkdownCopyButtonProps>;
9
- export {};
10
- //# sourceMappingURL=MarkdownCopyButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownCopyButton.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownCopyButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,UAAU,uBAAuB;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAsQhE,CAAC"}
@@ -1,229 +0,0 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {cn}from'../../../utils/index.js';const MarkdownCopyButton = ({
2
- markdownTitle,
3
- markdownContent,
4
- markdownUrl,
5
- className
6
- }) => {
7
- const [isOpen, setIsOpen] = useState(false);
8
- const [copySuccess, setCopySuccess] = useState(false);
9
- const dropdownRef = useRef(null);
10
- // Close dropdown when clicking outside
11
- useEffect(() => {
12
- const handleClickOutside = event => {
13
- if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
14
- setIsOpen(false);
15
- }
16
- };
17
- if (isOpen) {
18
- document.addEventListener('mousedown', handleClickOutside);
19
- }
20
- return () => {
21
- document.removeEventListener('mousedown', handleClickOutside);
22
- };
23
- }, [isOpen]);
24
- // Convert HTML to Markdown (simplified version)
25
- const htmlToMarkdown = html => {
26
- // Remove script and style tags
27
- let text = html.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, '');
28
- text = text.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, '');
29
- // Convert headings
30
- text = text.replace(/<h([1-6])[^>]*>(.*?)<\/h\1>/gi, (match, level, content) => {
31
- const hashes = '#'.repeat(parseInt(level));
32
- return `\n${hashes} ${content.trim()}\n`;
33
- });
34
- // Convert bold
35
- text = text.replace(/<strong[^>]*>(.*?)<\/strong>/gi, '**$1**');
36
- text = text.replace(/<b[^>]*>(.*?)<\/b>/gi, '**$1**');
37
- // Convert italic
38
- text = text.replace(/<em[^>]*>(.*?)<\/em>/gi, '*$1*');
39
- text = text.replace(/<i[^>]*>(.*?)<\/i>/gi, '*$1*');
40
- // Convert links
41
- text = text.replace(/<a[^>]*href=["']([^"']*)["'][^>]*>(.*?)<\/a>/gi, '[$2]($1)');
42
- // Convert code blocks
43
- text = text.replace(/<pre[^>]*><code[^>]*>(.*?)<\/code><\/pre>/gis, '```\n$1\n```');
44
- text = text.replace(/<code[^>]*>(.*?)<\/code>/gi, '`$1`');
45
- // Convert lists
46
- text = text.replace(/<ul[^>]*>(.*?)<\/ul>/gis, (match, content) => {
47
- const items = content.match(/<li[^>]*>(.*?)<\/li>/gis) || [];
48
- return '\n' + items.map(item => {
49
- const cleanItem = item.replace(/<li[^>]*>|<\/li>/gi, '').trim();
50
- return `- ${cleanItem}`;
51
- }).join('\n') + '\n';
52
- });
53
- text = text.replace(/<ol[^>]*>(.*?)<\/ol>/gis, (match, content) => {
54
- const items = content.match(/<li[^>]*>(.*?)<\/li>/gis) || [];
55
- return '\n' + items.map((item, index) => {
56
- const cleanItem = item.replace(/<li[^>]*>|<\/li>/gi, '').trim();
57
- return `${index + 1}. ${cleanItem}`;
58
- }).join('\n') + '\n';
59
- });
60
- // Convert paragraphs
61
- text = text.replace(/<p[^>]*>(.*?)<\/p>/gi, '$1\n\n');
62
- // Remove remaining HTML tags
63
- text = text.replace(/<[^>]+>/g, '');
64
- // Decode HTML entities
65
- const textarea = document.createElement('textarea');
66
- textarea.innerHTML = text;
67
- text = textarea.value;
68
- // Clean up extra whitespace
69
- text = text.replace(/\n{3,}/g, '\n\n').trim();
70
- return `# ${markdownTitle}\n\n${text}`;
71
- };
72
- const handleCopyMarkdown = async () => {
73
- try {
74
- const markdown = htmlToMarkdown(markdownContent);
75
- await navigator.clipboard.writeText(markdown);
76
- setCopySuccess(true);
77
- setIsOpen(false);
78
- setTimeout(() => setCopySuccess(false), 2000);
79
- } catch (err) {
80
- console.error('Failed to copy:', err);
81
- }
82
- };
83
- const handleOpenChatGPT = () => {
84
- const url = `https://chat.openai.com/?q=${encodeURIComponent(markdownTitle)}`;
85
- window.open(url, '_blank');
86
- setIsOpen(false);
87
- };
88
- const handleOpenClaude = () => {
89
- const url = `https://claude.ai/?q=${encodeURIComponent(markdownTitle)}`;
90
- window.open(url, '_blank');
91
- setIsOpen(false);
92
- };
93
- return jsxs("div", {
94
- className: cn('relative inline-flex items-center rounded-md border border-border bg-background', className),
95
- ref: dropdownRef,
96
- children: [jsxs("div", {
97
- className: "flex items-center overflow-hidden rounded-md",
98
- children: [jsxs("button", {
99
- onClick: handleCopyMarkdown,
100
- className: cn('flex items-center gap-2 px-3 py-1.5', 'bg-background hover:bg-muted/50 transition-colors', 'text-sm text-foreground', 'border-0'),
101
- children: [jsx("svg", {
102
- className: "w-4 h-4",
103
- fill: "none",
104
- stroke: "currentColor",
105
- viewBox: "0 0 24 24",
106
- xmlns: "http://www.w3.org/2000/svg",
107
- children: jsx("path", {
108
- strokeLinecap: "round",
109
- strokeLinejoin: "round",
110
- strokeWidth: 2,
111
- d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
112
- })
113
- }), jsx("span", {
114
- children: copySuccess ? 'Copied' : 'Copy page'
115
- })]
116
- }), jsx("div", {
117
- className: "h-5 w-px bg-border"
118
- }), jsx("button", {
119
- onClick: e => {
120
- e.stopPropagation();
121
- setIsOpen(!isOpen);
122
- },
123
- className: cn('flex items-center justify-center px-2 py-1.5', 'bg-background hover:bg-muted/50 transition-colors', 'text-sm text-foreground', 'border-0'),
124
- children: jsx("svg", {
125
- className: cn('w-3 h-3 transition-transform', isOpen && 'rotate-180'),
126
- fill: "none",
127
- stroke: "currentColor",
128
- viewBox: "0 0 24 24",
129
- children: jsx("path", {
130
- strokeLinecap: "round",
131
- strokeLinejoin: "round",
132
- strokeWidth: 2,
133
- d: "M19 9l-7 7-7-7"
134
- })
135
- })
136
- })]
137
- }), isOpen && jsx("div", {
138
- className: "absolute right-0 top-full mt-2 w-64 bg-background border border-border rounded-lg shadow-lg z-[100] overflow-hidden",
139
- children: jsxs("div", {
140
- className: "py-1",
141
- children: [jsxs("button", {
142
- onClick: handleCopyMarkdown,
143
- className: "w-full px-4 py-3 text-left hover:bg-muted/50 transition-colors flex items-start gap-3 group",
144
- children: [jsx("svg", {
145
- className: "w-5 h-5 text-muted-foreground group-hover:text-foreground mt-0.5 flex-shrink-0",
146
- fill: "none",
147
- stroke: "currentColor",
148
- viewBox: "0 0 24 24",
149
- children: jsx("path", {
150
- strokeLinecap: "round",
151
- strokeLinejoin: "round",
152
- strokeWidth: 2,
153
- d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
154
- })
155
- }), jsxs("div", {
156
- className: "flex-1 min-w-0",
157
- children: [jsx("div", {
158
- className: "text-sm font-medium text-foreground",
159
- children: "Copy page"
160
- }), jsx("div", {
161
- className: "text-xs text-muted-foreground mt-0.5",
162
- children: "Copy page as Markdown for LLMs"
163
- })]
164
- })]
165
- }), jsxs("button", {
166
- onClick: handleOpenChatGPT,
167
- className: "w-full px-4 py-3 text-left hover:bg-muted/50 transition-colors flex items-start gap-3 group",
168
- children: [jsx("div", {
169
- className: "w-5 h-5 mt-0.5 flex-shrink-0 flex items-center justify-center",
170
- children: jsx("span", {
171
- className: "text-lg",
172
- children: "\uD83E\uDD16"
173
- })
174
- }), jsxs("div", {
175
- className: "flex-1 min-w-0",
176
- children: [jsx("div", {
177
- className: "text-sm font-medium text-foreground",
178
- children: "Open in ChatGPT"
179
- }), jsx("div", {
180
- className: "text-xs text-muted-foreground mt-0.5",
181
- children: "Ask questions about this page"
182
- })]
183
- }), jsx("svg", {
184
- className: "w-4 h-4 text-muted-foreground group-hover:text-foreground mt-1 flex-shrink-0",
185
- fill: "none",
186
- stroke: "currentColor",
187
- viewBox: "0 0 24 24",
188
- children: jsx("path", {
189
- strokeLinecap: "round",
190
- strokeLinejoin: "round",
191
- strokeWidth: 2,
192
- d: "M9 5l7 7-7 7"
193
- })
194
- })]
195
- }), jsxs("button", {
196
- onClick: handleOpenClaude,
197
- className: "w-full px-4 py-3 text-left hover:bg-muted/50 transition-colors flex items-start gap-3 group",
198
- children: [jsx("div", {
199
- className: "w-5 h-5 mt-0.5 flex-shrink-0 flex items-center justify-center",
200
- children: jsx("span", {
201
- className: "text-lg",
202
- children: "\u2744\uFE0F"
203
- })
204
- }), jsxs("div", {
205
- className: "flex-1 min-w-0",
206
- children: [jsx("div", {
207
- className: "text-sm font-medium text-foreground",
208
- children: "Open in Claude"
209
- }), jsx("div", {
210
- className: "text-xs text-muted-foreground mt-0.5",
211
- children: "Ask questions about this page"
212
- })]
213
- }), jsx("svg", {
214
- className: "w-4 h-4 text-muted-foreground group-hover:text-foreground mt-1 flex-shrink-0",
215
- fill: "none",
216
- stroke: "currentColor",
217
- viewBox: "0 0 24 24",
218
- children: jsx("path", {
219
- strokeLinecap: "round",
220
- strokeLinejoin: "round",
221
- strokeWidth: 2,
222
- d: "M9 5l7 7-7 7"
223
- })
224
- })]
225
- })]
226
- })
227
- })]
228
- });
229
- };export{MarkdownCopyButton};//# sourceMappingURL=MarkdownCopyButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownCopyButton.js","sources":["../../../../src/pages/Markdown/components/MarkdownCopyButton.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- interface MarkdownHeaderProps {
3
- categoryTitle?: string;
4
- title: string;
5
- description?: string;
6
- author?: string;
7
- updatedAt?: string;
8
- markdownContent: string;
9
- className?: string;
10
- }
11
- export declare const MarkdownHeader: React.FC<MarkdownHeaderProps>;
12
- export {};
13
- //# sourceMappingURL=MarkdownHeader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownHeader.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,mBAAmB;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAmDxD,CAAC"}
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- interface Markdown {
3
- categoryId: string;
4
- slug: string;
5
- title: string;
6
- }
7
- interface MarkdownNavigationProps {
8
- previousMarkdown?: Markdown | null;
9
- nextMarkdown?: Markdown | null;
10
- className?: string;
11
- getMarkdownLink: (categoryId: string, slug: string) => string;
12
- }
13
- export declare const MarkdownNavigation: React.FC<MarkdownNavigationProps>;
14
- export {};
15
- //# sourceMappingURL=MarkdownNavigation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownNavigation.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownNavigation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,QAAQ;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,uBAAuB;IAC7B,gBAAgB,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjE;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA+ChE,CAAC"}
@@ -1,38 +0,0 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const MarkdownNavigation = ({
2
- previousMarkdown,
3
- nextMarkdown,
4
- className,
5
- getMarkdownLink
6
- }) => {
7
- if (!previousMarkdown && !nextMarkdown) {
8
- return null;
9
- }
10
- return jsxs("div", {
11
- className: cn('mt-16 pt-8 border-t border-border grid grid-cols-1 md:grid-cols-2 gap-6', className),
12
- children: [previousMarkdown ? jsxs(Link, {
13
- to: getMarkdownLink(previousMarkdown.categoryId, previousMarkdown.slug),
14
- className: cn('group rounded-lg border border-border bg-background px-6 py-5', 'hover:bg-muted/30 transition-colors'),
15
- children: [jsx("div", {
16
- className: "text-sm text-muted-foreground mb-1",
17
- children: "Previous"
18
- }), jsxs("div", {
19
- className: "text-primary font-semibold group-hover:underline text-base",
20
- children: ["\u00AB ", previousMarkdown.title]
21
- })]
22
- }) : jsx("div", {
23
- className: "hidden md:block"
24
- }), nextMarkdown ? jsxs(Link, {
25
- to: getMarkdownLink(nextMarkdown.categoryId, nextMarkdown.slug),
26
- className: cn('group rounded-lg border border-border bg-background px-6 py-5', 'hover:bg-muted/30 transition-colors md:text-right'),
27
- children: [jsx("div", {
28
- className: "text-sm text-muted-foreground mb-1",
29
- children: "Next"
30
- }), jsxs("div", {
31
- className: "text-primary font-semibold group-hover:underline text-base",
32
- children: [nextMarkdown.title, " \u00BB"]
33
- })]
34
- }) : jsx("div", {
35
- className: "hidden md:block"
36
- })]
37
- });
38
- };export{MarkdownNavigation};//# sourceMappingURL=MarkdownNavigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownNavigation.js","sources":["../../../../src/pages/Markdown/components/MarkdownNavigation.tsx"],"sourcesContent":[null],"names":[],"mappings":"sHAiBO,MAAM,kBAAkB,GAAsC,CAAC;AAMlE,EAAA,gBAAqB;AACjB,EAAA,YAAA;WACH;AAED,EAAA;AAqCJ,CAAC,KAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,41 +0,0 @@
1
- import React from 'react';
2
- export interface Heading {
3
- id: string;
4
- text: string;
5
- level: number;
6
- }
7
- export interface Markdown {
8
- id: string;
9
- title: string;
10
- description: string;
11
- slug: string;
12
- author: string;
13
- updatedAt: string;
14
- categoryId: string;
15
- content: string;
16
- htmlContent: string;
17
- headings: Heading[];
18
- }
19
- export interface NavigationItem {
20
- categoryId: string;
21
- slug: string;
22
- title: string;
23
- }
24
- interface MarkdownPageProps {
25
- article?: Markdown | null;
26
- categoryId?: string;
27
- categoryTitle?: string;
28
- articleSlug?: string;
29
- loadArticle?: (slug: string) => Promise<Markdown | null>;
30
- previousMarkdown?: NavigationItem | null;
31
- nextMarkdown?: NavigationItem | null;
32
- getMarkdownLink: (categoryId: string, slug: string) => string;
33
- getCategoryLink: (categoryId: string) => string;
34
- getHelpCenterLink: () => string;
35
- helpCenterLabel: string;
36
- backToHelpCenterLabel?: string;
37
- className?: string;
38
- }
39
- export declare const MarkdownPage: React.FC<MarkdownPageProps>;
40
- export {};
41
- //# sourceMappingURL=MarkdownPage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownPage.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAS3D,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,iBAAiB;IACvB,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwQpD,CAAC"}
@@ -1,238 +0,0 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';import {MarkdownTableOfContents}from'./MarkdownTableOfContents.js';import {MarkdownNavigation}from'./MarkdownNavigation.js';import {MarkdownBreadcrumbs}from'./MarkdownBreadcrumbs.js';import {MarkdownCopyButton}from'./MarkdownCopyButton.js';const MarkdownPage = ({
2
- article: articleProp,
3
- categoryId: categoryIdProp,
4
- categoryTitle: categoryTitleProp,
5
- articleSlug,
6
- loadArticle,
7
- previousMarkdown: previousMarkdownProp,
8
- nextMarkdown: nextMarkdownProp,
9
- getMarkdownLink,
10
- getCategoryLink,
11
- getHelpCenterLink,
12
- helpCenterLabel,
13
- backToHelpCenterLabel,
14
- className
15
- }) => {
16
- const [article, setArticle] = useState(articleProp || null);
17
- const [loading, setLoading] = useState(!articleProp && !!articleSlug);
18
- const [activeHeadingId, setActiveHeadingId] = useState('');
19
- const observerRef = useRef(null);
20
- const isScrollingRef = useRef(false);
21
- const scrollTimeoutRef = useRef(null);
22
- useEffect(() => {
23
- if (articleProp) {
24
- setArticle(articleProp);
25
- setLoading(false);
26
- } else if (articleSlug && loadArticle) {
27
- const loadContent = async () => {
28
- const articleData = await loadArticle(articleSlug);
29
- setArticle(articleData);
30
- setLoading(false);
31
- };
32
- loadContent();
33
- } else if (!articleProp && !articleSlug) {
34
- setLoading(false);
35
- }
36
- }, [articleProp, articleSlug, loadArticle]);
37
- // Scroll spy functionality
38
- useEffect(() => {
39
- if (!article?.headings || article.headings.length === 0) return;
40
- // Clean up previous observer
41
- if (observerRef.current) {
42
- observerRef.current.disconnect();
43
- }
44
- // Create new intersection observer
45
- observerRef.current = new IntersectionObserver(entries => {
46
- // Don't update if we're programmatically scrolling
47
- if (isScrollingRef.current) return;
48
- // Find the heading that's most visible in the viewport
49
- const visibleEntries = entries.filter(entry => entry.isIntersecting);
50
- if (visibleEntries.length === 0) return;
51
- // Find the heading that's closest to the top of the viewport (within the top 30%)
52
- // Prioritize headings that are in the upper portion of the viewport
53
- let bestEntry = visibleEntries[0];
54
- let bestScore = Infinity;
55
- visibleEntries.forEach(entry => {
56
- const rect = entry.boundingClientRect;
57
- const viewportHeight = window.innerHeight;
58
- const top30Percent = viewportHeight * 0.3;
59
- // Calculate a score: lower is better
60
- // Headings in the top 30% of viewport get priority
61
- let score;
62
- if (rect.top >= 0 && rect.top <= top30Percent) {
63
- // Heading is in the top 30% - prioritize by distance from top
64
- score = rect.top;
65
- } else if (rect.top >= 0) {
66
- // Heading is below top 30% but visible - lower priority
67
- score = 1000 + rect.top;
68
- } else {
69
- // Heading is above viewport - lowest priority unless it's the only one
70
- score = 2000 + Math.abs(rect.top);
71
- }
72
- if (score < bestScore) {
73
- bestScore = score;
74
- bestEntry = entry;
75
- }
76
- });
77
- setActiveHeadingId(bestEntry.target.id);
78
- }, {
79
- rootMargin: '-10% 0px -70% 0px',
80
- threshold: [0, 0.1, 0.5, 1]
81
- });
82
- // Observe all headings
83
- article.headings.forEach(heading => {
84
- const element = document.getElementById(heading.id);
85
- if (element && observerRef.current) {
86
- observerRef.current.observe(element);
87
- }
88
- });
89
- // Cleanup function
90
- return () => {
91
- if (observerRef.current) {
92
- observerRef.current.disconnect();
93
- }
94
- if (scrollTimeoutRef.current) {
95
- clearTimeout(scrollTimeoutRef.current);
96
- }
97
- };
98
- }, [article]);
99
- if (loading) {
100
- return jsx("div", {
101
- className: "min-h-screen bg-background text-foreground overflow-x-hidden",
102
- children: jsx("div", {
103
- className: "w-full max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 py-16",
104
- children: jsxs("div", {
105
- className: "animate-pulse",
106
- children: [jsx("div", {
107
- className: "h-8 bg-muted rounded w-1/3 mb-4"
108
- }), jsx("div", {
109
- className: "h-4 bg-muted rounded w-1/2 mb-8"
110
- }), jsxs("div", {
111
- className: "space-y-4",
112
- children: [jsx("div", {
113
- className: "h-4 bg-muted rounded"
114
- }), jsx("div", {
115
- className: "h-4 bg-muted rounded w-5/6"
116
- }), jsx("div", {
117
- className: "h-4 bg-muted rounded w-4/6"
118
- })]
119
- })]
120
- })
121
- })
122
- });
123
- }
124
- if (!article) {
125
- return jsx("div", {
126
- className: "min-h-screen bg-background text-foreground mt-20 overflow-x-hidden",
127
- children: jsxs("div", {
128
- className: "w-full max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 py-16",
129
- children: [jsx("h1", {
130
- className: "text-2xl font-bold",
131
- children: "Article not found"
132
- }), jsx(Link, {
133
- to: getHelpCenterLink(),
134
- className: "mt-4 text-primary hover:text-primary/80",
135
- children: backToHelpCenterLabel || `← Back to ${helpCenterLabel}`
136
- })]
137
- })
138
- });
139
- }
140
- // Use previous/next articles from props
141
- const previousMarkdown = previousMarkdownProp;
142
- const nextMarkdown = nextMarkdownProp;
143
- return jsx("div", {
144
- className: cn('min-h-screen bg-background text-foreground scroll-smooth overflow-x-hidden', className),
145
- children: jsxs("div", {
146
- className: "flex w-full justify-center gap-10",
147
- children: [jsxs("div", {
148
- className: "flex-1 max-w-3xl w-full",
149
- children: [jsxs("div", {
150
- className: "flex items-center justify-between",
151
- children: [jsx(MarkdownBreadcrumbs, {
152
- categoryId: article.categoryId || categoryIdProp || '',
153
- categoryTitle: categoryTitleProp,
154
- markdownTitle: article.title,
155
- className: "pb-4",
156
- getHelpCenterLink: getHelpCenterLink,
157
- getCategoryLink: getCategoryLink,
158
- helpCenterLabel: helpCenterLabel
159
- }), jsx(MarkdownCopyButton, {
160
- markdownTitle: article.title,
161
- markdownContent: article.htmlContent,
162
- className: "flex-shrink-0"
163
- })]
164
- }), jsx("main", {
165
- className: "w-full py-2",
166
- children: jsx("div", {
167
- className: "max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 relative",
168
- children: jsx("div", {
169
- className: "flex flex-col xl:flex-row gap-12 xl:gap-16 align-start",
170
- children: jsxs("div", {
171
- className: "flex-1 min-w-0 max-w-5xl",
172
- children: [jsx("div", {
173
- className: "prose prose-lg max-w-none w-full overflow-x-hidden",
174
- children: jsx("div", {
175
- className: cn(
176
- // Base prose styles
177
- 'prose-headings:font-semibold prose-headings:text-foreground prose-headings:tracking-tight',
178
- // Body H1 styles (within article) - slightly smaller than page title
179
- 'prose-h1:text-[1.5rem] prose-h1:md:text-[1.75rem] prose-h1:mb-4 prose-h1:mt-5 prose-h1:leading-tight',
180
- // H2 styles - strong section headings
181
- 'prose-h2:text-[1.2rem] prose-h2:md:text-[1.5rem] prose-h2:mb-4 prose-h2:mt-5 prose-h2:leading-tight',
182
- // H3 styles - sub section headings
183
- 'prose-h3:text-[1.05rem] prose-h3:md:text-[1.25rem] prose-h3:mb-3 prose-h3:mt-4 prose-h3:leading-snug',
184
- // H4 styles
185
- 'prose-h4:text-lg prose-h4:md:text-xl prose-h4:mb-3 prose-h4:mt-4',
186
- // Paragraph styles
187
- 'prose-p:text-[0.85rem] prose-p:md:text-[0.95rem] prose-p:text-muted-foreground prose-p:leading-relaxed prose-p:mb-5',
188
- // Strong text
189
- 'prose-strong:text-foreground prose-strong:font-semibold',
190
- // Links
191
- 'prose-a:text-primary prose-a:no-underline hover:prose-a:underline prose-a:font-medium',
192
- // Lists
193
- 'prose-ul:text-muted-foreground prose-ol:text-muted-foreground prose-li:text-muted-foreground prose-li:mb-2 prose-li:text-base prose-li:md:text-lg',
194
- // Blockquotes
195
- 'prose-blockquote:text-muted-foreground prose-blockquote:border-l-primary prose-blockquote:pl-4 prose-blockquote:my-6',
196
- // Code
197
- 'prose-code:text-foreground prose-code:bg-muted prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded prose-code:text-sm prose-code:font-mono',
198
- // Pre blocks
199
- 'prose-pre:bg-muted prose-pre:text-foreground prose-pre:overflow-x-auto prose-pre:rounded-lg prose-pre:p-4 prose-pre:my-6',
200
- // Images
201
- 'prose-img:rounded-lg prose-img:my-8',
202
- // Tables
203
- 'prose-table:text-muted-foreground prose-th:text-foreground prose-th:font-semibold',
204
- // Horizontal rules
205
- 'prose-hr:border-border prose-hr:my-8'),
206
- dangerouslySetInnerHTML: {
207
- __html: article.htmlContent
208
- }
209
- })
210
- }), jsx(MarkdownNavigation, {
211
- previousMarkdown: previousMarkdown,
212
- nextMarkdown: nextMarkdown,
213
- getMarkdownLink: getMarkdownLink
214
- })]
215
- })
216
- })
217
- })
218
- })]
219
- }), jsx(MarkdownTableOfContents, {
220
- headings: article.headings || [],
221
- activeHeadingId: activeHeadingId,
222
- onHeadingClick: headingId => {
223
- // Set scrolling flag to prevent observer from overriding
224
- isScrollingRef.current = true;
225
- setActiveHeadingId(headingId);
226
- // Clear any existing timeout
227
- if (scrollTimeoutRef.current) {
228
- clearTimeout(scrollTimeoutRef.current);
229
- }
230
- // Re-enable observer after scroll completes (smooth scroll takes ~500ms)
231
- scrollTimeoutRef.current = setTimeout(() => {
232
- isScrollingRef.current = false;
233
- }, 800);
234
- }
235
- })]
236
- })
237
- });
238
- };export{MarkdownPage};//# sourceMappingURL=MarkdownPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownPage.js","sources":["../../../../src/pages/Markdown/components/MarkdownPage.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- interface Heading {
3
- id: string;
4
- text: string;
5
- level: number;
6
- }
7
- interface MarkdownTableOfContentsProps {
8
- headings: Heading[];
9
- activeHeadingId: string;
10
- onHeadingClick?: (headingId: string) => void;
11
- className?: string;
12
- }
13
- export declare const MarkdownTableOfContents: React.FC<MarkdownTableOfContentsProps>;
14
- export {};
15
- //# sourceMappingURL=MarkdownTableOfContents.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownTableOfContents.d.ts","sourceRoot":"","sources":["../../../../src/pages/Markdown/components/MarkdownTableOfContents.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,OAAO;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,4BAA4B;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA6E1E,CAAC"}
@@ -1,57 +0,0 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const MarkdownTableOfContents = ({
2
- headings,
3
- activeHeadingId,
4
- onHeadingClick,
5
- className
6
- }) => {
7
- if (!headings || headings.length === 0) {
8
- return null;
9
- }
10
- const handleClick = headingId => {
11
- // Immediately set the active heading when clicked
12
- if (onHeadingClick) {
13
- onHeadingClick(headingId);
14
- }
15
- // Smooth scroll to the heading with proper offset
16
- const element = document.getElementById(headingId);
17
- if (element) {
18
- // Calculate the position with offset for header
19
- const elementPosition = element.getBoundingClientRect().top + window.pageYOffset;
20
- const offsetPosition = elementPosition - 100; // 100px offset from top
21
- window.scrollTo({
22
- top: offsetPosition,
23
- behavior: 'smooth'
24
- });
25
- }
26
- };
27
- return jsx("aside", {
28
- className: "hidden xl:block xl:w-80 xl:flex-shrink-0 max-w-[28rem]",
29
- children: jsxs("div", {
30
- className: "fixed flex flex-col h-[calc(100vh-3rem)] w-[19rem]",
31
- children: [jsx("div", {
32
- className: "mb-4 flex-shrink-0",
33
- children: jsxs("h2", {
34
- className: "text-sm font-semibold text-primary flex items-center",
35
- children: [jsx("span", {
36
- className: "mr-2",
37
- children: "\u2630"
38
- }), "On this page"]
39
- })
40
- }), jsx("nav", {
41
- className: "space-y-1 flex-1 overflow-y-auto overflow-x-hidden min-h-0",
42
- children: headings.map((heading, index) => {
43
- const isActive = activeHeadingId === heading.id;
44
- return jsx(Link, {
45
- to: `#${heading.id}`,
46
- onClick: e => {
47
- e.preventDefault();
48
- handleClick(heading.id);
49
- },
50
- className: cn('relative block text-sm transition-colors py-1 pl-4', 'border-l-2 border-transparent', isActive ? 'text-primary border-l-primary bg-muted/20' : 'text-muted-foreground hover:text-primary hover:border-l-primary', heading.level === 1 ? 'font-semibold' : heading.level === 2 ? 'ml-2' : heading.level === 3 ? 'ml-4' : heading.level === 4 ? 'ml-6' : heading.level === 5 ? 'ml-8' : 'ml-10'),
51
- children: heading.text
52
- }, index);
53
- })
54
- })]
55
- })
56
- });
57
- };export{MarkdownTableOfContents};//# sourceMappingURL=MarkdownTableOfContents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownTableOfContents.js","sources":["../../../../src/pages/Markdown/components/MarkdownTableOfContents.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"sHAiBO,MAAM,uBAAuB,GAA2C,CAAC;;AAOxE,EAAA;gBACH;AAED,EAAA;;eAEQ,IAAA,SAAgB,MAAC,KAAA,CAAA,EAAA;eACH;;QAGlB,WAAkD,GAAA,SAAA,IAAA;;QAElD,cAAc,EAAA;oBACsC,CAAA,SAAA,CAAA;AAChD;AACA;iBAEM,WAAU,CAAA,cAAA,CAAA,SAAA,CAAA;AACZ,IAAA,IAAA,OAAA,EAAA;AACA;AACH,MAAA,MAAA,eAAE,GAAA,OAAA,CAAA,qBAAA,EAAA,CAAA,GAAA,GAAA,MAAA,CAAA,WAAA;YACN,cAAA,GAAA,eAAA,GAAA,GAAA,CAAA;AACL,MAAE,MAAA,CAAA,QAAA,CAAA;AAEF,QAAA,GAAO,EACI,cAAA;AAUS,QAAA,QAAA,EAAA;AACA,OAAA,CAAA;;AAMY,GAAA;;AAMI,IAAA,SAAA,EAAA,wDAA6C;AAC7C,IAAA,QAAA,EAAAA,IAAA,CAAA,KAAA,EAAA;AAEA,MAAA,SAAA,EAAA,oDAAiB;AACjB,MAAA,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA;AACE,QAAA,SAAA,EAAA,oBAAQ;AACR,QAAA,QAAA,EAAAD,IAAA,CAAA,IAAA,EAAA;AACE,UAAA,SAAA,EAAA,sDAAQ;AACR,UAAA,QAAA,EAAA,CAAAC,GAAA,CAAA,MAAA,EAAA;AACE,YAAA,SAAA,EAAA,MAAA;AACA,YAAA,QAAA,EAAA;AACE,WAAA,CAAA,EAAA,cAAA;;AAO5B,OAAA,CAAA,EAAAA,GAAA,CAAA,KAAA,EAAE;AAKtB,QAAE,SAAA,EAAA,4DAAA;;;;;;;;;;;;;;;;"}