@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.d.ts +49 -12
- package/dist/index.js +147 -57
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tokens/index.d.ts +17 -4
- package/dist/tokens/index.js +16 -3
- package/dist/tokens/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -90,9 +90,9 @@ var colors = {
|
|
|
90
90
|
};
|
|
91
91
|
var typography = {
|
|
92
92
|
family: {
|
|
93
|
-
display: '"
|
|
93
|
+
display: '"Inter", -apple-system, system-ui, sans-serif',
|
|
94
94
|
body: '"Inter", -apple-system, system-ui, sans-serif',
|
|
95
|
-
mono: '"
|
|
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({
|
|
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
|
|
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-
|
|
3033
|
-
"data-[state=checked]:border-pro-fg data-[state=checked]:bg-pro-
|
|
3034
|
-
"data-[state=indeterminate]:border-pro-fg data-[state=indeterminate]:bg-pro-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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:
|
|
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
|
-
|
|
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-
|
|
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
|
|
8052
|
-
|
|
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
|
-
//
|
|
8351
|
-
//
|
|
8352
|
-
//
|
|
8353
|
-
"
|
|
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
|
-
|
|
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-
|
|
10183
|
-
/* @__PURE__ */ jsx(
|
|
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-
|
|
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-
|
|
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: "
|
|
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(
|
|
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(
|
|
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-[
|
|
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: "
|
|
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-
|
|
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-
|
|
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-
|
|
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(
|
|
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-
|
|
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(
|
|
10766
|
-
|
|
10767
|
-
|
|
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) {
|