@botiverse/raft-ui 0.61.0 → 0.63.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ ## [0.63.0](https://github.com/botiverse/raft-design/compare/v0.62.0...v0.63.0) (2026-11-05)
2
+
3
+ ### Added
4
+
5
+ - **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))
6
+ - 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).
7
+ - 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).
8
+ - Docs: https://raft-design.botiverse.build/components/inbox-item/
9
+ - **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.
10
+ - **InboxItemSkeleton** and its list: a `line` prop, so a loading row matches a row with `InboxItemLine`. Off by default.
11
+
12
+ ## [0.62.0](https://github.com/botiverse/raft-design/compare/v0.61.0...v0.62.0) (2026-11-05)
13
+
14
+ ### Changed
15
+
16
+ - **AppShellSidebarTrigger**: its built-in labels are in sentence case: "Collapse sidebar" and "Expand sidebar", instead of "Collapse Sidebar" and "Expand Sidebar". ([#995](https://github.com/botiverse/raft-design/pull/995))
17
+ - Why: every clickable label in the Raft Design System now uses sentence case, with capitals only for the first word and for names ([decision 0044](https://raft-design.botiverse.build/decisions/0044-sentence-case-for-labels/), stdrc, #proj-raft-ui:10ce032d). The docs' rules and examples (buttons, menu items, tabs, links, tooltips, accessible names and the task status In progress) change with it.
18
+ - Affects: the trigger's `aria-label` and `title`. A trigger with your own `aria-label` is unchanged.
19
+ - Migrate: update tests and selectors that find the trigger by "Collapse Sidebar" or "Expand Sidebar" to the new names.
20
+ - Docs: https://raft-design.botiverse.build/components/app-shell/
21
+
22
+ ### Fixed
23
+
24
+ - **useCommentMarginFits**: answers `false` where the browser has no `matchMedia` or `ResizeObserver` (jsdom, some embedded webviews) instead of throwing during render. ([#996](https://github.com/botiverse/raft-design/pull/996))
25
+ - Why: a viewer that used the hook crashed on its first render in jsdom, which failed every DOM test of slock's Artifact viewer (Remy, slock #12976, #proj-workspace:#176).
26
+ - Affects: only environments without those APIs; there the margin never fits and the viewer keeps its `CommentMarker`s.
27
+ - Docs: https://raft-design.botiverse.build/components/comment/
28
+
1
29
  ## [0.61.0](https://github.com/botiverse/raft-design/compare/v0.60.3...v0.61.0) (2026-11-04)
2
30
 
3
31
  ### Changed
@@ -193,7 +193,7 @@ function AppShellSidebarTrigger(props) {
193
193
  });
194
194
  }
195
195
  function AppShellSidebarTriggerButton({ sidebar, className, children, onClick, render, ...props }) {
196
- const label = sidebar.open ? "Collapse Sidebar" : "Expand Sidebar";
196
+ const label = sidebar.open ? "Collapse sidebar" : "Expand sidebar";
197
197
  const defaultProps = {
198
198
  className: cn("group/app-shell-sidebar-trigger max-md:hidden", className),
199
199
  "aria-label": label,
@@ -1,13 +1,14 @@
1
1
  import { DESKTOP_MEDIA_QUERY } from "../../lib/desktop-media.mjs";
2
2
  import { useLayoutEffect, useState, useSyncExternalStore } from "react";
3
3
  //#region src/components/comment/use-comment-margin-fits.ts
4
+ const canMatchMedia = () => typeof window !== "undefined" && typeof window.matchMedia === "function";
4
5
  function subscribeDesktop(onChange) {
5
- if (typeof window === "undefined") return () => void 0;
6
+ if (!canMatchMedia()) return () => void 0;
6
7
  const media = window.matchMedia(DESKTOP_MEDIA_QUERY);
7
8
  media.addEventListener("change", onChange);
8
9
  return () => media.removeEventListener("change", onChange);
9
10
  }
10
- const getDesktop = () => typeof window !== "undefined" && window.matchMedia("(width >= 48rem) and (pointer: fine)").matches;
11
+ const getDesktop = () => canMatchMedia() && window.matchMedia("(width >= 48rem) and (pointer: fine)").matches;
11
12
  /**
12
13
  * Whether a viewer has room for a comment margin beside its document: true
13
14
  * only on a desktop (from 768px with a mouse or a trackpad, the query the
@@ -24,6 +25,7 @@ function useCommentMarginFits(element, { minWidth = 784 } = {}) {
24
25
  if (!element) return;
25
26
  const measure = () => setWidth(element.getBoundingClientRect().width);
26
27
  measure();
28
+ if (typeof ResizeObserver === "undefined") return;
27
29
  const observer = new ResizeObserver(measure);
28
30
  observer.observe(element);
29
31
  return () => observer.disconnect();
@@ -3,7 +3,7 @@ import { Announcements, ScreenReaderInstructions, UniqueIdentifier } from "@dnd-
3
3
  /** A place in words: the list or area's name, and the item's position in it when it has one. */
4
4
  export type DragPlace = {
5
5
  /**
6
- * The list or area, as people see it: "Pinned", "In Review", "the right
6
+ * The list or area, as people see it: "Pinned", "In review", "the right
7
7
  * column". Empty when it has no name (an unlabelled tab row): then only the
8
8
  * position is said.
9
9
  */
@@ -49,7 +49,7 @@ export type EllipsisToggleProps = Omit<TextLinkProps, "aria-expanded" | "aria-co
49
49
  /**
50
50
  * The control that expands an Ellipsis and collapses it again, for its
51
51
  * `after`. A real button, with `aria-expanded` and `aria-controls` pointing
52
- * at the text. The label is the caller's: "Show More" / "Show Less".
52
+ * at the text. The label is the caller's: "Show more" / "Show less".
53
53
  */
54
54
  export declare function EllipsisToggle({ onClick, ...props }: EllipsisToggleProps): import("react").JSX.Element;
55
55
  //#endregion
@@ -299,7 +299,7 @@ function Ellipsis({ children, lines = 1, tooltip = true, after, expanded: expand
299
299
  /**
300
300
  * The control that expands an Ellipsis and collapses it again, for its
301
301
  * `after`. A real button, with `aria-expanded` and `aria-controls` pointing
302
- * at the text. The label is the caller's: "Show More" / "Show Less".
302
+ * at the text. The label is the caller's: "Show more" / "Show less".
303
303
  */
304
304
  function EllipsisToggle({ onClick, ...props }) {
305
305
  const context = useContext(EllipsisContext);
@@ -16,7 +16,7 @@ export declare function FilterChipLabel({ className, ...props }: FilterChipLabel
16
16
  export type FilterChipRemoveProps = Omit<StyledProps<Button.Props>, "aria-label" | "type"> & DataAttributes & {
17
17
  /**
18
18
  * What the × does, said in words: the chip shows only a glyph. Name the
19
- * result, such as "Clear Filter" or "Show All".
19
+ * result, such as "Clear filter" or "Show all".
20
20
  */
21
21
  "aria-label": string;
22
22
  };
@@ -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",
@@ -14,7 +14,7 @@ export type MessageListJumpPillGroupProps = useRender.ComponentProps<"div">;
14
14
  /** A pill and its dismiss button, joined on one shared edge. */
15
15
  export declare function MessageListJumpPillGroup({ className, render, ...props }: MessageListJumpPillGroupProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
16
16
  export type MessageListJumpPillDismissProps = StyledProps<Button.Props> & DataAttributes & {
17
- /** What the button does, in Title Case: the product's words. */
17
+ /** What the button does, in sentence case: the product's words. */
18
18
  "aria-label": string;
19
19
  };
20
20
  export declare function MessageListJumpPillDismiss({ className, children, render, nativeButton, ...props }: MessageListJumpPillDismissProps): import("react").JSX.Element;
@@ -60,7 +60,7 @@ export type SelectActionItemProps = StyledProps<Omit<Select.Item.Props, "value"
60
60
  onAction?: (event: Event) => void;
61
61
  /**
62
62
  * Whether pressing the row closes the list. Off by default: a list action
63
- * such as Show All changes what the list shows, so the list stays open.
63
+ * such as Show all changes what the list shows, so the list stays open.
64
64
  * @default false
65
65
  */
66
66
  closeOnAction?: boolean;
@@ -71,7 +71,7 @@ export type SelectActionItemProps = StyledProps<Omit<Select.Item.Props, "value"
71
71
  };
72
72
  /**
73
73
  * An action row inside the list, placed last after a `SelectSeparator`, such as
74
- * Show All. It is reached by the arrow keys and typeahead like an item, but
74
+ * Show all. It is reached by the arrow keys and typeahead like an item, but
75
75
  * pressing it runs `onAction` instead of choosing a value. It is an option to
76
76
  * assistive technology, so it takes no `aria-expanded`: its label says what it
77
77
  * does.
@@ -392,7 +392,7 @@ function SelectItemDescription({ className, id, ...props }) {
392
392
  }
393
393
  /**
394
394
  * An action row inside the list, placed last after a `SelectSeparator`, such as
395
- * Show All. It is reached by the arrow keys and typeahead like an item, but
395
+ * Show all. It is reached by the arrow keys and typeahead like an item, but
396
396
  * pressing it runs `onAction` instead of choosing a value. It is an option to
397
397
  * assistive technology, so it takes no `aria-expanded`: its label says what it
398
398
  * does.
@@ -11,7 +11,7 @@ export declare function TextSelectionToolbar({ className, ...props }: TextSelect
11
11
  export type TextSelectionToolbarButtonProps = StyledProps<Toolbar.Button.Props>;
12
12
  /**
13
13
  * One action on the selected text: a 28px button with a 16px icon and a
14
- * Title Case label that never wraps.
14
+ * sentence-case label that never wraps.
15
15
  */
16
16
  export declare function TextSelectionToolbarButton({ className, ...props }: TextSelectionToolbarButtonProps): import("react").JSX.Element;
17
17
  export type TextSelectionToolbarSeparatorProps = StyledProps<Toolbar.Separator.Props>;
@@ -17,7 +17,7 @@ function TextSelectionToolbar({ className, ...props }) {
17
17
  }
18
18
  /**
19
19
  * One action on the selected text: a 28px button with a 16px icon and a
20
- * Title Case label that never wraps.
20
+ * sentence-case label that never wraps.
21
21
  */
22
22
  function TextSelectionToolbarButton({ className, ...props }) {
23
23
  const { button } = textSelectionToolbar();
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.61.0",
3
+ "version": "0.63.0",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",