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.
Files changed (384) hide show
  1. package/dist/.release-verified.json +3 -2
  2. package/dist/components/Accordion/index.js.map +1 -1
  3. package/dist/components/Avatar/index.js.map +1 -1
  4. package/dist/components/Badge/index.js.map +1 -1
  5. package/dist/components/Button/index.js.map +1 -1
  6. package/dist/components/ButtonMenu/index.js.map +1 -1
  7. package/dist/components/Card/Metric2.js.map +1 -1
  8. package/dist/components/Card/Ticket2.js.map +1 -1
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Chart/Chart.js.map +1 -1
  11. package/dist/components/Checkbox/index.js.map +1 -1
  12. package/dist/components/ChoicePicker/index.js.map +1 -1
  13. package/dist/components/Column/index.js.map +1 -1
  14. package/dist/components/ConfirmDialog/index.js.map +1 -1
  15. package/dist/components/DateTimeInput/index.js.map +1 -1
  16. package/dist/components/Demo/index.js.map +1 -1
  17. package/dist/components/Demo/source.js.map +1 -1
  18. package/dist/components/Divider/index.js.map +1 -1
  19. package/dist/components/EmptyState/index.js.map +1 -1
  20. package/dist/components/Field/index.js.map +1 -1
  21. package/dist/components/FileUploader/DropZone.js.map +1 -1
  22. package/dist/components/FileUploader/FileItem.js.map +1 -1
  23. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  24. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  25. package/dist/components/GroupButton/index.js.map +1 -1
  26. package/dist/components/GroupedTable/index.js.map +1 -1
  27. package/dist/components/Icon/index.js.map +1 -1
  28. package/dist/components/Image/index.js.map +1 -1
  29. package/dist/components/Input/index.js.map +1 -1
  30. package/dist/components/Label/index.js.map +1 -1
  31. package/dist/components/Layout/index.js.map +1 -1
  32. package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
  33. package/dist/components/LayoutSuite/index.js.map +1 -1
  34. package/dist/components/List/index.js.map +1 -1
  35. package/dist/components/Markdown/Markdown.js.map +1 -1
  36. package/dist/components/Markdown/codeThemes.js.map +1 -1
  37. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  38. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  39. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  40. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  41. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  42. package/dist/components/Modal/focusScope.js.map +1 -1
  43. package/dist/components/Modal/index.js.map +1 -1
  44. package/dist/components/MultipleChoice/index.js.map +1 -1
  45. package/dist/components/NavigationList/index.js.map +1 -1
  46. package/dist/components/Page/Float2.js.map +1 -1
  47. package/dist/components/Page/index.js.map +1 -1
  48. package/dist/components/Page/resize2.js.map +1 -1
  49. package/dist/components/PageHeader/index.js.map +1 -1
  50. package/dist/components/PagePanel/index.js.map +1 -1
  51. package/dist/components/ProtectedRoute/index.js.map +1 -1
  52. package/dist/components/Resizable/ResizeGrip.js.map +1 -1
  53. package/dist/components/Resizable/index.js.map +1 -1
  54. package/dist/components/Resizable/useResize.js.map +1 -1
  55. package/dist/components/Row/index.js.map +1 -1
  56. package/dist/components/Section/index.js.map +1 -1
  57. package/dist/components/Select/index.js.map +1 -1
  58. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  59. package/dist/components/Skeleton/index.js.map +1 -1
  60. package/dist/components/Slider/index.js.map +1 -1
  61. package/dist/components/Switch/index.js.map +1 -1
  62. package/dist/components/Tab/index.js.map +1 -1
  63. package/dist/components/Table/index.js.map +1 -1
  64. package/dist/components/Tabs/index.js.map +1 -1
  65. package/dist/components/Tabs/tabNavigation.js.map +1 -1
  66. package/dist/components/Text/index.js.map +1 -1
  67. package/dist/components/Textarea/index.js.map +1 -1
  68. package/dist/components/Tooltip/index.js.map +1 -1
  69. package/dist/components/Tree/Tree.js.map +1 -1
  70. package/dist/components/ai/AgentChat/index.js.map +1 -1
  71. package/dist/components/ai/AgentRunCard/index.js.map +1 -1
  72. package/dist/components/ai/AgentScreen/index.js.map +1 -1
  73. package/dist/components/ai/ApprovalCard/index.js.map +1 -1
  74. package/dist/components/ai/CodeView/index.js.map +1 -1
  75. package/dist/components/ai/CommandSearch/index.js.map +1 -1
  76. package/dist/components/ai/ContextCards/index.js.map +1 -1
  77. package/dist/components/ai/DiffTable/index.js.map +1 -1
  78. package/dist/components/ai/FilterTable/index.js.map +1 -1
  79. package/dist/components/ai/FineTuneCard/index.js.map +1 -1
  80. package/dist/components/ai/InsightCards/index.js.map +1 -1
  81. package/dist/components/ai/IssueCard/index.js.map +1 -1
  82. package/dist/components/ai/LoadingState/index.js.map +1 -1
  83. package/dist/components/ai/PromptBar/index.js.map +1 -1
  84. package/dist/components/ai/RecommendationCard/index.js.map +1 -1
  85. package/dist/components/ai/RecordsTable/index.js.map +1 -1
  86. package/dist/components/ai/SelectionActions/index.js.map +1 -1
  87. package/dist/components/ai/StateFlow/index.js.map +1 -1
  88. package/dist/components/ai/StreamingText/index.js.map +1 -1
  89. package/dist/components/ai/TaskRows/index.js.map +1 -1
  90. package/dist/components/ai/Thinking/index.js.map +1 -1
  91. package/dist/components/ai/ToolChips/index.js.map +1 -1
  92. package/dist/components/ai/shared.js.map +1 -1
  93. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  94. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  95. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  96. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  97. package/dist/components/pro/Calendar/Calendar.js +165 -160
  98. package/dist/components/pro/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
  100. package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
  101. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
  102. package/dist/components/pro/Calendar/utils.js.map +1 -1
  103. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  104. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  105. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  106. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  107. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  108. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  109. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  110. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  111. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  112. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  113. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
  114. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  115. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  116. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  117. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  118. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  119. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  120. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  121. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  122. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  123. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  124. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  125. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  126. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  127. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  128. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  129. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  130. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  131. package/dist/components/pro/DataTable/extension.js.map +1 -1
  132. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  133. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  134. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  135. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  136. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  137. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  138. package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
  139. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
  140. package/dist/components/pro/DataTable/utils.js.map +1 -1
  141. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  142. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  143. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  144. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  145. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  146. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  147. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  148. package/dist/components/pro/Flow/Flow.js.map +1 -1
  149. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  150. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  151. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  152. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  153. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  154. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  155. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  156. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  157. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  158. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  159. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  160. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  161. package/dist/components/pro/Flow/constants.js.map +1 -1
  162. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  163. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  164. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  165. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  166. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  167. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  168. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  169. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  170. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  171. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  172. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  173. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  174. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  175. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  176. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  177. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  178. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  179. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  180. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  181. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  182. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  183. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  184. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  185. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  186. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  187. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  188. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  189. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  190. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  191. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  192. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  193. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  194. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  195. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  196. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  197. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  198. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  199. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
  200. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  201. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
  202. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  203. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  204. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  205. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  206. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  207. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  208. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  209. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  210. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  211. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  212. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  213. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  214. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  215. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  216. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  217. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  218. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  219. package/dist/components/pro/Flow/types.js.map +1 -1
  220. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  221. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  222. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  223. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  224. package/dist/components/pro/Gantt/Gantt.js.map +1 -1
  225. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
  226. package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
  227. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
  228. package/dist/components/pro/Gantt/utils.js.map +1 -1
  229. package/dist/components/pro/Kanban/Kanban.js.map +1 -1
  230. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
  231. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
  232. package/dist/components/pro/Kanban/utils.js.map +1 -1
  233. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  234. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  235. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  243. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  258. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  259. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  260. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  261. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  262. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  263. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  264. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  265. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  266. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  267. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  268. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  269. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  270. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  271. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  272. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  273. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  274. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  275. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  276. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  277. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  278. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  279. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  280. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  281. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  282. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  283. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  284. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  285. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  286. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  287. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  288. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  289. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  290. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  291. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  292. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  293. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  294. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  295. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  296. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  297. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  298. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  299. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  300. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  301. package/dist/components/pro/Sprite/actions.js +16 -0
  302. package/dist/components/pro/Sprite/actions.js.map +1 -0
  303. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  304. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  305. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  306. package/dist/components/pro/Sprite/index.d.ts +4 -0
  307. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  308. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  309. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  310. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  311. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  312. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  313. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  314. package/dist/components/pro/Sprite/shared/events.js +21 -0
  315. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  316. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  317. package/dist/components/pro/Sprite/shared/face.js +33 -0
  318. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  319. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  320. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  321. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  322. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  323. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  324. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  325. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  326. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  327. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  328. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  329. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  330. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  331. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  332. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  333. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  334. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  335. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  336. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  337. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  338. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  339. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  340. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  341. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  342. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  343. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  344. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  345. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  346. package/dist/components/pro/Sprite/types.d.ts +40 -0
  347. package/dist/contexts/AppContext.js.map +1 -1
  348. package/dist/contexts/authentication.js.map +1 -1
  349. package/dist/data-table.js +3 -3
  350. package/dist/data-table.js.map +1 -1
  351. package/dist/dishui.css +1 -1
  352. package/dist/hooks/useClickOutside.js.map +1 -1
  353. package/dist/hooks/useContainerElement.js.map +1 -1
  354. package/dist/hooks/useControllableState.js.map +1 -1
  355. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  356. package/dist/hooks/useDebounce.js.map +1 -1
  357. package/dist/hooks/useDraggable.js.map +1 -1
  358. package/dist/hooks/useTableColumns.js.map +1 -1
  359. package/dist/hooks/useTableData.js.map +1 -1
  360. package/dist/index-nostyled.d.ts +2 -0
  361. package/dist/index.d.ts +2 -0
  362. package/dist/index.js +116 -115
  363. package/dist/layouts/MainLayout.js.map +1 -1
  364. package/dist/layouts/Navbar.js.map +1 -1
  365. package/dist/layouts/Sidebar.js.map +1 -1
  366. package/dist/layouts/headbar/Headbar.js.map +1 -1
  367. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  368. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  369. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  370. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  371. package/dist/sprite.js +2 -0
  372. package/dist/styles/themeStyles.js.map +1 -1
  373. package/dist/utils/cn.js.map +1 -1
  374. package/dist/utils/flexLayout.js.map +1 -1
  375. package/dist/utils/i18n.js.map +1 -1
  376. package/dist/utils/menu.js.map +1 -1
  377. package/dist/utils/rehype-code-meta.js.map +1 -1
  378. package/dist/utils/remark-code-meta.js.map +1 -1
  379. package/dist/utils/routerBuilder.js.map +1 -1
  380. package/dist/utils/safeStorage.js.map +1 -1
  381. package/dist/utils/selection.js +29 -20
  382. package/dist/utils/selection.js.map +1 -1
  383. package/dist/utils/themes.js.map +1 -1
  384. package/package.json +15 -11
