boltdocs 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SearchDialog-4ANHNJTL.css → SearchDialog-BEVZQ74P.css} +118 -1
- package/dist/{SearchDialog-6Z7CUAYJ.mjs → SearchDialog-MEWGAONO.mjs} +1 -1
- package/dist/{chunk-SFVOGJ2W.mjs → chunk-OZLYRXAD.mjs} +228 -149
- package/dist/client/index.css +118 -1
- package/dist/client/index.d.mts +3 -3
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.js +421 -320
- package/dist/client/index.mjs +1 -1
- package/dist/client/ssr.css +118 -1
- package/dist/client/ssr.d.mts +1 -1
- package/dist/client/ssr.d.ts +1 -1
- package/dist/client/ssr.js +276 -175
- package/dist/client/ssr.mjs +1 -1
- package/dist/{config-D68h41CA.d.ts → config-BsFQ-ErD.d.mts} +9 -0
- package/dist/{config-D68h41CA.d.mts → config-BsFQ-ErD.d.ts} +9 -0
- package/dist/node/index.d.mts +4 -2
- package/dist/node/index.d.ts +4 -2
- package/dist/node/index.js +2 -1
- package/dist/node/index.mjs +2 -1
- package/dist/{types-BbceAHA0.d.mts → types-Dj-bfnC3.d.mts} +2 -0
- package/dist/{types-BbceAHA0.d.ts → types-Dj-bfnC3.d.ts} +2 -0
- package/package.json +2 -2
- package/src/client/theme/styles.css +1 -0
- package/src/client/theme/ui/CopyMarkdown/CopyMarkdown.tsx +82 -0
- package/src/client/theme/ui/CopyMarkdown/copy-markdown.css +114 -0
- package/src/client/theme/ui/CopyMarkdown/index.ts +1 -0
- package/src/client/theme/ui/Layout/Layout.tsx +7 -0
- package/src/client/theme/ui/Layout/base.css +18 -1
- package/src/client/types.ts +2 -0
- package/src/node/config.ts +6 -0
- package/src/node/routes/parser.ts +1 -0
- package/src/node/routes/types.ts +2 -0
package/dist/client/ssr.mjs
CHANGED
|
@@ -93,6 +93,15 @@ interface BoltdocsThemeConfig {
|
|
|
93
93
|
* Default: 'one-dark-pro'
|
|
94
94
|
*/
|
|
95
95
|
codeTheme?: string | Record<string, string>;
|
|
96
|
+
/**
|
|
97
|
+
* Configuration for the 'Copy Markdown' button.
|
|
98
|
+
* Can be a boolean or an object with text and icon.
|
|
99
|
+
* Default: true
|
|
100
|
+
*/
|
|
101
|
+
copyMarkdown?: boolean | {
|
|
102
|
+
text?: string;
|
|
103
|
+
icon?: string;
|
|
104
|
+
};
|
|
96
105
|
}
|
|
97
106
|
/**
|
|
98
107
|
* Configuration for internationalization (i18n).
|
|
@@ -93,6 +93,15 @@ interface BoltdocsThemeConfig {
|
|
|
93
93
|
* Default: 'one-dark-pro'
|
|
94
94
|
*/
|
|
95
95
|
codeTheme?: string | Record<string, string>;
|
|
96
|
+
/**
|
|
97
|
+
* Configuration for the 'Copy Markdown' button.
|
|
98
|
+
* Can be a boolean or an object with text and icon.
|
|
99
|
+
* Default: true
|
|
100
|
+
*/
|
|
101
|
+
copyMarkdown?: boolean | {
|
|
102
|
+
text?: string;
|
|
103
|
+
icon?: string;
|
|
104
|
+
};
|
|
96
105
|
}
|
|
97
106
|
/**
|
|
98
107
|
* Configuration for internationalization (i18n).
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
|
-
import { B as BoltdocsConfig } from '../config-
|
|
3
|
-
export { a as BoltdocsThemeConfig } from '../config-
|
|
2
|
+
import { B as BoltdocsConfig } from '../config-BsFQ-ErD.mjs';
|
|
3
|
+
export { a as BoltdocsThemeConfig } from '../config-BsFQ-ErD.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Configuration options specifically for the Boltdocs Vite plugin.
|
|
@@ -82,6 +82,8 @@ interface RouteMeta {
|
|
|
82
82
|
tab?: string;
|
|
83
83
|
/** The extracted plain-text content of the page for search indexing */
|
|
84
84
|
_content?: string;
|
|
85
|
+
/** The raw markdown content of the page */
|
|
86
|
+
_rawContent?: string;
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
declare function boltdocs(options?: BoltdocsPluginOptions): Promise<Plugin[]>;
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
|
-
import { B as BoltdocsConfig } from '../config-
|
|
3
|
-
export { a as BoltdocsThemeConfig } from '../config-
|
|
2
|
+
import { B as BoltdocsConfig } from '../config-BsFQ-ErD.js';
|
|
3
|
+
export { a as BoltdocsThemeConfig } from '../config-BsFQ-ErD.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Configuration options specifically for the Boltdocs Vite plugin.
|
|
@@ -82,6 +82,8 @@ interface RouteMeta {
|
|
|
82
82
|
tab?: string;
|
|
83
83
|
/** The extracted plain-text content of the page for search indexing */
|
|
84
84
|
_content?: string;
|
|
85
|
+
/** The raw markdown content of the page */
|
|
86
|
+
_rawContent?: string;
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
declare function boltdocs(options?: BoltdocsPluginOptions): Promise<Plugin[]>;
|
package/dist/node/index.js
CHANGED
package/dist/node/index.mjs
CHANGED
|
@@ -46,6 +46,8 @@ interface ComponentRoute {
|
|
|
46
46
|
groupIcon?: string;
|
|
47
47
|
/** The extracted plain-text content of the page for search indexing */
|
|
48
48
|
_content?: string;
|
|
49
|
+
/** The raw markdown content of the page */
|
|
50
|
+
_rawContent?: string;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Configuration options for initializing the Boltdocs client app.
|
|
@@ -46,6 +46,8 @@ interface ComponentRoute {
|
|
|
46
46
|
groupIcon?: string;
|
|
47
47
|
/** The extracted plain-text content of the page for search indexing */
|
|
48
48
|
_content?: string;
|
|
49
|
+
/** The raw markdown content of the page */
|
|
50
|
+
_rawContent?: string;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Configuration options for initializing the Boltdocs client app.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "boltdocs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "A lightweight documentation generator for React projects.",
|
|
5
5
|
"main": "dist/node/index.js",
|
|
6
6
|
"module": "dist/node/index.mjs",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"typescript"
|
|
38
38
|
],
|
|
39
39
|
"author": "Jesus Alcala",
|
|
40
|
-
"license": "
|
|
40
|
+
"license": "MIT",
|
|
41
41
|
"type": "commonjs",
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@mdx-js/react": "^3.1.1",
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React, { useState, useRef, useEffect } from "react";
|
|
2
|
+
import { Copy, ChevronDown, Check, ExternalLink } from "lucide-react";
|
|
3
|
+
import "./copy-markdown.css";
|
|
4
|
+
|
|
5
|
+
export interface CopyMarkdownProps {
|
|
6
|
+
content?: string;
|
|
7
|
+
config?: boolean | { text?: string; icon?: string };
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function CopyMarkdown({ content, config }: CopyMarkdownProps) {
|
|
11
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
12
|
+
const [copied, setCopied] = useState(false);
|
|
13
|
+
const dropdownRef = useRef<HTMLDivElement>(null);
|
|
14
|
+
|
|
15
|
+
const isEnabled = config !== false;
|
|
16
|
+
const buttonText = typeof config === "object" ? config.text || "Copy Markdown" : "Copy Markdown";
|
|
17
|
+
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
function handleClickOutside(event: MouseEvent) {
|
|
20
|
+
if (
|
|
21
|
+
dropdownRef.current &&
|
|
22
|
+
!dropdownRef.current.contains(event.target as Node)
|
|
23
|
+
) {
|
|
24
|
+
setIsOpen(false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
28
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
if (!isEnabled || !content) return null;
|
|
32
|
+
|
|
33
|
+
const handleCopy = () => {
|
|
34
|
+
navigator.clipboard.writeText(content);
|
|
35
|
+
setCopied(true);
|
|
36
|
+
setIsOpen(false);
|
|
37
|
+
setTimeout(() => setCopied(false), 2000);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const handleOpenRaw = () => {
|
|
41
|
+
const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
|
|
42
|
+
const url = URL.createObjectURL(blob);
|
|
43
|
+
window.open(url, "_blank");
|
|
44
|
+
setIsOpen(false);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div className="boltdocs-copy-markdown" ref={dropdownRef}>
|
|
49
|
+
<div className="copy-btn-group">
|
|
50
|
+
<button
|
|
51
|
+
className="copy-btn"
|
|
52
|
+
onClick={handleCopy}
|
|
53
|
+
aria-label="Copy Markdown"
|
|
54
|
+
>
|
|
55
|
+
{copied ? <Check size={16} /> : <Copy size={16} />}
|
|
56
|
+
<span className="copy-label">{copied ? "Copied!" : buttonText}</span>
|
|
57
|
+
</button>
|
|
58
|
+
<button
|
|
59
|
+
className={`copy-dropdown-toggle ${isOpen ? "is-active" : ""}`}
|
|
60
|
+
onClick={() => setIsOpen(!isOpen)}
|
|
61
|
+
aria-label="More options"
|
|
62
|
+
aria-expanded={isOpen}
|
|
63
|
+
>
|
|
64
|
+
<ChevronDown size={14} className="arrow-icon" />
|
|
65
|
+
</button>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
{isOpen && (
|
|
69
|
+
<div className="copy-dropdown">
|
|
70
|
+
<button className="copy-option" onClick={handleCopy}>
|
|
71
|
+
<Copy size={14} />
|
|
72
|
+
Copy Markdown
|
|
73
|
+
</button>
|
|
74
|
+
<button className="copy-option" onClick={handleOpenRaw}>
|
|
75
|
+
<ExternalLink size={14} />
|
|
76
|
+
View as Markdown
|
|
77
|
+
</button>
|
|
78
|
+
</div>
|
|
79
|
+
)}
|
|
80
|
+
</div>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
.boltdocs-copy-markdown {
|
|
2
|
+
position: relative;
|
|
3
|
+
display: inline-block;
|
|
4
|
+
z-index: 100;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.copy-btn-group {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: stretch;
|
|
10
|
+
background-color: var(--ld-bg-mute);
|
|
11
|
+
border: 1px solid var(--ld-border-subtle);
|
|
12
|
+
border-radius: var(--ld-radius-full);
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
transition: all 0.2s ease;
|
|
15
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.copy-btn-group:hover {
|
|
19
|
+
border-color: var(--ld-color-primary-hover);
|
|
20
|
+
box-shadow: 0 4px 20px rgba(59, 130, 246, 0.15);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.copy-btn {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
gap: 8px;
|
|
27
|
+
padding: 8px 16px;
|
|
28
|
+
background: transparent;
|
|
29
|
+
border: none;
|
|
30
|
+
color: var(--ld-text-main);
|
|
31
|
+
font-size: 14px;
|
|
32
|
+
font-weight: 500;
|
|
33
|
+
cursor: pointer;
|
|
34
|
+
transition: background 0.2s ease;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.copy-btn:hover {
|
|
38
|
+
background-color: var(--ld-bg-soft);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.copy-label {
|
|
42
|
+
white-space: nowrap;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.copy-dropdown-toggle {
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
padding: 0 10px;
|
|
50
|
+
background: rgba(255, 255, 255, 0.03);
|
|
51
|
+
border: none;
|
|
52
|
+
border-left: 1px solid var(--ld-border-subtle);
|
|
53
|
+
color: var(--ld-text-muted);
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.copy-dropdown-toggle:hover {
|
|
59
|
+
background: rgba(255, 255, 255, 0.1);
|
|
60
|
+
color: var(--ld-text-main);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.copy-dropdown-toggle .arrow-icon {
|
|
64
|
+
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.copy-dropdown-toggle.is-active .arrow-icon {
|
|
68
|
+
transform: rotate(180deg);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.copy-dropdown {
|
|
72
|
+
position: absolute;
|
|
73
|
+
top: calc(100% + 8px);
|
|
74
|
+
right: 0;
|
|
75
|
+
width: 200px;
|
|
76
|
+
background: var(--ld-bg-main);
|
|
77
|
+
border: 1px solid var(--ld-border-subtle);
|
|
78
|
+
border-radius: var(--ld-radius-lg);
|
|
79
|
+
padding: 4px;
|
|
80
|
+
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
|
|
81
|
+
overflow: hidden;
|
|
82
|
+
animation: boltdocs-fade-in 0.2s ease;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.copy-option {
|
|
86
|
+
display: flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
gap: 10px;
|
|
89
|
+
width: 100%;
|
|
90
|
+
padding: 10px 12px;
|
|
91
|
+
background: transparent;
|
|
92
|
+
border: none;
|
|
93
|
+
border-radius: 8px;
|
|
94
|
+
color: var(--ld-text-main);
|
|
95
|
+
font-size: 14px;
|
|
96
|
+
text-align: left;
|
|
97
|
+
cursor: pointer;
|
|
98
|
+
transition: background 0.2s ease;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.copy-option:hover {
|
|
102
|
+
background-color: var(--ld-bg-soft);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@keyframes boltdocs-fade-in {
|
|
106
|
+
from {
|
|
107
|
+
opacity: 0;
|
|
108
|
+
transform: translateY(-4px);
|
|
109
|
+
}
|
|
110
|
+
to {
|
|
111
|
+
opacity: 1;
|
|
112
|
+
transform: translateY(0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./CopyMarkdown";
|
|
@@ -20,6 +20,7 @@ import { Breadcrumbs } from "../Breadcrumbs";
|
|
|
20
20
|
import { BackgroundGradient } from "../BackgroundGradient";
|
|
21
21
|
import { ProgressBar } from "../ProgressBar";
|
|
22
22
|
import { ErrorBoundary } from "../ErrorBoundary";
|
|
23
|
+
import { CopyMarkdown } from "../CopyMarkdown";
|
|
23
24
|
import "../../styles.css";
|
|
24
25
|
|
|
25
26
|
export interface ThemeLayoutProps {
|
|
@@ -146,6 +147,12 @@ export function ThemeLayout({
|
|
|
146
147
|
<Breadcrumbs routes={filteredRoutes} config={config} />
|
|
147
148
|
)}
|
|
148
149
|
<div className="boltdocs-page">
|
|
150
|
+
<div className="boltdocs-page-header">
|
|
151
|
+
<CopyMarkdown
|
|
152
|
+
content={routes[currentIndex]?._rawContent}
|
|
153
|
+
config={config.themeConfig?.copyMarkdown}
|
|
154
|
+
/>
|
|
155
|
+
</div>
|
|
149
156
|
<ErrorBoundary>
|
|
150
157
|
{children}
|
|
151
158
|
</ErrorBoundary>
|
|
@@ -83,6 +83,23 @@ a {
|
|
|
83
83
|
width: 800px;
|
|
84
84
|
height: 800px;
|
|
85
85
|
background: var(--ld-glow-2-bg);
|
|
86
|
-
right: -300px;
|
|
87
86
|
top: -200px;
|
|
88
87
|
}
|
|
88
|
+
|
|
89
|
+
.boltdocs-page {
|
|
90
|
+
position: relative;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.boltdocs-page-header {
|
|
94
|
+
position: absolute;
|
|
95
|
+
top: 0;
|
|
96
|
+
right: 0;
|
|
97
|
+
display: flex;
|
|
98
|
+
justify-content: flex-end;
|
|
99
|
+
padding: 1rem 0;
|
|
100
|
+
pointer-events: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.boltdocs-page-header > * {
|
|
104
|
+
pointer-events: auto;
|
|
105
|
+
}
|
package/src/client/types.ts
CHANGED
package/src/node/config.ts
CHANGED
|
@@ -91,6 +91,12 @@ export interface BoltdocsThemeConfig {
|
|
|
91
91
|
* Default: 'one-dark-pro'
|
|
92
92
|
*/
|
|
93
93
|
codeTheme?: string | Record<string, string>;
|
|
94
|
+
/**
|
|
95
|
+
* Configuration for the 'Copy Markdown' button.
|
|
96
|
+
* Can be a boolean or an object with text and icon.
|
|
97
|
+
* Default: true
|
|
98
|
+
*/
|
|
99
|
+
copyMarkdown?: boolean | { text?: string; icon?: string };
|
|
94
100
|
}
|
|
95
101
|
|
|
96
102
|
/**
|
package/src/node/routes/types.ts
CHANGED