@botiverse/raft-ui 0.83.0 → 0.85.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 +125 -0
- package/dist/cn.d.mts +2 -0
- package/dist/cn.mjs +21 -1
- package/dist/components/alert-dialog/alert-dialog.mjs +2 -2
- package/dist/components/app-link-card/app-link-card.mjs +19 -37
- package/dist/components/app-shell/app-shell.mjs +2 -2
- package/dist/components/avatar/avatar.mjs +1 -1
- package/dist/components/banner/banner.mjs +15 -2
- package/dist/components/button/button-split.mjs +2 -2
- package/dist/components/button/button.mjs +2 -2
- package/dist/components/choice-list/choice-list.recipe.mjs +1 -1
- package/dist/components/code-block/code-block.recipe.mjs +2 -2
- package/dist/components/combobox/combobox.mjs +1 -1
- package/dist/components/combobox-select/combobox-select.css +1 -1
- package/dist/components/comment/comment.recipe.mjs +2 -2
- package/dist/components/composer/composer-attachment.recipe.mjs +5 -5
- package/dist/components/composer/composer-drop-overlay.mjs +2 -2
- package/dist/components/composer/composer-drop-overlay.recipe.mjs +1 -1
- package/dist/components/composer/sortable-composer-attachments.mjs +1 -1
- package/dist/components/context-menu/context-menu.mjs +1 -1
- package/dist/components/conversation-panel/conversation-panel-empty-state.mjs +1 -1
- package/dist/components/dialog/dialog.mjs +4 -4
- package/dist/components/drag/drag-lift.d.mts +3 -2
- package/dist/components/drag/drag-lift.mjs +3 -2
- package/dist/components/drag/drag.recipe.mjs +1 -1
- package/dist/components/drawer/drawer.recipe.mjs +4 -4
- package/dist/components/dropdown-menu/dropdown-menu.mjs +1 -1
- package/dist/components/file-preview/file-preview.recipe.mjs +1 -1
- package/dist/components/fit-toolbar/fit-toolbar.d.mts +63 -8
- package/dist/components/fit-toolbar/fit-toolbar.mjs +310 -43
- package/dist/components/fit-toolbar/fit-toolbar.recipe.mjs +21 -7
- package/dist/components/fit-toolbar/index.d.mts +2 -2
- package/dist/components/inbox-item/inbox-item.recipe.mjs +7 -7
- package/dist/components/lightbox/index.d.mts +2 -2
- package/dist/components/lightbox/lightbox.d.mts +70 -4
- package/dist/components/lightbox/lightbox.mjs +285 -91
- package/dist/components/list-row/list-row.d.mts +14 -1
- package/dist/components/list-row/list-row.mjs +4 -2
- package/dist/components/list-row/list-row.recipe.d.mts +12 -0
- package/dist/components/list-row/list-row.recipe.mjs +19 -7
- package/dist/components/message-action-card/message-action-card-content.recipe.mjs +3 -3
- package/dist/components/message-action-card/message-action-card.mjs +7 -3
- package/dist/components/message-action-card/message-action-card.recipe.mjs +2 -6
- package/dist/components/message-attachment/message-image-gallery.recipe.mjs +1 -1
- package/dist/components/message-embed/index.d.mts +2 -1
- package/dist/components/message-embed/message-embed.d.mts +8 -1
- package/dist/components/message-embed/message-embed.mjs +2 -2
- package/dist/components/message-embed/message-embed.recipe.d.mts +160 -0
- package/dist/components/message-embed/message-embed.recipe.mjs +49 -10
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.mjs +1 -0
- package/dist/components/message-forwarded-bundle/message-forwarded-bundle.recipe.mjs +1 -1
- package/dist/components/message-item/message-item.recipe.mjs +2 -2
- package/dist/components/message-list/message-list.recipe.mjs +2 -2
- package/dist/components/message-quoted-preview/message-quoted-preview.mjs +2 -0
- package/dist/components/message-replies/message-replies.mjs +1 -1
- package/dist/components/message-replies/message-replies.recipe.mjs +1 -1
- package/dist/components/mobile-nav/mobile-nav.mjs +2 -2
- package/dist/components/notification-center/notification-center.mjs +1 -1
- package/dist/components/panel/panel-header.recipe.mjs +1 -1
- package/dist/components/panel/panel-split-action.recipe.mjs +2 -2
- package/dist/components/popover/popover.d.mts +11 -2
- package/dist/components/popover/popover.mjs +51 -38
- package/dist/components/preview-card/preview-card.d.mts +5 -1
- package/dist/components/preview-card/preview-card.mjs +25 -28
- package/dist/components/pull-to-refresh/pull-to-refresh-indicator.mjs +1 -1
- package/dist/components/resizable/resizable.recipe.mjs +1 -1
- package/dist/components/save-status/save-status.d.mts +16 -9
- package/dist/components/save-status/save-status.mjs +19 -30
- package/dist/components/scroll-area/scroll-area.css +1 -0
- package/dist/components/segmented-control/segmented-control.mjs +45 -8
- package/dist/components/select/select.mjs +2 -2
- package/dist/components/selection-toolbar/selection-toolbar.recipe.mjs +1 -1
- package/dist/components/sidebar/sidebar.recipe.mjs +1 -1
- package/dist/components/tabs/tabs.mjs +4 -4
- package/dist/components/task-board/task-board.d.mts +5 -0
- package/dist/components/task-board/task-board.mjs +8 -1
- package/dist/components/task-dnd/task-dnd.d.mts +10 -1
- package/dist/components/task-dnd/task-dnd.mjs +2 -1
- package/dist/components/task-dnd/task-dnd.recipe.mjs +2 -2
- package/dist/components/thread-panel/thread-panel.recipe.mjs +1 -1
- package/dist/components/toast/toast.mjs +5 -5
- package/dist/components/tooltip/tooltip.mjs +2 -2
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -1
- package/dist/lib/laid-out-children.mjs +32 -0
- package/dist/lib/list-cell.mjs +1 -1
- package/dist/lib/stacked-actions.mjs +7 -4
- package/dist/lint/no-raw-z-index.mjs +142 -0
- package/dist/lint/prefer-scroll-area.mjs +1 -1
- package/dist/lint/recommended.json +2 -1
- package/dist/lint.d.mts +8 -2
- package/dist/lint.mjs +16 -3
- package/dist/styles.css +28 -0
- package/dist/wip.d.mts +4 -2
- package/dist/wip.mjs +3 -2
- package/package.json +1 -1
- package/skills/raft-ui-guide/SKILL.md +1 -0
|
@@ -7,7 +7,7 @@ import { ContextMenu } from "@base-ui/react";
|
|
|
7
7
|
//#region src/components/context-menu/context-menu.tsx
|
|
8
8
|
const contextMenu = tv({ slots: {
|
|
9
9
|
trigger: ["select-none"],
|
|
10
|
-
positioner: ["isolate z-
|
|
10
|
+
positioner: ["isolate z-popup outline-none"],
|
|
11
11
|
content: [
|
|
12
12
|
"flex flex-col max-h-(--available-height) overflow-hidden",
|
|
13
13
|
"outline-none",
|
|
@@ -12,7 +12,7 @@ const conversationPanelEmptyState = tv({ slots: {
|
|
|
12
12
|
brand: ["shrink-0", "mb-1 inline-flex rounded-none p-0 text-foreground-hint"],
|
|
13
13
|
brandMark: [
|
|
14
14
|
"relative flex items-center justify-center",
|
|
15
|
-
"[&>svg]:relative [&>svg]:z-
|
|
15
|
+
"[&>svg]:relative [&>svg]:z-raised",
|
|
16
16
|
"size-9 overflow-visible rounded-none",
|
|
17
17
|
"[&>svg]:size-9 [&>svg]:stroke-2"
|
|
18
18
|
]
|
|
@@ -22,9 +22,9 @@ import { createPortal } from "react-dom";
|
|
|
22
22
|
//#region src/components/dialog/dialog.tsx
|
|
23
23
|
const dialog = tv({
|
|
24
24
|
slots: {
|
|
25
|
-
overlay: ["fixed inset-0 z-
|
|
25
|
+
overlay: ["fixed inset-0 z-dialog bg-layer-backdrop"],
|
|
26
26
|
content: [
|
|
27
|
-
"fixed top-1/2 left-1/2 z-
|
|
27
|
+
"fixed top-1/2 left-1/2 z-dialog flex w-[calc(100%-2rem)] -translate-1/2 flex-col",
|
|
28
28
|
"max-h-[calc(100dvh-2rem)] outline-none",
|
|
29
29
|
"overflow-clip rounded-dialog bg-layer-popover text-foreground",
|
|
30
30
|
"shadow-float ring-1 ring-line-seam"
|
|
@@ -83,8 +83,8 @@ const dialog = tv({
|
|
|
83
83
|
content: []
|
|
84
84
|
},
|
|
85
85
|
1: {
|
|
86
|
-
overlay: ["z-
|
|
87
|
-
content: ["z-
|
|
86
|
+
overlay: ["z-dialog-layer"],
|
|
87
|
+
content: ["z-dialog-layer"]
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
90
|
nested: {
|
|
@@ -49,8 +49,9 @@ export declare function keepGrabInside(proxyWidth: number, inset?: number): Modi
|
|
|
49
49
|
*/
|
|
50
50
|
export declare function cancelDrag(win?: Window): void;
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
52
|
+
* `--z-index-drag` (`z-drag`) as a number: above every raft-ui layer (popups
|
|
53
|
+
* and dialogs 50, a `layer={1}` dialog 60, the lightbox 70, toasts 80) and an
|
|
54
|
+
* app's own top layers, among the layers rendered in
|
|
54
55
|
* `document.body`, where the copy goes by default. dnd-kit's own default.
|
|
55
56
|
*/
|
|
56
57
|
export declare const DRAG_LIFT_Z_INDEX = 999;
|
|
@@ -109,8 +109,9 @@ function cancelDrag(win = window) {
|
|
|
109
109
|
win.dispatchEvent(new Event("resize"));
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
112
|
+
* `--z-index-drag` (`z-drag`) as a number: above every raft-ui layer (popups
|
|
113
|
+
* and dialogs 50, a `layer={1}` dialog 60, the lightbox 70, toasts 80) and an
|
|
114
|
+
* app's own top layers, among the layers rendered in
|
|
114
115
|
* `document.body`, where the copy goes by default. dnd-kit's own default.
|
|
115
116
|
*/
|
|
116
117
|
const DRAG_LIFT_Z_INDEX = 999;
|
|
@@ -18,7 +18,7 @@ const drag = tv({
|
|
|
18
18
|
"border-[1.5px] border-dashed border-line-strong bg-fill-subtle"
|
|
19
19
|
],
|
|
20
20
|
hint: [
|
|
21
|
-
"pointer-events-none fixed top-0 left-0 z-
|
|
21
|
+
"pointer-events-none fixed top-0 left-0 z-drag max-w-80",
|
|
22
22
|
"rounded-chip px-2 py-1",
|
|
23
23
|
"font-sans text-caption",
|
|
24
24
|
"bg-layer-hud text-foreground-on-hud shadow-float ring-1 ring-line-seam"
|
|
@@ -66,13 +66,13 @@ const drawer = tv({
|
|
|
66
66
|
extend: drawerMotion,
|
|
67
67
|
slots: {
|
|
68
68
|
overlay: [
|
|
69
|
-
"fixed inset-0 z-
|
|
69
|
+
"fixed inset-0 z-dialog min-h-dvh select-none",
|
|
70
70
|
"supports-[-webkit-touch-callout:none]:absolute",
|
|
71
71
|
"bg-layer-backdrop"
|
|
72
72
|
],
|
|
73
|
-
viewport: ["pointer-events-none fixed inset-0 z-
|
|
73
|
+
viewport: ["pointer-events-none fixed inset-0 z-dialog select-none"],
|
|
74
74
|
popup: [
|
|
75
|
-
"group/drawer-popup pointer-events-auto fixed z-
|
|
75
|
+
"group/drawer-popup pointer-events-auto fixed z-dialog flex h-(--drawer-content-height) flex-col outline-none",
|
|
76
76
|
"[--drawer-inset:12px] [--drawer-content-height:var(--drawer-height,auto)]",
|
|
77
77
|
"data-nested-drawer-open:overflow-hidden",
|
|
78
78
|
"bg-layer-popover text-foreground",
|
|
@@ -80,7 +80,7 @@ const drawer = tv({
|
|
|
80
80
|
],
|
|
81
81
|
content: ["flex min-h-0 flex-1 flex-col rounded-[inherit] select-text", "group-data-swiping/drawer-popup:select-none"],
|
|
82
82
|
swipeHandle: [
|
|
83
|
-
"relative z-
|
|
83
|
+
"relative z-control shrink-0 cursor-grab select-none active:cursor-grabbing",
|
|
84
84
|
"before:absolute before:content-['']",
|
|
85
85
|
"before:rounded-full before:bg-line-seam"
|
|
86
86
|
],
|
|
@@ -9,7 +9,7 @@ import { Menu } from "@base-ui/react/menu";
|
|
|
9
9
|
//#region src/components/dropdown-menu/dropdown-menu.tsx
|
|
10
10
|
const dropdownMenu = tv({ slots: {
|
|
11
11
|
trigger: ["select-none"],
|
|
12
|
-
positioner: ["isolate z-
|
|
12
|
+
positioner: ["isolate z-popup outline-none"],
|
|
13
13
|
content: [
|
|
14
14
|
"max-h-(--available-height) overflow-hidden",
|
|
15
15
|
"outline-none",
|
|
@@ -30,7 +30,7 @@ const filePreview = tv({
|
|
|
30
30
|
media: ["relative h-10 w-8 overflow-hidden rounded-md ring-1", "bg-fill-muted shadow-none ring-line-hairline"]
|
|
31
31
|
},
|
|
32
32
|
variants: { placement: {
|
|
33
|
-
corner: { badge: "absolute -right-1.5 bottom-0.5 z-
|
|
33
|
+
corner: { badge: "absolute -right-1.5 bottom-0.5 z-raised" },
|
|
34
34
|
inline: { badge: "inline-flex h-3.5 w-7 shrink-0 items-center justify-center px-0 py-0" }
|
|
35
35
|
} },
|
|
36
36
|
defaultVariants: { placement: "corner" }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { StyledProps } from "../../lib/styled-props.mjs";
|
|
2
2
|
import { ButtonProps } from "../button/button.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { PickerTriggerButtonProps } from "../picker-trigger-button/picker-trigger-button.mjs";
|
|
4
|
+
import { ReactElement, ReactNode, Ref } from "react";
|
|
4
5
|
import { Toolbar } from "@base-ui/react/toolbar";
|
|
5
6
|
//#region src/components/fit-toolbar/fit-toolbar.d.ts
|
|
6
7
|
/**
|
|
@@ -8,10 +9,15 @@ import { Toolbar } from "@base-ui/react/toolbar";
|
|
|
8
9
|
* - `label`: its label hides and its icon stays (the label stays its accessible name);
|
|
9
10
|
* - `more`: it moves into More;
|
|
10
11
|
* - `collapse`: a group shows its one button instead of its items (a Filter button for its filters);
|
|
11
|
-
* - `wrap`: a group moves to a line of its own, only in a toolbar that allows it
|
|
12
|
+
* - `wrap`: a group moves to a line of its own, only in a toolbar that allows it;
|
|
13
|
+
* - `plus`: a primary action shows as + alone (the label stays its accessible name).
|
|
14
|
+
*/
|
|
15
|
+
export type FitStep = "label" | "more" | "collapse" | "wrap" | "plus";
|
|
16
|
+
/**
|
|
17
|
+
* When each of an item's steps comes, one order for the whole toolbar: lower
|
|
18
|
+
* gives way first; at the same number, the last item first, and one item's
|
|
19
|
+
* steps in the order of `FitStep`.
|
|
12
20
|
*/
|
|
13
|
-
export type FitStep = "label" | "more" | "collapse" | "wrap";
|
|
14
|
-
/** When each of an item's steps comes: lower gives way first; at the same number, the last item first. */
|
|
15
21
|
export type FitSteps = Partial<Record<FitStep, number>>;
|
|
16
22
|
export type FitToolbarProps = StyledProps<Toolbar.Root.Props> & {
|
|
17
23
|
ref?: Ref<HTMLDivElement>;
|
|
@@ -90,12 +96,23 @@ export declare function FitToolbarGroup({ className, wrapOrder, firstLine, wrapL
|
|
|
90
96
|
ref?: Ref<HTMLDivElement>;
|
|
91
97
|
}): import("react").JSX.Element;
|
|
92
98
|
export type FitToolbarButtonProps = Omit<ButtonProps, "children" | "size"> & {
|
|
93
|
-
/** Its icon, which stays when its label gives way. */
|
|
94
|
-
icon
|
|
99
|
+
/** Its icon, which stays when its label gives way. A button with a `label` step needs one (or a `collapsedIcon`). */
|
|
100
|
+
icon?: ReactNode;
|
|
101
|
+
/**
|
|
102
|
+
* An icon shown only once its label has given way (the `label` step), in
|
|
103
|
+
* place of `icon`: a button that reads as text while it has room ("Clear
|
|
104
|
+
* filters") and as an icon (×) once it hasn't.
|
|
105
|
+
*/
|
|
106
|
+
collapsedIcon?: ReactNode;
|
|
95
107
|
/** Its label: its accessible name and, once it has given way, its tooltip. */
|
|
96
108
|
children: ReactNode;
|
|
97
109
|
/** When its label gives way (the `label` step). */
|
|
98
110
|
labelOrder?: number;
|
|
111
|
+
/**
|
|
112
|
+
* When it shows as + alone, its icon and label gone (the `plus` step): for
|
|
113
|
+
* the primary action, after the groups have wrapped.
|
|
114
|
+
*/
|
|
115
|
+
plusOrder?: number;
|
|
99
116
|
/** When it moves into More (the `more` step). */
|
|
100
117
|
moreOrder?: number;
|
|
101
118
|
/** What it is in More's menu. */
|
|
@@ -104,7 +121,45 @@ export type FitToolbarButtonProps = Omit<ButtonProps, "children" | "size"> & {
|
|
|
104
121
|
/**
|
|
105
122
|
* A toolbar button that can give way: an `md` Button (ghost unless you say)
|
|
106
123
|
* with an icon and a label, an icon square with its label as a tooltip from
|
|
107
|
-
* `labelOrder` on,
|
|
124
|
+
* `labelOrder` on, a + square with its label as a tooltip from `plusOrder`
|
|
125
|
+
* on, and hidden from `moreOrder` on.
|
|
126
|
+
*/
|
|
127
|
+
export declare function FitToolbarButton({ icon, collapsedIcon, children, labelOrder, plusOrder, moreOrder, moreItem, variant, className, ...props }: FitToolbarButtonProps): import("react").JSX.Element;
|
|
128
|
+
export type FitToolbarPickerProps = Omit<PickerTriggerButtonProps, "children" | "render"> & {
|
|
129
|
+
/**
|
|
130
|
+
* The picker's trigger, which opens its popup: `<PopoverTrigger />`,
|
|
131
|
+
* `<DropdownMenuTrigger />` or a Base UI `Menu.Trigger`. The picker renders
|
|
132
|
+
* it as a toolbar button, so the page nests nothing itself.
|
|
133
|
+
*/
|
|
134
|
+
trigger: ReactElement<{
|
|
135
|
+
render?: unknown;
|
|
136
|
+
}>;
|
|
137
|
+
/** Its icon, which stays when its label gives way. */
|
|
138
|
+
icon: ReactNode;
|
|
139
|
+
/** Its label ("Assignee"): part of its accessible name and, once it has given way, its tooltip. */
|
|
140
|
+
children: ReactNode;
|
|
141
|
+
/**
|
|
142
|
+
* What is chosen: the value ("In progress", "Kirby") or a count (`1`). It
|
|
143
|
+
* stays in view when the label gives way, and follows the label in the
|
|
144
|
+
* accessible name. A count (a number, or a string of digits) is set in Space
|
|
145
|
+
* Mono, as machine-written text; any other value keeps the label's font.
|
|
146
|
+
*/
|
|
147
|
+
value?: ReactNode;
|
|
148
|
+
/** When its label gives way (the `label` step). */
|
|
149
|
+
labelOrder?: number;
|
|
150
|
+
/** When it moves into More (the `more` step). */
|
|
151
|
+
moreOrder?: number;
|
|
152
|
+
/** What it is in More's menu. */
|
|
153
|
+
moreItem?: ReactNode;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* A picker's trigger as one toolbar item (a filter: Assignee, Channel): a
|
|
157
|
+
* PickerTriggerButton with an icon, a label, what is chosen and a chevron,
|
|
158
|
+
* filled `info-soft` once a value is chosen, as an applied filter is
|
|
159
|
+
* (Select › Filters). From `labelOrder` on its label gives way, while its
|
|
160
|
+
* icon, what is chosen and the chevron stay ("# ⌄", "👤 1 ⌄"); its label
|
|
161
|
+
* stays its accessible name, read before the value ("Assignee 1"), and shows
|
|
162
|
+
* as its tooltip.
|
|
108
163
|
*/
|
|
109
|
-
export declare function
|
|
164
|
+
export declare function FitToolbarPicker({ trigger, icon, children, value, labelOrder, moreOrder, moreItem, className, ...props }: FitToolbarPickerProps): import("react").JSX.Element;
|
|
110
165
|
//#endregion
|