@ciridae/ui 1.0.4 → 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.
Files changed (147) hide show
  1. package/README.md +3 -2
  2. package/dist/chat/conversation-source.d.ts +1 -3
  3. package/dist/chat/message-text.js +6 -6
  4. package/dist/chat/use-chat-conversation.d.ts +7 -2
  5. package/dist/chat/use-chat-conversation.js +2 -1
  6. package/dist/components/activity-feed.d.ts +0 -1
  7. package/dist/components/activity-feed.js +6 -7
  8. package/dist/components/agent-work.d.ts +5 -1
  9. package/dist/components/agent-work.js +27 -13
  10. package/dist/components/app-frame.d.ts +3 -17
  11. package/dist/components/app-frame.js +11 -30
  12. package/dist/components/app-navigation.d.ts +5 -6
  13. package/dist/components/app-navigation.js +70 -40
  14. package/dist/components/badge.d.ts +0 -4
  15. package/dist/components/badge.js +17 -27
  16. package/dist/components/bulk-action-bar.js +2 -2
  17. package/dist/components/button.js +41 -50
  18. package/dist/components/calendar.js +5 -8
  19. package/dist/components/centered-page.js +4 -4
  20. package/dist/components/chart.js +3 -4
  21. package/dist/components/chat-client-source.js +55 -34
  22. package/dist/components/chat-page.js +1 -1
  23. package/dist/components/chat-sheet.d.ts +30 -20
  24. package/dist/components/chat-sheet.js +112 -54
  25. package/dist/components/chat.d.ts +27 -56
  26. package/dist/components/chat.js +153 -132
  27. package/dist/components/checkbox-item.js +4 -4
  28. package/dist/components/checkbox-list.js +6 -6
  29. package/dist/components/chip.js +2 -2
  30. package/dist/components/collapsible.js +3 -3
  31. package/dist/components/color-theme.d.ts +3 -6
  32. package/dist/components/color-theme.js +10 -11
  33. package/dist/components/column-settings.js +3 -3
  34. package/dist/components/command-menu.d.ts +1 -2
  35. package/dist/components/command-menu.js +56 -77
  36. package/dist/components/command-palette.js +5 -2
  37. package/dist/components/copyable-id.js +5 -5
  38. package/dist/components/data-display.d.ts +1 -7
  39. package/dist/components/data-display.js +32 -55
  40. package/dist/components/data-grid.d.ts +4 -7
  41. package/dist/components/data-grid.js +106 -90
  42. package/dist/components/date-range-picker.js +4 -5
  43. package/dist/components/document-viewer.js +23 -23
  44. package/dist/components/drawer.d.ts +2 -1
  45. package/dist/components/drawer.js +45 -20
  46. package/dist/components/dropzone.js +13 -13
  47. package/dist/components/editable-field.d.ts +2 -7
  48. package/dist/components/editable-field.js +14 -27
  49. package/dist/components/email-input.js +2 -3
  50. package/dist/components/environment-frame.js +7 -7
  51. package/dist/components/expandable-text.js +2 -2
  52. package/dist/components/feedback-screenshot.js +7 -7
  53. package/dist/components/feedback-sheet.js +8 -8
  54. package/dist/components/filter-bar.js +41 -27
  55. package/dist/components/form-controls.d.ts +3 -6
  56. package/dist/components/form-controls.js +15 -22
  57. package/dist/components/form-layout.d.ts +6 -6
  58. package/dist/components/form-layout.js +10 -16
  59. package/dist/components/glass-menu.d.ts +2 -0
  60. package/dist/components/glass-menu.js +14 -18
  61. package/dist/components/gradient-edge.d.ts +0 -1
  62. package/dist/components/gradient-edge.js +8 -9
  63. package/dist/components/icon.js +1 -1
  64. package/dist/components/input.js +18 -17
  65. package/dist/components/keycap.d.ts +2 -6
  66. package/dist/components/keycap.js +4 -12
  67. package/dist/components/layout.js +11 -10
  68. package/dist/components/lightbox.js +8 -8
  69. package/dist/components/link.js +1 -1
  70. package/dist/components/locale.d.ts +23 -7
  71. package/dist/components/locale.js +19 -7
  72. package/dist/components/log-entry.d.ts +2 -14
  73. package/dist/components/log-entry.js +11 -22
  74. package/dist/components/log-list.js +1 -1
  75. package/dist/components/mention-input.js +13 -14
  76. package/dist/components/menu.d.ts +7 -4
  77. package/dist/components/menu.js +23 -10
  78. package/dist/components/meter.d.ts +2 -3
  79. package/dist/components/meter.js +12 -16
  80. package/dist/components/navigation.d.ts +0 -7
  81. package/dist/components/navigation.js +3 -12
  82. package/dist/components/notification-tray.js +7 -7
  83. package/dist/components/overlays.d.ts +5 -2
  84. package/dist/components/overlays.js +24 -24
  85. package/dist/components/panel.js +3 -3
  86. package/dist/components/progress.js +2 -2
  87. package/dist/components/radio-card.d.ts +1 -1
  88. package/dist/components/radio-card.js +9 -9
  89. package/dist/components/record.d.ts +2 -4
  90. package/dist/components/record.js +19 -32
  91. package/dist/components/scroll-area.js +10 -10
  92. package/dist/components/segmented-bar.js +9 -9
  93. package/dist/components/select.d.ts +3 -5
  94. package/dist/components/select.js +26 -44
  95. package/dist/components/settings.js +1 -1
  96. package/dist/components/shell-skeleton.js +1 -1
  97. package/dist/components/shell.d.ts +1 -1
  98. package/dist/components/shell.js +69 -24
  99. package/dist/components/side-panel.js +3 -3
  100. package/dist/components/sidebar.d.ts +0 -5
  101. package/dist/components/sidebar.js +25 -33
  102. package/dist/components/single-line-text.js +3 -4
  103. package/dist/components/site-banner.js +4 -4
  104. package/dist/components/skeleton.js +19 -22
  105. package/dist/components/skeletons.d.ts +0 -3
  106. package/dist/components/skeletons.js +5 -10
  107. package/dist/components/stages.d.ts +6 -3
  108. package/dist/components/stages.js +77 -105
  109. package/dist/components/stat-card.d.ts +2 -5
  110. package/dist/components/stat-card.js +23 -31
  111. package/dist/components/status-banner.js +6 -6
  112. package/dist/components/status.js +3 -3
  113. package/dist/components/steps.js +2 -2
  114. package/dist/components/switch.js +1 -1
  115. package/dist/components/tabs.js +15 -18
  116. package/dist/components/theme-customizer.d.ts +5 -8
  117. package/dist/components/theme-customizer.js +9 -41
  118. package/dist/components/theme-toggle.d.ts +0 -1
  119. package/dist/components/theme-toggle.js +6 -11
  120. package/dist/components/toast.d.ts +1 -7
  121. package/dist/components/toast.js +19 -22
  122. package/dist/components/user-chip.js +8 -8
  123. package/dist/components/wizard.js +6 -4
  124. package/dist/preset.d.ts +1 -2
  125. package/dist/preset.js +41 -89
  126. package/dist/styled-system/css/conditions.mjs +1 -1
  127. package/dist/styled-system/css/css.mjs +1 -1
  128. package/dist/styled-system/styles.css +820 -1297
  129. package/dist/styled-system/tokens/index.mjs +78 -1926
  130. package/dist/styled-system/tokens/tokens.d.ts +18 -33
  131. package/dist/styled-system/types/conditions.d.ts +0 -74
  132. package/dist/styled-system/types/prop-type.d.ts +15 -40
  133. package/dist/styled-system/types/style-props.d.ts +705 -705
  134. package/dist/theme/color.d.ts +0 -1
  135. package/dist/theme/color.js +0 -16
  136. package/dist/theme/derive.d.ts +3 -3
  137. package/dist/theme/derive.js +9 -32
  138. package/dist/theme/index.d.ts +1 -2
  139. package/dist/theme/index.js +3 -5
  140. package/dist/theme/options.d.ts +2 -4
  141. package/dist/theme/options.js +0 -1
  142. package/dist/theme/{palettes.d.ts → palette.d.ts} +12 -23
  143. package/dist/theme/palette.js +127 -0
  144. package/dist/theme/tokens.d.ts +8 -13
  145. package/dist/theme/tokens.js +39 -92
  146. package/package.json +1 -1
  147. package/dist/theme/palettes.js +0 -254
