@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,5 +1,5 @@
1
- import { stateAttributes, slot, chipAnatomy, Pressable, CONTROL_GAP_CLASSES, EN_MESSAGES, microInteractions, listItemClasses, groupHeadingClasses, useDsMessages, withPortalContainer, Backdrop, sheetAnatomy, deprecate, OverlaySurface, DismissButton, DEFAULT_OVERLAY_MESSAGES, DISMISS_GLYPH_CLASSES, OverlayBody, OverlayTitle, OverlayDescription, Input, Textarea, Select, FileUpload, FileChip, Button, Checkbox, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, sidebarAnatomy, Slot, Avatar, DropdownMenu, DropdownMenuTrigger, sidebarBrandSwitcherAnatomy, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem, buttonBase, CONTROL_SIZE_CLASSES, useFieldControl, useId as useId$1, useControllableState, useMergedRefs, Popover, PopoverAnchor, comboboxAnatomy, Spinner, IconButton, PopoverContent, LIST_SEPARATOR, listItemAttributes, optionElementId, FormBridge, useLinkComponent, useImageComponent, OverlayHeader, OverlayFooter, LIST_ITEM_INDICATOR_WELL } from './chunk-M2HMZ2RW.js';
2
- import { cn, XIcon, CheckIcon, EyeIcon, DownloadIcon, PhoneIcon, MailIcon, GlobeIcon, HomeIcon, ChevronLeftIcon, ChevronRightIcon, ReceiptIcon, RotateCcwIcon, CreditCardIcon, LockIcon, FileTextIcon, PlayIcon, InfoIcon, ClockIcon, PenSignIcon, TrashIcon, PlusIcon, CheckCircleSolidIcon, HelpCircleIcon, MinusIcon, PanelLeftCloseIcon, PanelLeftIcon, ChevronDownIcon } from './chunk-AF3QYJ24.js';
1
+ import { stateAttributes, slot, chipAnatomy, Pressable, CONTROL_GAP_CLASSES, EN_MESSAGES, microInteractions, listItemClasses, groupHeadingClasses, useDsMessages, withPortalContainer, Backdrop, sheetAnatomy, deprecate, OverlaySurface, DismissButton, DEFAULT_OVERLAY_MESSAGES, DISMISS_GLYPH_CLASSES, OverlayBody, OverlayTitle, OverlayDescription, Input, Textarea, Select, FileUpload, FileChip, Button, Checkbox, Tooltip, TooltipTrigger, TooltipContent, useMergedRefs, TooltipProvider, sidebarAnatomy, Slot, Avatar, DropdownMenu, DropdownMenuTrigger, sidebarBrandSwitcherAnatomy, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem, buttonBase, CONTROL_SIZE_CLASSES, useFieldControl, useId as useId$1, useControllableState, Popover, PopoverAnchor, comboboxAnatomy, Spinner, IconButton, PopoverContent, LIST_SEPARATOR, listItemAttributes, optionElementId, FormBridge, useLinkComponent, useImageComponent, OverlayHeader, OverlayFooter, LIST_ITEM_INDICATOR_WELL } from './chunk-VK6SW34V.js';
2
+ import { cn, XIcon, CheckIcon, EyeIcon, DownloadIcon, PhoneIcon, MailIcon, GlobeIcon, HomeIcon, ChevronLeftIcon, ChevronRightIcon, ReceiptIcon, RotateCcwIcon, CreditCardIcon, LockIcon, FileTextIcon, PlayIcon, InfoIcon, ClockIcon, PenSignIcon, TrashIcon, PlusIcon, CheckCircleSolidIcon, HelpCircleIcon, MinusIcon, PanelLeftCloseIcon, PanelLeftIcon, ChevronsLeftIcon, ChevronsRightIcon, ChevronDownIcon } from './chunk-TBDTXAFH.js';
3
3
  import { parseHexColor, contrastRatio, WHITE, formatHexColor, darkenUntilContrast } from './chunk-EUHGZA6Q.js';
