@exegia/corpora-ui 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist-lib/button-CIRkQXA6.js +152 -0
- package/dist-lib/button.js +3 -0
- package/dist-lib/card.js +150 -0
- package/dist-lib/components/atoms/text/default.d.ts +2 -1143
- package/dist-lib/components/blocks/shell/index.d.ts +1 -0
- package/dist-lib/components/ui/badge.d.ts +2 -2
- package/dist-lib/components/ui/button.d.ts +2 -2
- package/dist-lib/components/ui/glasscn/lazy-glass-surface.d.ts +6 -0
- package/dist-lib/components/ui/modal.d.ts +10 -0
- package/dist-lib/components/ui/overlays.d.ts +4 -0
- package/dist-lib/components/ui/select.d.ts +1 -1
- package/dist-lib/components/ui/toast.d.ts +2 -0
- package/dist-lib/ease-C9At8rnB.js +120 -0
- package/dist-lib/exegia-provider-DNTuLljX.js +124 -0
- package/dist-lib/index.css +3 -0
- package/dist-lib/index.d.ts +3 -0
- package/dist-lib/index.js +6482 -8894
- package/dist-lib/input.js +28 -0
- package/dist-lib/label.js +19 -0
- package/dist-lib/lib/segmented-control.d.ts +1 -1
- package/dist-lib/lib/state/exegia-provider.d.ts +17 -8
- package/dist-lib/lib/state/index.d.ts +2 -0
- package/dist-lib/lib/state/portal-context.d.ts +5 -0
- package/dist-lib/lib/state/sound-loading.d.ts +4 -0
- package/dist-lib/liquid-glass-BihU6nMl.js +50 -0
- package/dist-lib/modal-DLaOK-s1.js +82 -0
- package/dist-lib/overlays.js +3 -0
- package/dist-lib/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/dist-lib/scaffold-Qv4hs5Pf.js +925 -0
- package/dist-lib/scaffold.js +2 -0
- package/dist-lib/shell-BQ9cjIEu.js +722 -0
- package/dist-lib/shell.js +2 -0
- package/dist-lib/sound-knGH4lj-.js +19 -0
- package/dist-lib/state.js +2 -0
- package/dist-lib/toast-CataVXHN.js +193 -0
- package/dist-lib/utils-BO0qfoA6.js +61 -0
- package/package.json +64 -23
- package/dist-lib/components/atoms/_layout.d.ts +0 -4
- package/dist-lib/components/atoms/bubble/__tests__/bubble.test.d.ts +0 -1
- package/dist-lib/components/atoms/bubble/__tests__/reference.test.d.ts +0 -1
- package/dist-lib/components/atoms/text/__tests__/text.test.d.ts +0 -1
- package/dist-lib/components/atoms/text-selection/__tests__/click-popover.test.d.ts +0 -1
- package/dist-lib/components/atoms/text-selection/__tests__/text-selection.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/auth-flow-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/auth-state-atom.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/linked-accounts-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/onboarding-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/passkey-manager-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/signup-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/auth/__tests__/update-password-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/chat/__tests__/ai-panel.test.d.ts +0 -1
- package/dist-lib/components/blocks/profile/__tests__/profile-card-block.test.d.ts +0 -1
- package/dist-lib/components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts +0 -1
- package/dist-lib/components/blocks/scaffold/__tests__/scaffold.test.d.ts +0 -1
- package/dist-lib/components/blocks/shell/__tests__/shell-fit-atom.test.d.ts +0 -1
- package/dist-lib/components/blocks/shell/__tests__/shell-layout.test.d.ts +0 -1
- package/dist-lib/components/blocks/shell/__tests__/shell-metrics.test.d.ts +0 -1
- package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.d.ts +0 -1
- package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar.test.d.ts +0 -1
- package/dist-lib/components/blocks/sidebar/__tests__/use-ai-sidebar.test.d.ts +0 -1
- package/dist-lib/components/composed/__tests__/logo.test.d.ts +0 -1
- package/dist-lib/components/composed/action-bar/__tests__/action-bar.test.d.ts +0 -1
- package/dist-lib/components/composed/ai/__tests__/ai.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/attachment.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/beautiful-ui.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/chart.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/code-block.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/composer-attachments.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/composer.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/flowchart.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/glass-material.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/markdown.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/menu-command.test.d.ts +0 -1
- package/dist-lib/components/composed/chat/__tests__/recommendation.test.d.ts +0 -1
- package/dist-lib/components/composed/tree/__tests__/tree-atom.test.d.ts +0 -1
- package/dist-lib/components/composed/tree/__tests__/tree.test.d.ts +0 -1
- package/dist-lib/components/composed/tree/__tests__/use-tree.test.d.ts +0 -1
- package/dist-lib/components/composed/user/__tests__/message.test.d.ts +0 -1
- package/dist-lib/components/composed/verse/__tests__/verse.test.d.ts +0 -1
- package/dist-lib/components/docs/atoms-gallery.d.ts +0 -12
- package/dist-lib/components/docs/block-demo-stage.d.ts +0 -7
- package/dist-lib/components/docs/blocks-gallery.d.ts +0 -2
- package/dist-lib/components/docs/browser.d.ts +0 -10
- package/dist-lib/components/docs/code-block.d.ts +0 -4
- package/dist-lib/components/docs/components-gallery.d.ts +0 -2
- package/dist-lib/components/docs/demo-controls.d.ts +0 -21
- package/dist-lib/components/docs/hero.d.ts +0 -5
- package/dist-lib/components/docs/mermaid.d.ts +0 -3
- package/dist-lib/components/icons/__tests__/icons.test.d.ts +0 -1
- package/dist-lib/components/stories/attachment.story.d.ts +0 -11
- package/dist-lib/components/stories/auth-flow-block.story.d.ts +0 -2
- package/dist-lib/components/stories/avatar.story.d.ts +0 -6
- package/dist-lib/components/stories/base.story.d.ts +0 -6
- package/dist-lib/components/stories/bubble.story.d.ts +0 -6
- package/dist-lib/components/stories/button.story.d.ts +0 -9
- package/dist-lib/components/stories/card.story.d.ts +0 -8
- package/dist-lib/components/stories/chart.story.d.ts +0 -71
- package/dist-lib/components/stories/checkbox.story.d.ts +0 -6
- package/dist-lib/components/stories/code-auth-block.story.d.ts +0 -2
- package/dist-lib/components/stories/code-block.story.d.ts +0 -12
- package/dist-lib/components/stories/composed-password-input.story.d.ts +0 -6
- package/dist-lib/components/stories/context-cards.story.d.ts +0 -3
- package/dist-lib/components/stories/emoji-action-bar.story.d.ts +0 -3
- package/dist-lib/components/stories/field.story.d.ts +0 -6
- package/dist-lib/components/stories/file-icons.story.d.ts +0 -5
- package/dist-lib/components/stories/filter-table.story.d.ts +0 -21
- package/dist-lib/components/stories/flowchart.story.d.ts +0 -3
- package/dist-lib/components/stories/forgot-password-block.story.d.ts +0 -2
- package/dist-lib/components/stories/frame.story.d.ts +0 -8
- package/dist-lib/components/stories/index.d.ts +0 -54
- package/dist-lib/components/stories/input-group.story.d.ts +0 -6
- package/dist-lib/components/stories/input.story.d.ts +0 -8
- package/dist-lib/components/stories/insight-cards.story.d.ts +0 -74
- package/dist-lib/components/stories/label.story.d.ts +0 -8
- package/dist-lib/components/stories/linked-accounts-block.story.d.ts +0 -2
- package/dist-lib/components/stories/login-block.story.d.ts +0 -2
- package/dist-lib/components/stories/logo.story.d.ts +0 -3
- package/dist-lib/components/stories/markdown.story.d.ts +0 -7
- package/dist-lib/components/stories/menu-command.story.d.ts +0 -13
- package/dist-lib/components/stories/onboarding-block.story.d.ts +0 -2
- package/dist-lib/components/stories/otp-field.story.d.ts +0 -8
- package/dist-lib/components/stories/passkey-manager-block.story.d.ts +0 -2
- package/dist-lib/components/stories/passkey-sign-in-block.story.d.ts +0 -2
- package/dist-lib/components/stories/password-input.story.d.ts +0 -9
- package/dist-lib/components/stories/profile-card-block.story.d.ts +0 -6
- package/dist-lib/components/stories/recommendation-card.story.d.ts +0 -3
- package/dist-lib/components/stories/records-table.story.d.ts +0 -23
- package/dist-lib/components/stories/reference.story.d.ts +0 -9
- package/dist-lib/components/stories/research-answer.story.d.ts +0 -10
- package/dist-lib/components/stories/scaffold-root.story.d.ts +0 -6
- package/dist-lib/components/stories/separator.story.d.ts +0 -6
- package/dist-lib/components/stories/shell-layout.story.d.ts +0 -2
- package/dist-lib/components/stories/signup-block.story.d.ts +0 -2
- package/dist-lib/components/stories/social-providers.story.d.ts +0 -3
- package/dist-lib/components/stories/streaming-text.story.d.ts +0 -3
- package/dist-lib/components/stories/text.story.d.ts +0 -8
- package/dist-lib/components/stories/textarea.story.d.ts +0 -6
- package/dist-lib/components/stories/tree.story.d.ts +0 -4
- package/dist-lib/components/stories/update-password-block.story.d.ts +0 -2
- package/dist-lib/components/stories/user.story.d.ts +0 -8
- package/dist-lib/components/stories/verse.story.d.ts +0 -6
- package/dist-lib/components/ui/chat/__tests__/segmented-toggle.test.d.ts +0 -1
- package/dist-lib/index.js.map +0 -1
- package/dist-lib/lib/state/__tests__/sound.test.d.ts +0 -1
- package/dist-lib/lib/utils.test.d.ts +0 -1
- package/src/assets/css/base.css +0 -62
- package/src/assets/css/chat.css +0 -229
- package/src/assets/css/shadows.css +0 -157
- package/src/assets/css/theme.css +0 -321
- package/src/components/AGENTS.md +0 -0
- package/src/components/atoms/_layout.tsx +0 -9
- package/src/components/atoms/avatar/base.tsx +0 -70
- package/src/components/atoms/avatar/index.ts +0 -10
- package/src/components/atoms/avatar/types.ts +0 -24
- package/src/components/atoms/avatar/utils.ts +0 -54
- package/src/components/atoms/avatar/verified.tsx +0 -16
- package/src/components/atoms/background/index.ts +0 -8
- package/src/components/atoms/background/texture.tsx +0 -29
- package/src/components/atoms/background/type.ts +0 -10
- package/src/components/atoms/background/utils.ts +0 -13
- package/src/components/atoms/bubble/__tests__/bubble.test.tsx +0 -193
- package/src/components/atoms/bubble/__tests__/reference.test.tsx +0 -25
- package/src/components/atoms/bubble/actions.tsx +0 -28
- package/src/components/atoms/bubble/context.ts +0 -11
- package/src/components/atoms/bubble/default.tsx +0 -46
- package/src/components/atoms/bubble/header.tsx +0 -36
- package/src/components/atoms/bubble/index.ts +0 -37
- package/src/components/atoms/bubble/message.tsx +0 -32
- package/src/components/atoms/bubble/reactions.tsx +0 -191
- package/src/components/atoms/bubble/types.ts +0 -82
- package/src/components/atoms/bubble/utils.ts +0 -46
- package/src/components/atoms/chip.tsx +0 -61
- package/src/components/atoms/field.tsx +0 -43
- package/src/components/atoms/index.ts +0 -26
- package/src/components/atoms/loader.tsx +0 -33
- package/src/components/atoms/reference.tsx +0 -41
- package/src/components/atoms/text/__tests__/text.test.tsx +0 -47
- package/src/components/atoms/text/default.tsx +0 -59
- package/src/components/atoms/text/heading.tsx +0 -58
- package/src/components/atoms/text/index.ts +0 -28
- package/src/components/atoms/text/label.tsx +0 -16
- package/src/components/atoms/text/paragraph.tsx +0 -55
- package/src/components/atoms/text/span.tsx +0 -14
- package/src/components/atoms/text/types.ts +0 -41
- package/src/components/atoms/text/utils.ts +0 -16
- package/src/components/atoms/text-selection/__tests__/click-popover.test.tsx +0 -61
- package/src/components/atoms/text-selection/__tests__/text-selection.test.tsx +0 -90
- package/src/components/atoms/text-selection/click-popover.tsx +0 -62
- package/src/components/atoms/text-selection/index.ts +0 -30
- package/src/components/atoms/text-selection/popover.tsx +0 -103
- package/src/components/atoms/text-selection/selection-atom.ts +0 -51
- package/src/components/atoms/text-selection/selection.tsx +0 -56
- package/src/components/atoms/text-selection/types.ts +0 -125
- package/src/components/atoms/text-selection/use-selection.ts +0 -84
- package/src/components/atoms/types.ts +0 -46
- package/src/components/blocks/.gitkeep +0 -0
- package/src/components/blocks/auth/__tests__/auth-flow-block.test.tsx +0 -183
- package/src/components/blocks/auth/__tests__/auth-state-atom.test.tsx +0 -247
- package/src/components/blocks/auth/__tests__/linked-accounts-block.test.tsx +0 -128
- package/src/components/blocks/auth/__tests__/onboarding-block.test.tsx +0 -183
- package/src/components/blocks/auth/__tests__/passkey-manager-block.test.tsx +0 -131
- package/src/components/blocks/auth/__tests__/passkey-sign-in-block.test.tsx +0 -59
- package/src/components/blocks/auth/__tests__/signup-block.test.tsx +0 -176
- package/src/components/blocks/auth/__tests__/update-password-block.test.tsx +0 -95
- package/src/components/blocks/auth/auth-flow-atom.ts +0 -238
- package/src/components/blocks/auth/auth-flow-block.tsx +0 -211
- package/src/components/blocks/auth/auth-session-atom.ts +0 -82
- package/src/components/blocks/auth/auth-shell.tsx +0 -265
- package/src/components/blocks/auth/auth-state.ts +0 -40
- package/src/components/blocks/auth/code-auth-block.tsx +0 -176
- package/src/components/blocks/auth/forgot-password-block.tsx +0 -112
- package/src/components/blocks/auth/linked-accounts-block.tsx +0 -203
- package/src/components/blocks/auth/login-block.tsx +0 -217
- package/src/components/blocks/auth/onboarding/profile-step.tsx +0 -216
- package/src/components/blocks/auth/onboarding-block.tsx +0 -183
- package/src/components/blocks/auth/passkey-manager-block.tsx +0 -316
- package/src/components/blocks/auth/passkey-sign-in-block.tsx +0 -67
- package/src/components/blocks/auth/signup-block.tsx +0 -256
- package/src/components/blocks/auth/type.ts +0 -436
- package/src/components/blocks/auth/update-password-block.tsx +0 -139
- package/src/components/blocks/auth/use-auth-state.ts +0 -127
- package/src/components/blocks/chat/__tests__/ai-panel.test.tsx +0 -65
- package/src/components/blocks/chat/banners.tsx +0 -61
- package/src/components/blocks/chat/base.tsx +0 -84
- package/src/components/blocks/chat/header.tsx +0 -60
- package/src/components/blocks/chat/index.ts +0 -37
- package/src/components/blocks/chat/recommendation-stack.tsx +0 -41
- package/src/components/blocks/chat/shared.tsx +0 -27
- package/src/components/blocks/chat/suggested-prompts.tsx +0 -45
- package/src/components/blocks/chat/type.ts +0 -96
- package/src/components/blocks/chat/version-history-record.tsx +0 -37
- package/src/components/blocks/layout.ts +0 -35
- package/src/components/blocks/profile/__tests__/profile-card-block.test.tsx +0 -362
- package/src/components/blocks/profile/index.ts +0 -28
- package/src/components/blocks/profile/profile-card-atom.ts +0 -247
- package/src/components/blocks/profile/profile-card-block.tsx +0 -369
- package/src/components/blocks/profile/type.ts +0 -93
- package/src/components/blocks/profile/use-profile-card-state.ts +0 -67
- package/src/components/blocks/profile/use-profile-card.ts +0 -132
- package/src/components/blocks/scaffold/__tests__/scaffold-atom.test.tsx +0 -236
- package/src/components/blocks/scaffold/__tests__/scaffold.test.tsx +0 -524
- package/src/components/blocks/scaffold/constants.ts +0 -39
- package/src/components/blocks/scaffold/index.ts +0 -60
- package/src/components/blocks/scaffold/panel-close-button.tsx +0 -36
- package/src/components/blocks/scaffold/panel-menu-button.tsx +0 -221
- package/src/components/blocks/scaffold/scaffold-actions.tsx +0 -92
- package/src/components/blocks/scaffold/scaffold-atom.ts +0 -427
- package/src/components/blocks/scaffold/scaffold-canvas.tsx +0 -162
- package/src/components/blocks/scaffold/scaffold-context.ts +0 -20
- package/src/components/blocks/scaffold/scaffold-inspector.tsx +0 -137
- package/src/components/blocks/scaffold/scaffold-main.tsx +0 -28
- package/src/components/blocks/scaffold/scaffold-panel.tsx +0 -186
- package/src/components/blocks/scaffold/scaffold-root.tsx +0 -120
- package/src/components/blocks/scaffold/scaffold-sidebar.tsx +0 -31
- package/src/components/blocks/scaffold/scaffold-sub-panel.tsx +0 -122
- package/src/components/blocks/scaffold/scaffold-tab.tsx +0 -108
- package/src/components/blocks/scaffold/type.ts +0 -264
- package/src/components/blocks/scaffold/use-scaffold-state.ts +0 -85
- package/src/components/blocks/scaffold/use-scaffold.ts +0 -59
- package/src/components/blocks/scaffold/utils.ts +0 -112
- package/src/components/blocks/shell/__tests__/shell-fit-atom.test.tsx +0 -362
- package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +0 -596
- package/src/components/blocks/shell/__tests__/shell-metrics.test.ts +0 -154
- package/src/components/blocks/shell/animated-panel-inset.tsx +0 -27
- package/src/components/blocks/shell/animated-panel-provider.tsx +0 -269
- package/src/components/blocks/shell/animated-panel-trigger.tsx +0 -51
- package/src/components/blocks/shell/animated-panel.tsx +0 -180
- package/src/components/blocks/shell/index.ts +0 -30
- package/src/components/blocks/shell/shell-fit-atom.ts +0 -246
- package/src/components/blocks/shell/shell-layout.tsx +0 -139
- package/src/components/blocks/shell/shell-metrics.ts +0 -133
- package/src/components/blocks/shell/shell-panel-atom.ts +0 -74
- package/src/components/blocks/shell/type.ts +0 -361
- package/src/components/blocks/shell/use-shell-fit-state.ts +0 -49
- package/src/components/blocks/shell/use-shell-fit.ts +0 -153
- package/src/components/blocks/shell/use-shell-panels.ts +0 -126
- package/src/components/blocks/shell/utils.ts +0 -187
- package/src/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.tsx +0 -325
- package/src/components/blocks/sidebar/__tests__/ai-sidebar.test.tsx +0 -93
- package/src/components/blocks/sidebar/__tests__/use-ai-sidebar.test.tsx +0 -310
- package/src/components/blocks/sidebar/ai-sidebar-atom.ts +0 -698
- package/src/components/blocks/sidebar/ai-sidebar.tsx +0 -150
- package/src/components/blocks/sidebar/index.ts +0 -67
- package/src/components/blocks/sidebar/marquee-label.tsx +0 -59
- package/src/components/blocks/sidebar/sidebar-context.ts +0 -15
- package/src/components/blocks/sidebar/sidebar-icon.tsx +0 -14
- package/src/components/blocks/sidebar/sidebar-row.tsx +0 -378
- package/src/components/blocks/sidebar/type.ts +0 -294
- package/src/components/blocks/sidebar/use-ai-sidebar-state.ts +0 -123
- package/src/components/blocks/sidebar/use-ai-sidebar.ts +0 -619
- package/src/components/blocks/sidebar/utils.ts +0 -170
- package/src/components/blocks/types.ts +0 -6
- package/src/components/composed/.gitkeep +0 -0
- package/src/components/composed/__tests__/logo.test.tsx +0 -60
- package/src/components/composed/action-bar/__tests__/action-bar.test.tsx +0 -125
- package/src/components/composed/action-bar/action.tsx +0 -77
- package/src/components/composed/action-bar/emojis.tsx +0 -97
- package/src/components/composed/action-bar/index.ts +0 -24
- package/src/components/composed/action-bar/toolbar.tsx +0 -66
- package/src/components/composed/action-bar/types.ts +0 -58
- package/src/components/composed/action-bar/utils.ts +0 -140
- package/src/components/composed/ai/__tests__/ai.test.tsx +0 -66
- package/src/components/composed/ai/avatar.tsx +0 -19
- package/src/components/composed/ai/index.ts +0 -36
- package/src/components/composed/ai/message.tsx +0 -49
- package/src/components/composed/ai/research-answer.tsx +0 -157
- package/src/components/composed/ai/shared.tsx +0 -94
- package/src/components/composed/ai/streaming-text.tsx +0 -94
- package/src/components/composed/ai/suggested-prompt.tsx +0 -183
- package/src/components/composed/ai/types.ts +0 -81
- package/src/components/composed/chat/__tests__/attachment.test.tsx +0 -218
- package/src/components/composed/chat/__tests__/beautiful-ui.test.tsx +0 -57
- package/src/components/composed/chat/__tests__/chart.test.tsx +0 -316
- package/src/components/composed/chat/__tests__/code-block.test.tsx +0 -12
- package/src/components/composed/chat/__tests__/composer-attachments.test.tsx +0 -101
- package/src/components/composed/chat/__tests__/composer.test.tsx +0 -248
- package/src/components/composed/chat/__tests__/flowchart.test.tsx +0 -145
- package/src/components/composed/chat/__tests__/glass-material.test.tsx +0 -54
- package/src/components/composed/chat/__tests__/markdown.test.tsx +0 -25
- package/src/components/composed/chat/__tests__/menu-command.test.tsx +0 -35
- package/src/components/composed/chat/__tests__/recommendation.test.tsx +0 -43
- package/src/components/composed/chat/actions.tsx +0 -81
- package/src/components/composed/chat/attachment-file.ts +0 -82
- package/src/components/composed/chat/attachment.tsx +0 -498
- package/src/components/composed/chat/chart/chart-atom.ts +0 -55
- package/src/components/composed/chat/chart/chart-context.ts +0 -9
- package/src/components/composed/chat/chart/chart-legend.tsx +0 -75
- package/src/components/composed/chat/chart/chart-plot.tsx +0 -233
- package/src/components/composed/chat/chart/chart-root.tsx +0 -229
- package/src/components/composed/chat/chart/chart-tooltip.tsx +0 -74
- package/src/components/composed/chat/chart/constants.ts +0 -8
- package/src/components/composed/chat/chart/evilcharts/README.md +0 -8
- package/src/components/composed/chat/chart/evilcharts/echarts-area-chart.tsx +0 -2358
- package/src/components/composed/chat/chart/evilcharts/echarts-bar-chart.tsx +0 -2261
- package/src/components/composed/chat/chart/evilcharts/echarts-brush.tsx +0 -233
- package/src/components/composed/chat/chart/evilcharts/echarts-chart.tsx +0 -214
- package/src/components/composed/chat/chart/evilcharts/echarts-dot.tsx +0 -111
- package/src/components/composed/chat/chart/evilcharts/echarts-legend.tsx +0 -131
- package/src/components/composed/chat/chart/evilcharts/echarts-line-chart.tsx +0 -2112
- package/src/components/composed/chat/chart/evilcharts/echarts-pie-chart.tsx +0 -1235
- package/src/components/composed/chat/chart/evilcharts/echarts-tooltip.tsx +0 -125
- package/src/components/composed/chat/chart/index.ts +0 -13
- package/src/components/composed/chat/chart/type.ts +0 -88
- package/src/components/composed/chat/chart/use-chart-state.ts +0 -22
- package/src/components/composed/chat/chart/use-chart.ts +0 -70
- package/src/components/composed/chat/chart/utils.ts +0 -47
- package/src/components/composed/chat/chart.tsx +0 -3
- package/src/components/composed/chat/code-block.tsx +0 -123
- package/src/components/composed/chat/composer/add-button.tsx +0 -29
- package/src/components/composed/chat/composer/base.tsx +0 -573
- package/src/components/composed/chat/composer/command-menu.tsx +0 -47
- package/src/components/composed/chat/composer/hooks.ts +0 -29
- package/src/components/composed/chat/composer/index.ts +0 -19
- package/src/components/composed/chat/composer/send-button.tsx +0 -36
- package/src/components/composed/chat/composer/suggestions.tsx +0 -115
- package/src/components/composed/chat/composer/use-dictation.ts +0 -123
- package/src/components/composed/chat/composer/utils.ts +0 -74
- package/src/components/composed/chat/context-cards.tsx +0 -63
- package/src/components/composed/chat/filter-table.tsx +0 -119
- package/src/components/composed/chat/flowchart/chart-node.tsx +0 -162
- package/src/components/composed/chat/flowchart/connector.tsx +0 -32
- package/src/components/composed/chat/flowchart/constant.ts +0 -26
- package/src/components/composed/chat/flowchart/default.tsx +0 -230
- package/src/components/composed/chat/flowchart/edge-toolbar.tsx +0 -73
- package/src/components/composed/chat/flowchart/hooks.tsx +0 -347
- package/src/components/composed/chat/flowchart/index.ts +0 -14
- package/src/components/composed/chat/flowchart/step-body.tsx +0 -82
- package/src/components/composed/chat/flowchart/types.ts +0 -89
- package/src/components/composed/chat/flowchart/utils.ts +0 -78
- package/src/components/composed/chat/hint.tsx +0 -59
- package/src/components/composed/chat/index.ts +0 -92
- package/src/components/composed/chat/insight-cards.tsx +0 -199
- package/src/components/composed/chat/markdown-atom.ts +0 -15
- package/src/components/composed/chat/markdown.tsx +0 -213
- package/src/components/composed/chat/recommendation/checkbox.tsx +0 -122
- package/src/components/composed/chat/recommendation/constant.ts +0 -54
- package/src/components/composed/chat/recommendation/default.tsx +0 -25
- package/src/components/composed/chat/recommendation/group.tsx +0 -36
- package/src/components/composed/chat/recommendation/index.ts +0 -17
- package/src/components/composed/chat/recommendation/item.tsx +0 -215
- package/src/components/composed/chat/recommendation/types.ts +0 -76
- package/src/components/composed/chat/records-table.tsx +0 -130
- package/src/components/composed/chat/type.ts +0 -157
- package/src/components/composed/logo.tsx +0 -171
- package/src/components/composed/password-input.tsx +0 -179
- package/src/components/composed/reader/applied-mark.tsx +0 -32
- package/src/components/composed/reader/apply-toast.tsx +0 -49
- package/src/components/composed/reader/index.ts +0 -10
- package/src/components/composed/reader/selection-highlight.tsx +0 -26
- package/src/components/composed/reader/selection-popover.tsx +0 -149
- package/src/components/composed/reader/type.ts +0 -48
- package/src/components/composed/social-providers.tsx +0 -154
- package/src/components/composed/tree/CLAUDE.md +0 -145
- package/src/components/composed/tree/__tests__/tree-atom.test.tsx +0 -217
- package/src/components/composed/tree/__tests__/tree.test.tsx +0 -522
- package/src/components/composed/tree/__tests__/use-tree.test.tsx +0 -333
- package/src/components/composed/tree/constants.ts +0 -55
- package/src/components/composed/tree/index.ts +0 -51
- package/src/components/composed/tree/tree-atom.ts +0 -590
- package/src/components/composed/tree/tree-context.ts +0 -13
- package/src/components/composed/tree/tree-node.tsx +0 -496
- package/src/components/composed/tree/tree.tsx +0 -233
- package/src/components/composed/tree/type.ts +0 -322
- package/src/components/composed/tree/use-tree-dnd.ts +0 -179
- package/src/components/composed/tree/use-tree-state.ts +0 -105
- package/src/components/composed/tree/use-tree.ts +0 -311
- package/src/components/composed/tree/utils.ts +0 -172
- package/src/components/composed/types.ts +0 -9
- package/src/components/composed/user/__tests__/message.test.tsx +0 -79
- package/src/components/composed/user/index.ts +0 -14
- package/src/components/composed/user/info.tsx +0 -56
- package/src/components/composed/user/message.tsx +0 -36
- package/src/components/composed/user/pill.tsx +0 -20
- package/src/components/composed/user/types.ts +0 -47
- package/src/components/composed/user/utils.ts +0 -0
- package/src/components/composed/verse/__tests__/verse.test.tsx +0 -57
- package/src/components/composed/verse/index.ts +0 -2
- package/src/components/composed/verse/types.ts +0 -24
- package/src/components/composed/verse/verse.tsx +0 -100
- package/src/components/docs/atoms-gallery.tsx +0 -286
- package/src/components/docs/block-demo-stage.tsx +0 -38
- package/src/components/docs/blocks-gallery.tsx +0 -224
- package/src/components/docs/browser.tsx +0 -87
- package/src/components/docs/code-block.tsx +0 -10
- package/src/components/docs/components-gallery.tsx +0 -182
- package/src/components/docs/demo-controls.tsx +0 -142
- package/src/components/docs/hero.tsx +0 -197
- package/src/components/docs/mermaid.tsx +0 -55
- package/src/components/icons/README.md +0 -91
- package/src/components/icons/__tests__/icons.test.tsx +0 -58
- package/src/components/icons/file-badge-cfm.tsx +0 -615
- package/src/components/icons/file-badge-corpus.tsx +0 -604
- package/src/components/icons/file-badge-pdf.tsx +0 -570
- package/src/components/icons/file-badge-tei.tsx +0 -524
- package/src/components/icons/file-badge-tf.tsx +0 -620
- package/src/components/icons/file-badge-txt.tsx +0 -607
- package/src/components/icons/file-badge-xml.tsx +0 -576
- package/src/components/icons/file-wordmark-cfm.tsx +0 -424
- package/src/components/icons/file-wordmark-corpus.tsx +0 -454
- package/src/components/icons/file-wordmark-pdf.tsx +0 -470
- package/src/components/icons/file-wordmark-tei.tsx +0 -424
- package/src/components/icons/file-wordmark-tf.tsx +0 -406
- package/src/components/icons/file-wordmark-txt.tsx +0 -421
- package/src/components/icons/file-wordmark-xml.tsx +0 -424
- package/src/components/icons/index.ts +0 -16
- package/src/components/icons/types.ts +0 -8
- package/src/components/motion/index.ts +0 -0
- package/src/components/motion/overflow-actions.tsx +0 -376
- package/src/components/motion/popover-morph.tsx +0 -292
- package/src/components/motion/popover-position.ts +0 -86
- package/src/components/motion/shared-layout-bg.tsx +0 -151
- package/src/components/stories/attachment.story.tsx +0 -40
- package/src/components/stories/auth-flow-block.story.tsx +0 -17
- package/src/components/stories/avatar.story.tsx +0 -33
- package/src/components/stories/base.story.tsx +0 -70
- package/src/components/stories/bubble.story.tsx +0 -61
- package/src/components/stories/button.story.tsx +0 -32
- package/src/components/stories/card.story.tsx +0 -36
- package/src/components/stories/chart.story.tsx +0 -69
- package/src/components/stories/checkbox.story.tsx +0 -30
- package/src/components/stories/code-auth-block.story.tsx +0 -20
- package/src/components/stories/code-block.story.tsx +0 -35
- package/src/components/stories/composed-password-input.story.tsx +0 -41
- package/src/components/stories/context-cards.story.tsx +0 -30
- package/src/components/stories/emoji-action-bar.story.tsx +0 -20
- package/src/components/stories/field.story.tsx +0 -32
- package/src/components/stories/file-icons.story.tsx +0 -20
- package/src/components/stories/filter-table.story.tsx +0 -63
- package/src/components/stories/flowchart.story.tsx +0 -25
- package/src/components/stories/forgot-password-block.story.tsx +0 -14
- package/src/components/stories/frame.story.tsx +0 -32
- package/src/components/stories/index.ts +0 -57
- package/src/components/stories/input-group.story.tsx +0 -27
- package/src/components/stories/input.story.tsx +0 -42
- package/src/components/stories/insight-cards.story.tsx +0 -67
- package/src/components/stories/label.story.tsx +0 -32
- package/src/components/stories/linked-accounts-block.story.tsx +0 -23
- package/src/components/stories/login-block.story.tsx +0 -18
- package/src/components/stories/logo.story.tsx +0 -21
- package/src/components/stories/markdown.story.tsx +0 -31
- package/src/components/stories/menu-command.story.tsx +0 -43
- package/src/components/stories/onboarding-block.story.tsx +0 -14
- package/src/components/stories/otp-field.story.tsx +0 -35
- package/src/components/stories/passkey-manager-block.story.tsx +0 -18
- package/src/components/stories/passkey-sign-in-block.story.tsx +0 -15
- package/src/components/stories/password-input.story.tsx +0 -35
- package/src/components/stories/profile-card-block.story.tsx +0 -29
- package/src/components/stories/recommendation-card.story.tsx +0 -37
- package/src/components/stories/records-table.story.tsx +0 -52
- package/src/components/stories/reference.story.tsx +0 -33
- package/src/components/stories/research-answer.story.tsx +0 -32
- package/src/components/stories/scaffold-root.story.tsx +0 -47
- package/src/components/stories/separator.story.tsx +0 -37
- package/src/components/stories/shell-layout.story.tsx +0 -19
- package/src/components/stories/signup-block.story.tsx +0 -18
- package/src/components/stories/social-providers.story.tsx +0 -26
- package/src/components/stories/streaming-text.story.tsx +0 -25
- package/src/components/stories/text.story.tsx +0 -31
- package/src/components/stories/textarea.story.tsx +0 -34
- package/src/components/stories/tree.story.tsx +0 -31
- package/src/components/stories/update-password-block.story.tsx +0 -14
- package/src/components/stories/user.story.tsx +0 -32
- package/src/components/stories/verse.story.tsx +0 -42
- package/src/components/theme-provider.tsx +0 -230
- package/src/components/types.ts +0 -106
- package/src/components/ui/accordion.tsx +0 -68
- package/src/components/ui/alert-dialog.tsx +0 -167
- package/src/components/ui/alert.tsx +0 -84
- package/src/components/ui/autocomplete.tsx +0 -303
- package/src/components/ui/avatar.tsx +0 -109
- package/src/components/ui/badge.tsx +0 -101
- package/src/components/ui/button-group.tsx +0 -88
- package/src/components/ui/button.tsx +0 -192
- package/src/components/ui/card.tsx +0 -253
- package/src/components/ui/chat/__tests__/segmented-toggle.test.tsx +0 -27
- package/src/components/ui/chat/avatar-handle.tsx +0 -30
- package/src/components/ui/chat/badges.tsx +0 -85
- package/src/components/ui/chat/buttons.tsx +0 -94
- package/src/components/ui/chat/chips.tsx +0 -106
- package/src/components/ui/chat/dot.tsx +0 -81
- package/src/components/ui/chat/icon-button.tsx +0 -43
- package/src/components/ui/chat/icon-tile.tsx +0 -33
- package/src/components/ui/chat/index.ts +0 -12
- package/src/components/ui/chat/inline-source.tsx +0 -94
- package/src/components/ui/chat/segmented-toggle.tsx +0 -99
- package/src/components/ui/chat/tag.tsx +0 -61
- package/src/components/ui/chat/thumbnail.tsx +0 -31
- package/src/components/ui/chat/waveform.tsx +0 -30
- package/src/components/ui/checkbox.tsx +0 -83
- package/src/components/ui/collapsible.tsx +0 -42
- package/src/components/ui/command.tsx +0 -263
- package/src/components/ui/context-menu.tsx +0 -342
- package/src/components/ui/emoji-picker.tsx +0 -161
- package/src/components/ui/field.tsx +0 -89
- package/src/components/ui/frame.tsx +0 -87
- package/src/components/ui/glasscn/glass-button-group.tsx +0 -34
- package/src/components/ui/glasscn/glass-button.tsx +0 -25
- package/src/components/ui/glasscn/glass-container.tsx +0 -94
- package/src/components/ui/glasscn/glass-separator.tsx +0 -39
- package/src/components/ui/glasscn/liquid-glass.tsx +0 -59
- package/src/components/ui/group.tsx +0 -92
- package/src/components/ui/input-group.tsx +0 -105
- package/src/components/ui/input.tsx +0 -70
- package/src/components/ui/kbd.tsx +0 -32
- package/src/components/ui/label.tsx +0 -36
- package/src/components/ui/menu-command.tsx +0 -156
- package/src/components/ui/menu.tsx +0 -352
- package/src/components/ui/otp-field.tsx +0 -88
- package/src/components/ui/popover-glass.tsx +0 -158
- package/src/components/ui/popover.tsx +0 -120
- package/src/components/ui/preview-card.tsx +0 -61
- package/src/components/ui/scroll-area.tsx +0 -80
- package/src/components/ui/select.tsx +0 -257
- package/src/components/ui/separator.tsx +0 -23
- package/src/components/ui/sheet.tsx +0 -135
- package/src/components/ui/skeleton.tsx +0 -18
- package/src/components/ui/spinner.tsx +0 -17
- package/src/components/ui/switch.tsx +0 -30
- package/src/components/ui/tabs.tsx +0 -120
- package/src/components/ui/textarea.tsx +0 -58
- package/src/components/ui/toast.tsx +0 -325
- package/src/components/ui/toolbar.tsx +0 -92
- package/src/components/ui/tooltip.tsx +0 -67
- package/src/index.css +0 -10
- package/src/index.ts +0 -102
- package/src/lib/attachment-content.ts +0 -28
- package/src/lib/auth-accent.ts +0 -49
- package/src/lib/ease.ts +0 -90
- package/src/lib/glass-variants.ts +0 -22
- package/src/lib/hooks/use-hover-capable.ts +0 -23
- package/src/lib/hooks/use-mobile.ts +0 -21
- package/src/lib/keyed-atom.ts +0 -60
- package/src/lib/segmented-control.ts +0 -42
- package/src/lib/sound.ts +0 -39
- package/src/lib/specular.ts +0 -10
- package/src/lib/state/__tests__/sound.test.tsx +0 -53
- package/src/lib/state/exegia-provider.tsx +0 -83
- package/src/lib/state/index.ts +0 -4
- package/src/lib/state/store.ts +0 -19
- package/src/lib/use-motion-panel.ts +0 -78
- package/src/lib/utils.test.ts +0 -22
- package/src/lib/utils.ts +0 -100
- package/src/specular.js +0 -4
- /package/{src/components/composed/chat/composer → dist-lib}/BEAUTIFUL-UI-LICENSE.txt +0 -0
- /package/{src/components/composed/chat/chart/evilcharts/LICENSE → dist-lib/EVILCHARTS-LICENSE.txt} +0 -0
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
import { withAlpha, type ResolvedColors } from "./echarts-chart";
|
|
2
|
-
import type { DataZoomComponentOption } from "echarts/components";
|
|
3
|
-
import type { FC } from "react";
|
|
4
|
-
import * as echarts from "echarts/core";
|
|
5
|
-
|
|
6
|
-
type EChartsInstance = ReturnType<typeof echarts.init>;
|
|
7
|
-
|
|
8
|
-
const BRUSH_BORDER_OPACITY = 1; // brush frame, × border alpha (evil-brush uses the full token)
|
|
9
|
-
|
|
10
|
-
export { BRUSH_BORDER_OPACITY };
|
|
11
|
-
|
|
12
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
-
// Brush marker — the declarative `<Chart.Brush/>` child. Rendering nothing, its
|
|
14
|
-
// PRESENCE turns the brush on (replacing the old showBrush prop) and its props
|
|
15
|
-
// carry the brush's height, handle-label formatter, and range callback. Shared
|
|
16
|
-
// so every cartesian chart attaches the SAME component to its root.
|
|
17
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
-
|
|
19
|
-
export interface BrushProps {
|
|
20
|
-
height?: number; // brush preview strip height in px (default 56)
|
|
21
|
-
formatLabel?: (value: string, index: number) => string; // formats the range-handle labels
|
|
22
|
-
onChange?: (range: { startIndex: number; endIndex: number }) => void; // fires as the range moves
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Declares the zoom brush below the chart. Presence renders it; renders nothing itself. */
|
|
26
|
-
export const Brush: FC<BrushProps> = () => null;
|
|
27
|
-
|
|
28
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
29
|
-
// Brush overlays — the evil-brush look: a rounded border around the SELECTED
|
|
30
|
-
// range, dimmed unselected sides, centered grip-dot handle pills, and range
|
|
31
|
-
// label pills below the frame. None of that is a dataZoom capability. They are
|
|
32
|
-
// raw zrender elements updated imperatively — routing them through setOption
|
|
33
|
-
// re-renders the dataZoom component mid-drag, resetting its drag anchor (the
|
|
34
|
-
// handle progressively lags the pointer).
|
|
35
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
36
|
-
|
|
37
|
-
export type BrushRange = { start: number; end: number };
|
|
38
|
-
export type BrushGeometry = { bottom: number; height: number };
|
|
39
|
-
|
|
40
|
-
export type BrushOverlayParams = {
|
|
41
|
-
range: BrushRange;
|
|
42
|
-
geom: BrushGeometry;
|
|
43
|
-
size: { width: number; height: number };
|
|
44
|
-
tokens: ResolvedColors["tokens"];
|
|
45
|
-
labels: { start: string; end: string } | null;
|
|
46
|
-
showLabels: boolean;
|
|
47
|
-
hover: { left: boolean; right: boolean };
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
type ZrRect = InstanceType<typeof echarts.graphic.Rect>;
|
|
51
|
-
type ZrCircle = InstanceType<typeof echarts.graphic.Circle>;
|
|
52
|
-
type ZrText = InstanceType<typeof echarts.graphic.Text>;
|
|
53
|
-
|
|
54
|
-
export type BrushOverlayElements = {
|
|
55
|
-
dimLeft: ZrRect;
|
|
56
|
-
dimRight: ZrRect;
|
|
57
|
-
frame: ZrRect;
|
|
58
|
-
pillLeft: ZrRect;
|
|
59
|
-
pillRight: ZrRect;
|
|
60
|
-
grips: ZrCircle[]; // 3 left + 3 right
|
|
61
|
-
labelStart: ZrText;
|
|
62
|
-
labelEnd: ZrText;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export function syncBrushOverlay(
|
|
66
|
-
chart: EChartsInstance,
|
|
67
|
-
store: { brushOverlay: BrushOverlayElements | null },
|
|
68
|
-
params: BrushOverlayParams | null,
|
|
69
|
-
) {
|
|
70
|
-
const zr = chart.getZr();
|
|
71
|
-
if (!zr) return;
|
|
72
|
-
|
|
73
|
-
if (!params) {
|
|
74
|
-
if (store.brushOverlay) {
|
|
75
|
-
const { grips, ...rest } = store.brushOverlay;
|
|
76
|
-
[...Object.values(rest), ...grips].forEach((el) => zr.remove(el));
|
|
77
|
-
store.brushOverlay = null;
|
|
78
|
-
}
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (!store.brushOverlay) {
|
|
83
|
-
const rect = (z: number) => new echarts.graphic.Rect({ silent: true, z, shape: {} });
|
|
84
|
-
const els: BrushOverlayElements = {
|
|
85
|
-
dimLeft: rect(100),
|
|
86
|
-
dimRight: rect(100),
|
|
87
|
-
frame: rect(101),
|
|
88
|
-
pillLeft: rect(102),
|
|
89
|
-
pillRight: rect(102),
|
|
90
|
-
grips: Array.from(
|
|
91
|
-
{ length: 6 },
|
|
92
|
-
() => new echarts.graphic.Circle({ silent: true, z: 103, shape: {} }),
|
|
93
|
-
),
|
|
94
|
-
labelStart: new echarts.graphic.Text({ silent: true, z: 104 }),
|
|
95
|
-
labelEnd: new echarts.graphic.Text({ silent: true, z: 104 }),
|
|
96
|
-
};
|
|
97
|
-
const { grips, ...rest } = els;
|
|
98
|
-
[...Object.values(rest), ...grips].forEach((el) => zr.add(el));
|
|
99
|
-
store.brushOverlay = els;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const els = store.brushOverlay;
|
|
103
|
-
const { range, geom, size, tokens, labels, showLabels, hover } = params;
|
|
104
|
-
|
|
105
|
-
const trackLeft = 8;
|
|
106
|
-
const trackRight = Math.max(size.width - 8, trackLeft);
|
|
107
|
-
const trackWidth = trackRight - trackLeft;
|
|
108
|
-
const top = size.height - geom.bottom - geom.height;
|
|
109
|
-
const centerY = top + geom.height / 2;
|
|
110
|
-
const selectionLeft = trackLeft + (trackWidth * range.start) / 100;
|
|
111
|
-
const selectionRight = trackLeft + (trackWidth * range.end) / 100;
|
|
112
|
-
|
|
113
|
-
const dimFill = withAlpha(tokens.background, 0.7);
|
|
114
|
-
els.dimLeft.setShape({
|
|
115
|
-
x: trackLeft,
|
|
116
|
-
y: top,
|
|
117
|
-
width: Math.max(selectionLeft - trackLeft, 0),
|
|
118
|
-
height: geom.height,
|
|
119
|
-
});
|
|
120
|
-
els.dimLeft.setStyle({ fill: dimFill });
|
|
121
|
-
els.dimRight.setShape({
|
|
122
|
-
x: selectionRight,
|
|
123
|
-
y: top,
|
|
124
|
-
width: Math.max(trackRight - selectionRight, 0),
|
|
125
|
-
height: geom.height,
|
|
126
|
-
});
|
|
127
|
-
els.dimRight.setStyle({ fill: dimFill });
|
|
128
|
-
|
|
129
|
-
els.frame.setShape({
|
|
130
|
-
x: selectionLeft,
|
|
131
|
-
y: top,
|
|
132
|
-
width: Math.max(selectionRight - selectionLeft, 0),
|
|
133
|
-
height: geom.height,
|
|
134
|
-
r: 6,
|
|
135
|
-
});
|
|
136
|
-
els.frame.setStyle({
|
|
137
|
-
fill: "none",
|
|
138
|
-
stroke: withAlpha(tokens.border, BRUSH_BORDER_OPACITY),
|
|
139
|
-
lineWidth: 1,
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// Handle pills: evil-brush's 6×16 grip pill, centered on the selection edge,
|
|
143
|
-
// brightening to foreground on hover/drag.
|
|
144
|
-
const pill = (el: ZrRect, x: number, hovered: boolean) => {
|
|
145
|
-
el.setShape({ x: x - 3, y: centerY - 8, width: 6, height: 16, r: 3 });
|
|
146
|
-
el.setStyle({ fill: hovered ? tokens.foreground : tokens.mutedForeground });
|
|
147
|
-
};
|
|
148
|
-
pill(els.pillLeft, selectionLeft, hover.left);
|
|
149
|
-
pill(els.pillRight, selectionRight, hover.right);
|
|
150
|
-
|
|
151
|
-
const gripFill = withAlpha(tokens.background, 0.7);
|
|
152
|
-
[-4, 0, 4].forEach((offset, i) => {
|
|
153
|
-
els.grips[i].setShape({ cx: selectionLeft, cy: centerY + offset, r: 1 });
|
|
154
|
-
els.grips[i].setStyle({ fill: gripFill });
|
|
155
|
-
els.grips[i + 3].setShape({ cx: selectionRight, cy: centerY + offset, r: 1 });
|
|
156
|
-
els.grips[i + 3].setStyle({ fill: gripFill });
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
// Range label pills straddle the frame's bottom line — an overlay, so they
|
|
160
|
-
// occupy no layout space; half the pill sits above the line, half below. Each
|
|
161
|
-
// pill grows INWARD from its handle with a small inset, like the Recharts
|
|
162
|
-
// labels, instead of hanging past the frame edge.
|
|
163
|
-
const label = (el: ZrText, text: string, x: number, align: "left" | "right") => {
|
|
164
|
-
el.setStyle({
|
|
165
|
-
text,
|
|
166
|
-
x: align === "left" ? Math.max(x + 6, trackLeft + 2) : Math.min(x - 6, trackRight - 2),
|
|
167
|
-
y: top + geom.height,
|
|
168
|
-
align,
|
|
169
|
-
verticalAlign: "middle",
|
|
170
|
-
fill: tokens.background,
|
|
171
|
-
backgroundColor: tokens.foreground,
|
|
172
|
-
padding: [2, 5],
|
|
173
|
-
borderRadius: 4,
|
|
174
|
-
font: "500 9px system-ui, sans-serif",
|
|
175
|
-
});
|
|
176
|
-
el.attr("invisible", !showLabels || !text);
|
|
177
|
-
};
|
|
178
|
-
label(els.labelStart, labels?.start ?? "", selectionLeft, "left");
|
|
179
|
-
label(els.labelEnd, labels?.end ?? "", selectionRight, "right");
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
183
|
-
// dataZoom slider — the transparent drag layer laid over the mini chart. Fully
|
|
184
|
-
// chart-agnostic: the visible frame/handles/labels are the graphic overlays
|
|
185
|
-
// above; this provides interaction only. Both zoom entries target only the MAIN
|
|
186
|
-
// x-axis (index 0), so the mini chart never filters itself. The per-chart
|
|
187
|
-
// mini-series (which differ per chart type) are built by the chart, not here.
|
|
188
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
189
|
-
|
|
190
|
-
export function buildBrushDataZoom(params: {
|
|
191
|
-
brushBottom: number;
|
|
192
|
-
brushHeight: number;
|
|
193
|
-
brushRange: BrushRange;
|
|
194
|
-
fillerColor: string;
|
|
195
|
-
}): DataZoomComponentOption[] {
|
|
196
|
-
const { brushBottom, brushHeight, brushRange, fillerColor } = params;
|
|
197
|
-
|
|
198
|
-
return [
|
|
199
|
-
{
|
|
200
|
-
type: "slider",
|
|
201
|
-
show: true,
|
|
202
|
-
xAxisIndex: [0],
|
|
203
|
-
left: 8,
|
|
204
|
-
right: 8,
|
|
205
|
-
bottom: brushBottom,
|
|
206
|
-
height: brushHeight,
|
|
207
|
-
// Carry the live range through every rebuild — a notMerge push
|
|
208
|
-
// without start/end would reset the zoom to the full extent.
|
|
209
|
-
start: brushRange.start,
|
|
210
|
-
end: brushRange.end,
|
|
211
|
-
brushSelect: false,
|
|
212
|
-
// Range labels are overlay pills below the frame (see
|
|
213
|
-
// syncBrushOverlay) — the native detail text renders INSIDE the
|
|
214
|
-
// track, which is not the evil-brush look.
|
|
215
|
-
showDetail: false,
|
|
216
|
-
backgroundColor: "transparent",
|
|
217
|
-
// The visible frame is the graphic overlay riding the selection —
|
|
218
|
-
// the component's own static border stays hidden.
|
|
219
|
-
borderColor: "transparent",
|
|
220
|
-
fillerColor,
|
|
221
|
-
dataBackground: { lineStyle: { opacity: 0 }, areaStyle: { opacity: 0 } },
|
|
222
|
-
selectedDataBackground: { lineStyle: { opacity: 0 }, areaStyle: { opacity: 0 } },
|
|
223
|
-
// Interaction only — the visible pills are graphic overlays (see
|
|
224
|
-
// syncBrushOverlay). Kept generous for an easy grab target.
|
|
225
|
-
handleIcon: "path://M -3 -5 L -3 5 A 3 3 0 0 0 3 5 L 3 -5 A 3 3 0 0 0 -3 -5 Z",
|
|
226
|
-
handleSize: "35%",
|
|
227
|
-
handleStyle: { opacity: 0 },
|
|
228
|
-
moveHandleSize: 0,
|
|
229
|
-
emphasis: { handleStyle: { opacity: 0 } },
|
|
230
|
-
},
|
|
231
|
-
{ type: "inside", xAxisIndex: [0] },
|
|
232
|
-
];
|
|
233
|
-
}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import { CanvasRenderer, SVGRenderer } from "echarts/renderers";
|
|
2
|
-
import type { ComponentType, ReactNode } from "react";
|
|
3
|
-
import * as echarts from "echarts/core";
|
|
4
|
-
|
|
5
|
-
export const ECHARTS_RENDERERS = {
|
|
6
|
-
canvas: "canvas",
|
|
7
|
-
svg: "svg",
|
|
8
|
-
} as const;
|
|
9
|
-
|
|
10
|
-
export type EChartsRenderer = (typeof ECHARTS_RENDERERS)[keyof typeof ECHARTS_RENDERERS];
|
|
11
|
-
|
|
12
|
-
export const DEFAULT_ECHARTS_RENDERER = ECHARTS_RENDERERS.canvas;
|
|
13
|
-
|
|
14
|
-
// Renderer registration is shared by every modular ECharts chart. Individual
|
|
15
|
-
// chart modules only register the series and components they use.
|
|
16
|
-
echarts.use([CanvasRenderer, SVGRenderer]);
|
|
17
|
-
|
|
18
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
-
// Theme keys + config — replicated from the repo's <ChartStyle> so the ECharts
|
|
20
|
-
// charts stay self-contained (no recharts ui imports). Shared by every ECharts
|
|
21
|
-
// chart and the tooltip/legend/brush ui modules.
|
|
22
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
// Theme selectors mirror the repo's <ChartStyle>: light is the bare root, dark is `.dark`.
|
|
25
|
-
export const THEMES = { light: "", dark: ".dark" } as const;
|
|
26
|
-
export type ThemeKey = keyof typeof THEMES;
|
|
27
|
-
export const THEME_KEYS = Object.keys(THEMES) as ThemeKey[];
|
|
28
|
-
|
|
29
|
-
// Require at least one theme key — identical constraint to the repo's ChartConfig.
|
|
30
|
-
export type AtLeastOneThemeColor =
|
|
31
|
-
| { light: string[]; dark?: string[] }
|
|
32
|
-
| { light?: string[]; dark: string[] };
|
|
33
|
-
|
|
34
|
-
export type ChartConfig = Record<
|
|
35
|
-
string,
|
|
36
|
-
{
|
|
37
|
-
label?: ReactNode;
|
|
38
|
-
icon?: ComponentType;
|
|
39
|
-
colors?: AtLeastOneThemeColor;
|
|
40
|
-
}
|
|
41
|
-
>;
|
|
42
|
-
|
|
43
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
44
|
-
// Color plumbing — replicated from the repo's <ChartStyle> so the charts stay
|
|
45
|
-
// self-contained (no ./recharts imports).
|
|
46
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
// Max slots a key needs = longest color array across themes (min 1). Both themes
|
|
49
|
-
// always emit the same number of `--color-{key}-{n}` vars.
|
|
50
|
-
export function getColorsCount(item: ChartConfig[string]): number {
|
|
51
|
-
if (!item.colors) return 1;
|
|
52
|
-
const counts = THEME_KEYS.map((theme) => item.colors?.[theme]?.length ?? 0);
|
|
53
|
-
return Math.max(...counts, 1);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Distribute colors evenly across slots; extra slots go to the LAST color(s).
|
|
57
|
-
// 2 colors / 4 slots → [c0, c0, c1, c1]; 3 colors / 4 slots → [c0, c1, c2, c2].
|
|
58
|
-
export function distributeColors(colors: string[], maxCount: number): string[] {
|
|
59
|
-
const available = colors.length;
|
|
60
|
-
if (available >= maxCount) return colors.slice(0, maxCount);
|
|
61
|
-
|
|
62
|
-
const result: string[] = [];
|
|
63
|
-
const baseSlots = Math.floor(maxCount / available);
|
|
64
|
-
const extraSlots = maxCount % available;
|
|
65
|
-
|
|
66
|
-
for (let i = 0; i < available; i++) {
|
|
67
|
-
const isExtra = i >= available - extraSlots;
|
|
68
|
-
const slots = baseSlots + (isExtra ? 1 : 0);
|
|
69
|
-
for (let j = 0; j < slots; j++) result.push(colors[i]);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Emits the same CSS <ChartStyle> would: `--color-{key}-{n}` scoped to
|
|
76
|
-
// `[data-chart={id}]` (light) and `.dark [data-chart={id}]` (dark).
|
|
77
|
-
export function buildChartCss(id: string, config: ChartConfig): string {
|
|
78
|
-
const colorConfig = Object.entries(config).filter(([, item]) => item.colors);
|
|
79
|
-
if (!colorConfig.length) return "";
|
|
80
|
-
|
|
81
|
-
const varsFor = (theme: ThemeKey) =>
|
|
82
|
-
colorConfig
|
|
83
|
-
.flatMap(([key, item]) => {
|
|
84
|
-
const authored = item.colors?.[theme];
|
|
85
|
-
if (!authored || authored.length === 0) return [];
|
|
86
|
-
return distributeColors(authored, getColorsCount(item)).map(
|
|
87
|
-
(color, index) => ` --color-${key.replace(/[^a-zA-Z0-9_-]/g, character => "\\" + character.codePointAt(0)!.toString(16) + " ")}-${index}: ${color};`,
|
|
88
|
-
);
|
|
89
|
-
})
|
|
90
|
-
.join("\n");
|
|
91
|
-
|
|
92
|
-
return Object.entries(THEMES)
|
|
93
|
-
.map(([theme, prefix]) => `${prefix} [data-chart=${id}] {\n${varsFor(theme as ThemeKey)}\n}`)
|
|
94
|
-
.join("\n");
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// A single reusable 1×1 canvas normalizes ANY CSS color (hex, named, oklch, …)
|
|
98
|
-
// to a concrete rgba string by painting it and reading the pixel back.
|
|
99
|
-
let normalizerCtx: CanvasRenderingContext2D | null = null;
|
|
100
|
-
export function normalizeColor(value: string): string {
|
|
101
|
-
const raw = value.trim();
|
|
102
|
-
if (!raw || typeof document === "undefined") return raw;
|
|
103
|
-
|
|
104
|
-
if (!normalizerCtx) {
|
|
105
|
-
const canvas = document.createElement("canvas");
|
|
106
|
-
canvas.width = 1;
|
|
107
|
-
canvas.height = 1;
|
|
108
|
-
normalizerCtx = canvas.getContext("2d", { willReadFrequently: true });
|
|
109
|
-
}
|
|
110
|
-
if (!normalizerCtx) return raw;
|
|
111
|
-
|
|
112
|
-
normalizerCtx.clearRect(0, 0, 1, 1);
|
|
113
|
-
normalizerCtx.fillStyle = "#000";
|
|
114
|
-
normalizerCtx.fillStyle = raw; // invalid values leave the sentinel in place
|
|
115
|
-
normalizerCtx.fillRect(0, 0, 1, 1);
|
|
116
|
-
const [r, g, b, a] = normalizerCtx.getImageData(0, 0, 1, 1).data;
|
|
117
|
-
return `rgba(${r}, ${g}, ${b}, ${(a / 255).toFixed(3)})`;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Scales the alpha of a normalized `rgba(r, g, b, a)` string. Multiplying (not
|
|
121
|
-
// replacing) keeps translucent theme tokens honest: a border that is 10%-white
|
|
122
|
-
// at `withAlpha(border, 0.5)` lands at 5%, matching Tailwind's `border/50`.
|
|
123
|
-
export function withAlpha(color: string, alpha: number): string {
|
|
124
|
-
const match = color.match(/rgba?\(([^)]+)\)/);
|
|
125
|
-
if (!match) return color;
|
|
126
|
-
const [r, g, b, a] = match[1].split(",").map((p) => p.trim());
|
|
127
|
-
const base = a === undefined ? 1 : Number.parseFloat(a) || 0;
|
|
128
|
-
return `rgba(${r}, ${g}, ${b}, ${(base * alpha).toFixed(3)})`;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export type ResolvedColors = {
|
|
132
|
-
series: Record<string, string[]>; // normalized `--color-{key}-{n}` slots per key
|
|
133
|
-
tokens: {
|
|
134
|
-
mutedForeground: string;
|
|
135
|
-
border: string;
|
|
136
|
-
foreground: string;
|
|
137
|
-
background: string;
|
|
138
|
-
};
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
// Reads the injected CSS vars + theme tokens from the live DOM. Series slots come
|
|
142
|
-
// from `getComputedStyle` on the container; tokens are read off a throwaway probe
|
|
143
|
-
// carrying the matching Tailwind class (robust to the var naming a theme uses).
|
|
144
|
-
export function resolveColors(
|
|
145
|
-
container: HTMLElement,
|
|
146
|
-
config: ChartConfig,
|
|
147
|
-
seriesKeys: string[],
|
|
148
|
-
): ResolvedColors {
|
|
149
|
-
const computed = getComputedStyle(container);
|
|
150
|
-
const series: Record<string, string[]> = {};
|
|
151
|
-
|
|
152
|
-
for (const key of seriesKeys) {
|
|
153
|
-
const count = getColorsCount(config[key] ?? {});
|
|
154
|
-
const slots: string[] = [];
|
|
155
|
-
for (let n = 0; n < count; n++) {
|
|
156
|
-
const raw = computed.getPropertyValue(`--color-${key}-${n}`).trim();
|
|
157
|
-
slots.push(raw ? normalizeColor(raw) : "rgba(120, 120, 120, 1)");
|
|
158
|
-
}
|
|
159
|
-
series[key] = slots;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const probe = document.createElement("span");
|
|
163
|
-
probe.style.cssText = "position:absolute;width:0;height:0;visibility:hidden;pointer-events:none;";
|
|
164
|
-
container.appendChild(probe);
|
|
165
|
-
const readToken = (className: string) => {
|
|
166
|
-
probe.className = className;
|
|
167
|
-
return normalizeColor(getComputedStyle(probe).color);
|
|
168
|
-
};
|
|
169
|
-
const tokens = {
|
|
170
|
-
mutedForeground: readToken("text-muted-foreground"),
|
|
171
|
-
border: readToken("text-border"),
|
|
172
|
-
foreground: readToken("text-foreground"),
|
|
173
|
-
background: readToken("text-background"),
|
|
174
|
-
};
|
|
175
|
-
container.removeChild(probe);
|
|
176
|
-
|
|
177
|
-
return { series, tokens };
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Horizontal multi-stop color for a series — a solid string when there is only
|
|
181
|
-
// one color, else an evenly-distributed left→right LinearGradient. Reused for the
|
|
182
|
-
// stroke, symbol fills, and as the base tint for the area fill.
|
|
183
|
-
export function seriesPaint(slots: string[]): string | echarts.graphic.LinearGradient {
|
|
184
|
-
if (slots.length <= 1) return slots[0] ?? "rgba(120, 120, 120, 1)";
|
|
185
|
-
const stops = slots.map((color, i) => ({ offset: i / (slots.length - 1), color }));
|
|
186
|
-
return new echarts.graphic.LinearGradient(0, 0, 1, 0, stops);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Solid var / gradient of vars for a series indicator — mirrors getIndicatorColorStyle.
|
|
190
|
-
// Used by BOTH the tooltip rows and the legend indicators.
|
|
191
|
-
export function indicatorBackground(key: string, colorsCount: number): string {
|
|
192
|
-
if (colorsCount <= 1) return `var(--color-${key}-0)`;
|
|
193
|
-
const stops = Array.from({ length: colorsCount }, (_, i) => {
|
|
194
|
-
const offset = (i / (colorsCount - 1)) * 100;
|
|
195
|
-
return `var(--color-${key}-${i}) ${offset}%`;
|
|
196
|
-
}).join(", ");
|
|
197
|
-
return `linear-gradient(to right, ${stops})`;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Composites a translucent color over an opaque base into a FLAT color. The
|
|
201
|
-
// tick dots need this: a translucent stroke double-paints where its round caps
|
|
202
|
-
// overlap the line body, which reads as two stacked colors.
|
|
203
|
-
export function flattenColor(color: string, base: string): string {
|
|
204
|
-
const parse = (value: string) =>
|
|
205
|
-
value
|
|
206
|
-
.match(/rgba?\(([^)]+)\)/)?.[1]
|
|
207
|
-
.split(",")
|
|
208
|
-
.map((part) => Number.parseFloat(part)) ?? [0, 0, 0, 1];
|
|
209
|
-
const [r, g, b, a = 1] = parse(color);
|
|
210
|
-
const [baseR, baseG, baseB] = parse(base);
|
|
211
|
-
const mix = (channel: number, baseChannel: number) =>
|
|
212
|
-
Math.round(channel * a + baseChannel * (1 - a));
|
|
213
|
-
return `rgb(${mix(r, baseR)}, ${mix(g, baseG)}, ${mix(b, baseB)})`;
|
|
214
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type * as echarts from "echarts/core";
|
|
2
|
-
|
|
3
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
-
// Dots — map the resting/active variants onto ECharts symbols. Shared by every
|
|
5
|
-
// ECharts chart that draws point markers.
|
|
6
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
-
|
|
8
|
-
export type DotVariant = "none" | "default" | "border" | "colored-border" | "ping";
|
|
9
|
-
|
|
10
|
-
// Dot marker paint — structurally assignable to BOTH the series-level and the
|
|
11
|
-
// per-datum itemStyle (the per-datum variant forbids callback color paints, so
|
|
12
|
-
// the broader LineSeriesOption["itemStyle"] cannot be reused for it).
|
|
13
|
-
export type DotItemStyleOption = {
|
|
14
|
-
color?: string | echarts.graphic.LinearGradient;
|
|
15
|
-
borderColor?: string | echarts.graphic.LinearGradient;
|
|
16
|
-
borderWidth?: number;
|
|
17
|
-
opacity?: number;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export type DotStyle = { size: number; itemStyle: DotItemStyleOption };
|
|
21
|
-
|
|
22
|
-
// Re-color a solid paint at a given alpha (hex #rgb/#rrggbb or rgb/rgba in, rgba
|
|
23
|
-
// out; named colors pass through). Used for the translucent "ping" halo ring.
|
|
24
|
-
function withAlpha(color: string, alpha: number): string {
|
|
25
|
-
if (color.startsWith("#")) {
|
|
26
|
-
let hex = color.slice(1);
|
|
27
|
-
if (hex.length === 3)
|
|
28
|
-
hex = hex
|
|
29
|
-
.split("")
|
|
30
|
-
.map((c) => c + c)
|
|
31
|
-
.join("");
|
|
32
|
-
const n = parseInt(hex, 16);
|
|
33
|
-
return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;
|
|
34
|
-
}
|
|
35
|
-
const m = color.match(/rgba?\(([^)]+)\)/);
|
|
36
|
-
if (m) {
|
|
37
|
-
const [r, g, b] = m[1].split(",").map((s) => parseFloat(s));
|
|
38
|
-
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
39
|
-
}
|
|
40
|
-
return color;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function dotItemStyle(
|
|
44
|
-
variant: DotVariant,
|
|
45
|
-
paint: string | echarts.graphic.LinearGradient,
|
|
46
|
-
background: string,
|
|
47
|
-
): DotItemStyleOption {
|
|
48
|
-
switch (variant) {
|
|
49
|
-
case "border":
|
|
50
|
-
// Series-colored core with a thick background halo (Recharts r6 / sw5).
|
|
51
|
-
return { color: paint, borderColor: background, borderWidth: 2 };
|
|
52
|
-
case "colored-border":
|
|
53
|
-
// Background-filled core with a thin colored ring (Recharts r3 / sw1).
|
|
54
|
-
return { color: background, borderColor: paint, borderWidth: 1 };
|
|
55
|
-
case "ping": {
|
|
56
|
-
// Solid core wrapped in a wide, translucent same-color ring — a static
|
|
57
|
-
// "ping". The ring is the symbol's BORDER (a stroke ~1.25× the core
|
|
58
|
-
// radius), which fills out to a soft halo disc; a genuinely large symbol
|
|
59
|
-
// would silently fail to render on a category-axis line, so we stroke a
|
|
60
|
-
// small one instead.
|
|
61
|
-
const halo = typeof paint === "string" ? withAlpha(paint, 0.28) : paint;
|
|
62
|
-
return { color: paint, borderColor: halo, borderWidth: 10 };
|
|
63
|
-
}
|
|
64
|
-
case "default":
|
|
65
|
-
return { color: paint, borderWidth: 0 };
|
|
66
|
-
default:
|
|
67
|
-
return {};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Sizes mirror the Recharts markers: default r3, border r6 (mostly halo), and
|
|
72
|
-
// colored-border r3+ring. Flattening these to one size makes the hover ring read
|
|
73
|
-
// LARGER than a haloed resting dot — the opposite of the Recharts twin.
|
|
74
|
-
export const DOT_SIZES: Record<DotVariant, number> = {
|
|
75
|
-
none: 0,
|
|
76
|
-
default: 6,
|
|
77
|
-
border: 8,
|
|
78
|
-
"colored-border": 6,
|
|
79
|
-
ping: 8,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
export function dotStyle(
|
|
83
|
-
variant: DotVariant,
|
|
84
|
-
paint: string | echarts.graphic.LinearGradient,
|
|
85
|
-
background: string,
|
|
86
|
-
): DotStyle {
|
|
87
|
-
return { size: DOT_SIZES[variant], itemStyle: dotItemStyle(variant, paint, background) };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// The color the horizontal series gradient shows at position t ∈ [0, 1]. ECharts
|
|
91
|
-
// paints a gradient itemStyle relative to each symbol's own bounding box — a full
|
|
92
|
-
// rainbow inside every dot — while the Recharts dots clip a chart-wide gradient,
|
|
93
|
-
// so each takes the gradient's color at its x-position. Sampling reproduces that.
|
|
94
|
-
export function sampleGradient(slots: string[], t: number): string {
|
|
95
|
-
if (slots.length <= 1) return slots[0] ?? "rgba(120, 120, 120, 1)";
|
|
96
|
-
|
|
97
|
-
const parse = (color: string) =>
|
|
98
|
-
color
|
|
99
|
-
.match(/rgba?\(([^)]+)\)/)?.[1]
|
|
100
|
-
.split(",")
|
|
101
|
-
.map(Number) ?? [120, 120, 120, 1];
|
|
102
|
-
|
|
103
|
-
const position = t * (slots.length - 1);
|
|
104
|
-
const index = Math.min(Math.floor(position), slots.length - 2);
|
|
105
|
-
const fraction = position - index;
|
|
106
|
-
const [r1, g1, b1, a1 = 1] = parse(slots[index]);
|
|
107
|
-
const [r2, g2, b2, a2 = 1] = parse(slots[index + 1]);
|
|
108
|
-
const lerp = (from: number, to: number) => from + (to - from) * fraction;
|
|
109
|
-
|
|
110
|
-
return `rgba(${Math.round(lerp(r1, r2))}, ${Math.round(lerp(g1, g2))}, ${Math.round(lerp(b1, b2))}, ${lerp(a1, a2).toFixed(3)})`;
|
|
111
|
-
}
|