@@ -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",
@@ -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: "100%", lineHeight: "tight" },
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: "100%",
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: "100%",
133
+ height: "full",
137
134
  padding: "none",
138
135
  border: "0",
139
136
  background: "transparent",
140
- outline: "none",
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 committed = value ?? defaultValue ?? "";
168
- const commit = useDebouncer((next) => onValueCommit?.(next), { wait: debounceMs });
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
- onValueCommit(event.currentTarget.value);
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
- * The Round 2 search field is an underline, not a box: an icon, the text, and a clear button on
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: "100%",
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: "100%",
227
+ height: "full",
227
228
  padding: "none",
228
229
  border: "0",
229
230
  background: "transparent",
230
- outline: "none",
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"). `boxed` sets each key in its own
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: "tight",
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"). `boxed` sets each key in its own
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; bare numbers would read as Panda's spacing scale, four times larger.
8
- // `section` is the gap between a page's sections, which tightens to the page gap on a phone.
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: "layout.tightGap" },
13
- "6": { gap: "menu.inset" },
14
- "8": { gap: "layout.controlGap" },
15
- "12": { gap: "layout.contentGap" },
16
- "16": { gap: "layout.clusterGap" },
17
- "20": { gap: "layout.pageGap" },
18
- "24": { gap: "layout.sectionGap" },
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: "none",
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: "100%", maxHeight: "100%", objectFit: "contain" },
54
+ "& > img": { maxWidth: "full", maxHeight: "full", objectFit: "contain" },
55
55
  "& > iframe": {
56
- width: "100%",
56
+ width: "full",
57
57
  maxWidth: "overlay.dialogWide",
58
- height: "100%",
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" },
@@ -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
- /** A log's heading over a group of its rows, such as a day's: "Today", then "Oct 6". */
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: "100%",
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 log's actor mark: a person's photo or initials, or an icon for an agent, a sync or a rule,
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: "panel.default",
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
- /** A log's heading over a group of its rows, such as a day's: "Today", then "Oct 6". */
138
- export function LogGroupHeader({ label, meta, className, ...props }) {
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",