diff --git a/apps/ui/skills/coss/references/primitives/alert-dialog.md b/apps/ui/skills/coss/references/primitives/alert-dialog.md
index 2d09bfecf..70f825060 100644
--- a/apps/ui/skills/coss/references/primitives/alert-dialog.md
+++ b/apps/ui/skills/coss/references/primitives/alert-dialog.md
@@ -62,19 +62,68 @@ import {
```
+`AlertDialogClose` closes the dialog as soon as it is clicked, so use it as the confirm only when the action is synchronous. For async work, see **Async confirmation** below.
+
## Patterns from coss particles
- **Portal forwarding**: optional `portalProps` on `AlertDialogPopup` → Base UI `AlertDialog.Portal` (`keepMounted`, `container`, …). See [portal-props.md](../portal-props.md).
- **Section structure**: keep `AlertDialogHeader` and `AlertDialogFooter` as direct sections of `AlertDialogPopup` (there is no `AlertDialogPanel`; add a `div` or fragment between them only if you need extra body content).
-- **Action composition**: use `AlertDialogClose render={}` for cancel/confirm actions to preserve button semantics and styling.
+- **Action composition**: use `AlertDialogClose render={}` for Cancel and for synchronous confirms to preserve button semantics and styling.
- **Destructive affordance**: pair destructive trigger/confirm variants (`destructive-outline`, `destructive`) for clear risk signaling.
- **Footer variants**: use `AlertDialogFooter variant="bare"` when border/background framing should be removed.
- **Close confirmation chain**: for unsaved changes in broader workflows, pair with dialog flows like `p-dialog-4`.
+### Key patterns
+
+Async confirmation (the dialog stays open until the mutation settles):
+
+```tsx
+const [open, setOpen] = useState(false)
+const [isPending, setIsPending] = useState(false)
+
+async function handleDelete() {
+ setIsPending(true)
+ try {
+ await deleteAccount()
+ setOpen(false)
+ } catch {
+ // Keep the dialog open so the user can retry; surface the error (e.g. a toast).
+ } finally {
+ setIsPending(false)
+ }
+}
+
+
+ }>
+ Delete Account
+
+
+
+ Are you absolutely sure?
+
+ This action cannot be undone.
+
+
+
+ }>Cancel
+
+
+
+
+```
+
+- The confirm is a plain `Button` (not `AlertDialogClose`) with `loading`, which disables it and shows the spinner while the request runs.
+- Close the dialog from the success path (`setOpen(false)`); on failure keep it open so the user can retry.
+- Cancel stays an `AlertDialogClose` ghost button. Keep Cancel first in source: the footer is `flex-col-reverse` / `sm:flex-row sm:justify-end`, so the confirm renders on the right (or on top when stacked).
+- With a query library, use its pending state (for example `mutation.isPending`) instead of local state.
+
## Common pitfalls
- Using AlertDialog as a generic content modal instead of high-risk confirmation UI.
- Omitting explicit destructive/cancel action distinction.
+- Confirming an async action with `AlertDialogClose`: the dialog closes before the mutation settles, so there is no loading state and nowhere to show a failure.
- Wrapping dialog sections in extra containers that break built-in layout (use `className="contents"` only when needed).
- Mixing Dialog/Popover composition APIs without validating this primitive's parts.
- Skipping focus-return and escape-key verification on real trigger flows.
diff --git a/apps/ui/skills/coss/references/primitives/button.md b/apps/ui/skills/coss/references/primitives/button.md
index 825fd1e10..bac8fd469 100644
--- a/apps/ui/skills/coss/references/primitives/button.md
+++ b/apps/ui/skills/coss/references/primitives/button.md
@@ -99,6 +99,7 @@ Prefer the `loading` prop for typical async actions. Use the composite approach
- Omitting explicit `type` inside forms/dialogs and triggering unintended submit behavior.
- Using icon-only buttons without `aria-label` on the button.
+- Expecting a disabled button to show a tooltip: `disabled` sets the native attribute plus `pointer-events-none`, so the button gets no hover or focus. Wrap it in a focusable `span` rendered as the `TooltipTrigger` (see [tooltip.md](./tooltip.md)).
- Rebuilding button state styling with ad-hoc classes instead of variants/sizes.
- Using `SelectButton` as if it were a general-purpose `Button`; `SelectButton` is a select-flavored trigger helper and should be treated as a `select`/`combobox` pattern.
diff --git a/apps/ui/skills/coss/references/primitives/card.md b/apps/ui/skills/coss/references/primitives/card.md
index 40d79b614..ea597a4d6 100644
--- a/apps/ui/skills/coss/references/primitives/card.md
+++ b/apps/ui/skills/coss/references/primitives/card.md
@@ -22,14 +22,23 @@ Manual deps from docs:
```tsx
import {
Card,
+ CardAction,
CardDescription,
CardFooter,
+ CardFrame,
+ CardFrameAction,
+ CardFrameDescription,
+ CardFrameFooter,
+ CardFrameHeader,
+ CardFrameTitle,
CardHeader,
CardPanel,
CardTitle,
} from "@/components/ui/card"
```
+`CardPanel` is also exported as `CardContent`.
+
## Minimal pattern
```tsx
@@ -70,16 +79,49 @@ Card with form content:
Keep `CardHeader`, `CardPanel`, and `CardFooter` as direct children of `Card` to preserve built-in spacing and layout.
+Put header actions in `CardAction`, a sibling of `CardTitle` and `CardDescription` inside `CardHeader`; it is placed top-right via the header grid.
+
+### CardFrame
+
+`CardFrame` is a muted outer shell with its own header and footer around one or more inner `Card`s (or a `Table variant="card"`). Use it when a section needs a title row, an optional action, and a footnote outside the main surface.
+
+```tsx
+
+
+ Projects
+ Manage your projects
+
+
+
+
+
+ Content
+
+ Footnote or secondary info
+
+```
+
+- Keep `CardFrameHeader`, the inner `Card`(s), and `CardFrameFooter` as direct children of `CardFrame`; the frame clips, rounds, and removes shadows on direct `Card` children only.
+- `CardFrameAction` goes inside `CardFrameHeader` as a sibling of the title and description; it sits in the second grid column, vertically centered.
+- Do not use `CardHeader`/`CardFooter` on the frame itself; those belong to the inner `Card`.
+- For tables, render `Table variant="card"` as a direct child of `CardFrame` (see table guide, `p-table-6` through `p-table-8`).
+
### More examples
-See `p-card-1` through `p-card-8` for various card compositions.
+See `p-card-1` through `p-card-11` for various card compositions.
## Common pitfalls
- Skipping `CardHeader`/`CardPanel`/`CardFooter` structure in composed cards.
- Mixing unrelated layout wrappers that break spacing between card sections.
- Using cards as generic wrappers when `Frame` or plain layout would be clearer.
+- Nesting a `Card` inside another wrapper within `CardFrame`, which skips the frame's clipping and radius rules for direct `Card` children.
## Useful particle references
- core patterns: `p-card-1`, `p-card-2`, `p-card-3`, `p-card-4`, `p-card-5`, `p-card-6`, `p-card-7`, `p-card-8`
+- `CardFrame` with footer: `p-card-4`; with header: `p-card-5`; header + footer: `p-card-6`, `p-card-7`
+- `CardFrame` with header action: `p-card-11`
diff --git a/apps/ui/skills/coss/references/primitives/drawer.md b/apps/ui/skills/coss/references/primitives/drawer.md
index e48869b21..a7be2a2a6 100644
--- a/apps/ui/skills/coss/references/primitives/drawer.md
+++ b/apps/ui/skills/coss/references/primitives/drawer.md
@@ -87,13 +87,15 @@ Drawer with a visible drag handle:
{/* Form content */}
-
}>Cancel
+
```
+**Footer action order**: write Cancel first and the primary action last. `DrawerFooter` is `flex-col-reverse` on mobile and `sm:flex-row sm:justify-end` from `sm` up, so source order puts the primary action on the right on desktop and on top when stacked. The same applies to `DialogFooter` and `AlertDialogFooter`.
+
Responsive drawer + dialog (drawer on mobile, dialog on desktop): see `p-drawer-12`.
### More examples
@@ -104,6 +106,7 @@ See `p-drawer-1` through `p-drawer-13` for inset, straight, scrollable, nested,
- Choosing Sheet for desktop side panels; use Drawer. Use Dialog for centered modal flows.
- Forgetting responsive switch logic when drawer is mobile-only variant.
+- Putting the primary action before Cancel in `DrawerFooter`; the reversed mobile stack then puts Cancel on top and the primary on the left on desktop.
- Breaking section layout by putting the whole dialog in a block-level `