@@ -0,0 +1,127 @@
1
+ import * as e from "three";
2
+ //#region src/components/pro/Sprite/shared/createSpriteStage.ts
3
+ var t = 512, n = 1.65, r = "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n";
4
+ function i(i, { topInset: a = 0 } = {}) {
5
+ let o = new e.Scene(), s = new e.Group();
6
+ s.name = "sprite-studio", o.add(s);
7
+ let c = new e.Scene(), l = i.ownerDocument.createElement("canvas"), u = /* @__PURE__ */ new Set(), d = (e) => (u.add(e), e), f, p = null, m = !1, h = () => {
8
+ if (m) return;
9
+ m = !0;
10
+ let e = [], t = (t) => {
11
+ try {
12
+ t();
13
+ } catch (t) {
14
+ e.push(t);
15
+ }
16
+ };
17
+ s.removeFromParent(), s.clear(), c.clear();
18
+ for (let e of u) t(() => e.dispose());
19
+ if (u.clear(), t(() => f?.dispose()), t(() => p?.getExtension("WEBGL_lose_context")?.loseContext()), t(() => l.remove()), f = void 0, p = null, e.length) throw AggregateError(e, "Failed to release sprite studio resources.");
20
+ };
21
+ try {
22
+ if (p = l.getContext("webgl2", {
23
+ alpha: !0,
24
+ antialias: !0,
25
+ premultipliedAlpha: !0,
26
+ depth: !0,
27
+ stencil: !1,
28
+ powerPreference: "low-power"
29
+ }), !p) throw Error("The sprite studio requires WebGL 2.");
30
+ f = new e.WebGLRenderer({
31
+ canvas: l,
32
+ context: p,
33
+ alpha: !0,
34
+ antialias: !0
35
+ }), f.setClearColor(0, 0), f.outputColorSpace = e.SRGBColorSpace, f.toneMapping = e.ACESFilmicToneMapping, f.toneMappingExposure = .95, f.shadowMap.enabled = !0, f.shadowMap.type = e.PCFShadowMap, l.style.display = "block", l.style.width = "100%", l.style.height = "100%", l.setAttribute("aria-hidden", "true");
36
+ let u = new e.OrthographicCamera(-1.95, 1.95, 1.95, -1.95, .1, 30);
37
+ u.position.set(3.1, 2.5, 7), u.lookAt(0, 1.35, 0), u.layers.enable(1);
38
+ let g = u.position.clone(), _ = new e.Vector3(0, 1, 0).applyQuaternion(u.quaternion), v = new e.DirectionalLight(16775408, 2.4);
39
+ v.name = "sprite-key", d(v.shadow), v.position.set(-3.5, 5.5, 4.5), v.target.position.set(0, 1.1, 0), v.castShadow = !0, v.shadow.mapSize.set(2048, 2048), v.shadow.camera.left = v.shadow.camera.bottom = -3.4, v.shadow.camera.right = v.shadow.camera.top = 3.4, v.shadow.camera.near = .5, v.shadow.camera.far = 14, v.shadow.camera.updateProjectionMatrix(), v.shadow.bias = -15e-5, v.shadow.normalBias = .025, v.shadow.radius = 4, s.add(v, v.target);
40
+ let y = new e.DirectionalLight(15791359, .7);
41
+ y.name = "sprite-fill", d(y.shadow), y.position.set(4, 2.8, 3), y.target.position.set(0, 1.2, 0);
42
+ let b = new e.DirectionalLight(16777215, 1.2);
43
+ b.name = "sprite-rim", d(b.shadow), b.position.set(1.5, 4.5, -4), b.target.position.set(0, 1.4, 0), s.add(y, y.target, b, b.target), s.add(new e.HemisphereLight(16777215, 9869984, .3));
44
+ let x = d(new e.CylinderGeometry(n, 1.73, .14, 16)), S = d(new e.MeshStandardMaterial({
45
+ color: 13685460,
46
+ roughness: .92,
47
+ metalness: 0,
48
+ flatShading: !0
49
+ })), C = new e.Mesh(x, S);
50
+ C.name = "sprite-platform", C.position.y = -.095, C.receiveShadow = !0, s.add(C);
51
+ let w = new e.OrthographicCamera(-1.65, n, n, -1.65, .001, .65);
52
+ w.position.set(0, -.022000000000000002, 0), w.up.set(0, 0, 1), w.lookAt(0, 1, 0);
53
+ let T = d(new e.MeshDepthMaterial({
54
+ depthPacking: e.BasicDepthPacking,
55
+ side: e.DoubleSide,
56
+ blending: e.NoBlending
57
+ })), E = d(new e.WebGLRenderTarget(t, t, {
58
+ minFilter: e.LinearFilter,
59
+ magFilter: e.LinearFilter,
60
+ generateMipmaps: !1,
61
+ depthBuffer: !0,
62
+ stencilBuffer: !1
63
+ })), D = d(new e.WebGLRenderTarget(t, t, {
64
+ minFilter: e.LinearFilter,
65
+ magFilter: e.LinearFilter,
66
+ generateMipmaps: !1,
67
+ depthBuffer: !1,
68
+ stencilBuffer: !1
69
+ })), O = {
70
+ source: { value: E.texture },
71
+ direction: { value: new e.Vector2() }
72
+ }, k = d(new e.ShaderMaterial({
73
+ uniforms: O,
74
+ vertexShader: r,
75
+ fragmentShader: "\n uniform sampler2D source;\n uniform vec2 direction;\n varying vec2 vUv;\n void main() {\n vec4 color = texture2D(source, vUv) * 0.2270270270;\n color += texture2D(source, vUv + direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv - direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv + direction * 3.2307692308) * 0.0702702703;\n color += texture2D(source, vUv - direction * 3.2307692308) * 0.0702702703;\n gl_FragColor = color;\n }\n ",
76
+ depthTest: !1,
77
+ depthWrite: !1,
78
+ blending: e.NoBlending,
79
+ toneMapped: !1
80
+ })), A = d(new e.PlaneGeometry(2, 2)), j = new e.Mesh(A, k);
81
+ j.frustumCulled = !1, c.add(j);
82
+ let M = new e.OrthographicCamera(-1, 1, 1, -1, 0, 1), N = d(new e.ShaderMaterial({
83
+ uniforms: { shadow: { value: E.texture } },
84
+ vertexShader: r,
85
+ fragmentShader: "\n uniform sampler2D shadow;\n varying vec2 vUv;\n void main() {\n // The upward-facing capture and downward-facing UV axis need opposite V coordinates.\n float proximity = texture2D(shadow, vec2(vUv.x, 1.0 - vUv.y)).r;\n gl_FragColor = vec4(vec3(0.0), 0.32 * proximity * proximity);\n }\n ",
86
+ transparent: !0,
87
+ depthWrite: !1,
88
+ toneMapped: !1
89
+ })), P = d(new e.CircleGeometry(n, 16)), F = new e.Mesh(P, N);
90
+ F.name = "sprite-contact-shadow", F.rotation.x = -Math.PI / 2, F.position.y = -.022000000000000002, s.add(F);
91
+ let I = 0, L = 0, R = 0;
92
+ return i.appendChild(l), {
93
+ scene: o,
94
+ render: (e) => {
95
+ if (m || !f) return;
96
+ let n = i.clientWidth, r = i.clientHeight;
97
+ if (n <= 0 || r <= 0) return;
98
+ let l = Math.min(2, Math.max(1, i.ownerDocument.defaultView?.devicePixelRatio || 1));
99
+ if (n !== I || r !== L || l !== R) {
100
+ f.setDrawingBufferSize(n, r, l);
101
+ let e = n / r, t = Math.max(r * .5, r - a), i = Math.max(4.25, 3.85 / (n / t)), o = i * r / t;
102
+ u.position.copy(g).addScaledVector(_, (o - i) / 2), u.left = -o * e / 2, u.right = o * e / 2, u.top = o / 2, u.bottom = -o / 2, u.updateProjectionMatrix(), I = n, L = r, R = l;
103
+ }
104
+ e?.(u);
105
+ let d = o.overrideMaterial, p = o.background, h = s.visible, v = f.shadowMap.enabled;
106
+ try {
107
+ s.visible = !1, o.background = null, o.overrideMaterial = T, f.shadowMap.enabled = !1, f.info.render.frame++, f.setRenderTarget(E), f.render(o, w), O.source.value = E.texture, O.direction.value.set(1.5 / t, 0), f.setRenderTarget(D), f.render(c, M), O.source.value = D.texture, O.direction.value.set(0, 1.5 / t), f.setRenderTarget(E), f.render(c, M);
108
+ } finally {
109
+ o.overrideMaterial = d, o.background = p, s.visible = h, f.shadowMap.enabled = v, f.setRenderTarget(null);
110
+ }
111
+ f.render(o, u);
112
+ },
113
+ dispose: h
114
+ };
115
+ } catch (e) {
116
+ try {
117
+ h();
118
+ } catch (t) {
119
+ throw AggregateError([e, t], "Sprite studio initialization and cleanup failed.", { cause: t });
120
+ }
121
+ throw e;
122
+ }
123
+ }
124
+ //#endregion
125
+ export { i as createSpriteStage };
126
+
127
+ //# sourceMappingURL=createSpriteStage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSpriteStage.js","names":["THREE","shadowSize","platformRadius","uvVertexShader","createSpriteStage","scene","studio","blurScene","canvas","host","resources","own","resource","renderer","context","disposed","dispose","errors","release","error","camera","cameraOrigin","cameraUp","key","fill","rim","platformGeometry","platformMaterial","platform","contactCamera","depthMaterial","contactTarget","blurTarget","blurUniforms","blurMaterial","blurGeometry","blurQuad","blurCamera","contactMaterial","contactGeometry","contact","lastWidth","lastHeight","lastDpr","width","height","dpr","aspect","contentHeight","topInset","contentViewHeight","viewHeight","previousOverride","previousBackground","previousVisibility","previousShadows","cleanupError"],"sources":["../../../../../src/components/pro/Sprite/shared/createSpriteStage.ts"],"sourcesContent":["import * as THREE from 'three';\n\nconst shadowSize = 512;\nconst platformRadius = 1.65;\nconst platformTop = -0.025;\nconst uvVertexShader = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`;\n\n/**\n * A transparent, on-demand studio for +Z-facing sprites, about 2.8 high with feet at y=0.\n * Callers own their models, animation and resize scheduling. Enable castShadow /\n * receiveShadow on model meshes and use flat normals or flatShading for visible facets.\n * dispose() releases only studio resources, not geometry/materials added by the caller.\n */\nexport function createSpriteStage(host: HTMLElement, { topInset = 0 }: { topInset?: number } = {}): {\n scene: THREE.Scene;\n render: (beforeRender?: (camera: THREE.OrthographicCamera) => void) => void;\n dispose: () => void;\n} {\n const scene = new THREE.Scene();\n const studio = new THREE.Group();\n studio.name = 'sprite-studio';\n scene.add(studio);\n const blurScene = new THREE.Scene();\n const canvas = host.ownerDocument.createElement('canvas');\n const resources = new Set<{ dispose: () => void }>();\n const own = <T extends { dispose: () => void }>(resource: T): T => {\n resources.add(resource);\n return resource;\n };\n let renderer: THREE.WebGLRenderer | undefined;\n let context: WebGL2RenderingContext | null = null;\n let disposed = false;\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n const errors: unknown[] = [];\n const release = (action: () => void) => {\n try { action(); } catch (error) { errors.push(error); }\n };\n studio.removeFromParent();\n studio.clear();\n blurScene.clear();\n for (const resource of resources) release(() => resource.dispose());\n resources.clear();\n release(() => renderer?.dispose());\n // Keep the context separately so even a throwing renderer constructor can be cleaned up.\n release(() => context?.getExtension('WEBGL_lose_context')?.loseContext());\n release(() => canvas.remove());\n renderer = undefined;\n context = null;\n if (errors.length) throw new AggregateError(errors, 'Failed to release sprite studio resources.');\n };\n\n try {\n context = canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n premultipliedAlpha: true,\n depth: true,\n stencil: false,\n powerPreference: 'low-power',\n });\n if (!context) throw new Error('The sprite studio requires WebGL 2.');\n renderer = new THREE.WebGLRenderer({ canvas, context, alpha: true, antialias: true });\n renderer.setClearColor(0x000000, 0);\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 0.95;\n renderer.shadowMap.enabled = true;\n // In r186 PCFShadowMap supports a filtered radius; PCFSoftShadowMap is deprecated.\n renderer.shadowMap.type = THREE.PCFShadowMap;\n canvas.style.display = 'block';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.setAttribute('aria-hidden', 'true');\n\n const camera = new THREE.OrthographicCamera(-1.95, 1.95, 1.95, -1.95, 0.1, 30);\n camera.position.set(3.1, 2.5, 7);\n camera.lookAt(0, 1.35, 0);\n camera.layers.enable(1); // Speech is visible here, but not to the layer-0 shadow cameras.\n const cameraOrigin = camera.position.clone();\n const cameraUp = new THREE.Vector3(0, 1, 0).applyQuaternion(camera.quaternion);\n\n const key = new THREE.DirectionalLight(0xfff8f0, 2.4);\n key.name = 'sprite-key';\n own(key.shadow);\n key.position.set(-3.5, 5.5, 4.5);\n key.target.position.set(0, 1.1, 0);\n key.castShadow = true;\n key.shadow.mapSize.set(2048, 2048);\n key.shadow.camera.left = key.shadow.camera.bottom = -3.4;\n key.shadow.camera.right = key.shadow.camera.top = 3.4;\n key.shadow.camera.near = 0.5;\n key.shadow.camera.far = 14;\n key.shadow.camera.updateProjectionMatrix();\n key.shadow.bias = -0.00015;\n key.shadow.normalBias = 0.025;\n key.shadow.radius = 4;\n studio.add(key, key.target);\n\n const fill = new THREE.DirectionalLight(0xf0f4ff, 0.7);\n fill.name = 'sprite-fill';\n own(fill.shadow);\n fill.position.set(4, 2.8, 3);\n fill.target.position.set(0, 1.2, 0);\n const rim = new THREE.DirectionalLight(0xffffff, 1.2);\n rim.name = 'sprite-rim';\n own(rim.shadow);\n rim.position.set(1.5, 4.5, -4);\n rim.target.position.set(0, 1.4, 0);\n studio.add(fill, fill.target, rim, rim.target);\n studio.add(new THREE.HemisphereLight(0xffffff, 0x969aa0, 0.3));\n\n const platformGeometry = own(new THREE.CylinderGeometry(platformRadius, 1.73, 0.14, 16));\n const platformMaterial = own(new THREE.MeshStandardMaterial({\n color: 0xd0d2d4,\n roughness: 0.92,\n metalness: 0,\n flatShading: true,\n }));\n const platform = new THREE.Mesh(platformGeometry, platformMaterial);\n platform.name = 'sprite-platform';\n platform.position.y = platformTop - 0.07;\n platform.receiveShadow = true;\n studio.add(platform);\n\n // Capture actual undersides close to the floor, not a fixed elliptical shadow decal.\n const contactCamera = new THREE.OrthographicCamera(\n -platformRadius, platformRadius, platformRadius, -platformRadius, 0.001, 0.65,\n );\n contactCamera.position.set(0, platformTop + 0.003, 0);\n contactCamera.up.set(0, 0, 1);\n contactCamera.lookAt(0, 1, 0);\n const depthMaterial = own(new THREE.MeshDepthMaterial({\n depthPacking: THREE.BasicDepthPacking,\n side: THREE.DoubleSide,\n blending: THREE.NoBlending,\n }));\n const contactTarget = own(new THREE.WebGLRenderTarget(shadowSize, shadowSize, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n generateMipmaps: false,\n depthBuffer: true,\n stencilBuffer: false,\n }));\n const blurTarget = own(new THREE.WebGLRenderTarget(shadowSize, shadowSize, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n generateMipmaps: false,\n depthBuffer: false,\n stencilBuffer: false,\n }));\n const blurUniforms = {\n source: { value: contactTarget.texture },\n direction: { value: new THREE.Vector2() },\n };\n const blurMaterial = own(new THREE.ShaderMaterial({\n uniforms: blurUniforms,\n vertexShader: uvVertexShader,\n fragmentShader: /* glsl */ `\n uniform sampler2D source;\n uniform vec2 direction;\n varying vec2 vUv;\n void main() {\n vec4 color = texture2D(source, vUv) * 0.2270270270;\n color += texture2D(source, vUv + direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv - direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv + direction * 3.2307692308) * 0.0702702703;\n color += texture2D(source, vUv - direction * 3.2307692308) * 0.0702702703;\n gl_FragColor = color;\n }\n `,\n depthTest: false,\n depthWrite: false,\n blending: THREE.NoBlending,\n toneMapped: false,\n }));\n const blurGeometry = own(new THREE.PlaneGeometry(2, 2));\n const blurQuad = new THREE.Mesh(blurGeometry, blurMaterial);\n blurQuad.frustumCulled = false;\n blurScene.add(blurQuad);\n const blurCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const contactMaterial = own(new THREE.ShaderMaterial({\n uniforms: { shadow: { value: contactTarget.texture } },\n vertexShader: uvVertexShader,\n fragmentShader: /* glsl */ `\n uniform sampler2D shadow;\n varying vec2 vUv;\n void main() {\n // The upward-facing capture and downward-facing UV axis need opposite V coordinates.\n float proximity = texture2D(shadow, vec2(vUv.x, 1.0 - vUv.y)).r;\n gl_FragColor = vec4(vec3(0.0), 0.32 * proximity * proximity);\n }\n `,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n }));\n const contactGeometry = own(new THREE.CircleGeometry(platformRadius, 16));\n const contact = new THREE.Mesh(contactGeometry, contactMaterial);\n contact.name = 'sprite-contact-shadow';\n contact.rotation.x = -Math.PI / 2;\n contact.position.y = platformTop + 0.003;\n studio.add(contact);\n\n let lastWidth = 0;\n let lastHeight = 0;\n let lastDpr = 0;\n const render = (beforeRender?: (camera: THREE.OrthographicCamera) => void) => {\n if (disposed || !renderer) return;\n const width = host.clientWidth;\n const height = host.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = Math.min(2, Math.max(1, host.ownerDocument.defaultView?.devicePixelRatio || 1));\n if (width !== lastWidth || height !== lastHeight || dpr !== lastDpr) {\n // One buffer resize for a size/DPR change, none for ordinary pose updates.\n renderer.setDrawingBufferSize(width, height, dpr);\n const aspect = width / height;\n // Fit the character below the speech area without changing the viewing angle.\n const contentHeight = Math.max(height * 0.5, height - topInset);\n const contentViewHeight = Math.max(4.25, 3.85 / (width / contentHeight));\n const viewHeight = contentViewHeight * height / contentHeight;\n camera.position.copy(cameraOrigin).addScaledVector(cameraUp, (viewHeight - contentViewHeight) / 2);\n camera.left = -viewHeight * aspect / 2;\n camera.right = viewHeight * aspect / 2;\n camera.top = viewHeight / 2;\n camera.bottom = -viewHeight / 2;\n camera.updateProjectionMatrix();\n lastWidth = width;\n lastHeight = height;\n lastDpr = dpr;\n }\n\n beforeRender?.(camera);\n const previousOverride = scene.overrideMaterial;\n const previousBackground = scene.background;\n const previousVisibility = studio.visible;\n const previousShadows = renderer.shadowMap.enabled;\n try {\n studio.visible = false;\n scene.background = null;\n scene.overrideMaterial = depthMaterial;\n renderer.shadowMap.enabled = false;\n // Three r186's shadow pass shares its geometry-upload frame with the next render.\n // Advance before the depth capture so deformed tails use current, not previous, GPU vertices.\n renderer.info.render.frame++;\n renderer.setRenderTarget(contactTarget);\n renderer.render(scene, contactCamera);\n\n blurUniforms.source.value = contactTarget.texture;\n blurUniforms.direction.value.set(1.5 / shadowSize, 0);\n renderer.setRenderTarget(blurTarget);\n renderer.render(blurScene, blurCamera);\n blurUniforms.source.value = blurTarget.texture;\n blurUniforms.direction.value.set(0, 1.5 / shadowSize);\n renderer.setRenderTarget(contactTarget);\n renderer.render(blurScene, blurCamera);\n } finally {\n scene.overrideMaterial = previousOverride;\n scene.background = previousBackground;\n studio.visible = previousVisibility;\n renderer.shadowMap.enabled = previousShadows;\n renderer.setRenderTarget(null);\n }\n renderer.render(scene, camera);\n };\n\n host.appendChild(canvas);\n return { scene, render, dispose };\n } catch (error) {\n try { dispose(); } catch (cleanupError) {\n throw new AggregateError([error, cleanupError], 'Sprite studio initialization and cleanup failed.', { cause: cleanupError });\n }\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SpriteCharacter, SpriteCharacterEvents, SpriteReplyIntent } from '../types';
2
+ export type { SpriteReplyIntent, SpriteEvent, SpriteExpression, SpriteCharacterEvents } from '../types';
3
+ export declare function isComfortMessage(message: string): boolean;
4
+ export declare function classifyMessage(message: string): SpriteReplyIntent;
5
+ export declare function getSpriteEvents(character: SpriteCharacter): SpriteCharacterEvents;
@@ -0,0 +1,21 @@
1
+ import { mollyEvents as e } from "../Molly/events.js";
2
+ import { rubyEvents as t } from "../Ruby/events.js";
3
+ //#region src/components/pro/Sprite/shared/events.ts
4
+ function n(e) {
5
+ return /难过|伤心|sad|tired|累|不开心/i.test(e);
6
+ }
7
+ function r(e) {
8
+ let t = e.toLowerCase();
9
+ return /你好|嗨|hello|hi\b|hey\b/.test(t) ? "greeting" : n(t) ? "comfort" : /谢谢|thank/.test(t) ? "thanks" : /名字|是谁|name|who/.test(t) ? "identity" : "default";
10
+ }
11
+ var i = {
12
+ ruby: t,
13
+ molly: e
14
+ };
15
+ function a(e) {
16
+ return i[e];
17
+ }
18
+ //#endregion
19
+ export { r as classifyMessage, a as getSpriteEvents, n as isComfortMessage };
20
+
21
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","names":["isComfortMessage","message","classifyMessage","text","registry","rubyEvents","mollyEvents","getSpriteEvents","character"],"sources":["../../../../../src/components/pro/Sprite/shared/events.ts"],"sourcesContent":["import { mollyEvents } from '../Molly/events';\nimport { rubyEvents } from '../Ruby/events';\nimport type { SpriteCharacter, SpriteCharacterEvents, SpriteReplyIntent } from '../types';\n\nexport type { SpriteReplyIntent, SpriteEvent, SpriteExpression, SpriteCharacterEvents } from '../types';\n\nexport function isComfortMessage(message: string): boolean {\n return /难过|伤心|sad|tired|累|不开心/i.test(message);\n}\n\nexport function classifyMessage(message: string): SpriteReplyIntent {\n const text = message.toLowerCase();\n if (/你好|嗨|hello|hi\\b|hey\\b/.test(text)) return 'greeting';\n if (isComfortMessage(text)) return 'comfort';\n if (/谢谢|thank/.test(text)) return 'thanks';\n if (/名字|是谁|name|who/.test(text)) return 'identity';\n return 'default';\n}\n\nconst registry: Record<SpriteCharacter, SpriteCharacterEvents> = {\n ruby: rubyEvents,\n molly: mollyEvents,\n};\n\nexport function getSpriteEvents(character: SpriteCharacter): SpriteCharacterEvents {\n return registry[character];\n}\n"],"mappings":";;;AAMA,SAAgBA,EAAiB,GAA0B;CACzD,OAAO,yBAAyB,KAAKC,CAAO;AAC9C;AAEA,SAAgBC,EAAgB,GAAoC;CAClE,IAAMC,IAAOF,EAAQ,YAAY;CAKjC,OAJI,wBAAwB,KAAKE,CAAI,IAAU,aAC3CH,EAAiBG,CAAI,IAAU,YAC/B,WAAW,KAAKA,CAAI,IAAU,WAC9B,iBAAiB,KAAKA,CAAI,IAAU,aACjC;AACT;AAEA,IAAMC,IAA2D;CAC/D,MAAMC;CACN,OAAOC;AACT;AAEA,SAAgBC,EAAgB,GAAmD;CACjF,OAAOH,EAASI;AAClB"}
@@ -0,0 +1,15 @@
1
+ import * as THREE from 'three';
2
+ import type { Sculptor } from './sculptor';
3
+ export type FacePatch = {
4
+ mesh: THREE.Mesh;
5
+ offset: number;
6
+ };
7
+ /** Materials and unprojected local shapes belong to the model, not the skin projector. */
8
+ export declare function createFacePatches(sculptor: Sculptor): {
9
+ patches: FacePatch[];
10
+ attached: (mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>, name: string, offset?: number) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
11
+ };
12
+ /** Bind only after the rig hierarchy is complete. The first animation pose must perform update. */
13
+ export declare function bindFace(head: THREE.Group, skin: THREE.Mesh[], patches: FacePatch[]): {
14
+ update(): void;
15
+ };
@@ -0,0 +1,33 @@
1
+ import { createFaceSurface as e } from "./faceSurface.js";
2
+ import * as t from "three";
3
+ //#region src/components/pro/Sprite/shared/face.ts
4
+ function n(e) {
5
+ let n = [];
6
+ return {
7
+ patches: n,
8
+ attached: (r, i, a = .002) => {
9
+ let o = e.ownMaterial(new t.MeshBasicMaterial({
10
+ color: r.material instanceof t.MeshPhysicalMaterial ? r.material.color : 16777215,
11
+ vertexColors: r.geometry.hasAttribute("color"),
12
+ side: t.DoubleSide,
13
+ polygonOffset: !0,
14
+ polygonOffsetFactor: -1,
15
+ polygonOffsetUnits: -1,
16
+ depthWrite: !1
17
+ }));
18
+ return r.name = i, r.material = o, r.castShadow = r.receiveShadow = !1, r.renderOrder = 3 + a * 100, n.push({
19
+ mesh: r,
20
+ offset: a
21
+ }), r;
22
+ }
23
+ };
24
+ }
25
+ function r(t, n, r) {
26
+ let i = e(t, n);
27
+ for (let { mesh: e, offset: t } of r) i.add(e, t);
28
+ return { update: () => i.update() };
29
+ }
30
+ //#endregion
31
+ export { r as bindFace, n as createFacePatches };
32
+
33
+ //# sourceMappingURL=face.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"face.js","names":["THREE","createFacePatches","patches","material","sculptor","mesh","name","offset","bindFace","face","createFaceSurface","head","skin"],"sources":["../../../../../src/components/pro/Sprite/shared/face.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { createFaceSurface } from './faceSurface';\nimport type { Sculptor } from './sculptor';\n\nexport type FacePatch = { mesh: THREE.Mesh; offset: number };\n\n/** Materials and unprojected local shapes belong to the model, not the skin projector. */\nexport function createFacePatches(sculptor: Sculptor) {\n const patches: FacePatch[] = [];\n const attached = (mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>, name: string, offset = 0.002) => {\n const material = sculptor.ownMaterial(new THREE.MeshBasicMaterial({\n color: mesh.material instanceof THREE.MeshPhysicalMaterial ? mesh.material.color : 0xffffff,\n vertexColors: mesh.geometry.hasAttribute('color'), side: THREE.DoubleSide,\n polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: -1, depthWrite: false,\n }));\n mesh.name = name;\n mesh.material = material;\n mesh.castShadow = mesh.receiveShadow = false;\n mesh.renderOrder = 3 + offset * 100;\n patches.push({ mesh, offset });\n return mesh;\n };\n return { patches, attached };\n}\n\n/** Bind only after the rig hierarchy is complete. The first animation pose must perform update. */\nexport function bindFace(head: THREE.Group, skin: THREE.Mesh[], patches: FacePatch[]): { update(): void } {\n const face = createFaceSurface(head, skin);\n for (const { mesh, offset } of patches) face.add(mesh, offset);\n return { update: () => face.update() };\n}\n"],"mappings":";;;AAOA,SAAgBC,EAAkB,GAAoB;CACpD,IAAMC,IAAuB,CAAC;CAc9B,OAAO;EAAE;EAAS,WAbA,GAAwD,GAAc,IAAS,SAAU;GACzG,IAAMC,IAAWC,EAAS,YAAY,IAAIJ,EAAM,kBAAkB;IAChE,OAAOK,EAAK,oBAAoBL,EAAM,uBAAuBK,EAAK,SAAS,QAAQ;IACnF,cAAcA,EAAK,SAAS,aAAa,OAAO;IAAG,MAAML,EAAM;IAC/D,eAAe;IAAM,qBAAqB;IAAI,oBAAoB;IAAI,YAAY;GACpF,CAAC,CAAC;GAMF,OALA,EAAK,OAAOM,GACZ,EAAK,WAAWH,GAChB,EAAK,aAAa,EAAK,gBAAgB,IACvC,EAAK,cAAc,IAAII,IAAS,KAChCL,EAAQ,KAAK;IAAE;IAAM;GAAO,CAAC,GACtBG;EACT;CAC2B;AAC7B;AAGA,SAAgBG,EAAS,GAAmB,GAAoB,GAA0C;CACxG,IAAMC,IAAOC,EAAkBC,GAAMC,CAAI;CACzC,KAAK,IAAM,EAAE,SAAM,eAAYV,GAAS,EAAK,IAAIG,GAAME,CAAM;CAC7D,OAAO,EAAE,cAAcE,EAAK,OAAO,EAAE;AACvC"}
@@ -0,0 +1,6 @@
1
+ import * as THREE from 'three';
2
+ /** Project animated facial marks onto the actual low-poly skin, including muzzle surfaces. */
3
+ export declare function createFaceSurface(head: THREE.Object3D, surfaces: THREE.Mesh[]): {
4
+ add(mesh: THREE.Mesh, offset?: number): void;
5
+ update(): void;
6
+ };
@@ -0,0 +1,66 @@
1
+ import * as e from "three";
2
+ //#region src/components/pro/Sprite/shared/faceSurface.ts
3
+ function t(t, n) {
4
+ let r = [], i = [], a = new e.Matrix4(), o = new e.Matrix4(), s = new e.Matrix4(), c = new e.Vector3(), l = new e.Vector3(), u = new e.Vector3(), d = new e.Vector3();
5
+ function f() {
6
+ for (let e of n) {
7
+ o.multiplyMatrices(a, e.matrixWorld);
8
+ let t = e.geometry.getAttribute("position"), n = e.geometry.index, i = n?.count ?? t.count;
9
+ for (let e = 0; e < i; e += 3) {
10
+ l.fromBufferAttribute(t, n ? n.getX(e) : e).applyMatrix4(o), u.fromBufferAttribute(t, n ? n.getX(e + 1) : e + 1).applyMatrix4(o), d.fromBufferAttribute(t, n ? n.getX(e + 2) : e + 2).applyMatrix4(o);
11
+ let i = u.x - l.x, a = u.y - l.y, s = d.x - l.x, c = d.y - l.y, f = i * c - a * s;
12
+ Math.abs(f) < 1e-10 || r.push({
13
+ x: l.x,
14
+ y: l.y,
15
+ z: l.z,
16
+ ax: i,
17
+ ay: a,
18
+ az: u.z - l.z,
19
+ bx: s,
20
+ by: c,
21
+ bz: d.z - l.z,
22
+ inverse: 1 / f,
23
+ minX: Math.min(l.x, u.x, d.x),
24
+ maxX: Math.max(l.x, u.x, d.x),
25
+ minY: Math.min(l.y, u.y, d.y),
26
+ maxY: Math.max(l.y, u.y, d.y)
27
+ });
28
+ }
29
+ }
30
+ }
31
+ function p(e, t) {
32
+ let n = -Infinity;
33
+ for (let i of r) {
34
+ if (e < i.minX || e > i.maxX || t < i.minY || t > i.maxY) continue;
35
+ let r = e - i.x, a = t - i.y, o = (r * i.by - a * i.bx) * i.inverse, s = (i.ax * a - i.ay * r) * i.inverse;
36
+ o >= -1e-6 && s >= -1e-6 && o + s <= 1.000001 && (n = Math.max(n, i.z + o * i.az + s * i.bz));
37
+ }
38
+ return n;
39
+ }
40
+ return {
41
+ add(e, t = .002) {
42
+ i.push({
43
+ mesh: e,
44
+ original: new Float32Array(e.geometry.getAttribute("position").array),
45
+ offset: t
46
+ });
47
+ },
48
+ update() {
49
+ t.updateWorldMatrix(!0, !0), a.copy(t.matrixWorld).invert(), r.length || f();
50
+ for (let { mesh: e, original: t, offset: n } of i) {
51
+ o.multiplyMatrices(a, e.matrixWorld), s.copy(o).invert();
52
+ let r = e.geometry.getAttribute("position");
53
+ for (let e = 0; e < r.count; e++) {
54
+ c.fromArray(t, e * 3).applyMatrix4(o);
55
+ let i = p(c.x, c.y);
56
+ Number.isFinite(i) && (c.z = i + n), c.applyMatrix4(s), r.setXYZ(e, c.x, c.y, c.z);
57
+ }
58
+ r.needsUpdate = !0, e.geometry.computeBoundingSphere();
59
+ }
60
+ }
61
+ };
62
+ }
63
+ //#endregion
64
+ export { t as createFaceSurface };
65
+
66
+ //# sourceMappingURL=faceSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faceSurface.js","names":["THREE","createFaceSurface","triangles","patches","headInverse","local","inverse","point","a","b","c","compile","surface","surfaces","positions","index","count","i","ax","ay","bx","by","determinant","front","depth","t","x","y","dx","dy","u","v","mesh","head","original","z","offset"],"sources":["../../../../../src/components/pro/Sprite/shared/faceSurface.ts"],"sourcesContent":["import * as THREE from 'three';\n\n/** Project animated facial marks onto the actual low-poly skin, including muzzle surfaces. */\nexport function createFaceSurface(head: THREE.Object3D, surfaces: THREE.Mesh[]) {\n type Triangle = { x: number; y: number; z: number; ax: number; ay: number; az: number;\n bx: number; by: number; bz: number; inverse: number; minX: number; maxX: number; minY: number; maxY: number };\n const triangles: Triangle[] = [];\n const patches: { mesh: THREE.Mesh; original: Float32Array; offset: number }[] = [];\n const headInverse = new THREE.Matrix4();\n const local = new THREE.Matrix4();\n const inverse = new THREE.Matrix4();\n const point = new THREE.Vector3();\n const a = new THREE.Vector3();\n const b = new THREE.Vector3();\n const c = new THREE.Vector3();\n\n function compile() {\n for (const surface of surfaces) {\n local.multiplyMatrices(headInverse, surface.matrixWorld);\n const positions = surface.geometry.getAttribute('position');\n const index = surface.geometry.index;\n const count = index?.count ?? positions.count;\n for (let i = 0; i < count; i += 3) {\n a.fromBufferAttribute(positions, index ? index.getX(i) : i).applyMatrix4(local);\n b.fromBufferAttribute(positions, index ? index.getX(i + 1) : i + 1).applyMatrix4(local);\n c.fromBufferAttribute(positions, index ? index.getX(i + 2) : i + 2).applyMatrix4(local);\n const ax = b.x - a.x; const ay = b.y - a.y;\n const bx = c.x - a.x; const by = c.y - a.y;\n const determinant = ax * by - ay * bx;\n if (Math.abs(determinant) < 1e-10) continue;\n triangles.push({ x: a.x, y: a.y, z: a.z, ax, ay, az: b.z - a.z, bx, by, bz: c.z - a.z,\n inverse: 1 / determinant, minX: Math.min(a.x, b.x, c.x), maxX: Math.max(a.x, b.x, c.x),\n minY: Math.min(a.y, b.y, c.y), maxY: Math.max(a.y, b.y, c.y) });\n }\n }\n }\n\n function front(x: number, y: number) {\n let depth = -Infinity;\n for (const t of triangles) {\n if (x < t.minX || x > t.maxX || y < t.minY || y > t.maxY) continue;\n const dx = x - t.x; const dy = y - t.y;\n const u = (dx * t.by - dy * t.bx) * t.inverse;\n const v = (t.ax * dy - t.ay * dx) * t.inverse;\n if (u >= -1e-6 && v >= -1e-6 && u + v <= 1.000001) depth = Math.max(depth, t.z + u * t.az + v * t.bz);\n }\n return depth;\n }\n\n return {\n add(mesh: THREE.Mesh, offset = 0.002) {\n patches.push({ mesh, original: new Float32Array(mesh.geometry.getAttribute('position').array), offset });\n },\n update() {\n head.updateWorldMatrix(true, true);\n headInverse.copy(head.matrixWorld).invert();\n if (!triangles.length) compile();\n for (const { mesh, original, offset } of patches) {\n local.multiplyMatrices(headInverse, mesh.matrixWorld);\n inverse.copy(local).invert();\n const positions = mesh.geometry.getAttribute('position');\n for (let i = 0; i < positions.count; i++) {\n point.fromArray(original, i * 3).applyMatrix4(local);\n const z = front(point.x, point.y);\n if (Number.isFinite(z)) point.z = z + offset;\n point.applyMatrix4(inverse);\n positions.setXYZ(i, point.x, point.y, point.z);\n }\n positions.needsUpdate = true;\n mesh.geometry.computeBoundingSphere();\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** A foot travels forward while lifted, then moves back through its planted support phase. */
2
+ export declare function sampleFootstep(cycle: number, offset: number, swingFraction: number): {
3
+ travel: number;
4
+ lift: number;
5
+ };
@@ -0,0 +1,19 @@
1
+ //#region src/components/pro/Sprite/shared/gait.ts
2
+ function e(e, t, n) {
3
+ let r = ((e + t) % 1 + 1) % 1;
4
+ if (r < n) {
5
+ let e = r / n;
6
+ return {
7
+ travel: -Math.cos(e * Math.PI),
8
+ lift: Math.sin(e * Math.PI)
9
+ };
10
+ }
11
+ return {
12
+ travel: 1 - 2 * (r - n) / (1 - n),
13
+ lift: 0
14
+ };
15
+ }
16
+ //#endregion
17
+ export { e as sampleFootstep };
18
+
19
+ //# sourceMappingURL=gait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gait.js","names":["sampleFootstep","phase","cycle","offset","swingFraction","swing"],"sources":["../../../../../src/components/pro/Sprite/shared/gait.ts"],"sourcesContent":["/** A foot travels forward while lifted, then moves back through its planted support phase. */\nexport function sampleFootstep(cycle: number, offset: number, swingFraction: number) {\n const phase = ((cycle + offset) % 1 + 1) % 1;\n if (phase < swingFraction) {\n const swing = phase / swingFraction;\n return { travel: -Math.cos(swing * Math.PI), lift: Math.sin(swing * Math.PI) };\n }\n return { travel: 1 - 2 * (phase - swingFraction) / (1 - swingFraction), lift: 0 };\n}\n"],"mappings":";AACA,SAAgBA,EAAe,GAAe,GAAgB,GAAuB;CACnF,IAAMC,MAAUC,IAAQC,KAAU,IAAI,KAAK;CAC3C,IAAIF,IAAQG,GAAe;EACzB,IAAMC,IAAQJ,IAAQG;EACtB,OAAO;GAAE,QAAQ,CAAC,KAAK,IAAIC,IAAQ,KAAK,EAAE;GAAG,MAAM,KAAK,IAAIA,IAAQ,KAAK,EAAE;EAAE;CAC/E;CACA,OAAO;EAAE,QAAQ,IAAI,KAAKJ,IAAQG,MAAkB,IAAIA;EAAgB,MAAM;CAAE;AAClF"}
@@ -0,0 +1,8 @@
1
+ import * as THREE from 'three';
2
+ export type Point = [number, number, number];
3
+ export type Ring = [y: number, width: number, depth: number, forward?: number];
4
+ /** Deliberately placed cross-sections, not a tessellated sphere: cheeks, chin and shoulders have their own silhouette. */
5
+ export declare function loft(rings: Ring[], sides?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
6
+ /** Closed, ridged volumes. Ears and feathers have thickness and read from behind, not just from the front. */
7
+ export declare function cutout(outline: [number, number][], ridge: Point, back?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
8
+ export declare function sweep(points: Point[], radii: number[], sides?: number, steps?: number, flatten?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
@@ -0,0 +1,59 @@
1
+ import * as e from "three";
2
+ //#region src/components/pro/Sprite/shared/geometry.ts
3
+ var t = (t) => new e.Vector3(...t);
4
+ function n(t, n = 12) {
5
+ let r = [], i = [], a = [];
6
+ t.forEach(([e, t, a, o = 0], s) => {
7
+ let c = [], l = t === 0 ? 1 : n;
8
+ for (let i = 0; i < l; i++) {
9
+ let l = (i + .5) * Math.PI * 2 / n + (s % 2 ? .045 : -.045);
10
+ c.push(r.length / 3), r.push(Math.sin(l) * t, e, Math.cos(l) * a + o);
11
+ }
12
+ i.push(c);
13
+ });
14
+ for (let e = 0; e < i.length - 1; e++) {
15
+ let t = i[e], r = i[e + 1];
16
+ for (let e = 0; e < n; e++) {
17
+ let i = (e + 1) % n;
18
+ t.length === 1 ? a.push(t[0], r[i], r[e]) : r.length === 1 ? a.push(t[e], t[i], r[0]) : e % 2 ? a.push(t[e], t[i], r[i], t[e], r[i], r[e]) : a.push(t[e], t[i], r[e], t[i], r[i], r[e]);
19
+ }
20
+ }
21
+ let o = new e.BufferGeometry();
22
+ return o.setAttribute("position", new e.Float32BufferAttribute(r, 3)), o.setIndex(a), o;
23
+ }
24
+ function r(t, n, r = -.06) {
25
+ e.ShapeUtils.isClockWise(t.map(([t, n]) => new e.Vector2(t, n))) && (t = t.map((e, n) => t[t.length - 1 - n]));
26
+ let i = t.flatMap(([e, t]) => [
27
+ e,
28
+ t,
29
+ 0
30
+ ]);
31
+ i.push(...n, n[0], n[1], r);
32
+ let a = t.length, o = [];
33
+ for (let e = 0; e < t.length; e++) {
34
+ let n = (e + 1) % t.length;
35
+ o.push(e, n, a, n, e, a + 1);
36
+ }
37
+ let s = new e.BufferGeometry();
38
+ return s.setAttribute("position", new e.Float32BufferAttribute(i, 3)), s.setIndex(o), s;
39
+ }
40
+ function i(n, r, i = 6, a = 12, o = 1) {
41
+ let s = new e.CatmullRomCurve3(n.map(t)), c = s.computeFrenetFrames(a, !1), l = [], u = [];
42
+ for (let t = 0; t <= a; t++) {
43
+ let n = s.getPoint(t / a), d = t / a * (r.length - 1), f = Math.min(r.length - 2, Math.floor(d)), p = e.MathUtils.lerp(r[f], r[f + 1], d - f);
44
+ for (let e = 0; e < i; e++) {
45
+ let r = e / i * Math.PI * 2, s = n.clone().addScaledVector(c.normals[t], Math.cos(r) * p).addScaledVector(c.binormals[t], Math.sin(r) * p * o);
46
+ if (l.push(s.x, s.y, s.z), t < a) {
47
+ let n = t * i + e, r = t * i + (e + 1) % i;
48
+ u.push(n, r, n + i, r, r + i, n + i);
49
+ }
50
+ }
51
+ }
52
+ for (let e = 1; e < i - 1; e++) u.push(0, e + 1, e, a * i, a * i + e, a * i + e + 1);
53
+ let d = new e.BufferGeometry();
54
+ return d.setAttribute("position", new e.Float32BufferAttribute(l, 3)), d.setIndex(u), d;
55
+ }
56
+ //#endregion
57
+ export { r as cutout, n as loft, i as sweep };
58
+
59
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","names":["THREE","vector","point","loft","vertices","rows","indices","y","width","depth","forward","indicesForRing","count","sides","angle","row","a","b","i","next","geometry","cutout","outline","x","ridge","back","front","sweep","curve","points","frames","steps","p","index","radii","k","radius","j","flatten"],"sources":["../../../../../src/components/pro/Sprite/shared/geometry.ts"],"sourcesContent":["import * as THREE from 'three';\n\nexport type Point = [number, number, number];\nexport type Ring = [y: number, width: number, depth: number, forward?: number];\nconst vector = (point: Point) => new THREE.Vector3(...point);\n\n/** Deliberately placed cross-sections, not a tessellated sphere: cheeks, chin and shoulders have their own silhouette. */\nexport function loft(rings: Ring[], sides = 12) {\n const vertices: number[] = [];\n const rows: number[][] = [];\n const indices: number[] = [];\n rings.forEach(([y, width, depth, forward = 0], row) => {\n const indicesForRing: number[] = [];\n const count = width === 0 ? 1 : sides;\n for (let i = 0; i < count; i++) {\n const angle = (i + 0.5) * Math.PI * 2 / sides + (row % 2 ? 0.045 : -0.045);\n indicesForRing.push(vertices.length / 3);\n vertices.push(Math.sin(angle) * width, y, Math.cos(angle) * depth + forward);\n }\n rows.push(indicesForRing);\n });\n for (let row = 0; row < rows.length - 1; row++) {\n const a = rows[row];\n const b = rows[row + 1];\n for (let i = 0; i < sides; i++) {\n const next = (i + 1) % sides;\n if (a.length === 1) indices.push(a[0], b[next], b[i]);\n else if (b.length === 1) indices.push(a[i], a[next], b[0]);\n else if (i % 2) indices.push(a[i], a[next], b[next], a[i], b[next], b[i]);\n else indices.push(a[i], a[next], b[i], a[next], b[next], b[i]);\n }\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n\n/** Closed, ridged volumes. Ears and feathers have thickness and read from behind, not just from the front. */\nexport function cutout(outline: [number, number][], ridge: Point, back = -0.06) {\n if (THREE.ShapeUtils.isClockWise(outline.map(([x, y]) => new THREE.Vector2(x, y)))) {\n outline = outline.map((_, i) => outline[outline.length - 1 - i]);\n }\n const vertices = outline.flatMap(([x, y]) => [x, y, 0]);\n vertices.push(...ridge, ridge[0], ridge[1], back);\n const front = outline.length;\n const indices: number[] = [];\n for (let i = 0; i < outline.length; i++) {\n const next = (i + 1) % outline.length;\n indices.push(i, next, front, next, i, front + 1);\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n\nexport function sweep(points: Point[], radii: number[], sides = 6, steps = 12, flatten = 1) {\n const curve = new THREE.CatmullRomCurve3(points.map(vector));\n const frames = curve.computeFrenetFrames(steps, false);\n const vertices: number[] = [];\n const indices: number[] = [];\n for (let i = 0; i <= steps; i++) {\n const p = curve.getPoint(i / steps);\n const index = i / steps * (radii.length - 1);\n const k = Math.min(radii.length - 2, Math.floor(index));\n const radius = THREE.MathUtils.lerp(radii[k], radii[k + 1], index - k);\n for (let j = 0; j < sides; j++) {\n const angle = j / sides * Math.PI * 2;\n const point = p.clone().addScaledVector(frames.normals[i], Math.cos(angle) * radius)\n .addScaledVector(frames.binormals[i], Math.sin(angle) * radius * flatten);\n vertices.push(point.x, point.y, point.z);\n if (i < steps) {\n const a = i * sides + j;\n const b = i * sides + (j + 1) % sides;\n indices.push(a, b, a + sides, b, b + sides, a + sides);\n }\n }\n }\n for (let j = 1; j < sides - 1; j++) {\n indices.push(0, j + 1, j, steps * sides, steps * sides + j, steps * sides + j + 1);\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import * as THREE from 'three';
2
+ export type MagicEffectStyle = {
3
+ name: string;
4
+ palette: readonly number[];
5
+ core: {
6
+ shape: 'gem' | 'star';
7
+ growth: number;
8
+ rotate: (rotation: THREE.Euler, time: number) => void;
9
+ };
10
+ haloColor: number;
11
+ sparkSpeed: number;
12
+ orbit: {
13
+ count: number;
14
+ tube: number;
15
+ arc: number;
16
+ radius: number;
17
+ spacing: number;
18
+ opacity: number;
19
+ rotate: (rotation: THREE.Euler, time: number, index: number) => void;
20
+ };
21
+ };
22
+ /** Shared particle renderer; character animation modules own appearance and choreography. */
23
+ export declare function createMagicEffect(style: MagicEffectStyle): {
24
+ group: THREE.Group<THREE.Object3DEventMap>;
25
+ update: (elapsed: number, progress: number, strength: number) => void;
26
+ dispose: () => void;
27
+ };
@@ -0,0 +1,61 @@
1
+ import * as e from "three";
2
+ //#region src/components/pro/Sprite/shared/magicEffect.ts
3
+ function t(t) {
4
+ let n = new e.Group();
5
+ n.name = t.name;
6
+ let r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), { palette: a, orbit: o } = t, s = (t) => {
7
+ let n = new e.MeshBasicMaterial({
8
+ color: t,
9
+ transparent: !0,
10
+ depthWrite: !1,
11
+ toneMapped: !1,
12
+ side: e.DoubleSide
13
+ });
14
+ return i.add(n), n;
15
+ }, c = (t, i, a) => {
16
+ r.add(t);
17
+ let o = new e.Mesh(t, i);
18
+ return o.name = a, n.add(o), o;
19
+ }, l = new e.Shape();
20
+ for (let e = 0; e < 10; e++) {
21
+ let t = Math.PI / 2 + e * Math.PI / 5, n = e % 2 ? .42 : 1;
22
+ e ? l.lineTo(Math.cos(t) * n, Math.sin(t) * n) : l.moveTo(Math.cos(t) * n, Math.sin(t) * n);
23
+ }
24
+ l.closePath();
25
+ let u = new e.ExtrudeGeometry(l, {
26
+ depth: .16,
27
+ bevelEnabled: !1,
28
+ steps: 1
29
+ });
30
+ u.translate(0, 0, -.08), r.add(u);
31
+ let d = c(t.core.shape === "gem" ? new e.IcosahedronGeometry(1, 1) : u, s(16773577), "magic-core"), f = c(new e.IcosahedronGeometry(1, 1), s(t.haloColor), "magic-halo"), p = Array.from({ length: 24 }, (e, t) => c(u, s(a[t % a.length]), `magic-spark-${t}`)), m = Array.from({ length: o.count }, (t, n) => c(new e.TorusGeometry(1, o.tube, 4, 48, o.arc), s(a[n % a.length]), `magic-orbit-${n}`)), h = !1, g = (r, i, a) => {
32
+ if (h) return;
33
+ n.visible = a > .001;
34
+ let s = n.visible ? r : 0, c = n.visible ? i : 0, l = e.MathUtils.smoothstep(c, .05, .72), u = e.MathUtils.smoothstep(c, .78, 1), g = a * (1 - u);
35
+ d.scale.setScalar(.045 + l * t.core.growth), t.core.rotate(d.rotation, s), d.material.opacity = g, f.scale.setScalar(.1 + l * .19 + Math.sin(s * 3) * .008), f.material.opacity = g * .13;
36
+ for (let e = 0; e < p.length; e++) {
37
+ let n = p[e], r = e * 2.39996 + s * t.sparkSpeed, i = (.58 - l * .35 + u * .55) * (.65 + e % 5 * .09);
38
+ n.position.set(Math.cos(r) * i, Math.sin(r) * i * .7, Math.sin(r * 1.7 + e) * i * .6), n.rotation.set(.2 * Math.sin(r), r * .2, -r * .5), n.scale.setScalar((.018 + e % 4 * .009) * (.8 + l * .5)), n.material.opacity = g * (.5 + .5 * Math.sin(s * 2.5 + e) ** 2);
39
+ }
40
+ for (let e = 0; e < m.length; e++) {
41
+ let t = m[e];
42
+ t.scale.setScalar((o.radius + e * o.spacing) * (1.3 - l * .25 + u)), o.rotate(t.rotation, s, e), t.material.opacity = g * o.opacity;
43
+ }
44
+ };
45
+ return g(0, 0, 0), {
46
+ group: n,
47
+ update: g,
48
+ dispose: () => {
49
+ if (!h) {
50
+ h = !0, n.removeFromParent(), n.clear();
51
+ for (let e of r) e.dispose();
52
+ for (let e of i) e.dispose();
53
+ r.clear(), i.clear();
54
+ }
55
+ }
56
+ };
57
+ }
58
+ //#endregion
59
+ export { t as createMagicEffect };
60
+
61
+ //# sourceMappingURL=magicEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magicEffect.js","names":["THREE","createMagicEffect","group","style","geometries","materials","material","result","mesh","geometry","ink","name","starShape","i","angle","radius","starGeometry","core","halo","sparks","palette","bands","orbit","disposed","update","strength","t","elapsed","phase","progress","charge","release","brightness","spark","band"],"sources":["../../../../../src/components/pro/Sprite/shared/magicEffect.ts"],"sourcesContent":["import * as THREE from 'three';\n\nexport type MagicEffectStyle = {\n name: string;\n palette: readonly number[];\n core: { shape: 'gem' | 'star'; growth: number; rotate: (rotation: THREE.Euler, time: number) => void };\n haloColor: number;\n sparkSpeed: number;\n orbit: {\n count: number; tube: number; arc: number; radius: number; spacing: number; opacity: number;\n rotate: (rotation: THREE.Euler, time: number, index: number) => void;\n };\n};\n\n/** Shared particle renderer; character animation modules own appearance and choreography. */\nexport function createMagicEffect(style: MagicEffectStyle) {\n const group = new THREE.Group();\n group.name = style.name;\n const geometries = new Set<THREE.BufferGeometry>();\n const materials = new Set<THREE.MeshBasicMaterial>();\n const { palette, orbit } = style;\n const material = (color: number) => {\n const result = new THREE.MeshBasicMaterial({ color, transparent: true, depthWrite: false, toneMapped: false, side: THREE.DoubleSide });\n materials.add(result);\n return result;\n };\n const mesh = (geometry: THREE.BufferGeometry, ink: THREE.MeshBasicMaterial, name: string) => {\n geometries.add(geometry);\n const result = new THREE.Mesh(geometry, ink);\n result.name = name;\n group.add(result);\n return result;\n };\n const starShape = new THREE.Shape();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 2 + i * Math.PI / 5;\n const radius = i % 2 ? 0.42 : 1;\n if (i) starShape.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);\n else starShape.moveTo(Math.cos(angle) * radius, Math.sin(angle) * radius);\n }\n starShape.closePath();\n const starGeometry = new THREE.ExtrudeGeometry(starShape, { depth: 0.16, bevelEnabled: false, steps: 1 });\n starGeometry.translate(0, 0, -0.08);\n geometries.add(starGeometry);\n const core = mesh(style.core.shape === 'gem' ? new THREE.IcosahedronGeometry(1, 1) : starGeometry, material(0xfff1c9), 'magic-core');\n const halo = mesh(new THREE.IcosahedronGeometry(1, 1), material(style.haloColor), 'magic-halo');\n const sparks = Array.from({ length: 24 }, (_, i) => mesh(starGeometry, material(palette[i % palette.length]), `magic-spark-${i}`));\n const bands = Array.from({ length: orbit.count }, (_, i) => {\n const ring = mesh(new THREE.TorusGeometry(1, orbit.tube, 4, 48, orbit.arc),\n material(palette[i % palette.length]), `magic-orbit-${i}`);\n return ring;\n });\n let disposed = false;\n const update = (elapsed: number, progress: number, strength: number) => {\n if (disposed) return;\n group.visible = strength > 0.001;\n const t = group.visible ? elapsed : 0;\n const phase = group.visible ? progress : 0;\n const charge = THREE.MathUtils.smoothstep(phase, 0.05, 0.72);\n const release = THREE.MathUtils.smoothstep(phase, 0.78, 1);\n const brightness = strength * (1 - release);\n core.scale.setScalar(0.045 + charge * style.core.growth);\n style.core.rotate(core.rotation, t);\n core.material.opacity = brightness;\n halo.scale.setScalar(0.10 + charge * 0.19 + Math.sin(t * 3) * 0.008);\n halo.material.opacity = brightness * 0.13;\n for (let i = 0; i < sparks.length; i++) {\n const spark = sparks[i];\n const angle = i * 2.39996 + t * style.sparkSpeed;\n const radius = (0.58 - charge * 0.35 + release * 0.55) * (0.65 + (i % 5) * 0.09);\n spark.position.set(Math.cos(angle) * radius, Math.sin(angle) * radius * 0.7,\n Math.sin(angle * 1.7 + i) * radius * 0.6);\n spark.rotation.set(0.2 * Math.sin(angle), angle * 0.2, -angle * 0.5);\n spark.scale.setScalar((0.018 + (i % 4) * 0.009) * (0.8 + charge * 0.5));\n spark.material.opacity = brightness * (0.5 + 0.5 * Math.pow(Math.sin(t * 2.5 + i), 2));\n }\n for (let i = 0; i < bands.length; i++) {\n const band = bands[i];\n band.scale.setScalar((orbit.radius + i * orbit.spacing) * (1.3 - charge * 0.25 + release));\n orbit.rotate(band.rotation, t, i);\n band.material.opacity = brightness * orbit.opacity;\n }\n };\n update(0, 0, 0);\n return { group, update, dispose: () => {\n if (disposed) return;\n disposed = true;\n group.removeFromParent();\n group.clear();\n for (const geometry of geometries) geometry.dispose();\n for (const ink of materials) ink.dispose();\n geometries.clear(); materials.clear();\n } };\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SpriteMood, SpriteScene } from '../types';
2
+ /** Owns playback scheduling only; the host retains ownership of the model and studio. */
3
+ export declare function createSpritePlayback(host: HTMLElement, model: SpriteScene, render: () => void): {
4
+ express: (mood: SpriteMood, duration?: number, sustain?: boolean) => void;
5
+ stop: () => void;
6
+ turn(radians: number): void;
7
+ dispose(): void;
8
+ };