diff --git a/design-system/packages/ui/README.md b/design-system/packages/ui/README.md index e85cc700e7..594df3d207 100644 --- a/design-system/packages/ui/README.md +++ b/design-system/packages/ui/README.md @@ -45,6 +45,11 @@ and `data-scrolled` when records have moved below their starting position. Hosts can layer compact controls above that viewport without creating another scroller. Each entry may supply `activity` beneath its message; the host owns its real processing state, localized accessible label, and completion lifecycle. +Its `presentation="chat"` variant uses FlowChat's `type.flow.control` text size +and weight, `type.flow.body` font stack and leading, `color.content.primary` +text, and `color.action.quiet.hover` user-bubble fill. `compact` controls spacing +independently. The default `presentation="voice"` retains the call typography +and inverse colors; hosts can switch presentation on the existing viewport. `VoiceParticleLogo` is also exported independently. Its `readAudio` callback reads `{ user, assistant, assistantSpeaking }` once per animation frame. The @@ -330,7 +335,10 @@ Sized icon slots in buttons, tabs, menu items and fields own their glyph geometr Pass catalog `Icon` nodes through `leadingIcon`, `trailingIcon`, `icon` or the matching component slot, just as for SVG icons. These slots constrain catalog icons to the component's size; a standalone `Icon` retains its explicit size -(24px by default). Do not shrink the catalog globally to correct a slot mismatch. +(24px by default). They also normalize a direct Lucide glyph that still has +Lucide's default 2px stroke to the shared 1.6 line weight and inherit the slot's +color. Explicit non-default strokes and non-Lucid SVG artwork remain unchanged. +Do not shrink the catalog globally to correct a slot mismatch. `IconButton` defaults to `quiet`: its resting surface is transparent, hover and pressed states use shared action feedback, and keyboard focus keeps a visible @@ -456,6 +464,14 @@ they must forward all props and refs and retain public component ownership. `useSubmenuIntent` is available for product popovers that need the same pointer corridor behavior. +Custom composed menus reuse `useDismissibleLayer` and the public `usePresence` +hook. Keep the positioned/measured layer separate from its animated surface, +retain geometry until presence unmounts it, and make exiting content inert. +Presence cancels a pending exit when reopened and honors reduced motion. +The host should opt a presence-owned surface out of its fallback animations; +outside-pointer dismissal leaves the clicked control's focus alone, while +Escape and menu actions restore the trigger before handing off to another UI. + ## FlowChat tool cards diff --git a/design-system/packages/ui/src/components/ActionCard/ActionCard.tsx b/design-system/packages/ui/src/components/ActionCard/ActionCard.tsx index 48a8beac64..ffdc1d6296 100644 --- a/design-system/packages/ui/src/components/ActionCard/ActionCard.tsx +++ b/design-system/packages/ui/src/components/ActionCard/ActionCard.tsx @@ -67,7 +67,7 @@ export const ActionCard = forwardRef( type={type} > {leading !== undefined && leading !== null && ( -