@assure-one/design-system 0.16.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -90,9 +90,9 @@ var colors = {
90
90
  };
91
91
  var typography = {
92
92
  family: {
93
- display: '"Geist", "Inter", -apple-system, system-ui, sans-serif',
93
+ display: '"Inter", -apple-system, system-ui, sans-serif',
94
94
  body: '"Inter", -apple-system, system-ui, sans-serif',
95
- mono: '"Geist Mono", "JetBrains Mono", ui-monospace, monospace'
95
+ mono: '"Inter", -apple-system, system-ui, sans-serif'
96
96
  },
97
97
  weight: {
98
98
  regular: 400,
@@ -230,11 +230,24 @@ var systemTokens = {
230
230
  dangerBg: "var(--color-danger-bg)",
231
231
  dangerLine: "var(--color-danger-line)"
232
232
  },
233
+ gradient: {
234
+ brand: "var(--gradient-brand)",
235
+ pro: "var(--gradient-pro)",
236
+ audit: "var(--gradient-audit)",
237
+ books: "var(--gradient-books)",
238
+ tax: "var(--gradient-tax)"
239
+ },
233
240
  shadow: {
234
241
  quiet: "var(--shadow-quiet)",
235
242
  card: "var(--shadow-card)",
236
243
  pop: "var(--shadow-pop)",
237
- focusRing: "var(--shadow-focus-ring)"
244
+ focusRing: "var(--shadow-focus-ring)",
245
+ xs: "var(--shadow-xs)",
246
+ sm: "var(--shadow-sm)",
247
+ md: "var(--shadow-md)",
248
+ lg: "var(--shadow-lg)",
249
+ xl: "var(--shadow-xl)",
250
+ "2xl": "var(--shadow-2xl)"
238
251
  },
239
252
  radius: {
240
253
  btn: "var(--radius-btn)",
@@ -2235,6 +2248,7 @@ var AccordionTrigger = React36.forwardRef(function AccordionTrigger2({ children,
2235
2248
  "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
2236
2249
  "hover:text-fg-2",
2237
2250
  "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
2251
+ "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:hover:text-fg",
2238
2252
  "[&[data-state=open]>svg]:rotate-180",
2239
2253
  className
2240
2254
  ),
@@ -3013,7 +3027,16 @@ var CardAction = forwardRef(
3013
3027
  }
3014
3028
  );
3015
3029
  CardAction.displayName = "CardAction";
3016
- var Checkbox = React36.forwardRef(function Checkbox2({ label, indeterminate, checked, defaultChecked, className, id: providedId, ...props }, ref) {
3030
+ var Checkbox = React36.forwardRef(function Checkbox2({
3031
+ label,
3032
+ indeterminate,
3033
+ checked,
3034
+ defaultChecked,
3035
+ shape = "square",
3036
+ className,
3037
+ id: providedId,
3038
+ ...props
3039
+ }, ref) {
3017
3040
  const generatedId = React36.useId();
3018
3041
  const id = providedId ?? generatedId;
3019
3042
  const resolvedChecked = indeterminate ? "indeterminate" : checked;
@@ -3026,18 +3049,19 @@ var Checkbox = React36.forwardRef(function Checkbox2({ label, indeterminate, che
3026
3049
  checked: resolvedChecked,
3027
3050
  defaultChecked,
3028
3051
  className: cn(
3029
- "peer border-rule-strong bg-surface text-fg-on-pro flex size-4 shrink-0 items-center justify-center rounded-[4px] border",
3052
+ "peer border-rule-strong bg-surface text-pro-fg flex size-4 shrink-0 items-center justify-center border",
3053
+ shape === "circle" ? "rounded-full" : "rounded-[4px]",
3030
3054
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
3031
3055
  "hover:border-fg-4",
3032
- "focus-visible:border-accent focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3033
- "data-[state=checked]:border-pro-fg data-[state=checked]:bg-pro-fg",
3034
- "data-[state=indeterminate]:border-pro-fg data-[state=indeterminate]:bg-pro-fg",
3056
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3057
+ "data-[state=checked]:border-pro-fg data-[state=checked]:bg-pro-bg",
3058
+ "data-[state=indeterminate]:border-pro-fg data-[state=indeterminate]:bg-pro-bg",
3035
3059
  "disabled:bg-bg-disabled disabled:border-rule disabled:text-fg-disabled disabled:cursor-not-allowed",
3036
3060
  "aria-[invalid=true]:border-danger-line",
3037
3061
  className
3038
3062
  ),
3039
3063
  ...props,
3040
- children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx(MinusIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) })
3064
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx(MinusIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) : shape === "circle" ? /* @__PURE__ */ jsx("span", { className: "size-1.5 rounded-full bg-current", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3", strokeWidth: 3, "aria-hidden": "true" }) })
3041
3065
  }
3042
3066
  ),
3043
3067
  label && /* @__PURE__ */ jsx(
@@ -3063,7 +3087,7 @@ var SelectTrigger = React36.forwardRef(({ className, children, ...props }, ref)
3063
3087
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
3064
3088
  "motion-reduce:transition-none",
3065
3089
  "placeholder:text-fg-4",
3066
- "focus-visible:border-accent focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3090
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
3067
3091
  "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
3068
3092
  "data-[placeholder]:text-fg-4",
3069
3093
  "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
@@ -3627,6 +3651,7 @@ function ConfirmActionButton({
3627
3651
  title,
3628
3652
  description,
3629
3653
  confirmLabel = "Confirm",
3654
+ pendingLabel,
3630
3655
  cancelLabel = "Cancel",
3631
3656
  onConfirm,
3632
3657
  destructive = true,
@@ -3667,7 +3692,7 @@ function ConfirmActionButton({
3667
3692
  setDialogOpen(next);
3668
3693
  },
3669
3694
  children: [
3670
- /* @__PURE__ */ jsx(AlertDialogTrigger, { asChild: true, children: trigger }),
3695
+ trigger != null && /* @__PURE__ */ jsx(AlertDialogTrigger, { asChild: true, children: trigger }),
3671
3696
  /* @__PURE__ */ jsxs(AlertDialogContent, { className: contentClassName, children: [
3672
3697
  /* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
3673
3698
  /* @__PURE__ */ jsx(AlertDialogTitle, { children: title }),
@@ -3683,7 +3708,7 @@ function ConfirmActionButton({
3683
3708
  className: cn(
3684
3709
  !destructive && "bg-pro-fg text-fg-on-pro hover:bg-pro-hover active:bg-pro-active"
3685
3710
  ),
3686
- children: confirmLabel
3711
+ children: pending && pendingLabel != null ? pendingLabel : confirmLabel
3687
3712
  }
3688
3713
  )
3689
3714
  ] })
@@ -4164,7 +4189,7 @@ var DatePicker = forwardRef(function DatePicker2({
4164
4189
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
4165
4190
  "motion-reduce:transition-none",
4166
4191
  "placeholder:font-body placeholder:text-fg-4",
4167
- "focus-visible:border-accent focus-visible:outline-none",
4192
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:outline-none",
4168
4193
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
4169
4194
  "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed",
4170
4195
  "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
@@ -4346,7 +4371,7 @@ var DateRangePicker = forwardRef(
4346
4371
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
4347
4372
  "motion-reduce:transition-none",
4348
4373
  "hover:bg-bg-2",
4349
- "focus-visible:border-accent focus-visible:outline-none",
4374
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:outline-none",
4350
4375
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
4351
4376
  "disabled:bg-bg-disabled disabled:text-fg-disabled disabled:cursor-not-allowed disabled:hover:bg-bg-disabled",
4352
4377
  "data-[invalid=true]:border-danger-line data-[invalid=true]:focus-visible:border-danger-fg",
@@ -4862,7 +4887,7 @@ var inputVariants = cva(
4862
4887
  "flex w-full rounded-input border bg-surface font-body text-fg",
4863
4888
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
4864
4889
  "placeholder:text-fg-4",
4865
- "focus-visible:outline-none focus-visible:border-accent",
4890
+ "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
4866
4891
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
4867
4892
  "disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:text-fg-disabled",
4868
4893
  "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
@@ -5473,7 +5498,7 @@ function OTPSlot({ isActive, char, hasFakeCaret, hasError }) {
5473
5498
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
5474
5499
  "sm:h-14 sm:w-12 sm:text-xl",
5475
5500
  "border-rule-strong",
5476
- isActive && "border-accent z-10 [box-shadow:var(--shadow-focus-ring)]",
5501
+ isActive && "[border-color:var(--focus-ring-border)] z-10 [box-shadow:var(--shadow-focus-ring)]",
5477
5502
  hasError && "border-danger-line",
5478
5503
  hasError && isActive && "border-danger-fg [box-shadow:0_0_0_2px_var(--color-danger-bg)]"
5479
5504
  ),
@@ -5862,7 +5887,7 @@ var RadioGroupItem = React36.forwardRef(function RadioGroupItem2({ className, la
5862
5887
  "peer border-rule-strong bg-surface text-pro-fg aspect-square size-4 shrink-0 rounded-full border",
5863
5888
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
5864
5889
  "hover:border-fg-4",
5865
- "focus-visible:border-accent focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
5890
+ "focus-visible:[border-color:var(--focus-ring-border)] focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none",
5866
5891
  "data-[state=checked]:border-pro-fg",
5867
5892
  "disabled:bg-bg-disabled disabled:border-rule disabled:cursor-not-allowed",
5868
5893
  "aria-[invalid=true]:border-danger-line",
@@ -5951,7 +5976,7 @@ var searchInputVariants = cva(
5951
5976
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5952
5977
  "motion-reduce:transition-none",
5953
5978
  "placeholder:text-fg-4",
5954
- "focus-visible:outline-none focus-visible:border-accent",
5979
+ "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
5955
5980
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
5956
5981
  "disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:text-fg-disabled",
5957
5982
  // Hide the native search-cancel button — we render our own clear button.
@@ -6062,7 +6087,8 @@ function SearchSelect({
6062
6087
  closeOnSelect: closeOnSelectProp = false,
6063
6088
  showGroupCounts = false,
6064
6089
  onCreateNew,
6065
- createNewLabel = "Create new"
6090
+ createNewLabel = "Create new",
6091
+ descriptionVariant = "inline"
6066
6092
  }) {
6067
6093
  const isSingleMode = value !== void 0 || onValueChange !== void 0;
6068
6094
  const singleSelectedOption = React36.useMemo(
@@ -6219,10 +6245,10 @@ function SearchSelect({
6219
6245
  "div",
6220
6246
  {
6221
6247
  className: cn(
6222
- "rounded-input border-rule-strong bg-surface relative flex h-9 w-full items-center border",
6223
- "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
6248
+ "rounded-input border-rule-strong bg-surface relative flex h-9 w-full items-center border outline-none",
6249
+ "transition-[color,background-color,border-color] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
6224
6250
  "motion-reduce:transition-none",
6225
- "focus-within:border-accent focus-within:[box-shadow:var(--shadow-focus-ring)]",
6251
+ "focus-within:[outline:1px_solid_var(--color-pro-fg)] focus-within:[outline-offset:-1px]",
6226
6252
  showValue && "hover:bg-bg-2 gap-2 pr-2 pl-3",
6227
6253
  disabled && "bg-bg-disabled cursor-not-allowed"
6228
6254
  ),
@@ -6233,7 +6259,7 @@ function SearchSelect({
6233
6259
  type: "button",
6234
6260
  onClick: () => !disabled && setOpen(true),
6235
6261
  disabled,
6236
- className: "flex h-full flex-1 items-center gap-2 text-left outline-none disabled:cursor-not-allowed",
6262
+ className: "flex h-full min-w-0 flex-1 items-center gap-2 text-left outline-none disabled:cursor-not-allowed",
6237
6263
  children: [
6238
6264
  singleValue.icon && /* @__PURE__ */ jsx(
6239
6265
  "span",
@@ -6246,7 +6272,15 @@ function SearchSelect({
6246
6272
  children: singleValue.icon
6247
6273
  }
6248
6274
  ),
6249
- /* @__PURE__ */ jsxs("span", { className: "text-fg flex-1 truncate text-[13px]", children: [
6275
+ descriptionVariant === "pill" && singleValue.description ? (
6276
+ // Pill variant: label truncates, description rides after it
6277
+ // as a discrete shrink-0 badge so dense metadata reads as a
6278
+ // tag instead of running into the label.
6279
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-1.5 text-[13px]", children: [
6280
+ /* @__PURE__ */ jsx("span", { className: "text-fg truncate", children: singleValue.label }),
6281
+ /* @__PURE__ */ jsx("span", { className: "rounded-pill border-rule bg-bg-2 text-fg-3 shrink-0 border px-1.5 py-0.5 text-[11px] leading-none", children: singleValue.description })
6282
+ ] })
6283
+ ) : /* @__PURE__ */ jsxs("span", { className: "text-fg min-w-0 flex-1 truncate text-[13px]", children: [
6250
6284
  singleValue.label,
6251
6285
  singleValue.description && /* @__PURE__ */ jsxs("span", { className: "text-fg-4", children: [
6252
6286
  " \xB7 ",
@@ -7507,7 +7541,7 @@ var textareaVariants = cva(
7507
7541
  "flex w-full rounded-input border bg-surface font-body text-fg",
7508
7542
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)]",
7509
7543
  "placeholder:text-fg-4",
7510
- "focus-visible:outline-none focus-visible:border-accent",
7544
+ "focus-visible:outline-none focus-visible:[border-color:var(--focus-ring-border)]",
7511
7545
  "focus-visible:[box-shadow:var(--shadow-focus-ring)]",
7512
7546
  "disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:text-fg-disabled",
7513
7547
  "aria-[invalid=true]:border-danger-line aria-[invalid=true]:focus-visible:border-danger-fg",
@@ -7981,7 +8015,8 @@ function SidebarProvider({
7981
8015
  SidebarProvider.displayName = "SidebarProvider";
7982
8016
  var PEEK_ENTER_DELAY_MS = 100;
7983
8017
  var PEEK_LEAVE_DELAY_MS = 200;
7984
- var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = false, onMouseEnter, onMouseLeave, style, ...props }, ref) {
8018
+ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = false, variant = "classic", onMouseEnter, onMouseLeave, style, ...props }, ref) {
8019
+ const isFloating = variant === "floating";
7985
8020
  const ctx = React36.useContext(SidebarContext);
7986
8021
  const state = collapsible && ctx ? ctx.state : "expanded";
7987
8022
  const peekLockCount = collapsible && ctx ? ctx.peekLockCount : 0;
@@ -8044,12 +8079,19 @@ var Sidebar = React36.forwardRef(function Sidebar2({ className, collapsible = fa
8044
8079
  "data-overlay": overlay ? "true" : void 0,
8045
8080
  "data-labels": labelsHidden ? "hide" : "show",
8046
8081
  "data-collapsible": collapsible ? "true" : void 0,
8082
+ "data-variant": variant,
8047
8083
  onMouseEnter: handleEnter,
8048
8084
  onMouseLeave: handleLeave,
8049
8085
  style: { width: effectiveWidth, ...style },
8050
8086
  className: cn(
8051
- "group/sidebar scrollbar-thin flex h-dvh shrink-0 flex-col overflow-y-auto",
8052
- "border-rule bg-bg-2 border-r px-3 pt-4 pb-4",
8087
+ "group/sidebar scrollbar-thin flex shrink-0 flex-col overflow-y-auto px-3 pt-4 pb-4",
8088
+ // Classic: full-height column flush to the left edge with a right
8089
+ // rule. The legacy look.
8090
+ !isFloating && "h-dvh border-rule bg-bg-2 border-r",
8091
+ // Floating: a detached, rounded card inset from the viewport with a
8092
+ // soft shadow — the modern SaaS pattern. The clear figure/ground gap
8093
+ // (Aesthetic-Usability) reads as its own surface above the canvas.
8094
+ isFloating && "border-rule bg-surface shadow-card m-2.5 h-[calc(100dvh-1.25rem)] rounded-2xl border",
8053
8095
  // 220ms feels right for a ~192px width sweep — slower than the
8054
8096
  // 150ms `--duration-fast` (which reads as a snap on this size of
8055
8097
  // movement) but well short of `--duration-slow` (which feels
@@ -8338,6 +8380,11 @@ var SidebarLink = React36.forwardRef(
8338
8380
  // when the column widens during peek. The label simply collapses
8339
8381
  // to width 0 via <SidebarLinkLabel>.
8340
8382
  "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85",
8383
+ // Floating variant: softer corners + a taller hit area (Fitts's
8384
+ // law — a larger target is faster and lower-error to acquire), and
8385
+ // a full pill highlight for active instead of the left rail bar.
8386
+ "group-data-[variant=floating]/sidebar:gap-3 group-data-[variant=floating]/sidebar:rounded-lg group-data-[variant=floating]/sidebar:py-2",
8387
+ "group-data-[variant=floating]/sidebar:data-[active=true]:before:hidden",
8341
8388
  className
8342
8389
  ),
8343
8390
  ...props,
@@ -8347,10 +8394,12 @@ var SidebarLink = React36.forwardRef(
8347
8394
  "span",
8348
8395
  {
8349
8396
  className: cn(
8350
- // line-clamp-1 (not `truncate`) so multi-word labels clip at a
8351
- // word boundary; collapses cleanly with the rail-mode max-width
8352
- // animation since both rules only constrain visible content.
8353
- "min-w-0 flex-1 line-clamp-1",
8397
+ // Flex row so a trailing <SidebarLinkBadge> (ml-auto) aligns
8398
+ // to the right edge with a gap from the label, instead of
8399
+ // butting against it. A line-clamp box swallows the badge's
8400
+ // auto margin, which is why "Billing$48k" rendered glued.
8401
+ // Single-line label clips via overflow; badge stays put.
8402
+ "flex min-w-0 flex-1 items-center gap-1.5 overflow-hidden whitespace-nowrap",
8354
8403
  "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
8355
8404
  "max-w-full opacity-100",
8356
8405
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
@@ -8486,7 +8535,10 @@ var SidebarLinkGroup = React36.forwardRef(
8486
8535
  "data-[active=true]:before:top-1/2 data-[active=true]:before:left-0",
8487
8536
  "data-[active=true]:before:h-4 data-[active=true]:before:w-[2px] data-[active=true]:before:-translate-y-1/2",
8488
8537
  "data-[active=true]:before:bg-pro-fg data-[active=true]:before:rounded-r-full",
8489
- "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85"
8538
+ "[&_svg]:size-3.5 [&_svg]:shrink-0 [&_svg]:opacity-85",
8539
+ // Floating variant — match SidebarLink: taller hit area, pill active.
8540
+ "group-data-[variant=floating]/sidebar:gap-3 group-data-[variant=floating]/sidebar:rounded-lg group-data-[variant=floating]/sidebar:py-2",
8541
+ "group-data-[variant=floating]/sidebar:data-[active=true]:before:hidden"
8490
8542
  );
8491
8543
  const labelSpan = /* @__PURE__ */ jsx(
8492
8544
  "span",
@@ -10161,30 +10213,43 @@ function useStopwatch() {
10161
10213
  }, [setPhase]);
10162
10214
  return { phase, elapsedMs, isRunning: phase === "running", start, pause, resume, stop, reset };
10163
10215
  }
10164
- var TimeLogger = forwardRef(function TimeLogger2({ className, children, ...props }, ref) {
10216
+ var TimeLogger = forwardRef(function TimeLogger2({ className, orientation = "vertical", children, ...props }, ref) {
10165
10217
  return /* @__PURE__ */ jsx(
10166
10218
  "div",
10167
10219
  {
10168
10220
  ref,
10169
- className: cn("bg-surface text-fg-2 flex w-full flex-col", className),
10221
+ "data-orientation": orientation,
10222
+ className: cn(
10223
+ "group/timelogger bg-surface text-fg-2 flex w-full",
10224
+ orientation === "horizontal" ? "flex-row items-stretch" : "flex-col",
10225
+ className
10226
+ ),
10170
10227
  ...props,
10171
10228
  children
10172
10229
  }
10173
10230
  );
10174
10231
  });
10175
10232
  TimeLogger.displayName = "TimeLogger";
10233
+ var horizontalSegment = "group-data-[orientation=horizontal]/timelogger:border-t-0 group-data-[orientation=horizontal]/timelogger:border-l group-data-[orientation=horizontal]/timelogger:first:border-l-0";
10176
10234
  var TimeLoggerHeader = forwardRef(
10177
10235
  function TimeLoggerHeader2({ title = "Track Time", icon, loggedMinutes = 0, goalMinutes, className, ...props }, ref) {
10178
10236
  const hasGoal = goalMinutes != null;
10179
10237
  const pct = hasGoal && goalMinutes > 0 ? Math.min(100, loggedMinutes / goalMinutes * 100) : 0;
10180
10238
  return /* @__PURE__ */ jsxs("div", { ref, className: cn("flex flex-col", className), ...props, children: [
10181
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [
10182
- /* @__PURE__ */ jsxs("div", { className: "text-fg flex items-center gap-2 text-base font-semibold [&_svg]:size-[18px]", children: [
10183
- /* @__PURE__ */ jsx("span", { className: "text-pro-fg", "aria-hidden": "true", children: icon ?? /* @__PURE__ */ jsx(ClockIcon, {}) }),
10239
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3.5", children: [
10240
+ /* @__PURE__ */ jsxs("div", { className: "text-fg flex items-center gap-2.5 text-[17px] font-semibold", children: [
10241
+ /* @__PURE__ */ jsx(
10242
+ "span",
10243
+ {
10244
+ className: "bg-pro-bg text-pro-fg flex size-7 shrink-0 items-center justify-center rounded-lg [&_svg]:size-[17px]",
10245
+ "aria-hidden": "true",
10246
+ children: icon ?? /* @__PURE__ */ jsx(ClockIcon, {})
10247
+ }
10248
+ ),
10184
10249
  title
10185
10250
  ] }),
10186
10251
  hasGoal && /* @__PURE__ */ jsxs("div", { className: "text-fg-3 font-mono text-[13px] tabular-nums", children: [
10187
- /* @__PURE__ */ jsx("b", { className: "text-fg font-medium", children: formatDuration(loggedMinutes * 60) }),
10252
+ /* @__PURE__ */ jsx("b", { className: "text-fg font-semibold", children: formatDuration(loggedMinutes * 60) }),
10188
10253
  " /",
10189
10254
  " ",
10190
10255
  formatDuration(goalMinutes * 60)
@@ -10193,7 +10258,7 @@ var TimeLoggerHeader = forwardRef(
10193
10258
  hasGoal && /* @__PURE__ */ jsx(
10194
10259
  "div",
10195
10260
  {
10196
- className: "bg-bg-3 relative h-[3px] w-full",
10261
+ className: "bg-bg-3 relative h-1 w-full",
10197
10262
  role: "progressbar",
10198
10263
  "aria-label": "Daily goal progress",
10199
10264
  "aria-valuemin": 0,
@@ -10202,7 +10267,7 @@ var TimeLoggerHeader = forwardRef(
10202
10267
  children: /* @__PURE__ */ jsx(
10203
10268
  "div",
10204
10269
  {
10205
- className: "bg-pro-fg h-full rounded-r-full transition-[width] duration-[var(--duration-normal)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
10270
+ className: "h-full rounded-r-full bg-[image:var(--gradient-pro)] transition-[width] duration-[var(--duration-normal)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
10206
10271
  style: { width: `${pct}%` }
10207
10272
  }
10208
10273
  )
@@ -10222,7 +10287,11 @@ var TimeLoggerContextRow = forwardRef(
10222
10287
  "div",
10223
10288
  {
10224
10289
  ref,
10225
- className: cn("border-rule-soft flex items-center gap-2.5 border-t px-4 py-2.5", className),
10290
+ className: cn(
10291
+ "border-rule-soft flex items-center gap-2.5 border-t px-4 py-3",
10292
+ horizontalSegment,
10293
+ className
10294
+ ),
10226
10295
  ...props,
10227
10296
  children: [
10228
10297
  onClientSelect ? /* @__PURE__ */ jsxs(
@@ -10267,7 +10336,15 @@ var TimeLoggerTimer = forwardRef(
10267
10336
  "div",
10268
10337
  {
10269
10338
  ref,
10270
- className: cn("border-rule-soft flex items-center gap-2 border-t px-4 py-2.5", className),
10339
+ className: cn(
10340
+ "border-rule-soft flex items-center gap-2.5 border-t px-4 py-4",
10341
+ // In a horizontal bar this segment is usually the `flex-1` grower;
10342
+ // min-w-0 lets the clock shrink instead of pushing the trailing
10343
+ // segment off the edge.
10344
+ "group-data-[orientation=horizontal]/timelogger:min-w-0",
10345
+ horizontalSegment,
10346
+ className
10347
+ ),
10271
10348
  ...props,
10272
10349
  children: [
10273
10350
  /* @__PURE__ */ jsx(
@@ -10275,7 +10352,7 @@ var TimeLoggerTimer = forwardRef(
10275
10352
  {
10276
10353
  className: cn(
10277
10354
  "text-fg placeholder:text-fg-4 min-w-0 flex-1 border-0 bg-transparent outline-none",
10278
- showClock ? "font-mono text-[22px] font-medium tracking-tight tabular-nums" : "text-[15px]"
10355
+ showClock ? "font-mono text-[28px] font-semibold tracking-tight tabular-nums" : "text-[15px]"
10279
10356
  ),
10280
10357
  value: showClock ? formatClock(elapsedMs) : value ?? "",
10281
10358
  onChange: (event) => onValueChange?.(event.target.value),
@@ -10288,9 +10365,9 @@ var TimeLoggerTimer = forwardRef(
10288
10365
  Button,
10289
10366
  {
10290
10367
  type: "button",
10291
- variant: "secondary",
10368
+ variant: "ghost",
10292
10369
  size: "icon",
10293
- className: "rounded-full",
10370
+ className: "text-fg-3 hover:bg-bg-3 hover:text-fg size-10 rounded-full",
10294
10371
  "aria-label": phase === "paused" ? "Resume timer" : "Pause timer",
10295
10372
  disabled: phase === "idle" || phase === "stopped",
10296
10373
  onClick: phase === "paused" ? onResume : onPause,
@@ -10303,7 +10380,7 @@ var TimeLoggerTimer = forwardRef(
10303
10380
  type: "button",
10304
10381
  variant: "destructive",
10305
10382
  size: "icon",
10306
- className: "rounded-full",
10383
+ className: "shadow-card hover:shadow-pop size-12 rounded-full transition-[transform,box-shadow] active:scale-95 motion-reduce:transition-none",
10307
10384
  "aria-label": "Stop timer",
10308
10385
  onClick: onStop,
10309
10386
  children: /* @__PURE__ */ jsx(StopIcon, {})
@@ -10314,7 +10391,7 @@ var TimeLoggerTimer = forwardRef(
10314
10391
  type: "button",
10315
10392
  variant: "primary",
10316
10393
  size: "icon",
10317
- className: "rounded-full",
10394
+ className: "shadow-card hover:shadow-pop size-12 rounded-full bg-[image:var(--gradient-brand)] transition-[transform,box-shadow] active:scale-95 motion-reduce:transition-none",
10318
10395
  "aria-label": "Start timer",
10319
10396
  onClick: onStart,
10320
10397
  children: /* @__PURE__ */ jsx(PlayIcon, {})
@@ -10345,7 +10422,9 @@ var TimeLoggerField = forwardRef(
10345
10422
  trailing !== void 0 ? trailing : interactive ? /* @__PURE__ */ jsx(ChevronRightIcon, { className: "text-fg-4 size-4 shrink-0" }) : null
10346
10423
  ] });
10347
10424
  const classes = cn(
10348
- "border-rule-soft flex w-full items-center gap-3 border-t px-4 py-2.5 text-left",
10425
+ "border-rule-soft flex w-full items-center gap-3 border-t px-4 py-3 text-left",
10426
+ "group-data-[orientation=horizontal]/timelogger:w-auto",
10427
+ horizontalSegment,
10349
10428
  interactive && "hover:bg-surface-2 focus-visible:bg-surface-2 cursor-pointer transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] outline-none motion-reduce:transition-none",
10350
10429
  className
10351
10430
  );
@@ -10368,7 +10447,7 @@ var TimeLoggerField = forwardRef(
10368
10447
  TimeLoggerField.displayName = "TimeLoggerField";
10369
10448
  var TimeLoggerNotes = forwardRef(
10370
10449
  function TimeLoggerNotes2({ value, onValueChange, icon, placeholder = "Add notes", className, ...props }, ref) {
10371
- return /* @__PURE__ */ jsxs("div", { className: "border-rule-soft flex items-center gap-3 border-t px-4 py-2.5", children: [
10450
+ return /* @__PURE__ */ jsxs("div", { className: "border-rule-soft flex items-center gap-3 border-t px-4 py-3", children: [
10372
10451
  /* @__PURE__ */ jsx(
10373
10452
  "span",
10374
10453
  {
@@ -10486,7 +10565,8 @@ var TimeLoggerActions = forwardRef(
10486
10565
  {
10487
10566
  ref,
10488
10567
  className: cn(
10489
- "border-rule bg-surface-2 flex items-center gap-2 border-t px-4 py-2.5",
10568
+ "border-rule bg-surface-2 flex items-center gap-2 border-t px-4 py-3",
10569
+ horizontalSegment,
10490
10570
  className
10491
10571
  ),
10492
10572
  ...props,
@@ -10514,7 +10594,10 @@ var TimeLoggerEntry = forwardRef(
10514
10594
  "div",
10515
10595
  {
10516
10596
  ref,
10517
- className: cn("border-rule-soft flex items-center gap-3 border-t px-4 py-2", className),
10597
+ className: cn(
10598
+ "border-rule-soft hover:bg-surface-2 flex items-center gap-3 border-t px-4 py-2.5 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
10599
+ className
10600
+ ),
10518
10601
  ...props,
10519
10602
  children: [
10520
10603
  /* @__PURE__ */ jsx(
@@ -10565,7 +10648,7 @@ var TimeLoggerFooter = forwardRef(
10565
10648
  "div",
10566
10649
  {
10567
10650
  ref,
10568
- className: cn("border-rule flex gap-2 border-t px-4 py-2.5 [&>*]:flex-1", className),
10651
+ className: cn("border-rule flex gap-2 border-t px-4 py-3 [&>*]:flex-1", className),
10569
10652
  ...props,
10570
10653
  children
10571
10654
  }
@@ -10762,10 +10845,17 @@ function BulkActionBar({
10762
10845
  }
10763
10846
  );
10764
10847
  }
10765
- return /* @__PURE__ */ jsxs("div", { className: cn("sticky bottom-4 z-[var(--z-sticky)] mt-3", className), ...props, children: [
10766
- /* @__PURE__ */ jsx("div", { className: "border-rule bg-surface mx-auto flex max-w-3xl flex-wrap items-center gap-3 rounded-full border px-4 py-2 shadow-card", children: content }),
10767
- footer
10768
- ] });
10848
+ return /* @__PURE__ */ jsxs(
10849
+ "div",
10850
+ {
10851
+ className: cn("sticky bottom-4 z-[var(--z-sticky)] mt-3 flex justify-center", className),
10852
+ ...props,
10853
+ children: [
10854
+ /* @__PURE__ */ jsx("div", { className: "border-rule bg-surface flex w-fit max-w-full items-center gap-3 overflow-x-auto rounded-card border px-4 py-2 shadow-card", children: content }),
10855
+ footer
10856
+ ]
10857
+ }
10858
+ );
10769
10859
  }
10770
10860
  var PrimaryAction = forwardRef(
10771
10861
  function PrimaryAction2({ arrow, iconRight, children, className, ...props }, ref) {