@botiverse/raft-ui 0.52.3 → 0.53.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/activity-inbox/activity-inbox-sidebar.recipe.mjs +5 -5
  3. package/dist/components/app-rail/app-rail.recipe.mjs +1 -1
  4. package/dist/components/app-shell/app-shell.mjs +1 -1
  5. package/dist/components/badge/badge.mjs +1 -1
  6. package/dist/components/banner/banner.mjs +1 -1
  7. package/dist/components/combobox/combobox.mjs +2 -2
  8. package/dist/components/composer/composer-attachment.recipe.mjs +5 -5
  9. package/dist/components/copyable-code/copyable-code.mjs +1 -1
  10. package/dist/components/dialog/dialog.mjs +3 -3
  11. package/dist/components/dropdown-menu/dropdown-menu.mjs +1 -1
  12. package/dist/components/empty-state/empty-state.mjs +2 -2
  13. package/dist/components/file-preview/file-preview.recipe.mjs +2 -2
  14. package/dist/components/files/files.recipe.mjs +1 -1
  15. package/dist/components/icons/conversation-icons.d.mts +5 -1
  16. package/dist/components/icons/conversation-icons.mjs +5 -40
  17. package/dist/components/lightbox/lightbox.mjs +5 -5
  18. package/dist/components/message-attachment/message-image-gallery.recipe.mjs +4 -4
  19. package/dist/components/message-forwarded-bundle/message-forwarded-bundle.recipe.mjs +3 -3
  20. package/dist/components/message-item/message-reaction.recipe.mjs +2 -2
  21. package/dist/components/mobile-nav/mobile-nav-server.mjs +1 -1
  22. package/dist/components/panel/panel-header.recipe.mjs +1 -1
  23. package/dist/components/panel/panel-split-action.recipe.mjs +1 -1
  24. package/dist/components/progress/progress.mjs +1 -1
  25. package/dist/components/resizable/resizable.recipe.mjs +2 -2
  26. package/dist/components/switch/switch.mjs +1 -1
  27. package/dist/components/task-board/task-board-column.recipe.mjs +1 -1
  28. package/dist/components/task-card/task-card-status.recipe.mjs +2 -2
  29. package/dist/components/tasks/task-chip.mjs +1 -1
  30. package/dist/components/text/text.mjs +13 -13
  31. package/dist/components/textarea/textarea.mjs +2 -2
  32. package/dist/components/thread-panel/thread-panel.recipe.mjs +1 -1
  33. package/dist/components/tooltip/tooltip.mjs +4 -4
  34. package/dist/components/workspace-button/workspace-button.mjs +1 -1
  35. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## [0.53.0](https://github.com/botiverse/raft-design/compare/v0.52.4...v0.53.0) (2026-10-30)
