@botiverse/raft-ui 0.63.0 → 0.64.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,32 @@
1
+ ## [0.64.0](https://github.com/botiverse/raft-design/compare/v0.63.1...v0.64.0) (2026-11-05)
2
+
3
+ ### Added
4
+
5
+ - **ButtonSplit**, **ButtonSplitMain** and **ButtonSplitMenu** (from `@botiverse/raft-ui/wip`): a `primary` or `default` Button with its ▾ menu, one shape in two parts. The parts touch and share one `radius-control` outline, the menu part's start border divides them, and each part hovers, presses, focuses and disables on its own; `disabled` on the group disables both. ([#1009](https://github.com/botiverse/raft-design/pull/1009))
6
+ - Why: Raft Chat's Members header needs Create agent with a ▾ for Take over a local session and Connect an external agent (cindyz, #triage:36bfa2f8; rule in [#1008](https://github.com/botiverse/raft-design/pull/1008)), and raft-ui only had `PanelSplitAction`, the frameless split of a panel header.
7
+ - Affects: nothing until used.
8
+ - Docs: https://raft-design.botiverse.build/components/button/#split-buttons
9
+ - **AppLinkCard** and its parts (from `@botiverse/raft-ui/wip`): an app link's card drawn in the message itself, after the link's paragraph, where the app's answer lists one (protocol version 3: a `card` item with `placement: "block"` in `items`). The link is never replaced: it stays a chip when the answer lists `inline`, and the author's plain link when it doesn't. `AppLinkCardHeader` (with `AppLinkCardIcon`, `AppLinkCardName` and `AppLinkCardHost`) is Raft's row naming the app; `AppLinkCardBody`, `AppLinkCardEyebrow`, `AppLinkCardTitle` and `AppLinkCardMeta` are the item, as on the hover card, and the title holds a link that opens the item; `AppLinkCardActions` holds at most two of the app's buttons and ⋯ for the rest, where an Open link goes; `AppLinkCardPlaceholder` is the card's size while a cached answer loads. 400px wide, the message's width in the phone layout. Navigation's App links now say what each item of an answer draws, in the list's order, with nothing inferred. ([#1010](https://github.com/botiverse/raft-design/pull/1010))
10
+ - Why: a card whose buttons matter, such as a Stamp approval, could be acted on only by hovering its chip on desktop, and not at all on a phone. The app lists every way its link is drawn, a chip, a hover card or a block card, as artin decided in #proj-raft-ui:d3528715 after the prototype (https://app.raft.build/artifacts/Q6r36on3znYNHnSbczSH3S); AppFather defined version 3 (#proj-raft-ui:46e9d07e and 8051e1a8). Tenny asked that Raft always draw the app's name and icon in its own frame.
11
+ - Affects: nothing until a product draws one. PreviewCard is untouched.
12
+ - Docs: https://raft-design.botiverse.build/components/app-link-card/ and https://raft-design.botiverse.build/patterns/navigation/#what-an-apps-answer-lists
13
+
14
+ ### Fixed
15
+
16
+ - **CommentMarginItem**: a `CommentMargin` renders its cards where the browser has no `ResizeObserver` (jsdom, some embedded webviews) instead of throwing. Each card keeps the height it had when placed. ([#1007](https://github.com/botiverse/raft-design/pull/1007))
17
+ - Why: the same gap #996 closed in `useCommentMarginFits`; slock's Artifact viewer works around it today by not drawing the margin there (Remy, slock #13062).
18
+ - Affects: only environments without `ResizeObserver`; there a card that grows after it is placed doesn't push the cards below it.
19
+ - Docs: https://raft-design.botiverse.build/components/comment/
20
+
21
+ ## [0.63.1](https://github.com/botiverse/raft-design/compare/v0.63.0...v0.63.1) (2026-11-05)
22
+
23
+ ### Fixed
24
+
25
+ - **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))
26
+ - 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).
27
+ - 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.
28
+ - Docs: https://raft-design.botiverse.build/foundations/typography/
29
+
1
30
  ## [0.63.0](https://github.com/botiverse/raft-design/compare/v0.62.0...v0.63.0) (2026-11-05)
2
31
 
3
32
  ### Added
