@adminide-stack/yantra-help-browser 12.0.16-alpha.15 → 12.0.16-alpha.17

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 (29) hide show
  1. package/lib/components/Logo.d.ts.map +1 -1
  2. package/lib/components/Logo.js +3 -2
  3. package/lib/components/Logo.js.map +1 -1
  4. package/lib/components/navbar/index.d.ts.map +1 -1
  5. package/lib/components/navbar/index.js +5 -4
  6. package/lib/components/navbar/index.js.map +1 -1
  7. package/lib/pages/ArticlePage/ArticlePage.d.ts.map +1 -1
  8. package/lib/pages/ArticlePage/ArticlePage.js +116 -117
  9. package/lib/pages/ArticlePage/ArticlePage.js.map +1 -1
  10. package/lib/pages/ArticlePage/ArticlePageLayout.js +1 -1
  11. package/lib/pages/ArticlePage/components/ArticleBreadcrumbs.d.ts +10 -0
  12. package/lib/pages/ArticlePage/components/ArticleBreadcrumbs.d.ts.map +1 -0
  13. package/lib/pages/ArticlePage/components/ArticleBreadcrumbs.js +31 -0
  14. package/lib/pages/ArticlePage/components/ArticleBreadcrumbs.js.map +1 -0
  15. package/lib/pages/ArticlePage/components/ArticleHeader.d.ts +13 -0
  16. package/lib/pages/ArticlePage/components/ArticleHeader.d.ts.map +1 -0
  17. package/lib/pages/ArticlePage/components/ArticleNavigation.d.ts +14 -0
  18. package/lib/pages/ArticlePage/components/ArticleNavigation.d.ts.map +1 -0
  19. package/lib/pages/ArticlePage/components/ArticleNavigation.js +37 -0
  20. package/lib/pages/ArticlePage/components/ArticleNavigation.js.map +1 -0
  21. package/lib/pages/ArticlePage/components/CopyPageButton.d.ts +10 -0
  22. package/lib/pages/ArticlePage/components/CopyPageButton.d.ts.map +1 -0
  23. package/lib/pages/ArticlePage/components/CopyPageButton.js +229 -0
  24. package/lib/pages/ArticlePage/components/CopyPageButton.js.map +1 -0
  25. package/lib/pages/ArticlePage/components/TableOfContents.d.ts +15 -0
  26. package/lib/pages/ArticlePage/components/TableOfContents.d.ts.map +1 -0
  27. package/lib/pages/ArticlePage/components/TableOfContents.js +57 -0
  28. package/lib/pages/ArticlePage/components/TableOfContents.js.map +1 -0
  29. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Logo.d.ts","sourceRoot":"","sources":["../../src/components/Logo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,6DAA6D,CAAC;AAEzF,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAoIrC,CAAC"}