2
+
3
+ ### Changed
4
+
5
+ - **`ChatIcon` is `MessageIcon`'s plain bubble:** the three dots inside are gone, so a message and a chat share one icon. `ChatIcon` stays exported as an alias; `DirectMessageIcon`, `ThreadIcon`, `CommentIcon` and `FeedbackIcon` keep their marks. ([#901](https://github.com/botiverse/raft-design/pull/901))
6
+
7
+ ### Design System
8
+
9
+ - **A message and a chat share one icon:** the plain bubble; the other kinds of conversation keep their own mark. ([#901](https://github.com/botiverse/raft-design/pull/901))
10
+ - Docs: https://raft-design.botiverse.build/components/icons/
11
+ - **RadioGroup: nothing chosen when the pick is consent:** leave the group empty when choosing an option grants something, so nobody consents by default. ([#900](https://github.com/botiverse/raft-design/pull/900))
12
+ - Docs: https://raft-design.botiverse.build/components/radio-group/
13
+ - **"Entry points on an edge take a band" is withdrawn** until the Assistant's form settles. ([#899](https://github.com/botiverse/raft-design/pull/899))
14
+
15
+ ## [0.52.4](https://github.com/botiverse/raft-design/compare/v0.52.3...v0.52.4) (2026-10-30)
16
+
17
+ ### Fixed
18
+
19
+ - **0.52.3 carried unrelated class rewrites by accident; they are undone:** 33 components had their classes rewritten into canonical Tailwind forms along with the disabled Select fix (for example the task chip's `text-[12px] leading-4` became `text-[12px]/4`). Those files are back to 0.52.2 exactly; only the disabled Select fix from 0.52.3 remains. Skip 0.52.3 and upgrade to 0.52.4. ([#897](https://github.com/botiverse/raft-design/pull/897))
20
+
1
21
  ## [0.52.3](https://github.com/botiverse/raft-design/compare/v0.52.2...v0.52.3) (2026-10-30)
2
22
 
3
23
  ### Fixed
@@ -10,11 +10,11 @@ const activityInboxSidebar = tv({ slots: {
10
10
  sidebarBody: ["bg-layer-canvas"],
11
11
  sidebarContent: [
12
12
  "py-0",
13
- "**:data-[slot=sidebar-group-label]:mt-3 **:data-[slot=sidebar-group-label]:mb-0",
14
- "**:data-[slot=sidebar-group-label]:flex **:data-[slot=sidebar-group-label]:items-center **:data-[slot=sidebar-group-label]:gap-2",
15
- "**:data-[slot=sidebar-group-label]:px-5 **:data-[slot=sidebar-group-label]:py-0",
16
- "**:data-[slot=sidebar-group-label]:font-sans **:data-[slot=sidebar-group-label]:text-footnote **:data-[slot=sidebar-group-label]:font-bold",
17
- "**:data-[slot=sidebar-group-label]:text-foreground-hint **:data-[slot=sidebar-group-label]:normal-case **:data-[slot=sidebar-group-label]:tracking-normal",
13
+ "[&_[data-slot=sidebar-group-label]]:mt-3 [&_[data-slot=sidebar-group-label]]:mb-0",
14
+ "**:data-[slot=sidebar-group-label]:flex **:data-[slot=sidebar-group-label]:items-center [&_[data-slot=sidebar-group-label]]:gap-2",
15
+ "[&_[data-slot=sidebar-group-label]]:px-5 [&_[data-slot=sidebar-group-label]]:py-0",
16
+ "**:data-[slot=sidebar-group-label]:font-sans **:data-[slot=sidebar-group-label]:text-footnote [&_[data-slot=sidebar-group-label]]:font-bold",
17
+ "**:data-[slot=sidebar-group-label]:text-foreground-hint **:data-[slot=sidebar-group-label]:normal-case [&_[data-slot=sidebar-group-label]]:tracking-normal",
18
18
  "**:data-activity-inbox-show-all:whitespace-nowrap"
19
19
  ]
20
20
  } });
@@ -39,7 +39,7 @@ const appRail = tv({ slots: {
39
39
  "absolute -right-1 -top-1 inline-flex items-center justify-center",
40
40
  "h-4 min-w-4 rounded-sticker px-1",
41
41
  "bg-attention-400 text-sticker-ink inset-ring-[1.5px] inset-ring-sticker-ink ring-[1.5px] ring-sticker-edge",
42
- "font-mono text-[10px]/4 font-bold tabular-nums"
42
+ "font-mono text-[10px] font-bold leading-4 tabular-nums"
43
43
  ],
44
44
  itemIndicator: ["pointer-events-none absolute", "-top-1 -right-1"]
45
45
  } });
@@ -176,7 +176,7 @@ function AppShellMainSlot({ className, overlay = false, render, ...props }) {
176
176
  const collapsible = useOptionalAppShellSidebar()?.collapsible ?? false;
177
177
  const defaultProps = {
178
178
  "data-slot": "app-shell-main-slot",
179
- className: mainSlot({ className: cn(className, collapsible && ["absolute inset-0 ", "group-data-[state=collapsed]/app-shell:-left-(--app-shell-sidebar-width)"]) })
179
+ className: mainSlot({ className: cn(className, collapsible && ["absolute inset-y-0 right-0 left-0", "group-data-[state=collapsed]/app-shell:-left-(--app-shell-sidebar-width)"]) })
180
180
  };
181
181
  return useRender({
182
182
  defaultTagName: "main",
@@ -8,7 +8,7 @@ const badge = tv({
8
8
  "inline-flex h-[22px] w-fit min-w-0 max-w-full shrink-0 items-center gap-1 overflow-hidden whitespace-nowrap rounded-chip px-1.5",
9
9
  "font-sans text-caption font-semibold normal-case tracking-normal",
10
10
  "transition-[filter,opacity] duration-100",
11
- "[&_svg]:size-3.5 [&_svg]:shrink-0 **:data-[slot='spinner']:size-3 **:data-[slot='spinner']:text-xs",
11
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_[data-slot='spinner']]:size-3 [&_[data-slot='spinner']]:text-xs",
12
12
  "*:data-[slot=status]:lead-dot",
13
13
  "disabled:cursor-not-allowed disabled:bg-fill-muted disabled:text-foreground-disabled disabled:opacity-100 disabled:inset-ring-0",
14
14
  "supports-[anchor-scope:all]:pointer-coarse:enabled:[anchor-name:--badge] supports-[anchor-scope:all]:pointer-coarse:enabled:[anchor-scope:--badge]",
@@ -67,7 +67,7 @@ const banner = tv({
67
67
  defaultVariants: { size: "md" },
68
68
  compoundVariants: [{
69
69
  size: "sm",
70
- class: { root: "has-[>[data-slot=banner-action],>[data-banner-close]]:py-[calc((--spacing(8)-1lh)/2+(--spacing(1)))]" }
70
+ class: { root: "has-[>[data-slot=banner-action],>[data-banner-close]]:py-[calc((--spacing(8)-1lh)/2+--spacing(1))]" }
71
71
  }]
72
72
  });
73
73
  /**
@@ -38,9 +38,9 @@ const combobox = tv({
38
38
  "flex min-w-0 items-center gap-2",
39
39
  "outline-none",
40
40
  "[&>svg]:pointer-events-none [&>svg]:shrink-0",
41
- "**:data-[slot='combobox-clear']:size-control-embedded **:data-[slot='combobox-clear']:px-0 **:data-[slot='combobox-clear']:shrink-0",
41
+ "**:data-[slot='combobox-clear']:size-control-embedded [&_[data-slot='combobox-clear']]:px-0 **:data-[slot='combobox-clear']:shrink-0",
42
42
  "[&>[data-slot=combobox-clear]:last-child]:me-[calc(var(--control-embedded-inset)-0.75rem-1px)]",
43
- "**:data-[slot='combobox-trigger-indicator']:size-4",
43
+ "[&_[data-slot='combobox-trigger-indicator']]:size-4",
44
44
  "[&_[data-slot='combobox-trigger-indicator']>svg]:shrink-0",
45
45
  "min-h-control rounded-control border-[1.5px] border-line-field bg-layer-card px-3 py-0",
46
46
  "font-sans text-body text-foreground",
@@ -6,12 +6,12 @@ const composerAttachment = tv({
6
6
  "flex flex-wrap gap-2",
7
7
  "has-data-[slot=composer-attachments-scroll-area]:relative",
8
8
  "has-data-[slot=composer-attachments-scroll-area]:block",
9
- "has-data-[slot=composer-attachments-scroll-area]:min-w-0",
9
+ "has-[[data-slot=composer-attachments-scroll-area]]:min-w-0",
10
10
  "has-data-[slot=sortable-composer-attachments-list]:block",
11
- "has-data-[slot=sortable-composer-attachments-list]:min-w-0",
11
+ "has-[[data-slot=sortable-composer-attachments-list]]:min-w-0",
12
12
  "pt-1.5 pe-1.5",
13
- "has-data-[slot=composer-attachments-scroll-area]:p-0",
14
- "has-data-[slot=sortable-composer-attachments-list]:pt-0"
13
+ "has-[[data-slot=composer-attachments-scroll-area]]:p-0",
14
+ "has-[[data-slot=sortable-composer-attachments-list]]:pt-0"
15
15
  ],
16
16
  attachmentsScrollArea: ["relative w-full min-w-0"],
17
17
  attachmentsViewport: [
@@ -50,7 +50,7 @@ const composerAttachment = tv({
50
50
  ],
51
51
  attachmentUploadProgressBar: [
52
52
  "absolute z-20 h-1 overflow-hidden",
53
- "inset-x-1.5 bottom-1.5 w-auto rounded-[2px]",
53
+ "right-1.5 bottom-1.5 left-1.5 w-auto rounded-[2px]",
54
54
  "bg-layer-card"
55
55
  ],
56
56
  attachmentUploadProgressBarIndicator: ["block h-full", "rounded-[inherit] bg-info"],
@@ -18,7 +18,7 @@ const copyableCode = tv({
18
18
  action: [
19
19
  "shrink-0",
20
20
  "**:data-[slot=button]:transition-[color,background-color,box-shadow]",
21
- "**:data-[slot=button]:duration-150 **:data-[slot=button]:ease-out"
21
+ "**:data-[slot=button]:duration-150 [&_[data-slot=button]]:ease-out"
22
22
  ],
23
23
  iconSwap: [
24
24
  "relative inline-grid",
@@ -61,9 +61,9 @@ const dialog = tv({
61
61
  bar: {
62
62
  false: {},
63
63
  true: {
64
- header: ["flex h-14 shrink-0 items-center gap-2 border-b px-5 py-0", "border-line-seam pt-0 *:data-[slot=dialog-close]:my-0"],
65
- body: ["flex min-h-0 flex-1 overflow-hidden p-0", "p-0 first:pt-0 text-foreground"],
66
- footer: ["shrink-0 border-t px-5 py-3", "border-line-seam py-3 first:pt-3 [[data-slot=dialog-header]+&]:pt-3"]
64
+ header: ["flex h-14 shrink-0 items-center gap-2 border-b px-5 py-0", "border-line-seam pt-0 [&>[data-slot=dialog-close]]:my-0"],
65
+ body: ["flex min-h-0 flex-1 overflow-hidden p-0", "px-0 pt-0 pb-0 first:pt-0 text-foreground"],
66
+ footer: ["shrink-0 border-t px-5 py-3", "border-line-seam pt-3 pb-3 first:pt-3 [[data-slot=dialog-header]+&]:pt-3"]
67
67
  }
68
68
  },
69
69
  layer: {
@@ -22,7 +22,7 @@ const dropdownMenu = tv({ slots: {
22
22
  "min-h-option gap-2.5 rounded-chip px-2.5 py-option-inset",
23
23
  "font-sans text-callout font-medium text-foreground",
24
24
  "hover:bg-brand-soft data-highlighted:bg-brand-soft",
25
- "data-checked:font-bold data-selected:font-bold data-[emphasis=strong]:font-bold",
25
+ "data-checked:font-bold data-[selected]:font-bold data-[emphasis=strong]:font-bold",
26
26
  "data-disabled:pointer-events-none data-disabled:text-foreground-disabled",
27
27
  "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg:not([class*='size-'])]:size-4",
28
28
  "[&>svg]:text-foreground-muted data-disabled:[&>svg]:text-foreground-disabled"
@@ -6,8 +6,8 @@ const emptyState = tv({ slots: {
6
6
  root: ["flex w-full min-w-0 flex-col items-center justify-center px-6 py-12 text-center"],
7
7
  content: [
8
8
  "flex w-full max-w-sm min-w-0 flex-col items-center gap-2 text-center",
9
- "*:data-[slot=empty-state-icon]:mb-0",
10
- "*:data-[slot=empty-state-title]:mb-0"
9
+ "[&>[data-slot=empty-state-icon]]:mb-0",
10
+ "[&>[data-slot=empty-state-title]]:mb-0"
11
11
  ],
12
12
  icon: ["mb-4 inline-flex items-center justify-center [&_svg]:shrink-0", "text-foreground-hint [&_svg]:size-9"],
13
13
  title: ["mb-2 w-full max-w-full text-center text-balance", "font-sans text-headline font-bold text-foreground-muted"],
@@ -2,7 +2,7 @@ import { tv } from "../../lib/tv.mjs";
2
2
  //#region src/components/file-preview/file-preview.recipe.ts
3
3
  const filePreview = tv({
4
4
  slots: {
5
- root: ["relative flex size-10 shrink-0 items-center justify-center"],
5
+ root: ["relative flex h-10 w-10 shrink-0 items-center justify-center"],
6
6
  document: ["relative h-10 w-8 stack-y-1.5 rounded-md rounded-tr-[15%] p-1.5 ring-1", "bg-layer-card shadow-none ring-line-hairline"],
7
7
  file: ["relative flex h-10 w-8 items-center justify-center rounded-md rounded-tr-[15%] ring-1", "bg-layer-card shadow-none ring-line-hairline"],
8
8
  code: ["relative flex h-10 w-8 items-center justify-center rounded-md rounded-tr-[15%] ring-1", "bg-layer-card shadow-none ring-line-hairline"],
@@ -31,7 +31,7 @@ const filePreview = tv({
31
31
  },
32
32
  variants: { placement: {
33
33
  corner: { badge: "absolute -right-1.5 bottom-0.5 z-10" },
34
- inline: { badge: "inline-flex h-3.5 w-7 shrink-0 items-center justify-center p-0 " }
34
+ inline: { badge: "inline-flex h-3.5 w-7 shrink-0 items-center justify-center px-0 py-0" }
35
35
  } },
36
36
  defaultVariants: { placement: "corner" }
37
37
  });
@@ -23,7 +23,7 @@ const files = tv({ slots: {
23
23
  "[&_svg]:size-4.5 [&_svg]:shrink-0",
24
24
  "has-data-[slot=file-preview]:overflow-visible has-data-[slot=file-preview]:border-0 has-data-[slot=file-preview]:bg-transparent",
25
25
  "size-9 rounded-chip border-0 bg-fill-muted text-foreground-muted",
26
- "has-data-[slot=file-preview]:size-9"
26
+ "has-[[data-slot=file-preview]]:size-9"
27
27
  ],
28
28
  image: [
29
29
  "block size-full",
@@ -2,7 +2,11 @@ import { SVGProps } from "react";
2
2
  //#region src/components/icons/conversation-icons.d.ts
3
3
  export type ConversationIconProps = SVGProps<SVGSVGElement>;
4
4
  export declare function MessageIcon(props: ConversationIconProps): import("react").JSX.Element;
5
- export declare function ChatIcon(props: ConversationIconProps): import("react").JSX.Element;
5
+ /**
6
+ * A chat: the same plain speech bubble as MessageIcon. Raft draws no
7
+ * difference between a message and a chat (stdrc and Artea, 2026-10-30).
8
+ */
9
+ export declare const ChatIcon: typeof MessageIcon;
6
10
  export declare function DirectMessageIcon(props: ConversationIconProps): import("react").JSX.Element;
7
11
  export declare function ThreadIcon(props: ConversationIconProps): import("react").JSX.Element;
8
12
  /** A comment, said about a passage: MessageIcon's bubble with quote marks. */
@@ -17,46 +17,11 @@ function MessageIcon(props) {
17
17
  children: /* @__PURE__ */ jsx("path", { d: "M14.25 2.25H3.75C2.65 2.25 1.75 3.15 1.75 4.25V11.25C1.75 12.35 2.65 13.25 3.75 13.25H5.75V16.25L9.5 13.25H14.25C15.35 13.25 16.25 12.35 16.25 11.25V4.25C16.25 3.15 15.35 2.25 14.25 2.25Z" })
18
18
  });
19
19
  }
20
- function ChatIcon(props) {
21
- return /* @__PURE__ */ jsxs("svg", {
22
- xmlns: "http://www.w3.org/2000/svg",
23
- width: 18,
24
- height: 18,
25
- viewBox: "0 0 18 18",
26
- "aria-hidden": "true",
27
- focusable: "false",
28
- fill: "none",
29
- stroke: "currentColor",
30
- strokeLinecap: "round",
31
- strokeLinejoin: "round",
32
- strokeWidth: 1.5,
33
- ...props,
34
- children: [
35
- /* @__PURE__ */ jsx("path", { d: "M14.25 2.25H3.75C2.65 2.25 1.75 3.15 1.75 4.25V11.25C1.75 12.35 2.65 13.25 3.75 13.25H5.75V16.25L9.5 13.25H14.25C15.35 13.25 16.25 12.35 16.25 11.25V4.25C16.25 3.15 15.35 2.25 14.25 2.25Z" }),
36
- /* @__PURE__ */ jsx("circle", {
37
- cx: 6.5,
38
- cy: 7.75,
39
- r: .75,
40
- fill: "currentColor",
41
- stroke: "none"
42
- }),
43
- /* @__PURE__ */ jsx("circle", {
44
- cx: 9,
45
- cy: 7.75,
46
- r: .75,
47
- fill: "currentColor",
48
- stroke: "none"
49
- }),
50
- /* @__PURE__ */ jsx("circle", {
51
- cx: 11.5,
52
- cy: 7.75,
53
- r: .75,
54
- fill: "currentColor",
55
- stroke: "none"
56
- })
57
- ]
58
- });
59
- }
20
+ /**
21
+ * A chat: the same plain speech bubble as MessageIcon. Raft draws no
22
+ * difference between a message and a chat (stdrc and Artea, 2026-10-30).
23
+ */
24
+ const ChatIcon = MessageIcon;
60
25
  function DirectMessageIcon(props) {
61
26
  return /* @__PURE__ */ jsxs("svg", {
62
27
  xmlns: "http://www.w3.org/2000/svg",
@@ -20,9 +20,9 @@ const lightbox = tv({ slots: {
20
20
  header: [
21
21
  "pointer-events-auto shrink-0",
22
22
  "flex items-center gap-3 pb-3",
23
- "pt-[calc(env(safe-area-inset-top,0px)+(--spacing(3)))]",
24
- "pl-[calc(env(safe-area-inset-left,0px)+(--spacing(4)))]",
25
- "pr-[calc(env(safe-area-inset-right,0px)+(--spacing(4)))]",
23
+ "pt-[calc(env(safe-area-inset-top,0px)+--spacing(3))]",
24
+ "pl-[calc(env(safe-area-inset-left,0px)+--spacing(4))]",
25
+ "pr-[calc(env(safe-area-inset-right,0px)+--spacing(4))]",
26
26
  "bg-transparent shadow-none",
27
27
  headEdgePull
28
28
  ],
@@ -60,7 +60,7 @@ const lightbox = tv({ slots: {
60
60
  "focus-visible:outline-transparent focus-visible:shadow-focus",
61
61
  "[&_svg]:size-5.5"
62
62
  ],
63
- infoDock: ["pointer-events-none absolute inset-x-6 bottom-20 z-10 flex justify-center"],
63
+ infoDock: ["pointer-events-none absolute right-6 bottom-20 left-6 z-10 flex justify-center"],
64
64
  infoBar: [
65
65
  "pointer-events-auto flex items-center",
66
66
  "w-[clamp(144px,20vw,224px)] max-w-[calc(100vw-48px)] min-w-36",
@@ -76,7 +76,7 @@ const lightbox = tv({ slots: {
76
76
  "*:data-[slot=button]:after:inset-x-[-3px] *:data-[slot=button]:first:after:left-[-9.5px] *:data-[slot=button]:last:after:right-[-9.5px]",
77
77
  "pointer-coarse:*:data-[slot=button]:after:inset-y-[-9.5px]"
78
78
  ],
79
- thumbnailStrip: ["pointer-events-none absolute inset-x-0 bottom-4 z-10", "flex items-center justify-center gap-1.5"],
79
+ thumbnailStrip: ["pointer-events-none absolute right-0 bottom-4 left-0 z-10", "flex items-center justify-center gap-1.5"],
80
80
  thumbnail: [
81
81
  "group/lightbox-thumb pointer-events-auto relative size-12 overflow-hidden",
82
82
  "transition-[border-color,opacity,box-shadow] duration-150",
@@ -27,17 +27,17 @@ const messageImageGallery = tv({
27
27
  {
28
28
  count: 1,
29
29
  single: false,
30
- class: { row: "auto-rows-32 @min-[360px]/gallery:auto-rows-36" }
30
+ class: { row: "auto-rows-[8rem] @min-[360px]/gallery:auto-rows-[9rem]" }
31
31
  },
32
32
  {
33
33
  count: 2,
34
34
  single: false,
35
- class: { row: "auto-rows-32 @min-[360px]/gallery:auto-rows-36" }
35
+ class: { row: "auto-rows-[8rem] @min-[360px]/gallery:auto-rows-[9rem]" }
36
36
  },
37
37
  {
38
38
  count: 3,
39
39
  single: false,
40
- class: { row: "auto-rows-28 @min-[360px]/gallery:auto-rows-32" }
40
+ class: { row: "auto-rows-[7rem] @min-[360px]/gallery:auto-rows-[8rem]" }
41
41
  }
42
42
  ],
43
43
  variants: {
@@ -47,7 +47,7 @@ const messageImageGallery = tv({
47
47
  3: { row: "grid-cols-2" }
48
48
  },
49
49
  /** A single-image gallery keeps the image's proportions instead of a row height. */
50
- single: { true: { item: ["inline-block w-fit max-w-104 justify-self-start", "rounded-container"] } },
50
+ single: { true: { item: ["inline-block w-fit max-w-[26rem] justify-self-start", "rounded-container"] } },
51
51
  /** Set from an item layout: the cell owns its media sizing. */
52
52
  laidOut: { true: { item: "[&_img]:block [&_img]:size-full" } },
53
53
  /** How the media fills its cell: cropped, or fully visible on a neutral backdrop. */
@@ -72,9 +72,9 @@ const messageForwardedBundleGallery = tv({
72
72
  tile: ["[&_img]:block [&_img]:size-full [&_img]:object-cover"]
73
73
  },
74
74
  variants: { count: {
75
- 1: { row: "grid-cols-1 auto-rows-32 @min-[360px]/bundle:auto-rows-36" },
76
- 2: { row: "grid-cols-2 auto-rows-32 @min-[360px]/bundle:auto-rows-36" },
77
- 3: { row: "grid-cols-2 auto-rows-28 @min-[360px]/bundle:auto-rows-32 @min-[360px]/bundle:grid-cols-3" }
75
+ 1: { row: "grid-cols-1 auto-rows-[8rem] @min-[360px]/bundle:auto-rows-[9rem]" },
76
+ 2: { row: "grid-cols-2 auto-rows-[8rem] @min-[360px]/bundle:auto-rows-[9rem]" },
77
+ 3: { row: "grid-cols-2 auto-rows-[7rem] @min-[360px]/bundle:auto-rows-[8rem] @min-[360px]/bundle:grid-cols-3" }
78
78
  } }
79
79
  });
80
80
  //#endregion
@@ -46,7 +46,7 @@ const messageReaction = tv({ slots: {
46
46
  quickRow: [
47
47
  "flex shrink-0 items-center",
48
48
  "justify-between gap-0.5 bg-layer-popover px-0.75 py-0",
49
- "*:[[role=menuitem]]:size-9 *:[[role=menuitem]]:p-0 *:[[role=menuitem]]:justify-center"
49
+ "[&>[role=menuitem]]:size-9 [&>[role=menuitem]]:p-0 *:[[role=menuitem]]:justify-center"
50
50
  ],
51
51
  quickButton: [
52
52
  "flex items-center justify-center",
@@ -58,7 +58,7 @@ const messageReaction = tv({ slots: {
58
58
  pickerContent: [
59
59
  "inline-flex items-center",
60
60
  "min-w-0 flex-row gap-0.5 p-1",
61
- "*:[[role=menuitem]]:size-9 *:[[role=menuitem]]:p-0"
61
+ "[&>[role=menuitem]]:size-9 [&>[role=menuitem]]:p-0"
62
62
  ],
63
63
  pickerStatic: [
64
64
  "inline-flex items-center",
@@ -25,7 +25,7 @@ const mobileNavServer = tv({ slots: {
25
25
  "min-h-option gap-2.5 rounded-chip px-2.5 py-option-inset",
26
26
  "font-sans text-callout font-medium text-foreground",
27
27
  "hover:bg-brand-soft active:bg-brand-soft focus-visible:bg-brand-soft",
28
- "aria-current:font-bold",
28
+ "aria-[current=true]:font-bold",
29
29
  "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg:not([class*='size-'])]:size-4",
30
30
  "[&>svg]:text-foreground-muted",
31
31
  "*:data-[slot=avatar]:size-5 *:data-[slot=avatar]:shrink-0"
@@ -66,7 +66,7 @@ const panelHeader = tv({
66
66
  slots: ["sectionHeader"],
67
67
  class: [
68
68
  "max-md:bg-layer-frame max-md:text-foreground-on-frame",
69
- "max-md:*:data-[slot=panel-header-icon]:hidden",
69
+ "max-md:[&>[data-slot=panel-header-icon]]:hidden",
70
70
  "max-md:**:data-[slot=panel-title]:text-foreground-on-frame",
71
71
  "max-md:**:data-[slot=panel-meta]:text-foreground-on-frame-muted",
72
72
  "max-md:**:data-[slot=panel-action]:text-foreground-on-frame",
@@ -39,7 +39,7 @@ const panelSplitActionMenu = tv({
39
39
  base: [
40
40
  "pointer-events-auto min-w-0 rounded-s-none px-0",
41
41
  "w-6 me-5 md:pointer-fine:w-5 md:pointer-fine:me-0",
42
- "after:inset-s-0 after:inset-e-[-21.5px] md:pointer-fine:after:-inset-e-[calc(var(--spacing-control-hit)+1.5px)]",
42
+ "after:start-0 after:inset-e-[-21.5px] md:pointer-fine:after:-end-[calc(var(--spacing-control-hit)+1.5px)]",
43
43
  "focus-visible:z-1",
44
44
  "[[data-split-action-main][data-pressed]~&]:[--split-action-menu-tint:var(--fill-subtle)]",
45
45
  "[[data-split-action-main][aria-pressed=true]~&]:[--split-action-menu-tint:var(--fill-subtle)]",
@@ -51,7 +51,7 @@ const progress = tv({
51
51
  indicator: [
52
52
  "block h-full bg-(--progress-indicator)",
53
53
  "transition-[width,background-color] duration-200 ease-out",
54
- "data-indeterminate:absolute data-indeterminate:inset-y-0 data-indeterminate:w-1/2",
54
+ "data-indeterminate:absolute data-[indeterminate]:inset-y-0 data-indeterminate:w-1/2",
55
55
  "data-indeterminate:origin-left data-indeterminate:animate-[raft-progress-indeterminate_1.4s_ease-in-out_infinite]",
56
56
  "rounded-[inherit] inset-ring-[1.5px] inset-ring-sticker-ink"
57
57
  ]
@@ -5,10 +5,10 @@ const resizable = tv({ slots: {
5
5
  panel: ["min-h-0 min-w-0"],
6
6
  handle: [
7
7
  "right-0 z-10 cursor-ew-resize touch-none select-none",
8
- "relative -mx-1.5 flex w-3 shrink-0 items-center justify-center pointer-coarse:-mx-3 pointer-coarse:w-6",
8
+ "relative -ml-1.5 -mr-1.5 flex w-3 shrink-0 items-center justify-center pointer-coarse:-ml-3 pointer-coarse:-mr-3 pointer-coarse:w-6",
9
9
  "before:pointer-events-none before:absolute before:transition-colors before:content-['']",
10
10
  "focus-visible:outline-none focus-visible:before:outline-2 focus-visible:before:outline-offset-2 focus-visible:before:outline-foreground",
11
- "data-[orientation=horizontal]:-my-1.5 data-[orientation=horizontal]:mx-0 data-[orientation=horizontal]:h-3 data-[orientation=horizontal]:w-full data-[orientation=horizontal]:cursor-ns-resize",
11
+ "data-[orientation=horizontal]:-mt-1.5 data-[orientation=horizontal]:-mb-1.5 data-[orientation=horizontal]:ml-0 data-[orientation=horizontal]:mr-0 data-[orientation=horizontal]:h-3 data-[orientation=horizontal]:w-full data-[orientation=horizontal]:cursor-ns-resize",
12
12
  "bg-transparent",
13
13
  "before:top-0 before:left-[5px] pointer-coarse:before:left-[11px] before:h-full before:w-px before:translate-none before:rounded-none",
14
14
  "before:bg-transparent",
@@ -22,7 +22,7 @@ const switchRecipe = tv({ slots: {
22
22
  "pointer-events-none block",
23
23
  "transition-transform ease-out",
24
24
  "motion-reduce:transition-none",
25
- "size-[22px] rounded-full bg-layer-card shadow-[0_0_0_1.5px_var(--line-strong)] data-checked:translate-x-5",
25
+ "size-[22px] rounded-full bg-layer-card shadow-[0_0_0_1.5px_var(--line-strong)] data-[checked]:translate-x-5",
26
26
  "duration-220 ease-slide",
27
27
  "data-checked:bg-sticker-paper data-checked:shadow-[0_0_0_1.5px_var(--sticker-ink)]",
28
28
  "data-disabled:bg-fill-muted data-disabled:shadow-[0_0_0_1.5px_var(--foreground-disabled)]",
@@ -10,7 +10,7 @@ const taskBoardColumn = tv({ slots: {
10
10
  "group flex w-full touch-manipulation items-center justify-between text-left outline-none",
11
11
  "min-h-8 gap-2 rounded-control",
12
12
  "font-sans text-footnote font-bold text-foreground-muted",
13
- "data-panel-open:mb-2",
13
+ "data-[panel-open]:mb-2",
14
14
  "focus-visible:shadow-focus"
15
15
  ],
16
16
  heading: ["flex min-w-0 items-center", "gap-2"],
@@ -5,9 +5,9 @@ const taskCardStatus = tv({ base: [
5
5
  "transition-[filter,opacity] duration-100 outline-none",
6
6
  "data-[busy=true]:pointer-events-none data-[busy=true]:cursor-wait data-[busy=true]:opacity-dimmed data-[busy=true]:disabled:opacity-100",
7
7
  "h-[22px] gap-1.5 rounded-chip border-0 px-[7px] py-0",
8
- "font-sans text-[12px]/4 font-semibold text-foreground",
8
+ "font-sans text-[12px] leading-4 font-semibold text-foreground",
9
9
  "[&:not(:has([data-slot=task-card-status-label]))]:hidden",
10
- "**:data-[slot=task-card-status-label]:inline-flex **:data-[slot=task-card-status-label]:items-center **:data-[slot=task-card-status-label]:gap-1.5",
10
+ "**:data-[slot=task-card-status-label]:inline-flex **:data-[slot=task-card-status-label]:items-center [&_[data-slot=task-card-status-label]]:gap-1.5",
11
11
  "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-3 [&_svg:not([data-slot=task-status-icon])]:-mx-0.5 [&_svg[data-slot=task-status-icon]]:size-2.5",
12
12
  "[button&]:cursor-pointer [button&]:enabled:hover:overlay-medium [button&]:enabled:active:overlay-medium",
13
13
  "disabled:cursor-default disabled:opacity-100",
@@ -26,7 +26,7 @@ const taskChip = tv({
26
26
  closed: { root: ["bg-task-status-closed-soft"] }
27
27
  },
28
28
  variant: {
29
- default: { root: ["h-[22px] items-baseline gap-1.5 rounded-chip px-[7px] py-[3px] [&>svg]:self-center", "text-[12px]/4 "] },
29
+ default: { root: ["h-[22px] items-baseline gap-1.5 rounded-chip px-[7px] py-[3px] [&>svg]:self-center", "text-[12px] leading-4"] },
30
30
  inline: {}
31
31
  },
32
32
  size: {
@@ -17,12 +17,12 @@ const heading = tv({
17
17
  base: ["m-0 font-heading font-medium text-foreground"],
18
18
  variants: {
19
19
  level: {
20
- 1: ["text-[56px]/16 tracking-[-0.01em] "],
21
- 2: ["text-5xl/14 tracking-[-0.01em] "],
22
- 3: ["text-[40px]/12 tracking-[-0.01em] "],
23
- 4: ["text-[32px]/10 tracking-[-0.005em] "],
24
- 5: ["text-2xl/8 "],
25
- 6: ["text-xl/7 "]
20
+ 1: ["text-[56px] tracking-[-0.01em] leading-16"],
21
+ 2: ["text-5xl tracking-[-0.01em] leading-14"],
22
+ 3: ["text-[40px] tracking-[-0.01em] leading-12"],
23
+ 4: ["text-[32px] tracking-[-0.005em] leading-10"],
24
+ 5: ["text-2xl leading-8"],
25
+ 6: ["text-xl leading-7"]
26
26
  },
27
27
  variant: textColorVariants
28
28
  },
@@ -32,10 +32,10 @@ const sans = tv({
32
32
  base: ["m-0 font-sans font-normal"],
33
33
  variants: {
34
34
  size: {
35
- large: ["text-lg/7 text-foreground"],
36
- body: ["text-base/6 text-foreground"],
37
- small: ["text-sm/5 text-foreground-muted"],
38
- caption: ["text-xs/4 text-foreground-muted"],
35
+ large: ["text-lg leading-7 text-foreground"],
36
+ body: ["text-base leading-6 text-foreground"],
37
+ small: ["text-sm leading-5 text-foreground-muted"],
38
+ caption: ["text-xs leading-4 text-foreground-muted"],
39
39
  group: ["text-footnote font-bold text-foreground-hint"]
40
40
  },
41
41
  variant: textColorVariants
@@ -46,9 +46,9 @@ const mono = tv({
46
46
  base: ["m-0 font-mono font-normal"],
47
47
  variants: {
48
48
  size: {
49
- code: ["text-sm/5 text-foreground"],
50
- meta: ["text-xs/4 text-foreground-muted"],
51
- tabular: ["text-sm/5 tabular-nums text-foreground"]
49
+ code: ["text-sm leading-5 text-foreground"],
50
+ meta: ["text-xs leading-4 text-foreground-muted"],
51
+ tabular: ["text-sm tabular-nums leading-5 text-foreground"]
52
52
  },
53
53
  variant: textColorVariants
54
54
  },
@@ -2,7 +2,7 @@ import { tv } from "../../lib/tv.mjs";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/components/textarea/textarea.tsx
4
4
  const textarea = tv({ slots: { root: [
5
- "block w-full min-h-[calc(var(--field-line-height)*3+(--spacing(6)))] resize-y pl-3 pr-(--ta-pr,0.75rem)",
5
+ "block w-full min-h-[calc(var(--field-line-height)*3+--spacing(6))] resize-y pl-3 pr-(--ta-pr,0.75rem)",
6
6
  "scroll-pb-(--ta-scroll-pb,0)",
7
7
  "font-heading text-field font-field outline-none",
8
8
  "py-2.5",
@@ -17,7 +17,7 @@ const textareaCounter = tv({
17
17
  slots: { root: [
18
18
  "font-mono tabular-nums",
19
19
  "text-mono-meta text-foreground-hint",
20
- "group-data-invalid/field:font-bold group-data-invalid/field:text-danger-strong"
20
+ "group-data-[invalid]/field:font-bold group-data-invalid/field:text-danger-strong"
21
21
  ] },
22
22
  variants: { overLimit: {
23
23
  true: { root: ["font-bold text-danger-strong"] },
@@ -18,7 +18,7 @@ const threadPanel = tv({ slots: {
18
18
  actions: panelHeadActions,
19
19
  search: [
20
20
  "relative z-20 flex shrink-0 items-center gap-1.5 py-2",
21
- "*:data-[slot=input-group]:min-w-0 *:data-[slot=input-group]:flex-1",
21
+ "[&>[data-slot=input-group]]:min-w-0 *:data-[slot=input-group]:flex-1",
22
22
  "border-b border-line-hairline bg-layer-canvas px-5"
23
23
  ],
24
24
  searchTrailing: ["ml-auto flex shrink-0 items-center gap-1.5"],
@@ -20,13 +20,13 @@ const tooltip = tv({
20
20
  "rounded-chip bg-layer-hud text-foreground-on-hud",
21
21
  "font-sans font-medium",
22
22
  "shadow-float",
23
- "has-data-[slot=kbd]:py-1 has-data-[slot=kbd]:pr-2.5"
23
+ "has-[[data-slot=kbd]]:py-1 has-[[data-slot=kbd]]:pr-2.5"
24
24
  ],
25
25
  body: [
26
26
  "block min-w-0 text-footnote whitespace-normal wrap-break-word",
27
- "**:data-[slot=kbd]:relative **:data-[slot=kbd]:z-10 **:data-[slot=kbd]:ml-1.5",
28
- "**:data-[slot=kbd]:h-4 **:data-[slot=kbd]:min-w-4 **:data-[slot=kbd]:px-1 **:data-[slot=kbd]:py-0",
29
- "**:data-[slot=kbd]:text-[12px]/4 **:data-[slot=kbd]:font-normal"
27
+ "**:data-[slot=kbd]:relative **:data-[slot=kbd]:z-10 [&_[data-slot=kbd]]:ml-1.5",
28
+ "[&_[data-slot=kbd]]:h-4 [&_[data-slot=kbd]]:min-w-4 [&_[data-slot=kbd]]:px-1 [&_[data-slot=kbd]]:py-0",
29
+ "**:data-[slot=kbd]:text-[12px] **:data-[slot=kbd]:leading-4 [&_[data-slot=kbd]]:font-normal"
30
30
  ],
31
31
  bodyIcon: ["shrink-0 [&>svg]:block [&>svg]:size-3.5 [&>svg]:shrink-0"],
32
32
  bodyText: ["min-w-0 flex-1"],
@@ -9,7 +9,7 @@ function WorkspaceButton({ className, children, ...props }) {
9
9
  variant: "on-frame",
10
10
  size: "md",
11
11
  "data-slot": "workspace-button",
12
- className: cn("max-w-full min-w-0 shrink justify-start gap-2", "*:data-[slot=button-content]:max-w-full *:data-[slot=button-content]:min-w-0", className),
12
+ className: cn("max-w-full min-w-0 shrink justify-start gap-2", "*:data-[slot=button-content]:max-w-full [&>[data-slot=button-content]]:min-w-0", className),
13
13
  children: [children, /* @__PURE__ */ jsx(ChevronDown, {
14
14
  "aria-hidden": true,
15
15
  "data-slot": "workspace-button-chevron",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botiverse/raft-ui",
3
- "version": "0.52.3",
3
+ "version": "0.53.0",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",