@botiverse/raft-ui 0.62.0 → 0.63.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,23 @@
1
+ ## [0.63.1](https://github.com/botiverse/raft-design/compare/v0.63.0...v0.63.1) (2026-11-05)
2
+
3
+ ### Fixed
4
+
5
+ - **Fonts**: Cyrillic text no longer shows with its letters spaced apart. The sans and heading stacks try Arial and Helvetica Neue before the CJK faces. ([#994](https://github.com/botiverse/raft-design/pull/994))
6
+ - Why: Space Grotesk has no Cyrillic, so Russian and Ukrainian fell through to the CJK faces, whose Cyrillic glyphs are fullwidth (Hands #155, artin, #triage:83068786).
7
+ - Affects: only characters Space Grotesk lacks (Cyrillic, Greek and a few symbols such as arrows), on every page language. Latin and CJK text keeps its faces.
8
+ - Docs: https://raft-design.botiverse.build/foundations/typography/
9
+
10
+ ## [0.63.0](https://github.com/botiverse/raft-design/compare/v0.62.0...v0.63.0) (2026-11-05)
11
+
12
+ ### Added
13
+
14
+ - **InboxItemLine**, **InboxItemStatus**, **InboxItemListGroup** and **InboxItemListHeading** (from `@botiverse/raft-ui/wip`): a compact InboxItem row with no trailing column, and a list of rows grouped by day. ([#999](https://github.com/botiverse/raft-design/pull/999), rules in [#998](https://github.com/botiverse/raft-design/pull/998))
15
+ - Why: the trailing column held the time and task number on their own, wasting the row's width; the time now sits at the end of the first line and the preview takes the full width (stdrc, #proj-raft-ui:e09717fb).
16
+ - Affects: nothing until a row uses `InboxItemLine`. Rows built with `InboxItemTrailing` render the same DOM and classes as 0.62.0 (a parity test compares them).
17
+ - Docs: https://raft-design.botiverse.build/components/inbox-item/
18
+ - **InboxItemTimestamp**: `reveal="hover"`, for an older row in a list with `InboxItemLine`: the time is hidden at rest and shows while the row is hovered or holds keyboard focus; never on touch. In a compact row's heading the time can carry a tooltip, and a click on it opens the item.
19
+ - **InboxItemSkeleton** and its list: a `line` prop, so a loading row matches a row with `InboxItemLine`. Off by default.
20
+
1
21
  ## [0.62.0](https://github.com/botiverse/raft-design/compare/v0.61.0...v0.62.0) (2026-11-05)
2
22
 
3
23
  ### Changed
@@ -8,6 +8,11 @@ type InboxItemSkeletonShape = {
8
8
  leading?: boolean;
9
9
  /** A context line above the title, where the rows have an `InboxItemContext`. */
10
10
  context?: boolean;
11
+ /**
12
+ * In `density="compact"`, where the rows have an `InboxItemLine`: no trailing
13
+ * column, the time at the end of the heading.
14
+ */
15
+ line?: boolean;
11
16
  };
12
17
  export type InboxItemSkeletonProps = Omit<InboxItemProps, "active" | "disabled" | "children"> & InboxItemSkeletonShape;
13
18
  /**
@@ -16,11 +21,12 @@ export type InboxItemSkeletonProps = Omit<InboxItemProps, "active" | "disabled"
16
21
  * leading block, the context line, the title, the excerpt, the timestamp),
17
22
  * each holding a bar instead of text. The padding, the divider and every
18
23
  * line's height are the loaded row's, so nothing moves when the content
19
- * arrives. Match `density`, `leading` and `context` to the rows it stands for.
24
+ * arrives. Match `density`, `leading`, `context` and `line` to the rows it
25
+ * stands for.
20
26
  * Hidden from assistive technology: mark the region that stays while the
21
27
  * list loads `aria-busy`.
22
28
  */
23
- export declare function InboxItemSkeleton({ density, leading, context, ...props }: InboxItemSkeletonProps): import("react").JSX.Element;
29
+ export declare function InboxItemSkeleton({ density, leading, context, line, ...props }: InboxItemSkeletonProps): import("react").JSX.Element;
24
30
  export type InboxItemSkeletonListProps = useRender.ComponentProps<"div"> & InboxItemSkeletonShape & {
25
31
  /** How many rows to show. About a screenful; ignored when there are children. */
26
32
  count?: number;
@@ -42,5 +48,5 @@ export type InboxItemSkeletonListProps = useRender.ComponentProps<"div"> & Inbox
42
48
  * content arrives, so mark the region that stays, such as the list's panel or
43
49
  * viewport, `aria-busy` while it loads.
44
50
  */
45
- export declare function InboxItemSkeletonList({ count, delay, density, leading, context, children, className, render, ...props }: InboxItemSkeletonListProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
51
+ export declare function InboxItemSkeletonList({ count, delay, density, leading, context, line, children, className, render, ...props }: InboxItemSkeletonListProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
46
52
  //#endregion
@@ -1,5 +1,5 @@
1
1
  import { Skeleton } from "../skeleton/skeleton.mjs";
2
- import { InboxItem, InboxItemBody, InboxItemContent, InboxItemContext, InboxItemHeading, InboxItemLeading, InboxItemTimestamp, InboxItemTitle, InboxItemTrailing } from "./inbox-item.mjs";
2
+ import { InboxItem, InboxItemBody, InboxItemContent, InboxItemContext, InboxItemHeading, InboxItemLeading, InboxItemLine, InboxItemTimestamp, InboxItemTitle, InboxItemTrailing } from "./inbox-item.mjs";
3
3
  import { inboxItemSkeleton } from "./inbox-item-skeleton.recipe.mjs";
4
4
  import { useEffect, useState } from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -12,16 +12,20 @@ import { useRender } from "@base-ui/react/use-render";
12
12
  * leading block, the context line, the title, the excerpt, the timestamp),
13
13
  * each holding a bar instead of text. The padding, the divider and every
14
14
  * line's height are the loaded row's, so nothing moves when the content
15
- * arrives. Match `density`, `leading` and `context` to the rows it stands for.
15
+ * arrives. Match `density`, `leading`, `context` and `line` to the rows it
16
+ * stands for.
16
17
  * Hidden from assistive technology: mark the region that stays while the
17
18
  * list loads `aria-busy`.
18
19
  */
19
- function InboxItemSkeleton({ density, leading = false, context = false, ...props }) {
20
+ function InboxItemSkeleton({ density, leading = false, context = false, line = false, ...props }) {
20
21
  const slots = inboxItemSkeleton();
21
22
  const bar = (width) => /* @__PURE__ */ jsx(Skeleton, {
22
23
  variant: "line",
23
24
  className: slots.bar({ className: width })
24
25
  });
26
+ const fullWidth = line && density === "compact";
27
+ const timestamp = /* @__PURE__ */ jsx(InboxItemTimestamp, { children: bar(slots.timestampBar()) });
28
+ const body = /* @__PURE__ */ jsx(InboxItemBody, { children: bar(slots.bodyBar()) });
25
29
  return /* @__PURE__ */ jsxs(InboxItem, {
26
30
  "aria-hidden": true,
27
31
  "data-skeleton": "",
@@ -36,13 +40,13 @@ function InboxItemSkeleton({ density, leading = false, context = false, ...props
36
40
  className: slots.line(),
37
41
  children: bar(slots.contextBar())
38
42
  }) }) : null,
39
- /* @__PURE__ */ jsx(InboxItemHeading, { children: /* @__PURE__ */ jsx(InboxItemTitle, {
43
+ /* @__PURE__ */ jsxs(InboxItemHeading, { children: [/* @__PURE__ */ jsx(InboxItemTitle, {
40
44
  className: slots.title(),
41
45
  children: bar(slots.titleBar())
42
- }) }),
43
- /* @__PURE__ */ jsx(InboxItemBody, { children: bar(slots.bodyBar()) })
46
+ }), fullWidth ? timestamp : null] }),
47
+ fullWidth ? /* @__PURE__ */ jsx(InboxItemLine, { children: body }) : body
44
48
  ] }),
45
- /* @__PURE__ */ jsx(InboxItemTrailing, { children: /* @__PURE__ */ jsx(InboxItemTimestamp, { children: bar(slots.timestampBar()) }) })
49
+ fullWidth ? null : /* @__PURE__ */ jsx(InboxItemTrailing, { children: timestamp })
46
50
  ]
47
51
  });
48
52
  }
@@ -56,7 +60,7 @@ function InboxItemSkeleton({ density, leading = false, context = false, ...props
56
60
  * content arrives, so mark the region that stays, such as the list's panel or
57
61
  * viewport, `aria-busy` while it loads.
58
62
  */
59
- function InboxItemSkeletonList({ count = 6, delay = 1e3, density, leading, context, children, className, render, ...props }) {
63
+ function InboxItemSkeletonList({ count = 6, delay = 1e3, density, leading, context, line, children, className, render, ...props }) {
60
64
  const { list } = inboxItemSkeleton();
61
65
  const shown = useDelayPassed(delay);
62
66
  const defaultProps = {
@@ -66,7 +70,8 @@ function InboxItemSkeletonList({ count = 6, delay = 1e3, density, leading, conte
66
70
  children: shown ? children ?? Array.from({ length: count }, (_, index) => /* @__PURE__ */ jsx(InboxItemSkeleton, {
67
71
  density,
68
72
  leading,
69
- context
73
+ context,
74
+ line
70
75
  }, index)) : null
71
76
  };
72
77
  return useRender({
@@ -1,9 +1,12 @@
1
+ import { TaskStatusBadgeProps } from "../tasks/task-status-badge.mjs";
1
2
  import { useRender } from "@base-ui/react/use-render";
2
3
  //#region src/components/inbox-item/inbox-item.d.ts
3
4
  /**
4
5
  * `compact`: one line for the title and one for the excerpt, the row centred
5
- * on its leading visual, and the trailing column set on the same two 20px
6
- * lines (a conversation list). Leave it unset for the default two-line rows.
6
+ * on its leading visual, and the trailing column set on the same two 20px lines
7
+ * (a conversation list). With `InboxItemLine` in place of the column both lines
8
+ * run the full width: the time at the end of the heading, the marks at the end
9
+ * of the line. Leave it unset for the default two-line rows.
7
10
  */
8
11
  export type InboxItemDensity = "compact";
9
12
  export type InboxItemProps = useRender.ComponentProps<"div"> & {
@@ -29,19 +32,77 @@ export declare function InboxItemContext({ className, render, ...props }: InboxI
29
32
  export type InboxItemSubtitleProps = useRender.ComponentProps<"div">;
30
33
  export declare function InboxItemSubtitle({ className, render, ...props }: InboxItemSubtitleProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
31
34
  export type InboxItemHeadingProps = useRender.ComponentProps<"div">;
32
- export declare function InboxItemHeading({ className, render, ...props }: InboxItemHeadingProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
35
+ export declare function InboxItemHeading({ className, render, ...props }: InboxItemHeadingProps): import("react").JSX.Element;
33
36
  export type InboxItemTitleProps = useRender.ComponentProps<"div">;
34
37
  export declare function InboxItemTitle({ className, render, ...props }: InboxItemTitleProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
35
38
  export type InboxItemTrailingProps = useRender.ComponentProps<"div">;
36
39
  export declare function InboxItemTrailing({ className, render, ...props }: InboxItemTrailingProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
37
- export type InboxItemTimestampProps = useRender.ComponentProps<"span">;
38
- export declare function InboxItemTimestamp({ className, render, ...props }: InboxItemTimestampProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
39
40
  /**
40
- * Marks at the end of a line: a mention, muted, an unread count. A 20px line
41
- * of its own in `InboxItemTrailing`, so it sits beside the excerpt.
41
+ * The time. In the heading of a compact row it takes the pointer, so it can
42
+ * carry a tooltip, and a click on it still opens the item. A tooltip's trigger
43
+ * replaces `data-slot`, so the heading finds the time by `data-inbox-item-time`.
44
+ * In `InboxItemTrailing` it does neither and lets the pointer through.
45
+ */
46
+ export type InboxItemTimestampProps = useRender.ComponentProps<"span"> & {
47
+ /**
48
+ * `hover`, for an older row in a list with `InboxItemLine`: hidden at rest, so
49
+ * the title takes its room. It shows in the same place, without animation,
50
+ * while the row is hovered or it or a control in it holds keyboard focus; a
51
+ * touch screen never hovers, so there it stays hidden. While hidden it isn't
52
+ * read out: say the time in the trigger's name.
53
+ */
54
+ reveal?: "hover";
55
+ };
56
+ export declare function InboxItemTimestamp({ className, onClick, render, reveal, ...props }: InboxItemTimestampProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
57
+ /**
58
+ * The excerpt's line in a compact row with no trailing column: `InboxItemBody`
59
+ * or `InboxItemMessage`, taking the room, then `InboxItemMarks`. Marks with
60
+ * nothing in them take no room. Its presence is what puts the row in this
61
+ * layout: both lines run the full width, and `InboxItemActions` with
62
+ * `reveal="hover"`, last in `InboxItemContent`, centres on the row while both
63
+ * lines end short of it. A row without it stays as it is.
64
+ */
65
+ export type InboxItemLineProps = useRender.ComponentProps<"div">;
66
+ export declare function InboxItemLine({ className, render, ...props }: InboxItemLineProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
67
+ /**
68
+ * Marks at the end of a line: a mention, muted, an unread count. At the end of
69
+ * `InboxItemLine`, or a 20px line of its own in `InboxItemTrailing`, so it sits
70
+ * beside the excerpt either way.
42
71
  */
43
72
  export type InboxItemMarksProps = useRender.ComponentProps<"div">;
44
73
  export declare function InboxItemMarks({ className, render, ...props }: InboxItemMarksProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
74
+ /**
75
+ * A task's status in `InboxItemMarks`: the chip with its word, and in a row with
76
+ * `InboxItemLine` narrower than 360px only the chip's pixel, with the word in a
77
+ * tooltip on it. It queries the container that row names, `inbox-item-row`, so
78
+ * it is the row that is measured, not the window or any other container around it. Pass an `id` to name the word in the trigger's
79
+ * `aria-labelledby`, as it isn't on screen there. In a row with a trailing
80
+ * column it stays the chip with its word.
81
+ */
82
+ export type InboxItemStatusProps = Omit<TaskStatusBadgeProps, "children" | "render" | "size"> & {
83
+ /** The status's word. The caller owns the copy and its localization. */
84
+ children: string;
85
+ };
86
+ export declare function InboxItemStatus({ children, className, status, ...props }: InboxItemStatusProps): import("react").JSX.Element;
87
+ /**
88
+ * One day's or one group's heading and rows, placed straight in the list's
89
+ * column. A sticky heading stays inside its parent, so with one of these per day
90
+ * the next day's heading pushes the last one up and out. In one shared column
91
+ * the headings would pile up at the top instead. Rows of a virtualized list,
92
+ * placed one by one, can't sit in one: there the list has to do this itself.
93
+ */
94
+ export type InboxItemListGroupProps = useRender.ComponentProps<"div">;
95
+ export declare function InboxItemListGroup({ className, render, ...props }: InboxItemListGroupProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
96
+ /**
97
+ * The heading of an `InboxItemListGroup`: it starts on the rows' content line,
98
+ * 8px over the first row's shape with the group's gap, and the group holds it
99
+ * further from the rows above. An `h3`: render another level if the list's title
100
+ * isn't an `h2`. To keep it in view while its rows scroll, the list makes it
101
+ * sticky and gives it the list's surface; its box holds the 4px above and below
102
+ * its words, so no row shows through them. The 2px under the box is a margin.
103
+ */
104
+ export type InboxItemListHeadingProps = useRender.ComponentProps<"h3">;
105
+ export declare function InboxItemListHeading({ className, render, ...props }: InboxItemListHeadingProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
45
106
  /**
46
107
  * Takes the pointer inside the content, which otherwise lets it through to
47
108
  * the trigger, so a badge's tooltip opens on hover. A click on it still opens
@@ -60,10 +121,14 @@ export declare function InboxItemMetadata({ className, render, ...props }: Inbox
60
121
  export type InboxItemActionsProps = useRender.ComponentProps<"div"> & {
61
122
  /**
62
123
  * `hover`: with a mouse, the actions stay hidden until the row is hovered,
63
- * holds focus, is `active` or has a menu open, and then take the place of
64
- * the rest of `InboxItemTrailing` (the timestamp, the marks, the attention
65
- * dot), which steps aside. On a touch screen (`pointer: coarse`) they show
66
- * at rest and the rest of the trailing column moves over to make room.
124
+ * holds focus, is `active` or has a menu open. Give the button
125
+ * `variant="ghost"` here. On a touch screen (`pointer: coarse`) they show at
126
+ * rest. In a compact row without `InboxItemTrailing`, put them last in
127
+ * `InboxItemContent`: they centre on the row and both lines end short of them,
128
+ * the time and the marks moving over and staying visible (room for one
129
+ * 32px button). In `InboxItemTrailing` they take the place of the timestamp,
130
+ * the marks and the attention dot, which step aside; on a touch screen the
131
+ * rest of the trailing column moves over to make room.
67
132
  */
68
133
  reveal?: "hover";
69
134
  };
@@ -1,11 +1,30 @@
1
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../tooltip/tooltip.mjs";
2
+ import { TaskStatusIcon } from "../tasks/task-status-icon.mjs";
3
+ import { TaskStatusBadge } from "../tasks/task-status-badge.mjs";
1
4
  import { inboxItem } from "./inbox-item.recipe.mjs";
2
5
  import { createContext, useContext } from "react";
3
- import { jsx } from "react/jsx-runtime";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
4
7
  import { mergeProps } from "@base-ui/react/merge-props";
5
8
  import { useRender } from "@base-ui/react/use-render";
6
9
  //#region src/components/inbox-item/inbox-item.tsx
7
10
  const InboxItemDisabledContext = createContext(false);
8
11
  const InboxItemDensityContext = createContext(void 0);
12
+ const InboxItemHeadingContext = createContext(false);
13
+ /** The content lets the pointer through to the trigger; a part that takes it hands its click on. */
14
+ function openItemFrom(event) {
15
+ if (event.defaultPrevented) return;
16
+ const trigger = event.currentTarget.closest("[data-slot=inbox-item]")?.querySelector("[data-slot=inbox-item-open]");
17
+ if (!trigger) return;
18
+ trigger.dispatchEvent(new MouseEvent("click", {
19
+ bubbles: true,
20
+ cancelable: true,
21
+ detail: event.detail,
22
+ altKey: event.altKey,
23
+ ctrlKey: event.ctrlKey,
24
+ metaKey: event.metaKey,
25
+ shiftKey: event.shiftKey
26
+ }));
27
+ }
9
28
  function InboxItem({ active = false, className, density, disabled = false, render, ...props }) {
10
29
  const { item } = inboxItem({ density });
11
30
  const defaultProps = {
@@ -80,7 +99,8 @@ function InboxItemSelection({ className, render, ...props }) {
80
99
  });
81
100
  }
82
101
  function InboxItemContent({ className, render, ...props }) {
83
- const { itemContent } = inboxItem();
102
+ const density = useContext(InboxItemDensityContext);
103
+ const { itemContent } = inboxItem({ density });
84
104
  const defaultProps = {
85
105
  "data-slot": "inbox-item-content",
86
106
  className: itemContent({ className })
@@ -116,16 +136,21 @@ function InboxItemSubtitle({ className, render, ...props }) {
116
136
  });
117
137
  }
118
138
  function InboxItemHeading({ className, render, ...props }) {
119
- const { itemHeading } = inboxItem();
139
+ const density = useContext(InboxItemDensityContext);
140
+ const { itemHeading } = inboxItem({ density });
120
141
  const defaultProps = {
121
142
  "data-slot": "inbox-item-heading",
122
143
  className: itemHeading({ className })
123
144
  };
124
- return useRender({
145
+ const element = useRender({
125
146
  defaultTagName: "div",
126
147
  render,
127
148
  props: mergeProps(defaultProps, props)
128
149
  });
150
+ return /* @__PURE__ */ jsx(InboxItemHeadingContext.Provider, {
151
+ value: density === "compact",
152
+ children: element
153
+ });
129
154
  }
130
155
  function InboxItemTitle({ className, render, ...props }) {
131
156
  const density = useContext(InboxItemDensityContext);
@@ -153,12 +178,21 @@ function InboxItemTrailing({ className, render, ...props }) {
153
178
  props: mergeProps(defaultProps, props)
154
179
  });
155
180
  }
156
- function InboxItemTimestamp({ className, render, ...props }) {
181
+ function InboxItemTimestamp({ className, onClick, render, reveal, ...props }) {
157
182
  const density = useContext(InboxItemDensityContext);
158
- const { itemTimestamp } = inboxItem({ density });
183
+ const inHeading = useContext(InboxItemHeadingContext);
184
+ const { itemTimestamp } = inboxItem({
185
+ density,
186
+ reveal
187
+ });
159
188
  const defaultProps = {
189
+ "data-inbox-item-time": inHeading ? "" : void 0,
160
190
  "data-slot": "inbox-item-timestamp",
161
- className: itemTimestamp({ className })
191
+ className: itemTimestamp({ className }),
192
+ onClick: inHeading ? (event) => {
193
+ onClick?.(event);
194
+ openItemFrom(event);
195
+ } : onClick
162
196
  };
163
197
  return useRender({
164
198
  defaultTagName: "span",
@@ -166,6 +200,18 @@ function InboxItemTimestamp({ className, render, ...props }) {
166
200
  props: mergeProps(defaultProps, props)
167
201
  });
168
202
  }
203
+ function InboxItemLine({ className, render, ...props }) {
204
+ const { itemLine } = inboxItem();
205
+ const defaultProps = {
206
+ "data-slot": "inbox-item-line",
207
+ className: itemLine({ className })
208
+ };
209
+ return useRender({
210
+ defaultTagName: "div",
211
+ render,
212
+ props: mergeProps(defaultProps, props)
213
+ });
214
+ }
169
215
  function InboxItemMarks({ className, render, ...props }) {
170
216
  const { itemMarks } = inboxItem();
171
217
  const defaultProps = {
@@ -178,6 +224,46 @@ function InboxItemMarks({ className, render, ...props }) {
178
224
  props: mergeProps(defaultProps, props)
179
225
  });
180
226
  }
227
+ function InboxItemStatus({ children, className, status, ...props }) {
228
+ const { itemStatusWord, itemStatusPixel } = inboxItem();
229
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(TaskStatusBadge, {
230
+ status,
231
+ size: "sm",
232
+ className: itemStatusWord({ className }),
233
+ ...props,
234
+ children
235
+ }), /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
236
+ render: /* @__PURE__ */ jsx(InboxItemHoverTarget, { className: itemStatusPixel() }),
237
+ role: "img",
238
+ "aria-label": children,
239
+ "data-slot": "inbox-item-status-pixel",
240
+ children: /* @__PURE__ */ jsx(TaskStatusIcon, { status })
241
+ }), /* @__PURE__ */ jsx(TooltipContent, { children })] })] });
242
+ }
243
+ function InboxItemListGroup({ className, render, ...props }) {
244
+ const { itemListGroup } = inboxItem();
245
+ const defaultProps = {
246
+ "data-slot": "inbox-item-list-group",
247
+ className: itemListGroup({ className })
248
+ };
249
+ return useRender({
250
+ defaultTagName: "div",
251
+ render,
252
+ props: mergeProps(defaultProps, props)
253
+ });
254
+ }
255
+ function InboxItemListHeading({ className, render, ...props }) {
256
+ const { itemListHeading } = inboxItem();
257
+ const defaultProps = {
258
+ "data-slot": "inbox-item-list-heading",
259
+ className: itemListHeading({ className })
260
+ };
261
+ return useRender({
262
+ defaultTagName: "h3",
263
+ render,
264
+ props: mergeProps(defaultProps, props)
265
+ });
266
+ }
181
267
  function InboxItemHoverTarget({ className, onClick, render, ...props }) {
182
268
  const { itemHoverTarget } = inboxItem();
183
269
  const defaultProps = {
@@ -185,18 +271,7 @@ function InboxItemHoverTarget({ className, onClick, render, ...props }) {
185
271
  className: itemHoverTarget({ className }),
186
272
  onClick: (event) => {
187
273
  onClick?.(event);
188
- if (event.defaultPrevented) return;
189
- const trigger = event.currentTarget.closest("[data-slot=inbox-item]")?.querySelector("[data-slot=inbox-item-open]");
190
- if (!trigger) return;
191
- trigger.dispatchEvent(new MouseEvent("click", {
192
- bubbles: true,
193
- cancelable: true,
194
- detail: event.detail,
195
- altKey: event.altKey,
196
- ctrlKey: event.ctrlKey,
197
- metaKey: event.metaKey,
198
- shiftKey: event.shiftKey
199
- }));
274
+ openItemFrom(event);
200
275
  }
201
276
  };
202
277
  return useRender({
@@ -273,4 +348,4 @@ function InboxItemActions({ className, render, reveal, ...props }) {
273
348
  });
274
349
  }
275
350
  //#endregion
276
- export { InboxItem, InboxItemActions, InboxItemBody, InboxItemContent, InboxItemContext, InboxItemHeading, InboxItemHoverTarget, InboxItemLeading, InboxItemMarks, InboxItemMessage, InboxItemMetadata, InboxItemSelection, InboxItemSender, InboxItemSubtitle, InboxItemTimestamp, InboxItemTitle, InboxItemTrailing, InboxItemTrigger };
351
+ export { InboxItem, InboxItemActions, InboxItemBody, InboxItemContent, InboxItemContext, InboxItemHeading, InboxItemHoverTarget, InboxItemLeading, InboxItemLine, InboxItemListGroup, InboxItemListHeading, InboxItemMarks, InboxItemMessage, InboxItemMetadata, InboxItemSelection, InboxItemSender, InboxItemStatus, InboxItemSubtitle, InboxItemTimestamp, InboxItemTitle, InboxItemTrailing, InboxItemTrigger };
@@ -70,9 +70,18 @@ const inboxItem = tv({
70
70
  "group-data-[active=true]/inbox-item:[--inbox-item-revealed:1] group-data-popup-open/inbox-item:[--inbox-item-revealed:1]",
71
71
  "has-[>[data-reveal=hover]_[data-popup-open]]:[--inbox-item-revealed:1]"
72
72
  ],
73
+ itemStatusWord: ["shrink-0 @max-[320px]/inbox-item-row:hidden"],
74
+ itemStatusPixel: ["hidden items-center @max-[320px]/inbox-item-row:inline-flex"],
75
+ 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"],
73
77
  itemMarks: ["flex h-5 shrink-0 items-center justify-end gap-1.5", "text-foreground-hint"],
74
78
  itemHoverTarget: ["pointer-events-auto"],
75
79
  itemTimestamp: ["shrink-0 whitespace-nowrap text-right tabular-nums", "font-mono text-mono-meta text-foreground-hint"],
80
+ itemLine: [
81
+ "flex h-(--text-callout--line-height) min-w-0 items-center gap-2",
82
+ "*:not-data-[slot=inbox-item-marks]:min-w-0 *:not-data-[slot=inbox-item-marks]:flex-1",
83
+ "*:data-[slot=inbox-item-marks]:empty:hidden"
84
+ ],
76
85
  itemBody: [
77
86
  "col-span-full nth-[-n+2]:col-[1/2]",
78
87
  "line-clamp-2",
@@ -105,7 +114,16 @@ const inboxItem = tv({
105
114
  },
106
115
  variants: {
107
116
  density: { compact: {
108
- item: ["items-center"],
117
+ item: [
118
+ "items-center",
119
+ "has-data-[slot=inbox-item-line]:@container/inbox-item-row",
120
+ "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)]",
122
+ "has-data-[slot=inbox-item-line]:pointer-coarse:[--inbox-item-actions-room:--spacing(11)]",
123
+ "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
+ ],
125
+ itemContent: ["has-[>[data-slot=inbox-item-line]]:has-[>[data-reveal=hover]]:pr-(--inbox-item-actions-room,0px)"],
126
+ itemHeading: ["has-[>[data-inbox-item-time]]:h-(--text-subhead--line-height) has-[>[data-inbox-item-time]]:items-baseline", "*:data-inbox-item-time:pointer-events-auto *:data-inbox-item-time:cursor-default"],
109
127
  itemTitle: ["line-clamp-1", "pl-0 has-[>svg]:pl-[18px]"],
110
128
  itemTrailing: [
111
129
  "gap-0 pt-0",
@@ -116,16 +134,19 @@ const inboxItem = tv({
116
134
  itemBody: ["line-clamp-1", "mt-0"],
117
135
  itemMessage: ["line-clamp-1", "mt-0"]
118
136
  } },
119
- reveal: { hover: { itemActions: [
120
- "absolute top-0 right-0 z-10",
121
- "pointer-events-none opacity-0 transition-opacity",
122
- "group-hover/inbox-item:pointer-events-auto group-hover/inbox-item:opacity-100",
123
- "group-focus-within/inbox-item:pointer-events-auto group-focus-within/inbox-item:opacity-100",
124
- "group-data-[active=true]/inbox-item:pointer-events-auto group-data-[active=true]/inbox-item:opacity-100",
125
- "group-data-popup-open/inbox-item:pointer-events-auto group-data-popup-open/inbox-item:opacity-100",
126
- "has-data-popup-open:pointer-events-auto has-data-popup-open:opacity-100",
127
- "pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 pointer-coarse:only:static"
128
- ] } }
137
+ reveal: { hover: {
138
+ itemActions: [
139
+ "absolute top-0 right-0 z-10",
140
+ "pointer-events-none opacity-0 transition-opacity",
141
+ "group-hover/inbox-item:pointer-events-auto group-hover/inbox-item:opacity-100",
142
+ "group-focus-within/inbox-item:pointer-events-auto group-focus-within/inbox-item:opacity-100",
143
+ "group-data-[active=true]/inbox-item:pointer-events-auto group-data-[active=true]/inbox-item:opacity-100",
144
+ "group-data-popup-open/inbox-item:pointer-events-auto group-data-popup-open/inbox-item:opacity-100",
145
+ "has-data-popup-open:pointer-events-auto has-data-popup-open:opacity-100",
146
+ "pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 pointer-coarse:only:static"
147
+ ],
148
+ itemTimestamp: ["[display:var(--inbox-item-time-display,none)]"]
149
+ } }
129
150
  },
130
151
  compoundVariants: [{
131
152
  density: "compact",
package/dist/fonts.css CHANGED
@@ -1,43 +1,46 @@
1
1
  @import url("https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&family=Space+Mono:wght@400;700&display=swap");
2
2
 
3
3
  /* Raft Design System: Space Grotesk is what people say, Space Mono is what
4
- machines write. CJK falls back to PingFang / Source Han Sans; a Traditional
4
+ machines write. Arial / Helvetica Neue cover Cyrillic before the CJK faces,
5
+ whose Cyrillic glyphs can have wide advances. Keep system-ui after the CJK
6
+ families so it does not override their language-specific glyph shapes.
7
+ CJK falls back to PingFang / Source Han Sans; a Traditional
5
8
  Chinese, Japanese or Korean page (<html lang="zh-TW|ja|ko">) falls back to its
6
9
  own faces first, so characters keep Traditional or Japanese glyph shapes and
7
10
  Hangul a Korean face. */
8
11
  :where(:root) {
9
12
  --heading-font:
10
- "Space Grotesk", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC",
11
- system-ui, sans-serif;
13
+ "Space Grotesk", Arial, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
14
+ "Noto Sans SC", system-ui, sans-serif;
12
15
  --sans-font:
13
- "Space Grotesk", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC",
14
- system-ui, sans-serif;
16
+ "Space Grotesk", Arial, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
17
+ "Noto Sans SC", system-ui, sans-serif;
15
18
  --mono-font: "Space Mono", ui-monospace, "SF Mono", Menlo, monospace;
16
19
  }
17
20
 
18
21
  :where(:root:lang(zh-TW), :root:lang(zh-HK), :root:lang(zh-MO), :root:lang(zh-Hant)) {
19
22
  --heading-font:
20
- "Space Grotesk", "PingFang TC", "Microsoft JhengHei UI", "Microsoft JhengHei", "Noto Sans TC",
21
- "Noto Sans CJK TC", system-ui, sans-serif;
23
+ "Space Grotesk", Arial, "Helvetica Neue", "PingFang TC", "Microsoft JhengHei UI",
24
+ "Microsoft JhengHei", "Noto Sans TC", "Noto Sans CJK TC", system-ui, sans-serif;
22
25
  --sans-font:
23
- "Space Grotesk", "PingFang TC", "Microsoft JhengHei UI", "Microsoft JhengHei", "Noto Sans TC",
24
- "Noto Sans CJK TC", system-ui, sans-serif;
26
+ "Space Grotesk", Arial, "Helvetica Neue", "PingFang TC", "Microsoft JhengHei UI",
27
+ "Microsoft JhengHei", "Noto Sans TC", "Noto Sans CJK TC", system-ui, sans-serif;
25
28
  }
26
29
 
27
30
  :where(:root:lang(ja)) {
28
31
  --heading-font:
29
- "Space Grotesk", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic UI", Meiryo,
30
- "Noto Sans JP", "Noto Sans CJK JP", system-ui, sans-serif;
32
+ "Space Grotesk", Arial, "Helvetica Neue", "Hiragino Sans", "Hiragino Kaku Gothic ProN",
33
+ "Yu Gothic UI", Meiryo, "Noto Sans JP", "Noto Sans CJK JP", system-ui, sans-serif;
31
34
  --sans-font:
32
- "Space Grotesk", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic UI", Meiryo,
33
- "Noto Sans JP", "Noto Sans CJK JP", system-ui, sans-serif;
35
+ "Space Grotesk", Arial, "Helvetica Neue", "Hiragino Sans", "Hiragino Kaku Gothic ProN",
36
+ "Yu Gothic UI", Meiryo, "Noto Sans JP", "Noto Sans CJK JP", system-ui, sans-serif;
34
37
  }
35
38
 
36
39
  :where(:root:lang(ko)) {
37
40
  --heading-font:
38
- "Space Grotesk", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", "Noto Sans CJK KR",
39
- system-ui, sans-serif;
41
+ "Space Grotesk", Arial, "Helvetica Neue", "Apple SD Gothic Neo", "Malgun Gothic",
42
+ "Noto Sans KR", "Noto Sans CJK KR", system-ui, sans-serif;
40
43
  --sans-font:
41
- "Space Grotesk", "Apple SD Gothic Neo", "Malgun Gothic", "Noto Sans KR", "Noto Sans CJK KR",
42
- system-ui, sans-serif;
44
+ "Space Grotesk", Arial, "Helvetica Neue", "Apple SD Gothic Neo", "Malgun Gothic",
45
+ "Noto Sans KR", "Noto Sans CJK KR", system-ui, sans-serif;
43
46
  }
package/dist/wip.d.mts CHANGED
@@ -25,6 +25,7 @@ import "./components/table/index.mjs";
25
25
  import { DEFAULT_DRAG_MESSAGES, DragAnnouncementSource, DragMessages, DragNamed, DragPlace, createDragAnnouncements, dragInstructions, dragMessages } from "./components/drag/drag-announcements.mjs";
26
26
  import { PanelSplitAction, PanelSplitActionMain, PanelSplitActionMainProps, PanelSplitActionMenu, PanelSplitActionMenuProps, PanelSplitActionProps, PanelSplitActionToggle, PanelSplitActionToggleProps } from "./components/panel/panel-split-action.mjs";
27
27
  import "./components/panel/index.mjs";
28
+ import { InboxItemLine, InboxItemLineProps, InboxItemListGroup, InboxItemListGroupProps, InboxItemListHeading, InboxItemListHeadingProps, InboxItemStatus, InboxItemStatusProps } from "./components/inbox-item/inbox-item.mjs";
28
29
  import { ModeBar, ModeBarAction, ModeBarActionProps, ModeBarContent, ModeBarContentProps, ModeBarDescription, ModeBarDescriptionProps, ModeBarProps, ModeBarTitle, ModeBarTitleProps } from "./components/mode-bar/mode-bar.mjs";
29
30
  import "./components/mode-bar/index.mjs";
30
31
  import { ComboboxSelectGroup, ComboboxSelectMessages, ComboboxSelectOption, ComboboxSelectProps, ComboboxSelectSelection, ComboboxSelectValue } from "./components/combobox-select/combobox-select.types.mjs";
@@ -68,4 +69,4 @@ import { SaveStatus, SaveStatusError, SaveStatusErrorProps, SaveStatusProps, Sav
68
69
  import "./components/save-status/index.mjs";
69
70
  import { TaskCompletionControl, TaskCompletionControlProps } from "./components/task-completion-control/task-completion-control.mjs";
70
71
  import "./components/task-completion-control/index.mjs";
71
- export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AvatarGroupButton, type AvatarGroupButtonProps, COMMENT_HIGHLIGHT, COMMENT_HIGHLIGHT_ACTIVE, ChoiceList, type ChoiceListGroup, type ChoiceListItem, type ChoiceListMultipleProps, type ChoiceListProps, type ChoiceListSingleProps, ComboboxSelect, type ComboboxSelectGroup, type ComboboxSelectMessages, type ComboboxSelectOption, type ComboboxSelectProps, type ComboboxSelectSelection, type ComboboxSelectValue, CommentCard, CommentCardMeta, type CommentCardMetaProps, type CommentCardProps, CommentCardQuote, type CommentCardQuoteProps, CommentCardTrigger, type CommentCardTriggerProps, CommentEntry, CommentEntryAuthor, type CommentEntryAuthorProps, CommentEntryBody, type CommentEntryBodyProps, CommentEntryHeader, type CommentEntryHeaderProps, type CommentEntryProps, CommentEntryTime, type CommentEntryTimeProps, CommentMargin, CommentMarginItem, type CommentMarginItemProps, type CommentMarginLayout, type CommentMarginLayoutItem, type CommentMarginLayoutOptions, type CommentMarginProps, CommentMarker, type CommentMarkerProps, DEFAULT_DRAG_MESSAGES, DRAG_AUTO_SCROLL_ZONE_PX, DRAG_KEYBOARD_CODES, DRAG_KEYBOARD_OFFSET_PX, DRAG_LIFT_Z_INDEX, DRAG_SETTLE, DRAG_SIBLING_TRANSITION, DROP_GLIDE, DialogCommit, type DialogCommitProps, DialogFooterNote, type DialogFooterNoteProps, DialogSheetBack, type DialogSheetBackProps, DialogSheetContent, type DialogSheetContentProps, type DragAcrossLists, type DragAnnouncementSource, DragLift, type DragLiftProps, type DragListsItems, DragLiveRegion, type DragMessages, type DragNamed, type DragPlace, DragRefusalHint, type DragRefusalHintProps, DragRemeasure, type DragRemeasureProps, type DragSensorsOptions, DraggedSlot, type DraggedSlotProps, DropPlaceholder, type DropPlaceholderProps, DropdownMenuLinkItem, type DropdownMenuLinkItemProps, Ellipsis, type EllipsisProps, type EllipsisState, EllipsisToggle, type EllipsisToggleProps, FilterChip, FilterChipLabel, type FilterChipLabelProps, type FilterChipProps, FilterChipRemove, type FilterChipRemoveProps, type HoldThenMoveOptions, HoldThenMoveTouchSensor, InboxItemLeadingBadge, type InboxItemLeadingBadgeProps, InboxItemSkeleton, InboxItemSkeletonList, type InboxItemSkeletonListProps, type InboxItemSkeletonProps, type KbdKeyName, KbdShortcut, type KbdShortcutProps, type KeyboardPlatform, LIFT_CLASS, ListRowSkeleton, type ListRowSkeletonProps, MOUSE_DRAG_DISTANCE_PX, MessageItemDelegatedAvatar, type MessageItemDelegatedAvatarProps, MessageItemDelegatedBy, MessageItemDelegatedByButton, type MessageItemDelegatedByButtonProps, MessageItemDelegatedByName, type MessageItemDelegatedByNameProps, type MessageItemDelegatedByProps, MessageListJumpControls, type MessageListJumpControlsProps, MessageListJumpPill, MessageListJumpPillDismiss, type MessageListJumpPillDismissProps, MessageListJumpPillGroup, type MessageListJumpPillGroupProps, type MessageListJumpPillProps, MessageQuotedPreviewAuthorDelegatedBy, type MessageQuotedPreviewAuthorDelegatedByProps, MessageReferenceIcon, type MessageReferenceIconProps, MessageReferenceReadMark, type MessageReferenceReadMarkProps, Meter, MeterHeader, type MeterHeaderProps, MeterIndicator, type MeterIndicatorProps, MeterLabel, type MeterLabelProps, type MeterProps, MeterTrack, type MeterTrackProps, MeterValue, type MeterValueProps, MobileNavServerItem, type MobileNavServerItemProps, MobileNavServerPopover, MobileNavServerPopoverContent, type MobileNavServerPopoverContentProps, MobileNavServerPopoverDestination, type MobileNavServerPopoverDestinationProps, MobileNavServerPopoverDestinations, type MobileNavServerPopoverDestinationsProps, MobileNavServerPopoverGroup, type MobileNavServerPopoverGroupProps, MobileNavServerPopoverList, type MobileNavServerPopoverListProps, type MobileNavServerPopoverProps, MobileNavServerPopoverRow, MobileNavServerPopoverRowBody, type MobileNavServerPopoverRowBodyProps, MobileNavServerPopoverRowDescription, type MobileNavServerPopoverRowDescriptionProps, MobileNavServerPopoverRowLabel, type MobileNavServerPopoverRowLabelProps, type MobileNavServerPopoverRowProps, ModeBar, ModeBarAction, type ModeBarActionProps, ModeBarContent, type ModeBarContentProps, ModeBarDescription, type ModeBarDescriptionProps, type ModeBarProps, ModeBarTitle, type ModeBarTitleProps, MouseOnlyPointerSensor, ORIGIN_OPACITY, type OverlayLayerKind, OverlayLayerProvider, type OverlayLayerProviderProps, PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_POINTER_QUERY, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD, PanelSplitAction, PanelSplitActionMain, type PanelSplitActionMainProps, PanelSplitActionMenu, type PanelSplitActionMenuProps, type PanelSplitActionProps, PanelSplitActionToggle, type PanelSplitActionToggleProps, PopoverActions, type PopoverActionsProps, PopoverBody, type PopoverBodyProps, PreviewCardActions, type PreviewCardActionsProps, PreviewCardBody, type PreviewCardBodyProps, PreviewCardEyebrow, type PreviewCardEyebrowProps, PreviewCardFooter, type PreviewCardFooterProps, PreviewCardMeta, type PreviewCardMetaProps, type PullToRefresh, PullToRefreshIndicator, type PullToRefreshIndicatorProps, type PullToRefreshPlatform, type PullToRefreshState, SaveStatus, SaveStatusError, type SaveStatusErrorProps, type SaveStatusProps, SaveStatusSaved, type SaveStatusSavedProps, TOUCH_DRAG_DISTANCE_PX, TOUCH_DRAG_HOLD_MS, TOUCH_DRAG_TOLERANCE_PX, type TableSort, TableSortButton, type TableSortButtonProps, TableSortableHead, type TableSortableHeadProps, TaskCompletionControl, type TaskCompletionControlProps, type UseCommentMarginFitsOptions, type UseDragListsOptions, type UsePullToRefreshOptions, cancelDrag, createDragAnnouncements, dragInstructions, dragListStrategy, dragMessages, keepGrabInside, listKeyboardCoordinates, resolveCommentMarginLayout, setCommentHighlights, useCommentMarginFits, useDragAcrossLists, useDragAnnouncer, useDragLists, useDragSensors, useDragSiblingTransition, useHoldThenMoveTouchSensor, useKeyboardPlatform, useMouseOnlyPointerSensor, useParentOverlayKind, usePullToRefresh, useTruncated };
72
+ export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AvatarGroupButton, type AvatarGroupButtonProps, COMMENT_HIGHLIGHT, COMMENT_HIGHLIGHT_ACTIVE, ChoiceList, type ChoiceListGroup, type ChoiceListItem, type ChoiceListMultipleProps, type ChoiceListProps, type ChoiceListSingleProps, ComboboxSelect, type ComboboxSelectGroup, type ComboboxSelectMessages, type ComboboxSelectOption, type ComboboxSelectProps, type ComboboxSelectSelection, type ComboboxSelectValue, CommentCard, CommentCardMeta, type CommentCardMetaProps, type CommentCardProps, CommentCardQuote, type CommentCardQuoteProps, CommentCardTrigger, type CommentCardTriggerProps, CommentEntry, CommentEntryAuthor, type CommentEntryAuthorProps, CommentEntryBody, type CommentEntryBodyProps, CommentEntryHeader, type CommentEntryHeaderProps, type CommentEntryProps, CommentEntryTime, type CommentEntryTimeProps, CommentMargin, CommentMarginItem, type CommentMarginItemProps, type CommentMarginLayout, type CommentMarginLayoutItem, type CommentMarginLayoutOptions, type CommentMarginProps, CommentMarker, type CommentMarkerProps, DEFAULT_DRAG_MESSAGES, DRAG_AUTO_SCROLL_ZONE_PX, DRAG_KEYBOARD_CODES, DRAG_KEYBOARD_OFFSET_PX, DRAG_LIFT_Z_INDEX, DRAG_SETTLE, DRAG_SIBLING_TRANSITION, DROP_GLIDE, DialogCommit, type DialogCommitProps, DialogFooterNote, type DialogFooterNoteProps, DialogSheetBack, type DialogSheetBackProps, DialogSheetContent, type DialogSheetContentProps, type DragAcrossLists, type DragAnnouncementSource, DragLift, type DragLiftProps, type DragListsItems, DragLiveRegion, type DragMessages, type DragNamed, type DragPlace, DragRefusalHint, type DragRefusalHintProps, DragRemeasure, type DragRemeasureProps, type DragSensorsOptions, DraggedSlot, type DraggedSlotProps, DropPlaceholder, type DropPlaceholderProps, DropdownMenuLinkItem, type DropdownMenuLinkItemProps, Ellipsis, type EllipsisProps, type EllipsisState, EllipsisToggle, type EllipsisToggleProps, FilterChip, FilterChipLabel, type FilterChipLabelProps, type FilterChipProps, FilterChipRemove, type FilterChipRemoveProps, type HoldThenMoveOptions, HoldThenMoveTouchSensor, InboxItemLeadingBadge, type InboxItemLeadingBadgeProps, InboxItemLine, type InboxItemLineProps, InboxItemListGroup, type InboxItemListGroupProps, InboxItemListHeading, type InboxItemListHeadingProps, InboxItemSkeleton, InboxItemSkeletonList, type InboxItemSkeletonListProps, type InboxItemSkeletonProps, InboxItemStatus, type InboxItemStatusProps, type KbdKeyName, KbdShortcut, type KbdShortcutProps, type KeyboardPlatform, LIFT_CLASS, ListRowSkeleton, type ListRowSkeletonProps, MOUSE_DRAG_DISTANCE_PX, MessageItemDelegatedAvatar, type MessageItemDelegatedAvatarProps, MessageItemDelegatedBy, MessageItemDelegatedByButton, type MessageItemDelegatedByButtonProps, MessageItemDelegatedByName, type MessageItemDelegatedByNameProps, type MessageItemDelegatedByProps, MessageListJumpControls, type MessageListJumpControlsProps, MessageListJumpPill, MessageListJumpPillDismiss, type MessageListJumpPillDismissProps, MessageListJumpPillGroup, type MessageListJumpPillGroupProps, type MessageListJumpPillProps, MessageQuotedPreviewAuthorDelegatedBy, type MessageQuotedPreviewAuthorDelegatedByProps, MessageReferenceIcon, type MessageReferenceIconProps, MessageReferenceReadMark, type MessageReferenceReadMarkProps, Meter, MeterHeader, type MeterHeaderProps, MeterIndicator, type MeterIndicatorProps, MeterLabel, type MeterLabelProps, type MeterProps, MeterTrack, type MeterTrackProps, MeterValue, type MeterValueProps, MobileNavServerItem, type MobileNavServerItemProps, MobileNavServerPopover, MobileNavServerPopoverContent, type MobileNavServerPopoverContentProps, MobileNavServerPopoverDestination, type MobileNavServerPopoverDestinationProps, MobileNavServerPopoverDestinations, type MobileNavServerPopoverDestinationsProps, MobileNavServerPopoverGroup, type MobileNavServerPopoverGroupProps, MobileNavServerPopoverList, type MobileNavServerPopoverListProps, type MobileNavServerPopoverProps, MobileNavServerPopoverRow, MobileNavServerPopoverRowBody, type MobileNavServerPopoverRowBodyProps, MobileNavServerPopoverRowDescription, type MobileNavServerPopoverRowDescriptionProps, MobileNavServerPopoverRowLabel, type MobileNavServerPopoverRowLabelProps, type MobileNavServerPopoverRowProps, ModeBar, ModeBarAction, type ModeBarActionProps, ModeBarContent, type ModeBarContentProps, ModeBarDescription, type ModeBarDescriptionProps, type ModeBarProps, ModeBarTitle, type ModeBarTitleProps, MouseOnlyPointerSensor, ORIGIN_OPACITY, type OverlayLayerKind, OverlayLayerProvider, type OverlayLayerProviderProps, PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_POINTER_QUERY, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD, PanelSplitAction, PanelSplitActionMain, type PanelSplitActionMainProps, PanelSplitActionMenu, type PanelSplitActionMenuProps, type PanelSplitActionProps, PanelSplitActionToggle, type PanelSplitActionToggleProps, PopoverActions, type PopoverActionsProps, PopoverBody, type PopoverBodyProps, PreviewCardActions, type PreviewCardActionsProps, PreviewCardBody, type PreviewCardBodyProps, PreviewCardEyebrow, type PreviewCardEyebrowProps, PreviewCardFooter, type PreviewCardFooterProps, PreviewCardMeta, type PreviewCardMetaProps, type PullToRefresh, PullToRefreshIndicator, type PullToRefreshIndicatorProps, type PullToRefreshPlatform, type PullToRefreshState, SaveStatus, SaveStatusError, type SaveStatusErrorProps, type SaveStatusProps, SaveStatusSaved, type SaveStatusSavedProps, TOUCH_DRAG_DISTANCE_PX, TOUCH_DRAG_HOLD_MS, TOUCH_DRAG_TOLERANCE_PX, type TableSort, TableSortButton, type TableSortButtonProps, TableSortableHead, type TableSortableHeadProps, TaskCompletionControl, type TaskCompletionControlProps, type UseCommentMarginFitsOptions, type UseDragListsOptions, type UsePullToRefreshOptions, cancelDrag, createDragAnnouncements, dragInstructions, dragListStrategy, dragMessages, keepGrabInside, listKeyboardCoordinates, resolveCommentMarginLayout, setCommentHighlights, useCommentMarginFits, useDragAcrossLists, useDragAnnouncer, useDragLists, useDragSensors, useDragSiblingTransition, useHoldThenMoveTouchSensor, useKeyboardPlatform, useMouseOnlyPointerSensor, useParentOverlayKind, usePullToRefresh, useTruncated };
package/dist/wip.mjs CHANGED
@@ -21,6 +21,7 @@ import { DRAG_AUTO_SCROLL_ZONE_PX, DRAG_KEYBOARD_OFFSET_PX, DRAG_LIFT_Z_INDEX, D
21
21
  import { DRAG_KEYBOARD_CODES, DragRemeasure, MOUSE_DRAG_DISTANCE_PX, listKeyboardCoordinates, useDragAcrossLists, useDragSensors } from "./components/drag/drag-sensors.mjs";
22
22
  import { DragRefusalHint, DropPlaceholder } from "./components/drag/drop-placeholder.mjs";
23
23
  import { PanelSplitAction, PanelSplitActionMain, PanelSplitActionMenu, PanelSplitActionToggle } from "./components/panel/panel-split-action.mjs";
24
+ import { InboxItemLine, InboxItemListGroup, InboxItemListHeading, InboxItemStatus } from "./components/inbox-item/inbox-item.mjs";
24
25
  import { ModeBar, ModeBarAction, ModeBarContent, ModeBarDescription, ModeBarTitle } from "./components/mode-bar/mode-bar.mjs";
25
26
  import { ComboboxSelect } from "./components/combobox-select/combobox-select.mjs";
26
27
  import { AnnouncementDialogAction, AnnouncementDialogBody, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle } from "./components/announcement-dialog/announcement-dialog.mjs";
@@ -45,4 +46,4 @@ import { PullToRefreshIndicator } from "./components/pull-to-refresh/pull-to-ref
45
46
  import { ChoiceList } from "./components/choice-list/choice-list.mjs";
46
47
  import { SaveStatus, SaveStatusError, SaveStatusSaved } from "./components/save-status/save-status.mjs";
47
48
  import { TaskCompletionControl } from "./components/task-completion-control/task-completion-control.mjs";
48
- export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AvatarGroupButton, COMMENT_HIGHLIGHT, COMMENT_HIGHLIGHT_ACTIVE, ChoiceList, ComboboxSelect, CommentCard, CommentCardMeta, CommentCardQuote, CommentCardTrigger, CommentEntry, CommentEntryAuthor, CommentEntryBody, CommentEntryHeader, CommentEntryTime, CommentMargin, CommentMarginItem, CommentMarker, DEFAULT_DRAG_MESSAGES, DRAG_AUTO_SCROLL_ZONE_PX, DRAG_KEYBOARD_CODES, DRAG_KEYBOARD_OFFSET_PX, DRAG_LIFT_Z_INDEX, DRAG_SETTLE, DRAG_SIBLING_TRANSITION, DROP_GLIDE, DialogCommit, DialogFooterNote, DialogSheetBack, DialogSheetContent, DragLift, DragLiveRegion, DragRefusalHint, DragRemeasure, DraggedSlot, DropPlaceholder, DropdownMenuLinkItem, Ellipsis, EllipsisToggle, FilterChip, FilterChipLabel, FilterChipRemove, HoldThenMoveTouchSensor, InboxItemLeadingBadge, InboxItemSkeleton, InboxItemSkeletonList, KbdShortcut, LIFT_CLASS, ListRowSkeleton, MOUSE_DRAG_DISTANCE_PX, MessageItemDelegatedAvatar, MessageItemDelegatedBy, MessageItemDelegatedByButton, MessageItemDelegatedByName, MessageListJumpControls, MessageListJumpPill, MessageListJumpPillDismiss, MessageListJumpPillGroup, MessageQuotedPreviewAuthorDelegatedBy, MessageReferenceIcon, MessageReferenceReadMark, Meter, MeterHeader, MeterIndicator, MeterLabel, MeterTrack, MeterValue, MobileNavServerItem, MobileNavServerPopover, MobileNavServerPopoverContent, MobileNavServerPopoverDestination, MobileNavServerPopoverDestinations, MobileNavServerPopoverGroup, MobileNavServerPopoverList, MobileNavServerPopoverRow, MobileNavServerPopoverRowBody, MobileNavServerPopoverRowDescription, MobileNavServerPopoverRowLabel, ModeBar, ModeBarAction, ModeBarContent, ModeBarDescription, ModeBarTitle, MouseOnlyPointerSensor, ORIGIN_OPACITY, OverlayLayerProvider, PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_POINTER_QUERY, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD, PanelSplitAction, PanelSplitActionMain, PanelSplitActionMenu, PanelSplitActionToggle, PopoverActions, PopoverBody, PreviewCardActions, PreviewCardBody, PreviewCardEyebrow, PreviewCardFooter, PreviewCardMeta, PullToRefreshIndicator, SaveStatus, SaveStatusError, SaveStatusSaved, TOUCH_DRAG_DISTANCE_PX, TOUCH_DRAG_HOLD_MS, TOUCH_DRAG_TOLERANCE_PX, TableSortButton, TableSortableHead, TaskCompletionControl, cancelDrag, createDragAnnouncements, dragInstructions, dragListStrategy, dragMessages, keepGrabInside, listKeyboardCoordinates, resolveCommentMarginLayout, setCommentHighlights, useCommentMarginFits, useDragAcrossLists, useDragAnnouncer, useDragLists, useDragSensors, useDragSiblingTransition, useHoldThenMoveTouchSensor, useKeyboardPlatform, useMouseOnlyPointerSensor, useParentOverlayKind, usePullToRefresh, useTruncated };
49
+ export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AvatarGroupButton, COMMENT_HIGHLIGHT, COMMENT_HIGHLIGHT_ACTIVE, ChoiceList, ComboboxSelect, CommentCard, CommentCardMeta, CommentCardQuote, CommentCardTrigger, CommentEntry, CommentEntryAuthor, CommentEntryBody, CommentEntryHeader, CommentEntryTime, CommentMargin, CommentMarginItem, CommentMarker, DEFAULT_DRAG_MESSAGES, DRAG_AUTO_SCROLL_ZONE_PX, DRAG_KEYBOARD_CODES, DRAG_KEYBOARD_OFFSET_PX, DRAG_LIFT_Z_INDEX, DRAG_SETTLE, DRAG_SIBLING_TRANSITION, DROP_GLIDE, DialogCommit, DialogFooterNote, DialogSheetBack, DialogSheetContent, DragLift, DragLiveRegion, DragRefusalHint, DragRemeasure, DraggedSlot, DropPlaceholder, DropdownMenuLinkItem, Ellipsis, EllipsisToggle, FilterChip, FilterChipLabel, FilterChipRemove, HoldThenMoveTouchSensor, InboxItemLeadingBadge, InboxItemLine, InboxItemListGroup, InboxItemListHeading, InboxItemSkeleton, InboxItemSkeletonList, InboxItemStatus, KbdShortcut, LIFT_CLASS, ListRowSkeleton, MOUSE_DRAG_DISTANCE_PX, MessageItemDelegatedAvatar, MessageItemDelegatedBy, MessageItemDelegatedByButton, MessageItemDelegatedByName, MessageListJumpControls, MessageListJumpPill, MessageListJumpPillDismiss, MessageListJumpPillGroup, MessageQuotedPreviewAuthorDelegatedBy, MessageReferenceIcon, MessageReferenceReadMark, Meter, MeterHeader, MeterIndicator, MeterLabel, MeterTrack, MeterValue, MobileNavServerItem, MobileNavServerPopover, MobileNavServerPopoverContent, MobileNavServerPopoverDestination, MobileNavServerPopoverDestinations, MobileNavServerPopoverGroup, MobileNavServerPopoverList, MobileNavServerPopoverRow, MobileNavServerPopoverRowBody, MobileNavServerPopoverRowDescription, MobileNavServerPopoverRowLabel, ModeBar, ModeBarAction, ModeBarContent, ModeBarDescription, ModeBarTitle, MouseOnlyPointerSensor, ORIGIN_OPACITY, OverlayLayerProvider, PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_POINTER_QUERY, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD, PanelSplitAction, PanelSplitActionMain, PanelSplitActionMenu, PanelSplitActionToggle, PopoverActions, PopoverBody, PreviewCardActions, PreviewCardBody, PreviewCardEyebrow, PreviewCardFooter, PreviewCardMeta, PullToRefreshIndicator, SaveStatus, SaveStatusError, SaveStatusSaved, TOUCH_DRAG_DISTANCE_PX, TOUCH_DRAG_HOLD_MS, TOUCH_DRAG_TOLERANCE_PX, TableSortButton, TableSortableHead, TaskCompletionControl, cancelDrag, createDragAnnouncements, dragInstructions, dragListStrategy, dragMessages, keepGrabInside, listKeyboardCoordinates, resolveCommentMarginLayout, setCommentHighlights, useCommentMarginFits, useDragAcrossLists, useDragAnnouncer, useDragLists, useDragSensors, useDragSiblingTransition, useHoldThenMoveTouchSensor, useKeyboardPlatform, useMouseOnlyPointerSensor, useParentOverlayKind, usePullToRefresh, useTruncated };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botiverse/raft-ui",
3
- "version": "0.62.0",
3
+ "version": "0.63.1",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",