@assure-one/design-system 1.42.0 → 1.43.1

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.
@@ -1,14 +1,14 @@
1
- import { slot, badgeAnatomy, stateAttributes, useDsMessages, deprecate, paginationAnatomy, Select, microInteractions, useFieldsetContext, useFieldControl, useControllableState, useMergedRefs, switchAnatomy, CONTROL_LABEL_TEXT, tableAnatomy, Pressable, FormBridge, CONTROL_SIZE_CLASSES, FileUpload, FileChip, Button, Tooltip, TooltipTrigger, TooltipContent, Avatar, Input, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuLabel, dataTableAnatomy, Checkbox, DocumentDetailPanel, DocumentDetailHeader, DocumentDetailTitle, DocumentDetailRequester, DocumentDetailMetaRow, DocumentDetailActions, DropdownMenuItem, DocumentList, DocumentRow, DocumentListSection, Textarea, DropdownMenuCheckboxItem, Popover, PopoverTrigger, PopoverContent, PopoverClose, DropdownMenuShortcut, useId as useId$1 } from './chunk-M2HMZ2RW.js';
2
- import { cn, ShieldIcon, UploadIcon, SendIcon, ChevronLeftIcon, MoreHorizontalIcon, ChevronRightIcon, ChevronUpIcon, ChevronDownIcon, ChevronsUpDownIcon, LockIcon, TrashIcon, HelpCircleIcon, ArrowRightIcon, CheckIcon, EyeIcon, FileTextIcon, CloseIcon, SparklesIcon, PlusIcon, SearchIcon, AlertTriangleIcon, FolderClosedIcon, CalendarIcon, PencilIcon, LockOpenIcon, FlagIcon, CheckCircleSolidIcon, DownloadIcon, XCircleSolidIcon, MessageCircleIcon, BellIcon, PaperclipIcon, UsersIcon, ClockIcon, PlayIcon, PauseIcon, StopIcon, SettingsIcon, Trash2Icon, FileIcon, SparkleIcon, MailIcon } from './chunk-AF3QYJ24.js';
1
+ import { slot, badgeAnatomy, stateAttributes, useDsMessages, deprecate, paginationAnatomy, Select, microInteractions, useFieldsetContext, useFieldControl, useControllableState, useFormReset2, useMergedRefs, switchAnatomy, CONTROL_LABEL_TEXT, tableAnatomy, Pressable, FormBridge, CONTROL_SIZE_CLASSES, FileUpload, FileChip, Button, Tooltip, TooltipTrigger, TooltipContent, Avatar, Input, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuSeparator, DropdownMenuLabel, dataTableAnatomy, Checkbox, DocumentDetailPanel, DocumentDetailHeader, DocumentDetailTitle, DocumentDetailRequester, DocumentDetailMetaRow, DocumentDetailActions, DropdownMenuItem, DocumentList, DocumentRow, DocumentListSection, Textarea, DropdownMenuCheckboxItem, Popover, PopoverTrigger, PopoverContent, PopoverClose, DropdownMenuShortcut, useId as useId$1 } from './chunk-VK6SW34V.js';
2
+ import { cn, ShieldIcon, UploadIcon, SendIcon, ChevronLeftIcon, MoreHorizontalIcon, ChevronRightIcon, ChevronUpIcon, ChevronDownIcon, ChevronsUpDownIcon, LockIcon, TrashIcon, HelpCircleIcon, ArrowRightIcon, CheckIcon, EyeIcon, FileTextIcon, CloseIcon, SparklesIcon, PlusIcon, SearchIcon, AlertTriangleIcon, FolderClosedIcon, CalendarIcon, PencilIcon, LockOpenIcon, FlagIcon, CheckCircleSolidIcon, DownloadIcon, XCircleSolidIcon, MessageCircleIcon, BellIcon, PaperclipIcon, UsersIcon, ClockIcon, PlayIcon, PauseIcon, StopIcon, SettingsIcon, Trash2Icon, FileIcon, SparkleIcon, MailIcon } from './chunk-TBDTXAFH.js';
3
3
  import { clsx } from 'clsx';
4
- import * as React4 from 'react';
4
+ import * as React2 from 'react';
5
5
  import { forwardRef, useMemo, createContext, useRef, useContext, useState, useCallback, useEffect, useId } from 'react';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
7
7
  import { cva } from 'class-variance-authority';
8
8
  import * as ProgressPrimitive from '@radix-ui/react-progress';
9
9
  import * as SwitchPrimitive from '@radix-ui/react-switch';
10
- import * as TabsPrimitive from '@radix-ui/react-tabs';
11
10
  import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';
11
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
12
12
 
