@exegia/corpora-ui 0.29.0 → 1.0.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 +33 -11
- package/dist-lib/index.js +13006 -7914
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/src/components/atoms/_layout.d.ts +4 -0
- package/dist-lib/src/components/atoms/avatar/base.d.ts +2 -0
- package/dist-lib/src/components/atoms/avatar/index.d.ts +2 -0
- package/dist-lib/src/components/atoms/avatar/types.d.ts +20 -0
- package/dist-lib/src/components/atoms/avatar/utils.d.ts +13 -0
- package/dist-lib/src/components/atoms/avatar/verified.d.ts +1 -0
- package/dist-lib/src/components/atoms/background/index.d.ts +6 -0
- package/dist-lib/src/components/atoms/background/texture.d.ts +2 -0
- package/dist-lib/src/components/atoms/background/type.d.ts +7 -0
- package/dist-lib/src/components/atoms/background/utils.d.ts +4 -0
- package/dist-lib/src/components/atoms/bubble/actions.d.ts +7 -0
- package/dist-lib/src/components/atoms/bubble/context.d.ts +4 -0
- package/dist-lib/src/components/atoms/bubble/default.d.ts +3 -0
- package/dist-lib/src/components/atoms/bubble/header.d.ts +8 -0
- package/dist-lib/src/components/atoms/bubble/index.d.ts +16 -0
- package/dist-lib/src/components/atoms/bubble/message.d.ts +3 -0
- package/dist-lib/src/components/atoms/bubble/reactions.d.ts +14 -0
- package/dist-lib/src/components/atoms/bubble/types.d.ts +59 -0
- package/dist-lib/src/components/atoms/bubble/utils.d.ts +13 -0
- package/dist-lib/src/components/atoms/chip.d.ts +15 -0
- package/dist-lib/src/components/atoms/index.d.ts +15 -0
- package/dist-lib/src/components/atoms/loader.d.ts +8 -0
- package/dist-lib/src/components/atoms/reference.d.ts +7 -0
- package/dist-lib/src/components/atoms/text/default.d.ts +1144 -0
- package/dist-lib/src/components/atoms/text/heading.d.ts +4 -0
- package/dist-lib/src/components/atoms/text/index.d.ts +21 -0
- package/dist-lib/src/components/atoms/text/label.d.ts +2 -0
- package/dist-lib/src/components/atoms/text/paragraph.d.ts +4 -0
- package/dist-lib/src/components/atoms/text/span.d.ts +3 -0
- package/dist-lib/src/components/atoms/text/types.d.ts +23 -0
- package/dist-lib/src/components/atoms/text/utils.d.ts +4 -0
- package/dist-lib/src/components/atoms/text-selection/click-popover.d.ts +3 -0
- package/dist-lib/src/components/atoms/text-selection/index.d.ts +6 -0
- package/dist-lib/src/components/atoms/text-selection/popover.d.ts +3 -0
- package/dist-lib/src/components/atoms/text-selection/selection-atom.d.ts +30 -0
- package/dist-lib/src/components/atoms/text-selection/selection.d.ts +3 -0
- package/dist-lib/src/components/atoms/text-selection/types.d.ts +90 -0
- package/dist-lib/src/components/atoms/text-selection/use-selection.d.ts +7 -0
- package/dist-lib/src/components/atoms/types.d.ts +17 -0
- package/dist-lib/src/components/blocks/auth/auth-flow-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/code-auth-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/forgot-password-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/linked-accounts-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/login-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/onboarding-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/passkey-manager-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/passkey-sign-in-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/signup-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/auth/update-password-block.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/chat/banners.d.ts +13 -0
- package/dist-lib/src/components/blocks/chat/base.d.ts +10 -0
- package/dist-lib/src/components/blocks/chat/base.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/chat/header.d.ts +4 -0
- package/dist-lib/src/components/blocks/chat/index.d.ts +13 -0
- package/dist-lib/src/components/blocks/chat/recommendation-stack.d.ts +13 -0
- package/dist-lib/src/components/blocks/chat/shared.d.ts +8 -0
- package/dist-lib/src/components/blocks/chat/suggested-prompts.d.ts +3 -0
- package/dist-lib/src/components/blocks/chat/types.d.ts +64 -0
- package/dist-lib/src/components/blocks/chat/version-history-record.d.ts +3 -0
- package/dist-lib/{components → src/components}/blocks/profile/profile-card-block.d.ts +2 -7
- package/dist-lib/src/components/blocks/profile/profile-card-block.story.d.ts +3 -0
- package/dist-lib/{components → src/components}/blocks/profile/type.d.ts +2 -2
- package/dist-lib/src/components/blocks/scaffold/scaffold-root.story.d.ts +3 -0
- package/dist-lib/src/components/blocks/shell/shell-layout.story.d.ts +3 -0
- package/dist-lib/src/components/composed/action-bar/action.d.ts +18 -0
- package/dist-lib/src/components/composed/action-bar/emojis.d.ts +10 -0
- package/dist-lib/src/components/composed/action-bar/index.d.ts +12 -0
- package/dist-lib/src/components/composed/action-bar/toolbar.d.ts +2 -0
- package/dist-lib/src/components/composed/action-bar/types.d.ts +55 -0
- package/dist-lib/src/components/composed/action-bar/utils.d.ts +57 -0
- package/dist-lib/src/components/composed/ai/avatar.d.ts +1 -0
- package/dist-lib/src/components/composed/ai/index.d.ts +17 -0
- package/dist-lib/src/components/composed/ai/message.d.ts +7 -0
- package/dist-lib/src/components/composed/ai/research-answer.d.ts +30 -0
- package/dist-lib/src/components/composed/ai/shared.d.ts +19 -0
- package/dist-lib/src/components/composed/ai/streaming-text.d.ts +26 -0
- package/dist-lib/src/components/composed/ai/suggested-prompt.d.ts +35 -0
- package/dist-lib/src/components/composed/ai/types.d.ts +66 -0
- package/dist-lib/src/components/composed/attachment.story.d.ts +3 -0
- package/dist-lib/src/components/composed/chart.story.d.ts +3 -0
- package/dist-lib/src/components/composed/chat/__tests__/attachment.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/beautiful-ui.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/chart.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/code-block.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/composer-attachments.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/composer.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/flowchart.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/__tests__/markdown.test.d.ts +1 -0
- package/dist-lib/src/components/composed/chat/actions.d.ts +2 -0
- package/dist-lib/src/components/composed/chat/attachment.d.ts +62 -0
- package/dist-lib/src/components/composed/chat/chart.d.ts +41 -0
- package/dist-lib/src/components/composed/chat/code-block.d.ts +26 -0
- package/dist-lib/src/components/composed/chat/composer/add-button.d.ts +5 -0
- package/dist-lib/src/components/composed/chat/composer/base.d.ts +8 -0
- package/dist-lib/src/components/composed/chat/composer/command-menu.d.ts +2 -0
- package/dist-lib/src/components/composed/chat/composer/hooks.d.ts +9 -0
- package/dist-lib/src/components/composed/chat/composer/index.d.ts +10 -0
- package/dist-lib/src/components/composed/chat/composer/send-button.d.ts +3 -0
- package/dist-lib/src/components/composed/chat/composer/suggestions.d.ts +7 -0
- package/dist-lib/src/components/composed/chat/composer/utils.d.ts +19 -0
- package/dist-lib/src/components/composed/chat/context-cards.d.ts +27 -0
- package/dist-lib/src/components/composed/chat/filter-table.d.ts +40 -0
- package/dist-lib/src/components/composed/chat/flowchart/chart-node.d.ts +2 -0
- package/dist-lib/src/components/composed/chat/flowchart/connector.d.ts +2 -0
- package/dist-lib/src/components/composed/chat/flowchart/constant.d.ts +15 -0
- package/dist-lib/src/components/composed/chat/flowchart/default.d.ts +7 -0
- package/dist-lib/src/components/composed/chat/flowchart/edge-toolbar.d.ts +9 -0
- package/dist-lib/src/components/composed/chat/flowchart/hooks.d.ts +290 -0
- package/dist-lib/src/components/composed/chat/flowchart/index.d.ts +11 -0
- package/dist-lib/src/components/composed/chat/flowchart/step-body.d.ts +6 -0
- package/dist-lib/src/components/composed/chat/flowchart/types.d.ts +91 -0
- package/dist-lib/src/components/composed/chat/flowchart/utils.d.ts +64 -0
- package/dist-lib/src/components/composed/chat/hint.d.ts +6 -0
- package/dist-lib/src/components/composed/chat/index.d.ts +15 -0
- package/dist-lib/src/components/composed/chat/insight-cards.d.ts +54 -0
- package/dist-lib/src/components/composed/chat/markdown-atom.d.ts +7 -0
- package/dist-lib/src/components/composed/chat/markdown.d.ts +22 -0
- package/dist-lib/src/components/composed/chat/recommendation/checkbox.d.ts +15 -0
- package/dist-lib/src/components/composed/chat/recommendation/constant.d.ts +6 -0
- package/dist-lib/src/components/composed/chat/recommendation/default.d.ts +7 -0
- package/dist-lib/src/components/composed/chat/recommendation/group.d.ts +8 -0
- package/dist-lib/src/components/composed/chat/recommendation/index.d.ts +15 -0
- package/dist-lib/src/components/composed/chat/recommendation/item.d.ts +12 -0
- package/dist-lib/src/components/composed/chat/recommendation/types.d.ts +53 -0
- package/dist-lib/src/components/composed/chat/records-table.d.ts +38 -0
- package/dist-lib/src/components/composed/chat/type.d.ts +86 -0
- package/dist-lib/src/components/composed/code-block.story.d.ts +3 -0
- package/dist-lib/src/components/composed/context-cards.story.d.ts +3 -0
- package/dist-lib/src/components/composed/emoji-action-bar.story.d.ts +3 -0
- package/dist-lib/src/components/composed/filter-table.story.d.ts +7 -0
- package/dist-lib/src/components/composed/flowchart.story.d.ts +3 -0
- package/dist-lib/src/components/composed/insight-cards.story.d.ts +3 -0
- package/dist-lib/src/components/composed/logo.story.d.ts +3 -0
- package/dist-lib/src/components/composed/markdown.story.d.ts +3 -0
- package/dist-lib/src/components/composed/password-input.story.d.ts +7 -0
- package/dist-lib/src/components/composed/reader/applied-mark.d.ts +3 -0
- package/dist-lib/src/components/composed/reader/apply-toast.d.ts +3 -0
- package/dist-lib/src/components/composed/reader/index.d.ts +7 -0
- package/dist-lib/src/components/composed/reader/selection-highlight.d.ts +3 -0
- package/dist-lib/src/components/composed/reader/selection-popover.d.ts +9 -0
- package/dist-lib/src/components/composed/reader/type.d.ts +40 -0
- package/dist-lib/src/components/composed/recommendation-card.story.d.ts +3 -0
- package/dist-lib/src/components/composed/records-table.story.d.ts +3 -0
- package/dist-lib/src/components/composed/research-answer.story.d.ts +3 -0
- package/dist-lib/src/components/composed/social-providers.story.d.ts +3 -0
- package/dist-lib/src/components/composed/streaming-text.story.d.ts +3 -0
- package/dist-lib/src/components/composed/tree/__tests__/tree-atom.test.d.ts +1 -0
- package/dist-lib/src/components/composed/tree/__tests__/tree.test.d.ts +1 -0
- package/dist-lib/src/components/composed/tree/__tests__/use-tree.test.d.ts +1 -0
- package/dist-lib/src/components/composed/tree.story.d.ts +6 -0
- package/dist-lib/src/components/composed/user/index.d.ts +11 -0
- package/dist-lib/src/components/composed/user/info.d.ts +12 -0
- package/dist-lib/src/components/composed/user/message.d.ts +3 -0
- package/dist-lib/src/components/composed/user/pill.d.ts +10 -0
- package/dist-lib/src/components/composed/user/types.d.ts +20 -0
- package/dist-lib/src/components/composed/user/utils.d.ts +1 -0
- package/dist-lib/src/components/composed/user.story.d.ts +8 -0
- package/dist-lib/src/components/composed/verse/__tests__/verse.test.d.ts +1 -0
- package/dist-lib/src/components/composed/verse/index.d.ts +2 -0
- package/dist-lib/src/components/composed/verse/types.d.ts +18 -0
- package/dist-lib/src/components/composed/verse/verse.d.ts +5 -0
- package/dist-lib/src/components/composed/verse.story.d.ts +3 -0
- package/dist-lib/src/components/docs/atoms-gallery.d.ts +3 -0
- package/dist-lib/{components → src/components}/docs/demo-controls.d.ts +3 -10
- package/dist-lib/src/components/docs/hero.d.ts +5 -0
- package/dist-lib/src/components/docs/mermaid.d.ts +3 -0
- package/dist-lib/src/components/icons/__tests__/icons.test.d.ts +1 -0
- package/dist-lib/src/components/motion/index.d.ts +1 -0
- package/dist-lib/src/components/ui/accordion.d.ts +7 -0
- package/dist-lib/src/components/ui/alert-dialog.d.ts +20 -0
- package/dist-lib/src/components/ui/alert.d.ts +10 -0
- package/dist-lib/src/components/ui/autocomplete.d.ts +34 -0
- package/dist-lib/src/components/ui/avatar.d.ts +11 -0
- package/dist-lib/src/components/ui/avatar.story.d.ts +7 -0
- package/dist-lib/src/components/ui/badge.d.ts +14 -0
- package/dist-lib/src/components/ui/bubble.story.d.ts +7 -0
- package/dist-lib/{components → src/components}/ui/button.d.ts +1 -1
- package/dist-lib/src/components/ui/button.story.d.ts +8 -0
- package/dist-lib/src/components/ui/card.story.d.ts +9 -0
- package/dist-lib/src/components/ui/chat/__tests__/segmented-toggle.test.d.ts +1 -0
- package/dist-lib/src/components/ui/chat/avatar-handle.d.ts +13 -0
- package/dist-lib/src/components/ui/chat/badges.d.ts +29 -0
- package/dist-lib/src/components/ui/chat/buttons.d.ts +29 -0
- package/dist-lib/src/components/ui/chat/chips.d.ts +48 -0
- package/dist-lib/src/components/ui/chat/dot.d.ts +30 -0
- package/dist-lib/src/components/ui/chat/icon-button.d.ts +18 -0
- package/dist-lib/src/components/ui/chat/icon-tile.d.ts +20 -0
- package/dist-lib/src/components/ui/chat/index.d.ts +12 -0
- package/dist-lib/src/components/ui/chat/inline-source.d.ts +20 -0
- package/dist-lib/src/components/ui/chat/segmented-toggle.d.ts +20 -0
- package/dist-lib/src/components/ui/chat/tag.d.ts +21 -0
- package/dist-lib/src/components/ui/chat/thumbnail.d.ts +13 -0
- package/dist-lib/src/components/ui/chat/waveform.d.ts +13 -0
- package/dist-lib/src/components/ui/chat-atoms.story.d.ts +22 -0
- package/dist-lib/src/components/ui/checkbox.story.d.ts +7 -0
- package/dist-lib/src/components/ui/collapsible.d.ts +6 -0
- package/dist-lib/src/components/ui/command.d.ts +25 -0
- package/dist-lib/src/components/ui/context-menu.d.ts +42 -0
- package/dist-lib/src/components/ui/emoji-picker.d.ts +7 -0
- package/dist-lib/src/components/ui/field.story.d.ts +7 -0
- package/dist-lib/src/components/ui/file-icons.story.d.ts +7 -0
- package/dist-lib/src/components/ui/frame.story.d.ts +9 -0
- package/dist-lib/{components → src/components}/ui/glasscn/glass-container.d.ts +7 -2
- package/dist-lib/src/components/ui/input-group.story.d.ts +7 -0
- package/dist-lib/src/components/ui/input.story.d.ts +9 -0
- package/dist-lib/src/components/ui/kbd.d.ts +3 -0
- package/dist-lib/src/components/ui/label.story.d.ts +9 -0
- package/dist-lib/src/components/ui/menu-command.d.ts +37 -0
- package/dist-lib/src/components/ui/menu-command.story.d.ts +7 -0
- package/dist-lib/src/components/ui/otp-field.story.d.ts +9 -0
- package/dist-lib/src/components/ui/password-input.story.d.ts +3 -0
- package/dist-lib/src/components/ui/popover-glass.d.ts +32 -0
- package/dist-lib/src/components/ui/popover.d.ts +18 -0
- package/dist-lib/src/components/ui/preview-card.d.ts +11 -0
- package/dist-lib/src/components/ui/reference.story.d.ts +10 -0
- package/dist-lib/src/components/ui/scroll-area.d.ts +11 -0
- package/dist-lib/{components → src/components}/ui/select.d.ts +1 -1
- package/dist-lib/src/components/ui/separator.story.d.ts +7 -0
- package/dist-lib/src/components/ui/tabs.d.ts +15 -0
- package/dist-lib/src/components/ui/text.story.d.ts +9 -0
- package/dist-lib/src/components/ui/textarea.story.d.ts +7 -0
- package/dist-lib/src/components/ui/toast.d.ts +15 -0
- package/dist-lib/src/components/ui/toolbar.d.ts +9 -0
- package/dist-lib/src/components/ui/tooltip.d.ts +14 -0
- package/dist-lib/{index.d.ts → src/index.d.ts} +13 -4
- package/dist-lib/{lib → src/lib}/ease.d.ts +9 -0
- package/dist-lib/src/lib/hooks/use-mobile.d.ts +1 -0
- package/dist-lib/src/lib/keyed-atom.d.ts +14 -0
- package/dist-lib/src/lib/segmented-control.d.ts +8 -0
- package/dist-lib/src/lib/utils.test.d.ts +1 -0
- package/package.json +40 -21
- package/src/assets/css/base.css +62 -0
- package/src/assets/css/chat.css +229 -0
- package/src/assets/css/shadows.css +157 -0
- package/src/assets/css/theme.css +321 -0
- package/src/components/AGENTS.md +0 -0
- package/src/components/atoms/_layout.tsx +9 -0
- package/src/components/atoms/avatar/base.tsx +70 -0
- package/src/components/atoms/avatar/index.ts +3 -0
- package/src/components/atoms/avatar/types.ts +24 -0
- package/src/components/atoms/avatar/utils.ts +54 -0
- package/src/components/atoms/avatar/verified.tsx +16 -0
- package/src/components/atoms/background/index.ts +8 -0
- package/src/components/atoms/background/texture.tsx +29 -0
- package/src/components/atoms/background/type.ts +10 -0
- package/src/components/atoms/background/utils.ts +13 -0
- package/src/components/atoms/bubble/__tests__/bubble.test.tsx +138 -0
- package/src/components/atoms/bubble/__tests__/reference.test.tsx +25 -0
- package/src/components/atoms/bubble/actions.tsx +28 -0
- package/src/components/atoms/bubble/context.ts +11 -0
- package/src/components/atoms/bubble/default.tsx +46 -0
- package/src/components/atoms/bubble/header.tsx +34 -0
- package/src/components/atoms/bubble/index.ts +37 -0
- package/src/components/atoms/bubble/message.tsx +25 -0
- package/src/components/atoms/bubble/reactions.tsx +194 -0
- package/src/components/atoms/bubble/types.ts +79 -0
- package/src/components/atoms/bubble/utils.ts +46 -0
- package/src/components/atoms/chip.tsx +61 -0
- package/src/components/atoms/index.ts +52 -0
- package/src/components/atoms/loader.tsx +42 -0
- package/src/components/atoms/reference.tsx +41 -0
- package/src/components/atoms/text/__tests__/text.test.tsx +47 -0
- package/src/components/atoms/text/default.tsx +59 -0
- package/src/components/atoms/text/heading.tsx +61 -0
- package/src/components/atoms/text/index.ts +24 -0
- package/src/components/atoms/text/label.tsx +16 -0
- package/src/components/atoms/text/paragraph.tsx +58 -0
- package/src/components/atoms/text/span.tsx +15 -0
- package/src/components/atoms/text/types.ts +31 -0
- package/src/components/atoms/text/utils.ts +16 -0
- package/src/components/atoms/text-selection/__tests__/click-popover.test.tsx +61 -0
- package/src/components/atoms/text-selection/__tests__/text-selection.test.tsx +90 -0
- package/src/components/atoms/text-selection/click-popover.tsx +62 -0
- package/src/components/atoms/text-selection/index.ts +30 -0
- package/src/components/atoms/text-selection/popover.tsx +100 -0
- package/src/components/atoms/text-selection/selection-atom.ts +51 -0
- package/src/components/atoms/text-selection/selection.tsx +56 -0
- package/src/components/atoms/text-selection/types.ts +125 -0
- package/src/components/atoms/text-selection/use-selection.ts +84 -0
- package/src/components/atoms/types.ts +18 -0
- package/src/components/blocks/auth/__tests__/auth-flow-block.test.tsx +1 -1
- package/src/components/blocks/auth/__tests__/auth-state-atom.test.tsx +1 -1
- package/src/components/blocks/auth/auth-flow-block.story.tsx +17 -0
- package/src/components/blocks/auth/code-auth-block.story.tsx +20 -0
- package/src/components/blocks/auth/forgot-password-block.story.tsx +14 -0
- package/src/components/blocks/auth/linked-accounts-block.story.tsx +23 -0
- package/src/components/blocks/auth/linked-accounts-block.tsx +1 -1
- package/src/components/blocks/auth/login-block.story.tsx +18 -0
- package/src/components/blocks/auth/onboarding/profile-step.tsx +1 -1
- package/src/components/blocks/auth/onboarding-block.story.tsx +14 -0
- package/src/components/blocks/auth/passkey-manager-block.story.tsx +18 -0
- package/src/components/blocks/auth/passkey-manager-block.tsx +2 -2
- package/src/components/blocks/auth/passkey-sign-in-block.story.tsx +14 -0
- package/src/components/blocks/auth/signup-block.story.tsx +18 -0
- package/src/components/blocks/auth/update-password-block.story.tsx +14 -0
- package/src/components/blocks/chat/__tests__/ai-panel.test.tsx +65 -0
- package/src/components/blocks/chat/banners.tsx +69 -0
- package/src/components/blocks/chat/base.story.tsx +19 -0
- package/src/components/blocks/chat/base.tsx +84 -0
- package/src/components/blocks/chat/header.tsx +60 -0
- package/src/components/blocks/chat/index.ts +39 -0
- package/src/components/blocks/chat/recommendation-stack.tsx +43 -0
- package/src/components/blocks/chat/shared.tsx +27 -0
- package/src/components/blocks/chat/suggested-prompts.tsx +45 -0
- package/src/components/blocks/chat/types.ts +81 -0
- package/src/components/blocks/chat/version-history-record.tsx +37 -0
- package/src/components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.tsx +1 -1
- package/src/components/blocks/nav/sidebar/sidebar-row.tsx +2 -2
- package/src/components/blocks/nav/sidebar/use-ai-sidebar.ts +193 -190
- package/src/components/blocks/profile/__tests__/profile-card-block.test.tsx +208 -176
- package/src/components/blocks/profile/profile-card-block.story.tsx +18 -0
- package/src/components/blocks/profile/profile-card-block.tsx +15 -17
- package/src/components/blocks/profile/type.ts +3 -5
- package/src/components/blocks/profile/use-profile-card.ts +17 -11
- package/src/components/blocks/scaffold/scaffold-canvas.tsx +4 -1
- package/src/components/blocks/scaffold/scaffold-root.story.tsx +36 -0
- package/src/components/blocks/scaffold/scaffold-root.tsx +9 -6
- package/src/components/blocks/scaffold/utils.ts +1 -1
- package/src/components/blocks/shell/__tests__/shell-fit-atom.test.tsx +4 -4
- package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +3 -3
- package/src/components/blocks/shell/animated-panel-inset.tsx +1 -1
- package/src/components/blocks/shell/shell-layout.story.tsx +19 -0
- package/src/components/blocks/shell/shell-layout.tsx +1 -1
- package/src/components/blocks/shell/use-shell-fit-state.ts +2 -2
- package/src/components/blocks/shell/use-shell-fit.ts +2 -2
- package/src/components/blocks/shell/use-shell-panels.ts +3 -3
- package/src/components/composed/action-bar/__tests__/action-bar.test.tsx +96 -0
- package/src/components/composed/action-bar/action.tsx +80 -0
- package/src/components/composed/action-bar/emojis.tsx +97 -0
- package/src/components/composed/action-bar/index.ts +24 -0
- package/src/components/composed/action-bar/toolbar.tsx +60 -0
- package/src/components/composed/action-bar/types.ts +58 -0
- package/src/components/composed/action-bar/utils.ts +141 -0
- package/src/components/composed/ai/__tests__/ai.test.tsx +67 -0
- package/src/components/composed/ai/avatar.tsx +20 -0
- package/src/components/composed/ai/index.ts +36 -0
- package/src/components/composed/ai/message.tsx +49 -0
- package/src/components/composed/ai/research-answer.tsx +157 -0
- package/src/components/composed/ai/shared.tsx +94 -0
- package/src/components/composed/ai/streaming-text.tsx +94 -0
- package/src/components/composed/ai/suggested-prompt.tsx +183 -0
- package/src/components/composed/ai/types.ts +81 -0
- package/src/components/composed/attachment.story.tsx +52 -0
- package/src/components/composed/chart.story.tsx +46 -0
- package/src/components/composed/chat/__tests__/attachment.test.tsx +45 -0
- package/src/components/composed/chat/__tests__/beautiful-ui.test.tsx +57 -0
- package/src/components/composed/chat/__tests__/chart.test.tsx +29 -0
- package/src/components/composed/chat/__tests__/code-block.test.tsx +12 -0
- package/src/components/composed/chat/__tests__/composer-attachments.test.tsx +53 -0
- package/src/components/composed/chat/__tests__/composer.test.tsx +81 -0
- package/src/components/composed/chat/__tests__/flowchart.test.tsx +132 -0
- package/src/components/composed/chat/__tests__/markdown.test.tsx +25 -0
- package/src/components/composed/chat/actions.tsx +81 -0
- package/src/components/composed/chat/attachment.tsx +228 -0
- package/src/components/composed/chat/chart.tsx +193 -0
- package/src/components/composed/chat/code-block.tsx +123 -0
- package/src/components/composed/chat/composer/add-button.tsx +22 -0
- package/src/components/composed/chat/composer/base.tsx +248 -0
- package/src/components/composed/chat/composer/command-menu.tsx +42 -0
- package/src/components/composed/chat/composer/hooks.ts +29 -0
- package/src/components/composed/chat/composer/index.ts +19 -0
- package/src/components/composed/chat/composer/send-button.tsx +44 -0
- package/src/components/composed/chat/composer/suggestions.tsx +115 -0
- package/src/components/composed/chat/composer/utils.ts +74 -0
- package/src/components/composed/chat/context-cards.tsx +63 -0
- package/src/components/composed/chat/filter-table.tsx +119 -0
- package/src/components/composed/chat/flowchart/chart-node.tsx +162 -0
- package/src/components/composed/chat/flowchart/connector.tsx +32 -0
- package/src/components/composed/chat/flowchart/constant.ts +26 -0
- package/src/components/composed/chat/flowchart/default.tsx +230 -0
- package/src/components/composed/chat/flowchart/edge-toolbar.tsx +73 -0
- package/src/components/composed/chat/flowchart/hooks.tsx +345 -0
- package/src/components/composed/chat/flowchart/index.ts +14 -0
- package/src/components/composed/chat/flowchart/step-body.tsx +82 -0
- package/src/components/composed/chat/flowchart/types.ts +89 -0
- package/src/components/composed/chat/flowchart/utils.ts +78 -0
- package/src/components/composed/chat/hint.tsx +59 -0
- package/src/components/composed/chat/index.ts +96 -0
- package/src/components/composed/chat/insight-cards.tsx +199 -0
- package/src/components/composed/chat/markdown-atom.ts +15 -0
- package/src/components/composed/chat/markdown.tsx +213 -0
- package/src/components/composed/chat/recommendation/checkbox.tsx +133 -0
- package/src/components/composed/chat/recommendation/constant.ts +25 -0
- package/src/components/composed/chat/recommendation/default.tsx +25 -0
- package/src/components/composed/chat/recommendation/group.tsx +43 -0
- package/src/components/composed/chat/recommendation/index.ts +19 -0
- package/src/components/composed/chat/recommendation/item.tsx +244 -0
- package/src/components/composed/chat/recommendation/types.ts +65 -0
- package/src/components/composed/chat/records-table.tsx +128 -0
- package/src/components/composed/chat/type.ts +126 -0
- package/src/components/composed/code-block.story.tsx +29 -0
- package/src/components/composed/context-cards.story.tsx +30 -0
- package/src/components/composed/emoji-action-bar.story.tsx +20 -0
- package/src/components/composed/filter-table.story.tsx +58 -0
- package/src/components/composed/flowchart.story.tsx +24 -0
- package/src/components/composed/insight-cards.story.tsx +51 -0
- package/src/components/composed/logo.story.tsx +21 -0
- package/src/components/composed/logo.tsx +24 -12
- package/src/components/composed/markdown.story.tsx +21 -0
- package/src/components/composed/password-input.story.tsx +38 -0
- package/src/components/composed/reader/applied-mark.tsx +32 -0
- package/src/components/composed/reader/apply-toast.tsx +49 -0
- package/src/components/composed/reader/index.ts +10 -0
- package/src/components/composed/reader/selection-highlight.tsx +26 -0
- package/src/components/composed/reader/selection-popover.tsx +149 -0
- package/src/components/composed/reader/type.ts +48 -0
- package/src/components/composed/recommendation-card.story.tsx +32 -0
- package/src/components/composed/records-table.story.tsx +46 -0
- package/src/components/composed/research-answer.story.tsx +32 -0
- package/src/components/composed/social-providers.story.tsx +24 -0
- package/src/components/composed/streaming-text.story.tsx +24 -0
- package/src/components/composed/tree/__tests__/tree-atom.test.tsx +1 -1
- package/src/components/composed/tree/__tests__/tree.test.tsx +1 -1
- package/src/components/composed/tree/tree-node.tsx +1 -1
- package/src/components/composed/tree/use-tree.ts +20 -16
- package/src/components/composed/tree.story.tsx +31 -0
- package/src/components/composed/user/index.ts +14 -0
- package/src/components/composed/user/info.tsx +48 -0
- package/src/components/composed/user/message.tsx +10 -0
- package/src/components/composed/user/pill.tsx +20 -0
- package/src/components/composed/user/types.ts +27 -0
- package/src/components/composed/user/utils.ts +0 -0
- package/src/components/composed/user.story.tsx +29 -0
- package/src/components/composed/verse/__tests__/verse.test.tsx +57 -0
- package/src/components/composed/verse/index.ts +2 -0
- package/src/components/composed/verse/types.ts +24 -0
- package/src/components/composed/verse/verse.tsx +100 -0
- package/src/components/composed/verse.story.tsx +21 -0
- package/src/components/docs/atoms-gallery.tsx +286 -0
- package/src/components/docs/code-block.tsx +2 -0
- package/src/components/docs/demo-controls.tsx +20 -20
- package/src/components/docs/hero.tsx +198 -0
- package/src/components/docs/mermaid.tsx +55 -0
- package/src/components/ui/accordion.tsx +68 -0
- package/src/components/ui/alert-dialog.tsx +167 -0
- package/src/components/ui/alert.tsx +84 -0
- package/src/components/ui/autocomplete.tsx +303 -0
- package/src/components/ui/avatar.story.tsx +33 -0
- package/src/components/ui/avatar.tsx +81 -24
- package/src/components/ui/badge.tsx +73 -24
- package/src/components/ui/bubble.story.tsx +45 -0
- package/src/components/ui/button-group.tsx +4 -4
- package/src/components/ui/button.story.tsx +62 -0
- package/src/components/ui/button.tsx +3 -3
- package/src/components/ui/card.story.tsx +36 -0
- package/src/components/ui/card.tsx +2 -2
- package/src/components/ui/chat/__tests__/segmented-toggle.test.tsx +27 -0
- package/src/components/ui/chat/avatar-handle.tsx +30 -0
- package/src/components/ui/chat/badges.tsx +85 -0
- package/src/components/ui/chat/buttons.tsx +94 -0
- package/src/components/ui/chat/chips.tsx +106 -0
- package/src/components/ui/chat/dot.tsx +81 -0
- package/src/components/ui/chat/icon-button.tsx +43 -0
- package/src/components/ui/chat/icon-tile.tsx +33 -0
- package/src/components/ui/chat/index.ts +12 -0
- package/src/components/ui/chat/inline-source.tsx +94 -0
- package/src/components/ui/chat/segmented-toggle.tsx +99 -0
- package/src/components/ui/chat/tag.tsx +61 -0
- package/src/components/ui/chat/thumbnail.tsx +31 -0
- package/src/components/ui/chat/waveform.tsx +30 -0
- package/src/components/ui/chat-atoms.story.tsx +94 -0
- package/src/components/ui/checkbox.story.tsx +30 -0
- package/src/components/ui/collapsible.tsx +42 -0
- package/src/components/ui/command.tsx +263 -0
- package/src/components/ui/context-menu.tsx +342 -0
- package/src/components/ui/emoji-picker.tsx +161 -0
- package/src/components/ui/field.story.tsx +32 -0
- package/src/components/ui/file-icons.story.tsx +24 -0
- package/src/components/ui/frame.story.tsx +32 -0
- package/src/components/ui/frame.tsx +2 -2
- package/src/components/ui/glasscn/glass-container.tsx +9 -3
- package/src/components/ui/glasscn/liquid-glass.tsx +5 -5
- package/src/components/ui/group.tsx +1 -1
- package/src/components/ui/input-group.story.tsx +27 -0
- package/src/components/ui/input-group.tsx +1 -1
- package/src/components/ui/input.story.tsx +42 -0
- package/src/components/ui/input.tsx +1 -1
- package/src/components/ui/kbd.tsx +32 -0
- package/src/components/ui/label.story.tsx +32 -0
- package/src/components/ui/menu-command.story.tsx +37 -0
- package/src/components/ui/menu-command.tsx +128 -0
- package/src/components/ui/otp-field.story.tsx +35 -0
- package/src/components/ui/otp-field.tsx +1 -1
- package/src/components/ui/password-input.story.tsx +19 -0
- package/src/components/ui/popover-glass.tsx +161 -0
- package/src/components/ui/popover.tsx +120 -0
- package/src/components/ui/preview-card.tsx +61 -0
- package/src/components/ui/reference.story.tsx +33 -0
- package/src/components/ui/scroll-area.tsx +80 -0
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/separator.story.tsx +34 -0
- package/src/components/ui/tabs.tsx +120 -0
- package/src/components/ui/text.story.tsx +31 -0
- package/src/components/ui/textarea.story.tsx +34 -0
- package/src/components/ui/textarea.tsx +1 -1
- package/src/components/ui/toast.tsx +325 -0
- package/src/components/ui/toolbar.tsx +92 -0
- package/src/components/ui/tooltip.tsx +40 -39
- package/src/index.css +6 -250
- package/src/index.ts +25 -31
- package/src/lib/ease.ts +11 -0
- package/src/lib/hooks/use-mobile.ts +21 -0
- package/src/lib/keyed-atom.ts +60 -0
- package/src/lib/segmented-control.ts +42 -0
- package/src/{state → lib/state}/exegia-provider.tsx +5 -1
- package/src/lib/utils.ts +93 -1
- package/dist-lib/components/beste/piece/browser-frame.d.ts +0 -2
- package/dist-lib/components/beste/piece/type.d.ts +0 -9
- package/dist-lib/components/beste/piece/utils.d.ts +0 -3
- package/dist-lib/components/composed/user-avatar.d.ts +0 -7
- package/dist-lib/components/docs/component-preview.d.ts +0 -10
- package/dist-lib/components/docs/props-table.d.ts +0 -4
- package/dist-lib/components/ui/avatar.d.ts +0 -6
- package/dist-lib/components/ui/badge.d.ts +0 -7
- package/dist-lib/components/ui/tooltip.d.ts +0 -6
- package/dist-lib/components/user-avatar/audio-wave.d.ts +0 -2
- package/dist-lib/components/user-avatar/component.d.ts +0 -3
- package/dist-lib/components/user-avatar/fallback.d.ts +0 -5
- package/dist-lib/components/user-avatar/index.d.ts +0 -18
- package/dist-lib/components/user-avatar/presence-badge.d.ts +0 -16
- package/dist-lib/components/user-avatar/type.d.ts +0 -79
- package/dist-lib/components/user-avatar/use-user-avatar-state.d.ts +0 -26
- package/dist-lib/components/user-avatar/use-user-avatar.d.ts +0 -37
- package/dist-lib/components/user-avatar/user-avatar-atom.d.ts +0 -64
- package/dist-lib/components/user-avatar/utils.d.ts +0 -24
- package/src/components/beste/piece/browser-frame.tsx +0 -58
- package/src/components/beste/piece/type.ts +0 -11
- package/src/components/beste/piece/utils.ts +0 -21
- package/src/components/composed/__tests__/user-avatar.test.tsx +0 -85
- package/src/components/composed/user-avatar.tsx +0 -13
- package/src/components/docs/component-preview.tsx +0 -34
- package/src/components/docs/props-table.tsx +0 -35
- package/src/components/user-avatar/__tests__/user-avatar.test.tsx +0 -286
- package/src/components/user-avatar/audio-wave.tsx +0 -22
- package/src/components/user-avatar/component.tsx +0 -182
- package/src/components/user-avatar/fallback.tsx +0 -28
- package/src/components/user-avatar/index.ts +0 -34
- package/src/components/user-avatar/presence-badge.tsx +0 -56
- package/src/components/user-avatar/type.ts +0 -93
- package/src/components/user-avatar/use-user-avatar-state.ts +0 -60
- package/src/components/user-avatar/use-user-avatar.ts +0 -180
- package/src/components/user-avatar/user-avatar-atom.ts +0 -218
- package/src/components/user-avatar/utils.ts +0 -102
- /package/dist-lib/{components/blocks/auth/__tests__/auth-flow-block.test.d.ts → src/components/atoms/bubble/__tests__/bubble.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/auth-state-atom.test.d.ts → src/components/atoms/bubble/__tests__/reference.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/passkey-manager-block.test.d.ts → src/components/atoms/text/__tests__/text.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/linked-accounts-block.test.d.ts → src/components/atoms/text-selection/__tests__/click-popover.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/onboarding-block.test.d.ts → src/components/atoms/text-selection/__tests__/text-selection.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts → src/components/blocks/auth/__tests__/auth-flow-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/signup-block.test.d.ts → src/components/blocks/auth/__tests__/auth-state-atom.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/auth/__tests__/update-password-block.test.d.ts → src/components/blocks/auth/__tests__/linked-accounts-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.d.ts → src/components/blocks/auth/__tests__/onboarding-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/nav/sidebar/__tests__/ai-sidebar.test.d.ts → src/components/blocks/auth/__tests__/passkey-manager-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/nav/sidebar/__tests__/use-ai-sidebar.test.d.ts → src/components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/profile/__tests__/profile-card-block.test.d.ts → src/components/blocks/auth/__tests__/signup-block.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts → src/components/blocks/auth/__tests__/update-password-block.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-flow-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-flow-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-session-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-shell.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-state-type.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/auth-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/code-auth-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/forgot-password-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/linked-accounts-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/login-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/onboarding/profile-step.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/onboarding-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/passkey-manager-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/passkey-sign-in-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/signup-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/update-password-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/auth/use-auth-state.d.ts +0 -0
- /package/dist-lib/{components/blocks/scaffold/__tests__/scaffold.test.d.ts → src/components/blocks/chat/__tests__/ai-panel.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/layout.d.ts +0 -0
- /package/dist-lib/{components/blocks/shell/__tests__/shell-fit-atom.test.d.ts → src/components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/shell/__tests__/shell-layout.test.d.ts → src/components/blocks/nav/sidebar/__tests__/ai-sidebar.test.d.ts} +0 -0
- /package/dist-lib/{components/blocks/shell/__tests__/shell-metrics.test.d.ts → src/components/blocks/nav/sidebar/__tests__/use-ai-sidebar.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/ai-sidebar-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/ai-sidebar.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/marquee-label.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-context.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-icon.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-row.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/type.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/use-ai-sidebar-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/use-ai-sidebar.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/nav/sidebar/utils.d.ts +0 -0
- /package/dist-lib/{components/composed/__tests__/logo.test.d.ts → src/components/blocks/profile/__tests__/profile-card-block.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/profile/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/profile/profile-card-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/profile/use-profile-card-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/profile/use-profile-card.d.ts +0 -0
- /package/dist-lib/{components/composed/__tests__/user-avatar.test.d.ts → src/components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts} +0 -0
- /package/dist-lib/{components/composed/tree/__tests__/tree-atom.test.d.ts → src/components/blocks/scaffold/__tests__/scaffold.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/constants.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/panel-close-button.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/panel-menu-button.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-actions.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-canvas.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-context.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-inspector.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-main.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-panel.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-root.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-sidebar.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-sub-panel.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-tab.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/type.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/use-scaffold-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/use-scaffold.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/scaffold/utils.d.ts +0 -0
- /package/dist-lib/{components/composed/tree/__tests__/tree.test.d.ts → src/components/blocks/shell/__tests__/shell-fit-atom.test.d.ts} +0 -0
- /package/dist-lib/{components/composed/tree/__tests__/use-tree.test.d.ts → src/components/blocks/shell/__tests__/shell-layout.test.d.ts} +0 -0
- /package/dist-lib/{components/icons/__tests__/icons.test.d.ts → src/components/blocks/shell/__tests__/shell-metrics.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-inset.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-provider.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-trigger.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/animated-panel.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/shell-fit-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/shell-layout.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/shell-metrics.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/type.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/use-shell-fit-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/use-shell-fit.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/use-shell-panels.d.ts +0 -0
- /package/dist-lib/{components → src/components}/blocks/shell/utils.d.ts +0 -0
- /package/dist-lib/{components/motion/index.d.ts → src/components/composed/__tests__/logo.test.d.ts} +0 -0
- /package/dist-lib/{components/user-avatar/__tests__/user-avatar.test.d.ts → src/components/composed/action-bar/__tests__/action-bar.test.d.ts} +0 -0
- /package/dist-lib/{lib/utils.test.d.ts → src/components/composed/ai/__tests__/ai.test.d.ts} +0 -0
- /package/dist-lib/{components → src/components}/composed/logo.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/password-input.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/social-providers.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/constants.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/tree-atom.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/tree-context.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/tree-node.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/tree.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/type.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/use-tree-dnd.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/use-tree-state.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/use-tree.d.ts +0 -0
- /package/dist-lib/{components → src/components}/composed/tree/utils.d.ts +0 -0
- /package/dist-lib/{components → src/components}/docs/code-block.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-cfm.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-corpus.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-pdf.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-tei.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-tf.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-txt.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-badge-xml.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-cfm.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-corpus.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-pdf.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-tei.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-tf.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-txt.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/file-wordmark-xml.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/index.d.ts +0 -0
- /package/dist-lib/{components → src/components}/icons/types.d.ts +0 -0
- /package/dist-lib/{components → src/components}/motion/overflow-actions.d.ts +0 -0
- /package/dist-lib/{components → src/components}/motion/popover-morph.d.ts +0 -0
- /package/dist-lib/{components → src/components}/motion/popover-position.d.ts +0 -0
- /package/dist-lib/{components → src/components}/motion/shared-layout-bg.d.ts +0 -0
- /package/dist-lib/{components → src/components}/theme-provider.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/button-group.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/card.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/checkbox.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/field.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/frame.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/glasscn/glass-button-group.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/glasscn/glass-button.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/glasscn/glass-separator.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/glasscn/liquid-glass.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/group.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/input-group.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/input.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/label.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/menu.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/otp-field.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/separator.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/sheet.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/skeleton.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/spinner.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/switch.d.ts +0 -0
- /package/dist-lib/{components → src/components}/ui/textarea.d.ts +0 -0
- /package/dist-lib/{lib → src/lib}/auth-accent.d.ts +0 -0
- /package/dist-lib/{lib → src/lib}/glass-variants.d.ts +0 -0
- /package/dist-lib/{lib → src/lib}/hooks/use-hover-capable.d.ts +0 -0
- /package/dist-lib/{lib → src/lib}/sound.d.ts +0 -0
- /package/dist-lib/{state → src/lib/state}/exegia-provider.d.ts +0 -0
- /package/dist-lib/{state → src/lib/state}/index.d.ts +0 -0
- /package/dist-lib/{state → src/lib/state}/store.d.ts +0 -0
- /package/dist-lib/{lib → src/lib}/utils.d.ts +0 -0
- /package/src/{state → lib/state}/index.ts +0 -0
- /package/src/{state → lib/state}/store.ts +0 -0
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import type * as React from "react"
|
|
2
|
-
|
|
3
|
-
import type { AvatarPrimitive } from "@/components/ui/avatar"
|
|
4
|
-
|
|
5
|
-
export type ImageStatus = Parameters<
|
|
6
|
-
NonNullable<AvatarPrimitive.Image.Props["onLoadingStatusChange"]>
|
|
7
|
-
>[0]
|
|
8
|
-
|
|
9
|
-
/** Whether the person is reachable right now — drawn as the corner badge. */
|
|
10
|
-
export type UserPresence = "online" | "offline"
|
|
11
|
-
|
|
12
|
-
/** Key for one avatar's state in the store. Any stable string; `useUserAvatar`
|
|
13
|
-
* generates one when the component does not name itself. */
|
|
14
|
-
export type UserAvatarInstanceId = string
|
|
15
|
-
|
|
16
|
-
export interface UserAvatarProps extends Omit<
|
|
17
|
-
AvatarPrimitive.Root.Props,
|
|
18
|
-
"children"
|
|
19
|
-
> {
|
|
20
|
-
/** Image URL. Without one the initials show immediately — no skeleton. */
|
|
21
|
-
src?: string
|
|
22
|
-
/** Drives the initials, and the alt text unless `alt` overrides it. */
|
|
23
|
-
name?: string
|
|
24
|
-
/** Overrides the initials derived from `name`. */
|
|
25
|
-
initials?: string
|
|
26
|
-
/**
|
|
27
|
-
* Alt text for the image. Pass "" when adjacent text already names the
|
|
28
|
-
* person — the image is then decorative.
|
|
29
|
-
*/
|
|
30
|
-
alt?: string
|
|
31
|
-
/**
|
|
32
|
-
* Force the skeleton, for when the identity itself is still being fetched.
|
|
33
|
-
* Omitted, it follows the image: a passed `src` skeletons until it resolves.
|
|
34
|
-
*/
|
|
35
|
-
loading?: boolean
|
|
36
|
-
/**
|
|
37
|
-
* Corner badge: a green dot for `online`, a hollow grey ring for `offline`.
|
|
38
|
-
* Omitted, no badge — unless the avatar is driven by id and something set
|
|
39
|
-
* its presence in the store. Controlled when passed.
|
|
40
|
-
*/
|
|
41
|
-
presence?: UserPresence
|
|
42
|
-
/**
|
|
43
|
-
* Embossed rim whose highlight follows the pointer, so the avatar reads as
|
|
44
|
-
* a lit bezel rather than a flat disc. Light and dark aware, and with a
|
|
45
|
-
* photo it samples the image's rim lightness (CORS permitting) to weight
|
|
46
|
-
* highlight against shadow, so the emboss reads on a dark portrait and a
|
|
47
|
-
* pale one alike. Static under reduced motion. On by default — pass
|
|
48
|
-
* `false` for a flat disc.
|
|
49
|
-
*/
|
|
50
|
-
bezel?: boolean
|
|
51
|
-
/**
|
|
52
|
-
* Name this avatar's slice of the store so `useUserAvatarState(id)` /
|
|
53
|
-
* `useUserAvatarActions(id)` can read or drive it from anywhere under
|
|
54
|
-
* `ExegiaProvider`. Unnamed avatars key off `useId` and are dropped on
|
|
55
|
-
* unmount.
|
|
56
|
-
*/
|
|
57
|
-
avatarId?: UserAvatarInstanceId
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Everything the store knows about one avatar. */
|
|
61
|
-
export interface UserAvatarState {
|
|
62
|
-
presence: UserPresence | null
|
|
63
|
-
/** Bezel light direction in degrees, clockwise from 12 o'clock. Continuous
|
|
64
|
-
* (may leave [0, 360)) so the rim's CSS rotation never spins the long way;
|
|
65
|
-
* `((a % 360) + 360) % 360` if you need it normalised. */
|
|
66
|
-
bezelAngle: number
|
|
67
|
-
imageStatus: ImageStatus
|
|
68
|
-
/** Perceived lightness of the loaded image's rim, 0 (black) → 1 (white),
|
|
69
|
-
* or `null` while unknown — no image yet, or one that could not be sampled
|
|
70
|
-
* (non-CORS host, no canvas). The bezel's highlight/shadow alphas follow
|
|
71
|
-
* it so the emboss reads on a dark photo and a pale one alike. */
|
|
72
|
-
imageTone: number | null
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** Write-only handles onto one avatar. Nothing here re-renders the caller. */
|
|
76
|
-
export interface UserAvatarActions {
|
|
77
|
-
setPresence: (presence: UserPresence | null) => void
|
|
78
|
-
togglePresence: () => void
|
|
79
|
-
setBezelAngle: (angle: number) => void
|
|
80
|
-
reset: () => void
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** @internal Which fields the mounted component controls from props. The
|
|
84
|
-
* store must never overwrite a controlled value. */
|
|
85
|
-
export interface UserAvatarConfig {
|
|
86
|
-
controlsPresence: boolean
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export interface IAudioWaveProps {
|
|
90
|
-
className?: string
|
|
91
|
-
children?: React.ReactNode
|
|
92
|
-
volume?: number
|
|
93
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { useAtomValue, useSetAtom } from "jotai"
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
UserAvatarActions,
|
|
8
|
-
UserAvatarInstanceId,
|
|
9
|
-
UserAvatarState,
|
|
10
|
-
} from "./type"
|
|
11
|
-
import {
|
|
12
|
-
resetUserAvatarAtom,
|
|
13
|
-
setUserAvatarBezelAngleAtom,
|
|
14
|
-
setUserAvatarPresenceAtom,
|
|
15
|
-
toggleUserAvatarPresenceAtom,
|
|
16
|
-
userAvatarStateAtom,
|
|
17
|
-
} from "./user-avatar-atom"
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Read the avatar registered under `avatarId` from anywhere below
|
|
21
|
-
* `ExegiaProvider` — no props, no ref, no provider of its own.
|
|
22
|
-
*
|
|
23
|
-
* ```tsx
|
|
24
|
-
* const { presence } = useUserAvatarState("me")
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* Returns the whole state object, so the caller re-renders on any change —
|
|
28
|
-
* including every bezel frame while a pointer moves. A component that only
|
|
29
|
-
* cares about presence should subscribe to that atom instead:
|
|
30
|
-
* `useAtomValue(userAvatarPresenceAtom("me"))`.
|
|
31
|
-
*/
|
|
32
|
-
export function useUserAvatarState(
|
|
33
|
-
avatarId: UserAvatarInstanceId
|
|
34
|
-
): UserAvatarState {
|
|
35
|
-
return useAtomValue(userAvatarStateAtom(avatarId))
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Write-only handles onto the avatar registered under `avatarId`. Nothing
|
|
40
|
-
* here subscribes, so a presence indicator elsewhere in the app can flip
|
|
41
|
-
* the badge without re-rendering when the avatar changes.
|
|
42
|
-
*
|
|
43
|
-
* ```tsx
|
|
44
|
-
* const { setPresence } = useUserAvatarActions("me")
|
|
45
|
-
* socket.on("presence", (p) => setPresence(p))
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export function useUserAvatarActions(
|
|
49
|
-
avatarId: UserAvatarInstanceId
|
|
50
|
-
): UserAvatarActions {
|
|
51
|
-
const setPresence = useSetAtom(setUserAvatarPresenceAtom(avatarId))
|
|
52
|
-
const togglePresence = useSetAtom(toggleUserAvatarPresenceAtom(avatarId))
|
|
53
|
-
const setBezelAngle = useSetAtom(setUserAvatarBezelAngleAtom(avatarId))
|
|
54
|
-
const reset = useSetAtom(resetUserAvatarAtom(avatarId))
|
|
55
|
-
|
|
56
|
-
return React.useMemo(
|
|
57
|
-
() => ({ setPresence, togglePresence, setBezelAngle, reset }),
|
|
58
|
-
[setPresence, togglePresence, setBezelAngle, reset]
|
|
59
|
-
)
|
|
60
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import * as React from "react"
|
|
4
|
-
import { useAtomValue, useSetAtom } from "jotai"
|
|
5
|
-
import { useReducedMotion } from "motion/react"
|
|
6
|
-
|
|
7
|
-
import type {
|
|
8
|
-
ImageStatus,
|
|
9
|
-
UserAvatarConfig,
|
|
10
|
-
UserAvatarInstanceId,
|
|
11
|
-
UserPresence,
|
|
12
|
-
} from "./type"
|
|
13
|
-
import {
|
|
14
|
-
projectUserAvatarPropsAtom,
|
|
15
|
-
removeUserAvatarInstance,
|
|
16
|
-
setUserAvatarBezelAngleAtom,
|
|
17
|
-
setUserAvatarImageStatusAtom,
|
|
18
|
-
setUserAvatarImageToneAtom,
|
|
19
|
-
userAvatarBezelAngleAtom,
|
|
20
|
-
userAvatarImageStatusAtom,
|
|
21
|
-
userAvatarImageToneAtom,
|
|
22
|
-
userAvatarPresenceAtom,
|
|
23
|
-
} from "./user-avatar-atom"
|
|
24
|
-
import { measureRimTone } from "./utils"
|
|
25
|
-
|
|
26
|
-
export interface UseUserAvatarOptions {
|
|
27
|
-
avatarId?: UserAvatarInstanceId
|
|
28
|
-
/** Controlled presence. `undefined` leaves the store in charge. */
|
|
29
|
-
presence?: UserPresence
|
|
30
|
-
/** Track the pointer for the bezel highlight. */
|
|
31
|
-
bezel: boolean
|
|
32
|
-
/** Only meaningful with an image — no image, no status to track. */
|
|
33
|
-
hasImage: boolean
|
|
34
|
-
/** The image URL, sampled for its rim lightness once it has loaded so the
|
|
35
|
-
* bezel can pick alphas that read against it. Omit to skip sampling. */
|
|
36
|
-
src?: string
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface UserAvatarBinding {
|
|
40
|
-
avatarId: UserAvatarInstanceId
|
|
41
|
-
presence: UserPresence | null
|
|
42
|
-
bezelAngle: number
|
|
43
|
-
imageStatus: ImageStatus
|
|
44
|
-
/** Rim lightness of the loaded image, 0–1, or `null` while unknown. */
|
|
45
|
-
imageTone: number | null
|
|
46
|
-
/** Hand to the image's `onLoadingStatusChange`. Stable. */
|
|
47
|
-
setImageStatus: (status: ImageStatus) => void
|
|
48
|
-
/** Attach to the avatar root — the bezel is lit relative to its centre. */
|
|
49
|
-
ref: React.RefObject<HTMLElement | null>
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Below this the angle write is skipped: a rim highlight cannot show a
|
|
53
|
-
* sub-degree change, and skipping keeps the pointer loop store-quiet. */
|
|
54
|
-
const ANGLE_EPSILON = 1.5
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Binds one avatar to its slice of the store: projects the controlled
|
|
58
|
-
* `presence` prop, tracks the image status, and — while `bezel` is on —
|
|
59
|
-
* follows the pointer with a rAF-coalesced `pointermove` listener that turns
|
|
60
|
-
* the pointer's bearing from the avatar's centre into `bezelAngle`.
|
|
61
|
-
*
|
|
62
|
-
* Unnamed avatars key off `useId` and are dropped from the store on unmount;
|
|
63
|
-
* a named `avatarId` outlives its component so a presence set elsewhere
|
|
64
|
-
* survives a remount.
|
|
65
|
-
*/
|
|
66
|
-
export function useUserAvatar(options: UseUserAvatarOptions): UserAvatarBinding {
|
|
67
|
-
const { presence: presenceProp, bezel, hasImage, src } = options
|
|
68
|
-
const generatedId = React.useId()
|
|
69
|
-
const avatarId = options.avatarId ?? generatedId
|
|
70
|
-
const controlsPresence = presenceProp !== undefined
|
|
71
|
-
|
|
72
|
-
const config = React.useMemo<UserAvatarConfig>(
|
|
73
|
-
() => ({ controlsPresence }),
|
|
74
|
-
[controlsPresence]
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
const project = useSetAtom(projectUserAvatarPropsAtom(avatarId))
|
|
78
|
-
const setBezelAngle = useSetAtom(setUserAvatarBezelAngleAtom(avatarId))
|
|
79
|
-
const setImageStatus = useSetAtom(setUserAvatarImageStatusAtom(avatarId))
|
|
80
|
-
const setImageTone = useSetAtom(setUserAvatarImageToneAtom(avatarId))
|
|
81
|
-
|
|
82
|
-
// Layout effect: the projection must land before children read the store
|
|
83
|
-
// in the same commit. Primitive deps, so no loop guard is needed here.
|
|
84
|
-
React.useLayoutEffect(() => {
|
|
85
|
-
project(config, presenceProp)
|
|
86
|
-
}, [project, config, presenceProp])
|
|
87
|
-
|
|
88
|
-
// A generated key belongs to this mount only; a given `avatarId` is the
|
|
89
|
-
// app's handle and outlives it.
|
|
90
|
-
React.useEffect(() => {
|
|
91
|
-
if (options.avatarId !== undefined) return
|
|
92
|
-
return () => removeUserAvatarInstance(avatarId)
|
|
93
|
-
}, [options.avatarId, avatarId])
|
|
94
|
-
|
|
95
|
-
const presence = useAtomValue(userAvatarPresenceAtom(avatarId))
|
|
96
|
-
const bezelAngle = useAtomValue(userAvatarBezelAngleAtom(avatarId))
|
|
97
|
-
const imageStatus = useAtomValue(userAvatarImageStatusAtom(avatarId))
|
|
98
|
-
const imageTone = useAtomValue(userAvatarImageToneAtom(avatarId))
|
|
99
|
-
|
|
100
|
-
const ref = React.useRef<HTMLElement | null>(null)
|
|
101
|
-
const reduce = useReducedMotion()
|
|
102
|
-
|
|
103
|
-
// Pointer → bearing. Coalesced to one write per animation frame, and only
|
|
104
|
-
// when the angle moved enough to matter, so a room full of avatars is
|
|
105
|
-
// still one cheap listener each and near-zero store traffic while idle.
|
|
106
|
-
React.useEffect(() => {
|
|
107
|
-
if (!bezel || reduce || typeof window === "undefined") return
|
|
108
|
-
let frame = 0
|
|
109
|
-
let last = Number.NaN
|
|
110
|
-
let pointer: { x: number; y: number } | null = null
|
|
111
|
-
|
|
112
|
-
const flush = () => {
|
|
113
|
-
frame = 0
|
|
114
|
-
const host = ref.current
|
|
115
|
-
if (!host || !pointer) return
|
|
116
|
-
const rect = host.getBoundingClientRect()
|
|
117
|
-
if (rect.width === 0) return
|
|
118
|
-
const dx = pointer.x - (rect.left + rect.width / 2)
|
|
119
|
-
const dy = pointer.y - (rect.top + rect.height / 2)
|
|
120
|
-
// atan2 measures from 3 o'clock anticlockwise-positive in screen
|
|
121
|
-
// space; rotate so 0 is 12 o'clock and clockwise grows.
|
|
122
|
-
const bearing = ((Math.atan2(dy, dx) * 180) / Math.PI + 90 + 360) % 360
|
|
123
|
-
// Unwrap: step from the last value by the shortest arc, so the stored
|
|
124
|
-
// angle is continuous and the rim never spins the long way round.
|
|
125
|
-
let angle = bearing
|
|
126
|
-
if (!Number.isNaN(last)) {
|
|
127
|
-
let delta = bearing - (((last % 360) + 360) % 360)
|
|
128
|
-
if (delta > 180) delta -= 360
|
|
129
|
-
if (delta < -180) delta += 360
|
|
130
|
-
if (Math.abs(delta) < ANGLE_EPSILON) return
|
|
131
|
-
angle = last + delta
|
|
132
|
-
}
|
|
133
|
-
last = angle
|
|
134
|
-
setBezelAngle(angle)
|
|
135
|
-
}
|
|
136
|
-
const onMove = (event: PointerEvent) => {
|
|
137
|
-
pointer = { x: event.clientX, y: event.clientY }
|
|
138
|
-
if (frame === 0) frame = window.requestAnimationFrame(flush)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
window.addEventListener("pointermove", onMove, { passive: true })
|
|
142
|
-
return () => {
|
|
143
|
-
window.removeEventListener("pointermove", onMove)
|
|
144
|
-
if (frame !== 0) window.cancelAnimationFrame(frame)
|
|
145
|
-
}
|
|
146
|
-
}, [bezel, reduce, setBezelAngle])
|
|
147
|
-
|
|
148
|
-
// No image, no status: keep the store honest when `src` goes away.
|
|
149
|
-
React.useEffect(() => {
|
|
150
|
-
if (!hasImage) setImageStatus("idle")
|
|
151
|
-
}, [hasImage, setImageStatus])
|
|
152
|
-
|
|
153
|
-
// Once the image is on screen, read how light its rim is so the bezel's
|
|
154
|
-
// highlight and shadow can be weighted against it. Cleared whenever the
|
|
155
|
-
// image changes or goes away — a stale tone from the previous photo would
|
|
156
|
-
// light the new one wrong for a frame. Sampling is async (a second, CORS
|
|
157
|
-
// clean decode of the same URL, memoised per src); the cancelled flag
|
|
158
|
-
// keeps a slow sample from landing on a later src.
|
|
159
|
-
React.useEffect(() => {
|
|
160
|
-
setImageTone(null)
|
|
161
|
-
if (!bezel || !hasImage || !src || imageStatus !== "loaded") return
|
|
162
|
-
let cancelled = false
|
|
163
|
-
void measureRimTone(src).then((tone) => {
|
|
164
|
-
if (!cancelled) setImageTone(tone)
|
|
165
|
-
})
|
|
166
|
-
return () => {
|
|
167
|
-
cancelled = true
|
|
168
|
-
}
|
|
169
|
-
}, [bezel, hasImage, src, imageStatus, setImageTone])
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
avatarId,
|
|
173
|
-
presence,
|
|
174
|
-
bezelAngle,
|
|
175
|
-
imageStatus,
|
|
176
|
-
imageTone,
|
|
177
|
-
setImageStatus,
|
|
178
|
-
ref,
|
|
179
|
-
}
|
|
180
|
-
}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* User avatar state — Jotai atom families keyed by an avatar id.
|
|
3
|
-
*
|
|
4
|
-
* Follows the tree's layout (`components/composed/tree/tree-atom.ts`): one
|
|
5
|
-
* in-house `keyed()` family per field, write-only action atoms for every
|
|
6
|
-
* mutation, a composed read-only state atom, and `removeUserAvatarInstance`
|
|
7
|
-
* to drop an id from every family. Nothing here touches the DOM — the
|
|
8
|
-
* pointer maths that feeds `bezelAngle` lives in `use-user-avatar.ts`.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { atom } from "jotai"
|
|
12
|
-
import type { Getter, Setter } from "jotai"
|
|
13
|
-
|
|
14
|
-
import type {
|
|
15
|
-
ImageStatus,
|
|
16
|
-
UserAvatarConfig,
|
|
17
|
-
UserAvatarInstanceId,
|
|
18
|
-
UserAvatarState,
|
|
19
|
-
UserPresence,
|
|
20
|
-
} from "./type"
|
|
21
|
-
|
|
22
|
-
/** Light from the top-left, the classic emboss, until a pointer moves. */
|
|
23
|
-
export const DEFAULT_BEZEL_ANGLE = 315
|
|
24
|
-
|
|
25
|
-
const DEFAULT_CONFIG: UserAvatarConfig = { controlsPresence: false }
|
|
26
|
-
|
|
27
|
-
// ── families ───────────────────────────────────────────────────────────────
|
|
28
|
-
|
|
29
|
-
type Family<AtomType> = ((id: UserAvatarInstanceId) => AtomType) & {
|
|
30
|
-
remove: (id: UserAvatarInstanceId) => void
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const families: { remove: (id: UserAvatarInstanceId) => void }[] = []
|
|
34
|
-
|
|
35
|
-
function keyed<AtomType>(create: (id: UserAvatarInstanceId) => AtomType) {
|
|
36
|
-
const cache = new Map<UserAvatarInstanceId, AtomType>()
|
|
37
|
-
const family = ((id: UserAvatarInstanceId) => {
|
|
38
|
-
let instance = cache.get(id)
|
|
39
|
-
if (instance === undefined) {
|
|
40
|
-
instance = create(id)
|
|
41
|
-
cache.set(id, instance)
|
|
42
|
-
}
|
|
43
|
-
return instance
|
|
44
|
-
}) as Family<AtomType>
|
|
45
|
-
family.remove = (id: UserAvatarInstanceId) => {
|
|
46
|
-
cache.delete(id)
|
|
47
|
-
}
|
|
48
|
-
families.push(family)
|
|
49
|
-
return family
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function stateFamily<Value>(name: string, initialValue: Value) {
|
|
53
|
-
return keyed((id) => {
|
|
54
|
-
const instance = atom(initialValue)
|
|
55
|
-
instance.debugLabel = `userAvatar/${id}/${name}`
|
|
56
|
-
return instance
|
|
57
|
-
})
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function readFamily<Value>(
|
|
61
|
-
name: string,
|
|
62
|
-
read: (get: Getter, id: UserAvatarInstanceId) => Value
|
|
63
|
-
) {
|
|
64
|
-
return keyed((id) => {
|
|
65
|
-
const instance = atom((get) => read(get, id))
|
|
66
|
-
instance.debugLabel = `userAvatar/${id}/${name}`
|
|
67
|
-
return instance
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function actionFamily<Args extends unknown[]>(
|
|
72
|
-
name: string,
|
|
73
|
-
write: (
|
|
74
|
-
get: Getter,
|
|
75
|
-
set: Setter,
|
|
76
|
-
id: UserAvatarInstanceId,
|
|
77
|
-
...args: Args
|
|
78
|
-
) => void
|
|
79
|
-
) {
|
|
80
|
-
return keyed((id) => {
|
|
81
|
-
const instance = atom(null, (get, set, ...args: Args) =>
|
|
82
|
-
write(get, set, id, ...args)
|
|
83
|
-
)
|
|
84
|
-
instance.debugLabel = `userAvatar/${id}/${name}`
|
|
85
|
-
return instance
|
|
86
|
-
})
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ── primitives ─────────────────────────────────────────────────────────────
|
|
90
|
-
|
|
91
|
-
/** `null` = no badge. */
|
|
92
|
-
export const userAvatarPresenceAtom = stateFamily<UserPresence | null>(
|
|
93
|
-
"presence",
|
|
94
|
-
null
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
/** Degrees clockwise from 12 o'clock — where the bezel highlight sits. */
|
|
98
|
-
export const userAvatarBezelAngleAtom = stateFamily<number>(
|
|
99
|
-
"bezelAngle",
|
|
100
|
-
DEFAULT_BEZEL_ANGLE
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
export const userAvatarImageStatusAtom = stateFamily<ImageStatus>(
|
|
104
|
-
"imageStatus",
|
|
105
|
-
"idle"
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
/** Rim lightness of the loaded image, `null` until sampled (or unsampleable). */
|
|
109
|
-
export const userAvatarImageToneAtom = stateFamily<number | null>(
|
|
110
|
-
"imageTone",
|
|
111
|
-
null
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
/** @internal Which fields the mounted component controls from props. */
|
|
115
|
-
export const userAvatarConfigAtom = stateFamily<UserAvatarConfig>(
|
|
116
|
-
"config",
|
|
117
|
-
DEFAULT_CONFIG
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
// ── derived ────────────────────────────────────────────────────────────────
|
|
121
|
-
|
|
122
|
-
export const userAvatarIsOnlineAtom = readFamily(
|
|
123
|
-
"isOnline",
|
|
124
|
-
(get, id) => get(userAvatarPresenceAtom(id)) === "online"
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
/** Whole-state read for callers that want the object; field atoms above are
|
|
128
|
-
* cheaper for components that watch one thing. */
|
|
129
|
-
export const userAvatarStateAtom = readFamily<UserAvatarState>(
|
|
130
|
-
"state",
|
|
131
|
-
(get, id) => ({
|
|
132
|
-
presence: get(userAvatarPresenceAtom(id)),
|
|
133
|
-
bezelAngle: get(userAvatarBezelAngleAtom(id)),
|
|
134
|
-
imageStatus: get(userAvatarImageStatusAtom(id)),
|
|
135
|
-
imageTone: get(userAvatarImageToneAtom(id)),
|
|
136
|
-
})
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
// ── actions ────────────────────────────────────────────────────────────────
|
|
140
|
-
|
|
141
|
-
/** Inert while a `presence` prop controls the avatar — the prop is truth. */
|
|
142
|
-
export const setUserAvatarPresenceAtom = actionFamily<
|
|
143
|
-
[presence: UserPresence | null]
|
|
144
|
-
>("setPresence", (get, set, id, presence) => {
|
|
145
|
-
if (get(userAvatarConfigAtom(id)).controlsPresence) return
|
|
146
|
-
set(userAvatarPresenceAtom(id), presence)
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
/** online ⇄ offline; a badge-less avatar comes online. */
|
|
150
|
-
export const toggleUserAvatarPresenceAtom = actionFamily<[]>(
|
|
151
|
-
"togglePresence",
|
|
152
|
-
(get, set, id) => {
|
|
153
|
-
const next = get(userAvatarPresenceAtom(id)) === "online" ? "offline" : "online"
|
|
154
|
-
set(setUserAvatarPresenceAtom(id), next)
|
|
155
|
-
}
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
/** Stored as given — continuous, not wrapped into [0, 360): the rim is
|
|
159
|
-
* rotated with a CSS transition, and an unwrapped angle is what lets a
|
|
160
|
-
* 359° → 1° move take the short way round. Written on every pointer frame,
|
|
161
|
-
* so it stays a bare set — no config gate, no side effects. */
|
|
162
|
-
export const setUserAvatarBezelAngleAtom = actionFamily<[angle: number]>(
|
|
163
|
-
"setBezelAngle",
|
|
164
|
-
(_get, set, id, angle) => {
|
|
165
|
-
if (!Number.isFinite(angle)) return
|
|
166
|
-
set(userAvatarBezelAngleAtom(id), angle)
|
|
167
|
-
}
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
/** @internal Reported by the image element; drives the skeleton. */
|
|
171
|
-
export const setUserAvatarImageStatusAtom = actionFamily<[status: ImageStatus]>(
|
|
172
|
-
"setImageStatus",
|
|
173
|
-
(_get, set, id, status) => {
|
|
174
|
-
set(userAvatarImageStatusAtom(id), status)
|
|
175
|
-
}
|
|
176
|
-
)
|
|
177
|
-
|
|
178
|
-
/** @internal Written by the hook once the loaded image has been sampled;
|
|
179
|
-
* cleared (null) when the image changes or goes away. Clamped to [0, 1]. */
|
|
180
|
-
export const setUserAvatarImageToneAtom = actionFamily<[tone: number | null]>(
|
|
181
|
-
"setImageTone",
|
|
182
|
-
(_get, set, id, tone) => {
|
|
183
|
-
set(
|
|
184
|
-
userAvatarImageToneAtom(id),
|
|
185
|
-
tone === null || !Number.isFinite(tone) ? null : Math.min(1, Math.max(0, tone))
|
|
186
|
-
)
|
|
187
|
-
}
|
|
188
|
-
)
|
|
189
|
-
|
|
190
|
-
/** @internal Projection of the mounted component's controlled props. */
|
|
191
|
-
export const projectUserAvatarPropsAtom = actionFamily<
|
|
192
|
-
[config: UserAvatarConfig, presence: UserPresence | null | undefined]
|
|
193
|
-
>("projectProps", (get, set, id, config, presence) => {
|
|
194
|
-
const wasControlled = get(userAvatarConfigAtom(id)).controlsPresence
|
|
195
|
-
set(userAvatarConfigAtom(id), config)
|
|
196
|
-
if (config.controlsPresence) set(userAvatarPresenceAtom(id), presence ?? null)
|
|
197
|
-
// Releasing control (`presence` prop → undefined) clears the badge rather
|
|
198
|
-
// than leaving the last projected value stranded in the store — going
|
|
199
|
-
// from "online" to no presence is a real transition for a user object.
|
|
200
|
-
else if (wasControlled) set(userAvatarPresenceAtom(id), null)
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
export const resetUserAvatarAtom = actionFamily<[]>(
|
|
204
|
-
"reset",
|
|
205
|
-
(_get, set, id) => {
|
|
206
|
-
set(userAvatarPresenceAtom(id), null)
|
|
207
|
-
set(userAvatarBezelAngleAtom(id), DEFAULT_BEZEL_ANGLE)
|
|
208
|
-
set(userAvatarImageStatusAtom(id), "idle")
|
|
209
|
-
set(userAvatarImageToneAtom(id), null)
|
|
210
|
-
set(userAvatarConfigAtom(id), DEFAULT_CONFIG)
|
|
211
|
-
}
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
/** Forget an avatar entirely — every family drops the key so the store can
|
|
215
|
-
* release its state. Call on teardown of a named instance. */
|
|
216
|
-
export function removeUserAvatarInstance(id: UserAvatarInstanceId): void {
|
|
217
|
-
for (const family of families) family.remove(id)
|
|
218
|
-
}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/** "Jenny Hamilton" → "JH", "luna" → "L". */
|
|
2
|
-
export function initialsFrom(name: string): string {
|
|
3
|
-
const parts = name.trim().split(/\s+/).filter(Boolean)
|
|
4
|
-
if (parts.length === 0) return ""
|
|
5
|
-
const first = parts[0]?.[0] ?? ""
|
|
6
|
-
const last = parts.length > 1 ? (parts.at(-1)?.[0] ?? "") : ""
|
|
7
|
-
return (first + last).toUpperCase()
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** Sampling grid for `measureRimTone`. 16² px is enough to average a rim. */
|
|
11
|
-
const TONE_SAMPLE_SIZE = 16
|
|
12
|
-
/** Pixels this far (in radii) from the centre count as rim — the band the
|
|
13
|
-
* bezel sits on. Matches the ring's mask, which fades in from ~78%. */
|
|
14
|
-
const TONE_RIM_RADIUS = 0.6
|
|
15
|
-
|
|
16
|
-
const toneCache = new Map<string, Promise<number | null>>()
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Average perceived lightness, 0 (black) → 1 (white), of an image's outer
|
|
20
|
-
* band — the pixels the bezel ring overlays — or `null` when it cannot be
|
|
21
|
-
* measured: no DOM/canvas (SSR, test DOM), a decode failure, or a host
|
|
22
|
-
* without CORS headers (the sample needs a CORS-clean image; the avatar's
|
|
23
|
-
* own `<img>` is left untouched, so a non-CORS host still displays).
|
|
24
|
-
* Results are memoised per `src`, so a room of the same face samples once.
|
|
25
|
-
*/
|
|
26
|
-
export function measureRimTone(src: string): Promise<number | null> {
|
|
27
|
-
const cached = toneCache.get(src)
|
|
28
|
-
if (cached) return cached
|
|
29
|
-
const promise = new Promise<number | null>((resolve) => {
|
|
30
|
-
if (typeof document === "undefined" || typeof Image === "undefined") {
|
|
31
|
-
resolve(null)
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
const image = new Image()
|
|
35
|
-
image.crossOrigin = "anonymous"
|
|
36
|
-
image.decoding = "async"
|
|
37
|
-
image.onerror = () => resolve(null)
|
|
38
|
-
image.onload = () => {
|
|
39
|
-
try {
|
|
40
|
-
const size = TONE_SAMPLE_SIZE
|
|
41
|
-
const canvas = document.createElement("canvas")
|
|
42
|
-
canvas.width = size
|
|
43
|
-
canvas.height = size
|
|
44
|
-
const context = canvas.getContext("2d", { willReadFrequently: true })
|
|
45
|
-
if (!context) {
|
|
46
|
-
resolve(null)
|
|
47
|
-
return
|
|
48
|
-
}
|
|
49
|
-
context.drawImage(image, 0, 0, size, size)
|
|
50
|
-
const { data } = context.getImageData(0, 0, size, size)
|
|
51
|
-
const centre = (size - 1) / 2
|
|
52
|
-
const rim = TONE_RIM_RADIUS * centre
|
|
53
|
-
let sum = 0
|
|
54
|
-
let count = 0
|
|
55
|
-
for (let y = 0; y < size; y++) {
|
|
56
|
-
for (let x = 0; x < size; x++) {
|
|
57
|
-
const dx = x - centre
|
|
58
|
-
const dy = y - centre
|
|
59
|
-
if (dx * dx + dy * dy < rim * rim) continue
|
|
60
|
-
const offset = (y * size + x) * 4
|
|
61
|
-
const r = data[offset] ?? 0
|
|
62
|
-
const g = data[offset + 1] ?? 0
|
|
63
|
-
const b = data[offset + 2] ?? 0
|
|
64
|
-
// Rec. 709 luma on the gamma-encoded channels: close enough to
|
|
65
|
-
// perceived lightness for a "light or dark?" verdict.
|
|
66
|
-
sum += (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255
|
|
67
|
-
count++
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
resolve(count === 0 ? null : sum / count)
|
|
71
|
-
} catch {
|
|
72
|
-
// A tainted canvas throws on getImageData.
|
|
73
|
-
resolve(null)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
image.src = src
|
|
77
|
-
})
|
|
78
|
-
toneCache.set(src, promise)
|
|
79
|
-
// Only a real reading is worth keeping — a failed sample (flaky network,
|
|
80
|
-
// a host that gained CORS headers later) gets another go next mount.
|
|
81
|
-
void promise.then((tone) => {
|
|
82
|
-
if (tone === null) toneCache.delete(src)
|
|
83
|
-
})
|
|
84
|
-
return promise
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Bezel highlight/shadow alphas for an image whose rim lightness is `tone`
|
|
89
|
-
* (0 → 1). Against a dark rim the white highlight is eased off (it glares)
|
|
90
|
-
* and the black shadow pushed up (it has to darken mid-tones to register);
|
|
91
|
-
* against a pale rim the reverse — the highlight can be full (it barely
|
|
92
|
-
* shows) and the shadow is what carries the emboss, so it sits lighter.
|
|
93
|
-
* Linear between; the end points are tuned by eye on a dark and a light
|
|
94
|
-
* photo in both themes.
|
|
95
|
-
*/
|
|
96
|
-
export function bezelAlphasForTone(tone: number): { hi: number; lo: number } {
|
|
97
|
-
const t = Math.min(1, Math.max(0, tone))
|
|
98
|
-
return {
|
|
99
|
-
hi: 0.7 + 0.3 * t,
|
|
100
|
-
lo: 0.6 - 0.4 * t,
|
|
101
|
-
}
|
|
102
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|