markdown-flow-ui 0.1.100 → 0.1.101
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/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.es.js +17 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.es.js +29 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.es.js +18 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js +16 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js +16 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.cjs.js +7 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.cjs.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.es.js +23 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.es.js.map +1 -0
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.es.js +1 -1
- package/dist/_virtual/index.cjs.js +1 -1
- package/dist/_virtual/index.cjs3.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.es.js +1 -0
- 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.es5.js +4 -4
- package/dist/_virtual/index.es6.js +5 -5
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/ContentRender.cjs.js +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +13 -10
- package/dist/components/ContentRender/ContentRender.es.js +172 -155
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.stories.d.ts +1 -0
- package/dist/components/ContentRender/IframeSandbox.cjs.js +4 -4
- package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.d.ts +1 -0
- package/dist/components/ContentRender/IframeSandbox.es.js +214 -192
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs.js +3 -3
- package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.d.ts +1 -0
- package/dist/components/ContentRender/SandboxApp.es.js +90 -90
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +94 -86
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/ContentRender/utils/iframe-viewport-height.cjs.js +2 -0
- package/dist/components/ContentRender/utils/iframe-viewport-height.cjs.js.map +1 -0
- package/dist/components/ContentRender/utils/iframe-viewport-height.d.ts +24 -0
- package/dist/components/ContentRender/utils/iframe-viewport-height.es.js +127 -0
- package/dist/components/ContentRender/utils/iframe-viewport-height.es.js.map +1 -0
- package/dist/components/ContentRender/utils/iframe-viewport-height.test.d.ts +1 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +3 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +19 -16
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/Slide/Player.cjs.js +2 -0
- package/dist/components/Slide/Player.cjs.js.map +1 -0
- package/dist/components/Slide/Player.d.ts +21 -0
- package/dist/components/Slide/Player.es.js +386 -0
- package/dist/components/Slide/Player.es.js.map +1 -0
- package/dist/components/Slide/Slide.cjs.js +2 -0
- package/dist/components/Slide/Slide.cjs.js.map +1 -0
- package/dist/components/Slide/Slide.d.ts +27 -0
- package/dist/components/Slide/Slide.es.js +583 -0
- package/dist/components/Slide/Slide.es.js.map +1 -0
- package/dist/components/Slide/Slide.stories.d.ts +79 -0
- package/dist/components/Slide/diff-utils.cjs.js +5 -0
- package/dist/components/Slide/diff-utils.cjs.js.map +1 -0
- package/dist/components/Slide/diff-utils.d.ts +18 -0
- package/dist/components/Slide/diff-utils.es.js +113 -0
- package/dist/components/Slide/diff-utils.es.js.map +1 -0
- package/dist/components/Slide/index.cjs.js +2 -0
- package/dist/components/Slide/index.cjs.js.map +1 -0
- package/dist/components/Slide/index.d.ts +12 -0
- package/dist/components/Slide/index.es.js +12 -0
- package/dist/components/Slide/index.es.js.map +1 -0
- package/dist/components/Slide/types.d.ts +24 -0
- package/dist/components/Slide/useSlide.cjs.js +2 -0
- package/dist/components/Slide/useSlide.cjs.js.map +1 -0
- package/dist/components/Slide/useSlide.d.ts +24 -0
- package/dist/components/Slide/useSlide.es.js +144 -0
- package/dist/components/Slide/useSlide.es.js.map +1 -0
- package/dist/components/Slide/useWakePlayerFromIframe.cjs.js +2 -0
- package/dist/components/Slide/useWakePlayerFromIframe.cjs.js.map +1 -0
- package/dist/components/Slide/useWakePlayerFromIframe.d.ts +7 -0
- package/dist/components/Slide/useWakePlayerFromIframe.es.js +89 -0
- package/dist/components/Slide/useWakePlayerFromIframe.es.js.map +1 -0
- package/dist/components/Slide/utils/interactionPlayback.cjs.js +2 -0
- package/dist/components/Slide/utils/interactionPlayback.cjs.js.map +1 -0
- package/dist/components/Slide/utils/interactionPlayback.d.ts +9 -0
- package/dist/components/Slide/utils/interactionPlayback.es.js +11 -0
- package/dist/components/Slide/utils/interactionPlayback.es.js.map +1 -0
- package/dist/components/Slide/utils/interactionPlayback.test.d.ts +1 -0
- package/dist/components/Slide/utils/listenModeElementList.d.ts +81 -0
- package/dist/components/Slide/utils/listenModeElementList.test.d.ts +1 -0
- package/dist/components/Slide/utils/playbackSequence.cjs.js +2 -0
- package/dist/components/Slide/utils/playbackSequence.cjs.js.map +1 -0
- package/dist/components/Slide/utils/playbackSequence.d.ts +11 -0
- package/dist/components/Slide/utils/playbackSequence.es.js +16 -0
- package/dist/components/Slide/utils/playbackSequence.es.js.map +1 -0
- package/dist/components/Slide/utils/playbackSequence.test.d.ts +1 -0
- package/dist/components/Slide/utils/playerCustomActions.cjs.js +2 -0
- package/dist/components/Slide/utils/playerCustomActions.cjs.js.map +1 -0
- package/dist/components/Slide/utils/playerCustomActions.d.ts +3 -0
- package/dist/components/Slide/utils/playerCustomActions.es.js +7 -0
- package/dist/components/Slide/utils/playerCustomActions.es.js.map +1 -0
- package/dist/components/index.d.ts +7 -0
- 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 +13 -10
- package/dist/index.es.js.map +1 -1
- package/dist/lib/browserUserActivation.d.ts +5 -0
- package/dist/lib/interaction-defaults.cjs.js +2 -0
- package/dist/lib/interaction-defaults.cjs.js.map +1 -0
- package/dist/lib/interaction-defaults.d.ts +23 -0
- package/dist/lib/interaction-defaults.es.js +145 -0
- package/dist/lib/interaction-defaults.es.js.map +1 -0
- package/dist/lib/sandboxInteraction.cjs.js +2 -0
- package/dist/lib/sandboxInteraction.cjs.js.map +1 -0
- package/dist/lib/sandboxInteraction.d.ts +8 -0
- package/dist/lib/sandboxInteraction.es.js +12 -0
- package/dist/lib/sandboxInteraction.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.d.ts +3 -1
- package/dist/renderer.es.js +9 -6
- package/dist/renderer.es.js.map +1 -1
- package/dist/slide.cjs.js +2 -0
- package/dist/slide.cjs.js.map +1 -0
- package/dist/slide.d.ts +2 -0
- package/dist/slide.es.js +18 -0
- package/dist/slide.es.js.map +1 -0
- package/package.json +25 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomVariable.es.js","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport { cn } from \"../../../lib/utils\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n node,\n readonly,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={`cursor-pointer h-8 text-sm hover:bg-gray-200 ${resolvedDefaultButtonText === text ? \"select\" : \"\"}`}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n disabled={readonly}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n readonly?: boolean;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n readonly,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n disabled={readonly}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n node,\n readonly,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText = \"Submit\", // Default to English, can be overridden\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n node.properties?.variableName?.trim() || defaultButtonText || \"Submit\";\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={confirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n node={singleSelectNode}\n readonly={readonly}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n readonly={readonly}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","setInputValue","React","setSelectedValues","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomVariable.es.js","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport { cn } from \"../../../lib/utils\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n node,\n readonly,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={cn(\n \"max-w-full shrink whitespace-normal break-words text-left leading-5 h-auto min-h-8 px-3 py-1.5\",\n \"hover:bg-gray-200\",\n resolvedDefaultButtonText === text && \"select\"\n )}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n disabled={readonly}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n readonly?: boolean;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n readonly,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n disabled={readonly}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n node,\n readonly,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText = \"Submit\", // Default to English, can be overridden\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n node.properties?.variableName?.trim() || defaultButtonText || \"Submit\";\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n React.useEffect(() => {\n setInputValue(defaultInputText || \"\");\n }, [defaultInputText, node]);\n\n React.useEffect(() => {\n setSelectedValues(defaultSelectedValues || []);\n }, [defaultSelectedValues, node]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={confirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n node={singleSelectNode}\n readonly={readonly}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n readonly={readonly}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","setInputValue","React","setSelectedValues","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o={viewportHeightCss:null,hasFullViewportHeight:!1},f=/\b(?:min-height|height)\s*:\s*([^;]+)/gi,c=t=>t.split(/\s+/).filter(Boolean).map(e=>e.split(":").pop()||e),h=t=>{const e=t.trim().toLowerCase();if(!e)return null;const i=e.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);return i?`${i[1]}${i[2].toLowerCase()}`:null},s=(t,e)=>{const i=t.trim().toLowerCase();if(!i)return null;const r=Number.parseFloat(i);return Number.isNaN(r)?null:/(dvh|svh|lvh|vh)$/i.test(i)?r/100*e:i.endsWith("px")||/^[0-9.]+$/.test(i)?r:null},m=(t,e)=>{const i=t.matchAll(f);for(const r of i){const n=e(r[1]||"");if(n)return n}return null},p=t=>{if(!t.trim())return null;const e=c(t);if(e.includes("h-screen")||e.includes("h-dvh")||e.includes("min-h-screen")||e.includes("min-h-dvh"))return"100dvh";if(e.includes("h-svh")||e.includes("min-h-svh"))return"100svh";if(e.includes("h-lvh")||e.includes("min-h-lvh"))return"100lvh";const i=e.find(n=>/^(h|min-h)-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(n));if(!i)return null;const r=i.match(/^(h|min-h)-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);return r?`${r[2]}${r[3].toLowerCase()}`:null},w=t=>{if(!t.trim())return null;const i=c(t).find(n=>/^(h|min-h)-\[[0-9.]+px\]$/i.test(n));if(!i)return null;const r=i.match(/^(h|min-h)-\[([0-9.]+)px\]$/i);return r?`${r[2]}px`:null},g=({heightAttrValue:t,styleAttrValue:e,classAttrValue:i})=>(t?h(t):null)||(e?m(e,h):null)||(i?p(i):null),d=t=>t==="100vh"||t==="100dvh"||t==="100svh"||t==="100lvh",u=t=>{if(!t)return o;const e=g(t);return{viewportHeightCss:e,hasFullViewportHeight:d(e)}},T=t=>{const e=t.trim();if(!e)return o;const r=e.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/)?.[2]||"";return u({heightAttrValue:r.match(/\bheight\s*=\s*["']([^"']+)["']/i)?.[1]??null,styleAttrValue:r.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]??null,classAttrValue:r.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1]??null})},F=(t,{getNode:e,getSingleChild:i})=>{let r=t;for(;r;){const n=u(e(r));if(n.viewportHeightCss)return n;r=i(r)}return o},H=(t,e)=>{if(!t)return null;const i=g(t);if(i)return s(i,e);const r=t.styleAttrValue?m(t.styleAttrValue,v=>{const a=s(v,e);return a===null?null:String(a)}):null;if(r)return Number.parseFloat(r);const n=t.heightAttrValue?s(t.heightAttrValue,e):null;if(n!==null)return n;const l=t.classAttrValue?w(t.classAttrValue):null;return l?s(l,e):null},C=(t,e,{getNode:i,getSingleChild:r})=>{let n=t;for(;n;){const l=H(i(n),e);if(l!==null)return l;n=r(n)}return null};exports.EMPTY_ROOT_HEIGHT_META=o;exports.extractViewportHeightFromTailwindClass=p;exports.inspectViewportHeightFromHtmlRootString=T;exports.inspectViewportHeightFromNode=u;exports.inspectViewportHeightFromNodeChain=F;exports.isFullViewportHeightCss=d;exports.normalizeTailwindHeightTokens=c;exports.parseExplicitHeight=s;exports.parseViewportHeightCss=h;exports.resolveExplicitHeightFromNode=H;exports.resolveExplicitHeightFromNodeChain=C;
|
|
2
|
+
//# sourceMappingURL=iframe-viewport-height.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe-viewport-height.cjs.js","sources":["../../../../src/components/ContentRender/utils/iframe-viewport-height.ts"],"sourcesContent":["export interface ViewportHeightInspectionNode {\n heightAttrValue?: string | null;\n styleAttrValue?: string | null;\n classAttrValue?: string | null;\n}\n\nexport interface RootHeightMeta {\n viewportHeightCss: string | null;\n hasFullViewportHeight: boolean;\n}\n\nexport interface ViewportHeightTraversalOptions<T> {\n getNode: (node: T) => ViewportHeightInspectionNode;\n getSingleChild: (node: T) => T | null;\n}\n\nexport const EMPTY_ROOT_HEIGHT_META: RootHeightMeta = {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n};\n\nconst INLINE_HEIGHT_PROPERTY_PATTERN =\n /\\b(?:min-height|height)\\s*:\\s*([^;]+)/gi;\n\nexport const normalizeTailwindHeightTokens = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => token.split(\":\").pop() || token);\n\nexport const parseViewportHeightCss = (value: string) => {\n const normalized = value.trim().toLowerCase();\n\n if (!normalized) {\n return null;\n }\n\n const matched = normalized.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);\n\n if (!matched) {\n return null;\n }\n\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nexport const parseExplicitHeight = (\n value: string,\n parentViewportHeight: number\n) => {\n const normalized = value.trim().toLowerCase();\n\n if (!normalized) {\n return null;\n }\n\n const numeric = Number.parseFloat(normalized);\n\n if (Number.isNaN(numeric)) {\n return null;\n }\n\n if (/(dvh|svh|lvh|vh)$/i.test(normalized)) {\n return (numeric / 100) * parentViewportHeight;\n }\n\n if (normalized.endsWith(\"px\") || /^[0-9.]+$/.test(normalized)) {\n return numeric;\n }\n\n return null;\n};\n\nconst extractHeightValueFromInlineStyle = (\n styleAttrValue: string,\n parser: (value: string) => string | null\n) => {\n const matches = styleAttrValue.matchAll(INLINE_HEIGHT_PROPERTY_PATTERN);\n\n for (const match of matches) {\n const parsedValue = parser(match[1] || \"\");\n\n if (parsedValue) {\n return parsedValue;\n }\n }\n\n return null;\n};\n\nexport const extractViewportHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) {\n return null;\n }\n\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n\n if (\n normalizedTokens.includes(\"h-screen\") ||\n normalizedTokens.includes(\"h-dvh\") ||\n normalizedTokens.includes(\"min-h-screen\") ||\n normalizedTokens.includes(\"min-h-dvh\")\n ) {\n return \"100dvh\";\n }\n\n if (\n normalizedTokens.includes(\"h-svh\") ||\n normalizedTokens.includes(\"min-h-svh\")\n ) {\n return \"100svh\";\n }\n\n if (\n normalizedTokens.includes(\"h-lvh\") ||\n normalizedTokens.includes(\"min-h-lvh\")\n ) {\n return \"100lvh\";\n }\n\n const arbitraryToken = normalizedTokens.find((token) =>\n /^(h|min-h)-\\[[0-9.]+(vh|dvh|svh|lvh)\\]$/i.test(token)\n );\n\n if (!arbitraryToken) {\n return null;\n }\n\n const matched = arbitraryToken.match(\n /^(h|min-h)-\\[([0-9.]+)(vh|dvh|svh|lvh)\\]$/i\n );\n\n if (!matched) {\n return null;\n }\n\n return `${matched[2]}${matched[3].toLowerCase()}`;\n};\n\nconst extractPixelHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) {\n return null;\n }\n\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n const arbitraryToken = normalizedTokens.find((token) =>\n /^(h|min-h)-\\[[0-9.]+px\\]$/i.test(token)\n );\n\n if (!arbitraryToken) {\n return null;\n }\n\n const matched = arbitraryToken.match(/^(h|min-h)-\\[([0-9.]+)px\\]$/i);\n\n if (!matched) {\n return null;\n }\n\n return `${matched[2]}px`;\n};\n\nconst getViewportHeightCssFromNode = ({\n heightAttrValue,\n styleAttrValue,\n classAttrValue,\n}: ViewportHeightInspectionNode) =>\n (heightAttrValue ? parseViewportHeightCss(heightAttrValue) : null) ||\n (styleAttrValue\n ? extractHeightValueFromInlineStyle(styleAttrValue, parseViewportHeightCss)\n : null) ||\n (classAttrValue\n ? extractViewportHeightFromTailwindClass(classAttrValue)\n : null);\n\nexport const isFullViewportHeightCss = (value: string | null) =>\n value === \"100vh\" ||\n value === \"100dvh\" ||\n value === \"100svh\" ||\n value === \"100lvh\";\n\nexport const inspectViewportHeightFromNode = (\n node: ViewportHeightInspectionNode | null\n): RootHeightMeta => {\n if (!node) {\n return EMPTY_ROOT_HEIGHT_META;\n }\n\n const viewportHeightCss = getViewportHeightCssFromNode(node);\n\n return {\n viewportHeightCss,\n hasFullViewportHeight: isFullViewportHeightCss(viewportHeightCss),\n };\n};\n\nexport const inspectViewportHeightFromHtmlRootString = (\n html: string\n): RootHeightMeta => {\n const normalized = html.trim();\n\n if (!normalized) {\n return EMPTY_ROOT_HEIGHT_META;\n }\n\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n const attrs = rootMatch?.[2] || \"\";\n\n return inspectViewportHeightFromNode({\n heightAttrValue:\n attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n styleAttrValue: attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n classAttrValue: attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n });\n};\n\nexport const inspectViewportHeightFromNodeChain = <T>(\n root: T | null,\n { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>\n): RootHeightMeta => {\n let currentNode = root;\n\n while (currentNode) {\n const heightMeta = inspectViewportHeightFromNode(getNode(currentNode));\n\n if (heightMeta.viewportHeightCss) {\n return heightMeta;\n }\n\n currentNode = getSingleChild(currentNode);\n }\n\n return EMPTY_ROOT_HEIGHT_META;\n};\n\nexport const resolveExplicitHeightFromNode = (\n node: ViewportHeightInspectionNode | null,\n parentViewportHeight: number\n) => {\n if (!node) {\n return null;\n }\n\n const viewportHeightCss = getViewportHeightCssFromNode(node);\n\n if (viewportHeightCss) {\n return parseExplicitHeight(viewportHeightCss, parentViewportHeight);\n }\n\n const styleExplicitHeight = node.styleAttrValue\n ? extractHeightValueFromInlineStyle(node.styleAttrValue, (value) => {\n const parsedHeight = parseExplicitHeight(value, parentViewportHeight);\n\n return parsedHeight === null ? null : String(parsedHeight);\n })\n : null;\n\n if (styleExplicitHeight) {\n return Number.parseFloat(styleExplicitHeight);\n }\n\n const attrExplicitHeight = node.heightAttrValue\n ? parseExplicitHeight(node.heightAttrValue, parentViewportHeight)\n : null;\n\n if (attrExplicitHeight !== null) {\n return attrExplicitHeight;\n }\n\n const classExplicitHeight = node.classAttrValue\n ? extractPixelHeightFromTailwindClass(node.classAttrValue)\n : null;\n\n return classExplicitHeight\n ? parseExplicitHeight(classExplicitHeight, parentViewportHeight)\n : null;\n};\n\nexport const resolveExplicitHeightFromNodeChain = <T>(\n root: T | null,\n parentViewportHeight: number,\n { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>\n) => {\n let currentNode = root;\n\n while (currentNode) {\n const resolvedHeight = resolveExplicitHeightFromNode(\n getNode(currentNode),\n parentViewportHeight\n );\n\n if (resolvedHeight !== null) {\n return resolvedHeight;\n }\n\n currentNode = getSingleChild(currentNode);\n }\n\n return null;\n};\n"],"names":["EMPTY_ROOT_HEIGHT_META","INLINE_HEIGHT_PROPERTY_PATTERN","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","parseExplicitHeight","parentViewportHeight","numeric","extractHeightValueFromInlineStyle","styleAttrValue","parser","matches","match","parsedValue","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","extractPixelHeightFromTailwindClass","getViewportHeightCssFromNode","heightAttrValue","classAttrValue","isFullViewportHeightCss","inspectViewportHeightFromNode","node","viewportHeightCss","inspectViewportHeightFromHtmlRootString","html","attrs","inspectViewportHeightFromNodeChain","root","getNode","getSingleChild","currentNode","heightMeta","resolveExplicitHeightFromNode","styleExplicitHeight","parsedHeight","attrExplicitHeight","classExplicitHeight","resolveExplicitHeightFromNodeChain","resolvedHeight"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ViewportHeightInspectionNode {
|
|
2
|
+
heightAttrValue?: string | null;
|
|
3
|
+
styleAttrValue?: string | null;
|
|
4
|
+
classAttrValue?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface RootHeightMeta {
|
|
7
|
+
viewportHeightCss: string | null;
|
|
8
|
+
hasFullViewportHeight: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ViewportHeightTraversalOptions<T> {
|
|
11
|
+
getNode: (node: T) => ViewportHeightInspectionNode;
|
|
12
|
+
getSingleChild: (node: T) => T | null;
|
|
13
|
+
}
|
|
14
|
+
export declare const EMPTY_ROOT_HEIGHT_META: RootHeightMeta;
|
|
15
|
+
export declare const normalizeTailwindHeightTokens: (className: string) => string[];
|
|
16
|
+
export declare const parseViewportHeightCss: (value: string) => string | null;
|
|
17
|
+
export declare const parseExplicitHeight: (value: string, parentViewportHeight: number) => number | null;
|
|
18
|
+
export declare const extractViewportHeightFromTailwindClass: (className: string) => string | null;
|
|
19
|
+
export declare const isFullViewportHeightCss: (value: string | null) => value is "100dvh" | "100svh" | "100lvh" | "100vh";
|
|
20
|
+
export declare const inspectViewportHeightFromNode: (node: ViewportHeightInspectionNode | null) => RootHeightMeta;
|
|
21
|
+
export declare const inspectViewportHeightFromHtmlRootString: (html: string) => RootHeightMeta;
|
|
22
|
+
export declare const inspectViewportHeightFromNodeChain: <T>(root: T | null, { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>) => RootHeightMeta;
|
|
23
|
+
export declare const resolveExplicitHeightFromNode: (node: ViewportHeightInspectionNode | null, parentViewportHeight: number) => number | null;
|
|
24
|
+
export declare const resolveExplicitHeightFromNodeChain: <T>(root: T | null, parentViewportHeight: number, { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>) => number | null;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
const h = {
|
|
2
|
+
viewportHeightCss: null,
|
|
3
|
+
hasFullViewportHeight: !1
|
|
4
|
+
}, p = /\b(?:min-height|height)\s*:\s*([^;]+)/gi, c = (t) => t.split(/\s+/).filter(Boolean).map((e) => e.split(":").pop() || e), u = (t) => {
|
|
5
|
+
const e = t.trim().toLowerCase();
|
|
6
|
+
if (!e)
|
|
7
|
+
return null;
|
|
8
|
+
const r = e.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);
|
|
9
|
+
return r ? `${r[1]}${r[2].toLowerCase()}` : null;
|
|
10
|
+
}, s = (t, e) => {
|
|
11
|
+
const r = t.trim().toLowerCase();
|
|
12
|
+
if (!r)
|
|
13
|
+
return null;
|
|
14
|
+
const n = Number.parseFloat(r);
|
|
15
|
+
return Number.isNaN(n) ? null : /(dvh|svh|lvh|vh)$/i.test(r) ? n / 100 * e : r.endsWith("px") || /^[0-9.]+$/.test(r) ? n : null;
|
|
16
|
+
}, a = (t, e) => {
|
|
17
|
+
const r = t.matchAll(p);
|
|
18
|
+
for (const n of r) {
|
|
19
|
+
const i = e(n[1] || "");
|
|
20
|
+
if (i)
|
|
21
|
+
return i;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}, g = (t) => {
|
|
25
|
+
if (!t.trim())
|
|
26
|
+
return null;
|
|
27
|
+
const e = c(t);
|
|
28
|
+
if (e.includes("h-screen") || e.includes("h-dvh") || e.includes("min-h-screen") || e.includes("min-h-dvh"))
|
|
29
|
+
return "100dvh";
|
|
30
|
+
if (e.includes("h-svh") || e.includes("min-h-svh"))
|
|
31
|
+
return "100svh";
|
|
32
|
+
if (e.includes("h-lvh") || e.includes("min-h-lvh"))
|
|
33
|
+
return "100lvh";
|
|
34
|
+
const r = e.find(
|
|
35
|
+
(i) => /^(h|min-h)-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(i)
|
|
36
|
+
);
|
|
37
|
+
if (!r)
|
|
38
|
+
return null;
|
|
39
|
+
const n = r.match(
|
|
40
|
+
/^(h|min-h)-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i
|
|
41
|
+
);
|
|
42
|
+
return n ? `${n[2]}${n[3].toLowerCase()}` : null;
|
|
43
|
+
}, f = (t) => {
|
|
44
|
+
if (!t.trim())
|
|
45
|
+
return null;
|
|
46
|
+
const r = c(t).find(
|
|
47
|
+
(i) => /^(h|min-h)-\[[0-9.]+px\]$/i.test(i)
|
|
48
|
+
);
|
|
49
|
+
if (!r)
|
|
50
|
+
return null;
|
|
51
|
+
const n = r.match(/^(h|min-h)-\[([0-9.]+)px\]$/i);
|
|
52
|
+
return n ? `${n[2]}px` : null;
|
|
53
|
+
}, m = ({
|
|
54
|
+
heightAttrValue: t,
|
|
55
|
+
styleAttrValue: e,
|
|
56
|
+
classAttrValue: r
|
|
57
|
+
}) => (t ? u(t) : null) || (e ? a(e, u) : null) || (r ? g(r) : null), H = (t) => t === "100vh" || t === "100dvh" || t === "100svh" || t === "100lvh", d = (t) => {
|
|
58
|
+
if (!t)
|
|
59
|
+
return h;
|
|
60
|
+
const e = m(t);
|
|
61
|
+
return {
|
|
62
|
+
viewportHeightCss: e,
|
|
63
|
+
hasFullViewportHeight: H(e)
|
|
64
|
+
};
|
|
65
|
+
}, T = (t) => {
|
|
66
|
+
const e = t.trim();
|
|
67
|
+
if (!e)
|
|
68
|
+
return h;
|
|
69
|
+
const n = e.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/)?.[2] || "";
|
|
70
|
+
return d({
|
|
71
|
+
heightAttrValue: n.match(/\bheight\s*=\s*["']([^"']+)["']/i)?.[1] ?? null,
|
|
72
|
+
styleAttrValue: n.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1] ?? null,
|
|
73
|
+
classAttrValue: n.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1] ?? null
|
|
74
|
+
});
|
|
75
|
+
}, x = (t, { getNode: e, getSingleChild: r }) => {
|
|
76
|
+
let n = t;
|
|
77
|
+
for (; n; ) {
|
|
78
|
+
const i = d(e(n));
|
|
79
|
+
if (i.viewportHeightCss)
|
|
80
|
+
return i;
|
|
81
|
+
n = r(n);
|
|
82
|
+
}
|
|
83
|
+
return h;
|
|
84
|
+
}, w = (t, e) => {
|
|
85
|
+
if (!t)
|
|
86
|
+
return null;
|
|
87
|
+
const r = m(t);
|
|
88
|
+
if (r)
|
|
89
|
+
return s(r, e);
|
|
90
|
+
const n = t.styleAttrValue ? a(t.styleAttrValue, (v) => {
|
|
91
|
+
const o = s(v, e);
|
|
92
|
+
return o === null ? null : String(o);
|
|
93
|
+
}) : null;
|
|
94
|
+
if (n)
|
|
95
|
+
return Number.parseFloat(n);
|
|
96
|
+
const i = t.heightAttrValue ? s(t.heightAttrValue, e) : null;
|
|
97
|
+
if (i !== null)
|
|
98
|
+
return i;
|
|
99
|
+
const l = t.classAttrValue ? f(t.classAttrValue) : null;
|
|
100
|
+
return l ? s(l, e) : null;
|
|
101
|
+
}, C = (t, e, { getNode: r, getSingleChild: n }) => {
|
|
102
|
+
let i = t;
|
|
103
|
+
for (; i; ) {
|
|
104
|
+
const l = w(
|
|
105
|
+
r(i),
|
|
106
|
+
e
|
|
107
|
+
);
|
|
108
|
+
if (l !== null)
|
|
109
|
+
return l;
|
|
110
|
+
i = n(i);
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
};
|
|
114
|
+
export {
|
|
115
|
+
h as EMPTY_ROOT_HEIGHT_META,
|
|
116
|
+
g as extractViewportHeightFromTailwindClass,
|
|
117
|
+
T as inspectViewportHeightFromHtmlRootString,
|
|
118
|
+
d as inspectViewportHeightFromNode,
|
|
119
|
+
x as inspectViewportHeightFromNodeChain,
|
|
120
|
+
H as isFullViewportHeightCss,
|
|
121
|
+
c as normalizeTailwindHeightTokens,
|
|
122
|
+
s as parseExplicitHeight,
|
|
123
|
+
u as parseViewportHeightCss,
|
|
124
|
+
w as resolveExplicitHeightFromNode,
|
|
125
|
+
C as resolveExplicitHeightFromNodeChain
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=iframe-viewport-height.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe-viewport-height.es.js","sources":["../../../../src/components/ContentRender/utils/iframe-viewport-height.ts"],"sourcesContent":["export interface ViewportHeightInspectionNode {\n heightAttrValue?: string | null;\n styleAttrValue?: string | null;\n classAttrValue?: string | null;\n}\n\nexport interface RootHeightMeta {\n viewportHeightCss: string | null;\n hasFullViewportHeight: boolean;\n}\n\nexport interface ViewportHeightTraversalOptions<T> {\n getNode: (node: T) => ViewportHeightInspectionNode;\n getSingleChild: (node: T) => T | null;\n}\n\nexport const EMPTY_ROOT_HEIGHT_META: RootHeightMeta = {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n};\n\nconst INLINE_HEIGHT_PROPERTY_PATTERN =\n /\\b(?:min-height|height)\\s*:\\s*([^;]+)/gi;\n\nexport const normalizeTailwindHeightTokens = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => token.split(\":\").pop() || token);\n\nexport const parseViewportHeightCss = (value: string) => {\n const normalized = value.trim().toLowerCase();\n\n if (!normalized) {\n return null;\n }\n\n const matched = normalized.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);\n\n if (!matched) {\n return null;\n }\n\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nexport const parseExplicitHeight = (\n value: string,\n parentViewportHeight: number\n) => {\n const normalized = value.trim().toLowerCase();\n\n if (!normalized) {\n return null;\n }\n\n const numeric = Number.parseFloat(normalized);\n\n if (Number.isNaN(numeric)) {\n return null;\n }\n\n if (/(dvh|svh|lvh|vh)$/i.test(normalized)) {\n return (numeric / 100) * parentViewportHeight;\n }\n\n if (normalized.endsWith(\"px\") || /^[0-9.]+$/.test(normalized)) {\n return numeric;\n }\n\n return null;\n};\n\nconst extractHeightValueFromInlineStyle = (\n styleAttrValue: string,\n parser: (value: string) => string | null\n) => {\n const matches = styleAttrValue.matchAll(INLINE_HEIGHT_PROPERTY_PATTERN);\n\n for (const match of matches) {\n const parsedValue = parser(match[1] || \"\");\n\n if (parsedValue) {\n return parsedValue;\n }\n }\n\n return null;\n};\n\nexport const extractViewportHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) {\n return null;\n }\n\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n\n if (\n normalizedTokens.includes(\"h-screen\") ||\n normalizedTokens.includes(\"h-dvh\") ||\n normalizedTokens.includes(\"min-h-screen\") ||\n normalizedTokens.includes(\"min-h-dvh\")\n ) {\n return \"100dvh\";\n }\n\n if (\n normalizedTokens.includes(\"h-svh\") ||\n normalizedTokens.includes(\"min-h-svh\")\n ) {\n return \"100svh\";\n }\n\n if (\n normalizedTokens.includes(\"h-lvh\") ||\n normalizedTokens.includes(\"min-h-lvh\")\n ) {\n return \"100lvh\";\n }\n\n const arbitraryToken = normalizedTokens.find((token) =>\n /^(h|min-h)-\\[[0-9.]+(vh|dvh|svh|lvh)\\]$/i.test(token)\n );\n\n if (!arbitraryToken) {\n return null;\n }\n\n const matched = arbitraryToken.match(\n /^(h|min-h)-\\[([0-9.]+)(vh|dvh|svh|lvh)\\]$/i\n );\n\n if (!matched) {\n return null;\n }\n\n return `${matched[2]}${matched[3].toLowerCase()}`;\n};\n\nconst extractPixelHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) {\n return null;\n }\n\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n const arbitraryToken = normalizedTokens.find((token) =>\n /^(h|min-h)-\\[[0-9.]+px\\]$/i.test(token)\n );\n\n if (!arbitraryToken) {\n return null;\n }\n\n const matched = arbitraryToken.match(/^(h|min-h)-\\[([0-9.]+)px\\]$/i);\n\n if (!matched) {\n return null;\n }\n\n return `${matched[2]}px`;\n};\n\nconst getViewportHeightCssFromNode = ({\n heightAttrValue,\n styleAttrValue,\n classAttrValue,\n}: ViewportHeightInspectionNode) =>\n (heightAttrValue ? parseViewportHeightCss(heightAttrValue) : null) ||\n (styleAttrValue\n ? extractHeightValueFromInlineStyle(styleAttrValue, parseViewportHeightCss)\n : null) ||\n (classAttrValue\n ? extractViewportHeightFromTailwindClass(classAttrValue)\n : null);\n\nexport const isFullViewportHeightCss = (value: string | null) =>\n value === \"100vh\" ||\n value === \"100dvh\" ||\n value === \"100svh\" ||\n value === \"100lvh\";\n\nexport const inspectViewportHeightFromNode = (\n node: ViewportHeightInspectionNode | null\n): RootHeightMeta => {\n if (!node) {\n return EMPTY_ROOT_HEIGHT_META;\n }\n\n const viewportHeightCss = getViewportHeightCssFromNode(node);\n\n return {\n viewportHeightCss,\n hasFullViewportHeight: isFullViewportHeightCss(viewportHeightCss),\n };\n};\n\nexport const inspectViewportHeightFromHtmlRootString = (\n html: string\n): RootHeightMeta => {\n const normalized = html.trim();\n\n if (!normalized) {\n return EMPTY_ROOT_HEIGHT_META;\n }\n\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n const attrs = rootMatch?.[2] || \"\";\n\n return inspectViewportHeightFromNode({\n heightAttrValue:\n attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n styleAttrValue: attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n classAttrValue: attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? null,\n });\n};\n\nexport const inspectViewportHeightFromNodeChain = <T>(\n root: T | null,\n { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>\n): RootHeightMeta => {\n let currentNode = root;\n\n while (currentNode) {\n const heightMeta = inspectViewportHeightFromNode(getNode(currentNode));\n\n if (heightMeta.viewportHeightCss) {\n return heightMeta;\n }\n\n currentNode = getSingleChild(currentNode);\n }\n\n return EMPTY_ROOT_HEIGHT_META;\n};\n\nexport const resolveExplicitHeightFromNode = (\n node: ViewportHeightInspectionNode | null,\n parentViewportHeight: number\n) => {\n if (!node) {\n return null;\n }\n\n const viewportHeightCss = getViewportHeightCssFromNode(node);\n\n if (viewportHeightCss) {\n return parseExplicitHeight(viewportHeightCss, parentViewportHeight);\n }\n\n const styleExplicitHeight = node.styleAttrValue\n ? extractHeightValueFromInlineStyle(node.styleAttrValue, (value) => {\n const parsedHeight = parseExplicitHeight(value, parentViewportHeight);\n\n return parsedHeight === null ? null : String(parsedHeight);\n })\n : null;\n\n if (styleExplicitHeight) {\n return Number.parseFloat(styleExplicitHeight);\n }\n\n const attrExplicitHeight = node.heightAttrValue\n ? parseExplicitHeight(node.heightAttrValue, parentViewportHeight)\n : null;\n\n if (attrExplicitHeight !== null) {\n return attrExplicitHeight;\n }\n\n const classExplicitHeight = node.classAttrValue\n ? extractPixelHeightFromTailwindClass(node.classAttrValue)\n : null;\n\n return classExplicitHeight\n ? parseExplicitHeight(classExplicitHeight, parentViewportHeight)\n : null;\n};\n\nexport const resolveExplicitHeightFromNodeChain = <T>(\n root: T | null,\n parentViewportHeight: number,\n { getNode, getSingleChild }: ViewportHeightTraversalOptions<T>\n) => {\n let currentNode = root;\n\n while (currentNode) {\n const resolvedHeight = resolveExplicitHeightFromNode(\n getNode(currentNode),\n parentViewportHeight\n );\n\n if (resolvedHeight !== null) {\n return resolvedHeight;\n }\n\n currentNode = getSingleChild(currentNode);\n }\n\n return null;\n};\n"],"names":["EMPTY_ROOT_HEIGHT_META","INLINE_HEIGHT_PROPERTY_PATTERN","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","parseExplicitHeight","parentViewportHeight","numeric","extractHeightValueFromInlineStyle","styleAttrValue","parser","matches","match","parsedValue","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","extractPixelHeightFromTailwindClass","getViewportHeightCssFromNode","heightAttrValue","classAttrValue","isFullViewportHeightCss","inspectViewportHeightFromNode","node","viewportHeightCss","inspectViewportHeightFromHtmlRootString","html","attrs","inspectViewportHeightFromNodeChain","root","getNode","getSingleChild","currentNode","heightMeta","resolveExplicitHeightFromNode","styleExplicitHeight","parsedHeight","attrExplicitHeight","classExplicitHeight","resolveExplicitHeightFromNodeChain","resolvedHeight"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("../../_virtual/jsx-runtime.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("../../_virtual/jsx-runtime.cjs.js"),B=require("../ContentRender/ContentRender.cjs.js");require("react");require("react-dom/client");require("../ui/inputGroup/input-group.cjs.js");;/* empty css */const C=({initialContentList:s=[],customRenderBar:n,onSend:d,typingSpeed:i,enableTypewriter:a=!1,onBlockComplete:o,confirmButtonText:l,copyButtonText:c,copiedButtonText:m,beforeSend:p,interactionDefaultValueOptions:x})=>u.jsxRuntimeExports.jsx("div",{className:"markdown-flow",children:s.map((e,r)=>{const t=e.isFinished??!1,y=!t&&a,S=t?void 0:d,T=t?void 0:i,f=p??(()=>!0);return u.jsxRuntimeExports.jsx(B.default,{content:e.content,userInput:e.userInput,defaultInputText:e.defaultInputText,defaultButtonText:e.defaultButtonText,defaultSelectedValues:e.defaultSelectedValues,readonly:e.readonly,enableTypewriter:y,customRenderBar:e.customRenderBar||n,onSend:S,beforeSend:f,interactionDefaultValueOptions:x,onClickCustomButtonAfterContent:e.onClickCustomButtonAfterContent,typingSpeed:T,confirmButtonText:l,copyButtonText:c,copiedButtonText:m,dynamicInteractionFormat:e.dynamicInteractionFormat,onTypeFinished:()=>{o?.(r)}},r)})});exports.default=C;
|
|
2
2
|
//# sourceMappingURL=MarkdownFlow.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlow.cjs.js","sources":["../../../src/components/MarkdownFlow/MarkdownFlow.tsx"],"sourcesContent":["import React from \"react\";\nimport ContentRender from \"../ContentRender\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport \"./markdownFlow.css\";\n\nexport interface MarkdownFlowProps {\n initialContentList?: {\n content: string;\n isFinished?: boolean;\n defaultInputText?: string;\n defaultButtonText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n dynamicInteractionFormat?: string;\n }[];\n customRenderBar?: CustomRenderBarProps;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n onBlockComplete?: (blockIndex: number) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text for code blocks\n copyButtonText?: string;\n // Copied state text for code blocks\n copiedButtonText?: string;\n beforeSend?: (content: OnSendContentParams) => boolean;\n}\n\nconst MarkdownFlow: React.FC<MarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend: onSendProp,\n typingSpeed: typingSpeedProp,\n enableTypewriter = false,\n onBlockComplete,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend: beforeSendProp,\n}) => {\n return (\n <div className=\"markdown-flow\">\n {initialContentList.map((contentInfo, index) => {\n const isFinished = contentInfo.isFinished ?? false;\n const enableTypewriterForBlock = !isFinished && enableTypewriter;\n const onSend = isFinished ? undefined : onSendProp;\n const typingSpeed = isFinished ? undefined : typingSpeedProp;\n const beforeSend = beforeSendProp ?? (() => true);\n return (\n <ContentRender\n key={index}\n content={contentInfo.content}\n defaultInputText={contentInfo.defaultInputText}\n defaultButtonText={contentInfo.defaultButtonText}\n defaultSelectedValues={contentInfo.defaultSelectedValues}\n readonly={contentInfo.readonly}\n enableTypewriter={enableTypewriterForBlock}\n customRenderBar={contentInfo.customRenderBar || customRenderBar}\n onSend={onSend}\n beforeSend={beforeSend}\n onClickCustomButtonAfterContent={\n contentInfo.onClickCustomButtonAfterContent\n }\n typingSpeed={typingSpeed}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n dynamicInteractionFormat={contentInfo.dynamicInteractionFormat}\n onTypeFinished={() => {\n onBlockComplete?.(index);\n }}\n />\n );\n })}\n </div>\n );\n};\n\nexport default MarkdownFlow;\n"],"names":["MarkdownFlow","initialContentList","customRenderBar","onSendProp","typingSpeedProp","enableTypewriter","onBlockComplete","confirmButtonText","copyButtonText","copiedButtonText","beforeSendProp","jsx","contentInfo","index","isFinished","enableTypewriterForBlock","onSend","typingSpeed","beforeSend","ContentRender"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MarkdownFlow.cjs.js","sources":["../../../src/components/MarkdownFlow/MarkdownFlow.tsx"],"sourcesContent":["import React from \"react\";\nimport type { InteractionDefaultValueOptions } from \"../../lib/interaction-defaults\";\nimport ContentRender from \"../ContentRender\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport \"./markdownFlow.css\";\n\nexport interface MarkdownFlowProps {\n initialContentList?: {\n content: string;\n isFinished?: boolean;\n userInput?: string;\n defaultInputText?: string;\n defaultButtonText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n dynamicInteractionFormat?: string;\n }[];\n customRenderBar?: CustomRenderBarProps;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n onBlockComplete?: (blockIndex: number) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text for code blocks\n copyButtonText?: string;\n // Copied state text for code blocks\n copiedButtonText?: string;\n beforeSend?: (content: OnSendContentParams) => boolean;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n}\n\nconst MarkdownFlow: React.FC<MarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend: onSendProp,\n typingSpeed: typingSpeedProp,\n enableTypewriter = false,\n onBlockComplete,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend: beforeSendProp,\n interactionDefaultValueOptions,\n}) => {\n return (\n <div className=\"markdown-flow\">\n {initialContentList.map((contentInfo, index) => {\n const isFinished = contentInfo.isFinished ?? false;\n const enableTypewriterForBlock = !isFinished && enableTypewriter;\n const onSend = isFinished ? undefined : onSendProp;\n const typingSpeed = isFinished ? undefined : typingSpeedProp;\n const beforeSend = beforeSendProp ?? (() => true);\n return (\n <ContentRender\n key={index}\n content={contentInfo.content}\n userInput={contentInfo.userInput}\n defaultInputText={contentInfo.defaultInputText}\n defaultButtonText={contentInfo.defaultButtonText}\n defaultSelectedValues={contentInfo.defaultSelectedValues}\n readonly={contentInfo.readonly}\n enableTypewriter={enableTypewriterForBlock}\n customRenderBar={contentInfo.customRenderBar || customRenderBar}\n onSend={onSend}\n beforeSend={beforeSend}\n interactionDefaultValueOptions={interactionDefaultValueOptions}\n onClickCustomButtonAfterContent={\n contentInfo.onClickCustomButtonAfterContent\n }\n typingSpeed={typingSpeed}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n dynamicInteractionFormat={contentInfo.dynamicInteractionFormat}\n onTypeFinished={() => {\n onBlockComplete?.(index);\n }}\n />\n );\n })}\n </div>\n );\n};\n\nexport default MarkdownFlow;\n"],"names":["MarkdownFlow","initialContentList","customRenderBar","onSendProp","typingSpeedProp","enableTypewriter","onBlockComplete","confirmButtonText","copyButtonText","copiedButtonText","beforeSendProp","interactionDefaultValueOptions","jsx","contentInfo","index","isFinished","enableTypewriterForBlock","onSend","typingSpeed","beforeSend","ContentRender"],"mappings":"qVAkCA,MAAMA,EAA4C,CAAC,CACjD,mBAAAC,EAAqB,CAAA,EACrB,gBAAAC,EACA,OAAQC,EACR,YAAaC,EACb,iBAAAC,EAAmB,GACnB,gBAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,WAAYC,EACZ,+BAAAC,CACF,IAEIC,wBAAC,OAAI,UAAU,gBACZ,WAAmB,IAAI,CAACC,EAAaC,IAAU,CAC9C,MAAMC,EAAaF,EAAY,YAAc,GACvCG,EAA2B,CAACD,GAAcV,EAC1CY,EAASF,EAAa,OAAYZ,EAClCe,EAAcH,EAAa,OAAYX,EACvCe,EAAaT,IAAmB,IAAM,IAC5C,OACEE,EAAAA,kBAAAA,IAACQ,EAAAA,QAAA,CAEC,QAASP,EAAY,QACrB,UAAWA,EAAY,UACvB,iBAAkBA,EAAY,iBAC9B,kBAAmBA,EAAY,kBAC/B,sBAAuBA,EAAY,sBACnC,SAAUA,EAAY,SACtB,iBAAkBG,EAClB,gBAAiBH,EAAY,iBAAmBX,EAChD,OAAAe,EACA,WAAAE,EACA,+BAAAR,EACA,gCACEE,EAAY,gCAEd,YAAAK,EACA,kBAAAX,EACA,eAAAC,EACA,iBAAAC,EACA,yBAA0BI,EAAY,yBACtC,eAAgB,IAAM,CACpBP,IAAkBQ,CAAK,CACzB,CAAA,EAtBKA,CAAA,CAyBX,CAAC,CAAA,CACH"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
+
import { InteractionDefaultValueOptions } from '../../lib/interaction-defaults';
|
|
2
3
|
import { CustomRenderBarProps, OnSendContentParams } from '../types';
|
|
3
4
|
export interface MarkdownFlowProps {
|
|
4
5
|
initialContentList?: {
|
|
5
6
|
content: string;
|
|
6
7
|
isFinished?: boolean;
|
|
8
|
+
userInput?: string;
|
|
7
9
|
defaultInputText?: string;
|
|
8
10
|
defaultButtonText?: string;
|
|
9
11
|
defaultSelectedValues?: string[];
|
|
@@ -21,6 +23,7 @@ export interface MarkdownFlowProps {
|
|
|
21
23
|
copyButtonText?: string;
|
|
22
24
|
copiedButtonText?: string;
|
|
23
25
|
beforeSend?: (content: OnSendContentParams) => boolean;
|
|
26
|
+
interactionDefaultValueOptions?: InteractionDefaultValueOptions;
|
|
24
27
|
}
|
|
25
28
|
declare const MarkdownFlow: React.FC<MarkdownFlowProps>;
|
|
26
29
|
export default MarkdownFlow;
|
|
@@ -1,48 +1,51 @@
|
|
|
1
1
|
import { j as o } from "../../_virtual/jsx-runtime.es.js";
|
|
2
|
-
import
|
|
2
|
+
import C from "../ContentRender/ContentRender.es.js";
|
|
3
3
|
import "react";
|
|
4
4
|
import "react-dom/client";
|
|
5
5
|
import "../ui/inputGroup/input-group.es.js";
|
|
6
6
|
/* empty css */
|
|
7
|
-
const
|
|
7
|
+
const j = ({
|
|
8
8
|
initialContentList: a = [],
|
|
9
9
|
customRenderBar: d,
|
|
10
10
|
onSend: n,
|
|
11
|
-
typingSpeed:
|
|
12
|
-
enableTypewriter:
|
|
13
|
-
onBlockComplete:
|
|
14
|
-
confirmButtonText:
|
|
11
|
+
typingSpeed: s,
|
|
12
|
+
enableTypewriter: i = !1,
|
|
13
|
+
onBlockComplete: u,
|
|
14
|
+
confirmButtonText: l,
|
|
15
15
|
copyButtonText: m,
|
|
16
16
|
copiedButtonText: p,
|
|
17
|
-
beforeSend: c
|
|
17
|
+
beforeSend: c,
|
|
18
|
+
interactionDefaultValueOptions: y
|
|
18
19
|
}) => /* @__PURE__ */ o.jsx("div", { className: "markdown-flow", children: a.map((e, r) => {
|
|
19
|
-
const t = e.isFinished ?? !1,
|
|
20
|
+
const t = e.isFinished ?? !1, x = !t && i, S = t ? void 0 : n, f = t ? void 0 : s, B = c ?? (() => !0);
|
|
20
21
|
return /* @__PURE__ */ o.jsx(
|
|
21
|
-
|
|
22
|
+
C,
|
|
22
23
|
{
|
|
23
24
|
content: e.content,
|
|
25
|
+
userInput: e.userInput,
|
|
24
26
|
defaultInputText: e.defaultInputText,
|
|
25
27
|
defaultButtonText: e.defaultButtonText,
|
|
26
28
|
defaultSelectedValues: e.defaultSelectedValues,
|
|
27
29
|
readonly: e.readonly,
|
|
28
|
-
enableTypewriter:
|
|
30
|
+
enableTypewriter: x,
|
|
29
31
|
customRenderBar: e.customRenderBar || d,
|
|
30
|
-
onSend:
|
|
31
|
-
beforeSend:
|
|
32
|
+
onSend: S,
|
|
33
|
+
beforeSend: B,
|
|
34
|
+
interactionDefaultValueOptions: y,
|
|
32
35
|
onClickCustomButtonAfterContent: e.onClickCustomButtonAfterContent,
|
|
33
|
-
typingSpeed:
|
|
34
|
-
confirmButtonText:
|
|
36
|
+
typingSpeed: f,
|
|
37
|
+
confirmButtonText: l,
|
|
35
38
|
copyButtonText: m,
|
|
36
39
|
copiedButtonText: p,
|
|
37
40
|
dynamicInteractionFormat: e.dynamicInteractionFormat,
|
|
38
41
|
onTypeFinished: () => {
|
|
39
|
-
|
|
42
|
+
u?.(r);
|
|
40
43
|
}
|
|
41
44
|
},
|
|
42
45
|
r
|
|
43
46
|
);
|
|
44
47
|
}) });
|
|
45
48
|
export {
|
|
46
|
-
|
|
49
|
+
j as default
|
|
47
50
|
};
|
|
48
51
|
//# sourceMappingURL=MarkdownFlow.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlow.es.js","sources":["../../../src/components/MarkdownFlow/MarkdownFlow.tsx"],"sourcesContent":["import React from \"react\";\nimport ContentRender from \"../ContentRender\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport \"./markdownFlow.css\";\n\nexport interface MarkdownFlowProps {\n initialContentList?: {\n content: string;\n isFinished?: boolean;\n defaultInputText?: string;\n defaultButtonText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n dynamicInteractionFormat?: string;\n }[];\n customRenderBar?: CustomRenderBarProps;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n onBlockComplete?: (blockIndex: number) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text for code blocks\n copyButtonText?: string;\n // Copied state text for code blocks\n copiedButtonText?: string;\n beforeSend?: (content: OnSendContentParams) => boolean;\n}\n\nconst MarkdownFlow: React.FC<MarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend: onSendProp,\n typingSpeed: typingSpeedProp,\n enableTypewriter = false,\n onBlockComplete,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend: beforeSendProp,\n}) => {\n return (\n <div className=\"markdown-flow\">\n {initialContentList.map((contentInfo, index) => {\n const isFinished = contentInfo.isFinished ?? false;\n const enableTypewriterForBlock = !isFinished && enableTypewriter;\n const onSend = isFinished ? undefined : onSendProp;\n const typingSpeed = isFinished ? undefined : typingSpeedProp;\n const beforeSend = beforeSendProp ?? (() => true);\n return (\n <ContentRender\n key={index}\n content={contentInfo.content}\n defaultInputText={contentInfo.defaultInputText}\n defaultButtonText={contentInfo.defaultButtonText}\n defaultSelectedValues={contentInfo.defaultSelectedValues}\n readonly={contentInfo.readonly}\n enableTypewriter={enableTypewriterForBlock}\n customRenderBar={contentInfo.customRenderBar || customRenderBar}\n onSend={onSend}\n beforeSend={beforeSend}\n onClickCustomButtonAfterContent={\n contentInfo.onClickCustomButtonAfterContent\n }\n typingSpeed={typingSpeed}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n dynamicInteractionFormat={contentInfo.dynamicInteractionFormat}\n onTypeFinished={() => {\n onBlockComplete?.(index);\n }}\n />\n );\n })}\n </div>\n );\n};\n\nexport default MarkdownFlow;\n"],"names":["MarkdownFlow","initialContentList","customRenderBar","onSendProp","typingSpeedProp","enableTypewriter","onBlockComplete","confirmButtonText","copyButtonText","copiedButtonText","beforeSendProp","jsx","contentInfo","index","isFinished","enableTypewriterForBlock","onSend","typingSpeed","beforeSend","ContentRender"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"MarkdownFlow.es.js","sources":["../../../src/components/MarkdownFlow/MarkdownFlow.tsx"],"sourcesContent":["import React from \"react\";\nimport type { InteractionDefaultValueOptions } from \"../../lib/interaction-defaults\";\nimport ContentRender from \"../ContentRender\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport \"./markdownFlow.css\";\n\nexport interface MarkdownFlowProps {\n initialContentList?: {\n content: string;\n isFinished?: boolean;\n userInput?: string;\n defaultInputText?: string;\n defaultButtonText?: string;\n defaultSelectedValues?: string[];\n readonly?: boolean;\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n dynamicInteractionFormat?: string;\n }[];\n customRenderBar?: CustomRenderBarProps;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n onBlockComplete?: (blockIndex: number) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text for code blocks\n copyButtonText?: string;\n // Copied state text for code blocks\n copiedButtonText?: string;\n beforeSend?: (content: OnSendContentParams) => boolean;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n}\n\nconst MarkdownFlow: React.FC<MarkdownFlowProps> = ({\n initialContentList = [],\n customRenderBar,\n onSend: onSendProp,\n typingSpeed: typingSpeedProp,\n enableTypewriter = false,\n onBlockComplete,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n beforeSend: beforeSendProp,\n interactionDefaultValueOptions,\n}) => {\n return (\n <div className=\"markdown-flow\">\n {initialContentList.map((contentInfo, index) => {\n const isFinished = contentInfo.isFinished ?? false;\n const enableTypewriterForBlock = !isFinished && enableTypewriter;\n const onSend = isFinished ? undefined : onSendProp;\n const typingSpeed = isFinished ? undefined : typingSpeedProp;\n const beforeSend = beforeSendProp ?? (() => true);\n return (\n <ContentRender\n key={index}\n content={contentInfo.content}\n userInput={contentInfo.userInput}\n defaultInputText={contentInfo.defaultInputText}\n defaultButtonText={contentInfo.defaultButtonText}\n defaultSelectedValues={contentInfo.defaultSelectedValues}\n readonly={contentInfo.readonly}\n enableTypewriter={enableTypewriterForBlock}\n customRenderBar={contentInfo.customRenderBar || customRenderBar}\n onSend={onSend}\n beforeSend={beforeSend}\n interactionDefaultValueOptions={interactionDefaultValueOptions}\n onClickCustomButtonAfterContent={\n contentInfo.onClickCustomButtonAfterContent\n }\n typingSpeed={typingSpeed}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n dynamicInteractionFormat={contentInfo.dynamicInteractionFormat}\n onTypeFinished={() => {\n onBlockComplete?.(index);\n }}\n />\n );\n })}\n </div>\n );\n};\n\nexport default MarkdownFlow;\n"],"names":["MarkdownFlow","initialContentList","customRenderBar","onSendProp","typingSpeedProp","enableTypewriter","onBlockComplete","confirmButtonText","copyButtonText","copiedButtonText","beforeSendProp","interactionDefaultValueOptions","jsx","contentInfo","index","isFinished","enableTypewriterForBlock","onSend","typingSpeed","beforeSend","ContentRender"],"mappings":";;;;;;AAkCA,MAAMA,IAA4C,CAAC;AAAA,EACjD,oBAAAC,IAAqB,CAAA;AAAA,EACrB,iBAAAC;AAAA,EACA,QAAQC;AAAA,EACR,aAAaC;AAAA,EACb,kBAAAC,IAAmB;AAAA,EACnB,iBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,YAAYC;AAAA,EACZ,gCAAAC;AACF,MAEIC,gBAAAA,MAAC,SAAI,WAAU,iBACZ,YAAmB,IAAI,CAACC,GAAaC,MAAU;AAC9C,QAAMC,IAAaF,EAAY,cAAc,IACvCG,IAA2B,CAACD,KAAcV,GAC1CY,IAASF,IAAa,SAAYZ,GAClCe,IAAcH,IAAa,SAAYX,GACvCe,IAAaT,MAAmB,MAAM;AAC5C,SACEE,gBAAAA,EAAAA;AAAAA,IAACQ;AAAA,IAAA;AAAA,MAEC,SAASP,EAAY;AAAA,MACrB,WAAWA,EAAY;AAAA,MACvB,kBAAkBA,EAAY;AAAA,MAC9B,mBAAmBA,EAAY;AAAA,MAC/B,uBAAuBA,EAAY;AAAA,MACnC,UAAUA,EAAY;AAAA,MACtB,kBAAkBG;AAAA,MAClB,iBAAiBH,EAAY,mBAAmBX;AAAA,MAChD,QAAAe;AAAA,MACA,YAAAE;AAAA,MACA,gCAAAR;AAAA,MACA,iCACEE,EAAY;AAAA,MAEd,aAAAK;AAAA,MACA,mBAAAX;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,0BAA0BI,EAAY;AAAA,MACtC,gBAAgB,MAAM;AACpB,QAAAP,IAAkBQ,CAAK;AAAA,MACzB;AAAA,IAAA;AAAA,IAtBKA;AAAA,EAAA;AAyBX,CAAC,EAAA,CACH;"}
|
|
@@ -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"),t=require("react"),J=require("../../lib/utils.cjs.js"),xe=require("./utils/playerCustomActions.cjs.js");;/* empty css */const he=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.cjs.js"),Re=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/volume-2.cjs.js"),ge=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js"),be=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.cjs.js"),je=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/maximize.cjs.js"),ye=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/file-pen-line.cjs.js"),Q=new Map,X=b=>{if(typeof window>"u"||!b||Q.has(b))return;const _=window.document.createElement("audio");_.preload="auto",_.setAttribute("playsinline","true"),_.src=b,_.load(),Q.set(b,_)},Ee=()=>r.jsxRuntimeExports.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"34",height:"34",viewBox:"0 0 34 34",fill:"none",children:[r.jsxRuntimeExports.jsx("path",{d:"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z",fill:"#0A0A0A"}),r.jsxRuntimeExports.jsx("path",{d:"M12 10H16V24H12V10ZM18 10H22V24H18V10Z",fill:"white"})]}),Se=()=>r.jsxRuntimeExports.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"34",height:"34",viewBox:"0 0 34 34",fill:"none",children:[r.jsxRuntimeExports.jsx("path",{d:"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z",fill:"#0A0A0A"}),r.jsxRuntimeExports.jsx("path",{d:"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z",fill:"white"})]}),ke=({audioList:b=[],className:_,currentAudioIndex:o=-1,defaultPlaying:x=!0,onLoadingChange:W,onPrev:Y,onNext:D,onFullscreen:I,onEnded:V,onInteractionToggle:ee,hasInteraction:te=!1,isInteractionOpen:re=!1,prevDisabled:ne=!1,nextDisabled:se=!1,showControls:ue=!0,customActions:F,...le})=>{const h=t.useRef(null),j=t.useRef(null),L=t.useRef(null),y=t.useRef(0),i=t.useRef(null),B=t.useRef(void 0),N=t.useRef([]),K=t.useRef(!1),d=t.useRef(!1),w=t.useRef(null),m=t.useRef(!1),s=t.useRef(!1),f=t.useRef(null),p=t.useRef(!1),E=t.useRef("unknown"),[U,c]=t.useState(x),a=o>=0?b[o]:void 0,A=a?.audioUrl,R=t.useMemo(()=>[...a?.audioSegments??[]].sort((e,l)=>e.segment_index-l.segment_index),[a?.audioSegments]),Z=t.useMemo(()=>xe.toPlayerCustomActionList(F),[F]),$=Z.length+4,ce=t.useMemo(()=>({"--slide-player-mobile-control-count":String($)}),[$]),T=t.useMemo(()=>a?a.audioKey??`${String(a.sequenceNumber??"none")}:${String(a.audioUrl??"")}`:"none",[a]);t.useEffect(()=>{B.current=a},[a]),t.useEffect(()=>{N.current=R},[R]),t.useEffect(()=>{const e=a?.audioUrl,l=o>=0?b[o+1]?.audioUrl:void 0;X(e),X(l)},[b,a?.audioUrl,o]);const n=t.useCallback(e=>{K.current!==e&&(K.current=e,W?.(e))},[W]),H=t.useCallback(e=>e instanceof DOMException?e.name==="NotAllowedError"||e.name==="SecurityError":!1,[]),S=t.useCallback(()=>x&&!d.current&&E.current!=="blocked",[x]),O=t.useCallback(e=>e?e.startsWith("data:")?e:`data:audio/mpeg;base64,${e}`:"",[]),z=t.useCallback(()=>{const e=i.current;return e==null||e<=0?0:N.current.slice(0,e).reduce((l,u)=>l+Math.max(Number(u.duration_ms??0),0),0)/1e3},[]),M=t.useCallback(()=>{const e=h.current;e&&(s.current=!1,d.current=!1,w.current=null,f.current=null,m.current=!1,p.current=!1,e.pause(),e.removeAttribute("src"),e.load(),j.current=null,y.current=0,i.current=null,c(!1),n(!1))},[n]),g=t.useCallback(e=>{const l=h.current;if(!l)return!1;const u=l.play();return u&&typeof u.then=="function"&&u.then(()=>{E.current==="unknown"&&(E.current="auto"),s.current=!1,p.current=!1}).catch(C=>{E.current==="unknown"&&H(C)&&(E.current="blocked",s.current=!1,n(!1)),p.current=!1,c(!1)}),!0},[H,n]),v=t.useCallback((e,l)=>{const u=h.current,C=N.current[e];if(!u||!C)return!1;const k=O(C.audio_data);y.current=e,i.current=null,m.current=!1,p.current=!0;const q=S();s.current=q,n(!1);const pe=j.current!==k;return w.current="segment",pe&&(u.pause(),u.removeAttribute("src"),u.load(),j.current=k,u.src=k,u.load()),f.current=0,u.readyState>0&&(u.currentTime=0,f.current=null),q?g(`start-segment:${l}`):(s.current=!1,p.current=!1,u.pause(),c(!1),!0)},[S,O,g,n]),P=t.useCallback(e=>{s.current=!1,m.current=!1,p.current=!1,c(!1),n(!1),o>=0&&V?.(o)},[o,V,n]),G=t.useCallback(()=>{const e=y.current+1,l=N.current,u=l[e],C=B.current,k=l.some(q=>q.is_final);if(u){v(e,"ended");return}if(C?.isAudioStreaming||!k){y.current=e,i.current=e,m.current=!0,s.current=x,c(!1),n(!0);return}P("segments-completed")},[x,P,v,n]);t.useEffect(()=>{if(L.current===T)return;L.current=T,y.current=0,i.current=null,m.current=!1,d.current=!1,s.current=!1,p.current=!1,w.current=null,j.current=null,n(!1);const e=h.current;e&&(e.pause(),e.removeAttribute("src"),e.load(),c(!1))},[o,T,R.length,A,n]),t.useEffect(()=>{const e=h.current;if(e){if(!a){M();return}if(A){const l=j.current!==A,u=S();if(w.current==="segment"&&!!j.current&&i.current===null){if(!u){s.current=!1,e.pause(),c(!1);return}e.paused&&(s.current=!0,g("keep-segment-source"));return}if(l){const k=i.current!==null?z():0;e.pause(),e.removeAttribute("src"),e.load(),j.current=A,w.current="url",e.src=A,e.load(),f.current=k,e.readyState>0&&(e.currentTime=k,f.current=null)}if(s.current=u,m.current=!1,p.current=!1,n(!1),!u){s.current=!1,e.pause(),c(!1);return}g(l?"sync-url-init":"sync-url");return}if(i.current!==null){if(i.current<R.length){if(d.current){c(!1),n(!1);return}v(i.current,"wait-resume");return}m.current=!0,s.current=S(),c(!1),n(S());return}if(!R.length){if(a.isAudioStreaming){i.current=y.current,m.current=!0,s.current=S(),c(!1),n(S());return}M();return}if(!j.current){v(Math.min(y.current,R.length-1),"effect-init");return}if(!x||d.current){s.current=!1,e.pause(),c(!1);return}e.paused&&(s.current=!0,g("sync-paused-retry"))}},[a,o,R,A,x,S,M,v,g,z,n]),t.useEffect(()=>M,[M]);const ae=t.useCallback(()=>{c(!0),n(!1)},[n]),oe=t.useCallback(()=>{m.current||p.current||c(!1)},[o]),ie=t.useCallback(()=>{const e=h.current;e&&f.current!==null&&(e.currentTime=f.current,f.current=null),!(!s.current||!x)&&g("canplay")},[o,x,g]),fe=t.useCallback(()=>{const e=h.current;e&&f.current!==null&&(e.currentTime=f.current,f.current=null)},[o]),de=t.useCallback(()=>{const e=w.current==="url"||N.current.length===0;if(p.current=!1,e){P("url-ended");return}G()},[P,G]),me=t.useCallback(()=>{c(!1),n(!1)},[n]);return r.jsxRuntimeExports.jsxs("div",{className:J.cn("slide-player",_),...le,children:[r.jsxRuntimeExports.jsx("audio",{ref:h,preload:"auto",playsInline:!0,onLoadedMetadata:fe,onCanPlay:ie,onPlay:ae,onPause:oe,onEnded:de,onError:me}),ue?r.jsxRuntimeExports.jsxs("div",{className:"slide-player__controls",style:ce,children:[r.jsxRuntimeExports.jsxs("div",{className:"slide-player__group",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":"More options",className:"hidden",type:"button",children:r.jsxRuntimeExports.jsx(he.default,{className:"slide-player__icon",strokeWidth:2.25})}),r.jsxRuntimeExports.jsx("button",{"aria-label":"Volume",className:"hidden",type:"button",children:r.jsxRuntimeExports.jsx(Re.default,{className:"slide-player__icon",strokeWidth:2.25})}),r.jsxRuntimeExports.jsx("button",{"aria-label":"Rewind",className:"slide-player__action",disabled:ne,onClick:Y,type:"button",children:r.jsxRuntimeExports.jsx(ge.default,{className:"slide-player__icon",strokeWidth:2.25})}),r.jsxRuntimeExports.jsx("button",{"aria-label":U?"Pause":"Play",className:"slide-player__toggle",onClick:()=>{const e=h.current;if(!(!e||!a)){if(i.current!==null){if(U){s.current=!1,d.current=!0,i.current=null,m.current=!1,c(!1),n(!1),e.pause();return}E.current="manual",d.current=!1,s.current=!0,n(!0);return}if(!e.src&&R.length>0){E.current="manual",d.current=!1,v(Math.min(y.current,R.length-1),"toggle");return}if(e.paused){E.current="manual",d.current=!1,s.current=!0,g("toggle-resume");return}s.current=!1,d.current=!0,e.pause()}},type:"button",children:U?r.jsxRuntimeExports.jsx(Ee,{}):r.jsxRuntimeExports.jsx(Se,{})}),r.jsxRuntimeExports.jsx("button",{"aria-label":"Forward",className:"slide-player__action",disabled:se,onClick:D,type:"button",children:r.jsxRuntimeExports.jsx(be.default,{className:"slide-player__icon",strokeWidth:2.25})}),r.jsxRuntimeExports.jsx("button",{"aria-label":"Fullscreen",className:"hidden",onClick:I,type:"button",children:r.jsxRuntimeExports.jsx(je.default,{className:"slide-player__icon",strokeWidth:2.25})})]}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__separator"}),r.jsxRuntimeExports.jsxs("div",{className:"slide-player__group",children:[Z.map((e,l)=>r.jsxRuntimeExports.jsx(t.Fragment,{children:e},`custom-action-${l}`)),r.jsxRuntimeExports.jsx("button",{"aria-label":"Notes",className:J.cn("slide-player__action",re&&"slide-player__action--active"),disabled:!te,onClick:ee,type:"button",children:r.jsxRuntimeExports.jsx(ye.default,{className:"slide-player__icon",strokeWidth:2.25})})]})]}):null]})};exports.default=ke;
|
|
2
|
+
//# sourceMappingURL=Player.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Player.cjs.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\n\nconst preloadAudioUrl = (url?: string) => {\n if (typeof window === \"undefined\" || !url) {\n return;\n }\n\n if (audioPreloadElementCache.has(url)) {\n return;\n }\n\n // Use a detached audio element so warm-up follows the same media loading\n // path as the visible player instead of relying on link preload hints.\n const audio = window.document.createElement(\"audio\");\n audio.preload = \"auto\";\n audio.setAttribute(\"playsinline\", \"true\");\n audio.src = url;\n audio.load();\n\n audioPreloadElementCache.set(url, audio);\n};\n\nexport type PlayerProps = Omit<React.ComponentProps<\"div\">, \"onEnded\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n onLoadingChange?: (loading: boolean) => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: React.ReactNode;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onLoadingChange,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const isLoadingRef = useRef(false);\n const isPausedByUserRef = useRef(false);\n const activeSourceTypeRef = useRef<\"url\" | \"segment\" | null>(null);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const customActionList = useMemo(\n () => toPlayerCustomActionList(customActions),\n [customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 4;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\n );\n const currentAudioKey = useMemo(() => {\n if (!currentAudio) {\n return \"none\";\n }\n\n return (\n currentAudio.audioKey ??\n `${String(currentAudio.sequenceNumber ?? \"none\")}:${String(currentAudio.audioUrl ?? \"\")}`\n );\n }, [currentAudio]);\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n useEffect(() => {\n const currentUrl = currentAudio?.audioUrl;\n const nextUrl =\n currentAudioIndex >= 0\n ? audioList[currentAudioIndex + 1]?.audioUrl\n : undefined;\n\n preloadAudioUrl(currentUrl);\n preloadAudioUrl(nextUrl);\n }, [audioList, currentAudio?.audioUrl, currentAudioIndex]);\n\n const updateLoading = useCallback(\n (loading: boolean) => {\n if (isLoadingRef.current === loading) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.(loading);\n },\n [onLoadingChange]\n );\n\n const isAutoplayBlockedError = useCallback((error: unknown) => {\n if (!(error instanceof DOMException)) {\n return false;\n }\n\n return error.name === \"NotAllowedError\" || error.name === \"SecurityError\";\n }, []);\n\n const canStartPlaybackAutomatically = useCallback(() => {\n return (\n defaultPlaying &&\n !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const getWaitingSegmentSeekTime = useCallback(() => {\n const waitingSegmentIndex = waitingSegmentIndexRef.current;\n\n if (waitingSegmentIndex == null || waitingSegmentIndex <= 0) {\n return 0;\n }\n\n return (\n currentAudioSegmentsRef.current\n .slice(0, waitingSegmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n ) / 1000\n );\n }, []);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = false;\n activeSourceTypeRef.current = null;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n setIsPlaying(false);\n updateLoading(false);\n }, [updateLoading]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n if (playbackAccessModeRef.current === \"unknown\") {\n playbackAccessModeRef.current = \"auto\";\n }\n\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((error: unknown) => {\n if (\n playbackAccessModeRef.current === \"unknown\" &&\n isAutoplayBlockedError(error)\n ) {\n // Lock autoplay after the first browser rejection.\n playbackAccessModeRef.current = \"blocked\";\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n }\n\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [isAutoplayBlockedError, updateLoading]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n pendingAutoPlayRef.current = shouldAutoResume;\n updateLoading(false);\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n activeSourceTypeRef.current = \"segment\";\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [\n canStartPlaybackAutomatically,\n getSegmentSrc,\n tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [currentAudioIndex, onEnded, updateLoading]\n );\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n setIsPlaying(false);\n updateLoading(true);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [defaultPlaying, finishAudioItem, startSegmentPlayback, updateLoading]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\n updateLoading(false);\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = canStartPlaybackAutomatically();\n const shouldKeepSegmentSource =\n activeSourceTypeRef.current === \"segment\" &&\n Boolean(audioSrcRef.current) &&\n waitingSegmentIndexRef.current === null;\n\n if (shouldKeepSegmentSource) {\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"keep-segment-source\");\n }\n\n return;\n }\n\n if (hasNewSrc) {\n const nextSeekTime =\n waitingSegmentIndexRef.current !== null\n ? getWaitingSegmentSeekTime()\n : 0;\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n activeSourceTypeRef.current = \"url\";\n audioElement.src = currentAudioUrl;\n audioElement.load();\n pendingSeekTimeRef.current = nextSeekTime;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = nextSeekTime;\n pendingSeekTimeRef.current = null;\n }\n }\n\n pendingAutoPlayRef.current = shouldAutoResume;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n updateLoading(false);\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n tryPlayCurrentAudio(hasNewSrc ? \"sync-url-init\" : \"sync-url\");\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n if (isPausedByUserRef.current) {\n setIsPlaying(false);\n updateLoading(false);\n return;\n }\n\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (!audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (!defaultPlaying || isPausedByUserRef.current) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n canStartPlaybackAutomatically,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n updateLoading(false);\n }, [updateLoading]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n updateLoading(false);\n }, [updateLoading]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n audioElement.pause();\n return;\n }\n\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n {customActionList.map((customAction, customActionIndex) => (\n <React.Fragment key={`custom-action-${customActionIndex}`}>\n {customAction}\n </React.Fragment>\n ))}\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onLoadingChange","onPrev","onNext","onFullscreen","onEnded","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","customActions","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","segmentIndex","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","shouldFinishAsUrl","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","customAction","customActionIndex","React","FilePenLine"],"mappings":"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"}
|