markdown-flow-ui 0.2.10 → 0.2.11
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/_virtual/index.cjs3.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es3.js +4 -5
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +5 -4
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.js +2 -0
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.js.map +1 -0
- package/dist/components/MarkdownFlow/ScrollToBottomButton.d.ts +8 -0
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js +28 -0
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs.js +2 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.cjs.js.map +1 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js +68 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.es.js.map +1 -0
- package/dist/components/MarkdownFlow/index.cjs.js +1 -1
- package/dist/components/MarkdownFlow/index.d.ts +4 -1
- package/dist/components/MarkdownFlow/index.es.js +1 -0
- package/dist/components/MarkdownFlow/index.es.js.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.js +2 -0
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.js.map +1 -0
- package/dist/components/MarkdownFlow/useScrollToBottom.d.ts +20 -8
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js +101 -0
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -0
- package/dist/components/MarkdownFlow/useScrollToBottom.test.d.ts +1 -0
- package/dist/components/index.d.ts +4 -1
- package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +21 -19
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/classnames/index.cjs.js +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.es.js +13 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.es.js.map +1 -0
- package/dist/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.cjs.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs.js +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.d.ts +5 -2
- package/dist/renderer.es.js +19 -17
- package/dist/renderer.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),c=require("react-dom"),i=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js"),u=({visible:n,ariaLabel:l,portalTarget:t,className:s="",...e})=>{if(!n)return null;const o=r.jsxRuntimeExports.jsx("button",{...e,type:e.type||"button",className:`scroll-to-bottom-btn ${s}`.trim(),"aria-label":l,children:r.jsxRuntimeExports.jsx(i.default,{"aria-hidden":"true",focusable:"false"})});return t?c.createPortal(o,t):o};exports.ScrollToBottomButton=u;exports.default=u;
|
|
2
|
+
//# sourceMappingURL=ScrollToBottomButton.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollToBottomButton.cjs.js","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown } from \"lucide-react\";\n\nexport interface ScrollToBottomButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n visible: boolean;\n ariaLabel: string;\n portalTarget?: HTMLElement | null;\n}\n\nexport const ScrollToBottomButton: React.FC<ScrollToBottomButtonProps> = ({\n visible,\n ariaLabel,\n portalTarget,\n className = \"\",\n ...props\n}) => {\n if (!visible) return null;\n const button = (\n <button\n {...props}\n type={props.type || \"button\"}\n className={`scroll-to-bottom-btn ${className}`.trim()}\n aria-label={ariaLabel}\n >\n <ChevronDown aria-hidden=\"true\" focusable=\"false\" />\n </button>\n );\n return portalTarget ? createPortal(button, portalTarget) : button;\n};\n\nexport default ScrollToBottomButton;\n"],"names":["ScrollToBottomButton","visible","ariaLabel","portalTarget","className","props","button","jsx","ChevronDown","createPortal"],"mappings":"wQAWaA,EAA4D,CAAC,CACxE,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,UAAAC,EAAY,GACZ,GAAGC,CACL,IAAM,CACJ,GAAI,CAACJ,EAAS,OAAO,KACrB,MAAMK,EACJC,EAAAA,kBAAAA,IAAC,SAAA,CACE,GAAGF,EACJ,KAAMA,EAAM,MAAQ,SACpB,UAAW,wBAAwBD,CAAS,GAAG,KAAA,EAC/C,aAAYF,EAEZ,SAAAK,EAAAA,kBAAAA,IAACC,UAAA,CAAY,cAAY,OAAO,UAAU,OAAA,CAAQ,CAAA,CAAA,EAGtD,OAAOL,EAAeM,EAAAA,aAAaH,EAAQH,CAAY,EAAIG,CAC7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface ScrollToBottomButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
3
|
+
visible: boolean;
|
|
4
|
+
ariaLabel: string;
|
|
5
|
+
portalTarget?: HTMLElement | null;
|
|
6
|
+
}
|
|
7
|
+
export declare const ScrollToBottomButton: React.FC<ScrollToBottomButtonProps>;
|
|
8
|
+
export default ScrollToBottomButton;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { j as e } from "../../_virtual/jsx-runtime.es.js";
|
|
2
|
+
import { createPortal as s } from "react-dom";
|
|
3
|
+
import m from "../../node_modules/lucide-react/dist/esm/icons/chevron-down.es.js";
|
|
4
|
+
const b = ({
|
|
5
|
+
visible: n,
|
|
6
|
+
ariaLabel: l,
|
|
7
|
+
portalTarget: t,
|
|
8
|
+
className: a = "",
|
|
9
|
+
...o
|
|
10
|
+
}) => {
|
|
11
|
+
if (!n) return null;
|
|
12
|
+
const r = /* @__PURE__ */ e.jsx(
|
|
13
|
+
"button",
|
|
14
|
+
{
|
|
15
|
+
...o,
|
|
16
|
+
type: o.type || "button",
|
|
17
|
+
className: `scroll-to-bottom-btn ${a}`.trim(),
|
|
18
|
+
"aria-label": l,
|
|
19
|
+
children: /* @__PURE__ */ e.jsx(m, { "aria-hidden": "true", focusable: "false" })
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
return t ? s(r, t) : r;
|
|
23
|
+
};
|
|
24
|
+
export {
|
|
25
|
+
b as ScrollToBottomButton,
|
|
26
|
+
b as default
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ScrollToBottomButton.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollToBottomButton.es.js","sources":["../../../src/components/MarkdownFlow/ScrollToBottomButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ChevronDown } from \"lucide-react\";\n\nexport interface ScrollToBottomButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n visible: boolean;\n ariaLabel: string;\n portalTarget?: HTMLElement | null;\n}\n\nexport const ScrollToBottomButton: React.FC<ScrollToBottomButtonProps> = ({\n visible,\n ariaLabel,\n portalTarget,\n className = \"\",\n ...props\n}) => {\n if (!visible) return null;\n const button = (\n <button\n {...props}\n type={props.type || \"button\"}\n className={`scroll-to-bottom-btn ${className}`.trim()}\n aria-label={ariaLabel}\n >\n <ChevronDown aria-hidden=\"true\" focusable=\"false\" />\n </button>\n );\n return portalTarget ? createPortal(button, portalTarget) : button;\n};\n\nexport default ScrollToBottomButton;\n"],"names":["ScrollToBottomButton","visible","ariaLabel","portalTarget","className","props","button","jsx","ChevronDown","createPortal"],"mappings":";;;AAWO,MAAMA,IAA4D,CAAC;AAAA,EACxE,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,MAAI,CAACJ,EAAS,QAAO;AACrB,QAAMK,IACJC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGF;AAAA,MACJ,MAAMA,EAAM,QAAQ;AAAA,MACpB,WAAW,wBAAwBD,CAAS,GAAG,KAAA;AAAA,MAC/C,cAAYF;AAAA,MAEZ,UAAAK,gBAAAA,EAAAA,IAACC,GAAA,EAAY,eAAY,QAAO,WAAU,QAAA,CAAQ;AAAA,IAAA;AAAA,EAAA;AAGtD,SAAOL,IAAeM,EAAaH,GAAQH,CAAY,IAAIG;AAC7D;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("../../_virtual/jsx-runtime.cjs.js"),b=require("react"),v=require("./MarkdownFlow.cjs.js"),f=require("./useScrollToBottom.cjs.js"),h=require("./ScrollToBottomButton.cjs.js"),q=require("../ContentRender/contentRenderI18n.cjs.js");;/* empty css */const w=({initialContentList:e=[],customRenderBar:n,onSend:c,height:u="100%",className:i="",locale:t,confirmButtonText:a,copyButtonText:d,copiedButtonText:m,beforeSend:x,interactionDefaultValueOptions:T,scrollToBottomAriaLabel:j,...r})=>{const l=b.useRef(null),B=q.getContentRenderLocaleTexts(t),R=j||B.scrollToBottomLabel,{showScrollToBottom:s,scrollToBottom:S}=f.useScrollToBottom(l,{contentVersion:e,autoScrollOnInit:!0,scrollThreshold:150});return o.jsxRuntimeExports.jsxs("div",{className:`scrollable-markdown-container ${i}`,style:{height:u,position:"relative"},...r,children:[o.jsxRuntimeExports.jsx("div",{ref:l,style:{height:"100%",overflow:"auto"},children:o.jsxRuntimeExports.jsx(v.default,{...r,initialContentList:e,customRenderBar:n,onSend:c,locale:t,confirmButtonText:a,copyButtonText:d,copiedButtonText:m,beforeSend:x,interactionDefaultValueOptions:T})}),s&&o.jsxRuntimeExports.jsx(h.ScrollToBottomButton,{visible:s,onClick:()=>S(),ariaLabel:R})]})};exports.default=w;
|
|
2
|
+
//# sourceMappingURL=ScrollableMarkdownFlow.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableMarkdownFlow.cjs.js","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow from \"./MarkdownFlow\";\nimport useScrollToBottom from \"./useScrollToBottom\";\n// import type { OnSendContentParams, CustomRenderBarProps } from \"../types\";\nimport ScrollToBottomButton from \"./ScrollToBottomButton\";\nimport type { MarkdownFlowProps } from \"./MarkdownFlow\";\nimport { getContentRenderLocaleTexts } from \"../ContentRender/contentRenderI18n\";\n\nimport \"./markdownFlow.css\";\n\nexport interface ScrollableMarkdownFlowProps extends MarkdownFlowProps {\n height?: string | number;\n className?: string;\n scrollToBottomAriaLabel?: string;\n}\n\nconst ScrollableMarkdownFlow: React.FC<ScrollableMarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend,\n height = \"100%\",\n className = \"\",\n locale,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend,\n interactionDefaultValueOptions,\n scrollToBottomAriaLabel,\n ...restProps\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedScrollToBottomAriaLabel =\n scrollToBottomAriaLabel || localeTexts.scrollToBottomLabel;\n\n const { showScrollToBottom, scrollToBottom } = useScrollToBottom(\n containerRef,\n {\n contentVersion: initialContentList,\n autoScrollOnInit: true,\n scrollThreshold: 150,\n }\n );\n\n return (\n <div\n className={`scrollable-markdown-container ${className}`}\n style={{ height, position: \"relative\" }}\n {...restProps}\n >\n <div ref={containerRef} style={{ height: \"100%\", overflow: \"auto\" }}>\n <MarkdownFlow\n {...restProps}\n initialContentList={initialContentList}\n customRenderBar={customRenderBar}\n onSend={onSend}\n locale={locale}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n beforeSend={beforeSend}\n interactionDefaultValueOptions={interactionDefaultValueOptions}\n />\n </div>\n {showScrollToBottom && (\n <ScrollToBottomButton\n visible={showScrollToBottom}\n onClick={() => scrollToBottom()}\n ariaLabel={resolvedScrollToBottomAriaLabel}\n />\n )}\n </div>\n );\n};\n\nexport default ScrollableMarkdownFlow;\n"],"names":["ScrollableMarkdownFlow","initialContentList","customRenderBar","onSend","height","className","locale","confirmButtonText","copyButtonText","copiedButtonText","beforeSend","interactionDefaultValueOptions","scrollToBottomAriaLabel","restProps","containerRef","useRef","localeTexts","getContentRenderLocaleTexts","resolvedScrollToBottomAriaLabel","showScrollToBottom","scrollToBottom","useScrollToBottom","jsxs","jsx","MarkdownFlow","ScrollToBottomButton"],"mappings":"sYAgBA,MAAMA,EAAgE,CAAC,CACrE,mBAAAC,EAAqB,CAAA,EACrB,gBAAAC,EACA,OAAAC,EACA,OAAAC,EAAS,OACT,UAAAC,EAAY,GACZ,OAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,+BAAAC,EACA,wBAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAeC,EAAAA,OAAuB,IAAI,EAC1CC,EAAcC,EAAAA,4BAA4BX,CAAM,EAChDY,EACJN,GAA2BI,EAAY,oBAEnC,CAAE,mBAAAG,EAAoB,eAAAC,CAAA,EAAmBC,EAAAA,kBAC7CP,EACA,CACE,eAAgBb,EAChB,iBAAkB,GAClB,gBAAiB,GAAA,CACnB,EAGF,OACEqB,EAAAA,kBAAAA,KAAC,MAAA,CACC,UAAW,iCAAiCjB,CAAS,GACrD,MAAO,CAAE,OAAAD,EAAQ,SAAU,UAAA,EAC1B,GAAGS,EAEJ,SAAA,CAAAU,EAAAA,kBAAAA,IAAC,MAAA,CAAI,IAAKT,EAAc,MAAO,CAAE,OAAQ,OAAQ,SAAU,MAAA,EACzD,SAAAS,EAAAA,kBAAAA,IAACC,EAAAA,QAAA,CACE,GAAGX,EACJ,mBAAAZ,EACA,gBAAAC,EACA,OAAAC,EACA,OAAAG,EACA,kBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,WAAAC,EACA,+BAAAC,CAAA,CAAA,EAEJ,EACCQ,GACCI,EAAAA,kBAAAA,IAACE,EAAAA,qBAAA,CACC,QAASN,EACT,QAAS,IAAMC,EAAA,EACf,UAAWF,CAAA,CAAA,CACb,CAAA,CAAA,CAIR"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { j as o } from "../../_virtual/jsx-runtime.es.js";
|
|
2
|
+
import { useRef as B } from "react";
|
|
3
|
+
import b from "./MarkdownFlow.es.js";
|
|
4
|
+
import { useScrollToBottom as j } from "./useScrollToBottom.es.js";
|
|
5
|
+
import { ScrollToBottomButton as v } from "./ScrollToBottomButton.es.js";
|
|
6
|
+
import { getContentRenderLocaleTexts as S } from "../ContentRender/contentRenderI18n.es.js";
|
|
7
|
+
/* empty css */
|
|
8
|
+
const A = ({
|
|
9
|
+
initialContentList: t = [],
|
|
10
|
+
customRenderBar: n,
|
|
11
|
+
onSend: c,
|
|
12
|
+
height: m = "100%",
|
|
13
|
+
className: a = "",
|
|
14
|
+
locale: r,
|
|
15
|
+
confirmButtonText: i,
|
|
16
|
+
copyButtonText: d,
|
|
17
|
+
copiedButtonText: f,
|
|
18
|
+
beforeSend: u,
|
|
19
|
+
interactionDefaultValueOptions: p,
|
|
20
|
+
scrollToBottomAriaLabel: x,
|
|
21
|
+
...l
|
|
22
|
+
}) => {
|
|
23
|
+
const e = B(null), T = S(r), h = x || T.scrollToBottomLabel, { showScrollToBottom: s, scrollToBottom: w } = j(
|
|
24
|
+
e,
|
|
25
|
+
{
|
|
26
|
+
contentVersion: t,
|
|
27
|
+
autoScrollOnInit: !0,
|
|
28
|
+
scrollThreshold: 150
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
return /* @__PURE__ */ o.jsxs(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
className: `scrollable-markdown-container ${a}`,
|
|
35
|
+
style: { height: m, position: "relative" },
|
|
36
|
+
...l,
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ o.jsx("div", { ref: e, style: { height: "100%", overflow: "auto" }, children: /* @__PURE__ */ o.jsx(
|
|
39
|
+
b,
|
|
40
|
+
{
|
|
41
|
+
...l,
|
|
42
|
+
initialContentList: t,
|
|
43
|
+
customRenderBar: n,
|
|
44
|
+
onSend: c,
|
|
45
|
+
locale: r,
|
|
46
|
+
confirmButtonText: i,
|
|
47
|
+
copyButtonText: d,
|
|
48
|
+
copiedButtonText: f,
|
|
49
|
+
beforeSend: u,
|
|
50
|
+
interactionDefaultValueOptions: p
|
|
51
|
+
}
|
|
52
|
+
) }),
|
|
53
|
+
s && /* @__PURE__ */ o.jsx(
|
|
54
|
+
v,
|
|
55
|
+
{
|
|
56
|
+
visible: s,
|
|
57
|
+
onClick: () => w(),
|
|
58
|
+
ariaLabel: h
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
export {
|
|
66
|
+
A as default
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=ScrollableMarkdownFlow.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableMarkdownFlow.es.js","sources":["../../../src/components/MarkdownFlow/ScrollableMarkdownFlow.tsx"],"sourcesContent":["import React, { useRef } from \"react\";\nimport MarkdownFlow from \"./MarkdownFlow\";\nimport useScrollToBottom from \"./useScrollToBottom\";\n// import type { OnSendContentParams, CustomRenderBarProps } from \"../types\";\nimport ScrollToBottomButton from \"./ScrollToBottomButton\";\nimport type { MarkdownFlowProps } from \"./MarkdownFlow\";\nimport { getContentRenderLocaleTexts } from \"../ContentRender/contentRenderI18n\";\n\nimport \"./markdownFlow.css\";\n\nexport interface ScrollableMarkdownFlowProps extends MarkdownFlowProps {\n height?: string | number;\n className?: string;\n scrollToBottomAriaLabel?: string;\n}\n\nconst ScrollableMarkdownFlow: React.FC<ScrollableMarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend,\n height = \"100%\",\n className = \"\",\n locale,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend,\n interactionDefaultValueOptions,\n scrollToBottomAriaLabel,\n ...restProps\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedScrollToBottomAriaLabel =\n scrollToBottomAriaLabel || localeTexts.scrollToBottomLabel;\n\n const { showScrollToBottom, scrollToBottom } = useScrollToBottom(\n containerRef,\n {\n contentVersion: initialContentList,\n autoScrollOnInit: true,\n scrollThreshold: 150,\n }\n );\n\n return (\n <div\n className={`scrollable-markdown-container ${className}`}\n style={{ height, position: \"relative\" }}\n {...restProps}\n >\n <div ref={containerRef} style={{ height: \"100%\", overflow: \"auto\" }}>\n <MarkdownFlow\n {...restProps}\n initialContentList={initialContentList}\n customRenderBar={customRenderBar}\n onSend={onSend}\n locale={locale}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n beforeSend={beforeSend}\n interactionDefaultValueOptions={interactionDefaultValueOptions}\n />\n </div>\n {showScrollToBottom && (\n <ScrollToBottomButton\n visible={showScrollToBottom}\n onClick={() => scrollToBottom()}\n ariaLabel={resolvedScrollToBottomAriaLabel}\n />\n )}\n </div>\n );\n};\n\nexport default ScrollableMarkdownFlow;\n"],"names":["ScrollableMarkdownFlow","initialContentList","customRenderBar","onSend","height","className","locale","confirmButtonText","copyButtonText","copiedButtonText","beforeSend","interactionDefaultValueOptions","scrollToBottomAriaLabel","restProps","containerRef","useRef","localeTexts","getContentRenderLocaleTexts","resolvedScrollToBottomAriaLabel","showScrollToBottom","scrollToBottom","useScrollToBottom","jsxs","jsx","MarkdownFlow","ScrollToBottomButton"],"mappings":";;;;;;;AAgBA,MAAMA,IAAgE,CAAC;AAAA,EACrE,oBAAAC,IAAqB,CAAA;AAAA,EACrB,iBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,WAAAC,IAAY;AAAA,EACZ,QAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,gCAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAcC,EAA4BX,CAAM,GAChDY,IACJN,KAA2BI,EAAY,qBAEnC,EAAE,oBAAAG,GAAoB,gBAAAC,EAAA,IAAmBC;AAAA,IAC7CP;AAAA,IACA;AAAA,MACE,gBAAgBb;AAAA,MAChB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IAAA;AAAA,EACnB;AAGF,SACEqB,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,iCAAiCjB,CAAS;AAAA,MACrD,OAAO,EAAE,QAAAD,GAAQ,UAAU,WAAA;AAAA,MAC1B,GAAGS;AAAA,MAEJ,UAAA;AAAA,QAAAU,gBAAAA,EAAAA,IAAC,OAAA,EAAI,KAAKT,GAAc,OAAO,EAAE,QAAQ,QAAQ,UAAU,OAAA,GACzD,UAAAS,gBAAAA,EAAAA;AAAAA,UAACC;AAAA,UAAA;AAAA,YACE,GAAGX;AAAA,YACJ,oBAAAZ;AAAA,YACA,iBAAAC;AAAA,YACA,QAAAC;AAAA,YACA,QAAAG;AAAA,YACA,mBAAAC;AAAA,YACA,gBAAAC;AAAA,YACA,kBAAAC;AAAA,YACA,YAAAC;AAAA,YACA,gCAAAC;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,QACCQ,KACCI,gBAAAA,EAAAA;AAAAA,UAACE;AAAA,UAAA;AAAA,YACC,SAASN;AAAA,YACT,SAAS,MAAMC,EAAA;AAAA,YACf,WAAWF;AAAA,UAAA;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./MarkdownFlow.cjs.js");require("../../_virtual/jsx-runtime.cjs.js");require("react");require("../ContentRender/contentRenderI18n.cjs.js");;/* empty css */exports.MarkdownFlow=e.default;exports.default=e.default;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./MarkdownFlow.cjs.js");require("../../_virtual/jsx-runtime.cjs.js");require("react");require("react-dom");require("../ContentRender/contentRenderI18n.cjs.js");;/* empty css */exports.MarkdownFlow=e.default;exports.default=e.default;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { default as MarkdownFlow } from './MarkdownFlow';
|
|
2
2
|
import { default as ScrollableMarkdownFlow } from './ScrollableMarkdownFlow';
|
|
3
|
+
import { default as ScrollToBottomButton } from './ScrollToBottomButton';
|
|
3
4
|
export default MarkdownFlow;
|
|
4
|
-
export { MarkdownFlow, ScrollableMarkdownFlow };
|
|
5
|
+
export { MarkdownFlow, ScrollableMarkdownFlow, ScrollToBottomButton };
|
|
6
|
+
export { default as useScrollToBottom } from './useScrollToBottom';
|
|
7
|
+
export type { ScrollTarget, ScrollTargetRef, UseScrollToBottomOptions, UseScrollToBottomReturn, } from './useScrollToBottom';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("react"),p=e=>typeof Window<"u"&&e instanceof Window,y=e=>typeof Document<"u"&&e instanceof Document,B=e=>{const n=p(e)?e.document:e;return n.scrollingElement||n.documentElement},h=e=>{if(p(e)||y(e)){const n=B(e),t=p(e)?e.innerHeight:n?.clientHeight||0;return{scrollTop:n?.scrollTop||0,scrollHeight:n?.scrollHeight||0,clientHeight:t}}return{scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight}},F=e=>e?"current"in e?e.current:e:null,R=e=>{const n=typeof window<"u"?window.getComputedStyle(e):null,t=n?.overflowY||n?.overflow;return e.scrollHeight>e.clientHeight&&t!=="visible"},v=(e,n)=>{const t=F(n);if(t)return t;const l=e?.current;if(!l)return null;if(R(l))return l;let s=l.parentElement;for(;s;){if(R(s))return s;s=s.parentElement}return typeof window<"u"?window:null},A=(e,n={})=>{const{contentRef:t=e,scrollTarget:l,scrollThreshold:s=150,contentVersion:C,followNewContent:g=!0,autoScrollOnInit:T=!1,behavior:S="smooth"}=n,[M,H]=u.useState(!1),[z,b]=u.useState(!0),a=u.useRef(g),E=u.useRef(!1),d=u.useRef(null),m=u.useCallback(()=>{const o=v(t,l);if(!o)return;const{scrollTop:r,scrollHeight:f,clientHeight:i}=h(o),c=r+i>=f-s;b(c),H(!c&&f>i),c&&(a.current=!0)},[t,l,s]),w=u.useCallback((o=S)=>{const r=v(t,l);if(!r)return;const f=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches,i=o==="smooth"&&f?"auto":o,c=h(r).scrollHeight;p(r)?r.scrollTo({top:c,behavior:i}):y(r)?B(r)?.scrollTo({top:c,behavior:i}):r.scrollTo({top:c,behavior:i}),a.current=!0,b(!0),H(!1)},[S,t,l]);return u.useEffect(()=>{const o=v(t,l);if(!o)return;const r=()=>{d.current!==null&&cancelAnimationFrame(d.current),d.current=requestAnimationFrame(()=>{d.current=null;const c=h(o);c.scrollTop+c.clientHeight<c.scrollHeight-s&&(a.current=!1),m()})},f=()=>r();o.addEventListener("scroll",r,{passive:!0}),window.addEventListener("resize",f);const i=typeof ResizeObserver<"u"?new ResizeObserver(f):null;return t.current&&i?.observe(t.current),typeof Element<"u"&&o instanceof Element&&o!==t.current&&i?.observe(o),m(),()=>{o.removeEventListener("scroll",r),window.removeEventListener("resize",f),i?.disconnect(),d.current!==null&&cancelAnimationFrame(d.current)}},[t,m,l,s]),u.useEffect(()=>{if(!E.current){E.current=!0,T&&w("auto");return}if(a.current){const o=requestAnimationFrame(()=>w("auto"));return()=>cancelAnimationFrame(o)}m()},[T,C,m,w]),u.useEffect(()=>{a.current=g},[g]),{showScrollToBottom:M,isAtBottom:z,followNewContent:a.current,scrollToBottom:w,refresh:m}};exports.default=A;exports.getScrollMetrics=h;exports.resolveScrollTarget=v;exports.useScrollToBottom=A;
|
|
2
|
+
//# sourceMappingURL=useScrollToBottom.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollToBottom.cjs.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\n\nexport interface UseScrollToBottomOptions {\n contentRef?: RefObject<HTMLElement | null>;\n scrollTarget?: ScrollTarget | ScrollTargetRef | null;\n scrollThreshold?: number;\n contentVersion?: unknown;\n followNewContent?: boolean;\n autoScrollOnInit?: boolean;\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n refresh: () => void;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n typeof Window !== \"undefined\" && target instanceof Window;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n typeof Document !== \"undefined\" && target instanceof Document;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget) => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nconst scrollTargetValue = (\n target: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n return \"current\" in target ? target.current : target;\n};\n\nconst isScrollable = (element: HTMLElement) => {\n const style =\n typeof window !== \"undefined\" ? window.getComputedStyle(element) : null;\n const overflow = style?.overflowY || style?.overflow;\n return element.scrollHeight > element.clientHeight && overflow !== \"visible\";\n};\n\nexport const resolveScrollTarget = (\n contentRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicit) return explicit;\n const content = contentRef?.current;\n if (!content) return null;\n if (isScrollable(content)) return content;\n let parent = content.parentElement;\n while (parent) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n return typeof window !== \"undefined\" ? window : null;\n};\n\nexport const useScrollToBottom = (\n containerRef: RefObject<HTMLElement | null>,\n options: UseScrollToBottomOptions = {}\n): UseScrollToBottomReturn => {\n const {\n contentRef = containerRef,\n scrollTarget,\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const followingRef = useRef(followNewContentOption);\n const mountedRef = useRef(false);\n const frameRef = useRef<number | null>(null);\n\n const refresh = useCallback(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const { scrollTop, scrollHeight, clientHeight } = getScrollMetrics(target);\n const atBottom = scrollTop + clientHeight >= scrollHeight - scrollThreshold;\n setIsAtBottom(atBottom);\n setShowScrollToBottom(!atBottom && scrollHeight > clientHeight);\n if (atBottom) followingRef.current = true;\n }, [contentRef, scrollTarget, scrollThreshold]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const reducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const actualBehavior =\n requestedBehavior === \"smooth\" && reducedMotion\n ? \"auto\"\n : requestedBehavior;\n const top = getScrollMetrics(target).scrollHeight;\n if (isWindow(target)) {\n target.scrollTo({ top, behavior: actualBehavior });\n } else if (isDocument(target)) {\n getDocumentScroller(target)?.scrollTo({\n top,\n behavior: actualBehavior,\n });\n } else {\n target.scrollTo({ top, behavior: actualBehavior });\n }\n followingRef.current = true;\n setIsAtBottom(true);\n setShowScrollToBottom(false);\n },\n [behavior, contentRef, scrollTarget]\n );\n\n useEffect(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const handleScroll = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n const metrics = getScrollMetrics(target);\n if (\n metrics.scrollTop + metrics.clientHeight <\n metrics.scrollHeight - scrollThreshold\n ) {\n followingRef.current = false;\n }\n refresh();\n });\n };\n const handleResize = () => handleScroll();\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleResize);\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(handleResize)\n : null;\n if (contentRef.current) observer?.observe(contentRef.current);\n if (\n typeof Element !== \"undefined\" &&\n target instanceof Element &&\n target !== contentRef.current\n ) {\n observer?.observe(target);\n }\n refresh();\n return () => {\n target.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleResize);\n observer?.disconnect();\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [contentRef, refresh, scrollTarget, scrollThreshold]);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (autoScrollOnInit) scrollToBottom(\"auto\");\n return;\n }\n if (followingRef.current) {\n const frame = requestAnimationFrame(() => scrollToBottom(\"auto\"));\n return () => cancelAnimationFrame(frame);\n }\n refresh();\n }, [autoScrollOnInit, contentVersion, refresh, scrollToBottom]);\n\n useEffect(() => {\n followingRef.current = followNewContentOption;\n }, [followNewContentOption]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: followingRef.current,\n scrollToBottom,\n refresh,\n };\n};\n\nexport default useScrollToBottom;\n"],"names":["isWindow","target","isDocument","getDocumentScroller","document","getScrollMetrics","scroller","viewportHeight","scrollTargetValue","isScrollable","element","style","overflow","resolveScrollTarget","contentRef","explicitTarget","explicit","content","parent","useScrollToBottom","containerRef","options","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","isAtBottom","setIsAtBottom","followingRef","useRef","mountedRef","frameRef","refresh","useCallback","scrollTop","scrollHeight","clientHeight","atBottom","scrollToBottom","requestedBehavior","reducedMotion","actualBehavior","top","useEffect","handleScroll","metrics","handleResize","observer","frame"],"mappings":"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"}
|
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
export type ScrollBehavior = "smooth" | "auto";
|
|
3
|
+
export type ScrollTarget = HTMLElement | Document | Window;
|
|
4
|
+
export type ScrollTargetRef = RefObject<ScrollTarget | null>;
|
|
5
|
+
export interface UseScrollToBottomOptions {
|
|
6
|
+
contentRef?: RefObject<HTMLElement | null>;
|
|
7
|
+
scrollTarget?: ScrollTarget | ScrollTargetRef | null;
|
|
6
8
|
scrollThreshold?: number;
|
|
9
|
+
contentVersion?: unknown;
|
|
10
|
+
followNewContent?: boolean;
|
|
11
|
+
autoScrollOnInit?: boolean;
|
|
12
|
+
behavior?: ScrollBehavior;
|
|
7
13
|
}
|
|
8
|
-
interface UseScrollToBottomReturn {
|
|
14
|
+
export interface UseScrollToBottomReturn {
|
|
9
15
|
showScrollToBottom: boolean;
|
|
10
|
-
scrollToBottom: () => void;
|
|
11
|
-
handleUserScrollToBottom: () => void;
|
|
12
16
|
isAtBottom: boolean;
|
|
13
17
|
followNewContent: boolean;
|
|
18
|
+
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
19
|
+
refresh: () => void;
|
|
14
20
|
}
|
|
15
|
-
declare const
|
|
21
|
+
export declare const getScrollMetrics: (target: ScrollTarget) => {
|
|
22
|
+
scrollTop: number;
|
|
23
|
+
scrollHeight: number;
|
|
24
|
+
clientHeight: number;
|
|
25
|
+
};
|
|
26
|
+
export declare const resolveScrollTarget: (contentRef: RefObject<HTMLElement | null> | undefined, explicitTarget: ScrollTarget | ScrollTargetRef | null | undefined) => ScrollTarget | null;
|
|
27
|
+
export declare const useScrollToBottom: (containerRef: RefObject<HTMLElement | null>, options?: UseScrollToBottomOptions) => UseScrollToBottomReturn;
|
|
16
28
|
export default useScrollToBottom;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { useState as R, useRef as p, useCallback as A, useEffect as v } from "react";
|
|
2
|
+
const w = (e) => typeof Window < "u" && e instanceof Window, z = (e) => typeof Document < "u" && e instanceof Document, C = (e) => {
|
|
3
|
+
const o = w(e) ? e.document : e;
|
|
4
|
+
return o.scrollingElement || o.documentElement;
|
|
5
|
+
}, H = (e) => {
|
|
6
|
+
if (w(e) || z(e)) {
|
|
7
|
+
const o = C(e), t = w(e) ? e.innerHeight : o?.clientHeight || 0;
|
|
8
|
+
return {
|
|
9
|
+
scrollTop: o?.scrollTop || 0,
|
|
10
|
+
scrollHeight: o?.scrollHeight || 0,
|
|
11
|
+
clientHeight: t
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
scrollTop: e.scrollTop,
|
|
16
|
+
scrollHeight: e.scrollHeight,
|
|
17
|
+
clientHeight: e.clientHeight
|
|
18
|
+
};
|
|
19
|
+
}, O = (e) => e ? "current" in e ? e.current : e : null, B = (e) => {
|
|
20
|
+
const o = typeof window < "u" ? window.getComputedStyle(e) : null, t = o?.overflowY || o?.overflow;
|
|
21
|
+
return e.scrollHeight > e.clientHeight && t !== "visible";
|
|
22
|
+
}, T = (e, o) => {
|
|
23
|
+
const t = O(o);
|
|
24
|
+
if (t) return t;
|
|
25
|
+
const l = e?.current;
|
|
26
|
+
if (!l) return null;
|
|
27
|
+
if (B(l)) return l;
|
|
28
|
+
let s = l.parentElement;
|
|
29
|
+
for (; s; ) {
|
|
30
|
+
if (B(s)) return s;
|
|
31
|
+
s = s.parentElement;
|
|
32
|
+
}
|
|
33
|
+
return typeof window < "u" ? window : null;
|
|
34
|
+
}, N = (e, o = {}) => {
|
|
35
|
+
const {
|
|
36
|
+
contentRef: t = e,
|
|
37
|
+
scrollTarget: l,
|
|
38
|
+
scrollThreshold: s = 150,
|
|
39
|
+
contentVersion: F,
|
|
40
|
+
followNewContent: h = !0,
|
|
41
|
+
autoScrollOnInit: g = !1,
|
|
42
|
+
behavior: b = "smooth"
|
|
43
|
+
} = o, [D, S] = R(!1), [L, E] = R(!0), f = p(h), y = p(!1), a = p(null), d = A(() => {
|
|
44
|
+
const n = T(t, l);
|
|
45
|
+
if (!n) return;
|
|
46
|
+
const { scrollTop: r, scrollHeight: u, clientHeight: i } = H(n), c = r + i >= u - s;
|
|
47
|
+
E(c), S(!c && u > i), c && (f.current = !0);
|
|
48
|
+
}, [t, l, s]), m = A(
|
|
49
|
+
(n = b) => {
|
|
50
|
+
const r = T(t, l);
|
|
51
|
+
if (!r) return;
|
|
52
|
+
const u = typeof window < "u" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches, i = n === "smooth" && u ? "auto" : n, c = H(r).scrollHeight;
|
|
53
|
+
w(r) ? r.scrollTo({ top: c, behavior: i }) : z(r) ? C(r)?.scrollTo({
|
|
54
|
+
top: c,
|
|
55
|
+
behavior: i
|
|
56
|
+
}) : r.scrollTo({ top: c, behavior: i }), f.current = !0, E(!0), S(!1);
|
|
57
|
+
},
|
|
58
|
+
[b, t, l]
|
|
59
|
+
);
|
|
60
|
+
return v(() => {
|
|
61
|
+
const n = T(t, l);
|
|
62
|
+
if (!n) return;
|
|
63
|
+
const r = () => {
|
|
64
|
+
a.current !== null && cancelAnimationFrame(a.current), a.current = requestAnimationFrame(() => {
|
|
65
|
+
a.current = null;
|
|
66
|
+
const c = H(n);
|
|
67
|
+
c.scrollTop + c.clientHeight < c.scrollHeight - s && (f.current = !1), d();
|
|
68
|
+
});
|
|
69
|
+
}, u = () => r();
|
|
70
|
+
n.addEventListener("scroll", r, { passive: !0 }), window.addEventListener("resize", u);
|
|
71
|
+
const i = typeof ResizeObserver < "u" ? new ResizeObserver(u) : null;
|
|
72
|
+
return t.current && i?.observe(t.current), typeof Element < "u" && n instanceof Element && n !== t.current && i?.observe(n), d(), () => {
|
|
73
|
+
n.removeEventListener("scroll", r), window.removeEventListener("resize", u), i?.disconnect(), a.current !== null && cancelAnimationFrame(a.current);
|
|
74
|
+
};
|
|
75
|
+
}, [t, d, l, s]), v(() => {
|
|
76
|
+
if (!y.current) {
|
|
77
|
+
y.current = !0, g && m("auto");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (f.current) {
|
|
81
|
+
const n = requestAnimationFrame(() => m("auto"));
|
|
82
|
+
return () => cancelAnimationFrame(n);
|
|
83
|
+
}
|
|
84
|
+
d();
|
|
85
|
+
}, [g, F, d, m]), v(() => {
|
|
86
|
+
f.current = h;
|
|
87
|
+
}, [h]), {
|
|
88
|
+
showScrollToBottom: D,
|
|
89
|
+
isAtBottom: L,
|
|
90
|
+
followNewContent: f.current,
|
|
91
|
+
scrollToBottom: m,
|
|
92
|
+
refresh: d
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export {
|
|
96
|
+
N as default,
|
|
97
|
+
H as getScrollMetrics,
|
|
98
|
+
T as resolveScrollTarget,
|
|
99
|
+
N as useScrollToBottom
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=useScrollToBottom.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollToBottom.es.js","sources":["../../../src/components/MarkdownFlow/useScrollToBottom.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\n\nexport type ScrollBehavior = \"smooth\" | \"auto\";\nexport type ScrollTarget = HTMLElement | Document | Window;\nexport type ScrollTargetRef = RefObject<ScrollTarget | null>;\n\nexport interface UseScrollToBottomOptions {\n contentRef?: RefObject<HTMLElement | null>;\n scrollTarget?: ScrollTarget | ScrollTargetRef | null;\n scrollThreshold?: number;\n contentVersion?: unknown;\n followNewContent?: boolean;\n autoScrollOnInit?: boolean;\n behavior?: ScrollBehavior;\n}\n\nexport interface UseScrollToBottomReturn {\n showScrollToBottom: boolean;\n isAtBottom: boolean;\n followNewContent: boolean;\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n refresh: () => void;\n}\n\nconst isWindow = (target: ScrollTarget): target is Window =>\n typeof Window !== \"undefined\" && target instanceof Window;\n\nconst isDocument = (target: ScrollTarget): target is Document =>\n typeof Document !== \"undefined\" && target instanceof Document;\n\nconst getDocumentScroller = (target: Document | Window): HTMLElement | null => {\n const document = isWindow(target) ? target.document : target;\n return (document.scrollingElement || document.documentElement) as HTMLElement;\n};\n\nexport const getScrollMetrics = (target: ScrollTarget) => {\n if (isWindow(target) || isDocument(target)) {\n const scroller = getDocumentScroller(target);\n const viewportHeight = isWindow(target)\n ? target.innerHeight\n : scroller?.clientHeight || 0;\n return {\n scrollTop: scroller?.scrollTop || 0,\n scrollHeight: scroller?.scrollHeight || 0,\n clientHeight: viewportHeight,\n };\n }\n return {\n scrollTop: target.scrollTop,\n scrollHeight: target.scrollHeight,\n clientHeight: target.clientHeight,\n };\n};\n\nconst scrollTargetValue = (\n target: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n if (!target) return null;\n return \"current\" in target ? target.current : target;\n};\n\nconst isScrollable = (element: HTMLElement) => {\n const style =\n typeof window !== \"undefined\" ? window.getComputedStyle(element) : null;\n const overflow = style?.overflowY || style?.overflow;\n return element.scrollHeight > element.clientHeight && overflow !== \"visible\";\n};\n\nexport const resolveScrollTarget = (\n contentRef: RefObject<HTMLElement | null> | undefined,\n explicitTarget: ScrollTarget | ScrollTargetRef | null | undefined\n): ScrollTarget | null => {\n const explicit = scrollTargetValue(explicitTarget);\n if (explicit) return explicit;\n const content = contentRef?.current;\n if (!content) return null;\n if (isScrollable(content)) return content;\n let parent = content.parentElement;\n while (parent) {\n if (isScrollable(parent)) return parent;\n parent = parent.parentElement;\n }\n return typeof window !== \"undefined\" ? window : null;\n};\n\nexport const useScrollToBottom = (\n containerRef: RefObject<HTMLElement | null>,\n options: UseScrollToBottomOptions = {}\n): UseScrollToBottomReturn => {\n const {\n contentRef = containerRef,\n scrollTarget,\n scrollThreshold = 150,\n contentVersion,\n followNewContent: followNewContentOption = true,\n autoScrollOnInit = false,\n behavior = \"smooth\",\n } = options;\n const [showScrollToBottom, setShowScrollToBottom] = useState(false);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const followingRef = useRef(followNewContentOption);\n const mountedRef = useRef(false);\n const frameRef = useRef<number | null>(null);\n\n const refresh = useCallback(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const { scrollTop, scrollHeight, clientHeight } = getScrollMetrics(target);\n const atBottom = scrollTop + clientHeight >= scrollHeight - scrollThreshold;\n setIsAtBottom(atBottom);\n setShowScrollToBottom(!atBottom && scrollHeight > clientHeight);\n if (atBottom) followingRef.current = true;\n }, [contentRef, scrollTarget, scrollThreshold]);\n\n const scrollToBottom = useCallback(\n (requestedBehavior: ScrollBehavior = behavior) => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const reducedMotion =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const actualBehavior =\n requestedBehavior === \"smooth\" && reducedMotion\n ? \"auto\"\n : requestedBehavior;\n const top = getScrollMetrics(target).scrollHeight;\n if (isWindow(target)) {\n target.scrollTo({ top, behavior: actualBehavior });\n } else if (isDocument(target)) {\n getDocumentScroller(target)?.scrollTo({\n top,\n behavior: actualBehavior,\n });\n } else {\n target.scrollTo({ top, behavior: actualBehavior });\n }\n followingRef.current = true;\n setIsAtBottom(true);\n setShowScrollToBottom(false);\n },\n [behavior, contentRef, scrollTarget]\n );\n\n useEffect(() => {\n const target = resolveScrollTarget(contentRef, scrollTarget);\n if (!target) return;\n const handleScroll = () => {\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n frameRef.current = requestAnimationFrame(() => {\n frameRef.current = null;\n const metrics = getScrollMetrics(target);\n if (\n metrics.scrollTop + metrics.clientHeight <\n metrics.scrollHeight - scrollThreshold\n ) {\n followingRef.current = false;\n }\n refresh();\n });\n };\n const handleResize = () => handleScroll();\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n window.addEventListener(\"resize\", handleResize);\n const observer =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(handleResize)\n : null;\n if (contentRef.current) observer?.observe(contentRef.current);\n if (\n typeof Element !== \"undefined\" &&\n target instanceof Element &&\n target !== contentRef.current\n ) {\n observer?.observe(target);\n }\n refresh();\n return () => {\n target.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleResize);\n observer?.disconnect();\n if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);\n };\n }, [contentRef, refresh, scrollTarget, scrollThreshold]);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (autoScrollOnInit) scrollToBottom(\"auto\");\n return;\n }\n if (followingRef.current) {\n const frame = requestAnimationFrame(() => scrollToBottom(\"auto\"));\n return () => cancelAnimationFrame(frame);\n }\n refresh();\n }, [autoScrollOnInit, contentVersion, refresh, scrollToBottom]);\n\n useEffect(() => {\n followingRef.current = followNewContentOption;\n }, [followNewContentOption]);\n\n return {\n showScrollToBottom,\n isAtBottom,\n followNewContent: followingRef.current,\n scrollToBottom,\n refresh,\n };\n};\n\nexport default useScrollToBottom;\n"],"names":["isWindow","target","isDocument","getDocumentScroller","document","getScrollMetrics","scroller","viewportHeight","scrollTargetValue","isScrollable","element","style","overflow","resolveScrollTarget","contentRef","explicitTarget","explicit","content","parent","useScrollToBottom","containerRef","options","scrollTarget","scrollThreshold","contentVersion","followNewContentOption","autoScrollOnInit","behavior","showScrollToBottom","setShowScrollToBottom","useState","isAtBottom","setIsAtBottom","followingRef","useRef","mountedRef","frameRef","refresh","useCallback","scrollTop","scrollHeight","clientHeight","atBottom","scrollToBottom","requestedBehavior","reducedMotion","actualBehavior","top","useEffect","handleScroll","metrics","handleResize","observer","frame"],"mappings":";AA8BA,MAAMA,IAAW,CAACC,MAChB,OAAO,SAAW,OAAeA,aAAkB,QAE/CC,IAAa,CAACD,MAClB,OAAO,WAAa,OAAeA,aAAkB,UAEjDE,IAAsB,CAACF,MAAkD;AAC7E,QAAMG,IAAWJ,EAASC,CAAM,IAAIA,EAAO,WAAWA;AACtD,SAAQG,EAAS,oBAAoBA,EAAS;AAChD,GAEaC,IAAmB,CAACJ,MAAyB;AACxD,MAAID,EAASC,CAAM,KAAKC,EAAWD,CAAM,GAAG;AAC1C,UAAMK,IAAWH,EAAoBF,CAAM,GACrCM,IAAiBP,EAASC,CAAM,IAClCA,EAAO,cACPK,GAAU,gBAAgB;AAC9B,WAAO;AAAA,MACL,WAAWA,GAAU,aAAa;AAAA,MAClC,cAAcA,GAAU,gBAAgB;AAAA,MACxC,cAAcC;AAAA,IAAA;AAAA,EAElB;AACA,SAAO;AAAA,IACL,WAAWN,EAAO;AAAA,IAClB,cAAcA,EAAO;AAAA,IACrB,cAAcA,EAAO;AAAA,EAAA;AAEzB,GAEMO,IAAoB,CACxBP,MAEKA,IACE,aAAaA,IAASA,EAAO,UAAUA,IAD1B,MAIhBQ,IAAe,CAACC,MAAyB;AAC7C,QAAMC,IACJ,OAAO,SAAW,MAAc,OAAO,iBAAiBD,CAAO,IAAI,MAC/DE,IAAWD,GAAO,aAAaA,GAAO;AAC5C,SAAOD,EAAQ,eAAeA,EAAQ,gBAAgBE,MAAa;AACrE,GAEaC,IAAsB,CACjCC,GACAC,MACwB;AACxB,QAAMC,IAAWR,EAAkBO,CAAc;AACjD,MAAIC,EAAU,QAAOA;AACrB,QAAMC,IAAUH,GAAY;AAC5B,MAAI,CAACG,EAAS,QAAO;AACrB,MAAIR,EAAaQ,CAAO,EAAG,QAAOA;AAClC,MAAIC,IAASD,EAAQ;AACrB,SAAOC,KAAQ;AACb,QAAIT,EAAaS,CAAM,EAAG,QAAOA;AACjC,IAAAA,IAASA,EAAO;AAAA,EAClB;AACA,SAAO,OAAO,SAAW,MAAc,SAAS;AAClD,GAEaC,IAAoB,CAC/BC,GACAC,IAAoC,OACR;AAC5B,QAAM;AAAA,IACJ,YAAAP,IAAaM;AAAA,IACb,cAAAE;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,gBAAAC;AAAA,IACA,kBAAkBC,IAAyB;AAAA,IAC3C,kBAAAC,IAAmB;AAAA,IACnB,UAAAC,IAAW;AAAA,EAAA,IACTN,GACE,CAACO,GAAoBC,CAAqB,IAAIC,EAAS,EAAK,GAC5D,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAI,GAC3CG,IAAeC,EAAOT,CAAsB,GAC5CU,IAAaD,EAAO,EAAK,GACzBE,IAAWF,EAAsB,IAAI,GAErCG,IAAUC,EAAY,MAAM;AAChC,UAAMrC,IAASY,EAAoBC,GAAYQ,CAAY;AAC3D,QAAI,CAACrB,EAAQ;AACb,UAAM,EAAE,WAAAsC,GAAW,cAAAC,GAAc,cAAAC,EAAA,IAAiBpC,EAAiBJ,CAAM,GACnEyC,IAAWH,IAAYE,KAAgBD,IAAejB;AAC5D,IAAAS,EAAcU,CAAQ,GACtBb,EAAsB,CAACa,KAAYF,IAAeC,CAAY,GAC1DC,QAAuB,UAAU;AAAA,EACvC,GAAG,CAAC5B,GAAYQ,GAAcC,CAAe,CAAC,GAExCoB,IAAiBL;AAAA,IACrB,CAACM,IAAoCjB,MAAa;AAChD,YAAM1B,IAASY,EAAoBC,GAAYQ,CAAY;AAC3D,UAAI,CAACrB,EAAQ;AACb,YAAM4C,IACJ,OAAO,SAAW,OAClB,OAAO,aAAa,kCAAkC,EAAE,SACpDC,IACJF,MAAsB,YAAYC,IAC9B,SACAD,GACAG,IAAM1C,EAAiBJ,CAAM,EAAE;AACrC,MAAID,EAASC,CAAM,IACjBA,EAAO,SAAS,EAAE,KAAA8C,GAAK,UAAUD,GAAgB,IACxC5C,EAAWD,CAAM,IAC1BE,EAAoBF,CAAM,GAAG,SAAS;AAAA,QACpC,KAAA8C;AAAA,QACA,UAAUD;AAAA,MAAA,CACX,IAED7C,EAAO,SAAS,EAAE,KAAA8C,GAAK,UAAUD,GAAgB,GAEnDb,EAAa,UAAU,IACvBD,EAAc,EAAI,GAClBH,EAAsB,EAAK;AAAA,IAC7B;AAAA,IACA,CAACF,GAAUb,GAAYQ,CAAY;AAAA,EAAA;AAGrC,SAAA0B,EAAU,MAAM;AACd,UAAM/C,IAASY,EAAoBC,GAAYQ,CAAY;AAC3D,QAAI,CAACrB,EAAQ;AACb,UAAMgD,IAAe,MAAM;AACzB,MAAIb,EAAS,YAAY,QAAM,qBAAqBA,EAAS,OAAO,GACpEA,EAAS,UAAU,sBAAsB,MAAM;AAC7C,QAAAA,EAAS,UAAU;AACnB,cAAMc,IAAU7C,EAAiBJ,CAAM;AACvC,QACEiD,EAAQ,YAAYA,EAAQ,eAC5BA,EAAQ,eAAe3B,MAEvBU,EAAa,UAAU,KAEzBI,EAAA;AAAA,MACF,CAAC;AAAA,IACH,GACMc,IAAe,MAAMF,EAAA;AAC3B,IAAAhD,EAAO,iBAAiB,UAAUgD,GAAc,EAAE,SAAS,IAAM,GACjE,OAAO,iBAAiB,UAAUE,CAAY;AAC9C,UAAMC,IACJ,OAAO,iBAAmB,MACtB,IAAI,eAAeD,CAAY,IAC/B;AACN,WAAIrC,EAAW,WAASsC,GAAU,QAAQtC,EAAW,OAAO,GAE1D,OAAO,UAAY,OACnBb,aAAkB,WAClBA,MAAWa,EAAW,WAEtBsC,GAAU,QAAQnD,CAAM,GAE1BoC,EAAA,GACO,MAAM;AACX,MAAApC,EAAO,oBAAoB,UAAUgD,CAAY,GACjD,OAAO,oBAAoB,UAAUE,CAAY,GACjDC,GAAU,WAAA,GACNhB,EAAS,YAAY,QAAM,qBAAqBA,EAAS,OAAO;AAAA,IACtE;AAAA,EACF,GAAG,CAACtB,GAAYuB,GAASf,GAAcC,CAAe,CAAC,GAEvDyB,EAAU,MAAM;AACd,QAAI,CAACb,EAAW,SAAS;AACvB,MAAAA,EAAW,UAAU,IACjBT,OAAiC,MAAM;AAC3C;AAAA,IACF;AACA,QAAIO,EAAa,SAAS;AACxB,YAAMoB,IAAQ,sBAAsB,MAAMV,EAAe,MAAM,CAAC;AAChE,aAAO,MAAM,qBAAqBU,CAAK;AAAA,IACzC;AACA,IAAAhB,EAAA;AAAA,EACF,GAAG,CAACX,GAAkBF,GAAgBa,GAASM,CAAc,CAAC,GAE9DK,EAAU,MAAM;AACd,IAAAf,EAAa,UAAUR;AAAA,EACzB,GAAG,CAACA,CAAsB,CAAC,GAEpB;AAAA,IACL,oBAAAG;AAAA,IACA,YAAAG;AAAA,IACA,kBAAkBE,EAAa;AAAA,IAC/B,gBAAAU;AAAA,IACA,SAAAN;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
export { default as ContentRender } from './ContentRender';
|
|
2
2
|
export { default as MarkdownFlow } from './MarkdownFlow';
|
|
3
|
-
export { default as
|
|
3
|
+
export { default as ScrollableMarkdownFlow } from './MarkdownFlow/ScrollableMarkdownFlow';
|
|
4
|
+
export { default as ScrollToBottomButton } from './MarkdownFlow/ScrollToBottomButton';
|
|
5
|
+
export { default as useScrollToBottom } from './MarkdownFlow/useScrollToBottom';
|
|
6
|
+
export type { ScrollTarget, ScrollTargetRef, UseScrollToBottomOptions, UseScrollToBottomReturn, } from './MarkdownFlow/useScrollToBottom';
|
|
4
7
|
export { default as MarkdownFlowEditor } from './MarkdownFlowEditor';
|
|
5
8
|
export { default as Slide } from './Slide';
|
|
6
9
|
export { Player, useSlide } from './Slide';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../../../_virtual/jsx-runtime.cjs.js"),s=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs.js");require("../../../_virtual/index.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../../../_virtual/jsx-runtime.cjs.js"),s=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs.js");require("../../../_virtual/index.cjs4.js");require("../../../node_modules/rc-resize-observer/es/index.cjs.js");require("../../../node_modules/rc-util/es/hooks/useLayoutEffect.cjs.js");require("../../../node_modules/rc-util/es/raf.cjs.js");const d=require("../../../lib/utils.cjs.js");function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const l=c(s),i=l.forwardRef(({className:e,autoSize:t={minRows:1},style:r,...a},n)=>o.jsxRuntimeExports.jsx(u.default,{ref:n,autoSize:t,className:d.cn("border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 w-full rounded-md border bg-transparent pl-3 py-1.5 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50","resize-none",e),style:{whiteSpace:"pre-wrap",wordBreak:"break-word",...r},...a}));i.displayName="Textarea";exports.Textarea=i;
|
|
2
2
|
//# sourceMappingURL=textarea.cjs.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { j as i } from "../../../_virtual/jsx-runtime.es.js";
|
|
2
2
|
import * as d from "react";
|
|
3
3
|
import n from "../../../node_modules/rc-textarea/es/TextArea.es.js";
|
|
4
|
-
import "../../../_virtual/index.
|
|
4
|
+
import "../../../_virtual/index.es4.js";
|
|
5
5
|
import "../../../node_modules/rc-resize-observer/es/index.es.js";
|
|
6
6
|
import "../../../node_modules/rc-util/es/hooks/useLayoutEffect.es.js";
|
|
7
7
|
import "../../../node_modules/rc-util/es/raf.es.js";
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.js"),o=require("./components/MarkdownFlow/MarkdownFlow.cjs.js"),n=require("./components/MarkdownFlow/ScrollableMarkdownFlow.cjs.js"),r=require("./components/MarkdownFlow/ScrollToBottomButton.cjs.js"),l=require("./components/MarkdownFlow/useScrollToBottom.cjs.js"),a=require("./components/ContentRender/ContentRender.cjs.js"),u=require("./components/ContentRender/IframeSandbox.cjs.js"),c=require("./components/ContentRender/utils/split-content.cjs.js"),s=require("./components/ContentRender/MarkdownFlowInput.cjs.js"),t=require("./lib/interaction-defaults.cjs.js");exports.MarkdownFlowEditor=e.default;exports.MarkdownFlow=o.default;exports.ScrollableMarkdownFlow=n.default;exports.ScrollToBottomButton=r.ScrollToBottomButton;exports.useScrollToBottom=l.useScrollToBottom;exports.ContentRender=a.default;exports.IframeSandbox=u.default;exports.splitContentSegments=c.splitContentSegments;exports.MarkdownFlowInput=s.default;exports.getInteractionDefaultSelectedValues=t.getInteractionDefaultSelectedValues;exports.getInteractionDefaultValues=t.getInteractionDefaultValues;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.es.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
|
-
import { default as
|
|
2
|
-
import { default as
|
|
3
|
-
import "./
|
|
4
|
-
import "
|
|
5
|
-
import "./components/
|
|
6
|
-
|
|
7
|
-
import { default as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { getInteractionDefaultSelectedValues as g, getInteractionDefaultValues as k } from "./lib/interaction-defaults.es.js";
|
|
1
|
+
import { default as e } from "./components/MarkdownFlowEditor/MarkdownFlowEditor.es.js";
|
|
2
|
+
import { default as a } from "./components/MarkdownFlow/MarkdownFlow.es.js";
|
|
3
|
+
import { default as f } from "./components/MarkdownFlow/ScrollableMarkdownFlow.es.js";
|
|
4
|
+
import { ScrollToBottomButton as d } from "./components/MarkdownFlow/ScrollToBottomButton.es.js";
|
|
5
|
+
import { useScrollToBottom as u } from "./components/MarkdownFlow/useScrollToBottom.es.js";
|
|
6
|
+
import { default as s } from "./components/ContentRender/ContentRender.es.js";
|
|
7
|
+
import { default as w } from "./components/ContentRender/IframeSandbox.es.js";
|
|
8
|
+
import { splitContentSegments as S } from "./components/ContentRender/utils/split-content.es.js";
|
|
9
|
+
import { default as k } from "./components/ContentRender/MarkdownFlowInput.es.js";
|
|
10
|
+
import { getInteractionDefaultSelectedValues as I, getInteractionDefaultValues as M } from "./lib/interaction-defaults.es.js";
|
|
12
11
|
export {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
s as ContentRender,
|
|
13
|
+
w as IframeSandbox,
|
|
14
|
+
a as MarkdownFlow,
|
|
15
|
+
e as MarkdownFlowEditor,
|
|
16
|
+
k as MarkdownFlowInput,
|
|
17
|
+
d as ScrollToBottomButton,
|
|
18
|
+
f as ScrollableMarkdownFlow,
|
|
19
|
+
I as getInteractionDefaultSelectedValues,
|
|
20
|
+
M as getInteractionDefaultValues,
|
|
21
|
+
S as splitContentSegments,
|
|
22
|
+
u as useScrollToBottom
|
|
21
23
|
};
|
|
22
24
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.cjs9.js"),v=require("./constants.cjs.js");var d;function x(){if(d)return c.__exports;d=1,Object.defineProperty(c.__exports,"__esModule",{value:!0}),c.__exports.sanitizeUrl=void 0;var e=v.__require();function m(r){return e.relativeFirstCharacters.indexOf(r[0])>-1}function p(r){var i=r.replace(e.ctrlCharactersRegex,"");return i.replace(e.htmlEntitiesRegex,function(t,a){return String.fromCharCode(a)})}function R(r){return URL.canParse(r)}function l(r){try{return decodeURIComponent(r)}catch{return r}}function f(r){if(!r)return e.BLANK_URL;var i,t=l(r.trim());do t=p(t).replace(e.htmlCtrlEntityRegex,"").replace(e.ctrlCharactersRegex,"").replace(e.whitespaceEscapeCharsRegex,"").trim(),t=l(t),i=t.match(e.ctrlCharactersRegex)||t.match(e.htmlEntitiesRegex)||t.match(e.htmlCtrlEntityRegex)||t.match(e.whitespaceEscapeCharsRegex);while(i&&i.length>0);var a=t;if(!a)return e.BLANK_URL;if(m(a))return a;var u=a.trimStart(),h=u.match(e.urlSchemeRegex);if(!h)return a;var n=h[0].toLowerCase().trim();if(e.invalidProtocolRegex.test(n))return e.BLANK_URL;var s=u.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return s;if(n==="http:"||n==="https:"){if(!R(s))return e.BLANK_URL;var o=new URL(s);return o.protocol=o.protocol.toLowerCase(),o.hostname=o.hostname.toLowerCase(),o.toString()}return s}return c.__exports.sanitizeUrl=f,c.__exports}exports.__require=x;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.cjs8.js");/*!
|
|
2
2
|
Copyright (c) 2018 Jed Watson.
|
|
3
3
|
Licensed under the MIT License (MIT), see
|
|
4
4
|
http://jedwatson.github.io/classnames
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("../createLucideIcon.cjs.js");/**
|
|
2
|
+
* @license lucide-react v0.525.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const e=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],t=o.default("chevron-down",e);exports.__iconNode=e;exports.default=t;
|
|
7
|
+
//# sourceMappingURL=chevron-down.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chevron-down.cjs.js","sources":["../../../../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js"],"sourcesContent":["/**\n * @license lucide-react v0.525.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n"],"names":["__iconNode","ChevronDown","createLucideIcon"],"mappings":"0JAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAa,CAAC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,SAAU,CAAC,EAC5DC,EAAcC,EAAAA,QAAiB,eAAgBF,CAAU","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import o from "../createLucideIcon.es.js";
|
|
2
|
+
/**
|
|
3
|
+
* @license lucide-react v0.525.0 - ISC
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the ISC license.
|
|
6
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
const e = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]], c = o("chevron-down", e);
|
|
9
|
+
export {
|
|
10
|
+
e as __iconNode,
|
|
11
|
+
c as default
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=chevron-down.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chevron-down.es.js","sources":["../../../../../../node_modules/lucide-react/dist/esm/icons/chevron-down.js"],"sourcesContent":["/**\n * @license lucide-react v0.525.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n"],"names":["__iconNode","ChevronDown","createLucideIcon"],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASK,MAACA,IAAa,CAAC,CAAC,QAAQ,EAAE,GAAG,gBAAgB,KAAK,UAAU,CAAC,GAC5DC,IAAcC,EAAiB,gBAAgBF,CAAU;","x_google_ignoreList":[0]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("../../@babel/runtime/helpers/esm/objectSpread2.cjs.js"),te=require("../../@babel/runtime/helpers/esm/extends.cjs.js"),i=require("../../@babel/runtime/helpers/esm/defineProperty.cjs.js"),oe=require("../../@babel/runtime/helpers/esm/typeof.cjs.js"),u=require("../../../_virtual/index.
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("../../@babel/runtime/helpers/esm/objectSpread2.cjs.js"),te=require("../../@babel/runtime/helpers/esm/extends.cjs.js"),i=require("../../@babel/runtime/helpers/esm/defineProperty.cjs.js"),oe=require("../../@babel/runtime/helpers/esm/typeof.cjs.js"),u=require("../../../_virtual/index.cjs4.js"),n=require("react"),T=require("./utils/commonUtils.cjs.js");var de=n.forwardRef(function(e,U){var p,x,y,$=e.inputElement,N=e.children,r=e.prefixCls,k=e.prefix,f=e.suffix,C=e.addonBefore,W=e.addonAfter,z=e.className,J=e.style,m=e.disabled,I=e.readOnly,K=e.focused,E=e.triggerFocus,d=e.allowClear,b=e.value,h=e.handleReset,L=e.hidden,t=e.classes,a=e.classNames,g=e.dataAttrs,o=e.styles,l=e.components,w=e.onClear,M=N??$,Q=l?.affixWrapper||"span",V=l?.groupWrapper||"span",X=l?.wrapper||"span",S=l?.groupAddon||"span",A=n.useRef(null),Y=function(s){var q;(q=A.current)!==null&&q!==void 0&&q.contains(s.target)&&E?.()},j=T.hasPrefixSuffix(e),c=n.cloneElement(M,{value:b,className:u.default((p=M.props)===null||p===void 0?void 0:p.className,!j&&a?.variant)||null}),B=n.useRef(null);if(n.useImperativeHandle(U,function(){return{nativeElement:B.current||A.current}}),j){var D=null;if(d){var Z=!m&&!I&&b,R="".concat(r,"-clear-icon"),P=oe.default(d)==="object"&&d!==null&&d!==void 0&&d.clearIcon?d.clearIcon:"✖";D=n.createElement("button",{type:"button",tabIndex:-1,onClick:function(s){h?.(s),w?.()},onMouseDown:function(s){return s.preventDefault()},className:u.default(R,i.default(i.default({},"".concat(R,"-hidden"),!Z),"".concat(R,"-has-suffix"),!!f))},P)}var v="".concat(r,"-affix-wrapper"),ee=u.default(v,i.default(i.default(i.default(i.default(i.default({},"".concat(r,"-disabled"),m),"".concat(v,"-disabled"),m),"".concat(v,"-focused"),K),"".concat(v,"-readonly"),I),"".concat(v,"-input-with-clear-btn"),f&&d&&b),t?.affixWrapper,a?.affixWrapper,a?.variant),ae=(f||d)&&n.createElement("span",{className:u.default("".concat(r,"-suffix"),a?.suffix),style:o?.suffix},D,f);c=n.createElement(Q,te.default({className:ee,style:o?.affixWrapper,onClick:Y},g?.affixWrapper,{ref:A}),k&&n.createElement("span",{className:u.default("".concat(r,"-prefix"),a?.prefix),style:o?.prefix},k),c,ae)}if(T.hasAddon(e)){var _="".concat(r,"-group"),O="".concat(_,"-addon"),F="".concat(_,"-wrapper"),ne=u.default("".concat(r,"-wrapper"),_,t?.wrapper,a?.wrapper),le=u.default(F,i.default({},"".concat(F,"-disabled"),m),t?.group,a?.groupWrapper);c=n.createElement(V,{className:le,ref:B},n.createElement(X,{className:ne},C&&n.createElement(S,{className:O},C),c,W&&n.createElement(S,{className:O},W)))}return n.cloneElement(c,{className:u.default((x=c.props)===null||x===void 0?void 0:x.className,z)||null,style:H.default(H.default({},(y=c.props)===null||y===void 0?void 0:y.style),J),hidden:L})});exports.default=de;
|
|
2
2
|
//# sourceMappingURL=BaseInput.cjs.js.map
|
|
@@ -2,7 +2,7 @@ import $ from "../../@babel/runtime/helpers/esm/objectSpread2.es.js";
|
|
|
2
2
|
import oe from "../../@babel/runtime/helpers/esm/extends.es.js";
|
|
3
3
|
import r from "../../@babel/runtime/helpers/esm/defineProperty.es.js";
|
|
4
4
|
import te from "../../@babel/runtime/helpers/esm/typeof.es.js";
|
|
5
|
-
import d from "../../../_virtual/index.
|
|
5
|
+
import d from "../../../_virtual/index.es4.js";
|
|
6
6
|
import l, { useRef as q, cloneElement as ie } from "react";
|
|
7
7
|
import { hasPrefixSuffix as re, hasAddon as de } from "./utils/commonUtils.es.js";
|
|
8
8
|
var xe = /* @__PURE__ */ l.forwardRef(function(e, z) {
|