@oxy.so/bloom 7.1.4 → 7.2.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/assets/character-runtime/README.md +19 -114
- package/assets/character-runtime/legacy-engine.mjs +54 -406
- package/assets/character-runtime/legacy-geometry.mjs +85 -242
- package/assets/character-runtime/legacy-worker.mjs +23 -82
- package/assets/character-runtime/managed-avatar.mjs +18 -12
- package/assets/character-runtime/render-budget.mjs +11 -6
- package/assets/character-runtime/runtime.mjs +295 -744
- package/docs/adoption-matrix.mdx +12 -11
- package/docs/agent-avatar.mdx +8 -45
- package/docs/agent-creator.mdx +3 -13
- package/docs/app-shell.mdx +26 -2
- package/docs/appearance.mdx +16 -1
- package/docs/content-panel.mdx +4 -0
- package/docs/mail-thread.mdx +8 -0
- package/docs/page-footer.mdx +60 -0
- package/docs/sidebar.mdx +1 -1
- package/lib/commonjs/agent-avatar/AgentAvatar.js +1 -1
- package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
- package/lib/commonjs/agent-avatar/CharacterAvatar.js +1 -2
- package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -1
- package/lib/commonjs/agent-avatar/config-character.js +0 -4
- package/lib/commonjs/agent-avatar/config-character.js.map +1 -1
- package/lib/commonjs/agent-avatar/legacy-recipe.js +6 -19
- package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -1
- package/lib/commonjs/agent-creator/AgentCreatorBase.js +107 -67
- package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
- package/lib/commonjs/agent-creator/CharacterControls.js +5 -23
- package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -1
- package/lib/commonjs/agent-creator/EmotionPicker.js +1 -8
- package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
- package/lib/commonjs/agent-creator/ShapeSilhouette.js +1 -8
- package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -1
- package/lib/commonjs/agent-creator/constants.js +17 -16
- package/lib/commonjs/agent-creator/constants.js.map +1 -1
- package/lib/commonjs/agent-creator/messages.js +1 -1
- package/lib/commonjs/agent-creator/messages.js.map +1 -1
- package/lib/commonjs/app-shell/AppShell.js +3 -2
- package/lib/commonjs/app-shell/AppShell.js.map +1 -1
- package/lib/commonjs/app-shell/AppShellBars.js +8 -5
- package/lib/commonjs/app-shell/AppShellBars.js.map +1 -1
- package/lib/commonjs/app-shell/AppShellEngine.js +81 -36
- package/lib/commonjs/app-shell/AppShellEngine.js.map +1 -1
- package/lib/commonjs/appearance/BloomScope.js +8 -3
- package/lib/commonjs/appearance/BloomScope.js.map +1 -1
- package/lib/commonjs/appearance/context.js.map +1 -1
- package/lib/commonjs/content-panel/ContentPanel.js +34 -23
- package/lib/commonjs/content-panel/ContentPanel.js.map +1 -1
- package/lib/commonjs/content-panel/ContentPanel.web.js +39 -17
- package/lib/commonjs/content-panel/ContentPanel.web.js.map +1 -1
- package/lib/commonjs/design-tokens/shapes.js +2 -2
- package/lib/commonjs/design-tokens/shapes.js.map +1 -1
- package/lib/commonjs/design-tokens/tokens.json +2 -2
- package/lib/commonjs/index.js +939 -927
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +939 -927
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/locale/translations/ar.js +1 -1
- package/lib/commonjs/locale/translations/ar.js.map +1 -1
- package/lib/commonjs/locale/translations/bn.js +1 -1
- package/lib/commonjs/locale/translations/bn.js.map +1 -1
- package/lib/commonjs/locale/translations/ca.js +1 -1
- package/lib/commonjs/locale/translations/ca.js.map +1 -1
- package/lib/commonjs/locale/translations/de.js +1 -1
- package/lib/commonjs/locale/translations/de.js.map +1 -1
- package/lib/commonjs/locale/translations/es.js +1 -1
- package/lib/commonjs/locale/translations/es.js.map +1 -1
- package/lib/commonjs/locale/translations/fr.js +1 -1
- package/lib/commonjs/locale/translations/fr.js.map +1 -1
- package/lib/commonjs/locale/translations/hi.js +1 -1
- package/lib/commonjs/locale/translations/hi.js.map +1 -1
- package/lib/commonjs/locale/translations/id.js +1 -1
- package/lib/commonjs/locale/translations/id.js.map +1 -1
- package/lib/commonjs/locale/translations/it.js +1 -1
- package/lib/commonjs/locale/translations/it.js.map +1 -1
- package/lib/commonjs/locale/translations/ja.js +1 -1
- package/lib/commonjs/locale/translations/ja.js.map +1 -1
- package/lib/commonjs/locale/translations/pt.js +1 -1
- package/lib/commonjs/locale/translations/pt.js.map +1 -1
- package/lib/commonjs/locale/translations/ru.js +1 -1
- package/lib/commonjs/locale/translations/ru.js.map +1 -1
- package/lib/commonjs/locale/translations/tr.js +1 -1
- package/lib/commonjs/locale/translations/tr.js.map +1 -1
- package/lib/commonjs/locale/translations/zh.js +1 -1
- package/lib/commonjs/locale/translations/zh.js.map +1 -1
- package/lib/commonjs/mail-thread/MailMessage.js +8 -14
- package/lib/commonjs/mail-thread/MailMessage.js.map +1 -1
- package/lib/commonjs/mail-thread/MailThread.js +6 -2
- package/lib/commonjs/mail-thread/MailThread.js.map +1 -1
- package/lib/commonjs/mail-thread/shared.js +2 -1
- package/lib/commonjs/mail-thread/shared.js.map +1 -1
- package/lib/commonjs/page-footer/PageFooter.js +137 -0
- package/lib/commonjs/page-footer/PageFooter.js.map +1 -0
- package/lib/commonjs/page-footer/PageFooterProvider.js +22 -0
- package/lib/commonjs/page-footer/PageFooterProvider.js.map +1 -0
- package/lib/commonjs/page-footer/context.js +11 -0
- package/lib/commonjs/page-footer/context.js.map +1 -0
- package/lib/commonjs/page-footer/index.js +27 -0
- package/lib/commonjs/page-footer/index.js.map +1 -0
- package/lib/commonjs/page-footer/types.js +6 -0
- package/lib/commonjs/page-footer/types.js.map +1 -0
- package/lib/commonjs/page-footer/use-page-footer-inset.js +19 -0
- package/lib/commonjs/page-footer/use-page-footer-inset.js.map +1 -0
- package/lib/commonjs/sidebar/Sidebar.js +6 -5
- package/lib/commonjs/sidebar/Sidebar.js.map +1 -1
- package/lib/commonjs/styles/panel-chrome.js +15 -1
- package/lib/commonjs/styles/panel-chrome.js.map +1 -1
- package/lib/module/agent-avatar/AgentAvatar.js +1 -1
- package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
- package/lib/module/agent-avatar/CharacterAvatar.js +1 -2
- package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -1
- package/lib/module/agent-avatar/config-character.js +0 -4
- package/lib/module/agent-avatar/config-character.js.map +1 -1
- package/lib/module/agent-avatar/legacy-recipe.js +6 -19
- package/lib/module/agent-avatar/legacy-recipe.js.map +1 -1
- package/lib/module/agent-creator/AgentCreatorBase.js +109 -69
- package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
- package/lib/module/agent-creator/CharacterControls.js +6 -24
- package/lib/module/agent-creator/CharacterControls.js.map +1 -1
- package/lib/module/agent-creator/EmotionPicker.js +1 -8
- package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
- package/lib/module/agent-creator/ShapeSilhouette.js +1 -8
- package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -1
- package/lib/module/agent-creator/constants.js +16 -8
- package/lib/module/agent-creator/constants.js.map +1 -1
- package/lib/module/agent-creator/messages.js +1 -1
- package/lib/module/agent-creator/messages.js.map +1 -1
- package/lib/module/app-shell/AppShell.js +3 -2
- package/lib/module/app-shell/AppShell.js.map +1 -1
- package/lib/module/app-shell/AppShellBars.js +8 -5
- package/lib/module/app-shell/AppShellBars.js.map +1 -1
- package/lib/module/app-shell/AppShellEngine.js +81 -36
- package/lib/module/app-shell/AppShellEngine.js.map +1 -1
- package/lib/module/appearance/BloomScope.js +8 -3
- package/lib/module/appearance/BloomScope.js.map +1 -1
- package/lib/module/appearance/context.js.map +1 -1
- package/lib/module/content-panel/ContentPanel.js +35 -24
- package/lib/module/content-panel/ContentPanel.js.map +1 -1
- package/lib/module/content-panel/ContentPanel.web.js +41 -19
- package/lib/module/content-panel/ContentPanel.web.js.map +1 -1
- package/lib/module/design-tokens/shapes.js +2 -2
- package/lib/module/design-tokens/shapes.js.map +1 -1
- package/lib/module/design-tokens/tokens.json +2 -2
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +1 -0
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/locale/translations/ar.js +1 -1
- package/lib/module/locale/translations/ar.js.map +1 -1
- package/lib/module/locale/translations/bn.js +1 -1
- package/lib/module/locale/translations/bn.js.map +1 -1
- package/lib/module/locale/translations/ca.js +1 -1
- package/lib/module/locale/translations/ca.js.map +1 -1
- package/lib/module/locale/translations/de.js +1 -1
- package/lib/module/locale/translations/de.js.map +1 -1
- package/lib/module/locale/translations/es.js +1 -1
- package/lib/module/locale/translations/es.js.map +1 -1
- package/lib/module/locale/translations/fr.js +1 -1
- package/lib/module/locale/translations/fr.js.map +1 -1
- package/lib/module/locale/translations/hi.js +1 -1
- package/lib/module/locale/translations/hi.js.map +1 -1
- package/lib/module/locale/translations/id.js +1 -1
- package/lib/module/locale/translations/id.js.map +1 -1
- package/lib/module/locale/translations/it.js +1 -1
- package/lib/module/locale/translations/it.js.map +1 -1
- package/lib/module/locale/translations/ja.js +1 -1
- package/lib/module/locale/translations/ja.js.map +1 -1
- package/lib/module/locale/translations/pt.js +1 -1
- package/lib/module/locale/translations/pt.js.map +1 -1
- package/lib/module/locale/translations/ru.js +1 -1
- package/lib/module/locale/translations/ru.js.map +1 -1
- package/lib/module/locale/translations/tr.js +1 -1
- package/lib/module/locale/translations/tr.js.map +1 -1
- package/lib/module/locale/translations/zh.js +1 -1
- package/lib/module/locale/translations/zh.js.map +1 -1
- package/lib/module/mail-thread/MailMessage.js +8 -14
- package/lib/module/mail-thread/MailMessage.js.map +1 -1
- package/lib/module/mail-thread/MailThread.js +6 -2
- package/lib/module/mail-thread/MailThread.js.map +1 -1
- package/lib/module/mail-thread/shared.js +2 -1
- package/lib/module/mail-thread/shared.js.map +1 -1
- package/lib/module/page-footer/PageFooter.js +132 -0
- package/lib/module/page-footer/PageFooter.js.map +1 -0
- package/lib/module/page-footer/PageFooterProvider.js +18 -0
- package/lib/module/page-footer/PageFooterProvider.js.map +1 -0
- package/lib/module/page-footer/context.js +7 -0
- package/lib/module/page-footer/context.js.map +1 -0
- package/lib/module/page-footer/index.js +6 -0
- package/lib/module/page-footer/index.js.map +1 -0
- package/lib/module/page-footer/types.js +4 -0
- package/lib/module/page-footer/types.js.map +1 -0
- package/lib/module/page-footer/use-page-footer-inset.js +16 -0
- package/lib/module/page-footer/use-page-footer-inset.js.map +1 -0
- package/lib/module/sidebar/Sidebar.js +6 -5
- package/lib/module/sidebar/Sidebar.js.map +1 -1
- package/lib/module/styles/panel-chrome.js +14 -1
- package/lib/module/styles/panel-chrome.js.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +0 -4
- package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +10 -2
- package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +1 -2
- package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +0 -1
- package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/constants.d.ts +15 -7
- package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/AppShellBars.d.ts +4 -0
- package/lib/typescript/commonjs/app-shell/AppShellBars.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/AppShellEngine.d.ts.map +1 -1
- package/lib/typescript/commonjs/app-shell/types.d.ts +11 -3
- package/lib/typescript/commonjs/app-shell/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/appearance/BloomScope.d.ts +1 -1
- package/lib/typescript/commonjs/appearance/BloomScope.d.ts.map +1 -1
- package/lib/typescript/commonjs/appearance/context.d.ts +2 -2
- package/lib/typescript/commonjs/appearance/context.d.ts.map +1 -1
- package/lib/typescript/commonjs/appearance/types.d.ts +4 -1
- package/lib/typescript/commonjs/appearance/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/ContentPanel.d.ts +3 -4
- package/lib/typescript/commonjs/content-panel/ContentPanel.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/ContentPanel.web.d.ts +1 -1
- package/lib/typescript/commonjs/content-panel/ContentPanel.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/content-panel/types.d.ts +2 -2
- package/lib/typescript/commonjs/design-tokens/shapes.d.ts +2 -2
- package/lib/typescript/commonjs/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.web.d.ts +1 -0
- package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/mail-thread/MailMessage.d.ts.map +1 -1
- package/lib/typescript/commonjs/mail-thread/MailThread.d.ts +1 -1
- package/lib/typescript/commonjs/mail-thread/MailThread.d.ts.map +1 -1
- package/lib/typescript/commonjs/mail-thread/shared.d.ts +1 -1
- package/lib/typescript/commonjs/mail-thread/shared.d.ts.map +1 -1
- package/lib/typescript/commonjs/mail-thread/types.d.ts +2 -0
- package/lib/typescript/commonjs/mail-thread/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/page-footer/PageFooter.d.ts +7 -0
- package/lib/typescript/commonjs/page-footer/PageFooter.d.ts.map +1 -0
- package/lib/typescript/commonjs/page-footer/PageFooterProvider.d.ts +4 -0
- package/lib/typescript/commonjs/page-footer/PageFooterProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/page-footer/context.d.ts +3 -0
- package/lib/typescript/commonjs/page-footer/context.d.ts.map +1 -0
- package/lib/typescript/commonjs/page-footer/index.d.ts +5 -0
- package/lib/typescript/commonjs/page-footer/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/page-footer/types.d.ts +26 -0
- package/lib/typescript/commonjs/page-footer/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/page-footer/use-page-footer-inset.d.ts +7 -0
- package/lib/typescript/commonjs/page-footer/use-page-footer-inset.d.ts.map +1 -0
- package/lib/typescript/commonjs/sidebar/Sidebar.d.ts.map +1 -1
- package/lib/typescript/commonjs/sidebar/types.d.ts +1 -1
- package/lib/typescript/commonjs/styles/panel-chrome.d.ts +5 -0
- package/lib/typescript/commonjs/styles/panel-chrome.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/config-character.d.ts +0 -4
- package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +10 -2
- package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/CharacterControls.d.ts +1 -2
- package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +0 -1
- package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/constants.d.ts +15 -7
- package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/AppShellBars.d.ts +4 -0
- package/lib/typescript/module/app-shell/AppShellBars.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/AppShellEngine.d.ts.map +1 -1
- package/lib/typescript/module/app-shell/types.d.ts +11 -3
- package/lib/typescript/module/app-shell/types.d.ts.map +1 -1
- package/lib/typescript/module/appearance/BloomScope.d.ts +1 -1
- package/lib/typescript/module/appearance/BloomScope.d.ts.map +1 -1
- package/lib/typescript/module/appearance/context.d.ts +2 -2
- package/lib/typescript/module/appearance/context.d.ts.map +1 -1
- package/lib/typescript/module/appearance/types.d.ts +4 -1
- package/lib/typescript/module/appearance/types.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/ContentPanel.d.ts +3 -4
- package/lib/typescript/module/content-panel/ContentPanel.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/ContentPanel.web.d.ts +1 -1
- package/lib/typescript/module/content-panel/ContentPanel.web.d.ts.map +1 -1
- package/lib/typescript/module/content-panel/types.d.ts +2 -2
- package/lib/typescript/module/design-tokens/shapes.d.ts +2 -2
- package/lib/typescript/module/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/index.web.d.ts +1 -0
- package/lib/typescript/module/index.web.d.ts.map +1 -1
- package/lib/typescript/module/mail-thread/MailMessage.d.ts.map +1 -1
- package/lib/typescript/module/mail-thread/MailThread.d.ts +1 -1
- package/lib/typescript/module/mail-thread/MailThread.d.ts.map +1 -1
- package/lib/typescript/module/mail-thread/shared.d.ts +1 -1
- package/lib/typescript/module/mail-thread/shared.d.ts.map +1 -1
- package/lib/typescript/module/mail-thread/types.d.ts +2 -0
- package/lib/typescript/module/mail-thread/types.d.ts.map +1 -1
- package/lib/typescript/module/page-footer/PageFooter.d.ts +7 -0
- package/lib/typescript/module/page-footer/PageFooter.d.ts.map +1 -0
- package/lib/typescript/module/page-footer/PageFooterProvider.d.ts +4 -0
- package/lib/typescript/module/page-footer/PageFooterProvider.d.ts.map +1 -0
- package/lib/typescript/module/page-footer/context.d.ts +3 -0
- package/lib/typescript/module/page-footer/context.d.ts.map +1 -0
- package/lib/typescript/module/page-footer/index.d.ts +5 -0
- package/lib/typescript/module/page-footer/index.d.ts.map +1 -0
- package/lib/typescript/module/page-footer/types.d.ts +26 -0
- package/lib/typescript/module/page-footer/types.d.ts.map +1 -0
- package/lib/typescript/module/page-footer/use-page-footer-inset.d.ts +7 -0
- package/lib/typescript/module/page-footer/use-page-footer-inset.d.ts.map +1 -0
- package/lib/typescript/module/sidebar/Sidebar.d.ts.map +1 -1
- package/lib/typescript/module/sidebar/types.d.ts +1 -1
- package/lib/typescript/module/styles/panel-chrome.d.ts +5 -0
- package/lib/typescript/module/styles/panel-chrome.d.ts.map +1 -1
- package/package.json +18 -1
- package/src/__tests__/support/adoption-matrix.ts +683 -0
- package/src/__tests__/support/card-surface.ts +25 -0
- package/src/__tests__/support/collision-fixture-barrel.ts +20 -0
- package/src/__tests__/support/commerce-harness.tsx +97 -0
- package/src/__tests__/support/composite.ts +68 -0
- package/src/__tests__/support/constructed-style-sheets.ts +68 -0
- package/src/__tests__/support/messages-in.ts +10 -0
- package/src/__tests__/support/press-host.ts +30 -0
- package/src/__tests__/support/rendered-style.ts +99 -0
- package/src/__tests__/support/unread-hook-fixture.ts +33 -0
- package/src/__tests__/support/worklet-capture-fixture.tsx +28 -0
- package/src/agent-avatar/AgentAvatar.tsx +1 -1
- package/src/agent-avatar/CharacterAvatar.tsx +1 -4
- package/src/agent-avatar/__tests__/artwork-golden.json +774 -0
- package/src/agent-avatar/config-character.ts +6 -39
- package/src/agent-avatar/legacy-recipe.ts +6 -34
- package/src/agent-creator/AgentCreatorBase.tsx +152 -121
- package/src/agent-creator/CharacterControls.tsx +14 -39
- package/src/agent-creator/EmotionPicker.tsx +16 -55
- package/src/agent-creator/ShapeSilhouette.tsx +1 -16
- package/src/agent-creator/__tests__/support/character-runtime-fixture.tsx +26 -0
- package/src/agent-creator/constants.ts +14 -47
- package/src/agent-creator/messages.ts +1 -2
- package/src/app-shell/AppShell.tsx +2 -2
- package/src/app-shell/AppShellBars.tsx +6 -4
- package/src/app-shell/AppShellEngine.tsx +51 -18
- package/src/app-shell/types.ts +11 -3
- package/src/appearance/BloomScope.tsx +5 -2
- package/src/appearance/context.ts +2 -2
- package/src/appearance/types.ts +4 -1
- package/src/content-panel/ContentPanel.tsx +32 -25
- package/src/content-panel/ContentPanel.web.tsx +32 -23
- package/src/content-panel/types.ts +2 -2
- package/src/design-tokens/shapes.ts +1 -1
- package/src/design-tokens/tokens.json +2 -2
- package/src/index.ts +1 -0
- package/src/index.web.ts +1 -0
- package/src/locale/translations/ar.ts +1 -1
- package/src/locale/translations/bn.ts +1 -1
- package/src/locale/translations/ca.ts +1 -1
- package/src/locale/translations/de.ts +1 -1
- package/src/locale/translations/es.ts +1 -1
- package/src/locale/translations/fr.ts +1 -1
- package/src/locale/translations/hi.ts +1 -1
- package/src/locale/translations/id.ts +1 -1
- package/src/locale/translations/it.ts +1 -1
- package/src/locale/translations/ja.ts +1 -1
- package/src/locale/translations/pt.ts +1 -1
- package/src/locale/translations/ru.ts +1 -1
- package/src/locale/translations/tr.ts +1 -1
- package/src/locale/translations/zh.ts +1 -1
- package/src/mail-thread/MailMessage.tsx +9 -11
- package/src/mail-thread/MailThread.tsx +3 -1
- package/src/mail-thread/shared.ts +2 -1
- package/src/mail-thread/types.ts +2 -0
- package/src/page-footer/PageFooter.tsx +96 -0
- package/src/page-footer/PageFooterProvider.tsx +9 -0
- package/src/page-footer/context.ts +6 -0
- package/src/page-footer/index.ts +4 -0
- package/src/page-footer/types.ts +26 -0
- package/src/page-footer/use-page-footer-inset.ts +17 -0
- package/src/sidebar/Sidebar.tsx +5 -4
- package/src/sidebar/types.ts +1 -1
- package/src/styles/panel-chrome.ts +9 -1
- package/src/theme/__tests__/__fixtures__/golden-resolved-tokens.json +9346 -0
- package/src/theme/__tests__/__fixtures__/tonal-glass-primary-failures.json +69 -0
- package/src/theme/__tests__/fixtures/color-engine-golden.json +1 -0
- package/assets/character-runtime/authored-parts.mjs +0 -754
- package/assets/character-runtime/catalog-parts.mjs +0 -362
- package/assets/character-runtime/character-recipe.mjs +0 -247
- package/assets/character-runtime/clippo-geometry.mjs +0 -679
- package/assets/character-runtime/controller-mode.mjs +0 -208
- package/assets/character-runtime/cyclops-geometry.mjs +0 -180
- package/assets/character-runtime/migrated-contours.mjs +0 -2067
- package/assets/character-runtime/migrated-faces.mjs +0 -59
- package/assets/character-runtime/pose-transition.mjs +0 -523
- package/assets/character-runtime/preparation-cache.mjs +0 -60
- package/assets/character-runtime/render-errors.mjs +0 -180
- package/assets/character-runtime/resolution.mjs +0 -10
- package/assets/character-runtime/sha256.mjs +0 -44
- package/assets/character-runtime/shared-programs.mjs +0 -534
- package/assets/character-runtime/shared-surface.mjs +0 -490
- package/assets/character-runtime/shared-textures.mjs +0 -420
- package/assets/character-runtime/thumbnails/eyes/todd.png +0 -0
- package/lib/commonjs/agent-avatar/character-colors.js +0 -19
- package/lib/commonjs/agent-avatar/character-colors.js.map +0 -1
- package/lib/commonjs/agent-avatar/character-shapes.js +0 -106
- package/lib/commonjs/agent-avatar/character-shapes.js.map +0 -1
- package/lib/commonjs/agent-creator/ClippoArtwork.js +0 -63
- package/lib/commonjs/agent-creator/ClippoArtwork.js.map +0 -1
- package/lib/commonjs/agent-creator/CyclopsArtwork.js +0 -45
- package/lib/commonjs/agent-creator/CyclopsArtwork.js.map +0 -1
- package/lib/commonjs/agent-creator/ToddArtwork.js +0 -29
- package/lib/commonjs/agent-creator/ToddArtwork.js.map +0 -1
- package/lib/module/agent-avatar/character-colors.js +0 -15
- package/lib/module/agent-avatar/character-colors.js.map +0 -1
- package/lib/module/agent-avatar/character-shapes.js +0 -97
- package/lib/module/agent-avatar/character-shapes.js.map +0 -1
- package/lib/module/agent-creator/ClippoArtwork.js +0 -59
- package/lib/module/agent-creator/ClippoArtwork.js.map +0 -1
- package/lib/module/agent-creator/CyclopsArtwork.js +0 -41
- package/lib/module/agent-creator/CyclopsArtwork.js.map +0 -1
- package/lib/module/agent-creator/ToddArtwork.js +0 -25
- package/lib/module/agent-creator/ToddArtwork.js.map +0 -1
- package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts +0 -13
- package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts +0 -19
- package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts +0 -6
- package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts +0 -5
- package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts +0 -6
- package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-avatar/character-colors.d.ts +0 -13
- package/lib/typescript/module/agent-avatar/character-colors.d.ts.map +0 -1
- package/lib/typescript/module/agent-avatar/character-shapes.d.ts +0 -19
- package/lib/typescript/module/agent-avatar/character-shapes.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts +0 -6
- package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts +0 -5
- package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/ToddArtwork.d.ts +0 -6
- package/lib/typescript/module/agent-creator/ToddArtwork.d.ts.map +0 -1
- package/src/agent-avatar/character-colors.ts +0 -12
- package/src/agent-avatar/character-shapes.ts +0 -122
- package/src/agent-creator/ClippoArtwork.tsx +0 -49
- package/src/agent-creator/CyclopsArtwork.tsx +0 -27
- package/src/agent-creator/ToddArtwork.tsx +0 -24
|
@@ -11,13 +11,12 @@ import { resolveSurfaceMaterial } from '../surface/resolve-surface-material';
|
|
|
11
11
|
* On NATIVE none of the WEB overlay machinery applies: there is no document
|
|
12
12
|
* scroll, no sticky positioning, and no bleed to mask, so the panel is simply a
|
|
13
13
|
* surface wrapping its content. The `framed` prop still drives whether that
|
|
14
|
-
* surface is rounded + bordered, tri-state
|
|
15
|
-
* (the
|
|
16
|
-
* native too — the material follows the same window breakpoint):
|
|
14
|
+
* surface is rounded + bordered, tri-state with responsive NativeWind borders
|
|
15
|
+
* (the material and scoped radius follow the same window breakpoint):
|
|
17
16
|
*
|
|
18
17
|
* - `undefined` (DEFAULT) → responsive: full-bleed below the `framedFrom`
|
|
19
18
|
* breakpoint (default `768` / Tailwind `md`), rounded + bordered at/above it
|
|
20
|
-
* (e.g. `md:
|
|
19
|
+
* (e.g. `md:border md:border-border`).
|
|
21
20
|
* - `false` → never framed (plain full-bleed at every size).
|
|
22
21
|
* - `true` → always rounded + bordered.
|
|
23
22
|
*
|
|
@@ -35,7 +34,8 @@ import React, { memo } from 'react';
|
|
|
35
34
|
import { SurfacePaint } from '../surface/SurfacePaint';
|
|
36
35
|
import { StyleSheet, useWindowDimensions } from 'react-native';
|
|
37
36
|
|
|
38
|
-
import { useOptionalPanelChrome } from '../styles/panel-chrome';
|
|
37
|
+
import { useOptionalPanelChrome, usePanelShape } from '../styles/panel-chrome';
|
|
38
|
+
import { surfaceStyle as resolveShapeStyle } from '../shapes/surface-style';
|
|
39
39
|
import { StyledView } from '../styles/styled-primitives';
|
|
40
40
|
import { SurfaceLevelProvider, surfaceFillVars, useOptionalSurfaceFill } from '../styles/surface-levels';
|
|
41
41
|
import {
|
|
@@ -63,17 +63,17 @@ export const PANEL_BOTTOM_INSET = 8;
|
|
|
63
63
|
* value is the only runtime decision.
|
|
64
64
|
*/
|
|
65
65
|
const RESPONSIVE_SURFACE: Record<ContentPanelFramedBreakpoint, string> = {
|
|
66
|
-
500: 'min-[500px]:
|
|
67
|
-
640: 'sm:
|
|
68
|
-
768: 'md:
|
|
69
|
-
1024: 'lg:
|
|
66
|
+
500: 'min-[500px]:border min-[500px]:border-border',
|
|
67
|
+
640: 'sm:border sm:border-border',
|
|
68
|
+
768: 'md:border md:border-border',
|
|
69
|
+
1024: 'lg:border lg:border-border',
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const RESPONSIVE_CONTENT: Record<ContentPanelFramedBreakpoint, string> = {
|
|
73
|
-
500: 'min-[500px]:overflow-hidden
|
|
74
|
-
640: 'sm:overflow-hidden
|
|
75
|
-
768: 'md:overflow-hidden
|
|
76
|
-
1024: 'lg:overflow-hidden
|
|
73
|
+
500: 'min-[500px]:overflow-hidden',
|
|
74
|
+
640: 'sm:overflow-hidden',
|
|
75
|
+
768: 'md:overflow-hidden',
|
|
76
|
+
1024: 'lg:overflow-hidden',
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
@@ -91,33 +91,38 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
91
91
|
}) => {
|
|
92
92
|
// Dev-only invariant — a ContentPanel must never be nested inside another.
|
|
93
93
|
useContentPanelNestingGuard();
|
|
94
|
+
const panelShape = usePanelShape();
|
|
94
95
|
const panelChrome = useOptionalPanelChrome();
|
|
95
96
|
// What the panel tells its subtree it is painted in (`./shared.ts`).
|
|
96
97
|
const rawFill = usePanelSurfaceFill(surfaceClassName, surfaceStyle, surfaceColor);
|
|
97
98
|
const defaultFill = rawFill;
|
|
98
99
|
const { width } = useWindowDimensions();
|
|
99
100
|
const parentFill = useOptionalSurfaceFill();
|
|
100
|
-
const paintsSurface = Boolean(defaultFill) && parentFill !== undefined && (framed ?? width >= framedFrom);
|
|
101
|
+
const paintsSurface = Boolean(defaultFill) && parentFill !== undefined && (framed ?? width >= framedFrom) && chrome !== 'none';
|
|
101
102
|
const publishedFill = rawFill && paintsSurface ? resolveSurfaceMaterial({ fill: rawFill, parentFill: parentFill! }).publishedFill : rawFill;
|
|
102
|
-
const radius = StyleSheet.flatten(surfaceStyle)?.borderRadius ??
|
|
103
|
+
const radius = StyleSheet.flatten(surfaceStyle)?.borderRadius ?? panelShape.radius;
|
|
104
|
+
const isFramed = framed ?? width >= framedFrom;
|
|
105
|
+
const geometry = { ...resolveShapeStyle({ curve: panelShape.curve }), borderRadius: isFramed ? radius : 0 };
|
|
103
106
|
|
|
104
107
|
// Tri-state: `undefined` → responsive (breakpoint-gated), `true` → always
|
|
105
108
|
// framed, `false` → never framed (plain full-bleed). Whole literal class
|
|
106
109
|
// strings are selected per mode so the Tailwind content-scan over `src/**`
|
|
107
|
-
// picks up every `min-*`/`sm:`/`md:`/`lg:`
|
|
110
|
+
// picks up every `min-*`/`sm:`/`md:`/`lg:` token verbatim
|
|
108
111
|
// (the breakpoint bundle lives whole in `RESPONSIVE_SURFACE`; `framed ===
|
|
109
112
|
// true`/`false` ignore `framedFrom` for fixed always/never framing).
|
|
110
113
|
const surfaceBase =
|
|
111
|
-
|
|
112
|
-
?
|
|
113
|
-
: framed
|
|
114
|
-
?
|
|
115
|
-
:
|
|
114
|
+
chrome === 'none'
|
|
115
|
+
? 'flex-1'
|
|
116
|
+
: framed === undefined
|
|
117
|
+
? `flex-1 ${RESPONSIVE_SURFACE[framedFrom]}`
|
|
118
|
+
: framed
|
|
119
|
+
? 'flex-1 border border-border'
|
|
120
|
+
: 'flex-1';
|
|
116
121
|
const surfaceClass = [surfaceBase, fill ? 'min-h-0' : '', surfaceClassName ?? (paintsSurface ? 'bg-transparent' : 'bg-card')].filter(Boolean).join(' ');
|
|
117
122
|
// Native has no overlays: the surface itself carries the edge. `none` drops
|
|
118
123
|
// both, `border` keeps the class-drawn hairline, `elevated` adds the lift.
|
|
119
124
|
const chromeStyle =
|
|
120
|
-
|
|
125
|
+
!isFramed || chrome === 'none' || chrome === 'border'
|
|
121
126
|
? null
|
|
122
127
|
: shadow || panelChrome
|
|
123
128
|
? { boxShadow: shadow ?? panelChrome?.shadow }
|
|
@@ -127,24 +132,26 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
127
132
|
// bottom and a list inside it scrolls within it. What the prop adds here is
|
|
128
133
|
// `min-h-0`, so a tall child cannot push the panel past the box it was given
|
|
129
134
|
// — the same automatic-minimum-size trap as on web.
|
|
130
|
-
const contentClass = ['flex-1', framed === true ? 'overflow-hidden
|
|
135
|
+
const contentClass = ['flex-1', framed === true ? 'overflow-hidden' : framed === undefined ? RESPONSIVE_CONTENT[framedFrom] : '', fill ? 'min-h-0' : '', contentClassName].filter(Boolean).join(' ');
|
|
131
136
|
|
|
132
137
|
return (
|
|
133
138
|
<ContentPanelNestingContext.Provider value={true}>
|
|
134
139
|
<StyledView
|
|
140
|
+
testID="content-panel-surface"
|
|
135
141
|
className={surfaceClass}
|
|
136
142
|
style={[
|
|
137
143
|
// The surface variable rides the element that carries the fill, so
|
|
138
144
|
// the two can never disagree. A no-op on native; the provider below
|
|
139
145
|
// is what answers there. (`styles/surface-levels.ts`.)
|
|
140
146
|
surfaceFillVars(publishedFill),
|
|
147
|
+
geometry,
|
|
141
148
|
chromeStyle,
|
|
142
149
|
surfaceStyle,
|
|
143
150
|
paintsSurface ? { backgroundColor: 'transparent' } : null,
|
|
144
151
|
]}
|
|
145
152
|
>
|
|
146
|
-
{paintsSurface ? <SurfacePaint fill={defaultFill!} radius={radius} /> : null}
|
|
147
|
-
<StyledView className={contentClass} style={[
|
|
153
|
+
{paintsSurface ? <SurfacePaint fill={defaultFill!} radius={radius} shape={{ curve: panelShape.curve }} /> : null}
|
|
154
|
+
<StyledView testID="content-panel-content" className={contentClass} style={[geometry, contentStyle]}>
|
|
148
155
|
{/* The panel is a surface: everything inside is sitting on rung 1,
|
|
149
156
|
painted in the colour this panel actually paints. */}
|
|
150
157
|
<SurfaceLevelProvider level={1} fill={publishedFill}>
|
|
@@ -83,18 +83,19 @@ import { resolveSurfaceMaterial } from '../surface/resolve-surface-material';
|
|
|
83
83
|
*
|
|
84
84
|
* Styling is NativeWind-className-first; the literal class strings below MUST
|
|
85
85
|
* stay literal so a consumer's Tailwind content-scan over `lib/**` picks them up
|
|
86
|
-
* (no dynamic concatenation of the arbitrary `web:[…]` / `rounded-radius
|
|
86
|
+
* (no dynamic concatenation of the arbitrary `web:[…]` / `rounded-[var(--bloom-panel-radius)]` /
|
|
87
87
|
* `md:` parts — whole class strings are selected per mode instead).
|
|
88
88
|
*/
|
|
89
89
|
import React, { memo, useInsertionEffect } from 'react';
|
|
90
90
|
import { useSurfaceMaterial } from '../surface/use-surface-material.web';
|
|
91
|
-
import { useWindowDimensions, type ViewStyle } from 'react-native';
|
|
91
|
+
import { StyleSheet, useWindowDimensions, type ViewStyle } from 'react-native';
|
|
92
92
|
|
|
93
93
|
import { adoptStyleSheet } from '../styles/adopt-style-sheet';
|
|
94
94
|
import type { WebCssStyle } from '../styles/web-view-style';
|
|
95
|
+
import { surfaceStyle as resolveShapeStyle } from '../shapes/surface-style';
|
|
95
96
|
import { StyledView } from '../styles/styled-primitives';
|
|
96
97
|
|
|
97
|
-
import { useOptionalPanelChrome } from '../styles/panel-chrome';
|
|
98
|
+
import { useOptionalPanelChrome, usePanelShape } from '../styles/panel-chrome';
|
|
98
99
|
import { SurfaceLevelProvider, surfaceFillVars, useOptionalSurfaceFill } from '../styles/surface-levels';
|
|
99
100
|
import { useTheme } from '../theme/use-theme';
|
|
100
101
|
import {
|
|
@@ -130,23 +131,23 @@ const RESPONSIVE_WEB: Record<
|
|
|
130
131
|
{ surface: string; content: string; overlayHidden: string }
|
|
131
132
|
> = {
|
|
132
133
|
500: {
|
|
133
|
-
surface: 'min-[500px]:rounded-radius
|
|
134
|
-
content: 'min-[500px]:rounded-radius
|
|
134
|
+
surface: 'min-[500px]:rounded-[var(--bloom-panel-radius)]',
|
|
135
|
+
content: 'min-[500px]:rounded-[var(--bloom-panel-radius)] web:min-[500px]:overflow-x-clip',
|
|
135
136
|
overlayHidden: 'max-[500px]:hidden',
|
|
136
137
|
},
|
|
137
138
|
640: {
|
|
138
|
-
surface: 'sm:rounded-radius
|
|
139
|
-
content: 'sm:rounded-radius
|
|
139
|
+
surface: 'sm:rounded-[var(--bloom-panel-radius)]',
|
|
140
|
+
content: 'sm:rounded-[var(--bloom-panel-radius)] web:sm:overflow-x-clip',
|
|
140
141
|
overlayHidden: 'max-sm:hidden',
|
|
141
142
|
},
|
|
142
143
|
768: {
|
|
143
|
-
surface: 'md:rounded-radius
|
|
144
|
-
content: 'md:rounded-radius
|
|
144
|
+
surface: 'md:rounded-[var(--bloom-panel-radius)]',
|
|
145
|
+
content: 'md:rounded-[var(--bloom-panel-radius)] web:md:overflow-x-clip',
|
|
145
146
|
overlayHidden: 'max-md:hidden',
|
|
146
147
|
},
|
|
147
148
|
1024: {
|
|
148
|
-
surface: 'lg:rounded-radius
|
|
149
|
-
content: 'lg:rounded-radius
|
|
149
|
+
surface: 'lg:rounded-[var(--bloom-panel-radius)]',
|
|
150
|
+
content: 'lg:rounded-[var(--bloom-panel-radius)] web:lg:overflow-x-clip',
|
|
150
151
|
overlayHidden: 'max-lg:hidden',
|
|
151
152
|
},
|
|
152
153
|
};
|
|
@@ -197,13 +198,18 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
197
198
|
// The floating-panel edge the `Sidebar` wears. Optional: the panel drew its
|
|
198
199
|
// own surface long before it had a shadow, so it must not start throwing
|
|
199
200
|
// outside a provider.
|
|
201
|
+
const panelShape = usePanelShape();
|
|
202
|
+
const radius = StyleSheet.flatten(surfaceStyle)?.borderRadius ?? panelShape.radius;
|
|
203
|
+
const curveStyle = resolveShapeStyle({ curve: panelShape.curve });
|
|
204
|
+
const panelStyle = { ...curveStyle, borderRadius: radius };
|
|
205
|
+
const panelVars: WebCssStyle = { '--bloom-panel-radius': typeof radius === 'string' ? radius : `${typeof radius === 'number' ? radius : panelShape.radius}px` };
|
|
200
206
|
const panelChrome = useOptionalPanelChrome();
|
|
201
207
|
// What the panel tells its subtree it is painted in (`./shared.ts`).
|
|
202
208
|
const rawFill = usePanelSurfaceFill(surfaceClassName, surfaceStyle, surfaceColor);
|
|
203
209
|
const defaultFill = rawFill;
|
|
204
210
|
const { width } = useWindowDimensions();
|
|
205
211
|
const parentFill = useOptionalSurfaceFill();
|
|
206
|
-
const paintsSurface = Boolean(defaultFill) && parentFill !== undefined && (framed ?? width >= framedFrom);
|
|
212
|
+
const paintsSurface = Boolean(defaultFill) && parentFill !== undefined && (framed ?? width >= framedFrom) && chrome !== 'none';
|
|
207
213
|
const publishedFill = rawFill && paintsSurface ? resolveSurfaceMaterial({ fill: rawFill, parentFill: parentFill! }).publishedFill : rawFill;
|
|
208
214
|
const materialStyle = useSurfaceMaterial('[data-bloom-panel-material]', 'bloom-content-panel-material', defaultFill ?? 'transparent');
|
|
209
215
|
|
|
@@ -223,12 +229,12 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
223
229
|
const surfaceBase = responsive
|
|
224
230
|
? `flex-1 ${bp.surface}`
|
|
225
231
|
: framed
|
|
226
|
-
? 'flex-1 rounded-radius
|
|
232
|
+
? 'flex-1 rounded-[var(--bloom-panel-radius)]'
|
|
227
233
|
: 'flex-1';
|
|
228
234
|
const contentBase = responsive
|
|
229
235
|
? `flex-1 ${bp.content}`
|
|
230
236
|
: framed
|
|
231
|
-
? 'flex-1 rounded-radius
|
|
237
|
+
? 'flex-1 rounded-[var(--bloom-panel-radius)] web:overflow-x-clip'
|
|
232
238
|
: 'flex-1';
|
|
233
239
|
// `fill`: the panel takes the height its parent gives it and the CONTENT
|
|
234
240
|
// scrolls inside. `min-h-0` on both boxes is the whole trick — a flex child's
|
|
@@ -300,6 +306,9 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
300
306
|
// disagree about what the panel painted.
|
|
301
307
|
surfaceFillVars(publishedFill),
|
|
302
308
|
insetVars,
|
|
309
|
+
panelVars,
|
|
310
|
+
curveStyle,
|
|
311
|
+
framed === true ? { borderRadius: radius } : framed === false ? { borderRadius: 0 } : null,
|
|
303
312
|
surfaceStyle,
|
|
304
313
|
paintsSurface ? materialStyle : null,
|
|
305
314
|
]}
|
|
@@ -315,12 +324,12 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
315
324
|
pointerEvents="none"
|
|
316
325
|
className={
|
|
317
326
|
boundToPanel
|
|
318
|
-
? `web:[grid-area:1/1] z-30 h-full w-full rounded-radius
|
|
327
|
+
? `web:[grid-area:1/1] z-30 h-full w-full rounded-[var(--bloom-panel-radius)] ${responsive ? bp.overlayHidden : ''} web:[clip-path:inset(0)]`
|
|
319
328
|
: responsive
|
|
320
|
-
? `web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius
|
|
321
|
-
: 'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-radius
|
|
329
|
+
? `web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-[var(--bloom-panel-radius)] ${bp.overlayHidden} web:[margin-bottom:calc(-100dvh+16px)]`
|
|
330
|
+
: 'web:sticky web:top-2 z-30 h-[calc(100dvh-16px)] w-full rounded-[var(--bloom-panel-radius)] web:[margin-bottom:calc(-100dvh+16px)]'
|
|
322
331
|
}
|
|
323
|
-
style={{ ...insetStyle, boxShadow: `0 0 0 ${maskSpread}px ${maskColor ?? colors.background}` }}
|
|
332
|
+
style={{ ...panelStyle, ...insetStyle, boxShadow: `0 0 0 ${maskSpread}px ${maskColor ?? colors.background}` }}
|
|
324
333
|
/>
|
|
325
334
|
)}
|
|
326
335
|
{/* (2) Border-frame overlay — one continuous rounded border, above all.
|
|
@@ -333,15 +342,15 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
333
342
|
// The shadow rides the SAME element as the hairline, so the lift and
|
|
334
343
|
// the edge can never disagree about where the panel ends. It paints
|
|
335
344
|
// outward, into the gutter the page background shows.
|
|
336
|
-
style={[insetStyle, chrome === 'elevated' && (shadow || panelChrome)
|
|
345
|
+
style={[panelStyle, insetStyle, chrome === 'elevated' && (shadow || panelChrome)
|
|
337
346
|
? { boxShadow: shadow ?? panelChrome?.shadow }
|
|
338
347
|
: null]}
|
|
339
348
|
className={
|
|
340
349
|
boundToPanel
|
|
341
|
-
? `web:[grid-area:1/1] z-[120] h-full w-full rounded-radius
|
|
350
|
+
? `web:[grid-area:1/1] z-[120] h-full w-full rounded-[var(--bloom-panel-radius)] border border-border ${responsive ? bp.overlayHidden : ''}`
|
|
342
351
|
: responsive
|
|
343
|
-
? `web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius
|
|
344
|
-
: 'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-radius
|
|
352
|
+
? `web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-[var(--bloom-panel-radius)] border border-border ${bp.overlayHidden} web:[margin-bottom:calc(-100dvh+16px)]`
|
|
353
|
+
: 'web:sticky web:top-2 z-[120] h-[calc(100dvh-16px)] w-full rounded-[var(--bloom-panel-radius)] border border-border web:[margin-bottom:calc(-100dvh+16px)]'
|
|
345
354
|
}
|
|
346
355
|
/>
|
|
347
356
|
)}
|
|
@@ -349,7 +358,7 @@ const ContentPanelComponent: React.FC<ContentPanelProps> = ({
|
|
|
349
358
|
in place instead of remounting `{children}` (which would reset feed
|
|
350
359
|
scroll/virtualizer + refetch on a breakpoint cross). Clipped to the
|
|
351
360
|
rounded panel shape on web when framed. */}
|
|
352
|
-
<StyledView key="content" testID="content-panel-content" className={contentClass} style={contentStyle}>
|
|
361
|
+
<StyledView key="content" testID="content-panel-content" className={contentClass} style={[curveStyle, framed === true ? { borderRadius: radius } : framed === false ? { borderRadius: 0 } : null, contentStyle]}>
|
|
353
362
|
{/* The panel is a surface: everything inside is sitting on rung 1,
|
|
354
363
|
painted in the colour this panel actually paints. */}
|
|
355
364
|
<SurfaceLevelProvider level={1} fill={publishedFill}>
|
|
@@ -18,7 +18,7 @@ export type ContentPanelChrome = 'elevated' | 'border' | 'none';
|
|
|
18
18
|
export interface ContentPanelProps {
|
|
19
19
|
children: React.ReactNode;
|
|
20
20
|
/**
|
|
21
|
-
* Framing mode. Tri-state,
|
|
21
|
+
* Framing mode. Tri-state, managed by Bloom — no consumer
|
|
22
22
|
* breakpoint hook needed:
|
|
23
23
|
* - `undefined` (DEFAULT) → responsive: full-bleed below the `framedFrom`
|
|
24
24
|
* breakpoint, rounded + bordered at/above it.
|
|
@@ -41,7 +41,7 @@ export interface ContentPanelProps {
|
|
|
41
41
|
* surface lifted off the page rather than a box drawn on it.
|
|
42
42
|
* - `'border'` — the hairline alone, which is what this panel drew before.
|
|
43
43
|
* - `'none'` — no edge at all: a flat surface that still clips and rounds,
|
|
44
|
-
* for an app whose page background
|
|
44
|
+
* without material rim or sheen, for an app whose page background separates the two.
|
|
45
45
|
*
|
|
46
46
|
* Ignored while the panel is full-bleed (below `framedFrom`, or
|
|
47
47
|
* `framed={false}`) — there is no edge to draw.
|
|
@@ -4,7 +4,7 @@ import { RADIUS } from './scales';
|
|
|
4
4
|
/** Component policies. Geometry and renderers never import these tokens. */
|
|
5
5
|
export const SURFACE_SHAPES = {
|
|
6
6
|
card: { radius: RADIUS['radius-12'], curve: 'smooth' },
|
|
7
|
-
sidebar: { radius: RADIUS['radius-
|
|
7
|
+
sidebar: { radius: RADIUS['radius-28'], curve: 'round' },
|
|
8
8
|
panel: { radius: RADIUS['radius-20'], curve: 'smooth' },
|
|
9
9
|
menu: { radius: RADIUS['radius-16'], curve: 'smooth' },
|
|
10
10
|
sheet: { radius: { topStart: RADIUS['radius-24'], topEnd: RADIUS['radius-24'] }, curve: 'smooth' },
|
|
@@ -28596,12 +28596,12 @@
|
|
|
28596
28596
|
"sidebar": {
|
|
28597
28597
|
"$extensions": {
|
|
28598
28598
|
"so.oxy.bloom": {
|
|
28599
|
-
"curve": "
|
|
28599
|
+
"curve": "round"
|
|
28600
28600
|
}
|
|
28601
28601
|
},
|
|
28602
28602
|
"radius": {
|
|
28603
28603
|
"$type": "dimension",
|
|
28604
|
-
"$value": "
|
|
28604
|
+
"$value": "28px"
|
|
28605
28605
|
}
|
|
28606
28606
|
},
|
|
28607
28607
|
"panel": {
|
package/src/index.ts
CHANGED
|
@@ -204,6 +204,7 @@ export * from './patient-info-card';
|
|
|
204
204
|
export * from './sidebar';
|
|
205
205
|
export * from './app-shell';
|
|
206
206
|
export * from './page-header';
|
|
207
|
+
export * from './page-footer';
|
|
207
208
|
export * from './notification-center';
|
|
208
209
|
export * from './theme-toggle';
|
|
209
210
|
export * from './settings-modal';
|
package/src/index.web.ts
CHANGED
|
@@ -209,6 +209,7 @@ export * from './patient-info-card';
|
|
|
209
209
|
export * from './sidebar';
|
|
210
210
|
export * from './app-shell/index.web';
|
|
211
211
|
export * from './page-header';
|
|
212
|
+
export * from './page-footer';
|
|
212
213
|
export * from './notification-center';
|
|
213
214
|
export * from './theme-toggle';
|
|
214
215
|
export * from './settings-modal';
|
|
@@ -34,7 +34,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
34
34
|
betaEyes: "نمط العيون",
|
|
35
35
|
eyewear: "نظارات",
|
|
36
36
|
accessory: "إكسسوار",
|
|
37
|
-
characterOption: (
|
|
37
|
+
characterOption: (_category, _id, title) => String(title),
|
|
38
38
|
editor: "محرر الوكيل",
|
|
39
39
|
newBot: "روبوت جديد",
|
|
40
40
|
closeEditor: "إغلاق محرر الوكيل",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "চোখের ধরন",
|
|
25
25
|
eyewear: "চশমা",
|
|
26
26
|
accessory: "অনুষঙ্গ",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "এজেন্ট সম্পাদক",
|
|
29
29
|
newBot: "নতুন বট",
|
|
30
30
|
closeEditor: "এজেন্ট সম্পাদক বন্ধ করুন",
|
|
@@ -31,7 +31,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
31
31
|
betaEyes: "Estil dels ulls",
|
|
32
32
|
eyewear: "Ulleres",
|
|
33
33
|
accessory: "Accessori",
|
|
34
|
-
characterOption: (
|
|
34
|
+
characterOption: (_category, _id, title) => String(title),
|
|
35
35
|
editor: "Editor de l’agent",
|
|
36
36
|
newBot: "Bot nou",
|
|
37
37
|
closeEditor: "Tanca l’editor de l’agent",
|
|
@@ -26,7 +26,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
26
26
|
betaEyes: "Augenstil",
|
|
27
27
|
eyewear: "Brille",
|
|
28
28
|
accessory: "Accessoire",
|
|
29
|
-
characterOption: (
|
|
29
|
+
characterOption: (_category, _id, title) => String(title),
|
|
30
30
|
editor: "Agenten-Editor",
|
|
31
31
|
newBot: "Neuer Bot",
|
|
32
32
|
closeEditor: "Agenten-Editor schließen",
|
|
@@ -31,7 +31,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
31
31
|
betaEyes: "Estilo de ojos",
|
|
32
32
|
eyewear: "Gafas",
|
|
33
33
|
accessory: "Accesorio",
|
|
34
|
-
characterOption: (
|
|
34
|
+
characterOption: (_category, _id, title) => String(title),
|
|
35
35
|
editor: "Editor del agente",
|
|
36
36
|
newBot: "Nuevo bot",
|
|
37
37
|
closeEditor: "Cerrar editor del agente",
|
|
@@ -31,7 +31,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
31
31
|
betaEyes: "Style des yeux",
|
|
32
32
|
eyewear: "Lunettes",
|
|
33
33
|
accessory: "Accessoire",
|
|
34
|
-
characterOption: (
|
|
34
|
+
characterOption: (_category, _id, title) => String(title),
|
|
35
35
|
editor: "Éditeur de l’agent",
|
|
36
36
|
newBot: "Nouveau bot",
|
|
37
37
|
closeEditor: "Fermer l’éditeur de l’agent",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "आँखों की शैली",
|
|
25
25
|
eyewear: "चश्मा",
|
|
26
26
|
accessory: "सहायक वस्तु",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "एजेंट संपादक",
|
|
29
29
|
newBot: "नया बॉट",
|
|
30
30
|
closeEditor: "एजेंट संपादक बंद करें",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "Gaya mata",
|
|
25
25
|
eyewear: "Kacamata",
|
|
26
26
|
accessory: "Aksesori",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "Editor agen",
|
|
29
29
|
newBot: "Bot baru",
|
|
30
30
|
closeEditor: "Tutup editor agen",
|
|
@@ -31,7 +31,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
31
31
|
betaEyes: "Stile degli occhi",
|
|
32
32
|
eyewear: "Occhiali",
|
|
33
33
|
accessory: "Accessorio",
|
|
34
|
-
characterOption: (
|
|
34
|
+
characterOption: (_category, _id, title) => String(title),
|
|
35
35
|
editor: "Editor dell’agente",
|
|
36
36
|
newBot: "Nuovo bot",
|
|
37
37
|
closeEditor: "Chiudi l’editor dell’agente",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "目のスタイル",
|
|
25
25
|
eyewear: "眼鏡",
|
|
26
26
|
accessory: "アクセサリー",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "エージェント編集",
|
|
29
29
|
newBot: "新しいボット",
|
|
30
30
|
closeEditor: "エージェント編集を閉じる",
|
|
@@ -31,7 +31,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
31
31
|
betaEyes: "Estilo dos olhos",
|
|
32
32
|
eyewear: "Óculos",
|
|
33
33
|
accessory: "Acessório",
|
|
34
|
-
characterOption: (
|
|
34
|
+
characterOption: (_category, _id, title) => String(title),
|
|
35
35
|
editor: "Editor do agente",
|
|
36
36
|
newBot: "Novo bot",
|
|
37
37
|
closeEditor: "Fechar editor do agente",
|
|
@@ -27,7 +27,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
27
27
|
betaEyes: "Стиль глаз",
|
|
28
28
|
eyewear: "Очки",
|
|
29
29
|
accessory: "Аксессуар",
|
|
30
|
-
characterOption: (
|
|
30
|
+
characterOption: (_category, _id, title) => String(title),
|
|
31
31
|
editor: "Редактор агента",
|
|
32
32
|
newBot: "Новый бот",
|
|
33
33
|
closeEditor: "Закрыть редактор агента",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "Göz stili",
|
|
25
25
|
eyewear: "Gözlük",
|
|
26
26
|
accessory: "Aksesuar",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "Ajan düzenleyici",
|
|
29
29
|
newBot: "Yeni bot",
|
|
30
30
|
closeEditor: "Ajan düzenleyiciyi kapat",
|
|
@@ -24,7 +24,7 @@ const AGENT_CREATOR_MESSAGES: Translations['AGENT_CREATOR_MESSAGES'] = {
|
|
|
24
24
|
betaEyes: "眼睛风格",
|
|
25
25
|
eyewear: "眼镜",
|
|
26
26
|
accessory: "配饰",
|
|
27
|
-
characterOption: (
|
|
27
|
+
characterOption: (_category, _id, title) => String(title),
|
|
28
28
|
editor: "智能体编辑器",
|
|
29
29
|
newBot: "新机器人",
|
|
30
30
|
closeEditor: "关闭智能体编辑器",
|
|
@@ -131,22 +131,20 @@ export function MailMessage({
|
|
|
131
131
|
: { key: 'forward', label: text.forward, icon: RiShareForwardLine, onPress: onForward },
|
|
132
132
|
].filter((entry): entry is NonNullable<typeof entry> => entry !== null);
|
|
133
133
|
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
// COLLAPSED one paints nothing, so a thread reads as one list with a card
|
|
137
|
-
// opened inside it rather than as a column of blocks.
|
|
134
|
+
// Opening changes the content, not its surface or host. Keeping the Card
|
|
135
|
+
// mounted also preserves keyboard focus on the disclosure while it expands.
|
|
138
136
|
// Three labelled actions need about 320 of the message's own width; under
|
|
139
137
|
// that the group keeps the glyphs and drops the words, which is what
|
|
140
138
|
// `ButtonGroupItem` is built for — the accessible name is the label either
|
|
141
139
|
// way, so nothing is lost by the labels going.
|
|
142
140
|
const compactReplies = !replyLabelsFit(width);
|
|
143
|
-
const Shell = open ? Card : View;
|
|
144
|
-
const shellProps = open
|
|
145
|
-
? { variant: 'outlined' as const, radius: 'radius-16' as const, testID }
|
|
146
|
-
: { testID };
|
|
147
141
|
return (
|
|
148
|
-
<
|
|
149
|
-
|
|
142
|
+
<Card
|
|
143
|
+
appearance="solid"
|
|
144
|
+
border="none"
|
|
145
|
+
elevation="s"
|
|
146
|
+
radius="radius-16"
|
|
147
|
+
testID={testID}
|
|
150
148
|
style={[open ? { paddingBottom: geo.paddingVertical } : null, style]}
|
|
151
149
|
>
|
|
152
150
|
<View
|
|
@@ -316,6 +314,6 @@ export function MailMessage({
|
|
|
316
314
|
) : null}
|
|
317
315
|
</View>
|
|
318
316
|
) : null}
|
|
319
|
-
</
|
|
317
|
+
</Card>
|
|
320
318
|
);
|
|
321
319
|
}
|
|
@@ -8,6 +8,7 @@ import { MailLabelChips, MailStar } from '../mail-list/parts';
|
|
|
8
8
|
import { mailStrings, resolveMailPaint, visibleLabels } from '../mail-list/shared';
|
|
9
9
|
import { adoptStyleSheet } from '../styles/adopt-style-sheet';
|
|
10
10
|
import { useSurfaceFill } from '../styles/surface-levels';
|
|
11
|
+
import { space } from '../styles/tokens';
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
import { useTheme } from '../theme/use-theme';
|
|
@@ -55,6 +56,7 @@ export function MailThread({
|
|
|
55
56
|
expandedIds,
|
|
56
57
|
onExpandedIdsChange,
|
|
57
58
|
collapseAfter = 4,
|
|
59
|
+
messageGap = space.md,
|
|
58
60
|
quickReply,
|
|
59
61
|
header,
|
|
60
62
|
strings,
|
|
@@ -144,7 +146,7 @@ export function MailThread({
|
|
|
144
146
|
</View>
|
|
145
147
|
) : null}
|
|
146
148
|
<Divider />
|
|
147
|
-
<View style={{ paddingTop:
|
|
149
|
+
<View testID={testID ? `${testID}-messages` : undefined} style={{ paddingTop: space.xs, paddingBottom: space.xs, gap: messageGap }}>
|
|
148
150
|
{entries.map((entry) =>
|
|
149
151
|
entry.kind === 'message' ? (
|
|
150
152
|
<MailMessage
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Platform } from 'react-native';
|
|
2
|
+
import { RADIUS } from '../design-tokens/scales';
|
|
2
3
|
|
|
3
4
|
import { MAIL_THREAD_MESSAGES } from './messages';
|
|
4
5
|
import type { MailThreadMessage, MailAddress, MailThreadStrings } from './types';
|
|
@@ -44,7 +45,7 @@ export const MAIL_THREAD_GEOMETRY = {
|
|
|
44
45
|
/** The star and the overflow trigger. A touch target, so 44. */
|
|
45
46
|
action: 44,
|
|
46
47
|
/** Radius of a message's own surface. */
|
|
47
|
-
radius:
|
|
48
|
+
radius: RADIUS['radius-16'],
|
|
48
49
|
} as const;
|
|
49
50
|
|
|
50
51
|
/**
|
package/src/mail-thread/types.ts
CHANGED
|
@@ -128,6 +128,8 @@ export interface MailThreadProps {
|
|
|
128
128
|
* Default 4; `0` never collapses.
|
|
129
129
|
*/
|
|
130
130
|
collapseAfter?: number;
|
|
131
|
+
/** Space between message cards and the earlier-messages control. Default space.md (12). */
|
|
132
|
+
messageGap?: number;
|
|
131
133
|
/** A slot under the stack — the quick-reply box, or a row of reply buttons. */
|
|
132
134
|
quickReply?: ReactNode;
|
|
133
135
|
/** A slot above the subject — a back button, the mailbox chrome. */
|