@brett_lamy/docstream 1.8.0 → 1.9.1
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 +26 -0
- package/dist/demo/DemoViewer.d.ts.map +1 -1
- package/dist/demo/DemoViewer.js +2 -2
- package/dist/demo/DemoViewer.js.map +1 -1
- package/dist/docs/DocsRenderer.d.ts +9 -2
- package/dist/docs/DocsRenderer.d.ts.map +1 -1
- package/dist/docs/DocsRenderer.js +13 -6
- package/dist/docs/DocsRenderer.js.map +1 -1
- package/dist/docs/DocumentProperties.d.ts +11 -0
- package/dist/docs/DocumentProperties.d.ts.map +1 -0
- package/dist/docs/DocumentProperties.js +63 -0
- package/dist/docs/DocumentProperties.js.map +1 -0
- package/dist/docs/TaskCheckbox.d.ts +24 -0
- package/dist/docs/TaskCheckbox.d.ts.map +1 -0
- package/dist/docs/TaskCheckbox.js +103 -0
- package/dist/docs/TaskCheckbox.js.map +1 -0
- package/dist/docs/properties.css +28 -0
- package/dist/docs/tasks.css +13 -0
- package/dist/gitbook/ast.d.ts +14 -0
- package/dist/gitbook/ast.d.ts.map +1 -1
- package/dist/gitbook/ast.js.map +1 -1
- package/dist/gitbook/index.d.ts +3 -0
- package/dist/gitbook/index.d.ts.map +1 -1
- package/dist/gitbook/index.js +2 -0
- package/dist/gitbook/index.js.map +1 -1
- package/dist/gitbook/parse.d.ts.map +1 -1
- package/dist/gitbook/parse.js +17 -3
- package/dist/gitbook/parse.js.map +1 -1
- package/dist/gitbook/properties.d.ts +15 -0
- package/dist/gitbook/properties.d.ts.map +1 -0
- package/dist/gitbook/properties.js +45 -0
- package/dist/gitbook/properties.js.map +1 -0
- package/dist/gitbook/serialize.d.ts.map +1 -1
- package/dist/gitbook/serialize.js +5 -2
- package/dist/gitbook/serialize.js.map +1 -1
- package/dist/gitbook/tasks.d.ts +11 -0
- package/dist/gitbook/tasks.d.ts.map +1 -0
- package/dist/gitbook/tasks.js +21 -0
- package/dist/gitbook/tasks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/playground/ReactCodePreview.d.ts.map +1 -1
- package/dist/playground/ReactCodePreview.js +7 -0
- package/dist/playground/ReactCodePreview.js.map +1 -1
- package/dist/streamdown.d.ts +1 -1
- package/dist/streamdown.d.ts.map +1 -1
- package/dist/streamdown.js +2 -2
- package/dist/streamdown.js.map +1 -1
- package/dist/styles.css +2 -0
- package/package.json +15 -1
- package/src/demo/DemoViewer.tsx +4 -2
- package/src/docs/DocsRenderer.tsx +22 -5
- package/src/docs/DocumentProperties.tsx +84 -0
- package/src/docs/TaskCheckbox.tsx +111 -0
- package/src/docs/properties.css +28 -0
- package/src/docs/tasks.css +13 -0
- package/src/gitbook/ast.ts +16 -0
- package/src/gitbook/index.ts +3 -0
- package/src/gitbook/parse.ts +15 -3
- package/src/gitbook/properties.ts +49 -0
- package/src/gitbook/serialize.ts +5 -2
- package/src/gitbook/tasks.ts +25 -0
- package/src/index.ts +7 -0
- package/src/playground/ReactCodePreview.tsx +8 -0
- package/src/streamdown.tsx +4 -0
- package/src/styles.css +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactCodePreview.d.ts","sourceRoot":"","sources":["../../src/playground/ReactCodePreview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAExF,OAAO,EAKL,KAAK,eAAe,EAEpB,KAAK,0BAA0B,EAChC,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,cAAc;IAC7B,uGAAuG;IACvG,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oGAAoG;IACpG,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAA;IAC1B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8GAA8G;IAC9G,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;AA0BlE,MAAM,WAAW,uBAAuB;IACtC,mGAAmG;IACnG,KAAK,EAAE,eAAe,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,gBAAgB,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACtD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"ReactCodePreview.d.ts","sourceRoot":"","sources":["../../src/playground/ReactCodePreview.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAExF,OAAO,EAKL,KAAK,eAAe,EAEpB,KAAK,0BAA0B,EAChC,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,cAAc;IAC7B,uGAAuG;IACvG,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oGAAoG;IACpG,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAA;IAC1B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8GAA8G;IAC9G,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;AA0BlE,MAAM,WAAW,uBAAuB;IACtC,mGAAmG;IACnG,KAAK,EAAE,eAAe,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,gBAAgB,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACtD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAW,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,qBAAqB,CAyEnJ;AAKD,wBAAgB,SAAS,CAAC,EACxB,KAAgB,EAChB,OAAO,EACP,IAAI,EAAE,QAAQ,EACd,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAuB,EACvB,IAAW,EACX,MAAY,EACZ,QAAQ,EACR,kBAAsB,EACtB,iBAAsB,EACtB,KAA4B,EAC5B,SAAgB,EAChB,OAAoE,EACpE,gBAAgB,EAChB,SAAS,EACT,OAAO,EACP,OAAO,GACR,EAAE,cAAc,+BAsEhB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAE5D"}
|
|
@@ -48,6 +48,13 @@ export function useAlmostNodeServer({ files, port = 4173, run, workspaceOptions,
|
|
|
48
48
|
workspaceOptions?.onServerReady?.(serverPort, serverUrl);
|
|
49
49
|
},
|
|
50
50
|
});
|
|
51
|
+
// The iframe's virtual URL only works once the host page is controlled. Do not
|
|
52
|
+
// reload the host when a reader opens its first live example.
|
|
53
|
+
await workspace.container.serverBridge.ensureServiceWorkerReady({ reloadOnFirstControl: false });
|
|
54
|
+
if (cancelled) {
|
|
55
|
+
workspace.dispose();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
51
58
|
const result = await workspace.container.run(`vite --port ${port}`, {
|
|
52
59
|
env: DETACHED_SERVER_ENV,
|
|
53
60
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactCodePreview.js","sourceRoot":"","sources":["../../src/playground/ReactCodePreview.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ReactCodePreview.js","sourceRoot":"","sources":["../../src/playground/ReactCodePreview.tsx"],"names":[],"mappings":"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"}
|
package/dist/streamdown.d.ts
CHANGED
|
@@ -15,5 +15,5 @@ export interface GitbookStreamdownProps extends DocRenderOptions {
|
|
|
15
15
|
isStreaming?: boolean;
|
|
16
16
|
markdown?: string;
|
|
17
17
|
}
|
|
18
|
-
export declare function GitbookStreamdown({ children, className, isAnimating, isStreaming, markdown, liveRenderer, sourceRenderer, demoResolver, demoRuntime, demoDependencies, demoVFS, pageActions, }: GitbookStreamdownProps): import("react").JSX.Element;
|
|
18
|
+
export declare function GitbookStreamdown({ children, className, isAnimating, isStreaming, markdown, liveRenderer, sourceRenderer, demoResolver, demoRuntime, demoDependencies, demoVFS, pageActions, documentProperties, onTaskStateChange, }: GitbookStreamdownProps): import("react").JSX.Element;
|
|
19
19
|
//# sourceMappingURL=streamdown.d.ts.map
|
package/dist/streamdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamdown.d.ts","sourceRoot":"","sources":["../src/streamdown.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAKjI,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACnG,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACtG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAA;AACtH,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAE1G,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,cAAc,CAAC,EAAE,uBAAuB,CAAA;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,WAAW,
|
|
1
|
+
{"version":3,"file":"streamdown.d.ts","sourceRoot":"","sources":["../src/streamdown.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAKjI,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACnG,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACtG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAA;AACtH,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAE1G,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,cAAc,CAAC,EAAE,uBAAuB,CAAA;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,iBAAiB,GAClB,EAAE,sBAAsB,+BA6BxB"}
|
package/dist/streamdown.js
CHANGED
|
@@ -7,9 +7,9 @@ import { parseMarkdown, trimPartialInlineToken } from "./gitbook/parse.js";
|
|
|
7
7
|
export { CitationSources, DocstreamRefContext, InlineReference } from "./docs/reference.js";
|
|
8
8
|
export { DocPageActions } from "./docs/PageActions.js";
|
|
9
9
|
export { DocstreamDemoContext, DocstreamDemoRuntimeContext, DemoFullscreen, DemoViewer } from "./demo/index.js";
|
|
10
|
-
export function GitbookStreamdown({ children, className, isAnimating, isStreaming = false, markdown, liveRenderer, sourceRenderer, demoResolver, demoRuntime, demoDependencies, demoVFS, pageActions, }) {
|
|
10
|
+
export function GitbookStreamdown({ children, className, isAnimating, isStreaming = false, markdown, liveRenderer, sourceRenderer, demoResolver, demoRuntime, demoDependencies, demoVFS, pageActions, documentProperties, onTaskStateChange, }) {
|
|
11
11
|
const content = markdown ?? children ?? "";
|
|
12
12
|
const gitbookDoc = useMemo(() => parseMarkdown(isStreaming ? trimPartialInlineToken(content) : content), [content, isStreaming]);
|
|
13
|
-
return (_jsx("div", { "aria-busy": isAnimating ?? isStreaming, className: className, "data-docstream": "", "data-streaming": isStreaming ? "" : undefined, children: _jsx(DocsRenderer, { doc: gitbookDoc, markdown: content, liveRenderer: liveRenderer, sourceRenderer: sourceRenderer, demoResolver: demoResolver, demoRuntime: demoRuntime, demoDependencies: demoDependencies, demoVFS: demoVFS, pageActions: isStreaming ? false : pageActions }) }));
|
|
13
|
+
return (_jsx("div", { "aria-busy": isAnimating ?? isStreaming, className: className, "data-docstream": "", "data-streaming": isStreaming ? "" : undefined, children: _jsx(DocsRenderer, { doc: gitbookDoc, markdown: content, liveRenderer: liveRenderer, sourceRenderer: sourceRenderer, demoResolver: demoResolver, demoRuntime: demoRuntime, demoDependencies: demoDependencies, demoVFS: demoVFS, pageActions: isStreaming ? false : pageActions, documentProperties: documentProperties, onTaskStateChange: onTaskStateChange }) }));
|
|
14
14
|
}
|
|
15
15
|
//# sourceMappingURL=streamdown.js.map
|
package/dist/streamdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamdown.js","sourceRoot":"","sources":["../src/streamdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAiF,MAAM,qBAAqB,CAAA;AACjI,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,uEAAuE;AACvE,yDAAyD;AACzD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AActG,MAAM,UAAU,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,WAAW,
|
|
1
|
+
{"version":3,"file":"streamdown.js","sourceRoot":"","sources":["../src/streamdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAiF,MAAM,qBAAqB,CAAA;AACjI,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,uEAAuE;AACvE,yDAAyD;AACzD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AActG,MAAM,UAAU,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,iBAAiB,GACM;IACvB,MAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAA;IAC1C,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAC5E,CAAC,OAAO,EAAE,WAAW,CAAC,CACvB,CAAA;IAED,OAAO,CACL,2BACa,WAAW,IAAI,WAAW,EACrC,SAAS,EAAE,SAAS,oBACL,EAAE,oBACD,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,YAE5C,KAAC,YAAY,IACX,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAC9C,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,GACpC,GACE,CACP,CAAA;AACH,CAAC"}
|
package/dist/styles.css
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brett_lamy/docstream",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"description": "GitBook-aware readonly markdown and AI stream renderer.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -38,6 +38,20 @@
|
|
|
38
38
|
"import": "./dist/gitbook/index.js",
|
|
39
39
|
"default": "./dist/gitbook/index.js"
|
|
40
40
|
},
|
|
41
|
+
"./properties": {
|
|
42
|
+
"source": "./src/docs/DocumentProperties.tsx",
|
|
43
|
+
"types": "./dist/docs/DocumentProperties.d.ts",
|
|
44
|
+
"import": "./dist/docs/DocumentProperties.js",
|
|
45
|
+
"default": "./dist/docs/DocumentProperties.js"
|
|
46
|
+
},
|
|
47
|
+
"./properties/styles.css": "./dist/docs/properties.css",
|
|
48
|
+
"./tasks": {
|
|
49
|
+
"source": "./src/docs/TaskCheckbox.tsx",
|
|
50
|
+
"types": "./dist/docs/TaskCheckbox.d.ts",
|
|
51
|
+
"import": "./dist/docs/TaskCheckbox.js",
|
|
52
|
+
"default": "./dist/docs/TaskCheckbox.js"
|
|
53
|
+
},
|
|
54
|
+
"./tasks/styles.css": "./dist/docs/tasks.css",
|
|
41
55
|
"./streamdown": {
|
|
42
56
|
"source": "./src/streamdown.tsx",
|
|
43
57
|
"types": "./dist/streamdown.d.ts",
|
package/src/demo/DemoViewer.tsx
CHANGED
|
@@ -35,7 +35,7 @@ import { CollapsibleCode } from "../docs/CollapsibleCode"
|
|
|
35
35
|
import { HighlightedCode } from "../docs/HighlightedCode"
|
|
36
36
|
import { CopyButton } from "../docs/copy"
|
|
37
37
|
import { PillTabs, Segmented, rovingKeyDown } from "../docs/controls"
|
|
38
|
-
import { useDemoResolver, useDemoRuntime } from "./context"
|
|
38
|
+
import { DocstreamDemoContext, useDemoResolver, useDemoRuntime } from "./context"
|
|
39
39
|
import { createDocstreamClipboard, type DemoSourceSnapshot, type DocstreamClipboard } from "./clipboard"
|
|
40
40
|
import { CopyDemoButton } from "./copy-demo"
|
|
41
41
|
import { PathBreadcrumb } from "./PathBreadcrumb"
|
|
@@ -1046,7 +1046,9 @@ export function DemoFullscreen({ src, resolver: override, variant, className, st
|
|
|
1046
1046
|
if (!resolver) return <DemoError message={`No demo resolver for ${src}`} />
|
|
1047
1047
|
return (
|
|
1048
1048
|
<div className={className ? `docs-demo-fullscreen ${className}` : "docs-demo-fullscreen"} style={style} data-demo-src={src}>
|
|
1049
|
-
<
|
|
1049
|
+
<DocstreamDemoContext.Provider value={resolver}>
|
|
1050
|
+
<DemoCanvas src={src} preview={{ kind: "component", component }} variant={chosen} bleed={metaValue?.bleed} look={metaValue} />
|
|
1051
|
+
</DocstreamDemoContext.Provider>
|
|
1050
1052
|
</div>
|
|
1051
1053
|
)
|
|
1052
1054
|
}
|
|
@@ -31,6 +31,10 @@ import { OpenApiOperation } from "../openapi/OpenApiOperation"
|
|
|
31
31
|
import { Mermaid } from "./Mermaid"
|
|
32
32
|
import { HighlightedCode } from "./HighlightedCode"
|
|
33
33
|
import { CitationSources, InlineReference } from "./reference"
|
|
34
|
+
import { DocumentProperties } from "./DocumentProperties"
|
|
35
|
+
import { TaskCheckbox, TaskStateChangeContext, type TaskStateChangeHandler } from "./TaskCheckbox"
|
|
36
|
+
import { getTaskState } from "../gitbook/tasks"
|
|
37
|
+
import { plainText } from "../gitbook/inline"
|
|
34
38
|
|
|
35
39
|
type MathRenderer = (formula: string) => string
|
|
36
40
|
let mathRenderer: MathRenderer | null = null
|
|
@@ -312,6 +316,7 @@ function Tabs({ block, liveRenderer, sourceRenderer }: { block: Extract<Block, {
|
|
|
312
316
|
}
|
|
313
317
|
|
|
314
318
|
function BlockView({ block, liveRenderer, sourceRenderer }: { block: Block } & Renderers) {
|
|
319
|
+
const onTaskStateChange = useContext(TaskStateChangeContext)
|
|
315
320
|
switch (block.type) {
|
|
316
321
|
case "paragraph":
|
|
317
322
|
return (
|
|
@@ -476,8 +481,9 @@ function BlockView({ block, liveRenderer, sourceRenderer }: { block: Block } & R
|
|
|
476
481
|
return (
|
|
477
482
|
<Tag className={block.task ? "docs-tasklist" : undefined}>
|
|
478
483
|
{block.items.map((item, i) => (
|
|
479
|
-
<li key={i}>
|
|
480
|
-
{block.task && <
|
|
484
|
+
<li key={i} data-task-state={block.task ? getTaskState(item) : undefined}>
|
|
485
|
+
{block.task && <TaskCheckbox state={getTaskState(item)} label={item.children.filter((b) => b.type === "paragraph").map((b) => b.type === "paragraph" ? plainText(b.children) : "").join(" ") || "Task"}
|
|
486
|
+
onChange={onTaskStateChange ? (state) => onTaskStateChange(item, state) : undefined} />}
|
|
481
487
|
<Blocks blocks={item.children} inline liveRenderer={liveRenderer} sourceRenderer={sourceRenderer} />
|
|
482
488
|
</li>
|
|
483
489
|
))}
|
|
@@ -582,6 +588,10 @@ function Blocks({ blocks, inline, liveRenderer, sourceRenderer }: { blocks: Bloc
|
|
|
582
588
|
}
|
|
583
589
|
|
|
584
590
|
export interface DocRenderOptions {
|
|
591
|
+
/** Make rendered task checkboxes interactive. Update the supplied item and re-render to persist a choice. */
|
|
592
|
+
onTaskStateChange?: TaskStateChangeHandler
|
|
593
|
+
/** Show the document's frontmatter as a property sheet (default true). */
|
|
594
|
+
documentProperties?: boolean | { defaultOpen?: boolean }
|
|
585
595
|
/** Resolves `{% demo %}` blocks. Provided through context, so nested renderers inherit it. */
|
|
586
596
|
demoResolver?: DemoResolver
|
|
587
597
|
/**
|
|
@@ -605,8 +615,9 @@ export interface DocRenderOptions {
|
|
|
605
615
|
pageActions?: boolean | DocPageActionsOptions
|
|
606
616
|
}
|
|
607
617
|
|
|
608
|
-
function withDemoContext({ demoResolver, demoRuntime, demoDependencies, demoVFS }: DocRenderOptions, children: ReactNode) {
|
|
618
|
+
function withDemoContext({ demoResolver, demoRuntime, demoDependencies, demoVFS, onTaskStateChange }: DocRenderOptions, children: ReactNode) {
|
|
609
619
|
let out = children
|
|
620
|
+
if (onTaskStateChange) out = <TaskStateChangeContext.Provider value={onTaskStateChange}>{out}</TaskStateChangeContext.Provider>
|
|
610
621
|
if (demoVFS) out = <DocstreamDemoVFSContext.Provider value={demoVFS}>{out}</DocstreamDemoVFSContext.Provider>
|
|
611
622
|
if (demoRuntime || demoDependencies) {
|
|
612
623
|
out = <DemoRuntimeProvider runtime={demoRuntime} dependencies={demoDependencies}>{out}</DemoRuntimeProvider>
|
|
@@ -650,12 +661,15 @@ export function MarkdownContent({
|
|
|
650
661
|
demoVFS,
|
|
651
662
|
pageActions,
|
|
652
663
|
className,
|
|
664
|
+
documentProperties = true,
|
|
665
|
+
onTaskStateChange,
|
|
653
666
|
}: { markdown: string; className?: string } & Renderers & DocRenderOptions) {
|
|
654
667
|
const doc = useMemo(() => parseMarkdown(markdown), [markdown])
|
|
655
668
|
return withDemoContext(
|
|
656
|
-
{ demoResolver, demoRuntime, demoDependencies, demoVFS },
|
|
669
|
+
{ demoResolver, demoRuntime, demoDependencies, demoVFS, onTaskStateChange },
|
|
657
670
|
<div data-docstream="" className={className}>
|
|
658
671
|
<PageActionsBar markdown={markdown} options={pageActions} />
|
|
672
|
+
{documentProperties && doc.properties ? <DocumentProperties properties={doc.properties} defaultOpen={typeof documentProperties === "object" && documentProperties.defaultOpen} /> : null}
|
|
659
673
|
<Blocks blocks={doc.children} liveRenderer={liveRenderer} sourceRenderer={sourceRenderer} />
|
|
660
674
|
<CitationSources citations={doc.citations} />
|
|
661
675
|
</div>,
|
|
@@ -672,11 +686,14 @@ export function DocsRenderer({
|
|
|
672
686
|
demoVFS,
|
|
673
687
|
pageActions,
|
|
674
688
|
markdown,
|
|
689
|
+
documentProperties = true,
|
|
690
|
+
onTaskStateChange,
|
|
675
691
|
}: { doc: DocumentNode; /** Source for page actions; defaults to `serializeMarkdown(doc)`. */ markdown?: string } & Renderers & DocRenderOptions) {
|
|
676
692
|
return withDemoContext(
|
|
677
|
-
{ demoResolver, demoRuntime, demoDependencies, demoVFS },
|
|
693
|
+
{ demoResolver, demoRuntime, demoDependencies, demoVFS, onTaskStateChange },
|
|
678
694
|
<article className="docs-article">
|
|
679
695
|
<PageActionsBar markdown={markdown ?? (() => serializeMarkdown(doc))} options={pageActions} />
|
|
696
|
+
{documentProperties && doc.properties ? <DocumentProperties properties={doc.properties} defaultOpen={typeof documentProperties === "object" && documentProperties.defaultOpen} /> : null}
|
|
680
697
|
<Blocks blocks={doc.children} liveRenderer={liveRenderer} sourceRenderer={sourceRenderer} />
|
|
681
698
|
<CitationSources citations={doc.citations} />
|
|
682
699
|
</article>,
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { useEffect, useState } from "react"
|
|
2
|
+
import { ChevronRight, Plus, X } from "lucide-react"
|
|
3
|
+
import { parseDocument, stringify } from "yaml"
|
|
4
|
+
import type { DocumentPropertiesNode } from "../gitbook/ast"
|
|
5
|
+
import { readDocumentProperties, removeDocumentProperty, setDocumentProperty, type DocumentPropertyValue } from "../gitbook/properties"
|
|
6
|
+
|
|
7
|
+
export interface DocumentPropertiesProps {
|
|
8
|
+
properties: DocumentPropertiesNode
|
|
9
|
+
/** Omit for read-only properties. Edits retain the YAML document's comments and formatting. */
|
|
10
|
+
onChange?: (properties: DocumentPropertiesNode) => void
|
|
11
|
+
defaultOpen?: boolean
|
|
12
|
+
className?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function textValue(value: DocumentPropertyValue): string {
|
|
16
|
+
return value === null ? "" : typeof value === "object" ? stringify(value).trimEnd() : String(value)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function PropertyField({ name, value, onChange }: { name: string; value: DocumentPropertyValue; onChange: (value: DocumentPropertyValue) => void }) {
|
|
20
|
+
const rendered = textValue(value)
|
|
21
|
+
const [draft, setDraft] = useState(rendered)
|
|
22
|
+
const [error, setError] = useState<string>()
|
|
23
|
+
useEffect(() => { setDraft(rendered); setError(undefined) }, [rendered])
|
|
24
|
+
if (typeof value === "boolean") return <input type="checkbox" aria-label={name} checked={value} onChange={(event) => onChange(event.currentTarget.checked)} />
|
|
25
|
+
const complex = value !== null && typeof value === "object"
|
|
26
|
+
const multiline = complex || (typeof value === "string" && value.includes("\n"))
|
|
27
|
+
const change = (text: string) => {
|
|
28
|
+
setDraft(text)
|
|
29
|
+
if (!complex && typeof value !== "number") onChange(text)
|
|
30
|
+
else if (typeof value === "number" && text !== "" && Number.isFinite(Number(text))) onChange(Number(text))
|
|
31
|
+
}
|
|
32
|
+
const commit = () => {
|
|
33
|
+
if (!complex) return
|
|
34
|
+
try {
|
|
35
|
+
const yaml = parseDocument(draft)
|
|
36
|
+
if (yaml.errors.length) throw yaml.errors[0]
|
|
37
|
+
const next = yaml.toJS({ maxAliasCount: 100 }) as DocumentPropertyValue
|
|
38
|
+
JSON.stringify(next)
|
|
39
|
+
setError(undefined)
|
|
40
|
+
onChange(next)
|
|
41
|
+
} catch (cause) { setError(cause instanceof Error ? cause.message : String(cause)) }
|
|
42
|
+
}
|
|
43
|
+
return <div className="docs-property-field">
|
|
44
|
+
{multiline ? <textarea aria-label={name} value={draft} rows={Math.min(6, draft.split("\n").length)} aria-invalid={!!error || undefined}
|
|
45
|
+
onChange={(event) => change(event.currentTarget.value)} onBlur={commit} />
|
|
46
|
+
: <input type={typeof value === "number" ? "number" : "text"} aria-label={name} value={draft} placeholder="Empty"
|
|
47
|
+
onChange={(event) => change(event.currentTarget.value)} />}
|
|
48
|
+
{error ? <span role="alert" className="docs-properties-error">{error}</span> : null}
|
|
49
|
+
</div>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** The shared, accessible property sheet used by the renderer and the editor. */
|
|
53
|
+
export function DocumentProperties({ properties, onChange, defaultOpen = false, className }: DocumentPropertiesProps) {
|
|
54
|
+
const { values, error } = readDocumentProperties(properties)
|
|
55
|
+
const [adding, setAdding] = useState(false)
|
|
56
|
+
const [name, setName] = useState("")
|
|
57
|
+
const keys = Object.keys(values)
|
|
58
|
+
return <details className={["docs-document-properties", className].filter(Boolean).join(" ")} data-document-properties="" open={defaultOpen || undefined}>
|
|
59
|
+
<summary><ChevronRight size={13} aria-hidden="true" /><span>Properties</span><span className="docs-properties-count">{keys.length}</span></summary>
|
|
60
|
+
{error ? <div className="docs-properties-error" role="alert">
|
|
61
|
+
<p>{error}</p>
|
|
62
|
+
{onChange ? <textarea aria-label="Document properties YAML" value={properties.yaml} onChange={(event) => onChange({ ...properties, yaml: event.currentTarget.value })} />
|
|
63
|
+
: <pre>{properties.yaml}</pre>}
|
|
64
|
+
</div> : <>
|
|
65
|
+
<dl className="docs-properties-list">
|
|
66
|
+
{keys.map((key) => <div key={key} className="docs-property-row">
|
|
67
|
+
<dt>{key}</dt>
|
|
68
|
+
<dd>{onChange ? <PropertyField name={key} value={values[key]} onChange={(value) => onChange(setDocumentProperty(properties, key, value))} />
|
|
69
|
+
: <span className="docs-property-value">{values[key] === null ? "Empty" : typeof values[key] === "boolean" ? String(values[key]) : textValue(values[key])}</span>}</dd>
|
|
70
|
+
{onChange ? <button type="button" className="docs-property-remove" aria-label={`Remove ${key} property`} onClick={() => onChange(removeDocumentProperty(properties, key))}><X size={13} /></button> : null}
|
|
71
|
+
</div>)}
|
|
72
|
+
</dl>
|
|
73
|
+
{onChange ? adding ? <form className="docs-property-add" onSubmit={(event) => {
|
|
74
|
+
event.preventDefault()
|
|
75
|
+
const key = name.trim()
|
|
76
|
+
if (!key || Object.hasOwn(values, key)) return
|
|
77
|
+
onChange(setDocumentProperty(properties, key, "")); setName(""); setAdding(false)
|
|
78
|
+
}}><input aria-label="Property name" placeholder="Property name" autoFocus value={name} onChange={(event) => setName(event.currentTarget.value)} />
|
|
79
|
+
<button type="submit" disabled={!name.trim() || Object.hasOwn(values, name.trim())}>Add</button>
|
|
80
|
+
<button type="button" onClick={() => { setAdding(false); setName("") }}>Cancel</button></form>
|
|
81
|
+
: <button type="button" className="docs-property-add" onClick={() => setAdding(true)}><Plus size={13} />Add property</button> : null}
|
|
82
|
+
</>}
|
|
83
|
+
</details>
|
|
84
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createContext, useEffect, useId, useRef, useState, type CSSProperties } from "react"
|
|
2
|
+
import { createPortal } from "react-dom"
|
|
3
|
+
import { Ban, Check, Circle, CircleCheck, CircleHelp, CircleMinus, CirclePause, CircleX, Clock3 } from "lucide-react"
|
|
4
|
+
import type { ListItemNode, TaskState } from "../gitbook/ast"
|
|
5
|
+
import { TASK_STATES } from "../gitbook/tasks"
|
|
6
|
+
|
|
7
|
+
/** The icons used by the checkbox, tooltip and state picker. */
|
|
8
|
+
export const TASK_STATE_ICONS = {
|
|
9
|
+
pending: Circle,
|
|
10
|
+
"in-progress": Clock3,
|
|
11
|
+
implemented: CircleHelp,
|
|
12
|
+
blocked: Ban,
|
|
13
|
+
parked: CirclePause,
|
|
14
|
+
refuted: CircleX,
|
|
15
|
+
verified: CircleCheck,
|
|
16
|
+
cancelled: CircleMinus,
|
|
17
|
+
} as const
|
|
18
|
+
|
|
19
|
+
export type TaskStateChangeHandler = (item: ListItemNode, state: TaskState) => void
|
|
20
|
+
export const TaskStateChangeContext = createContext<TaskStateChangeHandler | undefined>(undefined)
|
|
21
|
+
|
|
22
|
+
export interface TaskCheckboxProps {
|
|
23
|
+
state: TaskState
|
|
24
|
+
/** A normal click clears any marked state; clicking pending sets verified. */
|
|
25
|
+
onChange?: (state: TaskState) => void
|
|
26
|
+
label?: string
|
|
27
|
+
className?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const TOKENS = ["--foreground", "--muted-foreground", "--popover", "--popover-foreground", "--border", "--primary", "--accent", "--accent-foreground"]
|
|
31
|
+
|
|
32
|
+
/** An accessible multi-state task checkbox. Right-click or Shift+F10 opens its keyboard-navigable state menu. */
|
|
33
|
+
export function TaskCheckbox({ state, onChange, label = "Task", className }: TaskCheckboxProps) {
|
|
34
|
+
const input = useRef<HTMLInputElement>(null)
|
|
35
|
+
const menu = useRef<HTMLDivElement>(null)
|
|
36
|
+
const tipId = useId()
|
|
37
|
+
const [popup, setPopup] = useState<{ x: number; y: number; style: CSSProperties }>()
|
|
38
|
+
const [tip, setTip] = useState<{ x: number; y: number }>()
|
|
39
|
+
const hoverTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)
|
|
40
|
+
const meta = TASK_STATES.find((item) => item.id === state) ?? TASK_STATES[0]
|
|
41
|
+
const StateIcon = TASK_STATE_ICONS[meta.id]
|
|
42
|
+
const mixed = state !== "pending" && state !== "verified"
|
|
43
|
+
useEffect(() => { if (input.current) input.current.indeterminate = mixed }, [mixed, state])
|
|
44
|
+
useEffect(() => () => clearTimeout(hoverTimer.current), [])
|
|
45
|
+
const hideTip = () => { clearTimeout(hoverTimer.current); setTip(undefined) }
|
|
46
|
+
const showTip = () => {
|
|
47
|
+
clearTimeout(hoverTimer.current)
|
|
48
|
+
hoverTimer.current = setTimeout(() => {
|
|
49
|
+
const box = input.current?.getBoundingClientRect()
|
|
50
|
+
if (box) setTip({ x: Math.max(80, Math.min(window.innerWidth - 80, box.x + box.width / 2)), y: box.top > 36 ? box.top - 6 : box.bottom + 30 })
|
|
51
|
+
}, 400)
|
|
52
|
+
}
|
|
53
|
+
const open = (x?: number, y?: number) => {
|
|
54
|
+
if (!onChange || !input.current) return
|
|
55
|
+
hideTip()
|
|
56
|
+
const box = input.current.getBoundingClientRect()
|
|
57
|
+
const computed = getComputedStyle(input.current)
|
|
58
|
+
const style = Object.fromEntries(TOKENS.map((token) => [token, computed.getPropertyValue(token)])) as CSSProperties
|
|
59
|
+
style.fontFamily = computed.fontFamily
|
|
60
|
+
style.colorScheme = computed.colorScheme
|
|
61
|
+
setPopup({ x: Math.max(8, Math.min(window.innerWidth - 292, x ?? box.left)), y: Math.max(8, Math.min(window.innerHeight - 330, y ?? box.bottom + 4)), style })
|
|
62
|
+
}
|
|
63
|
+
const close = (restoreFocus = false) => { setPopup(undefined); if (restoreFocus) input.current?.focus({ preventScroll: true }) }
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (!popup) return
|
|
66
|
+
menu.current?.querySelector<HTMLButtonElement>(`[data-state="${state}"]`)?.focus()
|
|
67
|
+
const outside = (event: PointerEvent) => { if (event.target instanceof Node && !menu.current?.contains(event.target)) close() }
|
|
68
|
+
const scroll = (event: Event) => { if (!(event.target instanceof Node && menu.current?.contains(event.target))) close() }
|
|
69
|
+
document.addEventListener("pointerdown", outside, true)
|
|
70
|
+
window.addEventListener("resize", scroll)
|
|
71
|
+
window.addEventListener("scroll", scroll, true)
|
|
72
|
+
return () => { document.removeEventListener("pointerdown", outside, true); window.removeEventListener("resize", scroll); window.removeEventListener("scroll", scroll, true) }
|
|
73
|
+
}, [popup])
|
|
74
|
+
return <span className={["docs-task-control", className].filter(Boolean).join(" ")} data-task-state={state}>
|
|
75
|
+
<input ref={input} type="checkbox" className="docs-task-checkbox" aria-label={`${label}: ${meta.label}`} aria-describedby={tip ? tipId : undefined}
|
|
76
|
+
aria-checked={mixed ? "mixed" : state === "verified"} aria-readonly={!onChange || undefined} aria-haspopup={onChange ? "menu" : undefined}
|
|
77
|
+
aria-expanded={onChange ? !!popup : undefined} checked={state === "verified"} readOnly={!onChange}
|
|
78
|
+
onClick={(event) => { if (!onChange) event.preventDefault() }}
|
|
79
|
+
onChange={() => { hideTip(); onChange?.(state === "pending" ? "verified" : "pending") }}
|
|
80
|
+
onMouseDown={(event) => { if (event.button === 0) event.preventDefault() }}
|
|
81
|
+
onMouseEnter={showTip} onMouseLeave={hideTip} onFocus={showTip} onBlur={hideTip}
|
|
82
|
+
onContextMenu={(event) => { if (onChange) { event.preventDefault(); open(event.clientX, event.clientY) } }}
|
|
83
|
+
onKeyDown={(event) => {
|
|
84
|
+
if (event.key === "ContextMenu" || (event.shiftKey && event.key === "F10")) { event.preventDefault(); open() }
|
|
85
|
+
}} />
|
|
86
|
+
<StateIcon className="docs-task-state-icon" size={20} strokeWidth={1.7} aria-hidden="true" data-state-icon={state} />
|
|
87
|
+
{tip && !popup ? createPortal(<div role="tooltip" id={tipId} className="docs-task-tooltip" style={{ left: tip.x, top: tip.y }}>{meta.label}</div>, document.body) : null}
|
|
88
|
+
{popup ? createPortal(<div ref={menu} role="menu" aria-label="Task state" className="docs-task-state-menu" style={{ ...popup.style, left: popup.x, top: popup.y }}
|
|
89
|
+
onContextMenu={(event) => event.preventDefault()}
|
|
90
|
+
onKeyDown={(event) => {
|
|
91
|
+
const items = [...(menu.current?.querySelectorAll<HTMLButtonElement>('[role="menuitemradio"]') ?? [])]
|
|
92
|
+
const current = items.indexOf(document.activeElement as HTMLButtonElement)
|
|
93
|
+
let next: number | undefined
|
|
94
|
+
if (event.key === "ArrowDown") next = (current + 1) % items.length
|
|
95
|
+
if (event.key === "ArrowUp") next = (current - 1 + items.length) % items.length
|
|
96
|
+
if (event.key === "Home") next = 0
|
|
97
|
+
if (event.key === "End") next = items.length - 1
|
|
98
|
+
if (event.key === "Escape" || event.key === "Tab") { event.preventDefault(); close(true) }
|
|
99
|
+
if (next !== undefined) { event.preventDefault(); items[next]?.focus() }
|
|
100
|
+
}}>
|
|
101
|
+
{TASK_STATES.map((item) => {
|
|
102
|
+
const Icon = TASK_STATE_ICONS[item.id]
|
|
103
|
+
return <button type="button" role="menuitemradio" key={item.id} data-state={item.id} aria-checked={item.id === state}
|
|
104
|
+
onClick={() => { onChange?.(item.id); close(true) }}>
|
|
105
|
+
<Icon size={19} strokeWidth={1.7} aria-hidden="true" data-state-icon={item.id} />
|
|
106
|
+
<span>{item.label}</span>{item.id === state ? <Check size={14} aria-hidden="true" /> : <span />}
|
|
107
|
+
</button>
|
|
108
|
+
})}
|
|
109
|
+
</div>, document.body) : null}
|
|
110
|
+
</span>
|
|
111
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
.docs-document-properties {
|
|
2
|
+
color: var(--muted-foreground, #787878);
|
|
3
|
+
font: inherit;
|
|
4
|
+
font-size: 13px;
|
|
5
|
+
line-height: 1.5;
|
|
6
|
+
margin-block: 0 20px;
|
|
7
|
+
}
|
|
8
|
+
.docs-document-properties > summary { display: flex; align-items: center; gap: 6px; width: fit-content; padding-block: 5px; cursor: pointer; list-style: none; user-select: none; }
|
|
9
|
+
.docs-document-properties > summary::-webkit-details-marker { display: none; }
|
|
10
|
+
.docs-document-properties[open] > summary > svg { transform: rotate(90deg); }
|
|
11
|
+
.docs-properties-count { font-variant-numeric: tabular-nums; opacity: .65; margin-left: 2px; }
|
|
12
|
+
.docs-properties-list { margin: 6px 0; }
|
|
13
|
+
.docs-property-row { display: grid; grid-template-columns: minmax(80px, 130px) minmax(0, 1fr) 22px; align-items: start; gap: 10px; padding-block: 6px; border-bottom: 1px solid var(--border, #e8e8e8); }
|
|
14
|
+
.docs-property-row dt { padding-block: 3px; overflow-wrap: anywhere; }
|
|
15
|
+
.docs-property-row dd { margin: 0; min-width: 0; color: var(--foreground, #242424); }
|
|
16
|
+
.docs-property-value { display: block; white-space: pre-wrap; overflow-wrap: anywhere; padding-block: 3px; }
|
|
17
|
+
.docs-document-properties :is(input:not([type="checkbox"]), textarea) { box-sizing: border-box; width: 100%; min-width: 0; padding: 3px 5px; color: var(--foreground, #242424); font: inherit; line-height: inherit; background: transparent; border: 0; border-radius: 4px; }
|
|
18
|
+
.docs-document-properties textarea { resize: vertical; }
|
|
19
|
+
.docs-document-properties input[type="checkbox"] { accent-color: var(--primary, #a87900); margin: 6px 0; }
|
|
20
|
+
.docs-document-properties :is(input, textarea, button, summary):focus-visible { outline: 2px solid var(--primary, #a87900); outline-offset: 2px; }
|
|
21
|
+
.docs-document-properties button { display: inline-flex; align-items: center; justify-content: center; gap: 5px; color: inherit; background: transparent; border: 0; border-radius: 4px; font: inherit; cursor: pointer; }
|
|
22
|
+
.docs-property-remove { padding: 6px 3px; opacity: 0; }
|
|
23
|
+
.docs-property-row:hover .docs-property-remove, .docs-property-remove:focus-visible { opacity: 1; }
|
|
24
|
+
.docs-property-add { display: flex; align-items: center; gap: 8px; margin-block: 8px 0; padding: 3px 0; }
|
|
25
|
+
.docs-property-add input { max-width: 240px; }
|
|
26
|
+
.docs-property-add button { padding: 3px 6px; }
|
|
27
|
+
.docs-properties-error { color: var(--destructive, #bc3030); font-size: 12px; overflow-wrap: anywhere; }
|
|
28
|
+
.docs-properties-error pre { white-space: pre-wrap; }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
.docs-task-control { position: relative; display: inline-flex; width: 21px; height: 21px; flex: 0 0 21px; vertical-align: text-bottom; color: var(--muted-foreground, #7a7a7a); }
|
|
2
|
+
.docs-task-control .docs-task-checkbox { position: absolute; inset: 0; box-sizing: border-box; appearance: none; margin: 0; width: 100%; height: 100%; padding: 0; border: 0; border-radius: 50%; background: transparent; cursor: pointer; box-shadow: none; }
|
|
3
|
+
.docs-task-checkbox:focus-visible { outline: 2px solid var(--primary, #a87900); outline-offset: 3px; }
|
|
4
|
+
.docs-task-state-icon { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
|
|
5
|
+
.docs-task-control[data-task-state="verified"], .docs-task-control[data-task-state="in-progress"], .docs-task-control[data-task-state="implemented"] { color: var(--primary, #a87900); }
|
|
6
|
+
.docs-task-control[data-task-state="blocked"], .docs-task-control[data-task-state="refuted"] { color: var(--destructive, #bd3d36); }
|
|
7
|
+
.docs-task-state-menu { position: fixed; z-index: 10000; box-sizing: border-box; width: 284px; max-height: calc(100vh - 16px); overflow: auto; padding: 5px; border: 1px solid var(--border, #dedede); border-radius: 10px; background: var(--popover, #fff); color: var(--popover-foreground, #222); box-shadow: 0 8px 32px #0003, 0 1px 3px #0001; font-size: 13px; line-height: 1.4; }
|
|
8
|
+
.docs-task-state-menu > button { display: grid; grid-template-columns: 20px minmax(0, 1fr) 14px; align-items: center; gap: 9px; width: 100%; min-height: 35px; padding: 7px 8px; border: 0; border-radius: 5px; color: inherit; background: transparent; font: inherit; text-align: left; cursor: pointer; outline: none; }
|
|
9
|
+
.docs-task-state-menu > button:hover, .docs-task-state-menu > button:focus { color: var(--accent-foreground, #222); background: var(--accent, #eee); }
|
|
10
|
+
.docs-task-state-menu > button > svg:first-child { color: var(--muted-foreground, #777); }
|
|
11
|
+
.docs-task-state-menu > button[aria-checked="true"] > svg { color: var(--primary, #a87900); }
|
|
12
|
+
.docs-task-tooltip { position: fixed; z-index: 10001; transform: translate(-50%, -100%); border-radius: 5px; padding: 4px 8px; color: #fff; background: #303030; box-shadow: 0 2px 8px #0002; font: 12px/1.4 system-ui, sans-serif; white-space: nowrap; pointer-events: none; }
|
|
13
|
+
.docs-tasklist li > .docs-task-control { margin-top: 2px; }
|
package/src/gitbook/ast.ts
CHANGED
|
@@ -433,6 +433,8 @@ export interface ListItemNode extends ContainerSpacing {
|
|
|
433
433
|
type: "listItem"
|
|
434
434
|
children: Block[]
|
|
435
435
|
checked?: boolean // present only in task lists
|
|
436
|
+
/** Extended task state. Omitted for ordinary `[ ]` / `[x]` items for backwards compatibility. */
|
|
437
|
+
state?: TaskState
|
|
436
438
|
/** The item's marker as written (`*`, `3.`), when it isn't the one its list's pattern gives it. */
|
|
437
439
|
marker?: string
|
|
438
440
|
/** Spaces between the marker and the content (default 1). */
|
|
@@ -443,6 +445,8 @@ export interface ListItemNode extends ContainerSpacing {
|
|
|
443
445
|
checkMark?: "X"
|
|
444
446
|
}
|
|
445
447
|
|
|
448
|
+
export type TaskState = "pending" | "in-progress" | "implemented" | "blocked" | "parked" | "refuted" | "verified" | "cancelled"
|
|
449
|
+
|
|
446
450
|
export interface ListNode extends BlockSpacing {
|
|
447
451
|
type: "list"
|
|
448
452
|
ordered: boolean
|
|
@@ -563,9 +567,21 @@ export type Block =
|
|
|
563
567
|
| DefinitionNode
|
|
564
568
|
| RawNode
|
|
565
569
|
|
|
570
|
+
/** YAML frontmatter, kept separately from the document body. Comments, key order and quoting survive edits. */
|
|
571
|
+
export interface DocumentPropertiesNode {
|
|
572
|
+
/** YAML between the delimiters, using the document's normalized line endings. */
|
|
573
|
+
yaml: string
|
|
574
|
+
/** Opening delimiter as written (including an optional BOM). Defaults to `---`. */
|
|
575
|
+
opening?: string
|
|
576
|
+
/** Closing delimiter as written (`---` or `...`). Defaults to `---`. */
|
|
577
|
+
closing?: string
|
|
578
|
+
}
|
|
579
|
+
|
|
566
580
|
export interface DocumentNode {
|
|
567
581
|
type: "doc"
|
|
568
582
|
children: Block[]
|
|
583
|
+
/** First-party document properties from YAML frontmatter. */
|
|
584
|
+
properties?: DocumentPropertiesNode
|
|
569
585
|
/** Footnote citation definitions, in definition order. */
|
|
570
586
|
citations?: CitationDef[]
|
|
571
587
|
/** Blank lines before the trailing footnote definitions (default 1). */
|
package/src/gitbook/index.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// Pure GitBook markdown engine (no React, no mermaid/streamdown). Safe to import
|
|
2
2
|
// in non-DOM environments such as a server-side AI agent or a Cloudflare Worker.
|
|
3
3
|
export type * from "./ast"
|
|
4
|
+
export { TASK_STATES, getTaskState, taskMarker, taskStateFromMarker } from "./tasks"
|
|
5
|
+
export { readDocumentProperties, removeDocumentProperty, setDocumentProperty } from "./properties"
|
|
6
|
+
export type { DocumentPropertyValue, ParsedDocumentProperties } from "./properties"
|
|
4
7
|
export { escapeAttr, unescapeAttr } from "./attrs"
|
|
5
8
|
export { closesFence, demoBody, fenceOpener, fenceTracker, parseDemoVariants, parseMarkdown, parseBlocks, trimPartialInlineToken } from "./parse"
|
|
6
9
|
export { fenceFor, serializeBlocks, serializeDemoFile, serializeMarkdown } from "./serialize"
|
package/src/gitbook/parse.ts
CHANGED
|
@@ -36,6 +36,7 @@ import type {
|
|
|
36
36
|
import { TAG_ATTRS, parseAttrs } from "./attrs"
|
|
37
37
|
import { containerTags, defaultDelimiterRow, definitionLine, delimiterAlign, fenceInfo, figureMarkdown, serializeBlocks, type TaggedNode } from "./serialize"
|
|
38
38
|
import { footnoteDefinitions, normalizeLabel, parseInline, plainText, refDefinitions } from "./inline"
|
|
39
|
+
import { taskStateFromMarker } from "./tasks"
|
|
39
40
|
|
|
40
41
|
// Minimal HTML-inline → markdown-inline bridge for HTML table cells.
|
|
41
42
|
function htmlToInlineMd(html: string): string {
|
|
@@ -256,7 +257,15 @@ export function footnoteLine(id: string, url: string, label?: string): string {
|
|
|
256
257
|
export function parseMarkdown(src: string): DocumentNode {
|
|
257
258
|
// Windows line endings throughout come back as such; mixed ones stay in the lines as written.
|
|
258
259
|
const crlf = src.includes("\r\n") && !/(^|[^\r])\n/.test(src)
|
|
259
|
-
|
|
260
|
+
let lines = src.split(crlf || !src.includes("\r\n") ? /\r?\n/ : "\n")
|
|
261
|
+
let properties: DocumentNode["properties"]
|
|
262
|
+
if (/^\uFEFF?---[ \t]*$/.test(lines[0])) {
|
|
263
|
+
const closing = lines.findIndex((line, index) => index > 0 && /^(?:---|\.\.\.)[ \t]*$/.test(line))
|
|
264
|
+
if (closing > 0) {
|
|
265
|
+
properties = { yaml: lines.slice(1, closing).join("\n"), opening: lines[0], closing: lines[closing] }
|
|
266
|
+
lines = lines.slice(closing + 1)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
260
269
|
refDefinitions.clear()
|
|
261
270
|
footnoteDefinitions.clear()
|
|
262
271
|
const fences = fenceTracker()
|
|
@@ -289,6 +298,7 @@ export function parseMarkdown(src: string): DocumentNode {
|
|
|
289
298
|
const trailing = group <= last
|
|
290
299
|
const { blocks, end } = parseBody(trailing ? lines.slice(0, group) : lines)
|
|
291
300
|
const doc: DocumentNode = { type: "doc", children: blocks }
|
|
301
|
+
if (properties) doc.properties = properties
|
|
292
302
|
if (footnoteDefinitions.size) {
|
|
293
303
|
doc.citations = [...footnoteDefinitions.entries()].map(([id, d]) => ({ id, ...d }))
|
|
294
304
|
}
|
|
@@ -1117,10 +1127,10 @@ function parseList(lines: string[], start: number): ParsedList {
|
|
|
1117
1127
|
let content = m[4]
|
|
1118
1128
|
let checked: boolean | undefined
|
|
1119
1129
|
let checkMark: string | undefined
|
|
1120
|
-
const taskMatch = content.match(/^\[([ xX])\]\s+(.*)$/)
|
|
1130
|
+
const taskMatch = content.match(/^\[([ xX~?bd!\-])\]\s+(.*)$/)
|
|
1121
1131
|
if (taskMatch) {
|
|
1122
1132
|
list.task = true
|
|
1123
|
-
checked = taskMatch[1]
|
|
1133
|
+
checked = /[xX]/.test(taskMatch[1])
|
|
1124
1134
|
checkMark = taskMatch[1]
|
|
1125
1135
|
content = taskMatch[2]
|
|
1126
1136
|
}
|
|
@@ -1158,6 +1168,8 @@ function parseList(lines: string[], start: number): ParsedList {
|
|
|
1158
1168
|
const para: Block = { type: "paragraph", children: parseInline(content) }
|
|
1159
1169
|
const children: Block[] = body.length ? [para, ...parseBlocks(body)] : [para]
|
|
1160
1170
|
const item: ListItemNode = checked === undefined ? { type: "listItem", children } : { type: "listItem", children, checked }
|
|
1171
|
+
const state = checkMark === undefined ? undefined : taskStateFromMarker(checkMark)
|
|
1172
|
+
if (state && state !== "pending" && state !== "verified") item.state = state
|
|
1161
1173
|
const expected = ordered ? `${(list.start ?? 1) + items.length}${list.delimiter ?? "."}` : (list.bullet ?? "-")
|
|
1162
1174
|
if (m[2] !== expected) item.marker = m[2]
|
|
1163
1175
|
if (m[3].length !== 1) item.pad = m[3].length
|