@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.
Files changed (97) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/cn.d.mts +2 -0
  3. package/dist/cn.mjs +21 -1
  4. package/dist/components/alert-dialog/alert-dialog.mjs +2 -2
  5. package/dist/components/app-link-card/app-link-card.mjs +19 -37
  6. package/dist/components/app-shell/app-shell.mjs +2 -2
  7. package/dist/components/avatar/avatar.mjs +1 -1
  8. package/dist/components/banner/banner.mjs +15 -2
  9. package/dist/components/button/button-split.mjs +2 -2
  10. package/dist/components/button/button.mjs +2 -2
  11. package/dist/components/choice-list/choice-list.recipe.mjs +1 -1
  12. package/dist/components/code-block/code-block.recipe.mjs +2 -2
  13. package/dist/components/combobox/combobox.mjs +1 -1
  14. package/dist/components/combobox-select/combobox-select.css +1 -1
  15. package/dist/components/comment/comment.recipe.mjs +2 -2
  16. package/dist/components/composer/composer-attachment.recipe.mjs +5 -5
  17. package/dist/components/composer/composer-drop-overlay.mjs +2 -2
  18. package/dist/components/composer/composer-drop-overlay.recipe.mjs +1 -1
  19. package/dist/components/composer/sortable-composer-attachments.mjs +1 -1
  20. package/dist/components/context-menu/context-menu.mjs +1 -1
  21. package/dist/components/conversation-panel/conversation-panel-empty-state.mjs +1 -1
  22. package/dist/components/dialog/dialog.mjs +4 -4
  23. package/dist/components/drag/drag-lift.d.mts +3 -2
  24. package/dist/components/drag/drag-lift.mjs +3 -2
  25. package/dist/components/drag/drag.recipe.mjs +1 -1
  26. package/dist/components/drawer/drawer.recipe.mjs +4 -4
  27. package/dist/components/dropdown-menu/dropdown-menu.mjs +1 -1
  28. package/dist/components/file-preview/file-preview.recipe.mjs +1 -1
  29. package/dist/components/fit-toolbar/fit-toolbar.d.mts +63 -8
  30. package/dist/components/fit-toolbar/fit-toolbar.mjs +310 -43
  31. package/dist/components/fit-toolbar/fit-toolbar.recipe.mjs +21 -7
  32. package/dist/components/fit-toolbar/index.d.mts +2 -2
  33. package/dist/components/inbox-item/inbox-item.recipe.mjs +7 -7
  34. package/dist/components/lightbox/index.d.mts +2 -2
  35. package/dist/components/lightbox/lightbox.d.mts +70 -4
  36. package/dist/components/lightbox/lightbox.mjs +285 -91
  37. package/dist/components/list-row/list-row.d.mts +14 -1
  38. package/dist/components/list-row/list-row.mjs +4 -2
  39. package/dist/components/list-row/list-row.recipe.d.mts +12 -0
  40. package/dist/components/list-row/list-row.recipe.mjs +19 -7
  41. package/dist/components/message-action-card/message-action-card-content.recipe.mjs +3 -3
  42. package/dist/components/message-action-card/message-action-card.mjs +7 -3
  43. package/dist/components/message-action-card/message-action-card.recipe.mjs +2 -6
  44. package/dist/components/message-attachment/message-image-gallery.recipe.mjs +1 -1
  45. package/dist/components/message-embed/index.d.mts +2 -1
  46. package/dist/components/message-embed/message-embed.d.mts +8 -1
  47. package/dist/components/message-embed/message-embed.mjs +2 -2
  48. package/dist/components/message-embed/message-embed.recipe.d.mts +160 -0
  49. package/dist/components/message-embed/message-embed.recipe.mjs +49 -10
  50. package/dist/components/message-forwarded-bundle/message-forwarded-bundle.mjs +1 -0
  51. package/dist/components/message-forwarded-bundle/message-forwarded-bundle.recipe.mjs +1 -1
  52. package/dist/components/message-item/message-item.recipe.mjs +2 -2
  53. package/dist/components/message-list/message-list.recipe.mjs +2 -2
  54. package/dist/components/message-quoted-preview/message-quoted-preview.mjs +2 -0
  55. package/dist/components/message-replies/message-replies.mjs +1 -1
  56. package/dist/components/message-replies/message-replies.recipe.mjs +1 -1
  57. package/dist/components/mobile-nav/mobile-nav.mjs +2 -2
  58. package/dist/components/notification-center/notification-center.mjs +1 -1
  59. package/dist/components/panel/panel-header.recipe.mjs +1 -1
  60. package/dist/components/panel/panel-split-action.recipe.mjs +2 -2
  61. package/dist/components/popover/popover.d.mts +11 -2
  62. package/dist/components/popover/popover.mjs +51 -38
  63. package/dist/components/preview-card/preview-card.d.mts +5 -1
  64. package/dist/components/preview-card/preview-card.mjs +25 -28
  65. package/dist/components/pull-to-refresh/pull-to-refresh-indicator.mjs +1 -1
  66. package/dist/components/resizable/resizable.recipe.mjs +1 -1
  67. package/dist/components/save-status/save-status.d.mts +16 -9
  68. package/dist/components/save-status/save-status.mjs +19 -30
  69. package/dist/components/scroll-area/scroll-area.css +1 -0
  70. package/dist/components/segmented-control/segmented-control.mjs +45 -8
  71. package/dist/components/select/select.mjs +2 -2
  72. package/dist/components/selection-toolbar/selection-toolbar.recipe.mjs +1 -1
  73. package/dist/components/sidebar/sidebar.recipe.mjs +1 -1
  74. package/dist/components/tabs/tabs.mjs +4 -4
  75. package/dist/components/task-board/task-board.d.mts +5 -0
  76. package/dist/components/task-board/task-board.mjs +8 -1
  77. package/dist/components/task-dnd/task-dnd.d.mts +10 -1
  78. package/dist/components/task-dnd/task-dnd.mjs +2 -1
  79. package/dist/components/task-dnd/task-dnd.recipe.mjs +2 -2
  80. package/dist/components/thread-panel/thread-panel.recipe.mjs +1 -1
  81. package/dist/components/toast/toast.mjs +5 -5
  82. package/dist/components/tooltip/tooltip.mjs +2 -2
  83. package/dist/index.d.mts +2 -1
  84. package/dist/index.mjs +2 -1
  85. package/dist/lib/laid-out-children.mjs +32 -0
  86. package/dist/lib/list-cell.mjs +1 -1
  87. package/dist/lib/stacked-actions.mjs +7 -4
  88. package/dist/lint/no-raw-z-index.mjs +142 -0
  89. package/dist/lint/prefer-scroll-area.mjs +1 -1
  90. package/dist/lint/recommended.json +2 -1
  91. package/dist/lint.d.mts +8 -2
  92. package/dist/lint.mjs +16 -3
  93. package/dist/styles.css +28 -0
  94. package/dist/wip.d.mts +4 -2
  95. package/dist/wip.mjs +3 -2
  96. package/package.json +1 -1
  97. 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-50 outline-none"],
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-10",
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-50 bg-layer-backdrop"],
25
+ overlay: ["fixed inset-0 z-dialog bg-layer-backdrop"],
26
26
  content: [
27
- "fixed top-1/2 left-1/2 z-50 flex w-[calc(100%-2rem)] -translate-1/2 flex-col",
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-60"],
87
- content: ["z-60"]
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
- * Above every raft-ui layer (popovers 50, a stacked dialog 60, toasts and the
53
- * lightbox 70) and an app's own top layers, among the layers rendered in
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
- * Above every raft-ui layer (popovers 50, a stacked dialog 60, toasts and the
113
- * lightbox 70) and an app's own top layers, among the layers rendered in
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-70 max-w-80",
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-50 min-h-dvh select-none",
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-50 select-none"],
73
+ viewport: ["pointer-events-none fixed inset-0 z-dialog select-none"],
74
74
  popup: [
75
- "group/drawer-popup pointer-events-auto fixed z-50 flex h-(--drawer-content-height) flex-col outline-none",
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-10 shrink-0 cursor-grab select-none active:cursor-grabbing",
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-50 outline-none"],
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-10" },
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 { ReactNode, Ref } from "react";
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: ReactNode;
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, and hidden from `moreOrder` 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 FitToolbarButton({ icon, children, labelOrder, moreOrder, moreItem, variant, className, ...props }: FitToolbarButtonProps): import("react").JSX.Element;
164
+ export declare function FitToolbarPicker({ trigger, icon, children, value, labelOrder, moreOrder, moreItem, className, ...props }: FitToolbarPickerProps): import("react").JSX.Element;
110
165
  //#endregion