@@ -0,0 +1,56 @@
1
+ import { ComponentPropsWithRef } from "react";
2
+ //#region src/components/app-link-card/app-link-card.d.ts
3
+ export type AppLinkCardProps = ComponentPropsWithRef<"div">;
4
+ /**
5
+ * An app link's card drawn in the message, after the link's paragraph, where
6
+ * the app's answer lists one (a `card` item with `placement: "block"`):
7
+ * Raft's header with the app's identity, the item, and buttons that work by
8
+ * keyboard and touch. It never replaces the link. A `group`: label it with
9
+ * `aria-labelledby` pointing at its `AppLinkCardTitle`, so someone who tabs
10
+ * to one of its buttons hears which item the button acts on.
11
+ */
12
+ export declare function AppLinkCard({ className, ...props }: AppLinkCardProps): import("react").JSX.Element;
13
+ export type AppLinkCardPlaceholderProps = ComponentPropsWithRef<"div">;
14
+ /**
15
+ * The card's size while Raft fetches an answer it already knows lists a
16
+ * block card. Put the `AppLinkCardHeader` in it when the app is known; the item's
17
+ * lines and a button follow, as gray bars.
18
+ */
19
+ export declare function AppLinkCardPlaceholder({ className, children, ...props }: AppLinkCardPlaceholderProps): import("react").JSX.Element;
20
+ export type AppLinkCardHeaderProps = ComponentPropsWithRef<"div">;
21
+ /** Raft's row at the top: `AppLinkCardIcon`, `AppLinkCardName`, then `AppLinkCardHost`. */
22
+ export declare function AppLinkCardHeader({ className, ...props }: AppLinkCardHeaderProps): import("react").JSX.Element;
23
+ export type AppLinkCardIconProps = ComponentPropsWithRef<"span">;
24
+ /** The app's registered icon, the image Raft stores and serves: one child at 16px. */
25
+ export declare function AppLinkCardIcon({ className, ...props }: AppLinkCardIconProps): import("react").JSX.Element;
26
+ export type AppLinkCardNameProps = ComponentPropsWithRef<"span">;
27
+ /** The app's name as Raft stores it. One line, truncated. */
28
+ export declare function AppLinkCardName({ className, ...props }: AppLinkCardNameProps): import("react").JSX.Element;
29
+ export type AppLinkCardHostProps = ComponentPropsWithRef<"span">;
30
+ /**
31
+ * The link's host, after a "·". When it doesn't fit it loses its start, so
32
+ * the end, which says where the link goes, stays.
33
+ */
34
+ export declare function AppLinkCardHost({ className, children, ...props }: AppLinkCardHostProps): import("react").JSX.Element;
35
+ export type AppLinkCardBodyProps = ComponentPropsWithRef<"div">;
36
+ /** The item: `AppLinkCardEyebrow`, `AppLinkCardTitle`, `AppLinkCardMeta`, in that order. */
37
+ export declare function AppLinkCardBody({ className, ...props }: AppLinkCardBodyProps): import("react").JSX.Element;
38
+ export type AppLinkCardEyebrowProps = ComponentPropsWithRef<"p">;
39
+ /** The app's id for the item, above the title. One line, truncated. */
40
+ export declare function AppLinkCardEyebrow({ className, ...props }: AppLinkCardEyebrowProps): import("react").JSX.Element;
41
+ export type AppLinkCardTitleProps = ComponentPropsWithRef<"p">;
42
+ /**
43
+ * The app's title for the item, up to 2 lines, then an ellipsis. Put a link
44
+ * to the item in it: the title opens the item, in the title's ink.
45
+ */
46
+ export declare function AppLinkCardTitle({ className, ...props }: AppLinkCardTitleProps): import("react").JSX.Element;
47
+ export type AppLinkCardMetaProps = ComponentPropsWithRef<"div">;
48
+ /** One state in a neutral Badge, then muted details. Wraps when it runs out of room. */
49
+ export declare function AppLinkCardMeta({ className, ...props }: AppLinkCardMetaProps): import("react").JSX.Element;
50
+ export type AppLinkCardActionsProps = ComponentPropsWithRef<"div">;
51
+ /**
52
+ * The app's buttons at the card's bottom end: at most two, the bordered one
53
+ * last, with a More menu (⋯) to their left for the rest.
54
+ */
55
+ export declare function AppLinkCardActions({ className, ...props }: AppLinkCardActionsProps): import("react").JSX.Element;
56
+ //#endregion
@@ -0,0 +1,207 @@
1
+ import { tv } from "../../lib/tv.mjs";
2
+ import { messageEmbed } from "../message-embed/message-embed.recipe.mjs";
3
+ import { Skeleton } from "../skeleton/skeleton.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/app-link-card/app-link-card.tsx
6
+ const appLinkCard = tv({ slots: {
7
+ root: ["flex w-full max-w-[400px] min-w-0 flex-col max-md:max-w-none", "my-2 first:mt-0 last:mb-0"],
8
+ header: [
9
+ "flex min-w-0 items-center gap-1.5",
10
+ "border-b border-line-hairline px-4 py-2",
11
+ "font-sans text-caption text-foreground-muted"
12
+ ],
13
+ icon: ["inline-flex size-4 shrink-0 items-center justify-center", "*:size-full *:shrink-0 [&>img]:rounded-[2px] [&>img]:object-cover"],
14
+ name: ["min-w-0 truncate", "font-semibold text-foreground"],
15
+ host: ["flex min-w-0 items-baseline", "before:shrink-0 before:pe-1.5 before:content-['·']"],
16
+ hostText: ["min-w-0 truncate"],
17
+ body: ["flex min-w-0 flex-col gap-1.5", "px-4 py-3 last:pb-4"],
18
+ eyebrow: ["m-0 truncate", "font-mono text-mono-meta text-foreground-muted"],
19
+ title: [
20
+ "m-0 line-clamp-2",
21
+ "font-sans text-headline font-bold text-foreground",
22
+ "[&_a]:rounded-[2px] [&_a]:decoration-[1.5px] [&_a]:underline-offset-[3px] [&_a]:hover:underline",
23
+ "[&_a]:outline-none [&_a]:focus-visible:shadow-focus"
24
+ ],
25
+ meta: ["flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1", "m-0 font-sans text-callout text-foreground-muted"],
26
+ actions: ["flex flex-wrap items-center justify-end gap-2", "px-4 pb-3 last:pb-4"],
27
+ placeholderLine: ["flex h-lh items-center"],
28
+ placeholderButton: ["h-8 w-28 rounded-control"]
29
+ } });
30
+ function frame(className) {
31
+ const { root } = appLinkCard();
32
+ return messageEmbed().root({ className: root({ className }) });
33
+ }
34
+ /**
35
+ * An app link's card drawn in the message, after the link's paragraph, where
36
+ * the app's answer lists one (a `card` item with `placement: "block"`):
37
+ * Raft's header with the app's identity, the item, and buttons that work by
38
+ * keyboard and touch. It never replaces the link. A `group`: label it with
39
+ * `aria-labelledby` pointing at its `AppLinkCardTitle`, so someone who tabs
40
+ * to one of its buttons hears which item the button acts on.
41
+ */
42
+ function AppLinkCard({ className, ...props }) {
43
+ return /* @__PURE__ */ jsx("div", {
44
+ role: "group",
45
+ "data-slot": "app-link-card",
46
+ className: frame(className),
47
+ ...props
48
+ });
49
+ }
50
+ /**
51
+ * The card's size while Raft fetches an answer it already knows lists a
52
+ * block card. Put the `AppLinkCardHeader` in it when the app is known; the item's
53
+ * lines and a button follow, as gray bars.
54
+ */
55
+ function AppLinkCardPlaceholder({ className, children, ...props }) {
56
+ const { body, eyebrow, title, meta, actions, placeholderLine, placeholderButton } = appLinkCard();
57
+ return /* @__PURE__ */ jsxs("div", {
58
+ "data-slot": "app-link-card-placeholder",
59
+ "aria-busy": "true",
60
+ className: frame(className),
61
+ ...props,
62
+ children: [
63
+ children,
64
+ /* @__PURE__ */ jsxs("div", {
65
+ "aria-hidden": "true",
66
+ className: body(),
67
+ children: [
68
+ /* @__PURE__ */ jsx("div", {
69
+ className: eyebrow({ className: placeholderLine() }),
70
+ children: /* @__PURE__ */ jsx(Skeleton, {
71
+ variant: "line",
72
+ className: "w-28"
73
+ })
74
+ }),
75
+ /* @__PURE__ */ jsxs("div", {
76
+ className: title({ className: "line-clamp-none" }),
77
+ children: [/* @__PURE__ */ jsx("div", {
78
+ className: placeholderLine(),
79
+ children: /* @__PURE__ */ jsx(Skeleton, {
80
+ variant: "line",
81
+ className: "w-full"
82
+ })
83
+ }), /* @__PURE__ */ jsx("div", {
84
+ className: placeholderLine(),
85
+ children: /* @__PURE__ */ jsx(Skeleton, {
86
+ variant: "line",
87
+ className: "w-2/3"
88
+ })
89
+ })]
90
+ }),
91
+ /* @__PURE__ */ jsx("div", {
92
+ className: meta({ className: placeholderLine() }),
93
+ children: /* @__PURE__ */ jsx(Skeleton, {
94
+ variant: "line",
95
+ className: "w-40"
96
+ })
97
+ })
98
+ ]
99
+ }),
100
+ /* @__PURE__ */ jsx("div", {
101
+ "aria-hidden": "true",
102
+ className: actions(),
103
+ children: /* @__PURE__ */ jsx(Skeleton, { className: placeholderButton() })
104
+ })
105
+ ]
106
+ });
107
+ }
108
+ /** Raft's row at the top: `AppLinkCardIcon`, `AppLinkCardName`, then `AppLinkCardHost`. */
109
+ function AppLinkCardHeader({ className, ...props }) {
110
+ const { header } = appLinkCard();
111
+ return /* @__PURE__ */ jsx("div", {
112
+ "data-slot": "app-link-card-header",
113
+ className: header({ className }),
114
+ ...props
115
+ });
116
+ }
117
+ /** The app's registered icon, the image Raft stores and serves: one child at 16px. */
118
+ function AppLinkCardIcon({ className, ...props }) {
119
+ const { icon } = appLinkCard();
120
+ return /* @__PURE__ */ jsx("span", {
121
+ "data-slot": "app-link-card-icon",
122
+ className: icon({ className }),
123
+ ...props
124
+ });
125
+ }
126
+ /** The app's name as Raft stores it. One line, truncated. */
127
+ function AppLinkCardName({ className, ...props }) {
128
+ const { name } = appLinkCard();
129
+ return /* @__PURE__ */ jsx("span", {
130
+ "data-slot": "app-link-card-name",
131
+ className: name({ className }),
132
+ ...props
133
+ });
134
+ }
135
+ /**
136
+ * The link's host, after a "·". When it doesn't fit it loses its start, so
137
+ * the end, which says where the link goes, stays.
138
+ */
139
+ function AppLinkCardHost({ className, children, ...props }) {
140
+ const { host, hostText } = appLinkCard();
141
+ return /* @__PURE__ */ jsx("span", {
142
+ "data-slot": "app-link-card-host",
143
+ className: host({ className }),
144
+ ...props,
145
+ children: /* @__PURE__ */ jsx("span", {
146
+ dir: "rtl",
147
+ className: hostText(),
148
+ children: /* @__PURE__ */ jsx("span", {
149
+ dir: "ltr",
150
+ children
151
+ })
152
+ })
153
+ });
154
+ }
155
+ /** The item: `AppLinkCardEyebrow`, `AppLinkCardTitle`, `AppLinkCardMeta`, in that order. */
156
+ function AppLinkCardBody({ className, ...props }) {
157
+ const { body } = appLinkCard();
158
+ return /* @__PURE__ */ jsx("div", {
159
+ "data-slot": "app-link-card-body",
160
+ className: body({ className }),
161
+ ...props
162
+ });
163
+ }
164
+ /** The app's id for the item, above the title. One line, truncated. */
165
+ function AppLinkCardEyebrow({ className, ...props }) {
166
+ const { eyebrow } = appLinkCard();
167
+ return /* @__PURE__ */ jsx("p", {
168
+ "data-slot": "app-link-card-eyebrow",
169
+ className: eyebrow({ className }),
170
+ ...props
171
+ });
172
+ }
173
+ /**
174
+ * The app's title for the item, up to 2 lines, then an ellipsis. Put a link
175
+ * to the item in it: the title opens the item, in the title's ink.
176
+ */
177
+ function AppLinkCardTitle({ className, ...props }) {
178
+ const { title } = appLinkCard();
179
+ return /* @__PURE__ */ jsx("p", {
180
+ "data-slot": "app-link-card-title",
181
+ className: title({ className }),
182
+ ...props
183
+ });
184
+ }
185
+ /** One state in a neutral Badge, then muted details. Wraps when it runs out of room. */
186
+ function AppLinkCardMeta({ className, ...props }) {
187
+ const { meta } = appLinkCard();
188
+ return /* @__PURE__ */ jsx("div", {
189
+ "data-slot": "app-link-card-meta",
190
+ className: meta({ className }),
191
+ ...props
192
+ });
193
+ }
194
+ /**
195
+ * The app's buttons at the card's bottom end: at most two, the bordered one
196
+ * last, with a More menu (⋯) to their left for the rest.
197
+ */
198
+ function AppLinkCardActions({ className, ...props }) {
199
+ const { actions } = appLinkCard();
200
+ return /* @__PURE__ */ jsx("div", {
201
+ "data-slot": "app-link-card-actions",
202
+ className: actions({ className }),
203
+ ...props
204
+ });
205
+ }
206
+ //#endregion
207
+ export { AppLinkCard, AppLinkCardActions, AppLinkCardBody, AppLinkCardEyebrow, AppLinkCardHeader, AppLinkCardHost, AppLinkCardIcon, AppLinkCardMeta, AppLinkCardName, AppLinkCardPlaceholder, AppLinkCardTitle };
@@ -0,0 +1,2 @@
1
+ import { AppLinkCard, AppLinkCardActions, AppLinkCardActionsProps, AppLinkCardBody, AppLinkCardBodyProps, AppLinkCardEyebrow, AppLinkCardEyebrowProps, AppLinkCardHeader, AppLinkCardHeaderProps, AppLinkCardHost, AppLinkCardHostProps, AppLinkCardIcon, AppLinkCardIconProps, AppLinkCardMeta, AppLinkCardMetaProps, AppLinkCardName, AppLinkCardNameProps, AppLinkCardPlaceholder, AppLinkCardPlaceholderProps, AppLinkCardTitle, AppLinkCardTitleProps } from "./app-link-card.mjs";
2
+ export { AppLinkCard, AppLinkCardActions, type AppLinkCardActionsProps, AppLinkCardBody, type AppLinkCardBodyProps, AppLinkCardEyebrow, type AppLinkCardEyebrowProps, AppLinkCardHeader, type AppLinkCardHeaderProps, AppLinkCardHost, type AppLinkCardHostProps, AppLinkCardIcon, type AppLinkCardIconProps, AppLinkCardMeta, type AppLinkCardMetaProps, AppLinkCardName, type AppLinkCardNameProps, AppLinkCardPlaceholder, type AppLinkCardPlaceholderProps, AppLinkCardTitle, type AppLinkCardTitleProps };
@@ -0,0 +1,38 @@
1
+ import { DataAttributes } from "../../lib/data-attributes.mjs";
2
+ import { ButtonProps } from "./button.mjs";
3
+ import { ComponentProps } from "react";
4
+ //#region src/components/button/button-split.d.ts
5
+ /** The Button variants a split button takes: the filled ones and the bordered one. */
6
+ export type ButtonSplitVariant = "primary" | "default" | "warning" | "danger";
7
+ /** The Button sizes a split button takes. */
8
+ export type ButtonSplitSize = "md" | "lg";
9
+ export type ButtonSplitProps = ComponentProps<"div"> & DataAttributes & {
10
+ /** Disables both parts. Either part can also be disabled on its own. */
11
+ disabled?: boolean;
12
+ };
13
+ /**
14
+ * A Button with a menu beside it, such as Create agent and its ▾: a
15
+ * `ButtonSplitMain`, then a `ButtonSplitMenu` as the trigger of a DropdownMenu.
16
+ * The two parts touch and read as one button. A `role="group"`: name it with
17
+ * `aria-label`, not with the main part's name. For a frameless split in a
18
+ * panel header, use `PanelSplitAction`.
19
+ */
20
+ export declare function ButtonSplit({ disabled, className, ...props }: ButtonSplitProps): import("react").JSX.Element;
21
+ type ButtonSplitPartProps = Omit<ButtonProps, "variant" | "size"> & {
22
+ /** The Button variant; give both parts the same one. */
23
+ variant?: ButtonSplitVariant;
24
+ /** The Button size; give both parts the same one. */
25
+ size?: ButtonSplitSize;
26
+ };
27
+ export type ButtonSplitMainProps = ButtonSplitPartProps;
28
+ /** The action of a split button: a Button, rounded only on its start side. */
29
+ export declare function ButtonSplitMain({ variant, size, disabled, className, ...props }: ButtonSplitMainProps): import("react").JSX.Element;
30
+ export type ButtonSplitMenuProps = ButtonSplitPartProps;
31
+ /**
32
+ * The narrow part of a split button that opens its menu, with a chevron by
33
+ * default; its start border is the divider. Render it as the trigger of a
34
+ * DropdownMenu:
35
+ * `<DropdownMenuTrigger render={<ButtonSplitMenu aria-label="More ways to create an agent" />} />`.
36
+ */
37
+ export declare function ButtonSplitMenu({ variant, size, disabled, className, children, ...props }: ButtonSplitMenuProps): import("react").JSX.Element;
38
+ //#endregion
@@ -0,0 +1,119 @@
1
+ import { tv } from "../../lib/tv.mjs";
2
+ import { Button } from "./button.mjs";
3
+ import { ChevronDown } from "lucide-react";
4
+ import { createContext, useCallback, useContext, useLayoutEffect, useMemo, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/components/button/button-split.tsx
7
+ const buttonSplit = tv({ base: [
8
+ "relative isolate inline-flex shrink-0 items-stretch",
9
+ "rounded-control ring-sticker-edge",
10
+ "data-sticker-edge:ring-[1.5px]"
11
+ ] });
12
+ const buttonSplitMain = tv({ base: ["rounded-e-none border-e-0", "ring-0 focus-visible:z-1"] });
13
+ const buttonSplitMenu = tv({
14
+ base: [
15
+ "min-w-0 rounded-s-none px-0",
16
+ "ring-0 focus-visible:z-1",
17
+ "after:inset-s-0"
18
+ ],
19
+ variants: {
20
+ variant: {
21
+ primary: "data-popup-open:overlay-sticker-medium",
22
+ warning: "data-popup-open:overlay-sticker-medium",
23
+ danger: "data-popup-open:overlay-sticker-medium",
24
+ default: "data-popup-open:overlay-medium"
25
+ },
26
+ size: {
27
+ md: ["w-7", "after:-inset-e-[calc(--spacing(4)+1.5px)]"],
28
+ lg: ["w-9 md:pointer-fine:w-7", "after:-inset-e-[calc(--spacing(2)+1.5px)] md:pointer-fine:after:-inset-e-[calc(--spacing(4)+1.5px)]"]
29
+ }
30
+ },
31
+ defaultVariants: {
32
+ variant: "default",
33
+ size: "md"
34
+ }
35
+ });
36
+ const STICKERS = /* @__PURE__ */ new Set([
37
+ "primary",
38
+ "warning",
39
+ "danger"
40
+ ]);
41
+ const ButtonSplitContext = createContext({
42
+ disabled: false,
43
+ registerStickerPart: () => () => {}
44
+ });
45
+ /** An enabled sticker part asks its group to draw the die-cut edge while it is mounted. */
46
+ function useStickerEdge(active) {
47
+ const { registerStickerPart } = useContext(ButtonSplitContext);
48
+ useLayoutEffect(() => active ? registerStickerPart() : void 0, [active, registerStickerPart]);
49
+ }
50
+ /**
51
+ * A Button with a menu beside it, such as Create agent and its ▾: a
52
+ * `ButtonSplitMain`, then a `ButtonSplitMenu` as the trigger of a DropdownMenu.
53
+ * The two parts touch and read as one button. A `role="group"`: name it with
54
+ * `aria-label`, not with the main part's name. For a frameless split in a
55
+ * panel header, use `PanelSplitAction`.
56
+ */
57
+ function ButtonSplit({ disabled = false, className, ...props }) {
58
+ const [stickerParts, setStickerParts] = useState(0);
59
+ const registerStickerPart = useCallback(() => {
60
+ setStickerParts((count) => count + 1);
61
+ return () => setStickerParts((count) => count - 1);
62
+ }, []);
63
+ const context = useMemo(() => ({
64
+ disabled,
65
+ registerStickerPart
66
+ }), [disabled, registerStickerPart]);
67
+ return /* @__PURE__ */ jsx(ButtonSplitContext.Provider, {
68
+ value: context,
69
+ children: /* @__PURE__ */ jsx("div", {
70
+ role: "group",
71
+ ...props,
72
+ "data-slot": "button-split",
73
+ "data-sticker-edge": stickerParts > 0 ? "" : void 0,
74
+ className: buttonSplit({ className })
75
+ })
76
+ });
77
+ }
78
+ /** The action of a split button: a Button, rounded only on its start side. */
79
+ function ButtonSplitMain({ variant = "default", size = "md", disabled, className, ...props }) {
80
+ const group = useContext(ButtonSplitContext);
81
+ const isDisabled = disabled || group.disabled;
82
+ useStickerEdge(STICKERS.has(variant) && !isDisabled && !props.loading);
83
+ return /* @__PURE__ */ jsx(Button, {
84
+ ...props,
85
+ variant,
86
+ size,
87
+ disabled: isDisabled,
88
+ "data-split-part": "main",
89
+ "data-split-sticker": STICKERS.has(variant) ? "" : void 0,
90
+ className: buttonSplitMain({ className })
91
+ });
92
+ }
93
+ /**
94
+ * The narrow part of a split button that opens its menu, with a chevron by
95
+ * default; its start border is the divider. Render it as the trigger of a
96
+ * DropdownMenu:
97
+ * `<DropdownMenuTrigger render={<ButtonSplitMenu aria-label="More ways to create an agent" />} />`.
98
+ */
99
+ function ButtonSplitMenu({ variant = "default", size = "md", disabled, className, children, ...props }) {
100
+ const group = useContext(ButtonSplitContext);
101
+ const isDisabled = disabled || group.disabled;
102
+ useStickerEdge(STICKERS.has(variant) && !isDisabled && !props.loading);
103
+ return /* @__PURE__ */ jsx(Button, {
104
+ ...props,
105
+ variant,
106
+ size,
107
+ disabled: isDisabled,
108
+ "data-split-part": "menu",
109
+ "data-split-sticker": STICKERS.has(variant) ? "" : void 0,
110
+ className: buttonSplitMenu({
111
+ variant,
112
+ size,
113
+ className
114
+ }),
115
+ children: children ?? /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": true })
116
+ });
117
+ }
118
+ //#endregion
119
+ export { ButtonSplit, ButtonSplitMain, ButtonSplitMenu, buttonSplit, buttonSplitMain, buttonSplitMenu };
@@ -1,2 +1,3 @@
1
1
  import { Button, ButtonProps, ButtonSize, DeprecatedButtonSize, buttonVariants } from "./button.mjs";
2
- export { Button, type ButtonProps, type ButtonSize, type DeprecatedButtonSize, buttonVariants };
2
+ import { ButtonSplit, ButtonSplitMain, ButtonSplitMainProps, ButtonSplitMenu, ButtonSplitMenuProps, ButtonSplitProps, ButtonSplitSize, ButtonSplitVariant } from "./button-split.mjs";
3
+ export { Button, type ButtonProps, type ButtonSize, ButtonSplit, ButtonSplitMain, type ButtonSplitMainProps, ButtonSplitMenu, type ButtonSplitMenuProps, type ButtonSplitProps, type ButtonSplitSize, type ButtonSplitVariant, type DeprecatedButtonSize, buttonVariants };
@@ -51,6 +51,8 @@ function CommentMargin({ className, render, style, gap = 8, ...props }) {
51
51
  }, []);