1
+ {"version":3,"file":"Logo.d.ts","sourceRoot":"","sources":["../../src/components/Logo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,6DAA6D,CAAC;AAGzF,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAqIrC,CAAC"}
@@ -1,11 +1,12 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';const Logo = props => {
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useParams}from'@remix-run/react';const Logo = props => {
2
+ const params = useParams();
2
3
  const {
3
4
  settings,
4
5
  logo,
5
6
  scrolled,
6
7
  location
7
8
  } = props;
8
- const fill = !scrolled ? '#fff' : settings?.navTheme === 'dark' ? '#fff' : 'black';
9
+ const fill = !scrolled && !params.articleSlug ? '#fff' : settings?.navTheme === 'dark' ? '#fff' : 'black';
9
10
  return jsxs("svg", {
10
11
  version: "1.1",
11
12
  xmlns: "http://www.w3.org/2000/svg",
@@ -1 +1 @@
1
- {"version":3,"file":"Logo.js","sources":["../../src/components/Logo.tsx"],"sourcesContent":[null],"names":[],"mappings":"yCAGa,MAAA,IAAI,GAAyB,KAAC,IAAS;QAC1C;IACN,QAAM;AAEN,IAAA,IAAA;;;;;;;;;;;;;;UA0BgB,EAAA;AAsGpB,MAAE,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Logo.js","sources":["../../src/components/Logo.tsx"],"sourcesContent":[null],"names":[],"mappings":"kFAIa,MAAA,IAAI,GAAyB,KAAC,IAAS;AAChD,EAAA,MAAA,MAAY,GAAA,SAAY,EAAA;QAClB;AACN,IAAA,QAAU;AAEV,IAAA,IAAA;;;;;;;;;;;;;;UA0BgB,EAAA;AAsGpB,MAAE,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/navbar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA2BxC,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqFtD,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/navbar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA2BxC,UAAU,kBAAkB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAwFtD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {useLocation,Link}from'@remix-run/react';const navItems = [{
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState}from'react';import {useLocation,useParams,Link}from'@remix-run/react';const navItems = [{
2
2
  key: 'home',
3
3
  label: 'Home',
4
4
  path: '/'
@@ -16,6 +16,7 @@ const RightNavItems = ({
16
16
  }) => {
17
17
  const [isMenuOpen, setIsMenuOpen] = useState(false);
18
18
  const location = useLocation();
19
+ const params = useParams();
19
20
  const toggleMenu = () => {
20
21
  setIsMenuOpen(!isMenuOpen);
21
22
  };
@@ -23,14 +24,14 @@ const RightNavItems = ({
23
24
  return location.pathname === path;
24
25
  };
25
26
  return jsxs("div", {
26
- className: `${scrolled ? "text-foreground" : "text-white"} flex justify-between align-center`,
27
+ className: `${scrolled || params.articleSlug ? 'text-foreground' : 'text-white'} flex justify-between align-center`,
27
28
  children: [jsxs("div", {
28
29
  className: "flex",
29
30
  children: [jsx("div", {
30
31
  className: "hidden sm:ml-6 sm:flex sm:space-x-8",
31
32
  children: navItems.map(item => jsx(Link, {
32
33
  to: item.path,
33
- className: `inline-flex items-center px-1 pt-1 text-lg transition-colors duration-200 ${isActive(item.path) ? `font-bold ${scrolled ? 'text-foreground' : 'text-white'}` : `font-medium ${scrolled ? 'text-foreground hover:text-gray-900' : 'text-white hover:text-gray-300'}`}`,
34
+ className: `inline-flex items-center px-1 pt-1 text-lg transition-colors duration-200 ${isActive(item.path) ? `font-bold ${scrolled || params.articleSlug ? 'text-foreground' : 'text-white'}` : `font-medium ${scrolled || params.articleSlug ? 'text-foreground hover:text-gray-900' : 'text-white hover:text-gray-300'}`}`,
34
35
  children: item.label
35
36
  }, item.key))
36
37
  }), jsx("div", {
@@ -67,7 +68,7 @@ const RightNavItems = ({
67
68
  className: "space-y-1 pt-2 pb-3",
68
69
  children: navItems.map(item => jsx(Link, {
69
70
  to: item.path,
70
- className: `block border-l-4 py-2 pl-3 pr-4 text-base font-medium transition-colors duration-200 ${isActive(item.path) ? `border-[#057d78] font-bold ${scrolled ? 'text-foreground' : 'text-white'}` : `border-transparent font-medium ${scrolled ? 'text-gray-500 hover:text-gray-900' : 'text-gray-300 hover:text-white'} hover:border-[#057d78] hover:bg-gray-50`}`,
71
+ className: `block border-l-4 py-2 pl-3 pr-4 text-base font-medium transition-colors duration-200 ${isActive(item.path) ? `border-[#057d78] font-bold ${scrolled || params.articleSlug ? 'text-foreground' : 'text-white'}` : `border-transparent font-medium ${scrolled || params.articleSlug ? 'text-gray-500 hover:text-gray-900' : 'text-gray-300 hover:text-white'} hover:border-[#057d78] hover:bg-gray-50`}`,
71
72
  onClick: () => setIsMenuOpen(false),
72
73
  children: item.label
73
74
  }, item.key))
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/navbar/index.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"sHASA,MAAM,QAAQ,GAAc,CAAA;AAC1B,EAAA,GAAA,EAAA,MAAA;AACE,EAAA,KAAA,EAAA,MAAW;AACX,EAAA,IAAA,EAAA;AACA,CAAA,EAAA;AACD,EAAA,GAAA,EAAA,aAAA;AACD,EAAA,KAAA,EAAA,aAAA;AACE,EAAA,IAAA,EAAA;AACA,CAAA,EAAA;AACA,EAAA,GAAA,EAAA,aAAoB;AACrB,EAAA,KAAA,EAAA,aAAA;AACD,EAAA,IAAA,EAAA;AACE,CAAA,CAAA;AACA,MAAK,aAAe,GAAA,CAAA;AACpB,EAAA,QAAA;AACD,CAAA,KAAA;EACD,MAAA,CAAA,UAAA,EAAA,aAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA;AAMF,EAAM,MAAO,QAAA,GAAA,WAA+C,EAAE;QACtD,UAAW,GAAA,MAAe;AAChC,IAAA,aAAc,CAAA,CAAA,UAAc,CAAA;;AAG1B,EAAA,MAAA,QAAA,GAAA,IAAe,IAAU;AAC3B,IAAA,OAAE,QAAA,CAAA,QAAA,KAAA,IAAA;AAEF,GAAA;AACE,EAAA,OAAAA,IAAA,CAAO,KAAQ,EAAA;AACjB,IAAA,SAAE,EAAA,CAAA,EAAA,QAAA,GAAA,iBAAA,GAAA,YAAA,CAAA,kCAAA,CAAA;IAEF,QACE,EAAK,CAAAA,IAAA,CAAA,KAAA,EAAA;;AAUa,MAAA,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA;wDAiD8B;AAChC,QAAA,QAAA,EAAA,QAAA,CAAA,GAAE,CAAkC,IAAA,IAAAA,GAAA,CAAA,IAAA,EAAA;AAYxD,UAAE,EAAA,EAAA,IAAA,CAAA,IAAA;AAEF,UAAA,sFAA6B,EAAA,QAAA,CAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,UAAA,EAAA,QAAA,GAAA,iBAAA,GAAA,YAAA,CAAA,CAAA,GAAA,CAAA,YAAA,EAAA,QAAA,GAAA,qCAAA,GAAA,gCAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/navbar/index.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"gIASA,MAAM,QAAQ,GAAc,CAAA;AACxB,EAAA,GAAA,EAAA,MAAA;AACI,EAAA,KAAA,EAAA,MAAW;AACX,EAAA,IAAA,EAAA;AACA,CAAA,EAAA;AACH,EAAA,GAAA,EAAA,aAAA;AACD,EAAA,KAAA,EAAA,aAAA;AACI,EAAA,IAAA,EAAA;AACA,CAAA,EAAA;AACA,EAAA,GAAA,EAAA,aAAoB;AACvB,EAAA,KAAA,EAAA,aAAA;AACD,EAAA,IAAA,EAAA;AACI,CAAA,CAAA;AACA,MAAK,aAAe,GAAA,CAAA;AACpB,EAAA,QAAA;AACH,CAAA,KAAA;EACH,MAAA,CAAA,UAAA,EAAA,aAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA;AAMF,EAAM,MAAO,QAAA,GAAA,WAA+C,EAAE;QACpD,MAAW,GAAA,SAAe,EAAA;AAChC,EAAA,MAAA,UAAc,GAAG,MAAW;AAC5B,IAAA,aAAY,CAAA,CAAG,UAAS,CAAE;;AAGtB,EAAA,MAAA,QAAA,GAAA,IAAe,IAAU;AAC7B,IAAA,OAAE,QAAA,CAAA,QAAA,KAAA,IAAA;AAEF,GAAA;AACI,EAAA,OAAAA,IAAA,CAAO,KAAQ,EAAA;AACnB,IAAA,SAAE,EAAA,CAAA,EAAA,QAAA,IAAA,MAAA,CAAA,WAAA,GAAA,iBAAA,GAAA,YAAA,CAAA,kCAAA,CAAA;IAEF,QACI,EACI,CAAAA,IAAA,CAAA,KAAA,EAAA;AAUwB,MAAA,SAAA,EAAA,MAAA;AACA,MAAA,QAAA,EAAA,CAAAC,GAAA,CAAA,KAAA,EAAA;AAiDI,QAAA,SAAA,EAAA,qCAAE;AACF,QAAA,QAAA,EAAA,QAAA,CAAA,GAAE,CAAkC,IAAA,IAAAA,GAAA,CAAA,IAAA,EAAA;AAY5E,UAAE,EAAA,EAAA,IAAA,CAAA,IAAA;AAEF,UAAA,sFAA6B,EAAA,QAAA,CAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,UAAA,EAAA,QAAA,IAAA,MAAA,CAAA,WAAA,GAAA,iBAAA,GAAA,YAAA,CAAA,CAAA,GAAA,CAAA,YAAA,EAAA,QAAA,IAAA,MAAA,CAAA,WAAA,GAAA,qCAAA,GAAA,gCAAA,CAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ArticlePage.d.ts","sourceRoot":"","sources":["../../../src/pages/ArticlePage/ArticlePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAK3D,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EA+O/B,CAAC"}
1
+ {"version":3,"file":"ArticlePage.d.ts","sourceRoot":"","sources":["../../../src/pages/ArticlePage/ArticlePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAU3D,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAkP/B,CAAC"}
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {useParams,Link}from'@remix-run/react';import {cn}from'../../utils/index.js';import {getCategoryById,loadArticleContent}from'../../utils/markdownLoader.js';const ArticlePage = () => {
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {useParams,Link}from'@remix-run/react';import {cn}from'../../utils/index.js';import {getCategoryById,loadArticleContent}from'../../utils/markdownLoader.js';import {TableOfContents}from'./components/TableOfContents.js';import {ArticleNavigation}from'./components/ArticleNavigation.js';import {ArticleBreadcrumbs}from'./components/ArticleBreadcrumbs.js';import {CopyPageButton}from'./components/CopyPageButton.js';const ArticlePage = () => {
2
2
  const {
3
3
  categoryId,
4
4
  articleSlug
@@ -7,6 +7,8 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'
7
7
  const [loading, setLoading] = useState(true);
8
8
  const [activeHeadingId, setActiveHeadingId] = useState('');
9
9
  const observerRef = useRef(null);
10
+ const isScrollingRef = useRef(false);
11
+ const scrollTimeoutRef = useRef(null);
10
12
  useEffect(() => {
11
13
  if (articleSlug) {
12
14
  const loadContent = async () => {
@@ -26,14 +28,41 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'
26
28
  }
27
29
  // Create new intersection observer
28
30
  observerRef.current = new IntersectionObserver(entries => {
29
- entries.forEach(entry => {
30
- if (entry.isIntersecting) {
31
- setActiveHeadingId(entry.target.id);
31
+ // Don't update if we're programmatically scrolling
32
+ if (isScrollingRef.current) return;
33
+ // Find the heading that's most visible in the viewport
34
+ const visibleEntries = entries.filter(entry => entry.isIntersecting);
35
+ if (visibleEntries.length === 0) return;
36
+ // Find the heading that's closest to the top of the viewport (within the top 30%)
37
+ // Prioritize headings that are in the upper portion of the viewport
38
+ let bestEntry = visibleEntries[0];
39
+ let bestScore = Infinity;
40
+ visibleEntries.forEach(entry => {
41
+ const rect = entry.boundingClientRect;
42
+ const viewportHeight = window.innerHeight;
43
+ const top30Percent = viewportHeight * 0.3;
44
+ // Calculate a score: lower is better
45
+ // Headings in the top 30% of viewport get priority
46
+ let score;
47
+ if (rect.top >= 0 && rect.top <= top30Percent) {
48
+ // Heading is in the top 30% - prioritize by distance from top
49
+ score = rect.top;
50
+ } else if (rect.top >= 0) {
51
+ // Heading is below top 30% but visible - lower priority
52
+ score = 1000 + rect.top;
53
+ } else {
54
+ // Heading is above viewport - lowest priority unless it's the only one
55
+ score = 2000 + Math.abs(rect.top);
56
+ }
57
+ if (score < bestScore) {
58
+ bestScore = score;
59
+ bestEntry = entry;
32
60
  }
33
61
  });
62
+ setActiveHeadingId(bestEntry.target.id);
34
63
  }, {
35
- rootMargin: '-20% 0px -70% 0px',
36
- threshold: 0
64
+ rootMargin: '-10% 0px -70% 0px',
65
+ threshold: [0, 0.1, 0.5, 1]
37
66
  });
38
67
  // Observe all headings
39
68
  article.headings.forEach(heading => {
@@ -47,6 +76,9 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'
47
76
  if (observerRef.current) {
48
77
  observerRef.current.disconnect();
49
78
  }
79
+ if (scrollTimeoutRef.current) {
80
+ clearTimeout(scrollTimeoutRef.current);
81
+ }
50
82
  };
51
83
  }, [article]);
52
84
  if (loading) {
@@ -98,124 +130,91 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useEffect}from'
98
130
  return jsx("div", {
99
131
  className: "min-h-screen bg-background text-foreground scroll-smooth overflow-x-hidden",
100
132
  children: jsxs("div", {
101
- className: "flex flex-col w-full",
102
- children: [jsx("div", {
103
- className: "w-full max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 pt-8",
104
- children: jsxs("nav", {
105
- className: "flex items-center space-x-2 text-sm text-muted-foreground",
106
- children: [jsx(Link, {
107
- to: "/help-center",
108
- className: "hover:text-foreground",
109
- children: "All Collections"
110
- }), jsx("span", {
111
- children: "\u203A"
112
- }), jsx(Link, {
113
- to: `/help-center/${article.categoryId}`,
114
- className: "hover:text-foreground",
115
- children: getCategoryById(article.categoryId)?.title || article.categoryId
116
- }), jsx("span", {
117
- children: "\u203A"
118
- }), jsx("span", {
119
- className: "text-primary",
120
- children: article.title
133
+ className: "flex w-full justify-center gap-10",
134
+ children: [jsxs("div", {
135
+ className: "flex-1 max-w-3xl w-full",
136
+ children: [jsxs("div", {
137
+ className: "flex items-center justify-between",
138
+ children: [jsx(ArticleBreadcrumbs, {
139
+ categoryId: article.categoryId,
140
+ categoryTitle: getCategoryById(article.categoryId)?.title,
141
+ articleTitle: article.title,
142
+ className: "pb-4"
143
+ }), jsx(CopyPageButton, {
144
+ articleTitle: article.title,
145
+ articleContent: article.htmlContent,
146
+ className: "flex-shrink-0"
121
147
  })]
122
- })
123
- }), jsx("main", {
124
- className: "w-full py-8",
125
- children: jsx("div", {
126
- className: "max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 relative",
127
- children: jsxs("div", {
128
- className: "flex flex-col xl:flex-row gap-8 xl:gap-12",
129
- children: [jsxs("div", {
130
- className: "flex-1 min-w-0 max-w-5xl",
131
- children: [jsxs("div", {
132
- className: "mb-8",
133
- children: [jsx("h1", {
134
- className: "text-3xl md:text-4xl font-bold text-foreground mb-4",
135
- children: article.title
136
- }), jsx("p", {
137
- className: "text-lg text-muted-foreground mb-6",
138
- children: article.description
139
- }), jsxs("div", {
140
- className: "flex items-center space-x-4 text-sm text-muted-foreground",
141
- children: [jsxs("div", {
142
- className: "flex items-center",
143
- children: [jsx("div", {
144
- className: "mr-2 flex h-6 w-6 items-center justify-center rounded-full bg-muted text-xs text-foreground",
145
- children: article.author.charAt(0)
146
- }), jsxs("span", {
147
- children: ["Written by ", article.author]
148
- })]
149
- }), jsx("span", {
150
- children: "\u2022"
151
- }), jsxs("span", {
152
- children: ["Updated ", article.updatedAt]
153
- })]
154
- })]
155
- }), jsx("div", {
156
- className: "prose prose-lg max-w-none w-full overflow-x-hidden",
157
- children: jsx("div", {
158
- className: cn('prose-headings:text-foreground prose-p:text-muted-foreground prose-strong:text-foreground prose-a:text-primary prose-a:no-underline hover:prose-a:underline prose-ul:text-muted-foreground prose-ol:text-muted-foreground prose-li:text-muted-foreground prose-blockquote:text-muted-foreground prose-code:text-foreground prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-pre:bg-muted prose-pre:text-foreground prose-pre:overflow-x-auto'),
159
- dangerouslySetInnerHTML: {
160
- __html: article.htmlContent
161
- }
162
- })
163
- }), (previousArticle || nextArticle) && jsxs("div", {
164
- className: "mt-12 grid grid-cols-1 md:grid-cols-2 gap-4",
165
- children: [previousArticle ? jsxs(Link, {
166
- to: `/help-center/${previousArticle.categoryId}/${previousArticle.slug}`,
167
- className: cn('group rounded-lg border border-border bg-background px-6 py-4', 'hover:bg-muted/30 transition-colors'),
168
- children: [jsx("div", {
169
- className: "text-sm text-muted-foreground",
170
- children: "Previous"
171
- }), jsxs("div", {
172
- className: "mt-1 text-primary font-semibold group-hover:underline",
173
- children: ["\u00AB ", previousArticle.title]
174
- })]
175
- }) : jsx("div", {
176
- className: "hidden md:block"
177
- }), nextArticle ? jsxs(Link, {
178
- to: `/help-center/${nextArticle.categoryId}/${nextArticle.slug}`,
179
- className: cn('group rounded-lg border border-border bg-background px-6 py-4', 'hover:bg-muted/30 transition-colors md:text-right'),
180
- children: [jsx("div", {
181
- className: "text-sm text-muted-foreground",
182
- children: "Next"
183
- }), jsxs("div", {
184
- className: "mt-1 text-primary font-semibold group-hover:underline",
185
- children: [nextArticle.title, " \u00BB"]
186
- })]
187
- }) : jsx("div", {
188
- className: "hidden md:block"
189
- })]
190
- })]
191
- }), article.headings && article.headings.length > 0 && jsx("aside", {
192
- className: "hidden xl:block xl:w-80 xl:flex-shrink-0",
148
+ }), jsx("main", {
149
+ className: "w-full py-2",
150
+ children: jsx("div", {
151
+ className: "max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16 relative",
152
+ children: jsx("div", {
153
+ className: "flex flex-col xl:flex-row gap-12 xl:gap-16 align-start",
193
154
  children: jsxs("div", {
194
- className: "fixed top-20 flex flex-col h-[calc(100vh-3rem)]",
155
+ className: "flex-1 min-w-0 max-w-5xl",
195
156
  children: [jsx("div", {
196
- className: "mb-4 flex-shrink-0",
197
- children: jsxs("h2", {
198
- className: "text-sm font-semibold text-primary flex items-center",
199
- children: [jsx("span", {
200
- className: "mr-2",
201
- children: "\u2630"
202
- }), "On this page"]
203
- })
204
- }), jsx("nav", {
205
- className: "space-y-1 flex-1 overflow-y-auto overflow-x-hidden min-h-0",
206
- children: article.headings.map((heading, index) => {
207
- const isActive = activeHeadingId === heading.id;
208
- return jsx("a", {
209
- href: `#${heading.id}`,
210
- 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'),
211
- children: heading.text
212
- }, index);
157
+ className: "prose prose-lg max-w-none w-full overflow-x-hidden",
158
+ children: jsx("div", {
159
+ className: cn(
160
+ // Base prose styles
161
+ 'prose-headings:font-semibold prose-headings:text-foreground prose-headings:tracking-tight',
162
+ // Body H1 styles (within article) - slightly smaller than page title
163
+ 'prose-h1:text-[1.5rem] prose-h1:md:text-[1.75rem] prose-h1:mb-4 prose-h1:mt-5 prose-h1:leading-tight',
164
+ // H2 styles - strong section headings
165
+ 'prose-h2:text-[1.2rem] prose-h2:md:text-[1.5rem] prose-h2:mb-4 prose-h2:mt-5 prose-h2:leading-tight',
166
+ // H3 styles - sub section headings
167
+ 'prose-h3:text-[1.05rem] prose-h3:md:text-[1.25rem] prose-h3:mb-3 prose-h3:mt-4 prose-h3:leading-snug',
168
+ // H4 styles
169
+ 'prose-h4:text-lg prose-h4:md:text-xl prose-h4:mb-3 prose-h4:mt-4',
170
+ // Paragraph styles
171
+ 'prose-p:text-[0.85rem] prose-p:md:text-[0.95rem] prose-p:text-muted-foreground prose-p:leading-relaxed prose-p:mb-5',
172
+ // Strong text
173
+ 'prose-strong:text-foreground prose-strong:font-semibold',
174
+ // Links
175
+ 'prose-a:text-primary prose-a:no-underline hover:prose-a:underline prose-a:font-medium',
176
+ // Lists
177
+ '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',
178
+ // Blockquotes
179
+ 'prose-blockquote:text-muted-foreground prose-blockquote:border-l-primary prose-blockquote:pl-4 prose-blockquote:my-6',
180
+ // Code
181
+ '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',
182
+ // Pre blocks
183
+ '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',
184
+ // Images
185
+ 'prose-img:rounded-lg prose-img:my-8',
186
+ // Tables
187
+ 'prose-table:text-muted-foreground prose-th:text-foreground prose-th:font-semibold',
188
+ // Horizontal rules
189
+ 'prose-hr:border-border prose-hr:my-8'),
190
+ dangerouslySetInnerHTML: {
191
+ __html: article.htmlContent
192
+ }
213
193
  })
194
+ }), jsx(ArticleNavigation, {
195
+ previousArticle: previousArticle,
196
+ nextArticle: nextArticle
214
197
  })]
215
198
  })
216
- })]
199
+ })
217
200
  })
218
- })
201
+ })]
202
+ }), jsx(TableOfContents, {
203
+ headings: article.headings || [],
204
+ activeHeadingId: activeHeadingId,
205
+ onHeadingClick: headingId => {
206
+ // Set scrolling flag to prevent observer from overriding
207
+ isScrollingRef.current = true;
208
+ setActiveHeadingId(headingId);
209
+ // Clear any existing timeout
210
+ if (scrollTimeoutRef.current) {
211
+ clearTimeout(scrollTimeoutRef.current);
212
+ }
213
+ // Re-enable observer after scroll completes (smooth scroll takes ~500ms)
214
+ scrollTimeoutRef.current = setTimeout(() => {
215
+ isScrollingRef.current = false;
216
+ }, 800);
217
+ }
219
218
  })]
220
219
  })
221
220
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ArticlePage.js","sources":["../../../src/pages/ArticlePage/ArticlePage.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"0PAKO,MAAM,WAAW,GAAa,MAAK;QAChC;IACN,UAAc;IACd;MACM,SAAgB,EAAA;AACtB,EAAA,MAAA,CAAA,mBAAoB,CAAA,GAAoC,QAAM,CAAA,IAAA,CAAA;QAErD,CAAA,SAAM,UAAA,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;QACX,CAAI,iBAAc,kBAAA,CAAA,GAAA,QAAA,CAAA,EAAA,CAAA;AACd,EAAA,MAAA,WAAiB,GAAA,MAAA,CAAA,IAAQ,CAAA;AACrB,EAAA,SAAA,CAAA,MAAA;mBACU,EAAA;uBACA,GAAA,YAAQ;AACtB,QAAA,MAAE,WAAA,GAAA,MAAA,kBAAA,CAAA,WAAA,CAAA;AACF,QAAA,UAAA,CAAA,WAAc,CAAA;QAClB,UAAC,CAAA,KAAA,CAAA;AACL,OAAG;MAEwB,WAAA,EAAA;;iBAEX,CAAA,CAAA;;WAEiB,CAAA,MAAA;AAC7B,IAAA,IAAA,CAAA,OAAe,EAAA,QAAQ,IAAA,OAAG,CAAA,QAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AACtB;QACJ,WAAC,CAAA,OAAA,EAAA;iBAEkC,CAAA,OAAA,CAAA,UAAA,EAAA;;AAG3B;AACI,IAAA,WAAA,CAAA,OAAS,GAAC,IAAc,oBAAG,CAAA,OAAA,IAAA;AACvB,MAAA,OAAA,CAAA,OAAA,CAAA,KAAA,IAAA;iBACH,CAAA,cAAA,EAAA;AACL,UAAA,kBAAG,CAAA,KAAA,CAAA,MAAA,CAAA,EAAA,CAAA;AACP;AAEI,OAAA,CAAA;AACA,KAAA,EAAA;AACH,MAAA,UACH,EAAA,mBAAA;eAEqB,EAAA;;;AAGnB,IAAA,OAAA,CAAA,gBAAe,CAAA,OAAA,IAAY;AACvB,MAAA,MAAA,OAAA,GAAA,QAAmB,CAAA,cAAS,CAAA,OAAS,CAAA,EAAA,CAAA;iBACxC,IAAA,WAAA,CAAA,OAAA,EAAA;AACL,QAAA,WAAG,CAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA;;AAGH,KAAA,CAAA;AACI;AACI,IAAA,OAAA,MAAA;qBACH,CAAA,OAAA,EAAA;AACL,QAAA,WAAE,CAAA,OAAA,CAAA,UAAA,EAAA;AACN;KAEI;aACO,CAAA,CAAA;MAeV,OAAA,EAAA;IAED,OAAYA,GAAA,CAAA,KAAG,EAAA;AACX,MAAA,SAAO,EACH,8DAAmF;MAS1F,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;AAED,QAAA,SAAc,EAAA,kEAA2D;AACzE,QAAA,oBAAyB,EAAA;AACzB,UAAM,0BAAe;AACrB,UAAM,cAAe,CAAG,KAAA,EAAA;YAClB,SAAW,EACb;AAEJ,WAAO,CACH,EAAKA,GAAA,CAAA,KAAA,EAAA;AAwGmC,YAAA,SAAA,EAAA;AACA,WAAA,CAAA,EAAAC,IAAA,CAAA,KAAA,EAAA;AAQgB,YAAA,SAAA,EAAA,WAAA;AACA,YAAA,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA;AAEA,cAAA,SAAA,EAAA;AACA,aAAA,CAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;AACE,cAAA,SAAA,EAAA;AACA,aAAA,CAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;AACE,cAAA,SAAA,EAAA;AACA,aAAA,CAAA;AACE,WAAA,CAAA;AACA,SAAA;AACE,OAAA;;;AAkBxE,EAAE,IAAA,CAAA,OAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ArticlePage.js","sources":["../../../src/pages/ArticlePage/ArticlePage.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -239,7 +239,7 @@ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'
239
239
  children: jsx("div", {
240
240
  className: "flex-1 min-w-0",
241
241
  children: jsx("div", {
242
- className: "max-w-6xl mx-auto px-6 py-8",
242
+ className: "max-w-full mx-auto px-6 py-8",
243
243
  "data-content-area": true,
244
244
  children: children || jsx(Outlet, {})
245
245
  })
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface ArticleBreadcrumbsProps {
3
+ categoryId: string;
4
+ categoryTitle?: string;
5
+ articleTitle: string;
6
+ className?: string;
7
+ }
8
+ export declare const ArticleBreadcrumbs: React.FC<ArticleBreadcrumbsProps>;
9
+ export {};
10
+ //# sourceMappingURL=ArticleBreadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleBreadcrumbs.d.ts","sourceRoot":"","sources":["../../../../src/pages/ArticlePage/components/ArticleBreadcrumbs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,uBAAuB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAqBhE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const ArticleBreadcrumbs = ({
2
+ categoryId,
3
+ categoryTitle,
4
+ articleTitle,
5
+ className
6
+ }) => {
7
+ return jsx("div", {
8
+ className: cn('w-full max-w-[90rem] mx-auto px-4 sm:px-6 lg:px-8 xl:px-16', className),
9
+ children: jsxs("nav", {
10
+ className: "flex items-center space-x-2 text-sm text-muted-foreground",
11
+ children: [jsx(Link, {
12
+ to: "/help-center",
13
+ className: "hover:text-foreground transition-colors",
14
+ children: "All Collections"
15
+ }), jsx("span", {
16
+ className: "text-muted-foreground/60",
17
+ children: "\u203A"
18
+ }), jsx(Link, {
19
+ to: `/help-center/${categoryId}`,
20
+ className: "hover:text-foreground transition-colors",
21
+ children: categoryTitle || categoryId
22
+ }), jsx("span", {
23
+ className: "text-muted-foreground/60",
24
+ children: "\u203A"
25
+ }), jsx("span", {
26
+ className: "text-primary",
27
+ children: articleTitle
28
+ })]
29
+ })
30
+ });
31
+ };export{ArticleBreadcrumbs};//# sourceMappingURL=ArticleBreadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleBreadcrumbs.js","sources":["../../../../src/pages/ArticlePage/components/ArticleBreadcrumbs.tsx"],"sourcesContent":[null],"names":[],"mappings":"sHAWO,MAAM,kBAAkB,GAAsC,CAAC;AAMlE,EAAA,UACI;AAcR,EAAE,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ interface ArticleHeaderProps {
3
+ categoryTitle?: string;
4
+ title: string;
5
+ description?: string;
6
+ author?: string;
7
+ updatedAt?: string;
8
+ articleContent: string;
9
+ className?: string;
10
+ }
11
+ export declare const ArticleHeader: React.FC<ArticleHeaderProps>;
12
+ export {};
13
+ //# sourceMappingURL=ArticleHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleHeader.d.ts","sourceRoot":"","sources":["../../../../src/pages/ArticlePage/components/ArticleHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,kBAAkB;IACxB,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,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAmDtD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ interface Article {
3
+ categoryId: string;
4
+ slug: string;
5
+ title: string;
6
+ }
7
+ interface ArticleNavigationProps {
8
+ previousArticle?: Article | null;
9
+ nextArticle?: Article | null;
10
+ className?: string;
11
+ }
12
+ export declare const ArticleNavigation: React.FC<ArticleNavigationProps>;
13
+ export {};
14
+ //# sourceMappingURL=ArticleNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleNavigation.d.ts","sourceRoot":"","sources":["../../../../src/pages/ArticlePage/components/ArticleNavigation.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,OAAO;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,sBAAsB;IAC5B,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA0C9D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const ArticleNavigation = ({
2
+ previousArticle,
3
+ nextArticle,
4
+ className
5
+ }) => {
6
+ if (!previousArticle && !nextArticle) {
7
+ return null;
8
+ }
9
+ return jsxs("div", {
10
+ className: cn('mt-16 pt-8 border-t border-border grid grid-cols-1 md:grid-cols-2 gap-6', className),
11
+ children: [previousArticle ? jsxs(Link, {
12
+ to: `/help-center/${previousArticle.categoryId}/${previousArticle.slug}`,
13
+ className: cn('group rounded-lg border border-border bg-background px-6 py-5', 'hover:bg-muted/30 transition-colors'),
14
+ children: [jsx("div", {
15
+ className: "text-sm text-muted-foreground mb-1",
16
+ children: "Previous"
17
+ }), jsxs("div", {
18
+ className: "text-primary font-semibold group-hover:underline text-base",
19
+ children: ["\u00AB ", previousArticle.title]
20
+ })]
21
+ }) : jsx("div", {
22
+ className: "hidden md:block"
23
+ }), nextArticle ? jsxs(Link, {
24
+ to: `/help-center/${nextArticle.categoryId}/${nextArticle.slug}`,
25
+ className: cn('group rounded-lg border border-border bg-background px-6 py-5', 'hover:bg-muted/30 transition-colors md:text-right'),
26
+ children: [jsx("div", {
27
+ className: "text-sm text-muted-foreground mb-1",
28
+ children: "Next"
29
+ }), jsxs("div", {
30
+ className: "text-primary font-semibold group-hover:underline text-base",
31
+ children: [nextArticle.title, " \u00BB"]
32
+ })]
33
+ }) : jsx("div", {
34
+ className: "hidden md:block"
35
+ })]
36
+ });
37
+ };export{ArticleNavigation};//# sourceMappingURL=ArticleNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArticleNavigation.js","sources":["../../../../src/pages/ArticlePage/components/ArticleNavigation.tsx"],"sourcesContent":[null],"names":[],"mappings":"sHAgBO,MAAM,iBAAiB,GAAqC,CAAC;AAChE,EAAA,eAAoB;AAChB,EAAA,WAAA;;AAGJ,CAAA,KAAA;AAqCJ,EAAE,IAAA,CAAA,eAAA,IAAA,CAAA,WAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface CopyPageButtonProps {
3
+ articleTitle: string;
4
+ articleContent: string;
5
+ articleUrl?: string;
6
+ className?: string;
7
+ }
8
+ export declare const CopyPageButton: React.FC<CopyPageButtonProps>;
9
+ export {};
10
+ //# sourceMappingURL=CopyPageButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyPageButton.d.ts","sourceRoot":"","sources":["../../../../src/pages/ArticlePage/components/CopyPageButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,UAAU,mBAAmB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAsQxD,CAAC"}
@@ -0,0 +1,229 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {cn}from'../../../utils/index.js';const CopyPageButton = ({
2
+ articleTitle,
3
+ articleContent,
4
+ articleUrl,
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 `# ${articleTitle}\n\n${text}`;
71
+ };
72
+ const handleCopyMarkdown = async () => {
73
+ try {
74
+ const markdown = htmlToMarkdown(articleContent);
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(articleTitle)}`;
85
+ window.open(url, '_blank');
86
+ setIsOpen(false);
87
+ };
88
+ const handleOpenClaude = () => {
89
+ const url = `https://claude.ai/?q=${encodeURIComponent(articleTitle)}`;
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{CopyPageButton};//# sourceMappingURL=CopyPageButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyPageButton.js","sources":["../../../../src/pages/ArticlePage/components/CopyPageButton.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ interface Heading {
3
+ id: string;
4
+ text: string;
5
+ level: number;
6
+ }
7
+ interface TableOfContentsProps {
8
+ headings: Heading[];
9
+ activeHeadingId: string;
10
+ onHeadingClick?: (headingId: string) => void;
11
+ className?: string;
12
+ }
13
+ export declare const TableOfContents: React.FC<TableOfContentsProps>;
14
+ export {};
15
+ //# sourceMappingURL=TableOfContents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.d.ts","sourceRoot":"","sources":["../../../../src/pages/ArticlePage/components/TableOfContents.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,oBAAoB;IAC1B,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,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA6E1D,CAAC"}
@@ -0,0 +1,57 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {Link}from'@remix-run/react';import {cn}from'../../../utils/index.js';const TableOfContents = ({
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{TableOfContents};//# sourceMappingURL=TableOfContents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.js","sources":["../../../../src/pages/ArticlePage/components/TableOfContents.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"sHAiBO,MAAM,eAAe,GAAmC,CAAC;;AAOxD,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;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-help-browser",
3
- "version": "12.0.16-alpha.15",
3
+ "version": "12.0.16-alpha.17",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "Yantra App",
@@ -70,5 +70,5 @@
70
70
  "typescript": {
71
71
  "definition": "lib/index.d.ts"
72
72
  },
73
- "gitHead": "0452547bffa9a6ddc5282e17623a040e9bc1c10b"
73
+ "gitHead": "ecc45b56ea30530f3c469f6a13adcfe00ee485f6"
74
74
  }