@ciridae/ui 1.0.5 → 1.0.9
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/README.md +3 -2
- package/dist/chat/conversation-source.d.ts +1 -3
- package/dist/chat/message-text.js +6 -6
- package/dist/chat/use-chat-conversation.d.ts +7 -2
- package/dist/chat/use-chat-conversation.js +2 -1
- package/dist/components/activity-feed.d.ts +0 -1
- package/dist/components/activity-feed.js +6 -7
- package/dist/components/agent-work.d.ts +5 -1
- package/dist/components/agent-work.js +27 -13
- package/dist/components/app-frame.d.ts +3 -17
- package/dist/components/app-frame.js +11 -30
- package/dist/components/app-navigation.d.ts +5 -6
- package/dist/components/app-navigation.js +65 -40
- package/dist/components/badge.d.ts +0 -4
- package/dist/components/badge.js +17 -27
- package/dist/components/bulk-action-bar.js +2 -2
- package/dist/components/button.js +41 -50
- package/dist/components/calendar.js +5 -8
- package/dist/components/centered-page.js +4 -4
- package/dist/components/chart.js +3 -4
- package/dist/components/chat-client-source.js +55 -34
- package/dist/components/chat-page.js +1 -1
- package/dist/components/chat-sheet.d.ts +30 -20
- package/dist/components/chat-sheet.js +109 -51
- package/dist/components/chat.d.ts +27 -56
- package/dist/components/chat.js +151 -129
- package/dist/components/checkbox-item.js +4 -4
- package/dist/components/checkbox-list.js +6 -6
- package/dist/components/chip.js +2 -2
- package/dist/components/collapsible.js +3 -3
- package/dist/components/color-theme.d.ts +3 -6
- package/dist/components/color-theme.js +10 -11
- package/dist/components/column-settings.js +3 -3
- package/dist/components/command-menu.d.ts +1 -2
- package/dist/components/command-menu.js +56 -77
- package/dist/components/command-palette.js +5 -2
- package/dist/components/copyable-id.js +5 -5
- package/dist/components/data-display.d.ts +1 -7
- package/dist/components/data-display.js +32 -55
- package/dist/components/data-grid.d.ts +4 -7
- package/dist/components/data-grid.js +106 -90
- package/dist/components/date-range-picker.js +4 -5
- package/dist/components/document-viewer.js +23 -23
- package/dist/components/drawer.d.ts +2 -1
- package/dist/components/drawer.js +45 -20
- package/dist/components/dropzone.js +13 -13
- package/dist/components/editable-field.d.ts +2 -12
- package/dist/components/editable-field.js +13 -26
- package/dist/components/email-input.js +2 -3
- package/dist/components/environment-frame.js +7 -7
- package/dist/components/expandable-text.js +2 -2
- package/dist/components/feedback-screenshot.js +7 -7
- package/dist/components/feedback-sheet.js +8 -8
- package/dist/components/filter-bar.js +41 -27
- package/dist/components/form-controls.d.ts +3 -6
- package/dist/components/form-controls.js +15 -22
- package/dist/components/form-layout.d.ts +6 -6
- package/dist/components/form-layout.js +10 -16
- package/dist/components/glass-menu.d.ts +2 -0
- package/dist/components/glass-menu.js +14 -18
- package/dist/components/gradient-edge.d.ts +0 -1
- package/dist/components/gradient-edge.js +8 -9
- package/dist/components/icon.js +1 -1
- package/dist/components/input.js +18 -17
- package/dist/components/keycap.d.ts +2 -6
- package/dist/components/keycap.js +4 -12
- package/dist/components/layout.js +11 -10
- package/dist/components/lightbox.js +8 -8
- package/dist/components/link.js +1 -1
- package/dist/components/locale.d.ts +23 -7
- package/dist/components/locale.js +19 -7
- package/dist/components/log-entry.d.ts +2 -14
- package/dist/components/log-entry.js +11 -22
- package/dist/components/log-list.js +1 -1
- package/dist/components/mention-input.js +13 -14
- package/dist/components/menu.d.ts +7 -4
- package/dist/components/menu.js +23 -10
- package/dist/components/meter.d.ts +2 -3
- package/dist/components/meter.js +12 -16
- package/dist/components/navigation.d.ts +0 -7
- package/dist/components/navigation.js +3 -12
- package/dist/components/notification-tray.js +7 -7
- package/dist/components/overlays.d.ts +5 -2
- package/dist/components/overlays.js +24 -24
- package/dist/components/panel.js +3 -3
- package/dist/components/progress.js +2 -2
- package/dist/components/radio-card.d.ts +1 -1
- package/dist/components/radio-card.js +9 -9
- package/dist/components/record.d.ts +2 -4
- package/dist/components/record.js +19 -32
- package/dist/components/scroll-area.js +10 -10
- package/dist/components/segmented-bar.js +9 -9
- package/dist/components/select.d.ts +3 -5
- package/dist/components/select.js +26 -44
- package/dist/components/settings.js +1 -1
- package/dist/components/shell-skeleton.js +1 -1
- package/dist/components/shell.d.ts +1 -1
- package/dist/components/shell.js +69 -24
- package/dist/components/side-panel.js +3 -3
- package/dist/components/sidebar.d.ts +0 -5
- package/dist/components/sidebar.js +25 -33
- package/dist/components/single-line-text.js +3 -4
- package/dist/components/site-banner.js +4 -4
- package/dist/components/skeleton.js +19 -22
- package/dist/components/skeletons.d.ts +0 -3
- package/dist/components/skeletons.js +5 -10
- package/dist/components/stages.d.ts +6 -3
- package/dist/components/stages.js +77 -105
- package/dist/components/stat-card.d.ts +2 -5
- package/dist/components/stat-card.js +23 -31
- package/dist/components/status-banner.js +6 -6
- package/dist/components/status.js +3 -3
- package/dist/components/steps.js +2 -2
- package/dist/components/switch.js +1 -1
- package/dist/components/tabs.js +15 -18
- package/dist/components/theme-customizer.d.ts +5 -8
- package/dist/components/theme-customizer.js +9 -41
- package/dist/components/theme-toggle.d.ts +0 -1
- package/dist/components/theme-toggle.js +6 -11
- package/dist/components/toast.d.ts +1 -7
- package/dist/components/toast.js +19 -22
- package/dist/components/user-chip.js +8 -8
- package/dist/components/wizard.js +6 -4
- package/dist/preset.d.ts +1 -2
- package/dist/preset.js +39 -89
- package/dist/styled-system/css/conditions.mjs +1 -1
- package/dist/styled-system/css/css.mjs +1 -1
- package/dist/styled-system/styles.css +805 -1279
- package/dist/styled-system/tokens/index.mjs +74 -1926
- package/dist/styled-system/tokens/tokens.d.ts +18 -33
- package/dist/styled-system/types/conditions.d.ts +0 -74
- package/dist/styled-system/types/prop-type.d.ts +15 -40
- package/dist/styled-system/types/style-props.d.ts +705 -705
- package/dist/theme/color.d.ts +0 -1
- package/dist/theme/color.js +0 -16
- package/dist/theme/derive.d.ts +3 -3
- package/dist/theme/derive.js +9 -32
- package/dist/theme/index.d.ts +1 -2
- package/dist/theme/index.js +3 -5
- package/dist/theme/options.d.ts +2 -4
- package/dist/theme/options.js +0 -1
- package/dist/theme/{palettes.d.ts → palette.d.ts} +12 -23
- package/dist/theme/palette.js +127 -0
- package/dist/theme/tokens.d.ts +8 -13
- package/dist/theme/tokens.js +38 -92
- package/package.json +1 -1
- package/dist/theme/palettes.js +0 -254
package/dist/components/icon.js
CHANGED
|
@@ -29,7 +29,7 @@ export const icon = cva({
|
|
|
29
29
|
* For an icon that points along the line, such as a caret or an arrow: mirrored under `dir=rtl`, so
|
|
30
30
|
* "next" points the way the text reads. It sets `scale`, so a `transform` or `rotate` still applies.
|
|
31
31
|
*/
|
|
32
|
-
export const directional = css({ _rtl: { scale: "-1 1" } });
|
|
32
|
+
export const directional = css({ _rtl: { scale: "[-1 1]" } });
|
|
33
33
|
/** Continuous rotation for in-progress icons such as `SpinnerGapIcon`. */
|
|
34
34
|
export const spinning = css({
|
|
35
35
|
animation: "spin 1s linear infinite",
|
package/dist/components/input.js
CHANGED
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Input as BaseInput } from "@base-ui/react/input";
|
|
3
3
|
import { MagnifyingGlassIcon, XIcon } from "@phosphor-icons/react";
|
|
4
4
|
import { useDebouncer } from "@tanstack/react-pacer";
|
|
5
|
-
import { useEffect, useState } from "react";
|
|
5
|
+
import { useEffect, useRef, useState } from "react";
|
|
6
6
|
import { css, cva, cx } from "#primitives/css";
|
|
7
7
|
import { useFieldControl } from "./field-context.js";
|
|
8
8
|
import { icon } from "./icon.js";
|
|
@@ -31,22 +31,19 @@ const fieldFace = {
|
|
|
31
31
|
},
|
|
32
32
|
};
|
|
33
33
|
const field = cva({
|
|
34
|
-
base: { ...fieldFace, width: "
|
|
34
|
+
base: { ...fieldFace, width: "full", lineHeight: "tight" },
|
|
35
35
|
variants: {
|
|
36
36
|
size: {
|
|
37
|
-
/** The editor an inline-edit row opens in place of its value. */
|
|
38
37
|
inline: {
|
|
39
38
|
height: "field.inline",
|
|
40
39
|
paddingInline: "menu.itemInline",
|
|
41
40
|
fontSize: "body",
|
|
42
41
|
},
|
|
43
|
-
/** For a row of filters, beside compact selects and small buttons. */
|
|
44
42
|
small: {
|
|
45
43
|
height: "control.compact",
|
|
46
44
|
paddingInline: "control.compactInline",
|
|
47
45
|
fontSize: "caption",
|
|
48
46
|
},
|
|
49
|
-
/** The field: the height of the default button. */
|
|
50
47
|
medium: {
|
|
51
48
|
height: "control.default",
|
|
52
49
|
paddingInline: "control.compactInline",
|
|
@@ -73,7 +70,7 @@ const search = cva({
|
|
|
73
70
|
alignItems: "center",
|
|
74
71
|
gap: "control.iconGap",
|
|
75
72
|
height: "control.search",
|
|
76
|
-
width: "
|
|
73
|
+
width: "full",
|
|
77
74
|
border: "1px solid transparent",
|
|
78
75
|
color: "fg.muted",
|
|
79
76
|
_hover: { color: "fg.primary" },
|
|
@@ -115,7 +112,7 @@ const search = cva({
|
|
|
115
112
|
width: {
|
|
116
113
|
fill: {},
|
|
117
114
|
// Grows with its toolbar from a name's width up to a search field's, leaving its filters room.
|
|
118
|
-
field: { flex: "1", minWidth: "0", flexBasis: "220px", maxWidth: "control.searchField" },
|
|
115
|
+
field: { flex: "1", minWidth: "0", flexBasis: "[220px]", maxWidth: "control.searchField" },
|
|
119
116
|
},
|
|
120
117
|
size: {
|
|
121
118
|
regular: {},
|
|
@@ -133,11 +130,11 @@ const searchText = cva({
|
|
|
133
130
|
base: {
|
|
134
131
|
flex: "1",
|
|
135
132
|
minWidth: "0",
|
|
136
|
-
height: "
|
|
133
|
+
height: "full",
|
|
137
134
|
padding: "none",
|
|
138
135
|
border: "0",
|
|
139
136
|
background: "transparent",
|
|
140
|
-
outline: "
|
|
137
|
+
outline: "0",
|
|
141
138
|
color: "fg.primary",
|
|
142
139
|
fontFamily: "sans",
|
|
143
140
|
fontSize: "body",
|
|
@@ -164,8 +161,13 @@ export function SearchInput({ variant = "regular", size: ownSize, width = "fill"
|
|
|
164
161
|
setDraft(value ?? "");
|
|
165
162
|
}
|
|
166
163
|
const committing = onValueCommit !== undefined;
|
|
167
|
-
const
|
|
168
|
-
const
|
|
164
|
+
const lastCommittedText = useRef(defaultValue ?? "");
|
|
165
|
+
const committed = value ?? lastCommittedText.current;
|
|
166
|
+
const reportCommit = (next) => {
|
|
167
|
+
lastCommittedText.current = next;
|
|
168
|
+
onValueCommit?.(next);
|
|
169
|
+
};
|
|
170
|
+
const commit = useDebouncer(reportCommit, { wait: debounceMs });
|
|
169
171
|
// A new `value` replaces the draft, and with it any commit still waiting.
|
|
170
172
|
const cancelCommit = commit.cancel;
|
|
171
173
|
useEffect(() => cancelCommit(), [cancelCommit, value]);
|
|
@@ -182,14 +184,13 @@ export function SearchInput({ variant = "regular", size: ownSize, width = "fill"
|
|
|
182
184
|
}, onKeyDown: (event) => {
|
|
183
185
|
if (committing && event.key === "Enter") {
|
|
184
186
|
commit.cancel();
|
|
185
|
-
|
|
187
|
+
reportCommit(event.currentTarget.value);
|
|
186
188
|
}
|
|
187
189
|
onKeyDown?.(event);
|
|
188
190
|
}, className: cx(searchText({ variant, size }), className) }), shortcut && _jsx(ShortcutHint, { boxed: true, hotkey: shortcut })] }));
|
|
189
191
|
}
|
|
190
192
|
/*
|
|
191
|
-
*
|
|
192
|
-
* one hairline. Hovered it takes the hover wash, and focused the ring, both on its own nearly
|
|
193
|
+
* Hovered it takes the hover wash, and focused the ring, both on its own nearly
|
|
193
194
|
* square corners. Quiet, in a menu or popover, the hairline is the sheet's divider and nothing
|
|
194
195
|
* else changes: the popup opens with the field focused, and its caret shows that.
|
|
195
196
|
*/
|
|
@@ -198,7 +199,7 @@ const underline = cva({
|
|
|
198
199
|
display: "flex",
|
|
199
200
|
alignItems: "center",
|
|
200
201
|
gap: "control.iconGap",
|
|
201
|
-
width: "
|
|
202
|
+
width: "full",
|
|
202
203
|
paddingInline: "search.inline",
|
|
203
204
|
borderBottom: "1px solid token(colors.border.control)",
|
|
204
205
|
color: "fg.muted",
|
|
@@ -223,11 +224,11 @@ const underline = cva({
|
|
|
223
224
|
const underlineText = css({
|
|
224
225
|
flex: "1",
|
|
225
226
|
minWidth: "0",
|
|
226
|
-
height: "
|
|
227
|
+
height: "full",
|
|
227
228
|
padding: "none",
|
|
228
229
|
border: "0",
|
|
229
230
|
background: "transparent",
|
|
230
|
-
outline: "
|
|
231
|
+
outline: "0",
|
|
231
232
|
color: "fg.primary",
|
|
232
233
|
fontFamily: "sans",
|
|
233
234
|
fontSize: "body",
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { type Hotkey } from "./hotkeys.js";
|
|
2
2
|
import type { ComponentProps } from "react";
|
|
3
|
-
/**
|
|
4
|
-
* One key as a 22px square cap, such as the `K` after a search field. A label of more than one
|
|
5
|
-
* character, such as `Esc`, takes the wider word cap on its own.
|
|
6
|
-
*/
|
|
3
|
+
/** A label of more than one character, such as `Esc`, takes the wider word cap on its own. */
|
|
7
4
|
export declare function Keycap({ className, children, ...props }: ComponentProps<"kbd">): import("react").JSX.Element;
|
|
8
5
|
/**
|
|
9
6
|
* A hotkey as one quiet line, as the hotkeys layer writes it: `Mod` is "⌘" on a Mac and "Ctrl"
|
|
10
|
-
* elsewhere, and a sequence's steps are spaced ("G I").
|
|
11
|
-
* `Keycap`, 2px apart, as a menu row or a search field shows it.
|
|
7
|
+
* elsewhere, and a sequence's steps are spaced ("G I").
|
|
12
8
|
*/
|
|
13
9
|
export declare function ShortcutHint({ hotkey, boxed, className, ...props }: ComponentProps<"kbd"> & {
|
|
14
10
|
hotkey: Hotkey;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { css, cva, cx } from "#primitives/css";
|
|
3
3
|
import { detectPlatform, formatForDisplay } from "./hotkeys.js";
|
|
4
|
-
/*
|
|
5
|
-
* A key on the raised face: a glyph such as ⌘ or ↵ sits in a 22px square, and a word such as Esc
|
|
6
|
-
* in a wider cap. The edge is the canvas hairline.
|
|
7
|
-
*/
|
|
8
4
|
const keycap = cva({
|
|
9
5
|
base: {
|
|
10
6
|
display: "inline-grid",
|
|
@@ -15,7 +11,7 @@ const keycap = cva({
|
|
|
15
11
|
paddingInline: "none",
|
|
16
12
|
border: "1px solid token(colors.border.canvas)",
|
|
17
13
|
borderRadius: "keycap",
|
|
18
|
-
background: "token(gradients.raised)",
|
|
14
|
+
background: "[token(gradients.raised)]",
|
|
19
15
|
color: "fg.primary",
|
|
20
16
|
fontFamily: "sans",
|
|
21
17
|
fontSize: "code",
|
|
@@ -50,7 +46,7 @@ const shortcut = css({
|
|
|
50
46
|
fontFamily: "sans",
|
|
51
47
|
fontSize: "code",
|
|
52
48
|
fontWeight: "medium",
|
|
53
|
-
letterSpacing: "
|
|
49
|
+
letterSpacing: "compact",
|
|
54
50
|
lineHeight: "tight",
|
|
55
51
|
whiteSpace: "nowrap",
|
|
56
52
|
_phone: { display: "none" },
|
|
@@ -59,18 +55,14 @@ const shortcut = css({
|
|
|
59
55
|
const separatorToken = detectPlatform() === "mac" ? "" : undefined;
|
|
60
56
|
// Between the keys of a boxed hint, split apart again so each takes its own cap.
|
|
61
57
|
const keySeparator = "\n";
|
|
62
|
-
/**
|
|
63
|
-
* One key as a 22px square cap, such as the `K` after a search field. A label of more than one
|
|
64
|
-
* character, such as `Esc`, takes the wider word cap on its own.
|
|
65
|
-
*/
|
|
58
|
+
/** A label of more than one character, such as `Esc`, takes the wider word cap on its own. */
|
|
66
59
|
export function Keycap({ className, children, ...props }) {
|
|
67
60
|
const holdsWord = typeof children === "string" && Array.from(children).length > 1;
|
|
68
61
|
return (_jsx("kbd", { ...props, className: cx(keycap({ label: holdsWord ? "word" : "glyph" }), className), "data-ciridae-ui": "", children: children }));
|
|
69
62
|
}
|
|
70
63
|
/**
|
|
71
64
|
* A hotkey as one quiet line, as the hotkeys layer writes it: `Mod` is "⌘" on a Mac and "Ctrl"
|
|
72
|
-
* elsewhere, and a sequence's steps are spaced ("G I").
|
|
73
|
-
* `Keycap`, 2px apart, as a menu row or a search field shows it.
|
|
65
|
+
* elsewhere, and a sequence's steps are spaced ("G I").
|
|
74
66
|
*/
|
|
75
67
|
export function ShortcutHint({ hotkey, boxed = false, className, ...props }) {
|
|
76
68
|
if (boxed) {
|
|
@@ -4,18 +4,19 @@ import { createContext, useContext } from "react";
|
|
|
4
4
|
import { css, cva, cx } from "#primitives/css";
|
|
5
5
|
import { Checkbox } from "./form-controls.js";
|
|
6
6
|
import { Skeleton } from "./skeleton.js";
|
|
7
|
-
// Each name is its pixel gap
|
|
8
|
-
//
|
|
7
|
+
// Each name is its pixel gap, read from the `gap.*` scale rather than a role's token, so a role
|
|
8
|
+
// that moves with the design never changes what a number means. `section` is the gap between a
|
|
9
|
+
// page's sections, which tightens to the page gap on a phone.
|
|
9
10
|
const layoutGap = cva({
|
|
10
11
|
variants: {
|
|
11
12
|
gap: {
|
|
12
|
-
"4": { gap: "
|
|
13
|
-
"6": { gap: "
|
|
14
|
-
"8": { gap: "
|
|
15
|
-
"12": { gap: "
|
|
16
|
-
"16": { gap: "
|
|
17
|
-
"20": { gap: "
|
|
18
|
-
"24": { gap: "
|
|
13
|
+
"4": { gap: "gap.4" },
|
|
14
|
+
"6": { gap: "gap.6" },
|
|
15
|
+
"8": { gap: "gap.8" },
|
|
16
|
+
"12": { gap: "gap.12" },
|
|
17
|
+
"16": { gap: "gap.16" },
|
|
18
|
+
"20": { gap: "gap.20" },
|
|
19
|
+
"24": { gap: "gap.24" },
|
|
19
20
|
section: { gap: "layout.sectionGap", _phone: { gap: "layout.pageGap" } },
|
|
20
21
|
},
|
|
21
22
|
},
|
|
@@ -208,7 +209,7 @@ const listRow = cva({
|
|
|
208
209
|
defaultVariants: { flush: false },
|
|
209
210
|
});
|
|
210
211
|
const listRowLink = css({
|
|
211
|
-
color: "inherit",
|
|
212
|
+
color: "[inherit]",
|
|
212
213
|
textDecoration: "none",
|
|
213
214
|
cursor: "pointer",
|
|
214
215
|
_hover: { background: "bg.rowHover" },
|
|
@@ -22,11 +22,11 @@ const popup = css({
|
|
|
22
22
|
gridTemplateRows: "auto minmax(0, 1fr)",
|
|
23
23
|
background: "bg.canvas",
|
|
24
24
|
color: "fg.primary",
|
|
25
|
-
outline: "
|
|
26
|
-
transitionProperty: "opacity",
|
|
25
|
+
outline: "0",
|
|
26
|
+
transitionProperty: "[opacity]",
|
|
27
27
|
transitionDuration: "fast",
|
|
28
|
-
_motionReduce: { transition: "none" },
|
|
29
|
-
"&[data-starting-style], &[data-ending-style]": { opacity: "0" },
|
|
28
|
+
_motionReduce: { transition: "[none]" },
|
|
29
|
+
"&[data-starting-style], &[data-ending-style]": { opacity: "[0]" },
|
|
30
30
|
});
|
|
31
31
|
const bar = css({
|
|
32
32
|
display: "flex",
|
|
@@ -51,11 +51,11 @@ const stage = css({
|
|
|
51
51
|
minHeight: "0",
|
|
52
52
|
paddingInline: "layout.pageGap",
|
|
53
53
|
paddingBottom: "layout.pageGap",
|
|
54
|
-
"& > img": { maxWidth: "
|
|
54
|
+
"& > img": { maxWidth: "full", maxHeight: "full", objectFit: "contain" },
|
|
55
55
|
"& > iframe": {
|
|
56
|
-
width: "
|
|
56
|
+
width: "full",
|
|
57
57
|
maxWidth: "overlay.dialogWide",
|
|
58
|
-
height: "
|
|
58
|
+
height: "full",
|
|
59
59
|
border: "0",
|
|
60
60
|
borderRadius: "action",
|
|
61
61
|
// Solid, so a document with no background of its own does not show the scrim through it.
|
|
@@ -64,7 +64,7 @@ const stage = css({
|
|
|
64
64
|
});
|
|
65
65
|
const step = css({
|
|
66
66
|
position: "absolute",
|
|
67
|
-
top: "50%",
|
|
67
|
+
top: "[50%]",
|
|
68
68
|
transform: "translateY(-50%)",
|
|
69
69
|
"&[data-step=previous]": { insetInlineStart: "layout.controlGap" },
|
|
70
70
|
"&[data-step=next]": { insetInlineEnd: "layout.controlGap" },
|
package/dist/components/link.js
CHANGED
|
@@ -15,7 +15,7 @@ const anchor = cva({
|
|
|
15
15
|
variants: {
|
|
16
16
|
tone: {
|
|
17
17
|
/** Reads as body text; the underline on hover is the only affordance. */
|
|
18
|
-
inherit: { color: "inherit" },
|
|
18
|
+
inherit: { color: "[inherit]" },
|
|
19
19
|
muted: { color: "fg.muted", fontSize: "caption" },
|
|
20
20
|
accent: { color: "accent.brand" },
|
|
21
21
|
},
|
|
@@ -39,6 +39,8 @@ export declare const englishLabels: {
|
|
|
39
39
|
copy: (what: string) => string;
|
|
40
40
|
copyValue: (what: string, value: string) => string;
|
|
41
41
|
copied: string;
|
|
42
|
+
/** A figure's name and its value, read together, such as a bar segment's. */
|
|
43
|
+
labelWithValue: (label: string, value: string) => string;
|
|
42
44
|
copyAction: string;
|
|
43
45
|
moreActions: string;
|
|
44
46
|
moreTabs: string;
|
|
@@ -63,7 +65,6 @@ export declare const englishLabels: {
|
|
|
63
65
|
label: string;
|
|
64
66
|
previous: string;
|
|
65
67
|
next: string;
|
|
66
|
-
/** The rows a page shows and the page size, from numbers already formatted. */
|
|
67
68
|
summary: (first: string, last: string, total: string) => string;
|
|
68
69
|
perPage: (count: string) => string;
|
|
69
70
|
};
|
|
@@ -79,7 +80,6 @@ export declare const englishLabels: {
|
|
|
79
80
|
};
|
|
80
81
|
commandMenu: {
|
|
81
82
|
title: string;
|
|
82
|
-
/** The footer's key hints beside the close key. */
|
|
83
83
|
move: string;
|
|
84
84
|
open: string;
|
|
85
85
|
};
|
|
@@ -236,18 +236,28 @@ export declare const englishLabels: {
|
|
|
236
236
|
sendMessage: string;
|
|
237
237
|
stopped: string;
|
|
238
238
|
failed: string;
|
|
239
|
-
/** The title of a failed reply's notice. */
|
|
240
239
|
couldNotAnswer: string;
|
|
241
240
|
notSent: string;
|
|
242
|
-
typing: string;
|
|
243
241
|
resize: string;
|
|
242
|
+
/** The docked sheet's width, as its resize handle tells a screen reader. */
|
|
243
|
+
sheetWidth: (pixels: number) => string;
|
|
244
244
|
openFullPage: string;
|
|
245
245
|
dock: string;
|
|
246
246
|
undock: string;
|
|
247
247
|
attachFile: string;
|
|
248
248
|
mentions: string;
|
|
249
249
|
assistantName: string;
|
|
250
|
+
/** A finished reply as the thread announces it to a screen reader: who wrote it, then its text. */
|
|
251
|
+
replyAnnouncement: (authorName: string, text: string) => string;
|
|
250
252
|
answered: (answers: string) => string;
|
|
253
|
+
/** A run of the agent's steps, folded: the first step's title and how many follow it. */
|
|
254
|
+
foldedSteps: (firstTitle: string, laterCount: number) => string;
|
|
255
|
+
/** How one of the agent's steps ended, read after its title to a screen reader. */
|
|
256
|
+
stepStatus: {
|
|
257
|
+
running: string;
|
|
258
|
+
completed: string;
|
|
259
|
+
failed: string;
|
|
260
|
+
};
|
|
251
261
|
allow: string;
|
|
252
262
|
deny: string;
|
|
253
263
|
allowed: string;
|
|
@@ -305,6 +315,8 @@ export declare const englishLabels: {
|
|
|
305
315
|
/** The bulk actions' group, which acts on the items shown. */
|
|
306
316
|
bulkActions: string;
|
|
307
317
|
selectedCount: (selected: number, total: number) => string;
|
|
318
|
+
/** A group heading's count of its selected items. */
|
|
319
|
+
groupSelectedCount: (selected: number, total: number) => string;
|
|
308
320
|
noMatches: (search: string) => string;
|
|
309
321
|
};
|
|
310
322
|
filters: {
|
|
@@ -352,6 +364,13 @@ export declare const englishLabels: {
|
|
|
352
364
|
after: string;
|
|
353
365
|
};
|
|
354
366
|
betweenValues: (from: string, to: string) => string;
|
|
367
|
+
/** A between filter with one end typed, as its chip reads it: the end itself matches. */
|
|
368
|
+
oneEndedRangeOperators: {
|
|
369
|
+
atLeast: string;
|
|
370
|
+
atMost: string;
|
|
371
|
+
onOrAfter: string;
|
|
372
|
+
onOrBefore: string;
|
|
373
|
+
};
|
|
355
374
|
};
|
|
356
375
|
dateRange: {
|
|
357
376
|
label: string;
|
|
@@ -380,7 +399,6 @@ export declare const englishLabels: {
|
|
|
380
399
|
runToGo: string;
|
|
381
400
|
runDoneLabel: (count: number) => string;
|
|
382
401
|
runToGoLabel: (count: number) => string;
|
|
383
|
-
/** The folded finished stages, with their count. */
|
|
384
402
|
runDoneShort: (count: number) => string;
|
|
385
403
|
checklistProgress: (done: number, total: number) => string;
|
|
386
404
|
};
|
|
@@ -420,8 +438,6 @@ export declare const englishLabels: {
|
|
|
420
438
|
signOut: string;
|
|
421
439
|
};
|
|
422
440
|
themeCustomizer: {
|
|
423
|
-
palette: string;
|
|
424
|
-
paletteName: (name: string) => string;
|
|
425
441
|
colorTheme: string;
|
|
426
442
|
system: string;
|
|
427
443
|
light: string;
|
|
@@ -33,6 +33,8 @@ export const englishLabels = {
|
|
|
33
33
|
copy: (what) => `Copy ${what}`,
|
|
34
34
|
copyValue: (what, value) => `Copy ${what} ${value}`,
|
|
35
35
|
copied: "Copied",
|
|
36
|
+
/** A figure's name and its value, read together, such as a bar segment's. */
|
|
37
|
+
labelWithValue: (label, value) => `${label}, ${value}`,
|
|
36
38
|
copyAction: "Copy",
|
|
37
39
|
moreActions: "More actions",
|
|
38
40
|
moreTabs: "More tabs",
|
|
@@ -54,7 +56,6 @@ export const englishLabels = {
|
|
|
54
56
|
label: "Pagination",
|
|
55
57
|
previous: "Previous",
|
|
56
58
|
next: "Next",
|
|
57
|
-
/** The rows a page shows and the page size, from numbers already formatted. */
|
|
58
59
|
summary: (first, last, total) => `Showing ${first} to ${last} of ${total}`,
|
|
59
60
|
perPage: (count) => `${count} per page`,
|
|
60
61
|
},
|
|
@@ -67,7 +68,6 @@ export const englishLabels = {
|
|
|
67
68
|
},
|
|
68
69
|
commandMenu: {
|
|
69
70
|
title: "Command menu",
|
|
70
|
-
/** The footer's key hints beside the close key. */
|
|
71
71
|
move: "Move",
|
|
72
72
|
open: "Open",
|
|
73
73
|
},
|
|
@@ -218,18 +218,24 @@ export const englishLabels = {
|
|
|
218
218
|
sendMessage: "Send message",
|
|
219
219
|
stopped: "Stopped",
|
|
220
220
|
failed: "Failed",
|
|
221
|
-
/** The title of a failed reply's notice. */
|
|
222
221
|
couldNotAnswer: "Couldn't finish that answer",
|
|
223
222
|
notSent: "Not sent",
|
|
224
|
-
typing: "Typing",
|
|
225
223
|
resize: "Resize",
|
|
224
|
+
/** The docked sheet's width, as its resize handle tells a screen reader. */
|
|
225
|
+
sheetWidth: (pixels) => `${pixels} pixels wide`,
|
|
226
226
|
openFullPage: "Open full page",
|
|
227
227
|
dock: "Dock",
|
|
228
228
|
undock: "Undock",
|
|
229
229
|
attachFile: "Attach a file",
|
|
230
230
|
mentions: "Mentions",
|
|
231
231
|
assistantName: "Agent",
|
|
232
|
+
/** A finished reply as the thread announces it to a screen reader: who wrote it, then its text. */
|
|
233
|
+
replyAnnouncement: (authorName, text) => `${authorName}: ${text}`,
|
|
232
234
|
answered: (answers) => `Answered ${answers}`,
|
|
235
|
+
/** A run of the agent's steps, folded: the first step's title and how many follow it. */
|
|
236
|
+
foldedSteps: (firstTitle, laterCount) => laterCount > 0 ? `${firstTitle} · +${laterCount}` : firstTitle,
|
|
237
|
+
/** How one of the agent's steps ended, read after its title to a screen reader. */
|
|
238
|
+
stepStatus: { running: "Running", completed: "Done", failed: "Failed" },
|
|
233
239
|
allow: "Allow",
|
|
234
240
|
deny: "Deny",
|
|
235
241
|
allowed: "Allowed",
|
|
@@ -284,6 +290,8 @@ export const englishLabels = {
|
|
|
284
290
|
/** The bulk actions' group, which acts on the items shown. */
|
|
285
291
|
bulkActions: "Select or clear the shown items",
|
|
286
292
|
selectedCount: (selected, total) => `${selected} of ${total} selected`,
|
|
293
|
+
/** A group heading's count of its selected items. */
|
|
294
|
+
groupSelectedCount: (selected, total) => `${selected}/${total}`,
|
|
287
295
|
noMatches: (search) => `No matches for “${search}”`,
|
|
288
296
|
},
|
|
289
297
|
filters: {
|
|
@@ -331,6 +339,13 @@ export const englishLabels = {
|
|
|
331
339
|
after: "is after",
|
|
332
340
|
},
|
|
333
341
|
betweenValues: (from, to) => `${from} and ${to}`,
|
|
342
|
+
/** A between filter with one end typed, as its chip reads it: the end itself matches. */
|
|
343
|
+
oneEndedRangeOperators: {
|
|
344
|
+
atLeast: "is at least",
|
|
345
|
+
atMost: "is at most",
|
|
346
|
+
onOrAfter: "is on or after",
|
|
347
|
+
onOrBefore: "is on or before",
|
|
348
|
+
},
|
|
334
349
|
},
|
|
335
350
|
dateRange: {
|
|
336
351
|
label: "Date range",
|
|
@@ -356,7 +371,6 @@ export const englishLabels = {
|
|
|
356
371
|
runToGo: "To go",
|
|
357
372
|
runDoneLabel: (count) => `${count} stages done`,
|
|
358
373
|
runToGoLabel: (count) => `${count} stages to go`,
|
|
359
|
-
/** The folded finished stages, with their count. */
|
|
360
374
|
runDoneShort: (count) => `${count} done`,
|
|
361
375
|
checklistProgress: (done, total) => `${done} of ${total}`,
|
|
362
376
|
},
|
|
@@ -383,8 +397,6 @@ export const englishLabels = {
|
|
|
383
397
|
appFrame: { status: "Status", localBuild: "local", updateAvailable: "Update available" },
|
|
384
398
|
accountMenu: { menu: "Account menu", signOut: "Sign out" },
|
|
385
399
|
themeCustomizer: {
|
|
386
|
-
palette: "Palette",
|
|
387
|
-
paletteName: (name) => name.charAt(0).toUpperCase() + name.slice(1),
|
|
388
400
|
colorTheme: "Color theme",
|
|
389
401
|
system: "System",
|
|
390
402
|
light: "Light",
|
|
@@ -2,39 +2,27 @@ import type { ComponentProps, ReactNode } from "react";
|
|
|
2
2
|
export type LogEntryProps = Omit<ComponentProps<"div">, "children"> & {
|
|
3
3
|
/** When it happened, epoch milliseconds, written as the time of day. */
|
|
4
4
|
at: number;
|
|
5
|
-
/** Who did it: a person's avatar, or a system's or an agent's icon. */
|
|
6
5
|
actor: ReactNode;
|
|
7
|
-
/** What happened, such as "The agent drafted remittance advice for INV-4799". */
|
|
8
6
|
headline: ReactNode;
|
|
9
|
-
/** A line more about it, such as what it waits on. */
|
|
10
7
|
detail?: ReactNode;
|
|
11
|
-
/** At the end of the row, such as a badge naming whether a person, a model or an agent did it. */
|
|
12
8
|
badge?: ReactNode;
|
|
13
9
|
/** `comfortable` for a page's log, `compact` for one line per entry, `panel` in a drawer. */
|
|
14
10
|
density?: "comfortable" | "compact" | "panel";
|
|
15
11
|
selected?: boolean;
|
|
16
|
-
/** A hairline under the row, between it and the next. */
|
|
17
12
|
divider?: boolean;
|
|
18
|
-
/** Makes the row a button, such as one that opens the entry beside the log. */
|
|
19
13
|
onSelect?: () => void;
|
|
20
14
|
};
|
|
21
|
-
/** One thing that happened, as a row of a log. */
|
|
22
15
|
export declare function LogEntry({ at, actor, headline, detail, badge, density, selected, divider, onSelect, className, ...props }: LogEntryProps): import("react").JSX.Element;
|
|
23
16
|
export type LogGroupHeaderProps = Omit<ComponentProps<"div">, "children"> & {
|
|
24
|
-
/** What the group is, such as "Today". */
|
|
25
17
|
label: ReactNode;
|
|
26
|
-
/** Beside it, quieter, such as the date. */
|
|
27
18
|
meta?: ReactNode;
|
|
19
|
+
density?: LogEntryProps["density"];
|
|
28
20
|
};
|
|
29
|
-
|
|
30
|
-
export declare function LogGroupHeader({ label, meta, className, ...props }: LogGroupHeaderProps): import("react").JSX.Element;
|
|
21
|
+
export declare function LogGroupHeader({ label, meta, density, className, ...props }: LogGroupHeaderProps): import("react").JSX.Element;
|
|
31
22
|
export type LogActorProps = {
|
|
32
23
|
/** Who or what acted, read out in place of the mark. */
|
|
33
24
|
name: string;
|
|
34
|
-
/** A person's photo; their initials stand in without one. */
|
|
35
25
|
src?: string | null;
|
|
36
|
-
/** For an agent, a sync or a rule: its icon in place of a person's photo or initials. */
|
|
37
26
|
icon?: ReactNode;
|
|
38
27
|
};
|
|
39
|
-
/** Who did a log entry's thing, as the mark for its `actor`. */
|
|
40
28
|
export declare function LogActor({ name, src, icon }: LogActorProps): import("react").JSX.Element;
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/*
|
|
3
|
-
* A record's activity as a log: a row per thing that happened, under a heading per day. A row is
|
|
4
|
-
* the time, who did it, what happened and a line more about it, and a trailing badge such as
|
|
5
|
-
* whether a person, a model or an agent did it. `comfortable` is a page's log, `compact` puts the
|
|
6
|
-
* line more beside what happened, and `panel` is the log in a drawer or side panel.
|
|
7
|
-
*/
|
|
8
2
|
import { css, cx } from "#primitives/css";
|
|
9
3
|
import { Avatar } from "./data-display.js";
|
|
10
4
|
import { useCiridaeLocale } from "./locale.js";
|
|
@@ -12,27 +6,25 @@ const entry = css({
|
|
|
12
6
|
display: "flex",
|
|
13
7
|
alignItems: "flex-start",
|
|
14
8
|
gap: "layout.clusterGap",
|
|
15
|
-
width: "
|
|
9
|
+
width: "full",
|
|
16
10
|
minWidth: "0",
|
|
17
11
|
paddingBlock: "log.entryBlock",
|
|
18
12
|
paddingInline: "log.entryInline",
|
|
19
13
|
color: "fg.primary",
|
|
20
|
-
_hover: { background: "token(gradients.rowHover)" },
|
|
21
|
-
"&[data-selected], &[data-selected]:hover": { background: "token(gradients.selected)" },
|
|
14
|
+
_hover: { background: "[token(gradients.rowHover)]" },
|
|
15
|
+
"&[data-selected], &[data-selected]:hover": { background: "[token(gradients.selected)]" },
|
|
22
16
|
"&[role=button]": { cursor: "pointer" },
|
|
23
17
|
_focusVisible: { focusRing: "inset" },
|
|
24
18
|
"&[data-divider]": { borderBottom: "1px solid token(colors.border.divider)" },
|
|
25
19
|
"&[data-density=compact]": { alignItems: "center", paddingBlock: "log.entryCompactBlock" },
|
|
26
20
|
// A compact row's rule sits inside its padding, so it stays the kit's 40px with or without one.
|
|
27
21
|
"&[data-density=compact][data-divider]": {
|
|
28
|
-
paddingBottom: "calc(token(spacing.log.entryCompactBlock) - token(sizes.border.hairline))",
|
|
22
|
+
paddingBottom: "[calc(token(spacing.log.entryCompactBlock) - token(sizes.border.hairline))]",
|
|
29
23
|
},
|
|
30
24
|
"&[data-density=panel]": {
|
|
31
25
|
paddingBlock: "log.entryPanelBlock",
|
|
32
26
|
paddingInline: "log.entryPanelInline",
|
|
33
27
|
},
|
|
34
|
-
// The time, the actor and the badge each sit in a line as tall as the actor, level with the
|
|
35
|
-
// headline beside them.
|
|
36
28
|
"& > [data-time], & > [data-actor], & > [data-badge]": {
|
|
37
29
|
display: "flex",
|
|
38
30
|
flexShrink: "0",
|
|
@@ -55,7 +47,6 @@ const entry = css({
|
|
|
55
47
|
flex: "1",
|
|
56
48
|
minWidth: "0",
|
|
57
49
|
},
|
|
58
|
-
// One line as tall as the actor, ending in an ellipsis where the row is too narrow for it.
|
|
59
50
|
"& [data-headline]": {
|
|
60
51
|
display: "flex",
|
|
61
52
|
alignItems: "center",
|
|
@@ -87,8 +78,7 @@ const entry = css({
|
|
|
87
78
|
"& > [data-detail]": { flex: "1", lineHeight: "tight" },
|
|
88
79
|
},
|
|
89
80
|
});
|
|
90
|
-
// The
|
|
91
|
-
// on the raised glass circle. The icon is the small icon's size at every density.
|
|
81
|
+
// The icon is the small icon's size at every density.
|
|
92
82
|
const actorIcon = css({
|
|
93
83
|
display: "inline-grid",
|
|
94
84
|
placeItems: "center",
|
|
@@ -96,7 +86,7 @@ const actorIcon = css({
|
|
|
96
86
|
width: "avatar.menu",
|
|
97
87
|
height: "avatar.menu",
|
|
98
88
|
borderRadius: "round",
|
|
99
|
-
background: "token(gradients.raised)",
|
|
89
|
+
background: "[token(gradients.raised)]",
|
|
100
90
|
color: "fg.label",
|
|
101
91
|
"--edge": "token(gradients.border.raised)",
|
|
102
92
|
"& > svg": { fontSize: "icon.small" },
|
|
@@ -104,20 +94,21 @@ const actorIcon = css({
|
|
|
104
94
|
// Initials sit in the label grey here, where the avatar's own are the primary text colour; the
|
|
105
95
|
// extra attribute outranks the avatar's kind rule.
|
|
106
96
|
const actorPerson = css({ "&[data-ciridae-ui][data-kind=user]": { color: "fg.label" } });
|
|
97
|
+
// It keeps its rows' side padding, so the day lines up with their time column.
|
|
107
98
|
const groupHeader = css({
|
|
108
99
|
display: "flex",
|
|
109
100
|
alignItems: "center",
|
|
110
101
|
gap: "layout.controlGap",
|
|
111
102
|
paddingTop: "panel.comfortable",
|
|
112
|
-
paddingInline: "
|
|
103
|
+
paddingInline: "log.entryInline",
|
|
113
104
|
paddingBottom: "layout.tightGap",
|
|
105
|
+
"&[data-density=panel]": { paddingInline: "log.entryPanelInline" },
|
|
114
106
|
fontSize: "code",
|
|
115
107
|
fontWeight: "medium",
|
|
116
108
|
lineHeight: "tight",
|
|
117
109
|
"& > [data-label]": { color: "fg.primary" },
|
|
118
110
|
"& > [data-meta]": { color: "fg.subtle" },
|
|
119
111
|
});
|
|
120
|
-
/** One thing that happened, as a row of a log. */
|
|
121
112
|
export function LogEntry({ at, actor, headline, detail, badge, density = "comfortable", selected = false, divider = true, onSelect, className, ...props }) {
|
|
122
113
|
const { formatTime } = useCiridaeLocale();
|
|
123
114
|
const selectOnKey = (event) => {
|
|
@@ -134,11 +125,9 @@ export function LogEntry({ at, actor, headline, detail, badge, density = "comfor
|
|
|
134
125
|
onKeyDown: selectOnKey,
|
|
135
126
|
}), className: cx(entry, className), "data-ciridae-ui": "", "data-density": density, "data-selected": selected || undefined, "data-divider": divider || undefined, children: [_jsx("time", { "data-time": "", dateTime: new Date(at).toISOString(), children: formatTime(at) }), _jsx("span", { "data-actor": "", children: actor }), _jsxs("div", { "data-body": "", children: [_jsx("span", { "data-headline": "", children: _jsx("span", { children: headline }) }), detail && _jsx("span", { "data-detail": "", children: detail })] }), badge && _jsx("span", { "data-badge": "", children: badge })] }));
|
|
136
127
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return (_jsxs("div", { ...props, className: cx(groupHeader, className), "data-ciridae-ui": "", children: [_jsx("span", { "data-label": "", children: label }), meta && _jsx("span", { "data-meta": "", children: meta })] }));
|
|
128
|
+
export function LogGroupHeader({ label, meta, density = "comfortable", className, ...props }) {
|
|
129
|
+
return (_jsxs("div", { ...props, className: cx(groupHeader, className), "data-ciridae-ui": "", "data-density": density, children: [_jsx("span", { "data-label": "", children: label }), meta && _jsx("span", { "data-meta": "", children: meta })] }));
|
|
140
130
|
}
|
|
141
|
-
/** Who did a log entry's thing, as the mark for its `actor`. */
|
|
142
131
|
export function LogActor({ name, src, icon }) {
|
|
143
132
|
if (icon)
|
|
144
133
|
return (_jsx("span", { role: "img", "aria-label": name, className: actorIcon, "data-ciridae-ui": "", "data-edge": "gradient", children: icon }));
|
|
@@ -21,7 +21,7 @@ const filledList = css({
|
|
|
21
21
|
overflowX: "hidden",
|
|
22
22
|
border: "1px solid token(colors.border.subtle)",
|
|
23
23
|
background: "bg.panel",
|
|
24
|
-
_focusVisible: { outline: "2px solid token(colors.border.focus)", outlineOffset: "2px" },
|
|
24
|
+
_focusVisible: { outline: "2px solid token(colors.border.focus)", outlineOffset: "[2px]" },
|
|
25
25
|
});
|
|
26
26
|
const output = css({
|
|
27
27
|
margin: "none",
|