dishui 0.0.108 → 0.0.110
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/.release-verified.json +3 -2
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonMenu/index.js.map +1 -1
- package/dist/components/Card/Metric2.js.map +1 -1
- package/dist/components/Card/Ticket2.js.map +1 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.js.map +1 -1
- package/dist/components/Column/index.js.map +1 -1
- package/dist/components/ConfirmDialog/index.js.map +1 -1
- package/dist/components/DateTimeInput/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Demo/source.js.map +1 -1
- package/dist/components/Divider/index.js.map +1 -1
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Field/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/GroupButton/index.js.map +1 -1
- package/dist/components/GroupedTable/index.js.map +1 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/focusScope.js.map +1 -1
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.js.map +1 -1
- package/dist/components/NavigationList/index.js.map +1 -1
- package/dist/components/Page/Float2.js.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/Page/resize2.js.map +1 -1
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/PagePanel/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Resizable/ResizeGrip.js.map +1 -1
- package/dist/components/Resizable/index.js.map +1 -1
- package/dist/components/Resizable/useResize.js.map +1 -1
- package/dist/components/Row/index.js.map +1 -1
- package/dist/components/Section/index.js.map +1 -1
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Switch/index.js.map +1 -1
- package/dist/components/Tab/index.js.map +1 -1
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tabs/tabNavigation.js.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/ai/AgentChat/index.js.map +1 -1
- package/dist/components/ai/AgentRunCard/index.js.map +1 -1
- package/dist/components/ai/AgentScreen/index.js.map +1 -1
- package/dist/components/ai/ApprovalCard/index.js.map +1 -1
- package/dist/components/ai/CodeView/index.js.map +1 -1
- package/dist/components/ai/CommandSearch/index.js.map +1 -1
- package/dist/components/ai/ContextCards/index.js.map +1 -1
- package/dist/components/ai/DiffTable/index.js.map +1 -1
- package/dist/components/ai/FilterTable/index.js.map +1 -1
- package/dist/components/ai/FineTuneCard/index.js.map +1 -1
- package/dist/components/ai/InsightCards/index.js.map +1 -1
- package/dist/components/ai/IssueCard/index.js.map +1 -1
- package/dist/components/ai/LoadingState/index.js.map +1 -1
- package/dist/components/ai/PromptBar/index.js.map +1 -1
- package/dist/components/ai/RecommendationCard/index.js.map +1 -1
- package/dist/components/ai/RecordsTable/index.js.map +1 -1
- package/dist/components/ai/SelectionActions/index.js.map +1 -1
- package/dist/components/ai/StateFlow/index.js.map +1 -1
- package/dist/components/ai/StreamingText/index.js.map +1 -1
- package/dist/components/ai/TaskRows/index.js.map +1 -1
- package/dist/components/ai/Thinking/index.js.map +1 -1
- package/dist/components/ai/ToolChips/index.js.map +1 -1
- package/dist/components/ai/shared.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.js +165 -160
- package/dist/components/pro/Calendar/Calendar.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
- package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
- package/dist/components/pro/Calendar/utils.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
- package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
- package/dist/components/pro/Gantt/utils.js.map +1 -1
- package/dist/components/pro/Kanban/Kanban.js.map +1 -1
- package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
- package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
- package/dist/components/pro/Kanban/utils.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Molly/animations.js +52 -0
- package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Molly/events.js +46 -0
- package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Molly/index.js +12 -0
- package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Molly/model.js +614 -0
- package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
- package/dist/components/pro/Sprite/Molly/rig.js +102 -0
- package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
- package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Ruby/events.js +46 -0
- package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Ruby/index.js +12 -0
- package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Ruby/model.js +605 -0
- package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
- package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
- package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
- package/dist/components/pro/Sprite/Sprite2.js +224 -0
- package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
- package/dist/components/pro/Sprite/actions.d.ts +3 -0
- package/dist/components/pro/Sprite/actions.js +16 -0
- package/dist/components/pro/Sprite/actions.js.map +1 -0
- package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
- package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
- package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
- package/dist/components/pro/Sprite/index.d.ts +4 -0
- package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
- package/dist/components/pro/Sprite/shared/animation.js +39 -0
- package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
- package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/events.js +21 -0
- package/dist/components/pro/Sprite/shared/events.js.map +1 -0
- package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/face.js +33 -0
- package/dist/components/pro/Sprite/shared/face.js.map +1 -0
- package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
- package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/gait.js +19 -0
- package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
- package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/geometry.js +59 -0
- package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
- package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
- package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/playback.js +74 -0
- package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
- package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/rig.js +48 -0
- package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
- package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
- package/dist/components/pro/Sprite/shared/scene.js +21 -0
- package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
- package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
- package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
- package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
- package/dist/components/pro/Sprite/types.d.ts +40 -0
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.js.map +1 -1
- package/dist/data-table.js +3 -3
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -115
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/sprite.js +2 -0
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/flexLayout.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.js.map +1 -1
- package/dist/utils/selection.js +29 -20
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +15 -11
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//#region src/components/pro/Sprite/shared/playback.ts
|
|
2
|
+
function e(e, t, n) {
|
|
3
|
+
let r = 0, i = 0, a = 0, o = !1, s = 0, c = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? !1, l = () => {
|
|
4
|
+
o || n();
|
|
5
|
+
}, u = () => {
|
|
6
|
+
cancelAnimationFrame(r), clearTimeout(i), clearTimeout(a), r = i = a = 0;
|
|
7
|
+
}, d = () => {
|
|
8
|
+
t.pose({
|
|
9
|
+
elapsed: 0,
|
|
10
|
+
mood: "idle",
|
|
11
|
+
intensity: 0
|
|
12
|
+
}), l();
|
|
13
|
+
}, f = () => {
|
|
14
|
+
c || o || (i = window.setTimeout(() => {
|
|
15
|
+
if (o) return;
|
|
16
|
+
if (document.visibilityState === "hidden" || !e.getClientRects().length) {
|
|
17
|
+
f();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let n = performance.now(), i = (e) => {
|
|
21
|
+
if (o) return;
|
|
22
|
+
let a = Math.min(1, (e - n) / 220);
|
|
23
|
+
t.pose({
|
|
24
|
+
elapsed: (e - n) / 1e3,
|
|
25
|
+
mood: "idle",
|
|
26
|
+
intensity: 0,
|
|
27
|
+
blink: Math.sin(a * Math.PI)
|
|
28
|
+
}), l(), a < 1 ? r = requestAnimationFrame(i) : f();
|
|
29
|
+
};
|
|
30
|
+
r = requestAnimationFrame(i);
|
|
31
|
+
}, 4800 + Math.random() * 2400));
|
|
32
|
+
}, p = () => {
|
|
33
|
+
o || (u(), d(), f());
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
express: (e, n = 950, i = !1) => {
|
|
37
|
+
if (o) return;
|
|
38
|
+
u();
|
|
39
|
+
let s = performance.now();
|
|
40
|
+
if (c) {
|
|
41
|
+
t.pose({
|
|
42
|
+
elapsed: n / 2e3,
|
|
43
|
+
mood: e,
|
|
44
|
+
intensity: 1,
|
|
45
|
+
progress: .5
|
|
46
|
+
}), l(), a = window.setTimeout(p, n);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let d = (a) => {
|
|
50
|
+
if (o) return;
|
|
51
|
+
let c = Math.max(0, a - s), u = Math.min(1, c / n), f = Math.min(1, Math.max(0, Math.min(c, i ? Infinity : n - c) / 180)), m = f * f * (3 - 2 * f);
|
|
52
|
+
t.pose({
|
|
53
|
+
elapsed: c / 1e3,
|
|
54
|
+
mood: e,
|
|
55
|
+
intensity: m,
|
|
56
|
+
progress: i ? void 0 : u,
|
|
57
|
+
blink: e === "happy" ? Math.sin(u * Math.PI) ** 12 : 0
|
|
58
|
+
}), l(), i || u < 1 ? r = requestAnimationFrame(d) : p();
|
|
59
|
+
};
|
|
60
|
+
d(s);
|
|
61
|
+
},
|
|
62
|
+
stop: p,
|
|
63
|
+
turn(e) {
|
|
64
|
+
o || (s += e, t.group.rotation.y = s, l());
|
|
65
|
+
},
|
|
66
|
+
dispose() {
|
|
67
|
+
o = !0, u();
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { e as createSpritePlayback };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=playback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playback.js","names":["createSpritePlayback","frame","blinkTimer","settleTimer","disposed","angle","reduced","draw","render","cancelPlayback","idle","model","scheduleBlink","host","started","blink","progress","now","reset","duration","animate","elapsed","ramp","sustain","intensity","mood","radians"],"sources":["../../../../../src/components/pro/Sprite/shared/playback.ts"],"sourcesContent":["import type { SpriteMood, SpriteScene } from '../types';\n\n/** Owns playback scheduling only; the host retains ownership of the model and studio. */\nexport function createSpritePlayback(host: HTMLElement, model: SpriteScene, render: () => void) {\n let frame = 0;\n let blinkTimer = 0;\n let settleTimer = 0;\n let disposed = false;\n let angle = 0;\n const reduced = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n const draw = () => { if (!disposed) render(); };\n const cancelPlayback = () => {\n cancelAnimationFrame(frame);\n clearTimeout(blinkTimer);\n clearTimeout(settleTimer);\n frame = blinkTimer = settleTimer = 0;\n };\n const idle = () => { model.pose({ elapsed: 0, mood: 'idle', intensity: 0 }); draw(); };\n const scheduleBlink = () => {\n if (reduced || disposed) return;\n blinkTimer = window.setTimeout(() => {\n if (disposed) return;\n if (document.visibilityState === 'hidden' || !host.getClientRects().length) {\n scheduleBlink();\n return;\n }\n const started = performance.now();\n const blink = (now: number) => {\n if (disposed) return;\n const progress = Math.min(1, (now - started) / 220);\n model.pose({ elapsed: (now - started) / 1000, mood: 'idle', intensity: 0, blink: Math.sin(progress * Math.PI) });\n draw();\n if (progress < 1) frame = requestAnimationFrame(blink);\n else scheduleBlink();\n };\n frame = requestAnimationFrame(blink);\n }, 4800 + Math.random() * 2400);\n };\n const reset = () => {\n if (disposed) return;\n cancelPlayback();\n idle();\n scheduleBlink();\n };\n const express = (mood: SpriteMood, duration = 950, sustain = false) => {\n if (disposed) return;\n cancelPlayback();\n const started = performance.now();\n if (reduced) {\n // Sample the middle of the action once, including sustained chat poses.\n model.pose({ elapsed: duration / 2000, mood, intensity: 1, progress: 0.5 });\n draw();\n settleTimer = window.setTimeout(reset, duration);\n return;\n }\n const animate = (now: number) => {\n if (disposed) return;\n const elapsed = Math.max(0, now - started);\n const progress = Math.min(1, elapsed / duration);\n const ramp = Math.min(1, Math.max(0, Math.min(elapsed, sustain ? Infinity : duration - elapsed) / 180));\n const intensity = ramp * ramp * (3 - 2 * ramp);\n model.pose({ elapsed: elapsed / 1000, mood, intensity, progress: sustain ? undefined : progress,\n blink: mood === 'happy' ? Math.pow(Math.sin(progress * Math.PI), 12) : 0 });\n draw();\n if (sustain || progress < 1) frame = requestAnimationFrame(animate);\n else reset();\n };\n animate(started);\n };\n\n return {\n express,\n stop: reset,\n turn(radians: number) {\n if (disposed) return;\n angle += radians;\n model.group.rotation.y = angle;\n draw();\n },\n dispose() {\n disposed = true;\n cancelPlayback();\n },\n };\n}\n"],"mappings":";AAGA,SAAgBA,EAAqB,GAAmB,GAAoB,GAAoB;CAC9F,IAAIC,IAAQ,GACRC,IAAa,GACbC,IAAc,GACdC,IAAW,IACXC,IAAQ,GACNC,IAAU,OAAO,aAAa,kCAAkC,CAAC,CAAC,WAAW,IAC7EC,UAAa;EAAE,AAAKH,KAAUI,EAAO;CAAG,GACxCC,UAAuB;EAI3B,AAHA,qBAAqBR,CAAK,GAC1B,aAAaC,CAAU,GACvB,aAAaC,CAAW,GACxB,IAAQ,IAAa,IAAc;CACrC,GACMO,UAAa;EAA0D,AAAxDC,EAAM,KAAK;GAAE,SAAS;GAAG,MAAM;GAAQ,WAAW;EAAE,CAAC,GAAGJ,EAAK;CAAG,GAC/EK,UAAsB;EAC1B,AAAIN,KAAWF,MACf,IAAa,OAAO,iBAAiB;GACnC,IAAIA,GAAU;GACd,IAAI,SAAS,oBAAoB,YAAY,CAACS,EAAK,eAAe,CAAC,CAAC,QAAQ;IAC1E,EAAc;IACd;GACF;GACA,IAAMC,IAAU,YAAY,IAAI,GAC1BC,KAAS,MAAgB;IAC7B,IAAIX,GAAU;IACd,IAAMY,IAAW,KAAK,IAAI,IAAIC,IAAMH,KAAW,GAAG;IAGlD,AAFAH,EAAM,KAAK;KAAE,UAAUM,IAAMH,KAAW;KAAM,MAAM;KAAQ,WAAW;KAAG,OAAO,KAAK,IAAIE,IAAW,KAAK,EAAE;IAAE,CAAC,GAC/GT,EAAK,GACDS,IAAW,IAAG,IAAQ,sBAAsBD,CAAK,IAChDH,EAAc;GACrB;GACA,IAAQ,sBAAsBG,CAAK;EACrC,GAAG,OAAO,KAAK,OAAO,IAAI,IAAI;CAChC,GACMG,UAAc;EAClB,AAAId,MACJK,EAAe,GACfC,EAAK,GACLE,EAAc;CAChB;CA2BA,OAAO;EACL,UA3Be,GAAkB,IAAW,KAAK,IAAU,OAAU;GACrE,IAAIR,GAAU;GACd,EAAe;GACf,IAAMU,IAAU,YAAY,IAAI;GAChC,IAAIR,GAAS;IAIX,AAFAK,EAAM,KAAK;KAAE,SAASQ,IAAW;KAAM;KAAM,WAAW;KAAG,UAAU;IAAI,CAAC,GAC1EZ,EAAK,GACL,IAAc,OAAO,WAAWW,GAAOC,CAAQ;IAC/C;GACF;GACA,IAAMC,KAAW,MAAgB;IAC/B,IAAIhB,GAAU;IACd,IAAMiB,IAAU,KAAK,IAAI,GAAGJ,IAAMH,CAAO,GACnCE,IAAW,KAAK,IAAI,GAAGK,IAAUF,CAAQ,GACzCG,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,IAAID,GAASE,IAAU,WAAWJ,IAAWE,CAAO,IAAI,GAAG,CAAC,GAChGG,IAAYF,IAAOA,KAAQ,IAAI,IAAIA;IAIzC,AAHAX,EAAM,KAAK;KAAE,SAASU,IAAU;KAAM;KAAM;KAAW,UAAUE,IAAU,KAAA,IAAYP;KACrF,OAAOS,MAAS,UAAmB,KAAK,IAAIT,IAAW,KAAK,EAAE,KAAG,KAAM;IAAE,CAAC,GAC5ET,EAAK,GACDgB,KAAWP,IAAW,IAAG,IAAQ,sBAAsBI,CAAO,IAC7DF,EAAM;GACb;GACA,EAAQJ,CAAO;EACjB;EAIE,MAAMI;EACN,KAAK,GAAiB;GACpB,AAAId,MACJ,KAASsB,GACT,EAAM,MAAM,SAAS,IAAIrB,GACzBE,EAAK;EACP;EACA,UAAU;GAER,AADA,IAAW,IACXE,EAAe;EACjB;CACF;AACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import type { Point } from './geometry';
|
|
3
|
+
/** Insert an unbound modeled part at its original place among the parent's meshes. */
|
|
4
|
+
export declare function bindPart(parent: THREE.Group, part: THREE.Group, name: string, position: Point, index?: number): THREE.Group<THREE.Object3DEventMap>;
|
|
5
|
+
export declare function createGroundFeet(body: THREE.Group, front: THREE.Group[], back: THREE.Group[]): (clearance?: readonly number[], support?: 'feet' | 'body') => void;
|
|
6
|
+
export declare function createRigDisposer(group: THREE.Group, disposeModel: () => void): () => void;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/rig.ts
|
|
3
|
+
function t(e, t, n, r, i = e.children.length) {
|
|
4
|
+
return t.name = n, t.position.set(...r), e.add(t), e.children.splice(e.children.indexOf(t), 1), e.children.splice(i, 0, t), t;
|
|
5
|
+
}
|
|
6
|
+
function n(t, n, r) {
|
|
7
|
+
let i = new e.Vector3(), a = [...n, ...r].map((t) => {
|
|
8
|
+
let n = Infinity;
|
|
9
|
+
return {
|
|
10
|
+
leg: t,
|
|
11
|
+
meshes: t.children.filter((t) => t instanceof e.Mesh).map((e) => {
|
|
12
|
+
e.updateMatrix();
|
|
13
|
+
let r = e.geometry.getAttribute("position");
|
|
14
|
+
for (let a = 0; a < r.count; a++) i.fromBufferAttribute(r, a).applyMatrix4(e.matrix), n = Math.min(n, i.y + t.position.y);
|
|
15
|
+
return {
|
|
16
|
+
mesh: e,
|
|
17
|
+
positions: r
|
|
18
|
+
};
|
|
19
|
+
}),
|
|
20
|
+
restY: n
|
|
21
|
+
};
|
|
22
|
+
}), o = new e.Matrix4(), s = new e.Matrix4();
|
|
23
|
+
return (e, n = "feet") => {
|
|
24
|
+
t.updateMatrix();
|
|
25
|
+
let r = -Infinity;
|
|
26
|
+
for (let [i, { leg: c, meshes: l, restY: u }] of a.entries()) {
|
|
27
|
+
c.updateMatrix(), o.multiplyMatrices(t.matrix, c.matrix);
|
|
28
|
+
let a = Infinity;
|
|
29
|
+
for (let { mesh: e, positions: t } of l) {
|
|
30
|
+
let n = s.multiplyMatrices(o, e.matrix).elements;
|
|
31
|
+
for (let e = 0; e < t.count; e++) a = Math.min(a, n[1] * t.getX(e) + n[5] * t.getY(e) + n[9] * t.getZ(e) + n[13]);
|
|
32
|
+
}
|
|
33
|
+
let d = u + (e?.[i] ?? 0) - a;
|
|
34
|
+
n === "body" ? r = Math.max(r, d) : c.position.y += d / t.matrix.elements[5];
|
|
35
|
+
}
|
|
36
|
+
n === "body" && Number.isFinite(r) && (t.position.y += r);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function r(e, t) {
|
|
40
|
+
let n = !1;
|
|
41
|
+
return () => {
|
|
42
|
+
n || (n = !0, e.removeFromParent(), e.clear(), t());
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { t as bindPart, n as createGroundFeet, r as createRigDisposer };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=rig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rig.js","names":["THREE","bindPart","parent","name","part","position","index","createGroundFeet","point","supports","front","back","restY","leg","child","positions","mesh","i","supportMatrix","meshMatrix","correction","body","lowest","meshes","m","offset","clearance","support","createRigDisposer","disposed","group","disposeModel"],"sources":["../../../../../src/components/pro/Sprite/shared/rig.ts"],"sourcesContent":["import * as THREE from 'three';\nimport type { Point } from './geometry';\n\n/** Insert an unbound modeled part at its original place among the parent's meshes. */\nexport function bindPart(parent: THREE.Group, part: THREE.Group, name: string, position: Point, index = parent.children.length) {\n part.name = name;\n part.position.set(...position);\n parent.add(part);\n parent.children.splice(parent.children.indexOf(part), 1);\n parent.children.splice(index, 0, part);\n return part;\n}\n\nexport function createGroundFeet(body: THREE.Group, front: THREE.Group[], back: THREE.Group[]) {\n // Retain live geometry attributes so bent limbs use their current support surface.\n const point = new THREE.Vector3();\n const supports = [...front, ...back].map(leg => {\n let restY = Infinity;\n const meshes = leg.children.filter((child): child is THREE.Mesh => child instanceof THREE.Mesh).map(mesh => {\n mesh.updateMatrix();\n const positions = mesh.geometry.getAttribute('position');\n for (let i = 0; i < positions.count; i++) {\n point.fromBufferAttribute(positions, i).applyMatrix4(mesh.matrix);\n restY = Math.min(restY, point.y + leg.position.y);\n }\n return { mesh, positions };\n });\n return { leg, meshes, restY };\n });\n const supportMatrix = new THREE.Matrix4();\n const meshMatrix = new THREE.Matrix4();\n // Optional clearance is ordered front-left, front-right, hind-left, hind-right.\n // Zero preserves planted feet; a positive value lifts a swinging foot or the whole airborne stride.\n // A horizontal gallop must move the body as a unit: shifting individual limb roots\n // along body-local Y would pull them out of the torso (and divide by nearly zero).\n return (clearance?: readonly number[], support: 'feet' | 'body' = 'feet') => {\n body.updateMatrix();\n let correction = -Infinity;\n for (const [index, { leg, meshes, restY }] of supports.entries()) {\n leg.updateMatrix();\n supportMatrix.multiplyMatrices(body.matrix, leg.matrix);\n let lowest = Infinity;\n for (const { mesh, positions } of meshes) {\n const m = meshMatrix.multiplyMatrices(supportMatrix, mesh.matrix).elements;\n for (let i = 0; i < positions.count; i++) lowest = Math.min(lowest,\n m[1] * positions.getX(i) + m[5] * positions.getY(i) + m[9] * positions.getZ(i) + m[13]);\n }\n const offset = restY + (clearance?.[index] ?? 0) - lowest;\n if (support === 'body') correction = Math.max(correction, offset);\n else leg.position.y += offset / body.matrix.elements[5];\n }\n if (support === 'body' && Number.isFinite(correction)) body.position.y += correction;\n };\n}\n\nexport function createRigDisposer(group: THREE.Group, disposeModel: () => void) {\n let disposed = false;\n return () => {\n if (disposed) return;\n disposed = true;\n group.removeFromParent(); group.clear();\n disposeModel();\n };\n}\n"],"mappings":";;AAIA,SAAgBC,EAAS,GAAqB,GAAmB,GAAc,GAAiB,IAAQC,EAAO,SAAS,QAAQ;CAM9H,OALA,EAAK,OAAOC,GACZC,EAAK,SAAS,IAAI,GAAGC,CAAQ,GAC7BH,EAAO,IAAIE,CAAI,GACfF,EAAO,SAAS,OAAOA,EAAO,SAAS,QAAQE,CAAI,GAAG,CAAC,GACvDF,EAAO,SAAS,OAAOI,GAAO,GAAGF,CAAI,GAC9BA;AACT;AAEA,SAAgBG,EAAiB,GAAmB,GAAsB,GAAqB;CAE7F,IAAMC,IAAQ,IAAIR,EAAM,QAAQ,GAC1BS,IAAW,CAAC,GAAGC,GAAO,GAAGC,CAAI,CAAC,CAAC,KAAI,MAAO;EAC9C,IAAIC,IAAQ;EAUZ,OAAO;GAAE;GAAK,QATCC,EAAI,SAAS,QAAQ,MAA+BC,aAAiBd,EAAM,IAAI,CAAC,CAAC,KAAI,MAAQ;IAC1G,EAAK,aAAa;IAClB,IAAMe,IAAYC,EAAK,SAAS,aAAa,UAAU;IACvD,KAAK,IAAIC,IAAI,GAAGA,IAAIF,EAAU,OAAO,KAEnC,AADAP,EAAM,oBAAoBO,GAAWE,CAAC,CAAC,CAAC,aAAaD,EAAK,MAAM,GAChE,IAAQ,KAAK,IAAIJ,GAAOJ,EAAM,IAAIK,EAAI,SAAS,CAAC;IAElD,OAAO;KAAE;KAAM;IAAU;GAC3B,CACc;GAAQ;EAAM;CAC9B,CAAC,GACKK,IAAgB,IAAIlB,EAAM,QAAQ,GAClCmB,IAAa,IAAInB,EAAM,QAAQ;CAKrC,QAAQ,GAA+B,IAA2B,WAAW;EAC3E,EAAK,aAAa;EAClB,IAAIoB,IAAa;EACjB,KAAK,IAAM,CAACd,GAAO,EAAE,QAAK,WAAQ,eAAYG,EAAS,QAAQ,GAAG;GAEhE,AADAI,EAAI,aAAa,GACjBK,EAAc,iBAAiBG,EAAK,QAAQR,EAAI,MAAM;GACtD,IAAIS,IAAS;GACb,KAAK,IAAM,EAAE,SAAM,kBAAeC,GAAQ;IACxC,IAAMC,IAAIL,EAAW,iBAAiBD,GAAeF,EAAK,MAAM,CAAC,CAAC;IAClE,KAAK,IAAIC,IAAI,GAAGA,IAAIF,EAAU,OAAO,KAAK,IAAS,KAAK,IAAIO,GAC1DE,EAAE,KAAKT,EAAU,KAAKE,CAAC,IAAIO,EAAE,KAAKT,EAAU,KAAKE,CAAC,IAAIO,EAAE,KAAKT,EAAU,KAAKE,CAAC,IAAIO,EAAE,GAAG;GAC1F;GACA,IAAMC,IAASb,KAASc,IAAYpB,MAAU,KAAKgB;GACnD,AAAIK,MAAY,SAAQ,IAAa,KAAK,IAAIP,GAAYK,CAAM,IAC3D,EAAI,SAAS,KAAKA,IAASJ,EAAK,OAAO,SAAS;EACvD;EACA,AAAIM,MAAY,UAAU,OAAO,SAASP,CAAU,MAAG,EAAK,SAAS,KAAKA;CAC5E;AACF;AAEA,SAAgBQ,EAAkB,GAAoB,GAA0B;CAC9E,IAAIC,IAAW;CACf,aAAa;EACX,AAAIA,MACJ,IAAW,IACXC,EAAM,iBAAiB,GAAGA,EAAM,MAAM,GACtCC,EAAa;CACf;AACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SpritePose, SpriteScene } from '../types';
|
|
2
|
+
type Rig = Pick<SpriteScene, 'group' | 'dispose'>;
|
|
3
|
+
type Animations = {
|
|
4
|
+
pose(state: SpritePose): void;
|
|
5
|
+
dispose(): void;
|
|
6
|
+
};
|
|
7
|
+
/** The scene owns both resources; playback owns neither. */
|
|
8
|
+
export declare function assembleSprite(rig: Rig, animations: Animations): SpriteScene;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/components/pro/Sprite/shared/scene.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
let n = !1, r = (e) => {
|
|
4
|
+
n || t.pose(e);
|
|
5
|
+
};
|
|
6
|
+
return r({
|
|
7
|
+
elapsed: 0,
|
|
8
|
+
mood: "idle",
|
|
9
|
+
intensity: 0
|
|
10
|
+
}), {
|
|
11
|
+
group: e.group,
|
|
12
|
+
pose: r,
|
|
13
|
+
dispose() {
|
|
14
|
+
n || (n = !0, t.dispose(), e.dispose());
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { e as assembleSprite };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.js","names":["assembleSprite","disposed","pose","animations","state","rig"],"sources":["../../../../../src/components/pro/Sprite/shared/scene.ts"],"sourcesContent":["import type { SpritePose, SpriteScene } from '../types';\n\ntype Rig = Pick<SpriteScene, 'group' | 'dispose'>;\ntype Animations = { pose(state: SpritePose): void; dispose(): void };\n\n/** The scene owns both resources; playback owns neither. */\nexport function assembleSprite(rig: Rig, animations: Animations): SpriteScene {\n let disposed = false;\n const pose = (state: SpritePose) => { if (!disposed) animations.pose(state); };\n pose({ elapsed: 0, mood: 'idle', intensity: 0 });\n return {\n group: rig.group,\n pose,\n dispose() {\n if (disposed) return;\n disposed = true;\n animations.dispose();\n rig.dispose();\n },\n };\n}\n"],"mappings":";AAMA,SAAgBA,EAAe,GAAU,GAAqC;CAC5E,IAAIC,IAAW,IACTC,KAAQ,MAAsB;EAAE,AAAKD,KAAUE,EAAW,KAAKC,CAAK;CAAG;CAE7E,OADAF,EAAK;EAAE,SAAS;EAAG,MAAM;EAAQ,WAAW;CAAE,CAAC,GACxC;EACL,OAAOG,EAAI;EACX;EACA,UAAU;GACR,AAAIJ,MACJ,IAAW,IACXE,EAAW,QAAQ,GACnBE,EAAI,QAAQ;EACd;CACF;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { type Point } from './geometry';
|
|
3
|
+
/** One resource owner per model; never traverse the rig to dispose animation-owned effects. */
|
|
4
|
+
export declare function createSculptor(): {
|
|
5
|
+
sculpt: (parent: THREE.Object3D, source: THREE.BufferGeometry, color: number, at?: Point, scale?: Point, name?: string, paint?: (center: THREE.Vector3) => number | undefined) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
|
|
6
|
+
pebble: (parent: THREE.Object3D, color: number, at: Point, scale: Point, detail?: number) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
|
|
7
|
+
stroke: (parent: THREE.Object3D, color: number, points: Point[], radius?: number) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
|
|
8
|
+
glossy: (parent: THREE.Object3D, material: THREE.Material, at: Point, scale: Point) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
|
|
9
|
+
ink: THREE.MeshPhysicalMaterial;
|
|
10
|
+
glint: THREE.MeshBasicMaterial;
|
|
11
|
+
ownMaterial<T extends THREE.Material>(material: T): T;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
};
|
|
14
|
+
export type Sculptor = ReturnType<typeof createSculptor>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { sweep as e } from "./geometry.js";
|
|
2
|
+
import * as t from "three";
|
|
3
|
+
//#region src/components/pro/Sprite/shared/sculptor.ts
|
|
4
|
+
function n() {
|
|
5
|
+
let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = new t.MeshStandardMaterial({
|
|
6
|
+
color: 16777215,
|
|
7
|
+
vertexColors: !0,
|
|
8
|
+
flatShading: !0,
|
|
9
|
+
roughness: .83
|
|
10
|
+
}), a = new t.MeshPhysicalMaterial({
|
|
11
|
+
color: 2434358,
|
|
12
|
+
roughness: .24,
|
|
13
|
+
clearcoat: .65,
|
|
14
|
+
clearcoatRoughness: .18
|
|
15
|
+
}), o = new t.MeshBasicMaterial({ color: 16775921 });
|
|
16
|
+
r.add(i), r.add(a), r.add(o);
|
|
17
|
+
let s = (e, i, a, o) => {
|
|
18
|
+
n.add(i), r.add(a);
|
|
19
|
+
let s = new t.Mesh(i, a);
|
|
20
|
+
return s.name = o ?? "", s.castShadow = !0, s.receiveShadow = !0, e.add(s), s;
|
|
21
|
+
}, c = (e, n, r, a = [
|
|
22
|
+
0,
|
|
23
|
+
0,
|
|
24
|
+
0
|
|
25
|
+
], o = [
|
|
26
|
+
1,
|
|
27
|
+
1,
|
|
28
|
+
1
|
|
29
|
+
], c, l) => {
|
|
30
|
+
let u = n.index ? n.toNonIndexed() : n;
|
|
31
|
+
n !== u && n.dispose(), u.computeVertexNormals();
|
|
32
|
+
let d = u.getAttribute("position"), f = [];
|
|
33
|
+
for (let e = 0; e < d.count; e += 3) {
|
|
34
|
+
let n = new t.Vector3();
|
|
35
|
+
for (let r = 0; r < 3; r++) n.add(new t.Vector3().fromBufferAttribute(d, e + r));
|
|
36
|
+
n.divideScalar(3);
|
|
37
|
+
let i = new t.Color(l?.(n) ?? r);
|
|
38
|
+
i.multiplyScalar(.97 + .045 * (.5 + .5 * Math.sin(e * 2.39996)));
|
|
39
|
+
for (let e = 0; e < 3; e++) f.push(i.r, i.g, i.b);
|
|
40
|
+
}
|
|
41
|
+
u.setAttribute("color", new t.Float32BufferAttribute(f, 3));
|
|
42
|
+
let p = s(e, u, i, c);
|
|
43
|
+
return p.position.set(...a), p.scale.set(...o), p;
|
|
44
|
+
}, l = (e, n, r, i, a = 1) => c(e, new t.IcosahedronGeometry(1, a), n, r, i), u = (t, n, r, i = .012) => {
|
|
45
|
+
let a = c(t, e(r, [
|
|
46
|
+
i,
|
|
47
|
+
i,
|
|
48
|
+
i
|
|
49
|
+
], 5, 8), n);
|
|
50
|
+
return a.castShadow = !1, a;
|
|
51
|
+
}, d = (e, n, r, i) => {
|
|
52
|
+
let a = s(e, new t.SphereGeometry(1, 16, 12), n);
|
|
53
|
+
return a.position.set(...r), a.scale.set(...i), a.castShadow = !1, a.receiveShadow = !1, a;
|
|
54
|
+
}, f = !1;
|
|
55
|
+
return {
|
|
56
|
+
sculpt: c,
|
|
57
|
+
pebble: l,
|
|
58
|
+
stroke: u,
|
|
59
|
+
glossy: d,
|
|
60
|
+
ink: a,
|
|
61
|
+
glint: o,
|
|
62
|
+
ownMaterial(e) {
|
|
63
|
+
return r.add(e), e;
|
|
64
|
+
},
|
|
65
|
+
dispose() {
|
|
66
|
+
if (!f) {
|
|
67
|
+
f = !0;
|
|
68
|
+
for (let e of n) e.dispose();
|
|
69
|
+
for (let e of r) e.dispose();
|
|
70
|
+
n.clear(), r.clear();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { n as createSculptor };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=sculptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sculptor.js","names":["THREE","createSculptor","geometries","materials","clay","ink","glint","add","geometry","material","mesh","name","parent","sculpt","source","positions","shades","i","center","j","faceColor","paint","color","at","scale","pebble","detail","stroke","sweep","points","radius","glossy","disposed"],"sources":["../../../../../src/components/pro/Sprite/shared/sculptor.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { sweep, type Point } from './geometry';\n\n/** One resource owner per model; never traverse the rig to dispose animation-owned effects. */\nexport function createSculptor() {\n const geometries = new Set<THREE.BufferGeometry>();\n const materials = new Set<THREE.Material>();\n const clay = new THREE.MeshStandardMaterial({ color: 0xffffff, vertexColors: true, flatShading: true, roughness: 0.83 });\n const ink = new THREE.MeshPhysicalMaterial({ color: 0x252536, roughness: 0.24, clearcoat: 0.65, clearcoatRoughness: 0.18 });\n const glint = new THREE.MeshBasicMaterial({ color: 0xfffaf1 });\n materials.add(clay); materials.add(ink); materials.add(glint);\n const add = (parent: THREE.Object3D, geometry: THREE.BufferGeometry, material: THREE.Material, name?: string) => {\n geometries.add(geometry);\n materials.add(material);\n const mesh = new THREE.Mesh(geometry, material);\n mesh.name = name ?? '';\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n parent.add(mesh);\n return mesh;\n };\n const sculpt = (parent: THREE.Object3D, source: THREE.BufferGeometry, color: number,\n at: Point = [0, 0, 0], scale: Point = [1, 1, 1], name?: string,\n paint?: (center: THREE.Vector3) => number | undefined) => {\n const geometry = source.index ? source.toNonIndexed() : source;\n if (source !== geometry) source.dispose();\n geometry.computeVertexNormals();\n const positions = geometry.getAttribute('position');\n const shades: number[] = [];\n for (let i = 0; i < positions.count; i += 3) {\n const center = new THREE.Vector3();\n for (let j = 0; j < 3; j++) center.add(new THREE.Vector3().fromBufferAttribute(positions, i + j));\n center.divideScalar(3);\n const faceColor = new THREE.Color(paint?.(center) ?? color);\n // Very small pigment variation; lighting, not random colors, carries the facets.\n faceColor.multiplyScalar(0.97 + 0.045 * (0.5 + 0.5 * Math.sin(i * 2.39996)));\n for (let j = 0; j < 3; j++) shades.push(faceColor.r, faceColor.g, faceColor.b);\n }\n geometry.setAttribute('color', new THREE.Float32BufferAttribute(shades, 3));\n const mesh = add(parent, geometry, clay, name);\n mesh.position.set(...at); mesh.scale.set(...scale);\n return mesh;\n };\n const pebble = (parent: THREE.Object3D, color: number, at: Point, scale: Point, detail = 1) =>\n sculpt(parent, new THREE.IcosahedronGeometry(1, detail), color, at, scale);\n const stroke = (parent: THREE.Object3D, color: number, points: Point[], radius = 0.012) => {\n const detail = sculpt(parent, sweep(points, [radius, radius, radius], 5, 8), color);\n detail.castShadow = false;\n return detail;\n };\n const glossy = (parent: THREE.Object3D, material: THREE.Material, at: Point, scale: Point) => {\n const mesh = add(parent, new THREE.SphereGeometry(1, 16, 12), material);\n mesh.position.set(...at); mesh.scale.set(...scale);\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n return mesh;\n };\n let disposed = false;\n return {\n sculpt, pebble, stroke, glossy, ink, glint,\n ownMaterial<T extends THREE.Material>(material: T): T {\n materials.add(material);\n return material;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n for (const geometry of geometries) geometry.dispose();\n for (const material of materials) material.dispose();\n geometries.clear(); materials.clear();\n },\n };\n}\n\nexport type Sculptor = ReturnType<typeof createSculptor>;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* A mesh-only, CSS-pixel-sized bubble. Anchor is the character's world-space head/top
|
|
4
|
+
* point; viewport is in CSS pixels. The caller enables camera layer 1 and retains the
|
|
5
|
+
* full message in its accessible chat log. No DOM nodes are attached or frames scheduled.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createSpeechBubble(host: HTMLElement): {
|
|
8
|
+
group: THREE.Group;
|
|
9
|
+
setText(text: string): void;
|
|
10
|
+
update(camera: THREE.OrthographicCamera, anchor: THREE.Vector3, viewport: {
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}): void;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/speechBubble.ts
|
|
3
|
+
var t = 12, n = 12, r = 20, i = 10, a = 4, o = "400 14px system-ui, sans-serif", s = new Intl.Segmenter(void 0, { granularity: "grapheme" }), c = new Intl.Segmenter(void 0, { granularity: "word" });
|
|
4
|
+
function l(e, t, n) {
|
|
5
|
+
function* r() {
|
|
6
|
+
for (let r of e.replace(/\r\n?/g, "\n").split("\n")) {
|
|
7
|
+
let e = "";
|
|
8
|
+
for (let { segment: i } of c.segment(r)) {
|
|
9
|
+
if (/^\s+$/u.test(i)) {
|
|
10
|
+
e && n(e + i) <= t && (e += i);
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (n(e + i) <= t) {
|
|
14
|
+
e += i;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
e &&= (yield e.trimEnd(), "");
|
|
18
|
+
for (let { segment: r } of s.segment(i)) {
|
|
19
|
+
if (n(e + r) > t && (e && (yield e), e = "", n(r) > t)) {
|
|
20
|
+
yield "…";
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
e += r;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
yield e.trimEnd();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let i = [];
|
|
30
|
+
for (let e of r()) {
|
|
31
|
+
if (i.length === 4) {
|
|
32
|
+
let e = Array.from(s.segment(i[3].trimEnd()), (e) => e.segment);
|
|
33
|
+
for (; e.length && n(e.join("") + "…") > t;) e.pop();
|
|
34
|
+
i[3] = e.join("").trimEnd() + "…";
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
i.push(e);
|
|
38
|
+
}
|
|
39
|
+
return i;
|
|
40
|
+
}
|
|
41
|
+
function u(t, n) {
|
|
42
|
+
let r = new e.Shape(), a = -t / 2, o = t / 2, s = i, c = Math.min(12, (t - 20) / 2);
|
|
43
|
+
return r.moveTo(a + c, s), r.lineTo(-7, s), r.lineTo(0, 0), r.lineTo(7, s), r.lineTo(o - c, s), r.quadraticCurveTo(o, s, o, s + c), r.lineTo(o, n - c), r.quadraticCurveTo(o, n, o - c, n), r.lineTo(a + c, n), r.quadraticCurveTo(a, n, a, n - c), r.lineTo(a, s + c), r.quadraticCurveTo(a, s, a + c, s), r.closePath(), r;
|
|
44
|
+
}
|
|
45
|
+
function d(s) {
|
|
46
|
+
let c = s.ownerDocument.createElement("canvas"), d = c.getContext("2d"), f = s.ownerDocument.createElement("canvas");
|
|
47
|
+
f.width = f.height = 1;
|
|
48
|
+
let p = f.getContext("2d", { willReadFrequently: !0 });
|
|
49
|
+
if (!d || !p) throw Error("Speech bubbles require a 2D canvas context.");
|
|
50
|
+
let m = d, h = p, g = new e.Group();
|
|
51
|
+
g.name = "sprite-speech-bubble", g.visible = !1, g.layers.set(1), g.matrixAutoUpdate = !1;
|
|
52
|
+
let _, v = new e.MeshBasicMaterial({ toneMapped: !1 }), y = new e.MeshBasicMaterial({
|
|
53
|
+
transparent: !0,
|
|
54
|
+
depthWrite: !1,
|
|
55
|
+
toneMapped: !1
|
|
56
|
+
}), b, x, S = "", C = "", w = 0, T = "", E = [], D = 0, O = 0, k = !1, A = new e.Vector3(), j = new e.Vector3(), M = new e.Quaternion(), N = new e.Vector3(), P = new e.Matrix4();
|
|
57
|
+
function F(t, s, d, f, p) {
|
|
58
|
+
let k = C !== S || w !== t;
|
|
59
|
+
if (m.font = o, k) {
|
|
60
|
+
E = l(S, t - 24, (e) => m.measureText(e).width);
|
|
61
|
+
let n = Math.min(t, Math.max(48, Math.ceil(Math.max(...E.map((e) => m.measureText(e).width))) + 24)), o = E.length * r + 24 + i;
|
|
62
|
+
if (n !== D || o !== O) {
|
|
63
|
+
D = n, O = o;
|
|
64
|
+
let t = new e.ExtrudeGeometry(u(D, O), {
|
|
65
|
+
depth: a,
|
|
66
|
+
bevelEnabled: !1,
|
|
67
|
+
steps: 1,
|
|
68
|
+
curveSegments: 12
|
|
69
|
+
});
|
|
70
|
+
t.translate(0, 0, -4);
|
|
71
|
+
let r = new e.PlaneGeometry(D, O);
|
|
72
|
+
b && x ? (b.geometry.dispose(), x.geometry.dispose(), b.geometry = t, x.geometry = r) : (b = new e.Mesh(t, v), b.name = "speech-bubble-body", x = new e.Mesh(r, y), x.name = "speech-bubble-front", b.layers.set(1), x.layers.set(1), g.add(b, x)), x.position.set(0, O / 2, .01);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
(!_ || c.width !== D * 2 || c.height !== O * 2) && (_?.dispose(), c.width = D * 2, c.height = O * 2, _ = new e.CanvasTexture(c), _.colorSpace = e.SRGBColorSpace, _.minFilter = _.magFilter = e.LinearFilter, _.generateMipmaps = !1, y.map = _, y.needsUpdate = !0), m.setTransform(2, 0, 0, 2, 0, 0), m.clearRect(0, 0, D, O), m.save(), m.beginPath(), u(D, O).getPoints(12).forEach((e, t) => {
|
|
76
|
+
t === 0 ? m.moveTo(e.x + D / 2, O - e.y) : m.lineTo(e.x + D / 2, O - e.y);
|
|
77
|
+
}), m.closePath(), m.clip(), m.fillStyle = s, m.fill(), m.strokeStyle = f, m.lineWidth = 2, m.stroke(), m.restore(), m.font = o, m.textAlign = "left", m.textBaseline = "middle", m.fillStyle = d, E.forEach((e, t) => m.fillText(e, n, n + r * (t + .5))), _.needsUpdate = !0, h.clearRect(0, 0, 1, 1), h.fillStyle = "#9ca3af", h.fillStyle = f, h.fillRect(0, 0, 1, 1);
|
|
78
|
+
let A = h.getImageData(0, 0, 1, 1).data;
|
|
79
|
+
v.color.setRGB(A[0] / 255, A[1] / 255, A[2] / 255, e.SRGBColorSpace), v.opacity = A[3] / 255, v.transparent = A[3] < 255, v.needsUpdate = !0, C = S, w = t, T = p;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
group: g,
|
|
83
|
+
setText(e) {
|
|
84
|
+
k || e === S || (S = e, g.visible = !1);
|
|
85
|
+
},
|
|
86
|
+
update(n, r, i) {
|
|
87
|
+
if (k || (g.visible = !1, !S.trim() || !Number.isFinite(i.width) || !Number.isFinite(i.height))) return;
|
|
88
|
+
let a = Math.floor(Math.min(320, i.width - 24));
|
|
89
|
+
if (a < 48 || i.height < 78) return;
|
|
90
|
+
let o = s.ownerDocument.defaultView?.getComputedStyle(s), c = o?.getPropertyValue("--dishui-surface-page").trim() || "#fafafa", l = o?.getPropertyValue("--dishui-text-primary").trim() || "#27272a", u = o?.getPropertyValue("--dishui-border-strong").trim() || "#a1a1aa", d = JSON.stringify([
|
|
91
|
+
c,
|
|
92
|
+
l,
|
|
93
|
+
u
|
|
94
|
+
]);
|
|
95
|
+
if ((C !== S || w !== a || T !== d) && F(a, c, l, u, d), O > i.height - 24 || (n.updateWorldMatrix(!0, !1), A.copy(r).project(n), ![
|
|
96
|
+
A.x,
|
|
97
|
+
A.y,
|
|
98
|
+
A.z
|
|
99
|
+
].every(Number.isFinite))) return;
|
|
100
|
+
let f = e.MathUtils.clamp((A.x + 1) * i.width / 2, t + D / 2, i.width - t - D / 2), p = e.MathUtils.clamp((A.y + 1) * i.height / 2 + 8, t, i.height - t - O);
|
|
101
|
+
j.set(f / i.width * 2 - 1, p / i.height * 2 - 1, A.z).unproject(n), n.getWorldQuaternion(M);
|
|
102
|
+
let m = 2 / (n.projectionMatrix.elements[0] * i.width), h = 2 / (n.projectionMatrix.elements[5] * i.height);
|
|
103
|
+
N.set(m, h, Math.sqrt(m * h)), g.matrix.compose(j, M, N), g.parent && (g.parent.updateWorldMatrix(!0, !1), P.copy(g.parent.matrixWorld).invert(), g.matrix.premultiply(P)), g.matrix.decompose(g.position, g.quaternion, g.scale), g.updateMatrixWorld(!0), g.visible = !0;
|
|
104
|
+
},
|
|
105
|
+
dispose() {
|
|
106
|
+
if (k) return;
|
|
107
|
+
k = !0, S = C = "", g.visible = !1, g.removeFromParent(), g.clear();
|
|
108
|
+
let e = [
|
|
109
|
+
b?.geometry,
|
|
110
|
+
x?.geometry,
|
|
111
|
+
v,
|
|
112
|
+
y,
|
|
113
|
+
_
|
|
114
|
+
];
|
|
115
|
+
b = void 0, x = void 0;
|
|
116
|
+
let t = [];
|
|
117
|
+
for (let n of e) try {
|
|
118
|
+
n?.dispose();
|
|
119
|
+
} catch (e) {
|
|
120
|
+
t.push(e);
|
|
121
|
+
}
|
|
122
|
+
if (c.width = c.height = f.width = f.height = 0, t.length) throw AggregateError(t, "Failed to release speech bubble resources.");
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
export { d as createSpeechBubble };
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=speechBubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speechBubble.js","names":["THREE","margin","padding","lineHeight","tailHeight","depth","font","graphemes","words","wrapText","wrap","paragraph","text","line","word","measure","width","segment","lines","last","part","bubbleShape","shape","left","right","bottom","radius","height","createSpeechBubble","canvas","host","context","colorCanvas","colorContext","ctx","colorCtx","group","texture","bodyMaterial","frontMaterial","body","front","drawnText","drawnWidth","drawnTheme","disposed","projected","position","orientation","scale","parentInverse","rebuild","layoutChanged","maxWidth","value","nextWidth","nextHeight","geometry","plane","index","point","surface","border","ink","rgba","theme","viewport","style","camera","anchor","x","y","unitX","unitY","resources","errors","resource","error"],"sources":["../../../../../src/components/pro/Sprite/shared/speechBubble.ts"],"sourcesContent":["import * as THREE from 'three';\n\nconst margin = 12;\nconst padding = 12;\nconst lineHeight = 20;\nconst tailHeight = 10;\nconst depth = 4;\nconst font = '400 14px system-ui, sans-serif';\nconst graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\nconst words = new Intl.Segmenter(undefined, { granularity: 'word' });\n\nfunction wrapText(text: string, width: number, measure: (value: string) => number): string[] {\n function* wrap() {\n for (const paragraph of text.replace(/\\r\\n?/g, '\\n').split('\\n')) {\n let line = '';\n for (const { segment: word } of words.segment(paragraph)) {\n if (/^\\s+$/u.test(word)) {\n if (line && measure(line + word) <= width) line += word;\n continue;\n }\n if (measure(line + word) <= width) {\n line += word;\n continue;\n }\n if (line) {\n yield line.trimEnd();\n line = '';\n }\n for (const { segment } of graphemes.segment(word)) {\n if (measure(line + segment) > width) {\n if (line) yield line;\n line = '';\n // A single grapheme must never be sliced, even in an unusually narrow viewport.\n if (measure(segment) > width) {\n yield '…';\n return;\n }\n }\n line += segment;\n }\n }\n yield line.trimEnd();\n }\n }\n const lines: string[] = [];\n for (const line of wrap()) {\n if (lines.length === 4) {\n const last = Array.from(graphemes.segment(lines[3].trimEnd()), part => part.segment);\n while (last.length && measure(last.join('') + '…') > width) last.pop();\n lines[3] = last.join('').trimEnd() + '…';\n break;\n }\n lines.push(line);\n }\n return lines;\n}\n\nfunction bubbleShape(width: number, height: number): THREE.Shape {\n const shape = new THREE.Shape();\n const left = -width / 2;\n const right = width / 2;\n const bottom = tailHeight;\n const radius = Math.min(12, (width - 20) / 2);\n shape.moveTo(left + radius, bottom);\n shape.lineTo(-7, bottom);\n shape.lineTo(0, 0);\n shape.lineTo(7, bottom);\n shape.lineTo(right - radius, bottom);\n shape.quadraticCurveTo(right, bottom, right, bottom + radius);\n shape.lineTo(right, height - radius);\n shape.quadraticCurveTo(right, height, right - radius, height);\n shape.lineTo(left + radius, height);\n shape.quadraticCurveTo(left, height, left, height - radius);\n shape.lineTo(left, bottom + radius);\n shape.quadraticCurveTo(left, bottom, left + radius, bottom);\n shape.closePath();\n return shape;\n}\n\n/**\n * A mesh-only, CSS-pixel-sized bubble. Anchor is the character's world-space head/top\n * point; viewport is in CSS pixels. The caller enables camera layer 1 and retains the\n * full message in its accessible chat log. No DOM nodes are attached or frames scheduled.\n */\nexport function createSpeechBubble(host: HTMLElement): {\n group: THREE.Group;\n setText(text: string): void;\n update(camera: THREE.OrthographicCamera, anchor: THREE.Vector3, viewport: { width: number; height: number }): void;\n dispose(): void;\n} {\n const canvas = host.ownerDocument.createElement('canvas');\n const context = canvas.getContext('2d');\n const colorCanvas = host.ownerDocument.createElement('canvas');\n colorCanvas.width = colorCanvas.height = 1;\n const colorContext = colorCanvas.getContext('2d', { willReadFrequently: true });\n if (!context || !colorContext) throw new Error('Speech bubbles require a 2D canvas context.');\n const ctx = context;\n const colorCtx = colorContext;\n const group = new THREE.Group();\n group.name = 'sprite-speech-bubble';\n group.visible = false;\n group.layers.set(1);\n // Keep the exact matrix even under a rotated, non-uniformly scaled parent.\n group.matrixAutoUpdate = false;\n let texture: THREE.CanvasTexture | undefined;\n const bodyMaterial = new THREE.MeshBasicMaterial({ toneMapped: false });\n const frontMaterial = new THREE.MeshBasicMaterial({ transparent: true, depthWrite: false, toneMapped: false });\n let body: THREE.Mesh<THREE.ExtrudeGeometry, THREE.MeshBasicMaterial> | undefined;\n let front: THREE.Mesh<THREE.PlaneGeometry, THREE.MeshBasicMaterial> | undefined;\n let text = '';\n let drawnText = '';\n let drawnWidth = 0;\n let drawnTheme = '';\n let lines: string[] = [];\n let width = 0;\n let height = 0;\n let disposed = false;\n const projected = new THREE.Vector3();\n const position = new THREE.Vector3();\n const orientation = new THREE.Quaternion();\n const scale = new THREE.Vector3();\n const parentInverse = new THREE.Matrix4();\n\n function rebuild(maxWidth: number, surface: string, ink: string, border: string, theme: string) {\n const layoutChanged = drawnText !== text || drawnWidth !== maxWidth;\n ctx.font = font;\n if (layoutChanged) {\n lines = wrapText(text, maxWidth - padding * 2, value => ctx.measureText(value).width);\n const nextWidth = Math.min(maxWidth, Math.max(48, Math.ceil(Math.max(...lines.map(line => ctx.measureText(line).width))) + padding * 2));\n const nextHeight = lines.length * lineHeight + padding * 2 + tailHeight;\n if (nextWidth !== width || nextHeight !== height) {\n width = nextWidth;\n height = nextHeight;\n const geometry = new THREE.ExtrudeGeometry(bubbleShape(width, height), { depth, bevelEnabled: false, steps: 1, curveSegments: 12 });\n geometry.translate(0, 0, -depth);\n const plane = new THREE.PlaneGeometry(width, height);\n if (body && front) {\n body.geometry.dispose();\n front.geometry.dispose();\n body.geometry = geometry;\n front.geometry = plane;\n } else {\n body = new THREE.Mesh(geometry, bodyMaterial);\n body.name = 'speech-bubble-body';\n front = new THREE.Mesh(plane, frontMaterial);\n front.name = 'speech-bubble-front';\n body.layers.set(1);\n front.layers.set(1);\n group.add(body, front);\n }\n front.position.set(0, height / 2, 0.01);\n }\n }\n\n // A fixed 2x backing store keeps 14px text crisp without DPR-triggered redraws.\n if (!texture || canvas.width !== width * 2 || canvas.height !== height * 2) {\n // WebGL texture storage dimensions are immutable after its first upload.\n texture?.dispose();\n canvas.width = width * 2;\n canvas.height = height * 2;\n texture = new THREE.CanvasTexture(canvas);\n texture.colorSpace = THREE.SRGBColorSpace;\n texture.minFilter = texture.magFilter = THREE.LinearFilter;\n texture.generateMipmaps = false;\n frontMaterial.map = texture;\n frontMaterial.needsUpdate = true;\n }\n ctx.setTransform(2, 0, 0, 2, 0, 0);\n ctx.clearRect(0, 0, width, height);\n ctx.save();\n ctx.beginPath();\n const points = bubbleShape(width, height).getPoints(12);\n points.forEach((point, index) => {\n if (index === 0) ctx.moveTo(point.x + width / 2, height - point.y);\n else ctx.lineTo(point.x + width / 2, height - point.y);\n });\n ctx.closePath();\n ctx.clip();\n ctx.fillStyle = surface;\n ctx.fill();\n ctx.strokeStyle = border;\n // Clip the outer half of the stroke so the complete border fits the geometry bounds.\n ctx.lineWidth = 2;\n ctx.stroke();\n ctx.restore();\n ctx.font = font;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = ink;\n lines.forEach((line, index) => ctx.fillText(line, padding, padding + lineHeight * (index + 0.5)));\n texture.needsUpdate = true;\n\n // THREE.Color does not parse oklch/color-mix. Let canvas resolve CSS into sRGB.\n colorCtx.clearRect(0, 0, 1, 1);\n colorCtx.fillStyle = '#9ca3af';\n colorCtx.fillStyle = border;\n colorCtx.fillRect(0, 0, 1, 1);\n const rgba = colorCtx.getImageData(0, 0, 1, 1).data;\n bodyMaterial.color.setRGB(rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, THREE.SRGBColorSpace);\n bodyMaterial.opacity = rgba[3] / 255;\n bodyMaterial.transparent = rgba[3] < 255;\n bodyMaterial.needsUpdate = true;\n drawnText = text;\n drawnWidth = maxWidth;\n drawnTheme = theme;\n }\n\n return {\n group,\n setText(value) {\n if (disposed || value === text) return;\n text = value;\n // Never show stale text between setText and the caller's next update/render.\n group.visible = false;\n },\n update(camera, anchor, viewport) {\n if (disposed) return;\n group.visible = false;\n if (!text.trim() || !Number.isFinite(viewport.width) || !Number.isFinite(viewport.height)) return;\n const maxWidth = Math.floor(Math.min(320, viewport.width - margin * 2));\n // There is no readable, fully clamped bubble in a viewport smaller than this.\n if (maxWidth < 48 || viewport.height < margin * 2 + lineHeight + padding * 2 + tailHeight) return;\n const style = host.ownerDocument.defaultView?.getComputedStyle(host);\n const surface = style?.getPropertyValue('--dishui-surface-page').trim() || '#fafafa';\n const ink = style?.getPropertyValue('--dishui-text-primary').trim() || '#27272a';\n const border = style?.getPropertyValue('--dishui-border-strong').trim() || '#a1a1aa';\n const theme = JSON.stringify([surface, ink, border]);\n if (drawnText !== text || drawnWidth !== maxWidth || drawnTheme !== theme) {\n rebuild(maxWidth, surface, ink, border, theme);\n }\n if (height > viewport.height - margin * 2) return;\n\n camera.updateWorldMatrix(true, false);\n projected.copy(anchor).project(camera);\n if (![projected.x, projected.y, projected.z].every(Number.isFinite)) return;\n const x = THREE.MathUtils.clamp((projected.x + 1) * viewport.width / 2,\n margin + width / 2, viewport.width - margin - width / 2);\n const y = THREE.MathUtils.clamp((projected.y + 1) * viewport.height / 2 + 8,\n margin, viewport.height - margin - height);\n position.set(x / viewport.width * 2 - 1, y / viewport.height * 2 - 1, projected.z).unproject(camera);\n camera.getWorldQuaternion(orientation);\n // Projection coefficients include zoom and view offsets; use CSS rather than device pixels.\n const unitX = 2 / (camera.projectionMatrix.elements[0] * viewport.width);\n const unitY = 2 / (camera.projectionMatrix.elements[5] * viewport.height);\n scale.set(unitX, unitY, Math.sqrt(unitX * unitY));\n group.matrix.compose(position, orientation, scale);\n if (group.parent) {\n group.parent.updateWorldMatrix(true, false);\n parentInverse.copy(group.parent.matrixWorld).invert();\n group.matrix.premultiply(parentInverse);\n }\n group.matrix.decompose(group.position, group.quaternion, group.scale);\n group.updateMatrixWorld(true);\n group.visible = true;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n text = drawnText = '';\n group.visible = false;\n group.removeFromParent();\n group.clear();\n // Dispose only explicitly owned resources, never caller attachments or Sprite's shared geometry.\n const resources = [body?.geometry, front?.geometry, bodyMaterial, frontMaterial, texture];\n body = undefined;\n front = undefined;\n const errors: unknown[] = [];\n for (const resource of resources) {\n try { resource?.dispose(); } catch (error) { errors.push(error); }\n }\n canvas.width = canvas.height = colorCanvas.width = colorCanvas.height = 0;\n if (errors.length) throw new AggregateError(errors, 'Failed to release speech bubble resources.');\n },\n };\n}"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Group } from 'three';
|
|
2
|
+
import type { SpriteAction } from './actions';
|
|
3
|
+
export type SpriteCharacter = 'ruby' | 'molly';
|
|
4
|
+
export type SpriteLocale = 'zh' | 'en';
|
|
5
|
+
export type SpriteMood = SpriteAction | 'idle' | 'comfort' | 'curious';
|
|
6
|
+
export type SpritePose = {
|
|
7
|
+
elapsed: number;
|
|
8
|
+
mood: SpriteMood;
|
|
9
|
+
intensity: number;
|
|
10
|
+
blink?: number;
|
|
11
|
+
progress?: number;
|
|
12
|
+
};
|
|
13
|
+
export type SpriteScene = {
|
|
14
|
+
group: Group;
|
|
15
|
+
pose(state: SpritePose): void;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
};
|
|
18
|
+
export type SpriteReplyIntent = 'greeting' | 'comfort' | 'thanks' | 'identity' | 'default';
|
|
19
|
+
export type SpriteEvent = {
|
|
20
|
+
type: 'greet';
|
|
21
|
+
} | {
|
|
22
|
+
type: 'turn';
|
|
23
|
+
} | {
|
|
24
|
+
type: 'message-pending';
|
|
25
|
+
} | {
|
|
26
|
+
type: 'message-replied';
|
|
27
|
+
comfort: boolean;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'message-failed';
|
|
30
|
+
};
|
|
31
|
+
export type SpriteExpression = {
|
|
32
|
+
mood: SpriteMood;
|
|
33
|
+
duration: number;
|
|
34
|
+
sustain?: boolean;
|
|
35
|
+
};
|
|
36
|
+
export type SpriteCharacterEvents = {
|
|
37
|
+
greeting: Readonly<Record<SpriteLocale, string>>;
|
|
38
|
+
localReply(intent: SpriteReplyIntent, locale: SpriteLocale): string;
|
|
39
|
+
action(event: SpriteEvent): SpriteExpression;
|
|
40
|
+
};
|