@botiverse/raft-ui 0.64.0 → 0.65.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 (81) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/components/activity-inbox/activity-inbox-sidebar.recipe.mjs +1 -1
  3. package/dist/components/activity-inbox/activity-inbox-toolbar.recipe.mjs +6 -1
  4. package/dist/components/alert-dialog/alert-dialog.mjs +3 -3
  5. package/dist/components/announcement-dialog/announcement-dialog.mjs +2 -2
  6. package/dist/components/app-link-card/app-link-card.mjs +1 -1
  7. package/dist/components/app-rail/app-rail.recipe.mjs +12 -7
  8. package/dist/components/app-shell/app-shell.mjs +1 -1
  9. package/dist/components/avatar/avatar.mjs +1 -0
  10. package/dist/components/badge/badge.mjs +6 -1
  11. package/dist/components/banner/banner.mjs +1 -1
  12. package/dist/components/button/button-split.mjs +10 -3
  13. package/dist/components/button/button.mjs +13 -8
  14. package/dist/components/code-block/code-block.recipe.mjs +1 -1
  15. package/dist/components/combobox/combobox.mjs +4 -4
  16. package/dist/components/combobox-select/combobox-select.css +6 -3
  17. package/dist/components/composer/composer-suggestion-list.mjs +1 -1
  18. package/dist/components/composer/composer-toolbar-label.mjs +1 -1
  19. package/dist/components/composer/composer.mjs +1 -1
  20. package/dist/components/composer/composer.recipe.mjs +38 -26
  21. package/dist/components/conversation-panel/conversation-panel-empty-state.mjs +1 -1
  22. package/dist/components/conversation-panel/conversation-panel.recipe.mjs +3 -2
  23. package/dist/components/dialog/dialog-sheet-context.mjs +1 -1
  24. package/dist/components/dialog/dialog.mjs +7 -7
  25. package/dist/components/drawer/drawer.mjs +3 -2
  26. package/dist/components/drawer/drawer.recipe.mjs +5 -3
  27. package/dist/components/empty-state/empty-state.mjs +1 -1
  28. package/dist/components/field/field.mjs +1 -1
  29. package/dist/components/files/files.recipe.mjs +1 -1
  30. package/dist/components/filter-chip/filter-chip.mjs +1 -1
  31. package/dist/components/form-section/form-section.mjs +1 -1
  32. package/dist/components/icon-tile/icon-tile.mjs +3 -3
  33. package/dist/components/inbox-item/inbox-item.recipe.mjs +4 -2
  34. package/dist/components/input/input.recipe.mjs +1 -1
  35. package/dist/components/input-group/input-group.mjs +1 -1
  36. package/dist/components/lightbox/lightbox.mjs +1 -1
  37. package/dist/components/list-row/list-row.recipe.mjs +2 -2
  38. package/dist/components/message-action-card/message-action-card-content.recipe.mjs +1 -1
  39. package/dist/components/message-action-card/message-action-card.recipe.mjs +1 -1
  40. package/dist/components/message-item/index.d.mts +2 -2
  41. package/dist/components/message-item/message-item-content.d.mts +14 -0
  42. package/dist/components/message-item/message-item-content.mjs +146 -1
  43. package/dist/components/message-item/message-item.recipe.d.mts +3 -0
  44. package/dist/components/message-item/message-item.recipe.mjs +3 -2
  45. package/dist/components/message-item/message-reaction.recipe.mjs +4 -3
  46. package/dist/components/message-list/message-list.recipe.mjs +3 -1
  47. package/dist/components/mode-bar/mode-bar.mjs +1 -1
  48. package/dist/components/notification-center/notification-center.mjs +1 -1
  49. package/dist/components/panel/panel-action.recipe.mjs +5 -5
  50. package/dist/components/panel/panel-header.recipe.mjs +10 -9
  51. package/dist/components/panel/panel.recipe.mjs +2 -2
  52. package/dist/components/picker-trigger-button/picker-trigger-button.mjs +1 -1
  53. package/dist/components/profile-panel/profile-panel.recipe.mjs +1 -1
  54. package/dist/components/scroll-area/scroll-area.css +74 -33
  55. package/dist/components/search/search-entity.recipe.mjs +3 -2
  56. package/dist/components/search/search-message.recipe.mjs +1 -0
  57. package/dist/components/search/search-thread.recipe.mjs +1 -1
  58. package/dist/components/search/search-trigger.mjs +1 -1
  59. package/dist/components/search/search.recipe.mjs +7 -3
  60. package/dist/components/segmented-control/segmented-control.mjs +9 -8
  61. package/dist/components/select/select.mjs +2 -2
  62. package/dist/components/sidebar/sidebar-item.recipe.mjs +5 -4
  63. package/dist/components/sidebar/sidebar-section.recipe.mjs +5 -2
  64. package/dist/components/sidebar/sidebar.recipe.mjs +3 -3
  65. package/dist/components/switch/switch.mjs +3 -3
  66. package/dist/components/tabs/tabs.mjs +1 -1
  67. package/dist/components/task-board/task-board-column.recipe.mjs +1 -1
  68. package/dist/components/task-list/task-list-section.recipe.mjs +1 -1
  69. package/dist/components/tasks/tasks-panel.recipe.mjs +4 -3
  70. package/dist/components/text-selection-toolbar/text-selection-toolbar.recipe.mjs +1 -1
  71. package/dist/components/textarea/textarea.mjs +1 -1
  72. package/dist/components/thread-panel/thread-panel.recipe.mjs +3 -3
  73. package/dist/components/toggle-group/toggle-group.mjs +1 -1
  74. package/dist/foundation.css +100 -5
  75. package/dist/lib/head-edges.mjs +38 -8
  76. package/dist/lib/list-cell.mjs +1 -0
  77. package/dist/styles.css +54 -7
  78. package/dist/tokens.json +260 -4
  79. package/dist/wip.d.mts +2 -1
  80. package/dist/wip.mjs +2 -1
  81. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { barButton } from "../../lib/head-edges.mjs";
1
2
  import { tv } from "../../lib/tv.mjs";
2
3
  import { panelHeadEdges } from "../panel/panel-header.recipe.mjs";
3
4
  //#region src/components/drawer/drawer.recipe.ts
