Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
fc22a69
fix: badge 19 example (#812)
pasqualevitiello Jul 2, 2026
996b077
fix: remove dead data slot attributes (#813)
pasqualevitiello Jul 6, 2026
5980343
Revert "improve transition"
devin-ai-integration[bot] Jul 6, 2026
48feaf4
Revert "size transition component"
devin-ai-integration[bot] Jul 6, 2026
67b9fa3
feat(booker): animate step 1->2 with motion instead of custom SizeTra…
devin-ai-integration[bot] Jul 6, 2026
d0e16cb
fix(booker): remove layout=position from steps to stop horizontal slide
devin-ai-integration[bot] Jul 6, 2026
6fb663b
merge feat/atoms: keep motion step transition, drop size-transition
devin-ai-integration[bot] Jul 6, 2026
a7a23c9
feat(booker): drive real width/height with motion animate + AnimatePr…
devin-ai-integration[bot] Jul 6, 2026
cfcae4d
refactor(booker): extract step resize into hook, autofocus confirm input
devin-ai-integration[bot] Jul 6, 2026
4efce4f
mc
pasqualevitiello Jul 6, 2026
49f680d
build reg
pasqualevitiello Jul 6, 2026
9ea99bf
fix(booker): trigger step resize on step-value change, not first-rend…
devin-ai-integration[bot] Jul 6, 2026
08a28d7
chore(booker): TEMP diagnostic logging for step resize
devin-ai-integration[bot] Jul 6, 2026
9b6b00a
fix(booker): FLIP from resting size so step resize animates every time
devin-ai-integration[bot] Jul 6, 2026
f2ae67f
simplify motion
pasqualevitiello Jul 6, 2026
275237f
remove comments
pasqualevitiello Jul 6, 2026
bc310f7
more optimisations
pasqualevitiello Jul 6, 2026
7fed84a
mc
pasqualevitiello Jul 6, 2026
96723c3
build reg
pasqualevitiello Jul 6, 2026
c43e623
complete form
pasqualevitiello Jul 6, 2026
2208a24
form improvements
pasqualevitiello Jul 8, 2026
ffbb5c0
mc
pasqualevitiello Jul 8, 2026
959b73c
build reg
pasqualevitiello Jul 8, 2026
62bdb4f
move the data info
pasqualevitiello Jul 8, 2026
7aca8ba
implement form validation
pasqualevitiello Jul 8, 2026
6b24e9d
icons alignment
pasqualevitiello Jul 8, 2026
d0ac5e6
feat: add new weekly availability editor components (#815)
pasqualevitiello Jul 9, 2026
1664a7f
feat: add gmaps autocomplete particle (#816)
pasqualevitiello Jul 10, 2026
96faac8
submit form implementation
pasqualevitiello Jul 13, 2026
bd3777a
feat: update fonts (#810)
pasqualevitiello Jul 13, 2026
bcd2222
feat: add new confirm particle (#819)
pasqualevitiello Jul 15, 2026
b4591e7
feat: add 2 new particles - team member selector (#820)
pasqualevitiello Jul 15, 2026
aa2636c
feat: add calendar particle with 24-hour autocomplete time input (#822)
pasqualevitiello Jul 21, 2026
6422daa
feat: upgrade React DayPicker to v10 (#825)
pasqualevitiello Jul 26, 2026
b1cc3a2
fix(ui): give drawer --inset a unit so popup slides (#807)
boldurean Jul 26, 2026
85249e9
fix(toast): correct exit animation direction for top-positioned toast…
rodrigopereiradevelopment Jul 26, 2026
caaf517
fix(input-group): prevent addon text from being cut off (#827)
pasqualevitiello Jul 29, 2026
8d19424
feat(scroll-area): make overscroll contain opt-in (#829)
pasqualevitiello Jul 31, 2026
e43fa4a
fix(ui): improve form control autofill text colors in iframes (#830)
pasqualevitiello Aug 1, 2026
ad79723
docs(skills): refresh particle references (#836)
pasqualevitiello Aug 18, 2026
6bae419
feat(ui): add segmented control patterns (#835)
pasqualevitiello Aug 18, 2026
f27d668
feat(ui): share segmented item layout styles with Tabs (#837)
pasqualevitiello Aug 19, 2026
19620ae
docs(changelog): combine segmented control entries under August 19 (#…
pasqualevitiello Aug 19, 2026
0630457
fix(scroll-area): correct transition-shadows typo so the focus ring a…
funcpp Aug 29, 2026
4ebe375
fix(input-group): ignore portaled descendant events (#833)
songkeys Aug 29, 2026
758e653
fix(ui): contain long item labels (#842)
pasqualevitiello Aug 31, 2026
705cb73
fix(toast): keep anchored toasts above later-opened popovers (#845)
pasqualevitiello Sep 5, 2026
4b1240b
chore(ui): update Base UI to 1.8.0 (#846)
pasqualevitiello Sep 7, 2026
3bab654
chore(ui): define Tailwind CSS compatibility (#847)
pasqualevitiello Sep 7, 2026
e937bec
feat: migrate TanStack Table to v9 (#848)
pasqualevitiello Sep 8, 2026
614c812
Merge remote-tracking branch 'origin/main' into devin/1783358765-book…
pasqualevitiello Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
463 changes: 254 additions & 209 deletions apps/examples/calcom/app/(dashboard)/members/members-page-client.tsx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,7 @@ export function AnalyticsAppsContent() {
{isSmallScreen ? (
<ScrollArea
className="-mx-4 w-[calc(100%+--spacing(4)*2)]"
overscrollContain
scrollbarGutter
>
<div className="flex w-max gap-0.5 px-4">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ import {
PopoverTrigger,
} from "@coss/ui/components/popover";
import { SelectButton } from "@coss/ui/components/select";
import type { DateRange } from "@daypicker/react";
import { ExternalLinkIcon, FileTextIcon, SearchIcon } from "lucide-react";
import Link from "next/link";
import { useState } from "react";
import type { DateRange } from "react-day-picker";
import {
AppHeader,
AppHeaderContent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ export function NewWebhookFormFields() {
<CollapsiblePanel>
<ScrollArea
className="mt-4 h-64 rounded-lg border border-input"
overscrollContain
scrollbarGutter
scrollFade
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,17 @@ import {
} from "@coss/ui/components/table";
import {
type ColumnDef,
columnSizingFeature,
columnVisibilityFeature,
createSortedRowModel,
flexRender,
getCoreRowModel,
getSortedRowModel,
rowSelectionFeature,
rowSortingFeature,
type SortingState,
useReactTable,
sortFn_alphanumeric,
sortFn_text,
tableFeatures,
useTable,
} from "@tanstack/react-table";
import {
ArrowUpRightIcon,
Expand Down Expand Up @@ -98,6 +104,18 @@ type TeamMember = {
hasOptions?: boolean;
};

const features = tableFeatures({
columnSizingFeature,
columnVisibilityFeature,
rowSelectionFeature,
rowSortingFeature,
sortedRowModel: createSortedRowModel(),
sortFns: {
alphanumeric: sortFn_alphanumeric,
text: sortFn_text,
},
});

const members: TeamMember[] = [
{
avatarUrl:
Expand Down Expand Up @@ -147,6 +165,15 @@ const members: TeamMember[] = [
},
];

function shouldIgnoreRowSelectionClick(target: EventTarget | null): boolean {
return (
target instanceof Element &&
target.closest(
'a, button, input, select, textarea, [role="button"], [role="checkbox"], [data-slot="checkbox"], [data-slot="label"]',
) !== null
);
}

function getInitials(name: string): string {
const parts = name.trim().split(/\s+/);
if (parts.length === 0) return "";
Expand Down Expand Up @@ -230,17 +257,16 @@ function getColumns({
}: {
showRoleColumn: boolean;
showLastActiveColumn: boolean;
}): ColumnDef<TeamMember>[] {
const cols: ColumnDef<TeamMember>[] = [
}): ColumnDef<typeof features, TeamMember>[] {
const cols: ColumnDef<typeof features, TeamMember>[] = [
{
cell: ({ row }) => (
<Label className="before:absolute before:inset-0">
<Label>
<Checkbox
aria-label={`Select ${row.original.name}`}
checked={row.getIsSelected()}
onCheckedChange={(value) => row.toggleSelected(!!value)}
/>
<span className="sr-only">{`Select ${row.original.name}`}</span>
</Label>
),
enableSorting: false,
Expand Down Expand Up @@ -330,7 +356,6 @@ export function TeamMembersPageClient() {
const [searchValue, setSearchValue] = useState("");
const [showRoleColumn, setShowRoleColumn] = useState(true);
const [showLastActiveColumn, setShowLastActiveColumn] = useState(true);
const [rowSelection, setRowSelection] = useState({});
const [sorting, setSorting] = useState<SortingState>([
{ desc: false, id: "name" },
]);
Expand Down Expand Up @@ -389,21 +414,21 @@ export function TeamMembersPageClient() {
});
}, [showLastActiveColumn, showRoleColumn]);

const table = useReactTable({
columns,
data: filteredMembers,
enableRowSelection: true,
enableSortingRemoval: false,
getCoreRowModel: getCoreRowModel(),
getRowId: (row) => row.id,
getSortedRowModel: getSortedRowModel(),
onRowSelectionChange: setRowSelection,
onSortingChange: setSorting,
state: {
rowSelection,
sorting,
const table = useTable(
{
columns,
data: filteredMembers,
enableRowSelection: true,
enableSortingRemoval: false,
features,
getRowId: (row) => row.id,
onSortingChange: setSorting,
state: {
sorting,
},
},
});
() => null,
);

return (
<>
Expand Down Expand Up @@ -521,100 +546,124 @@ export function TeamMembersPageClient() {
</Button>
</div>

<CardFrame className="w-full">
<Table variant="card" className="table-fixed">
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
const columnSize = header.column.getSize();

return (
<TableHead
className={
header.column.id === "name" ? "sm:w-auto!" : undefined
}
key={header.id}
style={
columnSize ? { width: `${columnSize}px` } : undefined
<table.Subscribe
selector={(state) => ({
rowSelection: state.rowSelection,
sorting: state.sorting,
})}
>
{() => (
<CardFrame className="w-full">
<Table variant="card" className="table-fixed">
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
const columnSize = header.column.getSize();

return (
<TableHead
className={
header.column.id === "name"
? "sm:w-auto!"
: undefined
}
key={header.id}
style={
columnSize
? { width: `${columnSize}px` }
: undefined
}
>
{header.isPlaceholder ? null : header.column.getCanSort() ? (
<div
className="flex h-full cursor-pointer select-none items-center justify-between gap-2"
onClick={header.column.getToggleSortingHandler()}
onKeyDown={(event) => {
if (
event.key === "Enter" ||
event.key === " "
) {
event.preventDefault();
header.column.getToggleSortingHandler()?.(
event,
);
}
}}
role="button"
tabIndex={0}
>
{flexRender(
header.column.columnDef.header,
header.getContext(),
)}
{{
asc: (
<ChevronUpIcon
aria-hidden="true"
className="size-4 shrink-0 opacity-80"
/>
),
desc: (
<ChevronDownIcon
aria-hidden="true"
className="size-4 shrink-0 opacity-80"
/>
),
}[header.column.getIsSorted() as string] ??
null}
</div>
) : (
flexRender(
header.column.columnDef.header,
header.getContext(),
)
)}
</TableHead>
);
})}
</TableRow>
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow
data-state={
row.getIsSelected() ? "selected" : undefined
}
key={row.id}
onClick={(event) => {
if (shouldIgnoreRowSelectionClick(event.target))
return;
row.toggleSelected();
}}
>
{header.isPlaceholder ? null : header.column.getCanSort() ? (
<div
className="flex h-full cursor-pointer select-none items-center justify-between gap-2"
onClick={header.column.getToggleSortingHandler()}
onKeyDown={(event) => {
if (event.key === "Enter" || event.key === " ") {
event.preventDefault();
header.column.getToggleSortingHandler()?.(
event,
);
}
}}
role="button"
tabIndex={0}
>
{row.getVisibleCells().map((cell) => (
<TableCell key={cell.id}>
{flexRender(
header.column.columnDef.header,
header.getContext(),
cell.column.columnDef.cell,
cell.getContext(),
)}
{{
asc: (
<ChevronUpIcon
aria-hidden="true"
className="size-4 shrink-0 opacity-80"
/>
),
desc: (
<ChevronDownIcon
aria-hidden="true"
className="size-4 shrink-0 opacity-80"
/>
),
}[header.column.getIsSorted() as string] ?? null}
</div>
) : (
flexRender(
header.column.columnDef.header,
header.getContext(),
)
)}
</TableHead>
);
})}
</TableRow>
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow
data-state={row.getIsSelected() ? "selected" : undefined}
key={row.id}
>
{row.getVisibleCells().map((cell) => (
<TableCell key={cell.id}>
{flexRender(
cell.column.columnDef.cell,
cell.getContext(),
)}
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell
className="h-24 text-center"
colSpan={columns.length}
>
No members found.
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell
className="h-24 text-center"
colSpan={columns.length}
>
No members found.
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</CardFrame>
</TableRow>
)}
</TableBody>
</Table>
</CardFrame>
)}
</table.Subscribe>
</div>
</>
);
Expand Down
4 changes: 2 additions & 2 deletions apps/examples/calcom/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
AnchoredToastProvider,
ToastProvider,
} from "@coss/ui/components/toast";
import { fontHeading, fontMono, fontSans } from "@coss/ui/fonts";
import { fontMono, fontSans } from "@coss/ui/fonts";
import { ThemeProvider } from "@coss/ui/shared/theme-provider";
import type { Metadata } from "next";
import { AppCommand } from "@/components/app/app-command";
Expand All @@ -24,7 +24,7 @@ export default function RootLayout({
return (
<html lang="en" suppressHydrationWarning>
<body
className={`${fontHeading.variable} ${fontSans.variable} ${fontMono.variable} relative bg-sidebar font-sans text-foreground antialiased`}
className={`${fontSans.variable} ${fontMono.variable} relative bg-sidebar font-sans text-foreground antialiased`}
>
<ThemeProvider>
<ToastProvider position="bottom-center">
Expand Down
2 changes: 1 addition & 1 deletion apps/examples/calcom/components/app/app-command.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -631,7 +631,7 @@ export function AppCommand(): React.ReactElement {
</Button>
</div>
<CommandPanel>
<ScrollArea scrollbarGutter scrollFade>
<ScrollArea overscrollContain scrollbarGutter scrollFade>
<div className="p-5">
{!aiState.isGenerating &&
!aiState.response &&
Expand Down
2 changes: 1 addition & 1 deletion apps/examples/calcom/components/app/app-header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export function AppHeaderContent({
}: React.ComponentProps<"div"> & { title: string }): React.ReactElement {
return (
<div className={cn("flex flex-col gap-1", className)} {...props}>
<h1 className="font-heading font-semibold text-lg leading-none">
<h1 className="font-bold font-heading text-lg leading-none [font-variation-settings:'GEOM'_50,'opsz'_32]">
{title}
</h1>
{children}
Expand Down
Loading
Loading