52
52
  const place = useCallback((id, placement) => patch(id, placement), [patch]);
53
53
  const observe = useCallback((id, element) => {
54
+ patch(id, { height: heightOf(element) });
55
+ if (typeof ResizeObserver === "undefined") return () => {};
54
56
  observer.current ??= new ResizeObserver((records) => {
55
57
  for (const record of records) {
56
58
  const target = observed.current.get(record.target);
@@ -58,7 +60,6 @@ function CommentMargin({ className, render, style, gap = 8, ...props }) {
58
60
  }
59
61
  });
60
62
  observed.current.set(element, id);
61
- patch(id, { height: heightOf(element) });
62
63
  observer.current.observe(element);
63
64
  return () => {
64
65
  observer.current?.unobserve(element);
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
@@ -1,3 +1,5 @@
1
+ import { ButtonSplit, ButtonSplitMain, ButtonSplitMainProps, ButtonSplitMenu, ButtonSplitMenuProps, ButtonSplitProps, ButtonSplitSize, ButtonSplitVariant } from "./components/button/button-split.mjs";
2
+ import "./components/button/index.mjs";
1
3
  import { Dialog, DialogClose, DialogFooterNote, DialogFooterNoteProps, DialogSheetBack, DialogSheetBackProps, DialogTrigger } from "./components/dialog/dialog.mjs";
2
4
  import { DialogCommit, DialogCommitProps, DialogSheetContent, DialogSheetContentProps } from "./components/dialog/dialog-sheet.mjs";
3
5
  import "./components/dialog/index.mjs";
@@ -59,6 +61,8 @@ import "./components/meter/index.mjs";
59
61
  import { FilterChip, FilterChipLabel, FilterChipLabelProps, FilterChipProps, FilterChipRemove, FilterChipRemoveProps } from "./components/filter-chip/filter-chip.mjs";
60
62
  import "./components/filter-chip/index.mjs";
61
63
  import { OverlayLayerKind, OverlayLayerProvider, OverlayLayerProviderProps, useParentOverlayKind } from "./lib/overlay-depth.mjs";
64
+ import { AppLinkCard, AppLinkCardActions, AppLinkCardActionsProps, AppLinkCardBody, AppLinkCardBodyProps, AppLinkCardEyebrow, AppLinkCardEyebrowProps, AppLinkCardHeader, AppLinkCardHeaderProps, AppLinkCardHost, AppLinkCardHostProps, AppLinkCardIcon, AppLinkCardIconProps, AppLinkCardMeta, AppLinkCardMetaProps, AppLinkCardName, AppLinkCardNameProps, AppLinkCardPlaceholder, AppLinkCardPlaceholderProps, AppLinkCardTitle, AppLinkCardTitleProps } from "./components/app-link-card/app-link-card.mjs";
65
+ import "./components/app-link-card/index.mjs";
62
66
  import { PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD, PullToRefreshState } from "./components/pull-to-refresh/pull-to-refresh-gesture.mjs";
63
67
  import { PULL_TO_REFRESH_POINTER_QUERY, PullToRefresh, PullToRefreshPlatform, UsePullToRefreshOptions, usePullToRefresh } from "./components/pull-to-refresh/use-pull-to-refresh.mjs";
64
68
  import { PullToRefreshIndicator, PullToRefreshIndicatorProps } from "./components/pull-to-refresh/pull-to-refresh-indicator.mjs";
@@ -69,4 +73,4 @@ import { SaveStatus, SaveStatusError, SaveStatusErrorProps, SaveStatusProps, Sav
69
73
  import "./components/save-status/index.mjs";
70
74
  import { TaskCompletionControl, TaskCompletionControlProps } from "./components/task-completion-control/task-completion-control.mjs";
71
75
  import "./components/task-completion-control/index.mjs";
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 };
76
+ export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AppLinkCard, AppLinkCardActions, type AppLinkCardActionsProps, AppLinkCardBody, type AppLinkCardBodyProps, AppLinkCardEyebrow, type AppLinkCardEyebrowProps, AppLinkCardHeader, type AppLinkCardHeaderProps, AppLinkCardHost, type AppLinkCardHostProps, AppLinkCardIcon, type AppLinkCardIconProps, AppLinkCardMeta, type AppLinkCardMetaProps, AppLinkCardName, type AppLinkCardNameProps, AppLinkCardPlaceholder, type AppLinkCardPlaceholderProps, AppLinkCardTitle, type AppLinkCardTitleProps, AvatarGroupButton, type AvatarGroupButtonProps, ButtonSplit, ButtonSplitMain, type ButtonSplitMainProps, ButtonSplitMenu, type ButtonSplitMenuProps, type ButtonSplitProps, type ButtonSplitSize, type ButtonSplitVariant, 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
@@ -1,5 +1,6 @@
1
1
  import "./lib/drag-escape.mjs";
2
2
  import { OverlayLayerProvider, useParentOverlayKind } from "./lib/overlay-depth.mjs";
3
+ import { ButtonSplit, ButtonSplitMain, ButtonSplitMenu } from "./components/button/button-split.mjs";
3
4
  import { Dialog, DialogClose, DialogFooterNote, DialogSheetBack, DialogTrigger } from "./components/dialog/dialog.mjs";
4
5
  import { DialogCommit, DialogSheetContent } from "./components/dialog/dialog-sheet.mjs";
5
6
  import { useKeyboardPlatform } from "./lib/use-platform.mjs";
@@ -40,10 +41,11 @@ import { InboxItemSkeleton, InboxItemSkeletonList } from "./components/inbox-ite
40
41
  import { ListRowSkeleton } from "./components/list-row/list-row-skeleton.mjs";
41
42
  import { Meter, MeterHeader, MeterIndicator, MeterLabel, MeterTrack, MeterValue } from "./components/meter/meter.mjs";
42
43
  import { FilterChip, FilterChipLabel, FilterChipRemove } from "./components/filter-chip/filter-chip.mjs";
44
+ import { AppLinkCard, AppLinkCardActions, AppLinkCardBody, AppLinkCardEyebrow, AppLinkCardHeader, AppLinkCardHost, AppLinkCardIcon, AppLinkCardMeta, AppLinkCardName, AppLinkCardPlaceholder, AppLinkCardTitle } from "./components/app-link-card/app-link-card.mjs";
43
45
  import { PULL_TO_REFRESH_DAMPING, PULL_TO_REFRESH_HOLD_DISTANCE, PULL_TO_REFRESH_MAX_DISTANCE, PULL_TO_REFRESH_SNAP_BACK_MS, PULL_TO_REFRESH_THRESHOLD } from "./components/pull-to-refresh/pull-to-refresh-gesture.mjs";
44
46
  import { PULL_TO_REFRESH_POINTER_QUERY, usePullToRefresh } from "./components/pull-to-refresh/use-pull-to-refresh.mjs";
45
47
  import { PullToRefreshIndicator } from "./components/pull-to-refresh/pull-to-refresh-indicator.mjs";
46
48
  import { ChoiceList } from "./components/choice-list/choice-list.mjs";
47
49
  import { SaveStatus, SaveStatusError, SaveStatusSaved } from "./components/save-status/save-status.mjs";
48
50
  import { TaskCompletionControl } from "./components/task-completion-control/task-completion-control.mjs";
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 };
51
+ export { Dialog as AnnouncementDialog, AnnouncementDialogAction, AnnouncementDialogBody, DialogClose as AnnouncementDialogClose, AnnouncementDialogContent, AnnouncementDialogFooter, AnnouncementDialogHeader, AnnouncementDialogLabel, AnnouncementDialogPicture, AnnouncementDialogSecondaryAction, AnnouncementDialogText, AnnouncementDialogTitle, DialogTrigger as AnnouncementDialogTrigger, AppLinkCard, AppLinkCardActions, AppLinkCardBody, AppLinkCardEyebrow, AppLinkCardHeader, AppLinkCardHost, AppLinkCardIcon, AppLinkCardMeta, AppLinkCardName, AppLinkCardPlaceholder, AppLinkCardTitle, AvatarGroupButton, ButtonSplit, ButtonSplitMain, ButtonSplitMenu, 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.63.0",
3
+ "version": "0.64.0",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",