@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,30 +0,0 @@
|
|
|
1
|
-
import { ShellLayout } from "./shell-layout"
|
|
2
|
-
|
|
3
|
-
export type * from "./type"
|
|
4
|
-
export * from "./shell-metrics"
|
|
5
|
-
export * from "./use-shell-panels"
|
|
6
|
-
export { useShellFit } from "./use-shell-fit"
|
|
7
|
-
export { useShellFitActions, useShellFitState } from "./use-shell-fit-state"
|
|
8
|
-
// The public atom surface. `@internal` atoms (measure, mount) stay unexported
|
|
9
|
-
// on purpose — `export *` would make every internal a breaking-change surface
|
|
10
|
-
// for consumer apps.
|
|
11
|
-
export {
|
|
12
|
-
removeShellFitInstance,
|
|
13
|
-
resetShellPanelWidthAtom,
|
|
14
|
-
resizeShellPanelAtom,
|
|
15
|
-
shellFitFitsAtom,
|
|
16
|
-
shellFitMeasuredAtom,
|
|
17
|
-
shellFitMetricsAtom,
|
|
18
|
-
shellFitPanelBoundsAtom,
|
|
19
|
-
shellFitPanelWidthAtom,
|
|
20
|
-
shellFitRequestedWidthAtom,
|
|
21
|
-
shellFitStateAtom,
|
|
22
|
-
} from "./shell-fit-atom"
|
|
23
|
-
export * from "./utils"
|
|
24
|
-
|
|
25
|
-
export * from "./animated-panel"
|
|
26
|
-
export * from "./animated-panel-inset"
|
|
27
|
-
export * from "./animated-panel-provider"
|
|
28
|
-
export * from "./animated-panel-trigger"
|
|
29
|
-
|
|
30
|
-
export { ShellLayout as default }
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import { removeShellPanelInstance } from "./shell-panel-atom"
|
|
2
|
-
/**
|
|
3
|
-
* Per-instance Jotai state for the shell's layout fit.
|
|
4
|
-
*
|
|
5
|
-
* Every atom is a module-level family keyed by a shell id, so one
|
|
6
|
-
* `ExegiaProvider` at the app root is enough: several shells coexist in one
|
|
7
|
-
* store without a provider each, and a title bar, a command palette or a
|
|
8
|
-
* layout test can drive one by id without holding its controller.
|
|
9
|
-
*
|
|
10
|
-
* Unlike the tree, this feature has no controlled props — the shell measures
|
|
11
|
-
* itself, nobody hands it a viewport. So, like `blocks/auth`'s coordination
|
|
12
|
-
* layer, there is no config atom, no projection and no owned-* loop guard.
|
|
13
|
-
* `useShellFit` is the only writer of `metrics`, and that write is silent by
|
|
14
|
-
* design: a resize is not an event an app subscribed to.
|
|
15
|
-
*
|
|
16
|
-
* The rule itself lives in `shell-metrics.ts` and is called from here, so the
|
|
17
|
-
* arithmetic has one home whether it is read through a hook or a store.
|
|
18
|
-
*/
|
|
19
|
-
import { atom } from "jotai"
|
|
20
|
-
import type { Getter, Setter } from "jotai"
|
|
21
|
-
|
|
22
|
-
import {
|
|
23
|
-
clampPanelWidth,
|
|
24
|
-
fitsPanel,
|
|
25
|
-
metricsEqual,
|
|
26
|
-
panelBounds,
|
|
27
|
-
type IShellMetrics,
|
|
28
|
-
} from "./shell-metrics"
|
|
29
|
-
import type {
|
|
30
|
-
TShellFitInstanceId,
|
|
31
|
-
IShellFitPanelBounds,
|
|
32
|
-
IShellFitSeed,
|
|
33
|
-
IShellFitState,
|
|
34
|
-
} from "./type"
|
|
35
|
-
|
|
36
|
-
/** An unmeasured shell. Zeroes read as "no layout yet", which the rule fails
|
|
37
|
-
* open on rather than hiding a panel over a reading it never took. */
|
|
38
|
-
const NO_METRICS: IShellMetrics = {
|
|
39
|
-
rail: 0,
|
|
40
|
-
insetMin: 0,
|
|
41
|
-
panelMin: 0,
|
|
42
|
-
viewport: 0,
|
|
43
|
-
chrome: 0,
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** A panel that mounts at `--panel-width`. */
|
|
47
|
-
const DEFAULT_SHELL_FIT_SEED: IShellFitSeed = { panelWidth: null }
|
|
48
|
-
|
|
49
|
-
const NO_BOUNDS: IShellFitPanelBounds = { min: 0, max: 0 }
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* A string-keyed atom family.
|
|
53
|
-
*
|
|
54
|
-
* `jotai/utils`' `atomFamily` is deprecated for Jotai v3, and we need only
|
|
55
|
-
* the string-keyed case with a `remove` — so this stays in-house rather than
|
|
56
|
-
* adding `jotai-family` as a second Jotai package to keep version-aligned.
|
|
57
|
-
* Dropping a key lets the store's WeakMap release that instance's state.
|
|
58
|
-
*/
|
|
59
|
-
type TFamily<AtomType> = ((id: TShellFitInstanceId) => AtomType) & {
|
|
60
|
-
remove: (id: TShellFitInstanceId) => void
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Every family, so `removeShellFitInstance` can drop an id from all of them. */
|
|
64
|
-
const families: { remove: (id: TShellFitInstanceId) => void }[] = []
|
|
65
|
-
|
|
66
|
-
function keyed<AtomType>(create: (id: TShellFitInstanceId) => AtomType) {
|
|
67
|
-
const cache = new Map<TShellFitInstanceId, AtomType>()
|
|
68
|
-
const family = ((id: TShellFitInstanceId) => {
|
|
69
|
-
let instance = cache.get(id)
|
|
70
|
-
if (instance === undefined) {
|
|
71
|
-
instance = create(id)
|
|
72
|
-
cache.set(id, instance)
|
|
73
|
-
}
|
|
74
|
-
return instance
|
|
75
|
-
}) as TFamily<AtomType>
|
|
76
|
-
family.remove = (id: TShellFitInstanceId) => {
|
|
77
|
-
cache.delete(id)
|
|
78
|
-
}
|
|
79
|
-
families.push(family)
|
|
80
|
-
return family
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function stateFamily<Value>(name: string, initialValue: Value) {
|
|
84
|
-
return keyed((id) => {
|
|
85
|
-
const instance = atom(initialValue)
|
|
86
|
-
instance.debugLabel = `shell-fit/${id}/${name}`
|
|
87
|
-
return instance
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function readFamily<Value>(
|
|
92
|
-
name: string,
|
|
93
|
-
read: (get: Getter, id: TShellFitInstanceId) => Value
|
|
94
|
-
) {
|
|
95
|
-
return keyed((id) => {
|
|
96
|
-
const instance = atom((get) => read(get, id))
|
|
97
|
-
instance.debugLabel = `shell-fit/${id}/${name}`
|
|
98
|
-
return instance
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function actionFamily<Args extends unknown[]>(
|
|
103
|
-
name: string,
|
|
104
|
-
write: (
|
|
105
|
-
get: Getter,
|
|
106
|
-
set: Setter,
|
|
107
|
-
id: TShellFitInstanceId,
|
|
108
|
-
...args: Args
|
|
109
|
-
) => void
|
|
110
|
-
) {
|
|
111
|
-
return keyed((id) => {
|
|
112
|
-
const instance = atom(null, (get, set, ...args: Args) =>
|
|
113
|
-
write(get, set, id, ...args)
|
|
114
|
-
)
|
|
115
|
-
instance.debugLabel = `shell-fit/${id}/${name}`
|
|
116
|
-
return instance
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** The shell's own measurement of its columns. `useShellFit` is the only
|
|
121
|
-
* writer; read `shellFitMeasuredAtom` to get it with the "no layout yet" case
|
|
122
|
-
* already resolved. */
|
|
123
|
-
export const shellFitMetricsAtom = stateFamily<IShellMetrics>(
|
|
124
|
-
"metrics",
|
|
125
|
-
NO_METRICS
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
/** The width the user dragged to, before clamping — null while the panel sits
|
|
129
|
-
* at `--panel-width`. Read `shellFitPanelWidthAtom` for the width the panel
|
|
130
|
-
* actually renders at: clamping on read is what lets a narrowing viewport
|
|
131
|
-
* pull the panel down without forgetting the width they asked for. */
|
|
132
|
-
export const shellFitRequestedWidthAtom = stateFamily<number | null>(
|
|
133
|
-
"requestedWidth",
|
|
134
|
-
null
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
const shellFitSeedAtom = stateFamily<IShellFitSeed>(
|
|
138
|
-
"seed",
|
|
139
|
-
DEFAULT_SHELL_FIT_SEED
|
|
140
|
-
)
|
|
141
|
-
const shellFitInitializedAtom = stateFamily<boolean>("initialized", false)
|
|
142
|
-
|
|
143
|
-
/** The metrics, or null when the shell has no layout to report — a server
|
|
144
|
-
* render, a `display: none` host, a test with no layout engine. A zero is not
|
|
145
|
-
* a width, and treating it as one would pin the panel to nothing. */
|
|
146
|
-
export const shellFitMeasuredAtom = readFamily<IShellMetrics | null>(
|
|
147
|
-
"measured",
|
|
148
|
-
(get, id) => {
|
|
149
|
-
const metrics = get(shellFitMetricsAtom(id))
|
|
150
|
-
return metrics.panelMin > 0 ? metrics : null
|
|
151
|
-
}
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
/** Whether the shell can hold a secondary panel at all. */
|
|
155
|
-
export const shellFitFitsAtom = readFamily("fits", (get, id) =>
|
|
156
|
-
fitsPanel(get(shellFitMetricsAtom(id)))
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
/** The range a resize may land in. */
|
|
160
|
-
export const shellFitPanelBoundsAtom = readFamily<IShellFitPanelBounds>(
|
|
161
|
-
"panelBounds",
|
|
162
|
-
(get, id) => {
|
|
163
|
-
const measured = get(shellFitMeasuredAtom(id))
|
|
164
|
-
return measured ? panelBounds(measured) : NO_BOUNDS
|
|
165
|
-
}
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
/** The width the secondary panel renders at, or null before the first
|
|
169
|
-
* measurement, where the caller falls back to `--panel-width`. */
|
|
170
|
-
export const shellFitPanelWidthAtom = readFamily<number | null>(
|
|
171
|
-
"panelWidth",
|
|
172
|
-
(get, id) => {
|
|
173
|
-
const measured = get(shellFitMeasuredAtom(id))
|
|
174
|
-
if (!measured) return null
|
|
175
|
-
const requested = get(shellFitRequestedWidthAtom(id))
|
|
176
|
-
return clampPanelWidth(requested ?? measured.panelMin, measured)
|
|
177
|
-
}
|
|
178
|
-
)
|
|
179
|
-
|
|
180
|
-
/** The whole fit of one shell. This changes on every measurement, so a
|
|
181
|
-
* component that reads one field should subscribe to that field's atom
|
|
182
|
-
* instead: `useAtomValue(shellFitFitsAtom("app-shell"))`. */
|
|
183
|
-
export const shellFitStateAtom = readFamily<IShellFitState>(
|
|
184
|
-
"state",
|
|
185
|
-
(get, id) => ({
|
|
186
|
-
sidebar: get(shellFitMetricsAtom(id)).sidebar ?? null,
|
|
187
|
-
metrics: get(shellFitMeasuredAtom(id)),
|
|
188
|
-
fits: get(shellFitFitsAtom(id)),
|
|
189
|
-
panelWidth: get(shellFitPanelWidthAtom(id)),
|
|
190
|
-
bounds: get(shellFitPanelBoundsAtom(id)),
|
|
191
|
-
})
|
|
192
|
-
)
|
|
193
|
-
|
|
194
|
-
/** @internal The measurement's way in. Silent, and inert when the numbers did
|
|
195
|
-
* not move — a resize event that changes nothing must not re-render a shell. */
|
|
196
|
-
export const measureShellFitAtom = actionFamily<[metrics: IShellMetrics]>(
|
|
197
|
-
"measure",
|
|
198
|
-
(get, set, id, metrics) => {
|
|
199
|
-
if (metricsEqual(get(shellFitMetricsAtom(id)), metrics)) return
|
|
200
|
-
set(shellFitMetricsAtom(id), metrics)
|
|
201
|
-
}
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
/** Resize the secondary panel. Clamped on the way in, so a drag past the
|
|
205
|
-
* gutter parks at the bound instead of banking travel it has to give back —
|
|
206
|
-
* and a caller with no idea how wide the shell is can still ask for 900. */
|
|
207
|
-
export const resizeShellPanelAtom = actionFamily<[width: number]>(
|
|
208
|
-
"resizePanel",
|
|
209
|
-
(get, set, id, width) => {
|
|
210
|
-
const measured = get(shellFitMeasuredAtom(id))
|
|
211
|
-
set(
|
|
212
|
-
shellFitRequestedWidthAtom(id),
|
|
213
|
-
measured ? clampPanelWidth(width, measured) : width
|
|
214
|
-
)
|
|
215
|
-
}
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
/** Back to the width the shell mounted with — `defaultPanelWidth`, or
|
|
219
|
-
* `--panel-width` when there was none. */
|
|
220
|
-
export const resetShellPanelWidthAtom = actionFamily<[]>(
|
|
221
|
-
"resetPanelWidth",
|
|
222
|
-
(get, set, id) => {
|
|
223
|
-
set(shellFitRequestedWidthAtom(id), get(shellFitSeedAtom(id)).panelWidth)
|
|
224
|
-
}
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
/** @internal Seed the instance once. A seed describes the mount, not every
|
|
228
|
-
* render, so a `defaultPanelWidth` that arrives later never overwrites a
|
|
229
|
-
* width the user dragged to. */
|
|
230
|
-
export const mountShellFitAtom = actionFamily<[seed: IShellFitSeed]>(
|
|
231
|
-
"mount",
|
|
232
|
-
(get, set, id, seed) => {
|
|
233
|
-
if (get(shellFitInitializedAtom(id))) return
|
|
234
|
-
set(shellFitInitializedAtom(id), true)
|
|
235
|
-
set(shellFitSeedAtom(id), seed)
|
|
236
|
-
set(shellFitRequestedWidthAtom(id), seed.panelWidth)
|
|
237
|
-
}
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
/** Drop every atom for `id`. `useShellFit` calls this on unmount for shells it
|
|
241
|
-
* keyed itself; an explicit `shellId` is the app's key and outlives its
|
|
242
|
-
* component, so a resized panel survives a route change. */
|
|
243
|
-
export function removeShellFitInstance(id: TShellFitInstanceId): void {
|
|
244
|
-
removeShellPanelInstance(id)
|
|
245
|
-
for (const family of families) family.remove(id)
|
|
246
|
-
}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import { MotionIcon } from "motion-icons-react"
|
|
4
|
-
import * as React from "react"
|
|
5
|
-
import { useAtomValueRawSync } from "jotai"
|
|
6
|
-
import { removeShellFitInstance } from "./shell-fit-atom"
|
|
7
|
-
import { shellPanelAtoms } from "./shell-panel-atom"
|
|
8
|
-
|
|
9
|
-
import { AnimatedPanel } from "./animated-panel.tsx"
|
|
10
|
-
import { cn } from "@/lib/utils"
|
|
11
|
-
import type { IShellLayoutProps, TShellPanelControlProps } from "./type"
|
|
12
|
-
import { SHELL_BEZEL_CLASSES, TITLE_BAR_HEIGHT } from "./utils"
|
|
13
|
-
import type { ClassNameValue } from "tailwind-merge"
|
|
14
|
-
import { AnimatedPanelProvider } from "./animated-panel-provider.tsx"
|
|
15
|
-
import { AnimatedPanelTrigger } from "./animated-panel-trigger.tsx"
|
|
16
|
-
import { AnimatedPanelInset } from "./animated-panel-inset.tsx"
|
|
17
|
-
|
|
18
|
-
export function ShellLayout({
|
|
19
|
-
children,
|
|
20
|
-
variant = "desktop",
|
|
21
|
-
panels,
|
|
22
|
-
className,
|
|
23
|
-
header,
|
|
24
|
-
trailing,
|
|
25
|
-
defaultOpen,
|
|
26
|
-
panelComponents,
|
|
27
|
-
...panelControlProps
|
|
28
|
-
}: IShellLayoutProps): React.ReactElement {
|
|
29
|
-
const background: ClassNameValue = `bg-linear-to-tr/increasing from-neutral-200 via-neutral-100 to-stone-200 dark:from-neutral-900 dark:via-neutral-950 dark:to-stone-950`
|
|
30
|
-
|
|
31
|
-
const generatedId = React.useId()
|
|
32
|
-
const shellId = panelControlProps.shellId ?? generatedId
|
|
33
|
-
React.useEffect(() => {
|
|
34
|
-
if (panelControlProps.shellId !== undefined) return
|
|
35
|
-
return () => removeShellFitInstance(shellId)
|
|
36
|
-
}, [shellId, panelControlProps.shellId])
|
|
37
|
-
const sharedComponents = useAtomValueRawSync(
|
|
38
|
-
shellPanelAtoms(shellId).components
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
// Content pushed through `openPanel(side, component)` wins over the static
|
|
42
|
-
// `panels` entry; a side renders its panel when either supplies content.
|
|
43
|
-
const leftContent =
|
|
44
|
-
sharedComponents.left ?? panelComponents?.left ?? panels?.left?.component
|
|
45
|
-
const rightContent =
|
|
46
|
-
sharedComponents.right ?? panelComponents?.right ?? panels?.right?.component
|
|
47
|
-
|
|
48
|
-
// Each panel seeds its own side's initial state (`defaultOpen ?? open`);
|
|
49
|
-
// an explicit `defaultOpen` record — usually from useShellPanels — wins
|
|
50
|
-
// per side.
|
|
51
|
-
const initialOpen: TShellPanelControlProps["defaultOpen"] = {
|
|
52
|
-
...(panels?.left && {
|
|
53
|
-
left: panels.left.defaultOpen ?? true,
|
|
54
|
-
}),
|
|
55
|
-
...(panels?.right && {
|
|
56
|
-
right: panels.right.defaultOpen ?? false,
|
|
57
|
-
}),
|
|
58
|
-
...defaultOpen,
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return (
|
|
62
|
-
<AnimatedPanelProvider
|
|
63
|
-
{...panelControlProps}
|
|
64
|
-
shellId={shellId}
|
|
65
|
-
defaultOpen={initialOpen}
|
|
66
|
-
className={cn(
|
|
67
|
-
"min-h-0 px-2 pb-2 relative h-full",
|
|
68
|
-
variant === "web" && "pt-2",
|
|
69
|
-
className,
|
|
70
|
-
background
|
|
71
|
-
)}
|
|
72
|
-
style={{
|
|
73
|
-
paddingTop: variant === "desktop" ? TITLE_BAR_HEIGHT : 0,
|
|
74
|
-
}}
|
|
75
|
-
>
|
|
76
|
-
{leftContent && (
|
|
77
|
-
<AnimatedPanel
|
|
78
|
-
ariaLabel="Primary navigation"
|
|
79
|
-
collapsible="icon"
|
|
80
|
-
role="navigation"
|
|
81
|
-
variant="inset"
|
|
82
|
-
>
|
|
83
|
-
{leftContent}
|
|
84
|
-
</AnimatedPanel>
|
|
85
|
-
)}
|
|
86
|
-
|
|
87
|
-
<AnimatedPanelInset>
|
|
88
|
-
<header className="h-12 gap-2 px-2 flex flex-row! items-center justify-between border-b">
|
|
89
|
-
{leftContent && (
|
|
90
|
-
<div className="min-w-0 gap-2 flex shrink-0 items-center justify-start">
|
|
91
|
-
<AnimatedPanelTrigger side="left">
|
|
92
|
-
<MotionIcon name="PanelLeft" size={24} animation="press" />
|
|
93
|
-
</AnimatedPanelTrigger>
|
|
94
|
-
</div>
|
|
95
|
-
)}
|
|
96
|
-
{header && (
|
|
97
|
-
<div className="min-w-0 flex flex-1 items-center">{header}</div>
|
|
98
|
-
)}
|
|
99
|
-
{(trailing || rightContent) && (
|
|
100
|
-
// ml-auto, not flex-fill: the cluster hugs the trailing edge even
|
|
101
|
-
// when there is no header (or left trigger) to push against.
|
|
102
|
-
<div className="gap-2 ml-auto flex shrink-0 items-center justify-end">
|
|
103
|
-
{trailing}
|
|
104
|
-
{rightContent && (
|
|
105
|
-
<AnimatedPanelTrigger aria-label="Toggle panel" side="right">
|
|
106
|
-
<MotionIcon
|
|
107
|
-
className="opacity-70"
|
|
108
|
-
name="PanelRight"
|
|
109
|
-
size={24}
|
|
110
|
-
/>
|
|
111
|
-
</AnimatedPanelTrigger>
|
|
112
|
-
)}
|
|
113
|
-
</div>
|
|
114
|
-
)}
|
|
115
|
-
</header>
|
|
116
|
-
<div className="min-h-24 flex-1 overflow-auto">{children}</div>
|
|
117
|
-
</AnimatedPanelInset>
|
|
118
|
-
|
|
119
|
-
{rightContent && (
|
|
120
|
-
<AnimatedPanel
|
|
121
|
-
ariaLabel={panels?.right?.name ?? "Secondary panel"}
|
|
122
|
-
// Below md the panel is portal led over the page, so it carries the
|
|
123
|
-
// surface itself; the desktop rail keeps it on the inner panel.
|
|
124
|
-
className={cn(
|
|
125
|
-
"bg-neutral-50 dark:border-neutral-800 dark:bg-neutral-900",
|
|
126
|
-
"rounded-md",
|
|
127
|
-
SHELL_BEZEL_CLASSES
|
|
128
|
-
)}
|
|
129
|
-
collapsible="offcanvas"
|
|
130
|
-
role="complementary"
|
|
131
|
-
side="right"
|
|
132
|
-
variant="inset"
|
|
133
|
-
>
|
|
134
|
-
{rightContent}
|
|
135
|
-
</AnimatedPanel>
|
|
136
|
-
)}
|
|
137
|
-
</AnimatedPanelProvider>
|
|
138
|
-
)
|
|
139
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The shell's layout arithmetic, as plain functions over px.
|
|
3
|
-
*
|
|
4
|
-
* Nothing here touches React or the DOM. This module IS the contract of who
|
|
5
|
-
* gets which column, which keeps the rule unit-testable on its own and lets
|
|
6
|
-
* the shell-fit atoms (`shellFitFitsAtom`, `shellFitPanelWidthAtom`) call it
|
|
7
|
-
* without restating it: `useShellFit` only supplies the measurements.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/** The px the shell lays itself out with. Every field is measured from a CSS
|
|
11
|
-
* variable (see `SHELL_WIDTHS`), never hard-coded, so a consumer's override
|
|
12
|
-
* flows straight through the rule. */
|
|
13
|
-
export interface IShellSidebarFit {
|
|
14
|
-
width: number
|
|
15
|
-
minWidth: number
|
|
16
|
-
maxWidth: number
|
|
17
|
-
canExpand: boolean
|
|
18
|
-
mode: "expanded" | "icon" | "hidden"
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** Reserve the body first, then shrink, fold, or hide the navigation rail.
|
|
22
|
-
* The requested width/open state is retained so widening restores it. */
|
|
23
|
-
export function fitSidebar({
|
|
24
|
-
width,
|
|
25
|
-
padding,
|
|
26
|
-
gap,
|
|
27
|
-
insetMin,
|
|
28
|
-
expanded,
|
|
29
|
-
icon,
|
|
30
|
-
minimum,
|
|
31
|
-
open,
|
|
32
|
-
collapsible,
|
|
33
|
-
present,
|
|
34
|
-
}: {
|
|
35
|
-
width: number
|
|
36
|
-
padding: number
|
|
37
|
-
gap: number
|
|
38
|
-
insetMin: number
|
|
39
|
-
expanded: number
|
|
40
|
-
icon: number
|
|
41
|
-
minimum: number
|
|
42
|
-
open: boolean
|
|
43
|
-
collapsible: string
|
|
44
|
-
present: boolean
|
|
45
|
-
}): IShellSidebarFit {
|
|
46
|
-
const room = width > 0 ? Math.max(0, width - padding - gap - insetMin) : 480
|
|
47
|
-
const canExpand = present && room >= minimum
|
|
48
|
-
const isExpanded = canExpand && (open || collapsible === "none")
|
|
49
|
-
const railWidth = !present
|
|
50
|
-
? 0
|
|
51
|
-
: isExpanded
|
|
52
|
-
? Math.min(expanded, room)
|
|
53
|
-
: collapsible === "offcanvas" || room < icon
|
|
54
|
-
? 0
|
|
55
|
-
: icon
|
|
56
|
-
return {
|
|
57
|
-
width: railWidth,
|
|
58
|
-
minWidth: minimum,
|
|
59
|
-
maxWidth: Math.max(minimum, Math.min(480, room)),
|
|
60
|
-
canExpand,
|
|
61
|
-
mode: railWidth === 0 ? "hidden" : isExpanded ? "expanded" : "icon",
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface IShellMetrics {
|
|
66
|
-
sidebar?: IShellSidebarFit
|
|
67
|
-
/** What the left rail occupies right now — its expanded width, its icon
|
|
68
|
-
* width, or 0 when there is no rail at all (or it is off canvas). */
|
|
69
|
-
rail: number
|
|
70
|
-
/** The floor the body refuses to go below. */
|
|
71
|
-
insetMin: number
|
|
72
|
-
/** The secondary panel's floor, which is also the width it opens at. */
|
|
73
|
-
panelMin: number
|
|
74
|
-
/** Available shell container width (legacy field name). */
|
|
75
|
-
viewport: number
|
|
76
|
-
/** px the shell's own frame eats before any column gets a share: its
|
|
77
|
-
* padding, plus the gap between columns.
|
|
78
|
-
*/
|
|
79
|
-
chrome: number
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** px the shell needs before a secondary panel can exist: the rail as it
|
|
83
|
-
* stands, plus the body and the panel at their own floors. */
|
|
84
|
-
export function requiredWidth({ rail, insetMin, panelMin }: IShellMetrics) {
|
|
85
|
-
return rail + insetMin + panelMin
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Whether the shell can hold a secondary panel, including padding and gaps.
|
|
90
|
-
*
|
|
91
|
-
* An unmeasurable shell fails open. A server render, a `display: none` host
|
|
92
|
-
* or a test environment with no layout engine all report 0, and a panel must
|
|
93
|
-
* never disappear over a reading the layout could not produce.
|
|
94
|
-
*/
|
|
95
|
-
export function fitsPanel(metrics: IShellMetrics) {
|
|
96
|
-
if (metrics.viewport <= 0 || metrics.panelMin <= 0) return true
|
|
97
|
-
return requiredWidth(metrics) + metrics.chrome <= metrics.viewport
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** How wide the secondary panel may be: never under its own floor, never past
|
|
101
|
-
* the slack the body holds above its floor. `max` never drops below `min`, so
|
|
102
|
-
* a shell that does not fit reports a degenerate range instead of an inverted
|
|
103
|
-
* one — `fitsPanel` is what hides the panel, not a negative bound. */
|
|
104
|
-
export function panelBounds(metrics: IShellMetrics) {
|
|
105
|
-
const { chrome, insetMin, panelMin, rail, viewport } = metrics
|
|
106
|
-
return {
|
|
107
|
-
min: panelMin,
|
|
108
|
-
max: Math.max(panelMin, viewport - chrome - rail - insetMin),
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function clampPanelWidth(width: number, metrics: IShellMetrics) {
|
|
113
|
-
const { min, max } = panelBounds(metrics)
|
|
114
|
-
return Math.min(Math.max(width, min), max)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/** Resizes fire per pointer move and per resize event, most of them landing
|
|
118
|
-
* on the same numbers — comparing fields keeps those from re-rendering the
|
|
119
|
-
* whole shell. */
|
|
120
|
-
export function metricsEqual(a: IShellMetrics, b: IShellMetrics) {
|
|
121
|
-
return (
|
|
122
|
-
a.rail === b.rail &&
|
|
123
|
-
a.insetMin === b.insetMin &&
|
|
124
|
-
a.panelMin === b.panelMin &&
|
|
125
|
-
a.viewport === b.viewport &&
|
|
126
|
-
a.chrome === b.chrome &&
|
|
127
|
-
a.sidebar?.width === b.sidebar?.width &&
|
|
128
|
-
a.sidebar?.minWidth === b.sidebar?.minWidth &&
|
|
129
|
-
a.sidebar?.maxWidth === b.sidebar?.maxWidth &&
|
|
130
|
-
a.sidebar?.canExpand === b.sidebar?.canExpand &&
|
|
131
|
-
a.sidebar?.mode === b.sidebar?.mode
|
|
132
|
-
)
|
|
133
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { atom } from "jotai"
|
|
2
|
-
import type { TSidebarComponentMap, TSidebarSide } from "./type"
|
|
3
|
-
|
|
4
|
-
type OpenState = Record<TSidebarSide, boolean>
|
|
5
|
-
type Handlers = {
|
|
6
|
-
setOpen: (open: boolean, side: TSidebarSide) => void
|
|
7
|
-
setOpenMobile: (open: boolean, side: TSidebarSide) => void
|
|
8
|
-
}
|
|
9
|
-
function createState() {
|
|
10
|
-
const railWidth = atom<number | null>(null)
|
|
11
|
-
const resizeSidebar = atom(null, (_get, set, width: number) => {
|
|
12
|
-
if (Number.isFinite(width))
|
|
13
|
-
set(railWidth, Math.max(180, Math.min(480, width)))
|
|
14
|
-
})
|
|
15
|
-
const open = atom<OpenState>({ left: true, right: false })
|
|
16
|
-
const mobile = atom<OpenState>({ left: false, right: false })
|
|
17
|
-
const components = atom<TSidebarComponentMap>({})
|
|
18
|
-
const handlers = atom<Handlers | null>(null)
|
|
19
|
-
const seeded = atom(false)
|
|
20
|
-
const setOpen = atom(null, (get, set, value: boolean, side: TSidebarSide) => {
|
|
21
|
-
const host = get(handlers)
|
|
22
|
-
if (host) host.setOpen(value, side)
|
|
23
|
-
else set(open, { ...get(open), [side]: value })
|
|
24
|
-
})
|
|
25
|
-
const setOpenMobile = atom(
|
|
26
|
-
null,
|
|
27
|
-
(get, set, value: boolean, side: TSidebarSide) => {
|
|
28
|
-
const host = get(handlers)
|
|
29
|
-
if (host) host.setOpenMobile(value, side)
|
|
30
|
-
else set(mobile, { ...get(mobile), [side]: value })
|
|
31
|
-
}
|
|
32
|
-
)
|
|
33
|
-
const toggle = atom(null, (get, set, side: TSidebarSide) =>
|
|
34
|
-
set(setOpen, !get(open)[side], side)
|
|
35
|
-
)
|
|
36
|
-
const seed = atom(
|
|
37
|
-
null,
|
|
38
|
-
(
|
|
39
|
-
get,
|
|
40
|
-
set,
|
|
41
|
-
initial?: Partial<OpenState>,
|
|
42
|
-
initialMobile?: Partial<OpenState>
|
|
43
|
-
) => {
|
|
44
|
-
if (get(seeded)) return
|
|
45
|
-
set(seeded, true)
|
|
46
|
-
set(open, { ...get(open), ...initial })
|
|
47
|
-
set(mobile, { ...get(mobile), ...initialMobile })
|
|
48
|
-
}
|
|
49
|
-
)
|
|
50
|
-
return {
|
|
51
|
-
railWidth,
|
|
52
|
-
resizeSidebar,
|
|
53
|
-
open,
|
|
54
|
-
mobile,
|
|
55
|
-
components,
|
|
56
|
-
handlers,
|
|
57
|
-
setOpen,
|
|
58
|
-
setOpenMobile,
|
|
59
|
-
toggle,
|
|
60
|
-
seed,
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const instances = new Map<string, ReturnType<typeof createState>>()
|
|
64
|
-
export function shellPanelAtoms(id: string) {
|
|
65
|
-
let state = instances.get(id)
|
|
66
|
-
if (!state) {
|
|
67
|
-
state = createState()
|
|
68
|
-
instances.set(id, state)
|
|
69
|
-
}
|
|
70
|
-
return state
|
|
71
|
-
}
|
|
72
|
-
export function removeShellPanelInstance(id: string) {
|
|
73
|
-
instances.delete(id)
|
|
74
|
-
}
|