4
4
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
5
5
  import * as React6 from 'react';
@@ -194,7 +194,7 @@ var Chip = forwardRef(function Chip2({
194
194
  onClick: onRemove,
195
195
  className: cn(
196
196
  "ds:inline-flex ds:size-6 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-full ds:bg-transparent ds:p-0 ds:text-inherit",
197
- "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
197
+ "ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
198
198
  REMOVE_HOVER[style.intent]
199
199
  ),
200
200
  children: /* @__PURE__ */ jsx(XIcon, { "aria-hidden": "true" })
@@ -890,7 +890,7 @@ function Combobox(props) {
890
890
  ChevronDownIcon,
891
891
  {
892
892
  className: cn(
893
- "ds:transition-transform ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none",
893
+ "ds:transition-transform ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
894
894
  open && "ds:rotate-180"
895
895
  )
896
896
  }
@@ -1825,6 +1825,8 @@ var ProposalPackageCard = forwardRef(
1825
1825
  "data-selected": selected || void 0,
1826
1826
  className: cn(
1827
1827
  "ds:border-rule ds:bg-surface ds:relative ds:flex ds:flex-col ds:rounded-[14px] ds:border ds:p-4",
1828
+ // Selecting a package eases its accent edge in, as ProposalAddOn does.
1829
+ "ds:transition-[border-color,box-shadow] ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none",
1828
1830
  "ds:data-[selected]:border-[var(--av-accent,var(--color-accent))] ds:data-[selected]:shadow-[0_0_0_1px_var(--av-accent,var(--color-accent))]",
1829
1831
  className
1830
1832
  ),
@@ -3309,6 +3311,7 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3309
3311
  ...props
3310
3312
  }, ref) {
3311
3313
  const isFloating = variant === "floating";
3314
+ const isFlush = variant === "flush";
3312
3315
  const ctx = React6.useContext(SidebarContext);
3313
3316
  const state = collapsible && ctx ? ctx.state : "expanded";
3314
3317
  const peekLockCount = collapsible && ctx && peekEnabled ? ctx.peekLockCount : 0;
@@ -3326,6 +3329,29 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3326
3329
  }
3327
3330
  }, []);
3328
3331
  React6.useEffect(() => () => clearTimers(), [clearTimers]);
3332
+ const internalRef = React6.useRef(null);
3333
+ const mergedRef = useMergedRefs(ref, internalRef);
3334
+ React6.useEffect(() => {
3335
+ if (!isFlush) return;
3336
+ const el = internalRef.current;
3337
+ if (!el) return;
3338
+ let timer;
3339
+ const onScroll = () => {
3340
+ el.dataset.scrolling = "true";
3341
+ if (el.scrollTop > 0) el.dataset.scrolled = "true";
3342
+ else delete el.dataset.scrolled;
3343
+ window.clearTimeout(timer);
3344
+ timer = window.setTimeout(() => {
3345
+ delete el.dataset.scrolling;
3346
+ }, 800);
3347
+ };
3348
+ if (el.scrollTop > 0) el.dataset.scrolled = "true";
3349
+ el.addEventListener("scroll", onScroll, { passive: true });
3350
+ return () => {
3351
+ el.removeEventListener("scroll", onScroll);
3352
+ window.clearTimeout(timer);
3353
+ };
3354
+ }, [isFlush]);
3329
3355
  React6.useEffect(() => {
3330
3356
  if (state === "expanded") {
3331
3357
  clearTimers();
@@ -3356,7 +3382,10 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3356
3382
  };
3357
3383
  const overlay = state === "rail" && (peek || peekLockCount > 0);
3358
3384
  const labelsHidden = state === "rail" && !peek && peekLockCount === 0;
3359
- const effectiveWidth = labelsHidden ? "var(--shell-sidebar-w-rail, var(--ds-layout-shell-sidebar-rail-width))" : "var(--shell-sidebar-w, var(--ds-layout-shell-sidebar-width))";
3385
+ const railWidth = "var(--shell-sidebar-w-rail, var(--ds-layout-shell-sidebar-rail-width))";
3386
+ const fullWidth = "var(--shell-sidebar-w, var(--ds-layout-shell-sidebar-width))";
3387
+ const effectiveWidth = labelsHidden ? railWidth : fullWidth;
3388
+ const overlayMarginRight = isFloating ? `calc(0.625rem + ${railWidth} - ${fullWidth})` : `calc(${railWidth} - ${fullWidth})`;
3360
3389
  return (
3361
3390
  // Hover-peek is *enhancement only*: the canonical way to toggle the
3362
3391
  // sidebar is <SidebarTrigger> (button) or the Mod+\ shortcut, both
@@ -3367,7 +3396,7 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3367
3396
  /* @__PURE__ */ jsx(
3368
3397
  "aside",
3369
3398
  {
3370
- ref,
3399
+ ref: mergedRef,
3371
3400
  "data-state": state,
3372
3401
  "data-peek": peek ? "true" : void 0,
3373
3402
  "data-overlay": overlay ? "true" : void 0,
@@ -3377,7 +3406,11 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3377
3406
  ...slot(sidebarAnatomy, "root"),
3378
3407
  onMouseEnter: handleEnter,
3379
3408
  onMouseLeave: handleLeave,
3380
- style: { width: effectiveWidth, ...style },
3409
+ style: {
3410
+ width: effectiveWidth,
3411
+ ...overlay ? { marginRight: overlayMarginRight } : null,
3412
+ ...style
3413
+ },
3381
3414
  className: cn(
3382
3415
  "ds:group/sidebar group/sidebar ds:scrollbar-thin ds:flex ds:shrink-0 ds:flex-col ds:overflow-y-auto ds:px-3 ds:pt-4 ds:pb-4",
3383
3416
  // Classic: full-height column flush to the left edge with a right
@@ -3392,16 +3425,28 @@ var Sidebar = React6.forwardRef(function Sidebar2({
3392
3425
  // movement) but well short of `--duration-slow` (which feels
3393
3426
  // sluggish). `will-change` hints the compositor so the column
3394
3427
  // doesn't repaint every frame mid-transition.
3395
- "ds:transition-[width,box-shadow] ds:duration-[var(--motion-duration-spatial)] ds:ease-[var(--motion-ease-move)] ds:motion-reduce:transition-none",
3428
+ "ds:transition-[width,margin-right,box-shadow] ds:duration-[var(--motion-duration-spatial)] ds:ease-[var(--motion-ease-move)] ds:motion-reduce:transition-none",
3396
3429
  "ds:[will-change:width]",
3397
3430
  // Overlay (hover-peek OR programmatic peek-lock): float above the
3398
- // canvas without reflowing layout. Driven by `data-overlay` so a
3399
- // single rule handles both transient sources.
3400
- "ds:data-[overlay=true]:fixed ds:data-[overlay=true]:top-0 ds:data-[overlay=true]:left-0",
3431
+ // canvas without reflowing layout (the negative margin above keeps
3432
+ // the rail's footprint). Driven by `data-overlay` so a single rule
3433
+ // handles both transient sources.
3434
+ "ds:data-[overlay=true]:relative",
3401
3435
  "ds:data-[overlay=true]:z-[var(--z-overlay)] ds:data-[overlay=true]:shadow-pop",
3402
3436
  // Padding is held constant across states so icons keep their
3403
3437
  // horizontal anchor when the column widens — peek expands the
3404
3438
  // labels rightward rather than shifting the icons leftward.
3439
+ isFlush && // Overlay scrollbar: hidden at rest, revealed while `data-scrolling`
3440
+ // is set by the effect above and faded back out ~800ms after the
3441
+ // last scroll event. `scrollbar-color` is the standard property
3442
+ // modern engines read; the `::-webkit-scrollbar-thumb` rule is the
3443
+ // older-Safari fallback, kept in lockstep with it rather than
3444
+ // relying on either alone.
3445
+ cn(
3446
+ "ds:[scrollbar-color:transparent_transparent] ds:data-[scrolling=true]:[scrollbar-color:var(--color-rule-strong)_transparent]",
3447
+ "ds:[&::-webkit-scrollbar-thumb]:bg-transparent ds:data-[scrolling=true]:[&::-webkit-scrollbar-thumb]:bg-[var(--color-rule-strong)]",
3448
+ "ds:[&::-webkit-scrollbar-thumb]:transition-colors ds:[&::-webkit-scrollbar-thumb]:duration-[var(--duration-normal)] ds:motion-reduce:[&::-webkit-scrollbar-thumb]:transition-none"
3449
+ ),
3405
3450
  className
3406
3451
  ),
3407
3452
  ...props,
@@ -3477,7 +3522,7 @@ var SidebarPinButton = React6.forwardRef(
3477
3522
  {
3478
3523
  ref,
3479
3524
  type: "button",
3480
- "aria-label": isPinned ? unpinLabel ?? messages.unpin : pinLabel ?? messages.pin,
3525
+ "aria-label": isPinned ? unpinLabel ?? messages.collapse : pinLabel ?? messages.expand,
3481
3526
  "aria-pressed": isPinned,
3482
3527
  onClick: (e) => {
3483
3528
  onClick?.(e);
@@ -3497,44 +3542,12 @@ var SidebarPinButton = React6.forwardRef(
3497
3542
  className
3498
3543
  ),
3499
3544
  ...props,
3500
- children: /* @__PURE__ */ jsx(PinGlyph, { size: 14, filled: isPinned, className: "ds:rotate-45" })
3545
+ children: isPinned ? /* @__PURE__ */ jsx(ChevronsLeftIcon, { size: 16 }) : /* @__PURE__ */ jsx(ChevronsRightIcon, { size: 16 })
3501
3546
  }
3502
3547
  );
3503
3548
  }
3504
3549
  );
3505
3550
  SidebarPinButton.displayName = "SidebarPinButton";
3506
- function PinGlyph({
3507
- size = 16,
3508
- filled = false,
3509
- className
3510
- }) {
3511
- return /* @__PURE__ */ jsxs(
3512
- "svg",
3513
- {
3514
- xmlns: "http://www.w3.org/2000/svg",
3515
- width: size,
3516
- height: size,
3517
- viewBox: "0 0 24 24",
3518
- fill: "none",
3519
- stroke: "currentColor",
3520
- strokeWidth: 2,
3521
- strokeLinecap: "round",
3522
- strokeLinejoin: "round",
3523
- "aria-hidden": "true",
3524
- className,
3525
- children: [
3526
- /* @__PURE__ */ jsx("path", { d: "M12 17v5" }),
3527
- /* @__PURE__ */ jsx(
3528
- "path",
3529
- {
3530
- d: "M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",
3531
- fill: filled ? "currentColor" : "none"
3532
- }
3533
- )
3534
- ]
3535
- }
3536
- );
3537
- }
3538
3551
  var SidebarBrand = React6.forwardRef(
3539
3552
  function SidebarBrand2({ className, ...props }, ref) {
3540
3553
  return /* @__PURE__ */ jsx(
@@ -3544,6 +3557,13 @@ var SidebarBrand = React6.forwardRef(
3544
3557
  ...slot(sidebarAnatomy, "brand"),
3545
3558
  className: cn(
3546
3559
  "ds:flex ds:min-w-0 ds:items-center ds:gap-2 ds:px-2.5 ds:pt-1 ds:pb-4",
3560
+ // Flush: pinned to the top of the scrolling column so the nav rows
3561
+ // pass behind it instead of over it. `data-scrolled` is only ever
3562
+ // set while flush (see <Sidebar>), so the hairline needs no variant
3563
+ // check of its own — one derived attribute, one rule.
3564
+ "ds:group-data-[variant=flush]/sidebar:bg-bg-2 ds:group-data-[variant=flush]/sidebar:sticky ds:group-data-[variant=flush]/sidebar:top-0 ds:group-data-[variant=flush]/sidebar:z-[var(--z-sticky)]",
3565
+ "ds:group-data-[variant=flush]/sidebar:border-b ds:group-data-[variant=flush]/sidebar:border-transparent ds:group-data-[variant=flush]/sidebar:transition-colors ds:group-data-[variant=flush]/sidebar:duration-[var(--duration-normal)] ds:group-data-[variant=flush]/sidebar:ease-[var(--ease-out-quart)] ds:group-data-[variant=flush]/sidebar:motion-reduce:transition-none",
3566
+ "ds:group-data-[scrolled=true]/sidebar:border-rule",
3547
3567
  className
3548
3568
  ),
3549
3569
  ...props
@@ -3631,7 +3651,11 @@ var SidebarSection = React6.forwardRef(
3631
3651
  ...slot(sidebarAnatomy, "section-label"),
3632
3652
  className: cn(
3633
3653
  "ds:font-mono ds:text-[11px] ds:tracking-[0.14em] ds:uppercase",
3634
- tone === "muted" ? "ds:text-fg-3" : "ds:text-brand"
3654
+ tone === "muted" ? "ds:text-fg-3" : "ds:text-brand",
3655
+ // Flush: the `overline` type role (size/leading/tracking/
3656
+ // weight together) at a flat fg-4 — grouping reads as
3657
+ // quiet structural chrome, not a tone-coded eyebrow.
3658
+ "ds:group-data-[variant=flush]/sidebar:font-sans ds:group-data-[variant=flush]/sidebar:text-overline ds:group-data-[variant=flush]/sidebar:text-fg-4"
3635
3659
  ),
3636
3660
  children: label
3637
3661
  }
@@ -3681,6 +3705,13 @@ var SidebarLink = React6.forwardRef(
3681
3705
  "ds:hover:bg-bg-3 ds:hover:text-fg",
3682
3706
  "ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none",
3683
3707
  "ds:data-[active=true]:bg-brand-bg ds:data-[active=true]:text-brand ds:data-[active=true]:font-medium",
3708
+ // Flush: icons read fg-3 at rest and lift to fg on hover/active —
3709
+ // the row's own bg-brand-bg tint (above) and the 2px edge
3710
+ // indicator (below) already carry "active", so the icon doesn't
3711
+ // also need brand-colored ink. Placed before the rail rule below
3712
+ // so a collapsed rail keeps winning on the combined flush+rail
3713
+ // case (equal specificity, source order decides).
3714
+ "ds:group-data-[variant=flush]/sidebar:[&_svg]:text-fg-3 ds:group-data-[variant=flush]/sidebar:hover:[&_svg]:text-fg ds:group-data-[variant=flush]/sidebar:data-[active=true]:[&_svg]:text-fg",
3684
3715
  // In rail, the icon itself carries the active state rather
3685
3716
  // than just the rule bar — color is more legible than a 2px
3686
3717
  // vertical mark at the column's left edge when labels are
@@ -3704,6 +3735,13 @@ var SidebarLink = React6.forwardRef(
3704
3735
  // a full pill highlight for active instead of the left rail bar.
3705
3736
  "ds:group-data-[variant=floating]/sidebar:gap-3 ds:group-data-[variant=floating]/sidebar:rounded-lg ds:group-data-[variant=floating]/sidebar:py-2",
3706
3737
  "ds:group-data-[variant=floating]/sidebar:data-[active=true]:before:hidden",
3738
+ // Flush row anatomy: 32px rows on the control radius (this already
3739
+ // matches the base py-1.5 at the body-sm role's leading — only the
3740
+ // radius and icon geometry actually move), 16px icons at full
3741
+ // opacity (the fg-3→fg color lift above already carries the
3742
+ // dimming, so the base opacity-85 would double it up), and labels
3743
+ // on the body-sm role instead of a hardcoded pixel size.
3744
+ "ds:group-data-[variant=flush]/sidebar:rounded-control ds:group-data-[variant=flush]/sidebar:[&_svg]:size-4 ds:group-data-[variant=flush]/sidebar:[&_svg]:opacity-100 ds:group-data-[variant=flush]/sidebar:text-body-sm",
3707
3745
  className
3708
3746
  ),
3709
3747
  ...props,
@@ -3871,6 +3909,8 @@ var SidebarLinkGroup = React6.forwardRef(
3871
3909
  "ds:hover:bg-bg-3 ds:hover:text-fg",
3872
3910
  "ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none",
3873
3911
  "ds:data-[active=true]:bg-brand-bg ds:data-[active=true]:text-brand ds:data-[active=true]:font-medium",
3912
+ // Flush — match SidebarLink: icon fg-3 lifting to fg on hover/active.
3913
+ "ds:group-data-[variant=flush]/sidebar:[&_svg]:text-fg-3 ds:group-data-[variant=flush]/sidebar:hover:[&_svg]:text-fg ds:group-data-[variant=flush]/sidebar:data-[active=true]:[&_svg]:text-fg",
3874
3914
  // In rail, color carries active state since the chevron is hidden.
3875
3915
  "ds:group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:text-brand ds:group-data-[labels=hide]/sidebar:data-[active=true]:[&_svg]:opacity-100",
3876
3916
  // Active rail mark — anchored to body row's left edge.
@@ -3882,6 +3922,9 @@ var SidebarLinkGroup = React6.forwardRef(
3882
3922
  // Floating variant — match SidebarLink: taller hit area, pill active.
3883
3923
  "ds:group-data-[variant=floating]/sidebar:gap-3 ds:group-data-[variant=floating]/sidebar:rounded-lg ds:group-data-[variant=floating]/sidebar:py-2",
3884
3924
  "ds:group-data-[variant=floating]/sidebar:data-[active=true]:before:hidden",
3925
+ // Flush — match SidebarLink: 32px row on the control radius, 16px
3926
+ // full-opacity icons, body-sm label instead of a hardcoded pixel size.
3927
+ "ds:group-data-[variant=flush]/sidebar:rounded-control ds:group-data-[variant=flush]/sidebar:[&_svg]:size-4 ds:group-data-[variant=flush]/sidebar:[&_svg]:opacity-100 ds:group-data-[variant=flush]/sidebar:text-body-sm",
3885
3928
  classNames?.link
3886
3929
  );
3887
3930
  const labelSpan = /* @__PURE__ */ jsx(
@@ -4107,7 +4150,17 @@ var SidebarBrandSwitcher = React6.forwardRef(
4107
4150
  {
4108
4151
  ref,
4109
4152
  ...slot(sidebarBrandSwitcherAnatomy, "root"),
4110
- className: cn("ds:flex ds:min-w-0 ds:items-center ds:gap-2 ds:px-2.5 ds:pt-1 ds:pb-4", className),
4153
+ className: cn(
4154
+ "ds:flex ds:min-w-0 ds:items-center ds:gap-2 ds:px-2.5 ds:pt-1 ds:pb-4",
4155
+ // Flush — mirrors <SidebarBrand>: pinned to the top of the
4156
+ // scrolling column, with a hairline that appears once the list
4157
+ // has scrolled. `data-scrolled` is only ever set while flush, so
4158
+ // the hairline rule needs no variant check of its own.
4159
+ "ds:group-data-[variant=flush]/sidebar:bg-bg-2 ds:group-data-[variant=flush]/sidebar:sticky ds:group-data-[variant=flush]/sidebar:top-0 ds:group-data-[variant=flush]/sidebar:z-[var(--z-sticky)]",
4160
+ "ds:group-data-[variant=flush]/sidebar:border-b ds:group-data-[variant=flush]/sidebar:border-transparent ds:group-data-[variant=flush]/sidebar:transition-colors ds:group-data-[variant=flush]/sidebar:duration-[var(--duration-normal)] ds:group-data-[variant=flush]/sidebar:ease-[var(--ease-out-quart)] ds:group-data-[variant=flush]/sidebar:motion-reduce:transition-none",
4161
+ "ds:group-data-[scrolled=true]/sidebar:border-rule",
4162
+ className
4163
+ ),
4111
4164
  children: [
4112
4165
  /* @__PURE__ */ jsxs(DropdownMenu, { open, onOpenChange: setOpen, children: [
4113
4166
  /* @__PURE__ */ jsxs(
@@ -4122,7 +4175,11 @@ var SidebarBrandSwitcher = React6.forwardRef(
4122
4175
  // children — same hover affordance, no glyph drift.
4123
4176
  "ds:group/brand-trigger ds:-ml-2 ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2 ds:rounded-md ds:py-1.5 ds:pr-1.5 ds:pl-2",
4124
4177
  "ds:text-fg ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none",
4125
- "ds:hover:bg-bg-3 ds:data-[state=open]:bg-bg-3",
4178
+ // `aria-expanded` twin: a TooltipTrigger asChild ancestor can
4179
+ // clobber this trigger's own `data-state` with the tooltip's
4180
+ // (see toggle-group.tsx's note on the same bug), but never
4181
+ // sets `aria-expanded`.
4182
+ "ds:hover:bg-bg-3 ds:data-[state=open]:bg-bg-3 ds:aria-expanded:bg-bg-3",
4126
4183
  "ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]",
4127
4184
  triggerClassName
4128
4185
  ),
@@ -4137,6 +4194,7 @@ var SidebarBrandSwitcher = React6.forwardRef(
4137
4194
  "ds:ml-auto ds:size-3.5 ds:shrink-0 ds:text-fg-4",
4138
4195
  "ds:transition-transform ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none",
4139
4196
  "ds:group-data-[state=open]/brand-trigger:rotate-180",
4197
+ "ds:group-aria-expanded/brand-trigger:rotate-180",
4140
4198
  "ds:group-data-[labels=hide]/sidebar:hidden",
4141
4199
  iconClassName
4142
4200
  )
@@ -4339,5 +4397,5 @@ var BrandScope = forwardRef(function BrandScope2({ product, children, ...props }
4339
4397
  BrandScope.displayName = "BrandScope";
4340
4398
 
4341
4399
  export { AgreementPaneHeading, AgreementViewer, AssureAuditBrandIcon, AssureBooksBrandIcon, AssureProBrandIcon, AssureTaxBrandIcon, BRAND_PRODUCTS, BrandScope, BrandScopeProvider, Chip, ClientSelect, CmdkCompatContext, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComingSoon, DEFAULT_COMBOBOX_MESSAGES, Grid, Logo, PlainLink, ProposalAddOn, ProposalBillingTerms, ProposalConsentGate, ProposalCustomPage, ProposalNote, ProposalPackageCard, ProposalPaymentCapture, ProposalPricingSummary, ProposalServiceRow, ProposalSignatureBlock, ProposalSignerList, QUESTION_TYPES, QUESTION_TYPE_CONTRACT_VERSION, Questions, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarBrand, SidebarBrandSwitcher, SidebarBrandSwitcherTile, SidebarBrandText, SidebarDrawer, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarPinButton, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, assetPath, brandLabel, brandScope, chipVariants, getAssetBasePath, resolveChipStyle, setAssetBasePath, sidebarLinkBadgeVariants, useBrandScope, useSidebarPeekLock, useSidebarState };
4342
- //# sourceMappingURL=chunk-H53VF62B.js.map
4343
- //# sourceMappingURL=chunk-H53VF62B.js.map
4400
+ //# sourceMappingURL=chunk-L5IQK3GV.js.map
4401
+ //# sourceMappingURL=chunk-L5IQK3GV.js.map