13
13
  var LEGACY_PAIRS = {
14
14
  default: { variant: "solid", intent: "brand" },
@@ -84,7 +84,7 @@ function badgeVariants({
84
84
  } = {}) {
85
85
  const pair = resolveBadgeAppearance({ variant, intent });
86
86
  return clsx(
87
- "ds:inline-flex ds:items-center ds:gap-1 ds:tabular-nums",
87
+ "ds:inline-flex ds:items-center ds:gap-1 ds:whitespace-nowrap ds:tabular-nums",
88
88
  SHAPE[shape ?? "legacy"],
89
89
  "ds:border ds:font-medium",
90
90
  APPEARANCE[pair.variant][pair.intent],
@@ -116,7 +116,7 @@ var Badge = forwardRef(function Badge2({ variant, intent, size, shape, dot, icon
116
116
  "span",
117
117
  {
118
118
  ...slot(badgeAnatomy, "icon"),
119
- className: "ds:inline-flex ds:size-3.5 ds:shrink-0",
119
+ className: "ds:inline-flex ds:size-3.5 ds:shrink-0 ds:items-center ds:justify-center ds:[&>svg]:max-h-full ds:[&>svg]:max-w-full",
120
120
  "aria-hidden": "true",
121
121
  children: icon
122
122
  }
@@ -172,7 +172,14 @@ var categoryTagVariants = cva(
172
172
  );
173
173
  var CategoryTag = forwardRef(function CategoryTag2({ label, icon, tone, className, ...props }, ref) {
174
174
  return /* @__PURE__ */ jsxs("span", { ref, className: cn(categoryTagVariants({ tone }), className), ...props, children: [
175
- icon && /* @__PURE__ */ jsx("span", { className: "ds:inline-flex ds:size-3.5 ds:shrink-0", "aria-hidden": "true", children: icon }),
175
+ icon && /* @__PURE__ */ jsx(
176
+ "span",
177
+ {
178
+ className: "ds:inline-flex ds:size-3.5 ds:shrink-0 ds:items-center ds:justify-center ds:[&>svg]:max-h-full ds:[&>svg]:max-w-full",
179
+ "aria-hidden": "true",
180
+ children: icon
181
+ }
182
+ ),
176
183
  label
177
184
  ] });
178
185
  });
@@ -250,6 +257,49 @@ var DocumentsWorkspaceLayout = forwardRef(function DocumentsWorkspaceLayout2({ c
250
257
  );
251
258
  });
252
259
  DocumentsWorkspaceLayout.displayName = "DocumentsWorkspaceLayout";
260
+ var SKELETON_SURFACE = cn(
261
+ "skeleton ds:bg-skeleton ds:relative ds:overflow-hidden",
262
+ "ds:after:absolute ds:after:inset-0 ds:after:-translate-x-full",
263
+ "ds:after:bg-[linear-gradient(90deg,transparent,var(--color-skeleton-sheen),transparent)]",
264
+ "ds:motion-safe:after:animate-skeleton-shimmer"
265
+ );
266
+ var Skeleton = forwardRef(function Skeleton2({ className, ...props }, ref) {
267
+ return /* @__PURE__ */ jsx(
268
+ "div",
269
+ {
270
+ ref,
271
+ className: cn(SKELETON_SURFACE, "ds:rounded-icon", className),
272
+ "aria-hidden": "true",
273
+ ...props
274
+ }
275
+ );
276
+ });
277
+ Skeleton.displayName = "Skeleton";
278
+ var SkeletonText = forwardRef(function SkeletonText2({ lines = 3, className, ...props }, ref) {
279
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("ds:space-y-2", className), "aria-hidden": "true", ...props, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
280
+ "div",
281
+ {
282
+ className: cn(SKELETON_SURFACE, "ds:rounded-icon ds:h-4", i === lines - 1 && "ds:w-3/4")
283
+ },
284
+ i
285
+ )) });
286
+ });
287
+ SkeletonText.displayName = "SkeletonText";
288
+ var SkeletonCircle = forwardRef(
289
+ function SkeletonCircle2({ size = 40, className, ...props }, ref) {
290
+ return /* @__PURE__ */ jsx(
291
+ "div",
292
+ {
293
+ ref,
294
+ className: cn(SKELETON_SURFACE, "ds:rounded-full", className),
295
+ style: { width: size, height: size },
296
+ "aria-hidden": "true",
297
+ ...props
298
+ }
299
+ );
300
+ }
301
+ );
302
+ SkeletonCircle.displayName = "SkeletonCircle";
253
303
  function getPageNumbers(current, total, siblings) {
254
304
  const range = (start, end) => Array.from({ length: end - start + 1 }, (_, i) => start + i);
255
305
  const totalSlots = siblings * 2 + 5;
@@ -271,7 +321,8 @@ function getPageNumbers(current, total, siblings) {
271
321
  var NAV_BUTTON = cn(
272
322
  "ds:inline-flex ds:size-7 ds:items-center ds:justify-center ds:rounded-btn ds:text-fg-3",
273
323
  "ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none",
274
- "ds:hover:bg-surface-hover ds:hover:text-fg",
324
+ // Pressed takes the control press wash (Polish 2 §3.7, as ghost buttons do).
325
+ "ds:hover:bg-surface-hover ds:hover:text-fg ds:active:bg-control-active-bg",
275
326
  "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
276
327
  "ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:text-fg-disabled"
277
328
  );
@@ -338,7 +389,7 @@ var Pagination = forwardRef(function Pagination2({
338
389
  ref,
339
390
  "aria-label": messages.region(currentPage, totalPages),
340
391
  ...slot(paginationAnatomy, "root"),
341
- className: cn("ds:flex ds:items-center ds:justify-between ds:gap-4", className),
392
+ className: cn("ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-x-4 ds:gap-y-2", className),
342
393
  ...props,
343
394
  children: [
344
395
  /* @__PURE__ */ jsx(
@@ -370,7 +421,7 @@ var Pagination = forwardRef(function Pagination2({
370
421
  ]
371
422
  }
372
423
  ),
373
- /* @__PURE__ */ jsxs("div", { ...slot(paginationAnatomy, "pages"), className: "ds:flex ds:items-center ds:gap-0.5", children: [
424
+ /* @__PURE__ */ jsxs("div", { ...slot(paginationAnatomy, "pages"), className: "ds:flex ds:items-center ds:gap-0.5 ds:max-sm:ml-auto", children: [
374
425
  /* @__PURE__ */ jsx(
375
426
  "button",
376
427
  {
@@ -404,7 +455,7 @@ var Pagination = forwardRef(function Pagination2({
404
455
  ...stateAttributes({ selected: page === currentPage }),
405
456
  className: cn(
406
457
  PAGE_BUTTON_BASE,
407
- page === currentPage ? "ds:bg-accent-tint ds:text-accent-2 ds:border ds:border-[color:var(--color-accent-tint)]" : "ds:text-fg-3 ds:hover:bg-surface-hover ds:hover:text-fg"
458
+ page === currentPage ? "ds:bg-accent-tint ds:text-accent-2 ds:border ds:border-[color:var(--color-accent-tint)]" : "ds:text-fg-3 ds:hover:bg-surface-hover ds:hover:text-fg ds:active:bg-control-active-bg"
408
459
  ),
409
460
  children: page
410
461
  },
@@ -855,19 +906,6 @@ var StatusPill = forwardRef(function StatusPill2({ status, dot = true, children,
855
906
  return /* @__PURE__ */ jsx(Badge, { ref, variant, dot, ...props, children: children ?? label });
856
907
  });
857
908
  StatusPill.displayName = "StatusPill";
858
- function useFormReset(elementRef, onReset, form) {
859
- const latest = useRef(onReset);
860
- latest.current = onReset;
861
- useEffect(() => {
862
- const element = elementRef.current;
863
- if (!element) return;
864
- const owner = form ? element.ownerDocument.getElementById(form) : element.closest("form");
865
- if (!owner) return;
866
- const handle = () => latest.current?.();
867
- owner.addEventListener("reset", handle);
868
- return () => owner.removeEventListener("reset", handle);
869
- }, [elementRef, form]);
870
- }
871
909
  var switchVariants = cva(
872
910
  [
873
911
  "ds:peer ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center ds:rounded-full ds:border ds:border-transparent",
@@ -910,7 +948,7 @@ var switchThumbVariants = cva(
910
948
  }
911
949
  }
912
950
  );
913
- var Switch = React4.forwardRef(
951
+ var Switch = React2.forwardRef(
914
952
  function Switch2({
915
953
  label,
916
954
  size,
@@ -944,9 +982,9 @@ var Switch = React4.forwardRef(
944
982
  defaultProp: defaultChecked ?? false,
945
983
  onChange: onCheckedChange
946
984
  });
947
- const initialChecked = React4.useRef(checkedProp ?? defaultChecked ?? false);
948
- const rootRef = React4.useRef(null);
949
- useFormReset(rootRef, () => setChecked(initialChecked.current), form);
985
+ const initialChecked = React2.useRef(checkedProp ?? defaultChecked ?? false);
986
+ const rootRef = React2.useRef(null);
987
+ useFormReset2(rootRef, () => setChecked(initialChecked.current), form);
950
988
  const mergedRef = useMergedRefs(ref, rootRef);
951
989
  const root = /* @__PURE__ */ jsx(
952
990
  SwitchPrimitive.Root,
@@ -1273,138 +1311,14 @@ var TableCaption = forwardRef(
1273
1311
  }
1274
1312
  );
1275
1313
  TableCaption.displayName = "TableCaption";
1276
- var Tabs = React4.forwardRef(
1277
- function Tabs2({ className, ...props }, ref) {
1278
- return /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, className: cn(className), ...props });
1279
- }
1314
+ var SELECTED_STATE_CLASSES = "ds:data-[state=on]:bg-brand-bg ds:data-[state=on]:text-brand ds:aria-checked:bg-brand-bg ds:aria-checked:text-brand ds:aria-pressed:bg-brand-bg ds:aria-pressed:text-brand";
1315
+ var SEGMENTED_ITEM_CLASSES = cn(
1316
+ "ds:rounded-control",
1317
+ "ds:not-aria-checked:not-aria-pressed:hover:bg-transparent ds:not-aria-checked:not-aria-pressed:hover:text-fg-2",
1318
+ "ds:data-[state=on]:bg-surface ds:data-[state=on]:text-fg ds:data-[state=on]:shadow-quiet",
1319
+ "ds:aria-checked:bg-surface ds:aria-checked:text-fg ds:aria-checked:shadow-quiet ds:aria-checked:hover:bg-surface ds:aria-checked:hover:text-fg",
1320
+ "ds:aria-pressed:bg-surface ds:aria-pressed:text-fg ds:aria-pressed:shadow-quiet ds:aria-pressed:hover:bg-surface ds:aria-pressed:hover:text-fg"
1280
1321
  );
1281
- Tabs.displayName = TabsPrimitive.Root.displayName;
1282
- var TabsList = React4.forwardRef(function TabsList2({ className, ...props }, ref) {
1283
- return /* @__PURE__ */ jsx(
1284
- TabsPrimitive.List,
1285
- {
1286
- ref,
1287
- className: cn("ds:border-rule ds:flex ds:items-center ds:gap-0 ds:border-b", className),
1288
- ...props
1289
- }
1290
- );
1291
- });
1292
- TabsList.displayName = TabsPrimitive.List.displayName;
1293
- var triggerVariants = cva(
1294
- cn(
1295
- "ds:inline-flex ds:items-center ds:justify-center ds:gap-2 ds:text-(length:--control-font-size-md) ds:font-medium",
1296
- "ds:text-fg-3",
1297
- microInteractions.selection,
1298
- "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1299
- "ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:text-fg-disabled",
1300
- "ds:hover:text-fg"
1301
- ),
1302
- {
1303
- variants: {
1304
- variant: {
1305
- // §5.16: tab current = 2px accent underline + bold foreground text.
1306
- // The cyan rule carries the brand statement (tabs are interaction,
1307
- // so cyan; Pro purple is reserved for selection state on
1308
- // list/dropdown surfaces). The active LABEL stays in `text-fg` for
1309
- // legibility — accent on text was too low-contrast against the page
1310
- // background, especially in dark mode.
1311
- underline: cn(
1312
- "ds:rounded-none ds:bg-transparent ds:px-3.5 ds:py-2.5",
1313
- "ds:border-b-2 ds:border-transparent ds:-mb-px",
1314
- "ds:data-[state=active]:border-accent ds:data-[state=active]:text-fg ds:data-[state=active]:font-semibold"
1315
- ),
1316
- pill: cn(
1317
- "ds:rounded-pill ds:px-3 ds:py-1.5",
1318
- "ds:data-[state=active]:bg-brand-bg ds:data-[state=active]:text-brand"
1319
- )
1320
- }
1321
- },
1322
- defaultVariants: {
1323
- variant: "underline"
1324
- }
1325
- }
1326
- );
1327
- var TabsTrigger = React4.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
1328
- return /* @__PURE__ */ jsx(
1329
- TabsPrimitive.Trigger,
1330
- {
1331
- ref,
1332
- className: cn(triggerVariants({ variant }), className),
1333
- ...props
1334
- }
1335
- );
1336
- });
1337
- TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
1338
- var TabsContent = React4.forwardRef(function TabsContent2({ className, ...props }, ref) {
1339
- return /* @__PURE__ */ jsx(
1340
- TabsPrimitive.Content,
1341
- {
1342
- ref,
1343
- className: cn(
1344
- "ds:mt-3 ds:focus-visible:outline-none",
1345
- "ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1346
- className
1347
- ),
1348
- ...props
1349
- }
1350
- );
1351
- });
1352
- TabsContent.displayName = TabsPrimitive.Content.displayName;
1353
- var UNASSIGNED_VALUE = "__unassigned__";
1354
- function TeamMemberSelect({
1355
- teamMembers,
1356
- currentUserId,
1357
- value,
1358
- onValueChange,
1359
- includeUnassigned = true,
1360
- placeholder = "Select team member...",
1361
- className,
1362
- size
1363
- }) {
1364
- const options = React4.useMemo(() => {
1365
- const meBadge = /* @__PURE__ */ jsx(
1366
- Badge,
1367
- {
1368
- variant: "secondary",
1369
- size: "sm",
1370
- className: "ds:px-1.5 ds:py-0 ds:font-mono ds:text-[10px] ds:tracking-wider ds:uppercase",
1371
- children: "Me"
1372
- }
1373
- );
1374
- const sorted = [...teamMembers].sort((a, b) => {
1375
- if (currentUserId) {
1376
- if (a.id === currentUserId) return -1;
1377
- if (b.id === currentUserId) return 1;
1378
- }
1379
- return a.fullName.localeCompare(b.fullName);
1380
- });
1381
- const memberOptions = sorted.map((m) => ({
1382
- value: m.id,
1383
- label: m.fullName,
1384
- labelSuffix: m.id === currentUserId ? meBadge : void 0
1385
- }));
1386
- if (includeUnassigned) {
1387
- return [{ value: UNASSIGNED_VALUE, label: "Unassigned" }, ...memberOptions];
1388
- }
1389
- return memberOptions;
1390
- }, [teamMembers, currentUserId, includeUnassigned]);
1391
- const innerValue = value === "" ? UNASSIGNED_VALUE : value;
1392
- const handleChange = (next) => {
1393
- onValueChange(next === UNASSIGNED_VALUE ? "" : next);
1394
- };
1395
- return /* @__PURE__ */ jsx(
1396
- Select,
1397
- {
1398
- options,
1399
- value: innerValue,
1400
- onValueChange: handleChange,
1401
- placeholder,
1402
- className,
1403
- size
1404
- }
1405
- );
1406
- }
1407
- TeamMemberSelect.displayName = "TeamMemberSelect";
1408
1322
  var itemVariants = cva(
1409
1323
  cn(
1410
1324
  "ds:inline-flex ds:items-center ds:justify-center ds:rounded-pill ds:px-3 ds:py-1.5 ds:text-(length:--control-font-size-md) ds:font-medium",
@@ -1413,13 +1327,14 @@ var itemVariants = cva(
1413
1327
  "ds:hover:bg-surface-hover ds:hover:text-fg",
1414
1328
  "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1415
1329
  "ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:bg-bg-disabled ds:disabled:text-fg-disabled",
1416
- "ds:data-[state=on]:bg-brand-bg ds:data-[state=on]:text-brand"
1330
+ SELECTED_STATE_CLASSES
1417
1331
  ),
1418
1332
  {
1419
1333
  variants: {
1420
1334
  variant: {
1421
1335
  default: "",
1422
- outline: "ds:border ds:border-rule-strong ds:bg-surface"
1336
+ outline: "ds:border ds:border-rule-strong ds:bg-surface",
1337
+ segmented: SEGMENTED_ITEM_CLASSES
1423
1338
  }
1424
1339
  },
1425
1340
  defaultVariants: {
@@ -1435,13 +1350,14 @@ var sizedItemVariants = cva(
1435
1350
  "ds:hover:bg-surface-hover ds:hover:text-fg",
1436
1351
  "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1437
1352
  "ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:bg-bg-disabled ds:disabled:text-fg-disabled",
1438
- "ds:data-[state=on]:bg-brand-bg ds:data-[state=on]:text-brand"
1353
+ SELECTED_STATE_CLASSES
1439
1354
  ),
1440
1355
  {
1441
1356
  variants: {
1442
1357
  variant: {
1443
1358
  default: "",
1444
- outline: "ds:border ds:border-rule-strong ds:bg-surface"
1359
+ outline: "ds:border ds:border-rule-strong ds:bg-surface",
1360
+ segmented: SEGMENTED_ITEM_CLASSES
1445
1361
  }
1446
1362
  },
1447
1363
  defaultVariants: {
@@ -1449,11 +1365,11 @@ var sizedItemVariants = cva(
1449
1365
  }
1450
1366
  }
1451
1367
  );
1452
- var ToggleGroupContext = React4.createContext({
1368
+ var ToggleGroupContext = React2.createContext({
1453
1369
  variant: "default",
1454
1370
  size: void 0
1455
1371
  });
1456
- var ToggleGroup = React4.forwardRef(function ToggleGroup2({
1372
+ var ToggleGroup = React2.forwardRef(function ToggleGroup2({
1457
1373
  className,
1458
1374
  variant,
1459
1375
  size,
@@ -1495,11 +1411,11 @@ var ToggleGroup = React4.forwardRef(function ToggleGroup2({
1495
1411
  defaultProp: defaultValue ?? emptyValue,
1496
1412
  onChange: onValueChange
1497
1413
  });
1498
- const initialValue = React4.useRef(valueProp ?? defaultValue ?? emptyValue);
1499
- const rootRef = React4.useRef(null);
1414
+ const initialValue = React2.useRef(valueProp ?? defaultValue ?? emptyValue);
1415
+ const rootRef = React2.useRef(null);
1500
1416
  const mergedRef = useMergedRefs(ref, rootRef);
1501
1417
  const labelledBy = wiring["aria-labelledby"] ?? (fieldset?.legendMounted ? fieldset.legendId : void 0);
1502
- const context = React4.useMemo(() => ({ variant, size }), [variant, size]);
1418
+ const context = React2.useMemo(() => ({ variant, size }), [variant, size]);
1503
1419
  const radixProps = {
1504
1420
  ...props,
1505
1421
  type,
@@ -1518,7 +1434,14 @@ var ToggleGroup = React4.forwardRef(function ToggleGroup2({
1518
1434
  "aria-invalid": ariaInvalid ?? wiring["aria-invalid"],
1519
1435
  "data-invalid": wiring["data-invalid"],
1520
1436
  ...size ? stateAttributes({ size }) : void 0,
1521
- className: cn("ds:inline-flex ds:items-center ds:gap-1", className),
1437
+ className: cn(
1438
+ "ds:inline-flex ds:items-center ds:gap-1",
1439
+ // The `segmented` track: quiet surface-sunken well, hairline
1440
+ // rule-soft border, control radius, 2px inset padding for the
1441
+ // thumb to sit inside. Matches `TabsList`'s own `segmented` track.
1442
+ variant === "segmented" && "ds:bg-surface-2 ds:rounded-control ds:border-rule-soft ds:gap-0.5 ds:border ds:p-0.5",
1443
+ className
1444
+ ),
1522
1445
  ...radixProps,
1523
1446
  children: /* @__PURE__ */ jsx(ToggleGroupContext.Provider, { value: context, children })
1524
1447
  }
@@ -1539,8 +1462,8 @@ var ToggleGroup = React4.forwardRef(function ToggleGroup2({
1539
1462
  ] });
1540
1463
  });
1541
1464
  ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
1542
- var ToggleGroupItem = React4.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
1543
- const ctx = React4.useContext(ToggleGroupContext);
1465
+ var ToggleGroupItem = React2.forwardRef(function ToggleGroupItem2({ className, variant, ...props }, ref) {
1466
+ const ctx = React2.useContext(ToggleGroupContext);
1544
1467
  const resolvedVariant = variant ?? ctx.variant;
1545
1468
  return /* @__PURE__ */ jsx(
1546
1469
  ToggleGroupPrimitive.Item,
@@ -1555,6 +1478,162 @@ var ToggleGroupItem = React4.forwardRef(function ToggleGroupItem2({ className, v
1555
1478
  );
1556
1479
  });
1557
1480
  ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
1481
+ var Tabs = React2.forwardRef(
1482
+ function Tabs2({ className, ...props }, ref) {
1483
+ return /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, className: cn(className), ...props });
1484
+ }
1485
+ );
1486
+ Tabs.displayName = TabsPrimitive.Root.displayName;
1487
+ var TabsList = React2.forwardRef(function TabsList2({ className, variant = "default", ...props }, ref) {
1488
+ return /* @__PURE__ */ jsx(
1489
+ TabsPrimitive.List,
1490
+ {
1491
+ ref,
1492
+ className: cn(
1493
+ "ds:flex ds:items-center",
1494
+ variant === "segmented" ? (
1495
+ // A track, not a row: hugs its segments (inline-flex + w-fit)
1496
+ // instead of stretching to the parent's width like the flush
1497
+ // underline row does. A consumer's own width class (passed via
1498
+ // `className`, after this in the merge) still wins.
1499
+ "ds:inline-flex ds:w-fit ds:rounded-control ds:border-rule-soft ds:bg-surface-2 ds:gap-0.5 ds:border ds:p-0.5"
1500
+ ) : "ds:border-rule ds:gap-0 ds:border-b",
1501
+ className
1502
+ ),
1503
+ ...props
1504
+ }
1505
+ );
1506
+ });
1507
+ TabsList.displayName = TabsPrimitive.List.displayName;
1508
+ var triggerVariants = cva(
1509
+ cn(
1510
+ "ds:inline-flex ds:items-center ds:justify-center ds:gap-2 ds:text-(length:--control-font-size-md) ds:font-medium",
1511
+ "ds:text-fg-3",
1512
+ microInteractions.selection,
1513
+ "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1514
+ "ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:text-fg-disabled",
1515
+ "ds:hover:text-fg"
1516
+ ),
1517
+ {
1518
+ variants: {
1519
+ variant: {
1520
+ // §5.16: tab current = 2px accent underline + bold foreground text.
1521
+ // The cyan rule carries the brand statement (tabs are interaction,
1522
+ // so cyan; Pro purple is reserved for selection state on
1523
+ // list/dropdown surfaces). The active LABEL stays in `text-fg` for
1524
+ // legibility — accent on text was too low-contrast against the page
1525
+ // background, especially in dark mode.
1526
+ underline: cn(
1527
+ "ds:rounded-none ds:bg-transparent ds:px-3.5 ds:py-2.5",
1528
+ "ds:border-b-2 ds:border-transparent ds:-mb-px",
1529
+ "ds:data-[state=active]:border-accent ds:data-[state=active]:text-fg ds:data-[state=active]:font-semibold",
1530
+ "ds:aria-selected:border-accent ds:aria-selected:text-fg ds:aria-selected:font-semibold"
1531
+ ),
1532
+ pill: cn(
1533
+ "ds:rounded-pill ds:px-3 ds:py-1.5",
1534
+ "ds:data-[state=active]:bg-brand-bg ds:data-[state=active]:text-brand",
1535
+ "ds:aria-selected:bg-brand-bg ds:aria-selected:text-brand"
1536
+ ),
1537
+ // The `TabsList variant="segmented"` track's thumb: a raised
1538
+ // `surface` tile (quiet shadow, full-ink `fg`) over quiet fg-3
1539
+ // labels that lift to fg-2 on hover. The hover rule is scoped to
1540
+ // `not-aria-selected` so it never competes by stylesheet order with
1541
+ // the thumb's own (higher-specificity, compound) hover rule below.
1542
+ segmented: cn(
1543
+ "ds:rounded-control ds:px-3 ds:py-1.5",
1544
+ "ds:not-aria-selected:hover:text-fg-2",
1545
+ "ds:data-[state=active]:bg-surface ds:data-[state=active]:text-fg ds:data-[state=active]:shadow-quiet ds:data-[state=active]:font-semibold",
1546
+ "ds:aria-selected:bg-surface ds:aria-selected:text-fg ds:aria-selected:shadow-quiet ds:aria-selected:font-semibold",
1547
+ "ds:aria-selected:hover:bg-surface ds:aria-selected:hover:text-fg"
1548
+ )
1549
+ }
1550
+ },
1551
+ defaultVariants: {
1552
+ variant: "underline"
1553
+ }
1554
+ }
1555
+ );
1556
+ var TabsTrigger = React2.forwardRef(function TabsTrigger2({ className, variant, ...props }, ref) {
1557
+ return /* @__PURE__ */ jsx(
1558
+ TabsPrimitive.Trigger,
1559
+ {
1560
+ ref,
1561
+ className: cn(triggerVariants({ variant }), className),
1562
+ ...props
1563
+ }
1564
+ );
1565
+ });
1566
+ TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
1567
+ var TabsContent = React2.forwardRef(function TabsContent2({ className, ...props }, ref) {
1568
+ return /* @__PURE__ */ jsx(
1569
+ TabsPrimitive.Content,
1570
+ {
1571
+ ref,
1572
+ className: cn(
1573
+ "ds:mt-3 ds:focus-visible:outline-none",
1574
+ "ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
1575
+ className
1576
+ ),
1577
+ ...props
1578
+ }
1579
+ );
1580
+ });
1581
+ TabsContent.displayName = TabsPrimitive.Content.displayName;
1582
+ var UNASSIGNED_VALUE = "__unassigned__";
1583
+ function TeamMemberSelect({
1584
+ teamMembers,
1585
+ currentUserId,
1586
+ value,
1587
+ onValueChange,
1588
+ includeUnassigned = true,
1589
+ placeholder = "Select team member...",
1590
+ className,
1591
+ size
1592
+ }) {
1593
+ const options = React2.useMemo(() => {
1594
+ const meBadge = /* @__PURE__ */ jsx(
1595
+ Badge,
1596
+ {
1597
+ variant: "secondary",
1598
+ size: "sm",
1599
+ className: "ds:px-1.5 ds:py-0 ds:font-mono ds:text-[10px] ds:tracking-wider ds:uppercase",
1600
+ children: "Me"
1601
+ }
1602
+ );
1603
+ const sorted = [...teamMembers].sort((a, b) => {
1604
+ if (currentUserId) {
1605
+ if (a.id === currentUserId) return -1;
1606
+ if (b.id === currentUserId) return 1;
1607
+ }
1608
+ return a.fullName.localeCompare(b.fullName);
1609
+ });
1610
+ const memberOptions = sorted.map((m) => ({
1611
+ value: m.id,
1612
+ label: m.fullName,
1613
+ labelSuffix: m.id === currentUserId ? meBadge : void 0
1614
+ }));
1615
+ if (includeUnassigned) {
1616
+ return [{ value: UNASSIGNED_VALUE, label: "Unassigned" }, ...memberOptions];
1617
+ }
1618
+ return memberOptions;
1619
+ }, [teamMembers, currentUserId, includeUnassigned]);
1620
+ const innerValue = value === "" ? UNASSIGNED_VALUE : value;
1621
+ const handleChange = (next) => {
1622
+ onValueChange(next === UNASSIGNED_VALUE ? "" : next);
1623
+ };
1624
+ return /* @__PURE__ */ jsx(
1625
+ Select,
1626
+ {
1627
+ options,
1628
+ value: innerValue,
1629
+ onValueChange: handleChange,
1630
+ placeholder,
1631
+ className,
1632
+ size
1633
+ }
1634
+ );
1635
+ }
1636
+ TeamMemberSelect.displayName = "TeamMemberSelect";
1558
1637
  var TONE_DOT = {
1559
1638
  brand: "ds:bg-brand",
1560
1639
  info: "ds:bg-accent-2",
@@ -1582,7 +1661,7 @@ function ChannelTabs({ tabs, value, onChange, className, ...props }) {
1582
1661
  "aria-selected": active,
1583
1662
  onClick: () => onChange(tab.value),
1584
1663
  className: cn(
1585
- "ds:flex ds:items-center ds:gap-2 ds:rounded-md ds:border ds:px-3 ds:py-1.5 ds:text-sm ds:font-medium ds:transition-colors ds:motion-reduce:transition-none",
1664
+ "ds:flex ds:items-center ds:gap-2 ds:rounded-md ds:border ds:px-3 ds:py-1.5 ds:text-sm ds:font-medium ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
1586
1665
  "ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none",
1587
1666
  active ? "ds:border-brand ds:bg-brand/5 ds:text-brand" : "ds:border-transparent ds:text-fg-3 ds:hover:text-fg"
1588
1667
  ),
@@ -2522,7 +2601,7 @@ var DashGrid = forwardRef(function DashGrid2({ widgets, storageKey, onReorder, c
2522
2601
  setDragId(null);
2523
2602
  setOverId(null);
2524
2603
  },
2525
- className: "ds:absolute ds:top-3 ds:right-3 ds:z-[var(--z-base)] ds:flex ds:cursor-grab ds:touch-none ds:items-center ds:justify-center ds:rounded-[var(--radius-icon)] ds:p-1 ds:text-fg-4 ds:opacity-0 ds:transition-opacity ds:duration-[var(--duration-fast)] ds:hover:bg-surface-hover ds:hover:text-fg-2 ds:focus-visible:opacity-100 ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:active:cursor-grabbing ds:group-hover/dash:opacity-100 ds:motion-reduce:transition-none",
2604
+ className: "ds:absolute ds:top-3 ds:right-3 ds:z-[var(--z-base)] ds:flex ds:cursor-grab ds:touch-none ds:items-center ds:justify-center ds:rounded-[var(--radius-icon)] ds:p-1 ds:text-fg-4 ds:opacity-0 ds:transition-[opacity,background-color,color] ds:duration-[var(--duration-fast)] ds:ease-[var(--motion-ease-enter)] ds:hover:bg-surface-hover ds:hover:text-fg-2 ds:focus-visible:opacity-100 ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:active:cursor-grabbing ds:group-hover/dash:opacity-100 ds:motion-reduce:transition-none",
2526
2605
  children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "ds:grid ds:grid-cols-2 ds:gap-[3px]", children: Array.from({ length: 6 }, (_, i) => /* @__PURE__ */ jsx("span", { className: "ds:size-[3px] ds:rounded-full ds:bg-current" }, i)) })
2527
2606
  }
2528
2607
  ),
@@ -2724,13 +2803,17 @@ var ClientRailItem = forwardRef(
2724
2803
  // Layout
2725
2804
  "ds:relative ds:flex ds:w-full ds:items-center ds:gap-[11px] ds:border-b ds:border-rule ds:px-[14px] ds:py-[11px] ds:text-left",
2726
2805
  // Motion
2727
- "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
2806
+ "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
2728
2807
  // Cursor
2729
2808
  "ds:cursor-pointer",
2809
+ // Focus — an inset outline: rows stack edge to edge in the rail, so an
2810
+ // outer ring would be clipped by the neighbours (same as TableRow).
2811
+ "ds:focus-visible:outline-2 ds:focus-visible:-outline-offset-2 ds:focus-visible:outline-[var(--focus-ring-border)]",
2730
2812
  // State — hover only when not active to avoid override
2731
2813
  active ? "ds:bg-brand-bg" : "ds:hover:bg-surface-2",
2732
2814
  className
2733
2815
  ),
2816
+ "aria-current": active ? "true" : void 0,
2734
2817
  ...props,
2735
2818
  children: [
2736
2819
  active && /* @__PURE__ */ jsx(
@@ -2818,7 +2901,7 @@ function MetaText({
2818
2901
  if (presentValues.length === 0) {
2819
2902
  return null;
2820
2903
  }
2821
- return /* @__PURE__ */ jsx("div", { className, children: presentValues.map((value, index) => /* @__PURE__ */ jsxs(React4.Fragment, { children: [
2904
+ return /* @__PURE__ */ jsx("div", { className, children: presentValues.map((value, index) => /* @__PURE__ */ jsxs(React2.Fragment, { children: [
2822
2905
  index > 0 && /* @__PURE__ */ jsx(
2823
2906
  "span",
2824
2907
  {
@@ -2858,7 +2941,7 @@ function CheckboxSlot({
2858
2941
  {
2859
2942
  className: cn(
2860
2943
  "ds:shrink-0 ds:transition-opacity ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
2861
- selected ? "ds:opacity-100" : "ds:opacity-0 ds:group-hover:opacity-100",
2944
+ selected ? "ds:opacity-100" : "ds:opacity-0 ds:group-hover:opacity-100 ds:focus-within:opacity-100",
2862
2945
  className
2863
2946
  ),
2864
2947
  onClick: (event) => event.stopPropagation(),
@@ -2886,7 +2969,14 @@ function MoreActions({ menu }) {
2886
2969
  className: cn(
2887
2970
  "ds:grid ds:size-[30px] ds:place-items-center ds:rounded-[8px] ds:text-fg-4",
2888
2971
  "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
2889
- "ds:group-hover:text-fg-2 ds:hover:bg-surface ds:hover:text-brand ds:hover:shadow-flat"
2972
+ "ds:group-hover:text-fg-2 ds:hover:bg-surface ds:hover:text-brand ds:hover:shadow-flat",
2973
+ // `aria-expanded` twin of the `data-state` selector below: a
2974
+ // TooltipTrigger asChild ancestor can clobber this button's own
2975
+ // `data-state` with the tooltip's (see toggle-group.tsx's note
2976
+ // on the same bug), but never sets `aria-expanded`.
2977
+ "ds:data-[state=open]:bg-surface ds:data-[state=open]:text-brand ds:data-[state=open]:shadow-flat",
2978
+ "ds:aria-expanded:bg-surface ds:aria-expanded:text-brand ds:aria-expanded:shadow-flat",
2979
+ "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]"
2890
2980
  ),
2891
2981
  "aria-label": "More actions",
2892
2982
  onClick: (event) => event.stopPropagation(),
@@ -2896,7 +2986,7 @@ function MoreActions({ menu }) {
2896
2986
  /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", onClick: (event) => event.stopPropagation(), children: menu })
2897
2987
  ] });
2898
2988
  }
2899
- var DocumentFileRow = React4.forwardRef(
2989
+ var DocumentFileRow = React2.forwardRef(
2900
2990
  function DocumentFileRow2({
2901
2991
  name,
2902
2992
  fileType,
@@ -2963,7 +3053,7 @@ var DocumentFileRow = React4.forwardRef(
2963
3053
  }
2964
3054
  );
2965
3055
  DocumentFileRow.displayName = "DocumentFileRow";
2966
- var DocumentFileCard = React4.forwardRef(
3056
+ var DocumentFileCard = React2.forwardRef(
2967
3057
  function DocumentFileCard2({
2968
3058
  name,
2969
3059
  fileType,
@@ -3039,7 +3129,7 @@ var lineCaptionToneClass = {
3039
3129
  warning: "ds:text-warning-fg",
3040
3130
  danger: "ds:text-danger-fg"
3041
3131
  };
3042
- var DocumentFileLine = React4.forwardRef(
3132
+ var DocumentFileLine = React2.forwardRef(
3043
3133
  function DocumentFileLine2({
3044
3134
  name,
3045
3135
  fileType = "",
@@ -3167,7 +3257,7 @@ function ChecklistItemRow({ item }) {
3167
3257
  "div",
3168
3258
  {
3169
3259
  className: cn(
3170
- "ds:rounded-xl ds:border ds:px-3.5 ds:py-2.5 ds:shadow-quiet ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
3260
+ "ds:rounded-xl ds:border ds:px-3.5 ds:py-2.5 ds:shadow-quiet ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
3171
3261
  done ? "ds:border-success-line/70 ds:bg-success-bg/30" : item.status === "in-review" ? "ds:border-warning-line/70 ds:bg-warning-bg/25" : "ds:border-rule ds:bg-surface"
3172
3262
  ),
3173
3263
  children: [
@@ -3213,7 +3303,7 @@ function FileGroup({ files }) {
3213
3303
  file.id
3214
3304
  )) });
3215
3305
  }
3216
- var DocumentChecklist = React4.forwardRef(
3306
+ var DocumentChecklist = React2.forwardRef(
3217
3307
  function DocumentChecklist2({
3218
3308
  items,
3219
3309
  title = "Your documents",
@@ -3319,7 +3409,7 @@ var DocumentRequestField = forwardRef(
3319
3409
  className: cn(
3320
3410
  "ds:ml-auto ds:size-[26px] ds:rounded-[7px] ds:grid ds:place-items-center",
3321
3411
  "ds:text-fg-4",
3322
- "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
3412
+ "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
3323
3413
  "ds:hover:bg-danger-bg ds:hover:text-danger-fg",
3324
3414
  "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]"
3325
3415
  ),
@@ -3480,9 +3570,10 @@ var DataTable = forwardRef(function DataTable2({ withToolbar, className, childre
3480
3570
  className: cn(
3481
3571
  // Outer frame on the whole component: a single visible border +
3482
3572
  // quiet shadow wrapping the toolbar (if any) and the table as one
3483
- // card. overflow-hidden clips the header/cell backgrounds to the
3484
- // rounded corners.
3485
- "ds:w-full ds:overflow-hidden ds:rounded-card ds:border ds:border-rule-strong ds:bg-surface ds:shadow-quiet",
3573
+ // card. The overflow clips the header/cell backgrounds to the
3574
+ // rounded corners; a table wider than the card scrolls sideways
3575
+ // inside it instead of being cut off (the toolbar stays put).
3576
+ "ds:w-full ds:overflow-x-auto ds:overflow-y-hidden ds:rounded-card ds:border ds:border-rule-strong ds:bg-surface ds:shadow-quiet",
3486
3577
  "ds:[&_table]:bg-surface ds:[&_table]:w-full ds:[&_table]:border-collapse",
3487
3578
  className
3488
3579
  ),
@@ -3500,8 +3591,10 @@ var DataTableToolbar = forwardRef(
3500
3591
  ref,
3501
3592
  ...slot(dataTableAnatomy, "toolbar"),
3502
3593
  className: cn(
3503
- "ds:flex ds:items-center ds:gap-2 ds:px-3 ds:py-2.5",
3594
+ "ds:flex ds:flex-wrap ds:items-center ds:gap-2 ds:px-3 ds:py-2.5",
3504
3595
  "ds:border-rule ds:bg-surface ds:border-b",
3596
+ // Pinned to the card's left edge while a wide table scrolls.
3597
+ "ds:sticky ds:left-0",
3505
3598
  className
3506
3599
  ),
3507
3600
  ...props
@@ -3522,7 +3615,8 @@ var DataTableSearch = forwardRef(
3522
3615
  inputSize: "sm",
3523
3616
  placeholder,
3524
3617
  prefixIcon: /* @__PURE__ */ jsx(SearchIcon, { "aria-hidden": "true" }),
3525
- className: cn("ds:w-[280px]", className),
3618
+ rootClassName: "ds:w-auto ds:min-w-0 ds:max-w-full ds:shrink",
3619
+ className: cn("ds:w-[280px] ds:max-w-full", className),
3526
3620
  ...props
3527
3621
  }
3528
3622
  );
@@ -3689,7 +3783,10 @@ var DataTableCellId = forwardRef(
3689
3783
  ref,
3690
3784
  ...slot(dataTableAnatomy, "cell"),
3691
3785
  ...stateAttributes({ variant: "id" }),
3692
- className: cn("ds:font-sans ds:text-fg-4 ds:text-xs ds:tabular-nums", className),
3786
+ className: cn(
3787
+ "ds:font-sans ds:text-fg-4 ds:text-xs ds:whitespace-nowrap ds:tabular-nums",
3788
+ className
3789
+ ),
3693
3790
  ...props
3694
3791
  }
3695
3792
  );
@@ -3715,7 +3812,7 @@ var DataTableCellDue = forwardRef(
3715
3812
  "data-due-state": ariaState,
3716
3813
  ...slot(dataTableAnatomy, "cell"),
3717
3814
  ...stateAttributes({ variant: "due" }),
3718
- className: cn("ds:font-sans ds:tabular-nums", tone, className),
3815
+ className: cn("ds:font-sans ds:whitespace-nowrap ds:tabular-nums", tone, className),
3719
3816
  ...props,
3720
3817
  children: children ?? dueDateFormatter.format(value)
3721
3818
  }
@@ -4021,7 +4118,7 @@ function StagePill({
4021
4118
  "span",
4022
4119
  {
4023
4120
  className: cn(
4024
- "ds:inline-flex ds:items-center ds:gap-1.5 ds:rounded-pill ds:px-2 ds:py-0.5 ds:text-xs ds:font-medium",
4121
+ "ds:inline-flex ds:items-center ds:gap-1.5 ds:whitespace-nowrap ds:rounded-pill ds:px-2 ds:py-0.5 ds:text-xs ds:font-medium",
4025
4122
  toneClass[tone]
4026
4123
  ),
4027
4124
  children: [
@@ -4563,7 +4660,7 @@ function AssigneePicker({
4563
4660
  {
4564
4661
  type: "button",
4565
4662
  "aria-label": "Edit assignees",
4566
- className: "ds:rounded-pill ds:border-rule ds:hover:bg-overlay-hover ds:inline-flex ds:items-center ds:gap-2 ds:border ds:py-1 ds:pr-2.5 ds:pl-1.5 ds:transition-colors ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none",
4663
+ className: "ds:rounded-pill ds:border-rule ds:hover:bg-overlay-hover ds:active:bg-overlay-active ds:inline-flex ds:items-center ds:gap-2 ds:border ds:py-1 ds:pr-2.5 ds:pl-1.5 ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none",
4567
4664
  children: [
4568
4665
  stack,
4569
4666
  /* @__PURE__ */ jsx("span", { className: "ds:text-fg-2 ds:text-sm ds:font-semibold ds:tabular-nums tabular-nums", children: selected.length }),
@@ -4792,6 +4889,7 @@ function useStopwatch() {
4792
4889
  }, [setPhase]);
4793
4890
  return { phase, elapsedMs, isRunning: phase === "running", start, pause, resume, stop, reset };
4794
4891
  }
4892
+ var FOCUSED_INPUT_ROW = "ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none ds:has-[input:focus-visible:not([readonly])]:bg-surface-2";
4795
4893
  var TimeLogger = forwardRef(function TimeLogger2({ className, orientation = "vertical", children, ...props }, ref) {
4796
4894
  return /* @__PURE__ */ jsx(
4797
4895
  "div",
@@ -4878,7 +4976,7 @@ var TimeLoggerContextRow = forwardRef(
4878
4976
  {
4879
4977
  type: "button",
4880
4978
  onClick: onClientSelect,
4881
- className: "ds:rounded-btn ds:hover:bg-surface-2 ds:focus-visible:bg-surface-2 ds:-m-1 ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2.5 ds:p-1 ds:text-left ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none",
4979
+ className: "ds:rounded-btn ds:hover:bg-surface-2 ds:focus-visible:bg-surface-2 ds:active:bg-control-active-bg ds:-m-1 ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2.5 ds:p-1 ds:text-left ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none",
4882
4980
  children: [
4883
4981
  avatar,
4884
4982
  text
@@ -4917,6 +5015,9 @@ var TimeLoggerTimer = forwardRef(
4917
5015
  ref,
4918
5016
  className: cn(
4919
5017
  "ds:border-rule-soft ds:flex ds:items-center ds:gap-2.5 ds:border-t ds:px-4 ds:py-4",
5018
+ // The bare input has no chrome of its own; tint its row while it
5019
+ // has keyboard focus so the focus is visible beyond the caret.
5020
+ FOCUSED_INPUT_ROW,
4920
5021
  // In a horizontal bar this segment is usually the `flex-1` grower;
4921
5022
  // min-w-0 lets the clock shrink instead of pushing the trailing
4922
5023
  // segment off the edge.
@@ -5026,32 +5127,41 @@ var TimeLoggerField = forwardRef(
5026
5127
  TimeLoggerField.displayName = "TimeLoggerField";
5027
5128
  var TimeLoggerNotes = forwardRef(
5028
5129
  function TimeLoggerNotes2({ value, onValueChange, icon, placeholder = "Add notes", className, ...props }, ref) {
5029
- return /* @__PURE__ */ jsxs("div", { className: "ds:border-rule-soft ds:flex ds:items-center ds:gap-3 ds:border-t ds:px-4 ds:py-3", children: [
5030
- /* @__PURE__ */ jsx(
5031
- "span",
5032
- {
5033
- className: "ds:text-fg-4 ds:flex ds:size-[17px] ds:shrink-0 ds:items-center ds:justify-center ds:[&_svg]:size-[17px]",
5034
- "aria-hidden": "true",
5035
- children: icon ?? /* @__PURE__ */ jsx(FileTextIcon, {})
5036
- }
5037
- ),
5038
- /* @__PURE__ */ jsx(
5039
- "input",
5040
- {
5041
- ref,
5042
- type: "text",
5043
- value: value ?? "",
5044
- onChange: (event) => onValueChange?.(event.target.value),
5045
- placeholder,
5046
- "aria-label": "Notes",
5047
- className: cn(
5048
- "ds:text-fg ds:placeholder:text-fg-4 ds:min-w-0 ds:flex-1 ds:border-0 ds:bg-transparent ds:text-sm ds:outline-none",
5049
- className
5130
+ return /* @__PURE__ */ jsxs(
5131
+ "div",
5132
+ {
5133
+ className: cn(
5134
+ "ds:border-rule-soft ds:flex ds:items-center ds:gap-3 ds:border-t ds:px-4 ds:py-3",
5135
+ FOCUSED_INPUT_ROW
5136
+ ),
5137
+ children: [
5138
+ /* @__PURE__ */ jsx(
5139
+ "span",
5140
+ {
5141
+ className: "ds:text-fg-4 ds:flex ds:size-[17px] ds:shrink-0 ds:items-center ds:justify-center ds:[&_svg]:size-[17px]",
5142
+ "aria-hidden": "true",
5143
+ children: icon ?? /* @__PURE__ */ jsx(FileTextIcon, {})
5144
+ }
5050
5145
  ),
5051
- ...props
5052
- }
5053
- )
5054
- ] });
5146
+ /* @__PURE__ */ jsx(
5147
+ "input",
5148
+ {
5149
+ ref,
5150
+ type: "text",
5151
+ value: value ?? "",
5152
+ onChange: (event) => onValueChange?.(event.target.value),
5153
+ placeholder,
5154
+ "aria-label": "Notes",
5155
+ className: cn(
5156
+ "ds:text-fg ds:placeholder:text-fg-4 ds:min-w-0 ds:flex-1 ds:border-0 ds:bg-transparent ds:text-sm ds:outline-none",
5157
+ className
5158
+ ),
5159
+ ...props
5160
+ }
5161
+ )
5162
+ ]
5163
+ }
5164
+ );
5055
5165
  }
5056
5166
  );
5057
5167
  TimeLoggerNotes.displayName = "TimeLoggerNotes";
@@ -5085,7 +5195,7 @@ var TimeLoggerBillable = forwardRef(
5085
5195
  {
5086
5196
  type: "button",
5087
5197
  "aria-label": "Billing settings",
5088
- className: "ds:text-fg-4 ds:hover:text-fg-2 ds:hover:bg-surface-hover ds:rounded-btn ds:flex ds:size-6 ds:items-center ds:justify-center ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none ds:[&_svg]:size-4",
5198
+ className: "ds:text-fg-4 ds:hover:text-fg-2 ds:hover:bg-surface-hover ds:active:bg-control-active-bg ds:rounded-btn ds:flex ds:size-6 ds:items-center ds:justify-center ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none ds:[&_svg]:size-4",
5089
5199
  children: /* @__PURE__ */ jsx(SettingsIcon, {})
5090
5200
  }
5091
5201
  ) }),
@@ -5452,10 +5562,10 @@ function EmailMessageCard({
5452
5562
  type: "button",
5453
5563
  onClick: () => setExpanded((v) => !v),
5454
5564
  "aria-expanded": expanded,
5455
- className: "ds:flex ds:w-full ds:items-center ds:justify-center ds:gap-1.5 ds:border-t ds:border-rule/60 ds:bg-surface ds:py-1.5 ds:text-xs ds:font-medium ds:text-brand ds:transition-colors ds:hover:bg-surface-hover/40 ds:motion-reduce:transition-none",
5565
+ className: "ds:flex ds:w-full ds:items-center ds:justify-center ds:gap-1.5 ds:border-t ds:border-rule/60 ds:bg-surface ds:py-1.5 ds:text-xs ds:font-medium ds:text-brand ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:hover:bg-surface-hover/40 ds:motion-reduce:transition-none",
5456
5566
  children: [
5457
5567
  expanded ? "Show less" : "Show full email",
5458
- /* @__PURE__ */ jsx(ChevronDownIcon, { size: 13, className: cn("ds:transition-transform ds:motion-reduce:transition-none", expanded && "ds:rotate-180") })
5568
+ /* @__PURE__ */ jsx(ChevronDownIcon, { size: 13, className: cn("ds:transition-transform ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none", expanded && "ds:rotate-180") })
5459
5569
  ]
5460
5570
  }
5461
5571
  ),
@@ -5506,7 +5616,7 @@ function SignatureEditor({
5506
5616
  }
5507
5617
  )
5508
5618
  ] }),
5509
- /* @__PURE__ */ jsx("div", { className: "ds:p-3", children: loading ? /* @__PURE__ */ jsx("div", { className: "ds:h-32 ds:animate-pulse ds:rounded-md ds:bg-bg-2 ds:motion-reduce:animate-none" }) : children }),
5619
+ /* @__PURE__ */ jsx("div", { className: "ds:p-3", children: loading ? /* @__PURE__ */ jsx(Skeleton, { className: "ds:h-32 ds:rounded-md" }) : children }),
5510
5620
  (onSave || onInsert) && /* @__PURE__ */ jsxs("div", { className: "ds:flex ds:items-center ds:justify-end ds:gap-2 ds:border-t ds:border-rule ds:px-3 ds:py-2", children: [
5511
5621
  onSave && /* @__PURE__ */ jsx(
5512
5622
  Button,
@@ -5526,6 +5636,6 @@ function SignatureEditor({
5526
5636
  }
5527
5637
  SignatureEditor.displayName = "SignatureEditor";
5528
5638
 
5529
- export { AIReceiptPanel, AiDraftCard, Assignee, AttentionItem, Badge, Blockquote, BottomNav, CategoryDivider, CategoryTag, ChannelTabs, ClientRailGroupHeader, ClientRailItem, Dash, DashGrid, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DataTableView, DocumentChecklist, DocumentFileCard, DocumentFileLine, DocumentFileRow, DocumentRequestCard, DocumentRequestDetail, DocumentRequestField, DocumentRequestUpload, DocumentSourceFilter, DocumentSourceTag, DocumentsWorkspaceLayout, EmailMessageCard, EmptyValue, EngagementCard, EngagementTimeline, EngagementTimelineStep, IntentBadge, MissingDocumentsPanel, MoneyCell, NewMenu, PROGRESS_LEGACY_TO_INTENT, Pagination, ProgressBar, ProgressRing, SERVICE_TONES, STATUS_DOT_TONE_TO_INTENT, Section, SectionHead, SectionHeader, SegmentedProgress, SignatureEditor, StagePill, Stat, StatusDot, StatusPill, SuggestionPills, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagsCell, TeamMemberSelect, TimeLogger, TimeLoggerActions, TimeLoggerBillable, TimeLoggerContextRow, TimeLoggerEntry, TimeLoggerEntryList, TimeLoggerField, TimeLoggerFooter, TimeLoggerHeader, TimeLoggerNotes, TimeLoggerTimer, ToggleGroup, ToggleGroupItem, badgeVariants, compareSortValues, formatClock, formatCurrency, formatDuration, nextSortDirection, parseDuration, progressBarVariants, progressRingVariants, resolveBadgeAppearance, serviceToneLabel, serviceToneStyle, statusDotVariants, useDataTable, useFormReset, useStopwatch };
5530
- //# sourceMappingURL=chunk-YMRSFVW7.js.map
5531
- //# sourceMappingURL=chunk-YMRSFVW7.js.map
5639
+ export { AIReceiptPanel, AiDraftCard, Assignee, AttentionItem, Badge, Blockquote, BottomNav, CategoryDivider, CategoryTag, ChannelTabs, ClientRailGroupHeader, ClientRailItem, Dash, DashGrid, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DataTableView, DocumentChecklist, DocumentFileCard, DocumentFileLine, DocumentFileRow, DocumentRequestCard, DocumentRequestDetail, DocumentRequestField, DocumentRequestUpload, DocumentSourceFilter, DocumentSourceTag, DocumentsWorkspaceLayout, EmailMessageCard, EmptyValue, EngagementCard, EngagementTimeline, EngagementTimelineStep, IntentBadge, MissingDocumentsPanel, MoneyCell, NewMenu, PROGRESS_LEGACY_TO_INTENT, Pagination, ProgressBar, ProgressRing, SERVICE_TONES, STATUS_DOT_TONE_TO_INTENT, Section, SectionHead, SectionHeader, SegmentedProgress, SignatureEditor, Skeleton, SkeletonCircle, SkeletonText, StagePill, Stat, StatusDot, StatusPill, SuggestionPills, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagsCell, TeamMemberSelect, TimeLogger, TimeLoggerActions, TimeLoggerBillable, TimeLoggerContextRow, TimeLoggerEntry, TimeLoggerEntryList, TimeLoggerField, TimeLoggerFooter, TimeLoggerHeader, TimeLoggerNotes, TimeLoggerTimer, ToggleGroup, ToggleGroupItem, badgeVariants, compareSortValues, formatClock, formatCurrency, formatDuration, nextSortDirection, parseDuration, progressBarVariants, progressRingVariants, resolveBadgeAppearance, serviceToneLabel, serviceToneStyle, statusDotVariants, useDataTable, useStopwatch };
5640
+ //# sourceMappingURL=chunk-5AL4W32Z.js.map
5641
+ //# sourceMappingURL=chunk-5AL4W32Z.js.map