@bearmenu/ui 0.8.28 → 0.8.30
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/{chunk-PDTPO6NG.js → chunk-JWTN7MNK.js} +1 -1
- package/dist/{chunk-MCOHLWRS.js → chunk-ZJMCU7MI.js} +1 -1
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/booking-row.d.ts +2 -1
- package/dist/components/booking-row.js +4 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/card.d.ts +2 -2
- package/dist/components/combobox.js +2 -2
- package/dist/components/command.d.ts +15 -15
- package/dist/components/command.js +2 -2
- package/dist/components/dialog.js +1 -1
- package/dist/components/drawer.js +1 -1
- package/dist/components/item.d.ts +2 -2
- package/dist/components/multi-select-combobox.js +2 -2
- package/dist/components/party-counter.js +1 -1
- package/dist/components/searchable-select.js +2 -2
- package/dist/components/sheet.js +1 -1
- package/dist/components/spinner.d.ts +2 -2
- package/dist/components/tag.d.ts +2 -2
- package/dist/components/text.d.ts +3 -3
- package/dist/components/time-slot.js +6 -3
- package/dist/components/toggle.d.ts +1 -1
- package/package.json +1 -1
- package/src/components/booking-row.tsx +6 -2
- package/src/components/dialog.tsx +1 -1
- package/src/components/drawer.tsx +1 -1
- package/src/components/party-counter.tsx +3 -1
- package/src/components/sheet.tsx +1 -1
- package/src/components/time-slot.tsx +10 -3
- package/src/globals.css +19 -1
|
@@ -26,7 +26,7 @@ var DialogOverlay = React.forwardRef((_a, ref) => {
|
|
|
26
26
|
});
|
|
27
27
|
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
28
28
|
var dialogContentVariants = cva(
|
|
29
|
-
"fixed left-[50%] top-[50%] z-[1000] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-
|
|
29
|
+
"fixed left-[50%] top-[50%] z-[1000] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-[var(--shadow-overlay)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:duration-[var(--duration-deliberate)] data-[state=closed]:duration-[var(--duration-exit-standard)] data-[state=open]:ease-[var(--ease-enter)] data-[state=closed]:ease-[var(--ease-exit)] data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 rounded-2xl border border-border",
|
|
30
30
|
{
|
|
31
31
|
variants: {
|
|
32
32
|
size: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './chunk-
|
|
1
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from './chunk-JWTN7MNK.js';
|
|
2
2
|
import { cn } from './chunk-FEK5XGZW.js';
|
|
3
3
|
import { __objRest, __spreadValues, __spreadProps } from './chunk-MMUBH76A.js';
|
|
4
4
|
import * as React from 'react';
|
|
@@ -4,7 +4,7 @@ import * as React from 'react';
|
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
|
|
6
6
|
declare const badgeVariants: (props?: ({
|
|
7
|
-
variant?: "
|
|
7
|
+
variant?: "default" | "destructive" | "warning" | "success" | "outline" | "secondary" | "glass" | "overlay" | "brown" | "code" | "onPrimary" | "confirmed" | "pending" | "completed" | null | undefined;
|
|
8
8
|
size?: "status" | "chip" | null | undefined;
|
|
9
9
|
live?: boolean | null | undefined;
|
|
10
10
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
@@ -21,7 +21,8 @@ import * as React from 'react';
|
|
|
21
21
|
* The whole row is one link. Strings arrive formatted and localised; the thumb
|
|
22
22
|
* arrives rendered, so the app picks its own image component.
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
/** `completed` is the Past tab's row — the evening happened. */
|
|
25
|
+
type BookingRowStatus = "confirmed" | "pending" | "completed";
|
|
25
26
|
type BookingRowLinkProps = {
|
|
26
27
|
href: string;
|
|
27
28
|
className?: string;
|
|
@@ -46,8 +46,11 @@ function BookingRow({
|
|
|
46
46
|
href,
|
|
47
47
|
className: cn(
|
|
48
48
|
"flex gap-3 py-3.5 leading-[1.2] text-foreground",
|
|
49
|
+
// The phone has no hover, so the press is the only feedback a tap on
|
|
50
|
+
// a whole-row link gets before the page changes under it.
|
|
51
|
+
"transition-colors active:bg-surface-2 motion-reduce:transition-none",
|
|
49
52
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
|
|
50
|
-
"md:items-center md:gap-3.5 md:px-[18px] md:hover:bg-accent/[0.03]",
|
|
53
|
+
"md:items-center md:gap-3.5 md:px-[18px] md:active:bg-transparent md:hover:bg-accent/[0.03]",
|
|
51
54
|
highlighted && "md:bg-accent/5 md:hover:bg-accent/5",
|
|
52
55
|
className
|
|
53
56
|
),
|
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { VariantProps } from 'class-variance-authority';
|
|
4
4
|
|
|
5
5
|
declare const buttonVariants: (props?: ({
|
|
6
|
-
variant?: "
|
|
6
|
+
variant?: "default" | "destructive" | "warning" | "link" | "outline" | "secondary" | "ghost" | "glass" | "overlay" | "ink" | "brown" | "cta" | null | undefined;
|
|
7
7
|
size?: "default" | "cta" | "xs" | "sm" | "lg" | "pill" | "cta-sm" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
8
8
|
fullWidth?: boolean | null | undefined;
|
|
9
9
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
@@ -3,12 +3,12 @@ import * as React from 'react';
|
|
|
3
3
|
import { VariantProps } from 'class-variance-authority';
|
|
4
4
|
|
|
5
5
|
declare const cardVariants: (props?: ({
|
|
6
|
-
variant?: "
|
|
6
|
+
variant?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
|
|
7
7
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
8
8
|
interactive?: boolean | null | undefined;
|
|
9
9
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
10
|
declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
|
|
11
|
-
variant?: "
|
|
11
|
+
variant?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
|
|
12
12
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
13
13
|
interactive?: boolean | null | undefined;
|
|
14
14
|
} & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
|
|
2
|
-
import { Command, CommandInput, CommandList, CommandLoading, CommandEmpty, CommandGroup, CommandItem } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
import { Command, CommandInput, CommandList, CommandLoading, CommandEmpty, CommandGroup, CommandItem } from '../chunk-ZJMCU7MI.js';
|
|
3
|
+
import '../chunk-JWTN7MNK.js';
|
|
4
4
|
import { Button } from '../chunk-5HHRVJOT.js';
|
|
5
5
|
import '../chunk-RIH2IS7X.js';
|
|
6
6
|
import '../chunk-5YNIQ2BL.js';
|
|
@@ -4,11 +4,11 @@ import { DialogProps } from '@radix-ui/react-dialog';
|
|
|
4
4
|
|
|
5
5
|
declare const Command: React.ForwardRefExoticComponent<Omit<{
|
|
6
6
|
children?: React.ReactNode;
|
|
7
|
-
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
7
|
+
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
8
8
|
ref?: React.Ref<HTMLDivElement>;
|
|
9
9
|
} & {
|
|
10
10
|
asChild?: boolean;
|
|
11
|
-
},
|
|
11
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
|
|
12
12
|
label?: string;
|
|
13
13
|
shouldFilter?: boolean;
|
|
14
14
|
filter?: (value: string, search: string, keywords?: string[]) => number;
|
|
@@ -28,61 +28,61 @@ declare const CommandInput: React.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<
|
|
|
28
28
|
ref?: React.Ref<HTMLInputElement>;
|
|
29
29
|
} & {
|
|
30
30
|
asChild?: boolean;
|
|
31
|
-
}, "
|
|
31
|
+
}, "asChild" | "key" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "onChange" | "type" | "value"> & {
|
|
32
32
|
value?: string;
|
|
33
33
|
onValueChange?: (search: string) => void;
|
|
34
34
|
} & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
35
35
|
declare const CommandList: React.ForwardRefExoticComponent<Omit<{
|
|
36
36
|
children?: React.ReactNode;
|
|
37
|
-
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
37
|
+
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
38
38
|
ref?: React.Ref<HTMLDivElement>;
|
|
39
39
|
} & {
|
|
40
40
|
asChild?: boolean;
|
|
41
|
-
},
|
|
41
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
|
|
42
42
|
label?: string;
|
|
43
43
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
44
44
|
declare const CommandEmpty: React.ForwardRefExoticComponent<Omit<{
|
|
45
45
|
children?: React.ReactNode;
|
|
46
|
-
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
46
|
+
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
47
47
|
ref?: React.Ref<HTMLDivElement>;
|
|
48
48
|
} & {
|
|
49
49
|
asChild?: boolean;
|
|
50
|
-
},
|
|
50
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
51
51
|
declare const CommandLoading: React.ForwardRefExoticComponent<Omit<{
|
|
52
52
|
children?: React.ReactNode;
|
|
53
|
-
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
53
|
+
} & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
54
54
|
ref?: React.Ref<HTMLDivElement>;
|
|
55
55
|
} & {
|
|
56
56
|
asChild?: boolean;
|
|
57
|
-
},
|
|
57
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
|
|
58
58
|
progress?: number;
|
|
59
59
|
label?: string;
|
|
60
60
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
61
61
|
declare const CommandGroup: React.ForwardRefExoticComponent<Omit<{
|
|
62
62
|
children?: React.ReactNode;
|
|
63
|
-
} & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
63
|
+
} & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
64
64
|
ref?: React.Ref<HTMLDivElement>;
|
|
65
65
|
} & {
|
|
66
66
|
asChild?: boolean;
|
|
67
|
-
},
|
|
67
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "heading" | "value"> & {
|
|
68
68
|
heading?: React.ReactNode;
|
|
69
69
|
value?: string;
|
|
70
70
|
forceMount?: boolean;
|
|
71
71
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
72
|
-
declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
72
|
+
declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
73
73
|
ref?: React.Ref<HTMLDivElement>;
|
|
74
74
|
} & {
|
|
75
75
|
asChild?: boolean;
|
|
76
|
-
},
|
|
76
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
|
|
77
77
|
alwaysRender?: boolean;
|
|
78
78
|
} & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
79
79
|
declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
|
|
80
80
|
children?: React.ReactNode;
|
|
81
|
-
} & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>,
|
|
81
|
+
} & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
|
|
82
82
|
ref?: React.Ref<HTMLDivElement>;
|
|
83
83
|
} & {
|
|
84
84
|
asChild?: boolean;
|
|
85
|
-
},
|
|
85
|
+
}, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "onSelect" | "disabled" | "value"> & {
|
|
86
86
|
disabled?: boolean;
|
|
87
87
|
onSelect?: (value: string) => void;
|
|
88
88
|
value?: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut } from '../chunk-ZJMCU7MI.js';
|
|
2
|
+
import '../chunk-JWTN7MNK.js';
|
|
3
3
|
import '../chunk-FEK5XGZW.js';
|
|
4
4
|
import '../chunk-MMUBH76A.js';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, dialogContentVariants } from '../chunk-
|
|
1
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, dialogContentVariants } from '../chunk-JWTN7MNK.js';
|
|
2
2
|
import '../chunk-FEK5XGZW.js';
|
|
3
3
|
import '../chunk-MMUBH76A.js';
|
|
@@ -51,7 +51,7 @@ var DrawerContent = React.forwardRef((_a, ref) => {
|
|
|
51
51
|
ref,
|
|
52
52
|
"data-slot": "drawer-content",
|
|
53
53
|
className: cn(
|
|
54
|
-
"fixed z-[1000] flex border-border bg-card shadow-
|
|
54
|
+
"fixed z-[1000] flex border-border bg-card shadow-[var(--shadow-overlay)]",
|
|
55
55
|
positionClasses,
|
|
56
56
|
// The single height cap for every vertical drawer. Consumers should
|
|
57
57
|
// NOT restate it: six app call sites carried an identical
|
|
@@ -3,12 +3,12 @@ import * as React from 'react';
|
|
|
3
3
|
import { VariantProps } from 'class-variance-authority';
|
|
4
4
|
|
|
5
5
|
declare const itemVariants: (props?: ({
|
|
6
|
-
variant?: "default" | "
|
|
6
|
+
variant?: "default" | "muted" | "outline" | null | undefined;
|
|
7
7
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
8
8
|
interactive?: boolean | null | undefined;
|
|
9
9
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
10
|
declare const Item: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
|
|
11
|
-
variant?: "default" | "
|
|
11
|
+
variant?: "default" | "muted" | "outline" | null | undefined;
|
|
12
12
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
13
13
|
interactive?: boolean | null | undefined;
|
|
14
14
|
} & class_variance_authority_types.ClassProp) | undefined) => string> & {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Checkbox } from '../chunk-L3CDXVEP.js';
|
|
2
2
|
import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
|
|
3
|
-
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-
|
|
4
|
-
import '../chunk-
|
|
3
|
+
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-ZJMCU7MI.js';
|
|
4
|
+
import '../chunk-JWTN7MNK.js';
|
|
5
5
|
import { Button } from '../chunk-5HHRVJOT.js';
|
|
6
6
|
import '../chunk-RIH2IS7X.js';
|
|
7
7
|
import '../chunk-5YNIQ2BL.js';
|
|
@@ -14,7 +14,7 @@ function PartyCounter({
|
|
|
14
14
|
}) {
|
|
15
15
|
const atMin = value <= min;
|
|
16
16
|
const atMax = value >= max;
|
|
17
|
-
const roundButton = "grid size-9 shrink-0 cursor-pointer place-items-center rounded-full transition-[filter,background-color,opacity] duration-150 motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card disabled:cursor-not-allowed disabled:opacity-40 [&_svg]:size-4";
|
|
17
|
+
const roundButton = "relative grid size-9 shrink-0 cursor-pointer place-items-center rounded-full transition-[filter,background-color,opacity] duration-150 after:absolute after:-inset-1 after:content-[''] motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card disabled:cursor-not-allowed disabled:opacity-40 [&_svg]:size-4";
|
|
18
18
|
return /* @__PURE__ */ jsxs(
|
|
19
19
|
"div",
|
|
20
20
|
{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
|
|
2
|
-
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-ZJMCU7MI.js';
|
|
3
|
+
import '../chunk-JWTN7MNK.js';
|
|
4
4
|
import { Button } from '../chunk-5HHRVJOT.js';
|
|
5
5
|
import '../chunk-RIH2IS7X.js';
|
|
6
6
|
import '../chunk-5YNIQ2BL.js';
|
package/dist/components/sheet.js
CHANGED
|
@@ -26,7 +26,7 @@ var SheetOverlay = React.forwardRef((_a, ref) => {
|
|
|
26
26
|
});
|
|
27
27
|
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
28
28
|
var sheetVariants = cva(
|
|
29
|
-
"fixed z-[1000] gap-4 bg-background border-border shadow-
|
|
29
|
+
"fixed z-[1000] gap-4 bg-background border-border shadow-[var(--shadow-overlay)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:duration-[var(--duration-deliberate)] data-[state=closed]:duration-[var(--duration-exit-standard)] data-[state=open]:ease-[var(--ease-enter)] data-[state=closed]:ease-[var(--ease-exit)]",
|
|
30
30
|
{
|
|
31
31
|
variants: {
|
|
32
32
|
side: {
|
|
@@ -4,11 +4,11 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
4
4
|
|
|
5
5
|
declare const spinnerVariants: (props?: ({
|
|
6
6
|
size?: "default" | "xs" | "sm" | "lg" | "xl" | null | undefined;
|
|
7
|
-
tone?: "
|
|
7
|
+
tone?: "default" | "destructive" | "inherit" | "primary" | null | undefined;
|
|
8
8
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
9
9
|
declare const Spinner: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & VariantProps<(props?: ({
|
|
10
10
|
size?: "default" | "xs" | "sm" | "lg" | "xl" | null | undefined;
|
|
11
|
-
tone?: "
|
|
11
|
+
tone?: "default" | "destructive" | "inherit" | "primary" | null | undefined;
|
|
12
12
|
} & class_variance_authority_types.ClassProp) | undefined) => string> & {
|
|
13
13
|
/** Visually-hidden label for screen readers. Defaults to "Loading". */
|
|
14
14
|
label?: string;
|
package/dist/components/tag.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ import * as React from 'react';
|
|
|
3
3
|
import { VariantProps } from 'class-variance-authority';
|
|
4
4
|
|
|
5
5
|
declare const tagVariants: (props?: ({
|
|
6
|
-
variant?: "default" | "destructive" | "
|
|
6
|
+
variant?: "default" | "destructive" | "warning" | "success" | "primary" | "outline" | "quiet" | null | undefined;
|
|
7
7
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
8
8
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
9
9
|
declare const Tag: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & VariantProps<(props?: ({
|
|
10
|
-
variant?: "default" | "destructive" | "
|
|
10
|
+
variant?: "default" | "destructive" | "warning" | "success" | "primary" | "outline" | "quiet" | null | undefined;
|
|
11
11
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
12
12
|
} & class_variance_authority_types.ClassProp) | undefined) => string> & {
|
|
13
13
|
onRemove?: () => void;
|
|
@@ -22,9 +22,9 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
22
22
|
* Weights are 400 / 600 / 700. 500 is not in the system.
|
|
23
23
|
*/
|
|
24
24
|
declare const textVariants: (props?: ({
|
|
25
|
-
variant?: "
|
|
26
|
-
color?: "
|
|
27
|
-
weight?: "bold" | "
|
|
25
|
+
variant?: "small" | "display" | "h1" | "h2" | "h3" | "h4" | "body-lg" | "body" | "body-sm" | "caption" | "label" | "overline" | null | undefined;
|
|
26
|
+
color?: "default" | "destructive" | "inherit" | "muted" | "primary" | "primary-foreground" | null | undefined;
|
|
27
|
+
weight?: "bold" | "normal" | "medium" | "semibold" | null | undefined;
|
|
28
28
|
leading?: "none" | "normal" | "tight" | "snug" | "relaxed" | "loose" | null | undefined;
|
|
29
29
|
tracking?: "normal" | "tight" | "wide" | "wider" | null | undefined;
|
|
30
30
|
wrap?: "balance" | "pretty" | "nowrap" | null | undefined;
|
|
@@ -26,9 +26,12 @@ function TimeSlot({
|
|
|
26
26
|
// Content sits at the top: a slot without a meta line in a row with
|
|
27
27
|
// one is stretched by the grid, and the time must not drop to the middle.
|
|
28
28
|
"flex w-full cursor-pointer flex-col items-center justify-start rounded-[11px] border px-1 py-2 text-center leading-[1.2]",
|
|
29
|
-
|
|
29
|
+
// A press state, not just hover: this is the most-tapped control in
|
|
30
|
+
// the flow and the primary device has no hover at all, so without it
|
|
31
|
+
// a tap gives nothing back until the fill repaints.
|
|
32
|
+
"transition-[border-color,filter,transform] duration-150 not-disabled:active:scale-[0.98] motion-reduce:transition-none",
|
|
30
33
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
31
|
-
selected ? "border-transparent bg-[image:var(--gradient-primary)] text-
|
|
34
|
+
selected ? "border-transparent bg-[image:var(--gradient-primary)] text-primary-foreground hover:brightness-[0.94]" : "border-border bg-card text-foreground hover:border-accent/50",
|
|
32
35
|
unavailable && "cursor-not-allowed opacity-[0.32] hover:border-border"
|
|
33
36
|
),
|
|
34
37
|
children: [
|
|
@@ -47,7 +50,7 @@ function TimeSlot({
|
|
|
47
50
|
{
|
|
48
51
|
className: cn(
|
|
49
52
|
"mt-[3px] block text-[9.5px] leading-[1.2]",
|
|
50
|
-
selected ? "text-
|
|
53
|
+
selected ? "text-primary-foreground/80" : tone === "waitlist" ? "text-muted-foreground" : "text-accent"
|
|
51
54
|
),
|
|
52
55
|
children: meta
|
|
53
56
|
}
|
|
@@ -5,7 +5,7 @@ import * as TogglePrimitive from '@radix-ui/react-toggle';
|
|
|
5
5
|
import { VariantProps } from 'class-variance-authority';
|
|
6
6
|
|
|
7
7
|
declare const toggleVariants: (props?: ({
|
|
8
|
-
variant?: "
|
|
8
|
+
variant?: "default" | "tab" | "outline" | "chip" | "segmented" | null | undefined;
|
|
9
9
|
size?: "default" | "sm" | "lg" | null | undefined;
|
|
10
10
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
11
11
|
declare function Toggle({ className, variant, size, ...props }: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>): react_jsx_runtime.JSX.Element;
|
package/package.json
CHANGED
|
@@ -24,7 +24,8 @@ import { Badge } from "./badge";
|
|
|
24
24
|
* arrives rendered, so the app picks its own image component.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
/** `completed` is the Past tab's row — the evening happened. */
|
|
28
|
+
export type BookingRowStatus = "confirmed" | "pending" | "completed";
|
|
28
29
|
|
|
29
30
|
export type BookingRowLinkProps = {
|
|
30
31
|
href: string;
|
|
@@ -103,8 +104,11 @@ export function BookingRow({
|
|
|
103
104
|
href={href}
|
|
104
105
|
className={cn(
|
|
105
106
|
"flex gap-3 py-3.5 leading-[1.2] text-foreground",
|
|
107
|
+
// The phone has no hover, so the press is the only feedback a tap on
|
|
108
|
+
// a whole-row link gets before the page changes under it.
|
|
109
|
+
"transition-colors active:bg-surface-2 motion-reduce:transition-none",
|
|
106
110
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
|
|
107
|
-
"md:items-center md:gap-3.5 md:px-[18px] md:hover:bg-accent/[0.03]",
|
|
111
|
+
"md:items-center md:gap-3.5 md:px-[18px] md:active:bg-transparent md:hover:bg-accent/[0.03]",
|
|
108
112
|
highlighted && "md:bg-accent/5 md:hover:bg-accent/5",
|
|
109
113
|
className
|
|
110
114
|
)}
|
|
@@ -28,7 +28,7 @@ const DialogOverlay = React.forwardRef<
|
|
|
28
28
|
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
29
29
|
|
|
30
30
|
const dialogContentVariants = cva(
|
|
31
|
-
"fixed left-[50%] top-[50%] z-[1000] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-
|
|
31
|
+
"fixed left-[50%] top-[50%] z-[1000] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-[var(--shadow-overlay)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:duration-[var(--duration-deliberate)] data-[state=closed]:duration-[var(--duration-exit-standard)] data-[state=open]:ease-[var(--ease-enter)] data-[state=closed]:ease-[var(--ease-exit)] data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 rounded-2xl border border-border",
|
|
32
32
|
{
|
|
33
33
|
variants: {
|
|
34
34
|
size: {
|
|
@@ -69,7 +69,7 @@ const DrawerContent = React.forwardRef<
|
|
|
69
69
|
ref={ref}
|
|
70
70
|
data-slot="drawer-content"
|
|
71
71
|
className={cn(
|
|
72
|
-
"fixed z-[1000] flex border-border bg-card shadow-
|
|
72
|
+
"fixed z-[1000] flex border-border bg-card shadow-[var(--shadow-overlay)]",
|
|
73
73
|
positionClasses,
|
|
74
74
|
// The single height cap for every vertical drawer. Consumers should
|
|
75
75
|
// NOT restate it: six app call sites carried an identical
|
|
@@ -50,8 +50,10 @@ export function PartyCounter({
|
|
|
50
50
|
const atMin = value <= min;
|
|
51
51
|
const atMax = value >= max;
|
|
52
52
|
|
|
53
|
+
// 36px circle, 44px target: the counter sits in a 52px row, so the tap
|
|
54
|
+
// band can grow past the drawn button without reaching its neighbour.
|
|
53
55
|
const roundButton =
|
|
54
|
-
"grid size-9 shrink-0 cursor-pointer place-items-center rounded-full transition-[filter,background-color,opacity] duration-150 motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card disabled:cursor-not-allowed disabled:opacity-40 [&_svg]:size-4";
|
|
56
|
+
"relative grid size-9 shrink-0 cursor-pointer place-items-center rounded-full transition-[filter,background-color,opacity] duration-150 after:absolute after:-inset-1 after:content-[''] motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card disabled:cursor-not-allowed disabled:opacity-40 [&_svg]:size-4";
|
|
55
57
|
|
|
56
58
|
return (
|
|
57
59
|
<div
|
package/src/components/sheet.tsx
CHANGED
|
@@ -46,7 +46,7 @@ SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
|
46
46
|
* separates the two and a border only draws a hard line around the radius.
|
|
47
47
|
*/
|
|
48
48
|
const sheetVariants = cva(
|
|
49
|
-
"fixed z-[1000] gap-4 bg-background border-border shadow-
|
|
49
|
+
"fixed z-[1000] gap-4 bg-background border-border shadow-[var(--shadow-overlay)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:duration-[var(--duration-deliberate)] data-[state=closed]:duration-[var(--duration-exit-standard)] data-[state=open]:ease-[var(--ease-enter)] data-[state=closed]:ease-[var(--ease-exit)]",
|
|
50
50
|
{
|
|
51
51
|
variants: {
|
|
52
52
|
side: {
|
|
@@ -63,10 +63,13 @@ export function TimeSlot({
|
|
|
63
63
|
// Content sits at the top: a slot without a meta line in a row with
|
|
64
64
|
// one is stretched by the grid, and the time must not drop to the middle.
|
|
65
65
|
"flex w-full cursor-pointer flex-col items-center justify-start rounded-[11px] border px-1 py-2 text-center leading-[1.2]",
|
|
66
|
-
|
|
66
|
+
// A press state, not just hover: this is the most-tapped control in
|
|
67
|
+
// the flow and the primary device has no hover at all, so without it
|
|
68
|
+
// a tap gives nothing back until the fill repaints.
|
|
69
|
+
"transition-[border-color,filter,transform] duration-150 not-disabled:active:scale-[0.98] motion-reduce:transition-none",
|
|
67
70
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
68
71
|
selected
|
|
69
|
-
? "border-transparent bg-[image:var(--gradient-primary)] text-
|
|
72
|
+
? "border-transparent bg-[image:var(--gradient-primary)] text-primary-foreground hover:brightness-[0.94]"
|
|
70
73
|
: "border-border bg-card text-foreground hover:border-accent/50",
|
|
71
74
|
unavailable && "cursor-not-allowed opacity-[0.32] hover:border-border"
|
|
72
75
|
)}
|
|
@@ -83,7 +86,11 @@ export function TimeSlot({
|
|
|
83
86
|
<span
|
|
84
87
|
className={cn(
|
|
85
88
|
"mt-[3px] block text-[9.5px] leading-[1.2]",
|
|
86
|
-
selected
|
|
89
|
+
selected
|
|
90
|
+
? "text-primary-foreground/80"
|
|
91
|
+
: tone === "waitlist"
|
|
92
|
+
? "text-muted-foreground"
|
|
93
|
+
: "text-accent"
|
|
87
94
|
)}
|
|
88
95
|
>
|
|
89
96
|
{meta}
|
package/src/globals.css
CHANGED
|
@@ -80,7 +80,12 @@ h6 {
|
|
|
80
80
|
wells and highlighted rows. Neutral on purpose — its call sites pair it
|
|
81
81
|
with `text-accent`, and the text is what carries the meaning. */
|
|
82
82
|
--accent-subtle: oklch(0.945 0 0);
|
|
83
|
-
|
|
83
|
+
/* The house red, not Shadcn's factory one. The default sat at chroma
|
|
84
|
+
0.245 — louder than anything else in this palette, and the same
|
|
85
|
+
out-shouting that got a 0.22 "ember" rejected for the accent. This is
|
|
86
|
+
--destructive-ink's value, so a destructive fill and a destructive label
|
|
87
|
+
are finally the same red; white on it measures 5.97:1 (was 4.77:1). */
|
|
88
|
+
--destructive: oklch(0.52 0.16 25);
|
|
84
89
|
--destructive-foreground: oklch(0.985 0 0);
|
|
85
90
|
/**
|
|
86
91
|
* Destructive and success as INK — a red or green label on a card, where
|
|
@@ -156,6 +161,12 @@ h6 {
|
|
|
156
161
|
the least attributable place for a colour cast. */
|
|
157
162
|
--shadow-panel: 0 1px 2px oklch(0.52 0 0 / 0.04), 0 4px 16px -4px oklch(0.52 0 0 / 0.07);
|
|
158
163
|
|
|
164
|
+
/* The dim behind a sheet or a dialog. It has to be mode-aware: this value
|
|
165
|
+
over a white page separates plane 2 from plane 0 by 3.6:1, and the same
|
|
166
|
+
value over a near-black one dims nothing at all (the dark block below
|
|
167
|
+
carries the deeper, more opaque sibling). */
|
|
168
|
+
--scrim: oklch(0.16 0.01 55 / 0.5);
|
|
169
|
+
|
|
159
170
|
/* Brown variant — replaces hardcoded #482E1F across button/badge */
|
|
160
171
|
--brown: oklch(0.31 0.05 45);
|
|
161
172
|
--brown-foreground: oklch(0.985 0 0);
|
|
@@ -305,6 +316,11 @@ h6 {
|
|
|
305
316
|
--shadow-card-hover: 0 4px 16px oklch(0 0 0 / 0.3), 0 1px 4px oklch(0 0 0 / 0.2);
|
|
306
317
|
--shadow-overlay: 0 8px 32px oklch(0 0 0 / 0.4), 0 2px 8px oklch(0 0 0 / 0.25);
|
|
307
318
|
--shadow-panel: 0 1px 3px oklch(0 0 0 / 0.24), 0 8px 24px -8px oklch(0 0 0 / 0.34);
|
|
319
|
+
/* Deeper and more opaque than light's: on a 0.155 canvas the light value
|
|
320
|
+
composites to the canvas itself, leaving a sheet with no edge at all —
|
|
321
|
+
in dark, elevation is carried by the scrim and by lightness, not by a
|
|
322
|
+
shadow nobody can see. */
|
|
323
|
+
--scrim: oklch(0.05 0.01 55 / 0.78);
|
|
308
324
|
--sidebar: oklch(0.205 0 0);
|
|
309
325
|
--sidebar-foreground: oklch(0.985 0 0);
|
|
310
326
|
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
@@ -372,6 +388,8 @@ h6 {
|
|
|
372
388
|
--color-destructive-foreground: var(--destructive-foreground);
|
|
373
389
|
--color-destructive-ink: var(--destructive-ink);
|
|
374
390
|
--color-success-ink: var(--success-ink);
|
|
391
|
+
/* `bg-scrim` — the dim behind a sheet or a dialog. */
|
|
392
|
+
--color-scrim: var(--scrim);
|
|
375
393
|
--color-border: var(--border);
|
|
376
394
|
--color-input: var(--input);
|
|
377
395
|
--color-ring: var(--ring);
|