@@ -84,6 +85,7 @@ const drawer = tv({
84
85
  "before:rounded-full before:bg-line-seam"
85
86
  ],
86
87
  close: ["shrink-0"],
88
+ closeButton: [barButton],
87
89
  closeIcon: ["size-control-icon"],
88
90
  header: ["flex flex-col", "items-stretch gap-1 px-4 pt-4 pb-2 text-left"],
89
91
  body: ["flex flex-1 flex-col", "items-stretch px-4 pt-2 pb-4 text-left"],
@@ -136,12 +138,12 @@ const drawer = tv({
136
138
  "before:w-1 before:h-9"
137
139
  ],
138
140
  header: [
139
- "min-h-14 shrink-0 flex-row items-center justify-between gap-2 py-0 text-left",
141
+ "min-h-(--header-height) shrink-0 flex-row items-center justify-between gap-2 py-0 text-left",
140
142
  "border-b border-line-seam",
141
143
  panelHeadEdges
142
144
  ],
143
- body: ["items-stretch text-left", "min-h-0 overflow-y-auto px-5 py-4"],
144
- footer: ["border-t border-line-seam px-5 py-3"],
145
+ body: ["items-stretch text-left", "min-h-0 overflow-y-auto px-(--surface-inset) pt-(--page-top) pb-(--page-inset)"],
146
+ footer: ["border-t border-line-seam px-(--surface-inset) py-3"],
145
147
  title: ["min-w-0 max-w-none flex-1 text-left"],
146
148
  description: ["max-w-none text-left"],
147
149
  actions: ["flex-row flex-wrap justify-end", "**:data-[slot=button]:w-auto"]
@@ -3,7 +3,7 @@ import { mergeProps } from "@base-ui/react/merge-props";
3
3
  import { useRender } from "@base-ui/react/use-render";
4
4
  //#region src/components/empty-state/empty-state.tsx
5
5
  const emptyState = tv({ slots: {
6
- root: ["flex w-full min-w-0 flex-col items-center justify-center px-6 py-12 text-center"],
6
+ root: ["flex w-full min-w-0 flex-col items-center justify-center px-6 md:pointer-fine:px-(--page-inset) 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
9
  "[&>[data-slot=empty-state-icon]]:mb-0",
@@ -11,7 +11,7 @@ const field = tv({
11
11
  "*:min-w-0",
12
12
  "*:data-[slot=checkbox]:mt-[calc((1lh-1.25rem)/2)]",
13
13
  "*:data-[slot=radio-group-item]:mt-[calc((1lh-1.25rem)/2)]",
14
- "*:data-[slot=switch]:mt-[calc((1lh-1.875rem)/2)]"
14
+ "*:data-[slot=switch]:mt-[calc((1lh-var(--switch-height))/2)]"
15
15
  ],
16
16
  label: [
17
17
  "block wrap-anywhere",
@@ -3,7 +3,7 @@ import { tv } from "../../lib/tv.mjs";
3
3
  const files = tv({ slots: {
4
4
  panel: ["flex min-h-0 flex-1 flex-col", "bg-layer-canvas text-foreground"],
5
5
  viewport: ["min-h-0 flex-1 overflow-y-auto"],
6
- list: ["flex flex-col gap-2 px-5 py-3", "max-md:px-4"],
6
+ list: ["flex flex-col gap-2 px-(--surface-inset) py-3", "max-md:px-4"],
7
7
  row: [
8
8
  "group/file-row flex w-full min-w-0 gap-3 px-3",
9
9
  "transition-colors",
@@ -7,7 +7,7 @@ import { Button } from "@base-ui/react/button";
7
7
  //#region src/components/filter-chip/filter-chip.tsx
8
8
  const filterChip = tv({ slots: {
9
9
  root: [
10
- "inline-flex h-8 min-w-0 shrink items-center",
10
+ "inline-flex h-8 md:pointer-fine:h-control min-w-0 shrink items-center",
11
11
  "gap-1.5 rounded-control bg-info-soft pr-1 pl-2.5",
12
12
  "font-sans text-control font-semibold text-foreground",
13
13
  "[&>svg]:pointer-events-none [&>svg]:shrink-0",
@@ -5,7 +5,7 @@ import { mergeProps } from "@base-ui/react/merge-props";
5
5
  import { useRender } from "@base-ui/react/use-render";
6
6
  //#region src/components/form-section/form-section.tsx
7
7
  const formSection = tv({ slots: {
8
- root: ["flex flex-col gap-3 py-4 first:pt-0", "[[data-slot=form-section]+&]:border-t [[data-slot=form-section]+&]:border-line-hairline"],
8
+ root: ["flex flex-col gap-(--field-gap) py-[calc(var(--section-gap)/2)] first:pt-0", "[[data-slot=form-section]+&]:border-t [[data-slot=form-section]+&]:border-line-hairline"],
9
9
  head: ["flex min-w-0 flex-col", "gap-0.5"],
10
10
  titleRow: ["flex min-w-0 items-center gap-2"],
11
11
  title: ["m-0 min-w-0 flex-1", "font-sans text-footnote font-bold text-foreground-muted"],
@@ -12,9 +12,9 @@ const iconTile = tv({
12
12
  },
13
13
  size: {
14
14
  xs: { root: "size-[19px] [&_svg:not([class*='size-'])]:size-[11px]" },
15
- sm: { root: "size-[27px] [&_svg:not([class*='size-'])]:size-3.5" },
16
- md: { root: "size-[35px] [&_svg:not([class*='size-'])]:size-[18px]" },
17
- lg: { root: "size-[51px] [&_svg:not([class*='size-'])]:size-[22px]" }
15
+ sm: { root: "size-[27px] rounded-chip [&_svg:not([class*='size-'])]:size-3.5" },
16
+ md: { root: "size-[35px] rounded-control [&_svg:not([class*='size-'])]:size-[18px]" },
17
+ lg: { root: "size-[51px] rounded-container [&_svg:not([class*='size-'])]:size-[22px]" }
18
18
  }
19
19
  },
20
20
  defaultVariants: {
@@ -9,6 +9,8 @@ const inboxItem = tv({
9
9
  "has-data-[slot=inbox-item-leading]:grid-cols-[auto_minmax(0,1fr)_auto]",
10
10
  "has-data-[slot=inbox-item-selection]:has-data-[slot=inbox-item-leading]:grid-cols-[auto_auto_minmax(0,1fr)_auto]",
11
11
  "gap-x-3 gap-y-0 rounded-none border-0 py-3",
12
+ "md:pointer-fine:py-2",
13
+ "pointer-coarse:min-h-14 pointer-coarse:py-2",
12
14
  listCell,
13
15
  listCellStates,
14
16
  "data-[active=true]:before:bg-fill-cell-selected",
@@ -73,7 +75,7 @@ const inboxItem = tv({
73
75
  itemStatusWord: ["shrink-0 @max-[320px]/inbox-item-row:hidden"],
74
76
  itemStatusPixel: ["hidden items-center @max-[320px]/inbox-item-row:inline-flex"],
75
77
  itemListGroup: ["flex flex-col gap-0.5", "mt-1.5 first:mt-0"],
76
- itemListHeading: ["mb-0.5 px-5 py-1", "font-sans text-footnote font-bold text-foreground-hint"],
78
+ itemListHeading: ["mb-0.5 px-(--surface-inset) py-1", "font-sans text-footnote font-bold text-foreground-hint"],
77
79
  itemMarks: ["flex h-5 shrink-0 items-center justify-end gap-1.5", "text-foreground-hint"],
78
80
  itemHoverTarget: ["pointer-events-auto"],
79
81
  itemTimestamp: ["shrink-0 whitespace-nowrap text-right tabular-nums", "font-mono text-mono-meta text-foreground-hint"],
@@ -118,7 +120,7 @@ const inboxItem = tv({
118
120
  "items-center",
119
121
  "has-data-[slot=inbox-item-line]:@container/inbox-item-row",
120
122
  "has-data-[slot=inbox-item-line]:[--inbox-item-content-end:-1]",
121
- "has-data-[slot=inbox-item-line]:pointer-fine:[:hover,:focus-within,[data-active=true],[data-popup-open],:has([data-popup-open])]:[--inbox-item-actions-room:--spacing(10)]",
123
+ "has-data-[slot=inbox-item-line]:pointer-fine:hover:[--inbox-item-actions-room:--spacing(10)] has-data-[slot=inbox-item-line]:pointer-fine:[:focus-within,[data-active=true],[data-popup-open],:has([data-popup-open])]:[--inbox-item-actions-room:--spacing(10)]",
122
124
  "has-data-[slot=inbox-item-line]:pointer-coarse:[--inbox-item-actions-room:--spacing(11)]",
123
125
  "has-data-[slot=inbox-item-line]:hover:[--inbox-item-time-display:inline] has-data-[slot=inbox-item-line]:keyboard:focus-within:[--inbox-item-time-display:inline]"
124
126
  ],
@@ -2,7 +2,7 @@ import { tv } from "../../lib/tv.mjs";
2
2
  //#region src/components/input/input.recipe.ts
3
3
  const input = tv({ slots: { root: [
4
4
  "h-control w-full px-3 py-0 font-heading text-field font-field outline-none",
5
- "rounded-control border-[1.5px] border-line-field bg-layer-card",
5
+ "rounded-(--control-radius) border-[1.5px] border-line-field bg-layer-card",
6
6
  "text-foreground placeholder:text-foreground-hint",
7
7
  "shadow-none transition-shadow duration-90 ease-out focus-visible:shadow-focus",
8
8
  "data-invalid:border-danger-strong",
@@ -8,7 +8,7 @@ const inputGroup = tv({
8
8
  root: [
9
9
  "group/input-group relative flex w-full min-w-0 items-center",
10
10
  "has-data-[input-group-trim=inline-end]:[--ig-control-pr:0]",
11
- "h-control overflow-hidden rounded-control border-[1.5px] border-line-field bg-layer-card text-foreground",
11
+ "h-control overflow-hidden rounded-(--control-radius) border-[1.5px] border-line-field bg-layer-card text-foreground",
12
12
  "shadow-none transition-shadow duration-90 ease-out has-focus-visible:shadow-focus",
13
13
  "has-[[data-slot=input-group-control][data-invalid]]:border-danger-strong",
14
14
  "has-[[data-slot=input-group-control]:disabled]:cursor-not-allowed has-[[data-slot=input-group-control]:disabled]:border-line-hairline has-[[data-slot=input-group-control]:disabled]:bg-fill-muted",
@@ -28,7 +28,7 @@ const lightbox = tv({ slots: {
28
28
  ],
29
29
  toolbar: [
30
30
  "pointer-events-auto shrink-0 flex items-center gap-3",
31
- "h-[calc(56px+env(safe-area-inset-top,0px))] pt-[env(safe-area-inset-top,0px)]",
31
+ "h-[calc(var(--header-height)+env(safe-area-inset-top,0px))] pt-[env(safe-area-inset-top,0px)]",
32
32
  "pl-[calc(16px+env(safe-area-inset-left,0px))] pr-[calc(16px+env(safe-area-inset-right,0px))]",
33
33
  "**:data-lightbox-close:static **:data-lightbox-close:inset-auto",
34
34
  "**:data-lightbox-close:top-auto **:data-lightbox-close:right-auto",
@@ -32,8 +32,8 @@ const listRow = tv({
32
32
  },
33
33
  variants: {
34
34
  variant: {
35
- default: { root: "min-h-16 [--list-row-rule-start:63px]" },
36
- plain: { root: "[--list-row-rule-start:16px]" },
35
+ default: { root: "min-h-16 pointer-coarse:min-h-14 pointer-coarse:py-2 [--list-row-rule-start:63px]" },
36
+ plain: { root: "py-(--settings-row-inset) [--list-row-rule-start:16px]" },
37
37
  entry: { root: "" }
38
38
  },
39
39
  interactive: {
@@ -24,7 +24,7 @@ const messageActionCardContent = tv({ slots: {
24
24
  "@max-sm/action-card:min-h-0 @max-sm/action-card:py-0"
25
25
  ],
26
26
  scopeList: ["mt-0 stack-y-1.5"],
27
- scopeListViewport: ["overflow-y-auto overscroll-contain", "max-h-[164px] stack-y-1.5 pr-1"],
27
+ scopeListViewport: ["overflow-y-auto overscroll-contain", "max-h-[136px] stack-y-1.5 pr-1"],
28
28
  scopeListLabel: ["text-footnote font-medium text-foreground-hint"],
29
29
  scope: ["min-w-0 border p-1.5", "rounded-control border-line-hairline bg-layer-card px-2.5 py-2"],
30
30
  scopeName: ["break-all font-mono", "text-mono-meta font-normal text-foreground"],
@@ -11,7 +11,7 @@ const messageActionCard = tv({
11
11
  headerIcon: [
12
12
  "flex shrink-0 items-center justify-center",
13
13
  "[&>svg]:shrink-0",
14
- "size-[27px] rounded-sticker bg-fill-muted text-foreground-muted",
14
+ "size-[27px] rounded-chip bg-fill-muted text-foreground-muted",
15
15
  "[&>svg]:size-3.5"
16
16
  ],
17
17
  headerTitle: ["min-w-0 flex-1", "pt-[calc((27px-1lh)/2)]"],
@@ -1,6 +1,6 @@
1
1
  import { MessageItem, MessageItemProps } from "./message-item-root.mjs";
2
2
  import { MessageItemAvatarSlot, MessageItemAvatarSlotProps, MessageItemContinuationTime, MessageItemContinuationTimeProps, MessageItemGutter, MessageItemGutterProps } from "./message-item-gutter.mjs";
3
- import { MessageItemAttachments, MessageItemAttachmentsProps, MessageItemBody, MessageItemBodyProps, MessageItemContent, MessageItemContentProps, MessageItemEdited, MessageItemEditedProps, MessageItemEmbedded, MessageItemEmbeddedProps, MessageItemFooter, MessageItemFooterProps, MessageItemSearchMatch, MessageItemSearchMatchProps } from "./message-item-content.mjs";
3
+ import { MessageItemAttachments, MessageItemAttachmentsProps, MessageItemBody, MessageItemBodyProps, MessageItemContent, MessageItemContentProps, MessageItemEdited, MessageItemEditedProps, MessageItemEmbedded, MessageItemEmbeddedProps, MessageItemFooter, MessageItemFooterProps, MessageItemSearchMatch, MessageItemSearchMatchProps, MessageItemTrailing, MessageItemTrailingProps } from "./message-item-content.mjs";
4
4
  import { MessageItemHeader, MessageItemHeaderProps, MessageItemInlineStatus, MessageItemInlineStatusProps, MessageItemMeta, MessageItemMetaProps, MessageItemSender, MessageItemSenderBadges, MessageItemSenderBadgesProps, MessageItemSenderButton, MessageItemSenderButtonProps, MessageItemSenderGroup, MessageItemSenderGroupProps, MessageItemSenderProps, MessageItemTime, MessageItemTimeProps } from "./message-item-header.mjs";
5
5
  import { MessageItemDelegatedAvatar, MessageItemDelegatedAvatarProps, MessageItemDelegatedBy, MessageItemDelegatedByButton, MessageItemDelegatedByButtonProps, MessageItemDelegatedByName, MessageItemDelegatedByNameProps, MessageItemDelegatedByProps } from "./message-item-delegated.mjs";
6
6
  import { MessageItemToolbar, MessageItemToolbarButton, MessageItemToolbarButtonProps, MessageItemToolbarProps } from "./message-item-toolbar.mjs";
@@ -9,4 +9,4 @@ import { MessageReactionAddButton, MessageReactionAddButtonProps, MessageReactio
9
9
  import { MessageReferenceChipVariant, MessageReferenceTextVariant } from "./message-reference.recipe.mjs";
10
10
  import { MessageReferenceChip, MessageReferenceChipProps, MessageReferenceIcon, MessageReferenceIconProps, MessageReferenceIndicator, MessageReferenceIndicatorProps, MessageReferenceLabel, MessageReferenceLabelProps, MessageReferencePending, MessageReferencePendingProps, MessageReferenceReadMark, MessageReferenceReadMarkProps, MessageReferenceSuffix, MessageReferenceSuffixProps, MessageReferenceText, MessageReferenceTextProps, MessageReferenceUnavailable, MessageReferenceUnavailableProps } from "./message-reference.mjs";
11
11
  import { MessageMultiSelect, MessageMultiSelectCheckbox, MessageMultiSelectCheckboxProps, MessageMultiSelectProps, MessageMultiSelectToolbar, MessageMultiSelectToolbarActions, MessageMultiSelectToolbarActionsProps, MessageMultiSelectToolbarProps } from "./message-multi-select.mjs";
12
- export { MessageItem, MessageItemAttachments, type MessageItemAttachmentsProps, MessageItemAvatarSlot, type MessageItemAvatarSlotProps, MessageItemBadge, type MessageItemBadgeProps, MessageItemBadgeSeparator, type MessageItemBadgeSeparatorProps, type MessageItemBadgeStatus, MessageItemBody, type MessageItemBodyProps, MessageItemContent, type MessageItemContentProps, MessageItemContinuationTime, type MessageItemContinuationTimeProps, MessageItemDelegatedAvatar, type MessageItemDelegatedAvatarProps, MessageItemDelegatedBy, MessageItemDelegatedByButton, type MessageItemDelegatedByButtonProps, MessageItemDelegatedByName, type MessageItemDelegatedByNameProps, type MessageItemDelegatedByProps, MessageItemEdited, type MessageItemEditedProps, MessageItemEmbedded, type MessageItemEmbeddedProps, MessageItemFooter, type MessageItemFooterProps, MessageItemGutter, type MessageItemGutterProps, MessageItemHeader, type MessageItemHeaderProps, MessageItemInlineStatus, type MessageItemInlineStatusProps, MessageItemMeta, type MessageItemMetaProps, type MessageItemProps, MessageItemReadReceipt, type MessageItemReadReceiptProps, MessageItemSavedIndicator, type MessageItemSavedIndicatorProps, MessageItemSearchMatch, type MessageItemSearchMatchProps, MessageItemSender, MessageItemSenderBadges, type MessageItemSenderBadgesProps, MessageItemSenderButton, type MessageItemSenderButtonProps, MessageItemSenderGroup, type MessageItemSenderGroupProps, type MessageItemSenderProps, MessageItemTime, type MessageItemTimeProps, MessageItemToolbar, MessageItemToolbarButton, type MessageItemToolbarButtonProps, type MessageItemToolbarProps, MessageMultiSelect, MessageMultiSelectCheckbox, type MessageMultiSelectCheckboxProps, type MessageMultiSelectProps, MessageMultiSelectToolbar, MessageMultiSelectToolbarActions, type MessageMultiSelectToolbarActionsProps, type MessageMultiSelectToolbarProps, MessageReactionAddButton, type MessageReactionAddButtonProps, MessageReactionChip, type MessageReactionChipProps, MessageReactionCount, type MessageReactionCountProps, MessageReactionErrorIndicator, type MessageReactionErrorIndicatorProps, MessageReactionGlyph, type MessageReactionGlyphProps, MessageReactionPickerContent, type MessageReactionPickerContentProps, MessageReactionPickerStatic, type MessageReactionPickerStaticProps, MessageReactionQuickButton, type MessageReactionQuickButtonProps, MessageReactionQuickRow, type MessageReactionQuickRowProps, MessageReactionTooltipContent, type MessageReactionTooltipContentProps, MessageReactionTooltipMeta, type MessageReactionTooltipMetaProps, MessageReactionTooltipName, type MessageReactionTooltipNameProps, MessageReactionTooltipNameText, type MessageReactionTooltipNameTextProps, MessageReactionTooltipNames, type MessageReactionTooltipNamesProps, MessageReactionTooltipSeparator, type MessageReactionTooltipSeparatorProps, MessageReferenceChip, type MessageReferenceChipProps, type MessageReferenceChipVariant, MessageReferenceIcon, type MessageReferenceIconProps, MessageReferenceIndicator, type MessageReferenceIndicatorProps, MessageReferenceLabel, type MessageReferenceLabelProps, MessageReferencePending, type MessageReferencePendingProps, MessageReferenceReadMark, type MessageReferenceReadMarkProps, MessageReferenceSuffix, type MessageReferenceSuffixProps, MessageReferenceText, type MessageReferenceTextProps, type MessageReferenceTextVariant, MessageReferenceUnavailable, type MessageReferenceUnavailableProps };
12
+ export { MessageItem, MessageItemAttachments, type MessageItemAttachmentsProps, MessageItemAvatarSlot, type MessageItemAvatarSlotProps, MessageItemBadge, type MessageItemBadgeProps, MessageItemBadgeSeparator, type MessageItemBadgeSeparatorProps, type MessageItemBadgeStatus, MessageItemBody, type MessageItemBodyProps, MessageItemContent, type MessageItemContentProps, MessageItemContinuationTime, type MessageItemContinuationTimeProps, MessageItemDelegatedAvatar, type MessageItemDelegatedAvatarProps, MessageItemDelegatedBy, MessageItemDelegatedByButton, type MessageItemDelegatedByButtonProps, MessageItemDelegatedByName, type MessageItemDelegatedByNameProps, type MessageItemDelegatedByProps, MessageItemEdited, type MessageItemEditedProps, MessageItemEmbedded, type MessageItemEmbeddedProps, MessageItemFooter, type MessageItemFooterProps, MessageItemGutter, type MessageItemGutterProps, MessageItemHeader, type MessageItemHeaderProps, MessageItemInlineStatus, type MessageItemInlineStatusProps, MessageItemMeta, type MessageItemMetaProps, type MessageItemProps, MessageItemReadReceipt, type MessageItemReadReceiptProps, MessageItemSavedIndicator, type MessageItemSavedIndicatorProps, MessageItemSearchMatch, type MessageItemSearchMatchProps, MessageItemSender, MessageItemSenderBadges, type MessageItemSenderBadgesProps, MessageItemSenderButton, type MessageItemSenderButtonProps, MessageItemSenderGroup, type MessageItemSenderGroupProps, type MessageItemSenderProps, MessageItemTime, type MessageItemTimeProps, MessageItemToolbar, MessageItemToolbarButton, type MessageItemToolbarButtonProps, type MessageItemToolbarProps, MessageItemTrailing, type MessageItemTrailingProps, MessageMultiSelect, MessageMultiSelectCheckbox, type MessageMultiSelectCheckboxProps, type MessageMultiSelectProps, MessageMultiSelectToolbar, MessageMultiSelectToolbarActions, type MessageMultiSelectToolbarActionsProps, type MessageMultiSelectToolbarProps, MessageReactionAddButton, type MessageReactionAddButtonProps, MessageReactionChip, type MessageReactionChipProps, MessageReactionCount, type MessageReactionCountProps, MessageReactionErrorIndicator, type MessageReactionErrorIndicatorProps, MessageReactionGlyph, type MessageReactionGlyphProps, MessageReactionPickerContent, type MessageReactionPickerContentProps, MessageReactionPickerStatic, type MessageReactionPickerStaticProps, MessageReactionQuickButton, type MessageReactionQuickButtonProps, MessageReactionQuickRow, type MessageReactionQuickRowProps, MessageReactionTooltipContent, type MessageReactionTooltipContentProps, MessageReactionTooltipMeta, type MessageReactionTooltipMetaProps, MessageReactionTooltipName, type MessageReactionTooltipNameProps, MessageReactionTooltipNameText, type MessageReactionTooltipNameTextProps, MessageReactionTooltipNames, type MessageReactionTooltipNamesProps, MessageReactionTooltipSeparator, type MessageReactionTooltipSeparatorProps, MessageReferenceChip, type MessageReferenceChipProps, type MessageReferenceChipVariant, MessageReferenceIcon, type MessageReferenceIconProps, MessageReferenceIndicator, type MessageReferenceIndicatorProps, MessageReferenceLabel, type MessageReferenceLabelProps, MessageReferencePending, type MessageReferencePendingProps, MessageReferenceReadMark, type MessageReferenceReadMarkProps, MessageReferenceSuffix, type MessageReferenceSuffixProps, MessageReferenceText, type MessageReferenceTextProps, type MessageReferenceTextVariant, MessageReferenceUnavailable, type MessageReferenceUnavailableProps };
@@ -19,4 +19,18 @@ export type MessageItemAttachmentsProps = useRender.ComponentProps<"div">;
19
19
  export declare function MessageItemAttachments({ className, render, ...props }: MessageItemAttachmentsProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
20
20
  export type MessageItemFooterProps = useRender.ComponentProps<"div">;
21
21
  export declare function MessageItemFooter({ className, render, ...props }: MessageItemFooterProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
22
+ export type MessageItemTrailingProps = useRender.ComponentProps<"span">;
23
+ /**
24
+ * Something small that ends the message (the faces of the agents that read it,
25
+ * a read mark): the last child of `MessageItemBody`. It takes no column: it sits
26
+ * at the inline end of the body's last line, and the last line keeps room for it,
27
+ * so the text wraps under it only when that line is full. When the body ends with
28
+ * a block that isn't text (a code block, a table, an image), it sits on a line of
29
+ * its own under that block. Logical properties, so it is right in RTL too.
30
+ *
31
+ * It finds the body's last block itself and stamps it (`data-trailing-line`, or
32
+ * `data-trailing="block"` on the body), so the CSS needs no structural selector,
33
+ * and one shared ResizeObserver sets the room (`--message-trailing-width`).
34
+ */
35
+ export declare function MessageItemTrailing({ className, render, ref, ...props }: MessageItemTrailingProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
22
36
  //#endregion
@@ -1,4 +1,5 @@
1
1
  import { messageItem } from "./message-item.recipe.mjs";
2
+ import { useCallback, useLayoutEffect, useRef } from "react";
2
3
  import { mergeProps } from "@base-ui/react/merge-props";
3
4
  import { useRender } from "@base-ui/react/use-render";
4
5
  //#region src/components/message-item/message-item-content.tsx
@@ -77,5 +78,149 @@ function MessageItemFooter({ className, render, ...props }) {
77
78
  state: { slot: "message-item-footer" }
78
79
  });
79
80
  }
81
+ /** The space kept before a trailing slot on the body's last line. */
82
+ const TRAILING_GAP_PX = 8;
83
+ const BODY_SELECTOR = "[data-slot=\"message-item-body\"]";
84
+ const TEXT_BLOCKS = /* @__PURE__ */ new Set([
85
+ "P",
86
+ "H1",
87
+ "H2",
88
+ "H3",
89
+ "H4",
90
+ "H5",
91
+ "H6",
92
+ "SPAN"
93
+ ]);
94
+ const BLOCKS = /* @__PURE__ */ new Set([
95
+ ...TEXT_BLOCKS,
96
+ "UL",
97
+ "OL",
98
+ "BLOCKQUOTE",
99
+ "PRE",
100
+ "TABLE",
101
+ "DIV",
102
+ "FIGURE",
103
+ "IMG"
104
+ ]);
105
+ const slotOfBody = /* @__PURE__ */ new WeakMap();
106
+ const pendingWidths = /* @__PURE__ */ new Map();
107
+ const pendingStamps = /* @__PURE__ */ new Map();
108
+ let frame = 0;
109
+ function flush() {
110
+ frame = 0;
111
+ for (const [body, width] of pendingWidths) body.style.setProperty("--message-trailing-width", `${Math.ceil(width) + TRAILING_GAP_PX}px`);
112
+ for (const [body, slot] of pendingStamps) if (body.contains(slot)) stampLastLine(body, slot);
113
+ pendingWidths.clear();
114
+ pendingStamps.clear();
115
+ }
116
+ let sharedObserver = null;
117
+ function trailingObserver() {
118
+ if (typeof ResizeObserver === "undefined") return null;
119
+ sharedObserver ??= new ResizeObserver((entries) => {
120
+ for (const entry of entries) {
121
+ const target = entry.target;
122
+ const slot = slotOfBody.get(target);
123
+ if (slot) {
124
+ pendingStamps.set(target, slot);
125
+ continue;
126
+ }
127
+ const body = target.closest(BODY_SELECTOR);
128
+ if (!body) continue;
129
+ const box = entry.borderBoxSize?.[0];
130
+ pendingWidths.set(body, box ? box.inlineSize : entry.contentRect.width);
131
+ }
132
+ if (!frame) frame = requestAnimationFrame(flush);
133
+ });
134
+ return sharedObserver;
135
+ }
136
+ /** Marks the text block the slot ends (`data-trailing-line`), or the body as ending in a block. */
137
+ function stampLastLine(body, slot) {
138
+ const block = lastBlock(body, slot);
139
+ const line = block ? lastLine(block) : null;
140
+ const previous = body.querySelector("[data-trailing-line]");
141
+ if (previous && previous !== line) previous.removeAttribute("data-trailing-line");
142
+ if (line && !line.hasAttribute("data-trailing-line")) line.setAttribute("data-trailing-line", "");
143
+ const ending = line ? "line" : "block";
144
+ if (body.dataset.trailing !== ending) body.dataset.trailing = ending;
145
+ }
146
+ /** The body's last block before the slot, through wrappers that only hold blocks (a markdown root). */
147
+ function lastBlock(body, slot) {
148
+ let el = slot.previousElementSibling;
149
+ while (el && !BLOCKS.has(el.tagName)) el = el.previousElementSibling;
150
+ while (el && el.tagName === "DIV" && !el.hasAttribute("data-slot") && el.lastElementChild && BLOCKS.has(el.lastElementChild.tagName)) el = el.lastElementChild;
151
+ return el && body.contains(el) ? el : null;
152
+ }
153
+ /** The text block that ends a last block, or null when it ends with something else. */
154
+ function lastLine(block) {
155
+ if (TEXT_BLOCKS.has(block.tagName)) return block;
156
+ if (block.tagName === "UL" || block.tagName === "OL") {
157
+ const item = block.lastElementChild;
158
+ if (!item || item.tagName !== "LI") return null;
159
+ const inner = item.lastElementChild;
160
+ if (inner && inner.tagName === "P") return inner;
161
+ return inner && BLOCKS.has(inner.tagName) ? null : item;
162
+ }
163
+ if (block.tagName === "BLOCKQUOTE") {
164
+ const inner = block.lastElementChild;
165
+ return inner && inner.tagName === "P" ? inner : null;
166
+ }
167
+ return null;
168
+ }
169
+ /**
170
+ * Something small that ends the message (the faces of the agents that read it,
171
+ * a read mark): the last child of `MessageItemBody`. It takes no column: it sits
172
+ * at the inline end of the body's last line, and the last line keeps room for it,
173
+ * so the text wraps under it only when that line is full. When the body ends with
174
+ * a block that isn't text (a code block, a table, an image), it sits on a line of
175
+ * its own under that block. Logical properties, so it is right in RTL too.
176
+ *
177
+ * It finds the body's last block itself and stamps it (`data-trailing-line`, or
178
+ * `data-trailing="block"` on the body), so the CSS needs no structural selector,
179
+ * and one shared ResizeObserver sets the room (`--message-trailing-width`).
180
+ */
181
+ function MessageItemTrailing({ className, render, ref, ...props }) {
182
+ const { trailing } = messageItem();
183
+ const own = useRef(null);
184
+ useLayoutEffect(() => {
185
+ const slot = own.current;
186
+ const body = slot?.closest(BODY_SELECTOR);
187
+ if (slot && body) stampLastLine(body, slot);
188
+ });
189
+ useLayoutEffect(() => {
190
+ const slot = own.current;
191
+ const body = slot?.closest(BODY_SELECTOR);
192
+ const observer = trailingObserver();
193
+ if (slot && observer) observer.observe(slot);
194
+ if (slot && body && observer) {
195
+ slotOfBody.set(body, slot);
196
+ observer.observe(body);
197
+ }
198
+ return () => {
199
+ if (slot && observer) observer.unobserve(slot);
200
+ if (body) {
201
+ if (observer) observer.unobserve(body);
202
+ slotOfBody.delete(body);
203
+ body.querySelector("[data-trailing-line]")?.removeAttribute("data-trailing-line");
204
+ delete body.dataset.trailing;
205
+ body.style.removeProperty("--message-trailing-width");
206
+ }
207
+ };
208
+ }, []);
209
+ const setRef = useCallback((el) => {
210
+ own.current = el;
211
+ if (typeof ref === "function") ref(el);
212
+ else if (ref) ref.current = el;
213
+ }, [ref]);
214
+ const defaultProps = {
215
+ className: trailing({ className }),
216
+ ref: setRef
217
+ };
218
+ return useRender({
219
+ defaultTagName: "span",
220
+ render,
221
+ props: mergeProps(defaultProps, props),
222
+ state: { slot: "message-item-trailing" }
223
+ });
224
+ }
80
225
  //#endregion
81
- export { MessageItemAttachments, MessageItemBody, MessageItemContent, MessageItemEdited, MessageItemEmbedded, MessageItemFooter, MessageItemSearchMatch };
226
+ export { MessageItemAttachments, MessageItemBody, MessageItemContent, MessageItemEdited, MessageItemEmbedded, MessageItemFooter, MessageItemSearchMatch, MessageItemTrailing };
@@ -25,6 +25,7 @@ export declare const messageItem: import("tailwind-variants/lite").TVReturnType<
25
25
  delegatedByButton: string[];
26
26
  delegatedAvatar: string[];
27
27
  edited: string[];
28
+ trailing: string[];
28
29
  body: string[];
29
30
  searchMatch: string[];
30
31
  embedded: string[];
@@ -57,6 +58,7 @@ export declare const messageItem: import("tailwind-variants/lite").TVReturnType<
57
58
  delegatedByButton: string[];
58
59
  delegatedAvatar: string[];
59
60
  edited: string[];
61
+ trailing: string[];
60
62
  body: string[];
61
63
  searchMatch: string[];
62
64
  embedded: string[];
@@ -89,6 +91,7 @@ export declare const messageItem: import("tailwind-variants/lite").TVReturnType<
89
91
  delegatedByButton: string[];
90
92
  delegatedAvatar: string[];
91
93
  edited: string[];
94
+ trailing: string[];
92
95
  body: string[];
93
96
  searchMatch: string[];
94
97
  embedded: string[];
@@ -81,6 +81,7 @@ const messageItem = tv({
81
81
  "dark:shadow-[0_0_0_3px_var(--mi-row-fill,transparent),0_0_0_3px_var(--layer-canvas)]"
82
82
  ],
83
83
  edited: ["ms-1 whitespace-nowrap", "text-caption text-foreground-hint"],
84
+ trailing: ["absolute end-0 bottom-0 z-10 flex h-lh items-center", "select-none! **:select-none!"],
84
85
  body: [
85
86
  "wrap-break-word select-text",
86
87
  "**:select-text",
@@ -95,13 +96,13 @@ const messageItem = tv({
95
96
  "absolute z-20 flex items-center",
96
97
  "opacity-(--mi-toolbar-opacity,0)",
97
98
  "[pointer-events:var(--mi-toolbar-pe,none)]",
98
- "top-[-18px] right-3 gap-1 overflow-visible rounded-container p-1",
99
+ "top-[-18px] md:pointer-fine:top-[calc(-1*(var(--control-height)+8px)/2)] right-3 gap-1 overflow-visible rounded-container p-1",
99
100
  "bg-layer-popover ring-1 ring-line-seam ring-inset shadow-float"
100
101
  ],
101
102
  toolbarButton: [
102
103
  "inline-flex shrink-0 items-center justify-center",
103
104
  "[&_svg]:shrink-0",
104
- "size-7 rounded-chip border-0 bg-transparent p-0",
105
+ "size-7 rounded-chip md:pointer-fine:size-control md:pointer-fine:rounded-control border-0 bg-transparent p-0",
105
106
  "text-foreground-muted hover:bg-fill-medium active:bg-fill-medium",
106
107
  "data-popup-open:bg-fill-medium data-active:text-foreground",
107
108
  "outline-none focus-visible:shadow-focus",
@@ -45,20 +45,21 @@ const messageReaction = tv({ slots: {
45
45
  ],
46
46
  quickRow: [
47
47
  "flex shrink-0 items-center",
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"
48
+ "justify-start gap-0.5 bg-layer-popover p-0",
49
+ "[&>[role=menuitem]]:size-9 md:pointer-fine:[&>[role=menuitem]]:size-control [&>[role=menuitem]]:p-0 *:[[role=menuitem]]:justify-center"
50
50
  ],
51
51
  quickButton: [
52
52
  "flex items-center justify-center",
53
53
  "bg-transparent transition-colors",
54
54
  "size-9 rounded-chip p-0 text-xl leading-none text-foreground-muted",
55
+ "md:pointer-fine:size-control md:pointer-fine:rounded-control",
55
56
  "hover:bg-brand-soft data-highlighted:bg-brand-soft active:bg-brand-soft",
56
57
  "outline-none focus-visible:shadow-focus"
57
58
  ],
58
59
  pickerContent: [
59
60
  "inline-flex items-center",
60
61
  "min-w-0 flex-row gap-0.5 p-1",
61
- "[&>[role=menuitem]]:size-9 [&>[role=menuitem]]:p-0"
62
+ "[&>[role=menuitem]]:size-9 md:pointer-fine:[&>[role=menuitem]]:size-control [&>[role=menuitem]]:p-0"
62
63
  ],
63
64
  pickerStatic: [
64
65
  "inline-flex items-center",
@@ -41,7 +41,9 @@ const messageListJump = tv({
41
41
  "rounded-s-none border-s-0",
42
42
  "text-foreground-muted hover:text-foreground",
43
43
  "[&_svg:not([class*='size-'])]:size-4",
44
- "after:-inset-y-[calc(--spacing(1.5)+1.5px)] after:right-[calc(-0.75rem-1.5px)] after:left-0"
44
+ "after:-inset-y-[calc(--spacing(1.5)+1.5px)] after:right-[calc(-0.75rem-1.5px)] after:left-0",
45
+ "md:pointer-fine:after:-inset-y-[calc(var(--control-hit-inset)+1.5px)]",
46
+ "md:pointer-fine:after:right-[calc(-2*var(--control-hit-inset)-1.5px)] md:pointer-fine:after:left-0"
45
47
  ]
46
48
  },
47
49
  variants: { side: {
@@ -15,7 +15,7 @@ import { useRender } from "@base-ui/react/use-render";
15
15
  const modeBar = tv({ slots: {
16
16
  root: [
17
17
  "flex shrink-0 items-start",
18
- "min-h-10 gap-4 px-5 py-2.5 max-md:px-4",
18
+ "min-h-10 gap-4 px-(--surface-inset) py-2.5 max-md:px-4",
19
19
  "bg-layer-hud font-sans text-callout text-foreground-on-hud"
20
20
  ],
21
21
  content: ["min-w-0 flex-1 wrap-break-word"],
@@ -46,7 +46,7 @@ const notificationCenter = tv({
46
46
  itemRow: ["flex items-start", "gap-3"],
47
47
  itemIcon: [
48
48
  "flex shrink-0 items-center justify-center",
49
- "mt-0 size-[35px] rounded-sticker bg-fill-muted text-foreground-muted",
49
+ "mt-0 size-[35px] rounded-control bg-fill-muted text-foreground-muted",
50
50
  "[&_svg]:size-[18px]"
51
51
  ],
52
52
  itemContent: ["min-w-0 flex-1"],
@@ -1,4 +1,4 @@
1
- import { controlIconInset } from "../../lib/head-edges.mjs";
1
+ import { barButtonHit, barIconInset } from "../../lib/head-edges.mjs";
2
2
  import { tv } from "../../lib/tv.mjs";
3
3
  //#region src/components/panel/panel-action.recipe.ts
4
4
  const panelActionBase = tv({ base: [
@@ -6,14 +6,14 @@ const panelActionBase = tv({ base: [
6
6
  "overflow-visible font-sans leading-none tabular-nums select-none outline-none",
7
7
  "transition-all duration-100",
8
8
  "[&>svg]:pointer-events-none [&>svg]:shrink-0",
9
- "h-control min-w-control rounded-control border-[1.5px] border-transparent bg-transparent py-0",
10
- "px-2 md:pointer-fine:px-[5px]",
11
- "after:absolute after:-inset-[calc(var(--spacing-control-hit)+1.5px)]",
9
+ "h-(--bar-button-size) min-w-(--bar-button-size) rounded-(--bar-button-radius) border-[1.5px] border-transparent bg-transparent py-0",
10
+ "px-2 md:pointer-fine:px-[calc((var(--bar-button-size)-var(--control-icon-size)-3px)/2)]",
11
+ barButtonHit,
12
12
  "text-foreground",
13
13
  "hover:bg-fill-medium active:bg-fill-medium",
14
14
  "focus-visible:shadow-focus",
15
15
  "[&>svg]:size-control-icon",
16
- controlIconInset
16
+ barIconInset
17
17
  ] });
18
18
  const panelAction = tv({
19
19
  extend: panelActionBase,
@@ -1,14 +1,13 @@
1
- import { controlIconInset, headEdges } from "../../lib/head-edges.mjs";
1
+ import { barIconInset, headEdges } from "../../lib/head-edges.mjs";
2
2
  import { tv } from "../../lib/tv.mjs";
3
3
  //#region src/components/panel/panel-header.recipe.ts
4
4
  /**
5
5
  * Where a head's edge controls sit, shared by every head (panel, section,
6
6
  * drawer, thread): see lib/head-edges.ts. Both sides pad by the content
7
- * margin, 20px on a desktop and 16px on a phone, so a filled thing (a sticker,
7
+ * margin (16px on a phone, 20px from 768px by touch, 16px with a mouse), so a filled thing (a sticker,
8
8
  * a pill, a filled Button) puts its shape on it, and the first and last
9
9
  * frameless icon button are pulled out by their icon inset so their icon box
10
- * lands on it: 20px on a desktop and on a touch screen with the desktop
11
- * layout, 16px on a phone, mirrored at the two ends.
10
+ * lands on it, mirrored at the two ends.
12
11
  */
13
12
  const panelHeadEdges = headEdges;
14
13
  /**
@@ -17,10 +16,11 @@ const panelHeadEdges = headEdges;
17
16
  * button: an action hidden at some width (a thread's Close below 1024px) then
18
17
  * leaves the next one on the edge.
19
18
  */
20
- const panelHeadActions = ["flex shrink-0 items-center gap-0.5 md:pointer-fine:gap-1", controlIconInset];
19
+ const panelHeadActions = ["flex shrink-0 items-center gap-0.5 md:pointer-fine:gap-1", barIconInset];
21
20
  /**
22
21
  * `header` and `sectionHeader` share one bar, expressed through
23
- * `compoundSlots`: a 56px row (the shell header height) with a seam under it.
22
+ * `compoundSlots`: a header-height row (the shell header height, 56px on a
23
+ * phone and 44px on a desktop) with a seam under it.
24
24
  * On a phone the section head sits on the frame.
25
25
  */
26
26
  const panelHeader = tv({
@@ -29,14 +29,15 @@ const panelHeader = tv({
29
29
  sectionHeader: [],
30
30
  headerIcon: [
31
31
  "flex size-[27px] shrink-0 items-center justify-center",
32
+ "md:pointer-fine:size-(--bar-button-size) md:pointer-fine:rounded-(--bar-button-radius)",
32
33
  "rounded-sticker border-[1.5px] border-sticker-ink bg-brand text-sticker-ink ring-[1.5px] ring-sticker-edge",
33
34
  "not-data-[icon-kind=avatar]:[&_svg]:size-3.5 not-data-[icon-kind=avatar]:[&_svg]:stroke-2",
34
35
  "data-[icon-kind=avatar]:size-auto data-[icon-kind=avatar]:border-transparent data-[icon-kind=avatar]:bg-transparent"
35
36
  ],
36
- headerContent: "flex min-w-0 flex-1 flex-col justify-center",
37
+ headerContent: ["flex min-w-0 flex-1 flex-col justify-center", "md:pointer-fine:flex-row md:pointer-fine:items-baseline md:pointer-fine:justify-start md:pointer-fine:gap-2"],
37
38
  heading: "flex min-w-0 items-center gap-2",
38
39
  title: "truncate font-sans text-headline font-bold text-foreground",
39
- meta: "min-w-0 truncate font-sans text-caption text-foreground-hint",
40
+ meta: ["min-w-0 truncate font-sans text-caption text-foreground-hint", "md:pointer-fine:flex-1 md:pointer-fine:shrink-1000"],
40
41
  status: [
41
42
  "inline-flex shrink-0 items-center gap-1 border-0 bg-transparent p-0",
42
43
  "font-sans text-caption font-medium normal-case text-foreground-hint",
@@ -57,7 +58,7 @@ const panelHeader = tv({
57
58
  compoundSlots: [{
58
59
  slots: ["header", "sectionHeader"],
59
60
  class: [
60
- "flex h-(--shell-header-height,56px) shrink-0 items-center gap-3 max-md:gap-2",
61
+ "flex h-(--shell-header-height,var(--header-height)) shrink-0 items-center gap-3 max-md:gap-2",
61
62
  panelHeadEdges,
62
63
  "border-b border-line-seam bg-layer-canvas text-foreground",
63
64
  "max-md:sticky max-md:top-0 max-md:z-30"
@@ -3,11 +3,11 @@ import { tv } from "../../lib/tv.mjs";
3
3
  const panel = tv({
4
4
  slots: {
5
5
  root: ["[--panel-footer-clearance:10rem]", "bg-layer-canvas text-foreground"],
6
- header: ["[@media(max-height:600px)]:h-12"],
6
+ header: ["[@media(max-height:600px)]:h-(--header-height-short)"],
7
7
  body: ["relative min-h-0 flex-1 overflow-hidden"],
8
8
  scrollViewport: ["h-full min-h-0 overflow-y-auto overscroll-contain", "[overflow-anchor:auto] [-webkit-overflow-scrolling:touch]"],
9
9
  scrollContent: ["min-h-full"],
10
- section: ["border-t px-5 py-4", "border-line-hairline"],
10
+ section: ["border-t px-(--surface-inset) py-4", "border-line-hairline"],
11
11
  footer: [
12
12
  "relative flex shrink-0 items-center pt-3",
13
13
  "bg-layer-canvas",
@@ -4,7 +4,7 @@ import { jsx } from "react/jsx-runtime";
4
4
  import { Button } from "@base-ui/react/button";
5
5
  //#region src/components/picker-trigger-button/picker-trigger-button.tsx
6
6
  const pickerTriggerButton = tv({ base: [
7
- "relative inline-flex h-8 shrink-0 items-center justify-center",
7
+ "relative inline-flex h-8 md:pointer-fine:h-control shrink-0 items-center justify-center",
8
8
  "whitespace-nowrap select-none",
9
9
  "outline-[1px] outline-offset-2 outline-transparent transition-colors duration-100 focus-visible:outline-transparent",
10
10
  "disabled:pointer-events-none disabled:transform-none",
@@ -8,7 +8,7 @@ const profilePanel = tv({ slots: {
8
8
  ],
9
9
  header: [],
10
10
  headerContent: ["items-stretch gap-0"],
11
- section: ["border-line-hairline px-5 py-4"]
11
+ section: ["border-line-hairline px-(--surface-inset) py-4"]
12
12
  } });
13
13
  //#endregion
14
14
  export { profilePanel };