@01.software/sdk 0.2.9-dev.260310.cf511cb → 0.2.9-dev.260311.892250f
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/README.md +21 -8
- package/dist/auth.cjs +3 -1
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +36 -3
- package/dist/auth.d.ts +36 -3
- package/dist/auth.js +3 -1
- package/dist/auth.js.map +1 -1
- package/dist/index.cjs +214 -231
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +321 -155
- package/dist/index.d.ts +321 -155
- package/dist/index.js +217 -231
- package/dist/index.js.map +1 -1
- package/dist/{payload-types-Cq93wqIe.d.cts → payload-types-BjvBwB8Z.d.cts} +1601 -1373
- package/dist/{payload-types-Cq93wqIe.d.ts → payload-types-BjvBwB8Z.d.ts} +1601 -1373
- package/dist/ui/code-block.cjs +182 -0
- package/dist/ui/code-block.cjs.map +1 -0
- package/dist/ui/code-block.d.cts +62 -0
- package/dist/ui/code-block.d.ts +62 -0
- package/dist/ui/code-block.js +152 -0
- package/dist/ui/code-block.js.map +1 -0
- package/dist/{flow.cjs → ui/flow.cjs} +120 -96
- package/dist/ui/flow.cjs.map +1 -0
- package/dist/{flow.d.cts → ui/flow.d.cts} +27 -11
- package/dist/{flow.d.ts → ui/flow.d.ts} +27 -11
- package/dist/{flow.js → ui/flow.js} +119 -94
- package/dist/ui/flow.js.map +1 -0
- package/dist/{components.cjs → ui/form.cjs} +27 -520
- package/dist/ui/form.cjs.map +1 -0
- package/dist/ui/form.d.cts +37 -0
- package/dist/ui/form.d.ts +37 -0
- package/dist/{components.js → ui/form.js} +20 -516
- package/dist/ui/form.js.map +1 -0
- package/dist/ui/image.cjs +208 -0
- package/dist/ui/image.cjs.map +1 -0
- package/dist/ui/image.d.cts +44 -0
- package/dist/ui/image.d.ts +44 -0
- package/dist/ui/image.js +180 -0
- package/dist/ui/image.js.map +1 -0
- package/dist/ui/rich-text.cjs +258 -0
- package/dist/ui/rich-text.cjs.map +1 -0
- package/dist/ui/rich-text.d.cts +110 -0
- package/dist/ui/rich-text.d.ts +110 -0
- package/dist/ui/rich-text.js +235 -0
- package/dist/ui/rich-text.js.map +1 -0
- package/dist/{webhook-NRdVwXN7.d.cts → webhook-CszIpUKn.d.cts} +2 -2
- package/dist/{webhook-C_7s0K66.d.ts → webhook-_LdLdjGa.d.ts} +2 -2
- package/dist/webhook.d.cts +2 -2
- package/dist/webhook.d.ts +2 -2
- package/package.json +47 -12
- package/dist/auth-CVVo5UT5.d.ts +0 -298
- package/dist/auth-CqgrT1qd.d.cts +0 -298
- package/dist/components.cjs.map +0 -1
- package/dist/components.d.cts +0 -240
- package/dist/components.d.ts +0 -240
- package/dist/components.js.map +0 -1
- package/dist/flow.cjs.map +0 -1
- package/dist/flow.js.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var __async = (__this, __arguments, generator) => {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
var fulfilled = (value) => {
|
|
33
|
+
try {
|
|
34
|
+
step(generator.next(value));
|
|
35
|
+
} catch (e) {
|
|
36
|
+
reject(e);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var rejected = (value) => {
|
|
40
|
+
try {
|
|
41
|
+
step(generator.throw(value));
|
|
42
|
+
} catch (e) {
|
|
43
|
+
reject(e);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
47
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/ui/CodeBlock/index.tsx
|
|
52
|
+
var CodeBlock_exports = {};
|
|
53
|
+
__export(CodeBlock_exports, {
|
|
54
|
+
CodeBlock: () => CodeBlock,
|
|
55
|
+
highlight: () => highlight
|
|
56
|
+
});
|
|
57
|
+
module.exports = __toCommonJS(CodeBlock_exports);
|
|
58
|
+
var import_react2 = __toESM(require("react"), 1);
|
|
59
|
+
|
|
60
|
+
// src/ui/CodeBlock/highlight.ts
|
|
61
|
+
var import_react = require("react");
|
|
62
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
63
|
+
var import_hast_util_to_jsx_runtime = require("hast-util-to-jsx-runtime");
|
|
64
|
+
var import_shiki = require("shiki");
|
|
65
|
+
var LANGUAGE_ALIASES = {
|
|
66
|
+
js: "javascript",
|
|
67
|
+
ts: "typescript",
|
|
68
|
+
sh: "bash",
|
|
69
|
+
shell: "bash",
|
|
70
|
+
yml: "yaml",
|
|
71
|
+
py: "python",
|
|
72
|
+
rb: "ruby",
|
|
73
|
+
plaintext: "text"
|
|
74
|
+
};
|
|
75
|
+
function normalizeLanguage(lang) {
|
|
76
|
+
return LANGUAGE_ALIASES[lang] || lang;
|
|
77
|
+
}
|
|
78
|
+
function highlight(code, lang, theme = "github-dark") {
|
|
79
|
+
return __async(this, null, function* () {
|
|
80
|
+
const normalized = normalizeLanguage(lang);
|
|
81
|
+
try {
|
|
82
|
+
const hast = yield (0, import_shiki.codeToHast)(code, {
|
|
83
|
+
lang: normalized,
|
|
84
|
+
theme
|
|
85
|
+
});
|
|
86
|
+
return (0, import_hast_util_to_jsx_runtime.toJsxRuntime)(hast, { Fragment: import_react.Fragment, jsx: import_jsx_runtime.jsx, jsxs: import_jsx_runtime.jsxs });
|
|
87
|
+
} catch (e) {
|
|
88
|
+
const hast = yield (0, import_shiki.codeToHast)(code, { lang: "text", theme });
|
|
89
|
+
return (0, import_hast_util_to_jsx_runtime.toJsxRuntime)(hast, { Fragment: import_react.Fragment, jsx: import_jsx_runtime.jsx, jsxs: import_jsx_runtime.jsxs });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/ui/CodeBlock/index.tsx
|
|
95
|
+
function CodeBlock({
|
|
96
|
+
code,
|
|
97
|
+
language = "typescript",
|
|
98
|
+
theme = "github-dark",
|
|
99
|
+
className,
|
|
100
|
+
initial,
|
|
101
|
+
showLineNumbers = false,
|
|
102
|
+
showCopyButton = true
|
|
103
|
+
}) {
|
|
104
|
+
const [nodes, setNodes] = (0, import_react2.useState)(initial);
|
|
105
|
+
const [copied, setCopied] = (0, import_react2.useState)(false);
|
|
106
|
+
(0, import_react2.useEffect)(() => {
|
|
107
|
+
let cancelled = false;
|
|
108
|
+
void highlight(code, language, theme).then((el) => {
|
|
109
|
+
if (!cancelled) setNodes(el);
|
|
110
|
+
});
|
|
111
|
+
return () => {
|
|
112
|
+
cancelled = true;
|
|
113
|
+
};
|
|
114
|
+
}, [code, language, theme]);
|
|
115
|
+
const handleCopy = () => {
|
|
116
|
+
void navigator.clipboard.writeText(code).then(() => {
|
|
117
|
+
setCopied(true);
|
|
118
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
119
|
+
}, () => {
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
return /* @__PURE__ */ import_react2.default.createElement("div", { className, style: { position: "relative" } }, showCopyButton && /* @__PURE__ */ import_react2.default.createElement(
|
|
123
|
+
"button",
|
|
124
|
+
{
|
|
125
|
+
type: "button",
|
|
126
|
+
onClick: handleCopy,
|
|
127
|
+
"aria-label": "Copy code",
|
|
128
|
+
style: {
|
|
129
|
+
position: "absolute",
|
|
130
|
+
top: 8,
|
|
131
|
+
right: 8,
|
|
132
|
+
zIndex: 1,
|
|
133
|
+
padding: "4px 8px",
|
|
134
|
+
fontSize: 12,
|
|
135
|
+
lineHeight: 1,
|
|
136
|
+
border: "1px solid rgba(255,255,255,0.2)",
|
|
137
|
+
borderRadius: 4,
|
|
138
|
+
background: "rgba(0,0,0,0.3)",
|
|
139
|
+
color: "#ccc",
|
|
140
|
+
cursor: "pointer",
|
|
141
|
+
opacity: 0.7,
|
|
142
|
+
transition: "opacity 0.15s"
|
|
143
|
+
},
|
|
144
|
+
onMouseEnter: (e) => {
|
|
145
|
+
e.currentTarget.style.opacity = "1";
|
|
146
|
+
},
|
|
147
|
+
onMouseLeave: (e) => {
|
|
148
|
+
e.currentTarget.style.opacity = "0.7";
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
copied ? "Copied!" : "Copy"
|
|
152
|
+
), showLineNumbers && nodes ? /* @__PURE__ */ import_react2.default.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ import_react2.default.createElement(
|
|
153
|
+
"div",
|
|
154
|
+
{
|
|
155
|
+
"aria-hidden": true,
|
|
156
|
+
style: {
|
|
157
|
+
padding: "1em 0.5em 1em 1em",
|
|
158
|
+
textAlign: "right",
|
|
159
|
+
userSelect: "none",
|
|
160
|
+
color: "rgba(255,255,255,0.3)",
|
|
161
|
+
fontFamily: "monospace",
|
|
162
|
+
fontSize: 13,
|
|
163
|
+
lineHeight: 1.5
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
code.split("\n").map((_, i) => /* @__PURE__ */ import_react2.default.createElement("div", { key: i }, i + 1))
|
|
167
|
+
), /* @__PURE__ */ import_react2.default.createElement("div", { style: { flex: 1, overflow: "auto" } }, nodes)) : nodes != null ? nodes : /* @__PURE__ */ import_react2.default.createElement(
|
|
168
|
+
"pre",
|
|
169
|
+
{
|
|
170
|
+
style: {
|
|
171
|
+
margin: 0,
|
|
172
|
+
padding: "1em",
|
|
173
|
+
overflow: "auto",
|
|
174
|
+
fontFamily: "monospace",
|
|
175
|
+
fontSize: 13,
|
|
176
|
+
lineHeight: 1.5
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
/* @__PURE__ */ import_react2.default.createElement("code", null, code)
|
|
180
|
+
));
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=code-block.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }, () => {})\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n )\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type BundledLanguage, type BundledTheme } from 'shiki'\n\nexport type { BundledLanguage, BundledTheme }\n\n/** Normalize language aliases to shiki-compatible language IDs */\nconst LANGUAGE_ALIASES: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n py: 'python',\n rb: 'ruby',\n plaintext: 'text',\n}\n\nfunction normalizeLanguage(lang: string): string {\n return LANGUAGE_ALIASES[lang] || lang\n}\n\n/**\n * Highlight code to JSX using shiki.\n * Works in both Server and Client components.\n *\n * @example Server Component\n * ```tsx\n * const highlighted = await highlight('const x = 1', 'typescript')\n * return <div>{highlighted}</div>\n * ```\n */\nexport async function highlight(\n code: string,\n lang: string,\n theme: BundledTheme = 'github-dark',\n): Promise<JSX.Element> {\n const normalized = normalizeLanguage(lang)\n try {\n const hast = await codeToHast(code, {\n lang: normalized as BundledLanguage,\n theme,\n })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n } catch {\n // Fallback to plain text if language is not supported\n const hast = await codeToHast(code, { lang: 'text', theme })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n }\n}\n"],"mappings":"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","names":["import_react","React"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { BundledTheme } from 'shiki';
|
|
3
|
+
export { BundledTheme } from 'shiki';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Highlight code to JSX using shiki.
|
|
7
|
+
* Works in both Server and Client components.
|
|
8
|
+
*
|
|
9
|
+
* @example Server Component
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const highlighted = await highlight('const x = 1', 'typescript')
|
|
12
|
+
* return <div>{highlighted}</div>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare function highlight(code: string, lang: string, theme?: BundledTheme): Promise<JSX.Element>;
|
|
16
|
+
|
|
17
|
+
interface CodeBlockProps {
|
|
18
|
+
/** Code string to highlight */
|
|
19
|
+
code: string;
|
|
20
|
+
/** Language identifier (e.g. 'typescript', 'js', 'python') */
|
|
21
|
+
language?: string;
|
|
22
|
+
/** Shiki theme name. Default: 'github-dark' */
|
|
23
|
+
theme?: BundledTheme;
|
|
24
|
+
/** CSS class for the wrapper */
|
|
25
|
+
className?: string;
|
|
26
|
+
/** Pre-rendered JSX from server component via `highlight()` */
|
|
27
|
+
initial?: JSX.Element;
|
|
28
|
+
/** Show line numbers. Default: false */
|
|
29
|
+
showLineNumbers?: boolean;
|
|
30
|
+
/** Show copy button. Default: true */
|
|
31
|
+
showCopyButton?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Syntax-highlighted code block using shiki.
|
|
35
|
+
*
|
|
36
|
+
* @example Basic usage
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <CodeBlock code="const x = 1" language="typescript" />
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example With server pre-rendering (Next.js)
|
|
42
|
+
* ```tsx
|
|
43
|
+
* // Server Component
|
|
44
|
+
* const initial = await highlight(code, 'typescript')
|
|
45
|
+
* return <CodeBlock code={code} language="typescript" initial={initial} />
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example As RichTextContent block renderer
|
|
49
|
+
* ```tsx
|
|
50
|
+
* <RichTextContent
|
|
51
|
+
* data={data}
|
|
52
|
+
* blocks={{
|
|
53
|
+
* Code: ({ node }) => (
|
|
54
|
+
* <CodeBlock code={node.fields.code} language={node.fields.language} />
|
|
55
|
+
* ),
|
|
56
|
+
* }}
|
|
57
|
+
* />
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function CodeBlock({ code, language, theme, className, initial, showLineNumbers, showCopyButton, }: CodeBlockProps): JSX.Element;
|
|
61
|
+
|
|
62
|
+
export { CodeBlock, type CodeBlockProps, highlight };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { BundledTheme } from 'shiki';
|
|
3
|
+
export { BundledTheme } from 'shiki';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Highlight code to JSX using shiki.
|
|
7
|
+
* Works in both Server and Client components.
|
|
8
|
+
*
|
|
9
|
+
* @example Server Component
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const highlighted = await highlight('const x = 1', 'typescript')
|
|
12
|
+
* return <div>{highlighted}</div>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
declare function highlight(code: string, lang: string, theme?: BundledTheme): Promise<JSX.Element>;
|
|
16
|
+
|
|
17
|
+
interface CodeBlockProps {
|
|
18
|
+
/** Code string to highlight */
|
|
19
|
+
code: string;
|
|
20
|
+
/** Language identifier (e.g. 'typescript', 'js', 'python') */
|
|
21
|
+
language?: string;
|
|
22
|
+
/** Shiki theme name. Default: 'github-dark' */
|
|
23
|
+
theme?: BundledTheme;
|
|
24
|
+
/** CSS class for the wrapper */
|
|
25
|
+
className?: string;
|
|
26
|
+
/** Pre-rendered JSX from server component via `highlight()` */
|
|
27
|
+
initial?: JSX.Element;
|
|
28
|
+
/** Show line numbers. Default: false */
|
|
29
|
+
showLineNumbers?: boolean;
|
|
30
|
+
/** Show copy button. Default: true */
|
|
31
|
+
showCopyButton?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Syntax-highlighted code block using shiki.
|
|
35
|
+
*
|
|
36
|
+
* @example Basic usage
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <CodeBlock code="const x = 1" language="typescript" />
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example With server pre-rendering (Next.js)
|
|
42
|
+
* ```tsx
|
|
43
|
+
* // Server Component
|
|
44
|
+
* const initial = await highlight(code, 'typescript')
|
|
45
|
+
* return <CodeBlock code={code} language="typescript" initial={initial} />
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example As RichTextContent block renderer
|
|
49
|
+
* ```tsx
|
|
50
|
+
* <RichTextContent
|
|
51
|
+
* data={data}
|
|
52
|
+
* blocks={{
|
|
53
|
+
* Code: ({ node }) => (
|
|
54
|
+
* <CodeBlock code={node.fields.code} language={node.fields.language} />
|
|
55
|
+
* ),
|
|
56
|
+
* }}
|
|
57
|
+
* />
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function CodeBlock({ code, language, theme, className, initial, showLineNumbers, showCopyButton, }: CodeBlockProps): JSX.Element;
|
|
61
|
+
|
|
62
|
+
export { CodeBlock, type CodeBlockProps, highlight };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __async = (__this, __arguments, generator) => {
|
|
3
|
+
return new Promise((resolve, reject) => {
|
|
4
|
+
var fulfilled = (value) => {
|
|
5
|
+
try {
|
|
6
|
+
step(generator.next(value));
|
|
7
|
+
} catch (e) {
|
|
8
|
+
reject(e);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
var rejected = (value) => {
|
|
12
|
+
try {
|
|
13
|
+
step(generator.throw(value));
|
|
14
|
+
} catch (e) {
|
|
15
|
+
reject(e);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
19
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/ui/CodeBlock/index.tsx
|
|
24
|
+
import React, { useEffect, useState } from "react";
|
|
25
|
+
|
|
26
|
+
// src/ui/CodeBlock/highlight.ts
|
|
27
|
+
import { Fragment } from "react";
|
|
28
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
29
|
+
import { toJsxRuntime } from "hast-util-to-jsx-runtime";
|
|
30
|
+
import { codeToHast } from "shiki";
|
|
31
|
+
var LANGUAGE_ALIASES = {
|
|
32
|
+
js: "javascript",
|
|
33
|
+
ts: "typescript",
|
|
34
|
+
sh: "bash",
|
|
35
|
+
shell: "bash",
|
|
36
|
+
yml: "yaml",
|
|
37
|
+
py: "python",
|
|
38
|
+
rb: "ruby",
|
|
39
|
+
plaintext: "text"
|
|
40
|
+
};
|
|
41
|
+
function normalizeLanguage(lang) {
|
|
42
|
+
return LANGUAGE_ALIASES[lang] || lang;
|
|
43
|
+
}
|
|
44
|
+
function highlight(code, lang, theme = "github-dark") {
|
|
45
|
+
return __async(this, null, function* () {
|
|
46
|
+
const normalized = normalizeLanguage(lang);
|
|
47
|
+
try {
|
|
48
|
+
const hast = yield codeToHast(code, {
|
|
49
|
+
lang: normalized,
|
|
50
|
+
theme
|
|
51
|
+
});
|
|
52
|
+
return toJsxRuntime(hast, { Fragment, jsx, jsxs });
|
|
53
|
+
} catch (e) {
|
|
54
|
+
const hast = yield codeToHast(code, { lang: "text", theme });
|
|
55
|
+
return toJsxRuntime(hast, { Fragment, jsx, jsxs });
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/ui/CodeBlock/index.tsx
|
|
61
|
+
function CodeBlock({
|
|
62
|
+
code,
|
|
63
|
+
language = "typescript",
|
|
64
|
+
theme = "github-dark",
|
|
65
|
+
className,
|
|
66
|
+
initial,
|
|
67
|
+
showLineNumbers = false,
|
|
68
|
+
showCopyButton = true
|
|
69
|
+
}) {
|
|
70
|
+
const [nodes, setNodes] = useState(initial);
|
|
71
|
+
const [copied, setCopied] = useState(false);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
let cancelled = false;
|
|
74
|
+
void highlight(code, language, theme).then((el) => {
|
|
75
|
+
if (!cancelled) setNodes(el);
|
|
76
|
+
});
|
|
77
|
+
return () => {
|
|
78
|
+
cancelled = true;
|
|
79
|
+
};
|
|
80
|
+
}, [code, language, theme]);
|
|
81
|
+
const handleCopy = () => {
|
|
82
|
+
void navigator.clipboard.writeText(code).then(() => {
|
|
83
|
+
setCopied(true);
|
|
84
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
85
|
+
}, () => {
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
return /* @__PURE__ */ React.createElement("div", { className, style: { position: "relative" } }, showCopyButton && /* @__PURE__ */ React.createElement(
|
|
89
|
+
"button",
|
|
90
|
+
{
|
|
91
|
+
type: "button",
|
|
92
|
+
onClick: handleCopy,
|
|
93
|
+
"aria-label": "Copy code",
|
|
94
|
+
style: {
|
|
95
|
+
position: "absolute",
|
|
96
|
+
top: 8,
|
|
97
|
+
right: 8,
|
|
98
|
+
zIndex: 1,
|
|
99
|
+
padding: "4px 8px",
|
|
100
|
+
fontSize: 12,
|
|
101
|
+
lineHeight: 1,
|
|
102
|
+
border: "1px solid rgba(255,255,255,0.2)",
|
|
103
|
+
borderRadius: 4,
|
|
104
|
+
background: "rgba(0,0,0,0.3)",
|
|
105
|
+
color: "#ccc",
|
|
106
|
+
cursor: "pointer",
|
|
107
|
+
opacity: 0.7,
|
|
108
|
+
transition: "opacity 0.15s"
|
|
109
|
+
},
|
|
110
|
+
onMouseEnter: (e) => {
|
|
111
|
+
e.currentTarget.style.opacity = "1";
|
|
112
|
+
},
|
|
113
|
+
onMouseLeave: (e) => {
|
|
114
|
+
e.currentTarget.style.opacity = "0.7";
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
copied ? "Copied!" : "Copy"
|
|
118
|
+
), showLineNumbers && nodes ? /* @__PURE__ */ React.createElement("div", { style: { display: "flex" } }, /* @__PURE__ */ React.createElement(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
"aria-hidden": true,
|
|
122
|
+
style: {
|
|
123
|
+
padding: "1em 0.5em 1em 1em",
|
|
124
|
+
textAlign: "right",
|
|
125
|
+
userSelect: "none",
|
|
126
|
+
color: "rgba(255,255,255,0.3)",
|
|
127
|
+
fontFamily: "monospace",
|
|
128
|
+
fontSize: 13,
|
|
129
|
+
lineHeight: 1.5
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
code.split("\n").map((_, i) => /* @__PURE__ */ React.createElement("div", { key: i }, i + 1))
|
|
133
|
+
), /* @__PURE__ */ React.createElement("div", { style: { flex: 1, overflow: "auto" } }, nodes)) : nodes != null ? nodes : /* @__PURE__ */ React.createElement(
|
|
134
|
+
"pre",
|
|
135
|
+
{
|
|
136
|
+
style: {
|
|
137
|
+
margin: 0,
|
|
138
|
+
padding: "1em",
|
|
139
|
+
overflow: "auto",
|
|
140
|
+
fontFamily: "monospace",
|
|
141
|
+
fontSize: 13,
|
|
142
|
+
lineHeight: 1.5
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
/* @__PURE__ */ React.createElement("code", null, code)
|
|
146
|
+
));
|
|
147
|
+
}
|
|
148
|
+
export {
|
|
149
|
+
CodeBlock,
|
|
150
|
+
highlight
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=code-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/CodeBlock/index.tsx","../../src/ui/CodeBlock/highlight.ts"],"sourcesContent":["'use client'\n\nimport React, { useEffect, useState, type JSX } from 'react'\nimport { highlight, type BundledTheme } from './highlight'\n\nexport type { BundledTheme }\nexport { highlight }\n\nexport interface CodeBlockProps {\n /** Code string to highlight */\n code: string\n /** Language identifier (e.g. 'typescript', 'js', 'python') */\n language?: string\n /** Shiki theme name. Default: 'github-dark' */\n theme?: BundledTheme\n /** CSS class for the wrapper */\n className?: string\n /** Pre-rendered JSX from server component via `highlight()` */\n initial?: JSX.Element\n /** Show line numbers. Default: false */\n showLineNumbers?: boolean\n /** Show copy button. Default: true */\n showCopyButton?: boolean\n}\n\n/**\n * Syntax-highlighted code block using shiki.\n *\n * @example Basic usage\n * ```tsx\n * <CodeBlock code=\"const x = 1\" language=\"typescript\" />\n * ```\n *\n * @example With server pre-rendering (Next.js)\n * ```tsx\n * // Server Component\n * const initial = await highlight(code, 'typescript')\n * return <CodeBlock code={code} language=\"typescript\" initial={initial} />\n * ```\n *\n * @example As RichTextContent block renderer\n * ```tsx\n * <RichTextContent\n * data={data}\n * blocks={{\n * Code: ({ node }) => (\n * <CodeBlock code={node.fields.code} language={node.fields.language} />\n * ),\n * }}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n theme = 'github-dark',\n className,\n initial,\n showLineNumbers = false,\n showCopyButton = true,\n}: CodeBlockProps) {\n const [nodes, setNodes] = useState<JSX.Element | undefined>(initial)\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n void highlight(code, language, theme).then((el) => {\n if (!cancelled) setNodes(el)\n })\n return () => {\n cancelled = true\n }\n }, [code, language, theme])\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code).then(() => {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }, () => {})\n }\n\n return (\n <div className={className} style={{ position: 'relative' }}>\n {showCopyButton && (\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n style={{\n position: 'absolute',\n top: 8,\n right: 8,\n zIndex: 1,\n padding: '4px 8px',\n fontSize: 12,\n lineHeight: 1,\n border: '1px solid rgba(255,255,255,0.2)',\n borderRadius: 4,\n background: 'rgba(0,0,0,0.3)',\n color: '#ccc',\n cursor: 'pointer',\n opacity: 0.7,\n transition: 'opacity 0.15s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.7'\n }}\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n {showLineNumbers && nodes ? (\n <div style={{ display: 'flex' }}>\n <div\n aria-hidden\n style={{\n padding: '1em 0.5em 1em 1em',\n textAlign: 'right',\n userSelect: 'none',\n color: 'rgba(255,255,255,0.3)',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n {code.split('\\n').map((_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <div style={{ flex: 1, overflow: 'auto' }}>{nodes}</div>\n </div>\n ) : (\n nodes ?? (\n <pre\n style={{\n margin: 0,\n padding: '1em',\n overflow: 'auto',\n fontFamily: 'monospace',\n fontSize: 13,\n lineHeight: 1.5,\n }}\n >\n <code>{code}</code>\n </pre>\n )\n )}\n </div>\n )\n}\n","import type { JSX } from 'react'\nimport { Fragment } from 'react'\nimport { jsx, jsxs } from 'react/jsx-runtime'\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime'\nimport { codeToHast, type BundledLanguage, type BundledTheme } from 'shiki'\n\nexport type { BundledLanguage, BundledTheme }\n\n/** Normalize language aliases to shiki-compatible language IDs */\nconst LANGUAGE_ALIASES: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n py: 'python',\n rb: 'ruby',\n plaintext: 'text',\n}\n\nfunction normalizeLanguage(lang: string): string {\n return LANGUAGE_ALIASES[lang] || lang\n}\n\n/**\n * Highlight code to JSX using shiki.\n * Works in both Server and Client components.\n *\n * @example Server Component\n * ```tsx\n * const highlighted = await highlight('const x = 1', 'typescript')\n * return <div>{highlighted}</div>\n * ```\n */\nexport async function highlight(\n code: string,\n lang: string,\n theme: BundledTheme = 'github-dark',\n): Promise<JSX.Element> {\n const normalized = normalizeLanguage(lang)\n try {\n const hast = await codeToHast(code, {\n lang: normalized as BundledLanguage,\n theme,\n })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n } catch {\n // Fallback to plain text if language is not supported\n const hast = await codeToHast(code, { lang: 'text', theme })\n return toJsxRuntime(hast, { Fragment, jsx, jsxs }) as JSX.Element\n }\n}\n"],"mappings":"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","names":[]}
|