From 3d7f3ff0416fb7b051236c194ed1643040a908c5 Mon Sep 17 00:00:00 2001 From: pasqualevitiello Date: Mon, 15 Dec 2025 16:48:39 +0100 Subject: [PATCH 1/2] feat: add examples app --- apps/examples/.gitignore | 44 ++ apps/examples/README.md | 36 ++ apps/examples/app/calcom-shell/page.tsx | 18 + apps/examples/app/favicon.ico | Bin 0 -> 6117 bytes apps/examples/app/globals.css | 25 ++ apps/examples/app/layout.tsx | 42 ++ apps/examples/components/app-sidebar.tsx | 42 ++ apps/examples/components/event-types.tsx | 336 ++++++++++++++ apps/examples/components/header-actions.tsx | 39 ++ apps/examples/components/logo.tsx | 11 + apps/examples/components/mobile-footer.tsx | 86 ++++ apps/examples/components/mobile-header.tsx | 22 + apps/examples/components/nav-main.tsx | 209 +++++++++ apps/examples/components/nav-secondary.tsx | 48 ++ apps/examples/components/ui/sidebar.tsx | 475 ++++++++++++++++++++ apps/examples/components/user-menu.tsx | 107 +++++ apps/examples/hooks/use-mobile.ts | 48 ++ apps/examples/hooks/use-scroll-hide.ts | 38 ++ apps/examples/lib/navigation-data.ts | 145 ++++++ apps/examples/next.config.ts | 7 + apps/examples/package.json | 33 ++ apps/examples/postcss.config.mjs | 3 + apps/examples/tsconfig.json | 21 + bun.lock | 29 ++ public/fonts/CalSans-Regular.woff2 | Bin 0 -> 37412 bytes public/fonts/CalSansUI[MODE,wght].woff2 | Bin 0 -> 66368 bytes 26 files changed, 1864 insertions(+) create mode 100644 apps/examples/.gitignore create mode 100644 apps/examples/README.md create mode 100644 apps/examples/app/calcom-shell/page.tsx create mode 100644 apps/examples/app/favicon.ico create mode 100644 apps/examples/app/globals.css create mode 100644 apps/examples/app/layout.tsx create mode 100644 apps/examples/components/app-sidebar.tsx create mode 100644 apps/examples/components/event-types.tsx create mode 100644 apps/examples/components/header-actions.tsx create mode 100644 apps/examples/components/logo.tsx create mode 100644 apps/examples/components/mobile-footer.tsx create mode 100644 apps/examples/components/mobile-header.tsx create mode 100644 apps/examples/components/nav-main.tsx create mode 100644 apps/examples/components/nav-secondary.tsx create mode 100644 apps/examples/components/ui/sidebar.tsx create mode 100644 apps/examples/components/user-menu.tsx create mode 100644 apps/examples/hooks/use-mobile.ts create mode 100644 apps/examples/hooks/use-scroll-hide.ts create mode 100644 apps/examples/lib/navigation-data.ts create mode 100644 apps/examples/next.config.ts create mode 100644 apps/examples/package.json create mode 100644 apps/examples/postcss.config.mjs create mode 100644 apps/examples/tsconfig.json create mode 100644 public/fonts/CalSans-Regular.woff2 create mode 100644 public/fonts/CalSansUI[MODE,wght].woff2 diff --git a/apps/examples/.gitignore b/apps/examples/.gitignore new file mode 100644 index 000000000..cccfd3167 --- /dev/null +++ b/apps/examples/.gitignore @@ -0,0 +1,44 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# fumadocs +.source \ No newline at end of file diff --git a/apps/examples/README.md b/apps/examples/README.md new file mode 100644 index 000000000..1a873faca --- /dev/null +++ b/apps/examples/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun run dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/apps/examples/app/calcom-shell/page.tsx b/apps/examples/app/calcom-shell/page.tsx new file mode 100644 index 000000000..0676a333c --- /dev/null +++ b/apps/examples/app/calcom-shell/page.tsx @@ -0,0 +1,18 @@ +import { AppSidebar } from "@/components/app-sidebar"; +import { EventTypes } from "@/components/event-types"; +import { MobileFooter } from "@/components/mobile-footer"; +import { MobileHeader } from "@/components/mobile-header"; +import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"; + +export default function Page() { + return ( + + + + + + + + + ); +} diff --git a/apps/examples/app/favicon.ico b/apps/examples/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0a74387b3d55aee3c646fc28b65c3fc1f100742 GIT binary patch literal 6117 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 Rlga) { + return ( + + + + {children} + + + + ); +} diff --git a/apps/examples/components/app-sidebar.tsx b/apps/examples/components/app-sidebar.tsx new file mode 100644 index 000000000..a07a9dfaa --- /dev/null +++ b/apps/examples/components/app-sidebar.tsx @@ -0,0 +1,42 @@ +"use client"; + +import type * as React from "react"; +import { HeaderActions } from "@/components/header-actions"; +import { Logo } from "@/components/logo"; +import { NavMain } from "@/components/nav-main"; +import { NavSecondary } from "@/components/nav-secondary"; +import { + Sidebar, + SidebarContent, + SidebarHeader, + SidebarMenuButton, +} from "@/components/ui/sidebar"; +import { navFooterItems, navMainItems } from "@/lib/navigation-data"; + +export function AppSidebar({ + variant, + ...props +}: React.ComponentProps & { + variant?: never; +}) { + return ( + + +
+ } + /> + +
+
+ + + +
+ © 2025 Cal.com, Inc. v.5.9.6-h-2701b4d +
+
+
+ ); +} diff --git a/apps/examples/components/event-types.tsx b/apps/examples/components/event-types.tsx new file mode 100644 index 000000000..985355511 --- /dev/null +++ b/apps/examples/components/event-types.tsx @@ -0,0 +1,336 @@ +"use client"; + +import { Badge } from "@coss/ui/components/badge"; +import { Button } from "@coss/ui/components/button"; +import { Card, CardPanel } from "@coss/ui/components/card"; +import { Group, GroupSeparator } from "@coss/ui/components/group"; +import { + InputGroup, + InputGroupAddon, + InputGroupInput, +} from "@coss/ui/components/input-group"; +import { + Menu, + MenuCheckboxItem, + MenuItem, + MenuPopup, + MenuSeparator, + MenuTrigger, +} from "@coss/ui/components/menu"; +import { Switch } from "@coss/ui/components/switch"; +import { + Tooltip, + TooltipCreateHandle, + TooltipPopup, + TooltipProvider, + TooltipTrigger, +} from "@coss/ui/components/tooltip"; +import { + ClockIcon, + EllipsisIcon, + EyeIcon, + Link2Icon, + PlusIcon, + SearchIcon, +} from "lucide-react"; +import { useState } from "react"; + +const tooltipHandle = TooltipCreateHandle(); + +const eventTypes = [ + { + duration: "15m", + enabled: true, + hidden: false, + id: 1, + path: "/pasquale/15min", + title: "15 Min Meeting", + }, + { + duration: "30m", + enabled: true, + hidden: false, + id: 2, + path: "/pasquale/30min", + title: "30 Min Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 3, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 4, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 5, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 6, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 7, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 8, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 9, + path: "/pasquale/secret", + title: "Secret Meeting", + }, + { + duration: "15m", + enabled: false, + hidden: true, + id: 10, + path: "/pasquale/secret", + title: "Secret Meeting", + }, +]; + +export function EventTypes() { + const [hiddenStates, setHiddenStates] = useState>( + Object.fromEntries(eventTypes.map((et) => [et.id, et.hidden])), + ); + + const handleHiddenToggle = (id: number, checked: boolean) => { + setHiddenStates((prev) => ({ + ...prev, + [id]: checked, + })); + }; + + return ( + + {/* Header */} +
+
+

Event Types

+

+ Create events to share for people to book on your calendar. +

+
+ +
+ + {/* Search */} +
+ + + + + + +
+ +
+ {eventTypes.map((eventType) => { + const isHidden = hiddenStates[eventType.id]; + return ( + + +
+ {/* Content */} +
+
+

+ + {eventType.title} + +

+ + + {eventType.duration} + +
+

+ {eventType.path} +

+
+ {/* Actions */} +
+
+ {isHidden ? ( + + Hidden + + ) : null} + + + handleHiddenToggle(eventType.id, !checked) + } + /> + } + /> + + {isHidden ? "Show on profile" : "Hide from profile"} + + +
+ {/* Desktop: Group of buttons */} + + "Preview"} + render={ + + } + /> + + "Copy link"} + render={ + + } + /> + + + "More options"} + render={ + + } + /> + } + /> + + Edit + Duplicate + Embed + + Delete + + + + {/* Mobile: Single menu button with all actions */} + + + + + } + /> + + Preview + Copy link to event + Share + Edit + Duplicate + + Delete + + { + handleHiddenToggle(eventType.id, !checked); + }} + > + Show on profile + + + +
+
+
+
+ ); + })} +
+ + {/* No more results */} +
+ No more results +
+ + + {({ payload: Payload }) => ( + {Payload !== undefined && } + )} + +
+ ); +} diff --git a/apps/examples/components/header-actions.tsx b/apps/examples/components/header-actions.tsx new file mode 100644 index 000000000..484c83eb5 --- /dev/null +++ b/apps/examples/components/header-actions.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@coss/ui/components/avatar"; +import { SearchIcon } from "lucide-react"; +import Link from "next/link"; +import { SidebarMenuButton } from "@/components/ui/sidebar"; +import { UserMenu } from "@/components/user-menu"; + +export function HeaderActions() { + return ( +
+ + + + + + + CC + + + } + /> + +
+ ); +} diff --git a/apps/examples/components/logo.tsx b/apps/examples/components/logo.tsx new file mode 100644 index 000000000..f38187b8b --- /dev/null +++ b/apps/examples/components/logo.tsx @@ -0,0 +1,11 @@ +import Link from "next/link"; + +export function Logo({ ...props }) { + return ( + +

+ Cal.com +

+ + ); +} diff --git a/apps/examples/components/mobile-footer.tsx b/apps/examples/components/mobile-footer.tsx new file mode 100644 index 000000000..679042bb8 --- /dev/null +++ b/apps/examples/components/mobile-footer.tsx @@ -0,0 +1,86 @@ +"use client"; + +import { Button } from "@coss/ui/components/button"; +import { + Menu, + MenuGroup, + MenuItem, + MenuPopup, + MenuSeparator, + MenuTrigger, +} from "@coss/ui/components/menu"; +import { cn } from "@coss/ui/lib/utils"; +import { EllipsisIcon, PlusIcon } from "lucide-react"; +import Link from "next/link"; +import { useScrollHide } from "@/hooks/use-scroll-hide"; +import { navFooterItems, navMainItems } from "@/lib/navigation-data"; + +const primaryNavItems = navMainItems.slice(0, 3); +const remainingMainItems = navMainItems.slice(3); + +export function MobileFooter() { + const isHidden = useScrollHide(); + + return ( +
+
+ {primaryNavItems.map((item) => ( + + + + ))} + + + + + } + /> + + + {remainingMainItems.map((item) => ( + + + {item.title} + + } + /> + ))} + + + + {navFooterItems.map((item) => ( + + + {item.title} + + } + /> + ))} + + + +
+ +
+ ); +} diff --git a/apps/examples/components/mobile-header.tsx b/apps/examples/components/mobile-header.tsx new file mode 100644 index 000000000..be04473db --- /dev/null +++ b/apps/examples/components/mobile-header.tsx @@ -0,0 +1,22 @@ +"use client"; + +import { cn } from "@coss/ui/lib/utils"; +import { HeaderActions } from "@/components/header-actions"; +import { Logo } from "@/components/logo"; +import { useScrollHide } from "@/hooks/use-scroll-hide"; + +export function MobileHeader() { + const isHidden = useScrollHide(); + + return ( +
+ + +
+ ); +} diff --git a/apps/examples/components/nav-main.tsx b/apps/examples/components/nav-main.tsx new file mode 100644 index 000000000..6b649684a --- /dev/null +++ b/apps/examples/components/nav-main.tsx @@ -0,0 +1,209 @@ +"use client"; + +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@coss/ui/components/collapsible"; +import { + Menu, + MenuGroup, + MenuGroupLabel, + MenuItem, + MenuPopup, + MenuTrigger, +} from "@coss/ui/components/menu"; +import { TooltipTrigger } from "@coss/ui/components/tooltip"; +import { ChevronRightIcon, type LucideIcon } from "lucide-react"; +import Link from "next/link"; +import { useEffect, useRef } from "react"; +import { + SidebarGroup, + SidebarMenu, + SidebarMenuBadge, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, + sidebarTooltipHandle, + useSidebarMenuOpen, +} from "@/components/ui/sidebar"; +import { useIsBetweenMdAndLg } from "@/hooks/use-mobile"; + +type BaseNavItem = { + title: string; + url: string; + icon: LucideIcon; + isActive?: boolean; + badge?: string; +}; + +type NavSubItem = { + title: string; + url: string; +}; + +type NavItemWithChildren = BaseNavItem & { items: NavSubItem[] }; +type NavItemLeaf = BaseNavItem & { items?: undefined }; +type NavItem = NavItemLeaf | NavItemWithChildren; + +function hasSubItems(item: NavItem): item is NavItemWithChildren { + return Array.isArray(item.items) && item.items.length > 0; +} + +function NavItemWithSubmenu({ item }: { item: NavItemWithChildren }) { + const isBetweenMdAndLg = useIsBetweenMdAndLg(); + const { registerMenu } = useSidebarMenuOpen(); + const unregisterRef = useRef<(() => void) | null>(null); + + useEffect(() => { + return () => { + if (unregisterRef.current) { + unregisterRef.current(); + } + }; + }, []); + + const TooltipContent = () => item.title; + + return ( + + {/* Menu version for collapsed sidebar (md-lg breakpoint) */} + { + if (open) { + unregisterRef.current = registerMenu(); + } else { + if (unregisterRef.current) { + unregisterRef.current(); + unregisterRef.current = null; + } + } + }} + > +
+ + + {item.badge && ( + + {item.badge} + + )} + + } + /> + } + /> +
+ + + {item.title} + {item.items.map((subItem) => ( + + {subItem.title} + + } + /> + ))} + + +
+ + {/* Collapsible version for expanded sidebar */} + } + > + + } + > + + + {item.title} + + {item.badge && ( + + {item.badge} + + )} + + + + + {item.items.map((subItem) => ( + + + {subItem.title} + + } + /> + + ))} + + + +
+ ); +} + +function NavItemSimple({ item }: { item: NavItemLeaf }) { + const isBetweenMdAndLg = useIsBetweenMdAndLg(); + + return ( + + + + {item.title} + {item.badge && ( + + {item.badge} + + )} + + } + tooltip={isBetweenMdAndLg ? item.title : undefined} + /> + + ); +} + +export function NavMain({ items }: { items: NavItem[] }) { + return ( + + + {items.map((item) => + hasSubItems(item) ? ( + + ) : ( + + ), + )} + + + ); +} diff --git a/apps/examples/components/nav-secondary.tsx b/apps/examples/components/nav-secondary.tsx new file mode 100644 index 000000000..41d29e3e4 --- /dev/null +++ b/apps/examples/components/nav-secondary.tsx @@ -0,0 +1,48 @@ +"use client"; + +import type { LucideIcon } from "lucide-react"; +import type * as React from "react"; + +import { + SidebarGroup, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from "@/components/ui/sidebar"; +import { useIsBetweenMdAndLg } from "@/hooks/use-mobile"; + +export function NavSecondary({ + items, + ...props +}: { + items: { + title: string; + url: string; + icon: LucideIcon; + }[]; +} & React.ComponentPropsWithoutRef) { + const isBetweenMdAndLg = useIsBetweenMdAndLg(); + + return ( + + + {items.map((item) => ( + + + + + {item.title} + + + } + tooltip={isBetweenMdAndLg ? item.title : undefined} + /> + + ))} + + + ); +} diff --git a/apps/examples/components/ui/sidebar.tsx b/apps/examples/components/ui/sidebar.tsx new file mode 100644 index 000000000..fa9871d45 --- /dev/null +++ b/apps/examples/components/ui/sidebar.tsx @@ -0,0 +1,475 @@ +"use client"; + +import { mergeProps } from "@base-ui-components/react/merge-props"; +import { useRender } from "@base-ui-components/react/use-render"; +import { ScrollArea } from "@coss/ui/components/scroll-area"; +import { Separator } from "@coss/ui/components/separator"; +import { Skeleton } from "@coss/ui/components/skeleton"; +import { + Tooltip, + TooltipCreateHandle, + TooltipPopup, + TooltipProvider, + TooltipTrigger, +} from "@coss/ui/components/tooltip"; +import { cn } from "@coss/ui/lib/utils"; +import * as React from "react"; +import { useIsBetweenMdAndLg, useIsMobile } from "@/hooks/use-mobile"; + +type SidebarTooltipHandle = ReturnType< + typeof TooltipCreateHandle +>; + +export const sidebarTooltipHandle: SidebarTooltipHandle = + TooltipCreateHandle(); + +const SidebarMenuOpenContext = React.createContext<{ + openMenuCount: number; + registerMenu: () => () => void; +}>({ + openMenuCount: 0, + registerMenu: () => () => {}, +}); + +function SidebarProvider({ + className, + style, + children, + ...props +}: React.ComponentProps<"div">) { + const [openMenuCount, setOpenMenuCount] = React.useState(0); + + const registerMenu = React.useCallback(() => { + setOpenMenuCount((prev) => prev + 1); + return () => { + setOpenMenuCount((prev) => Math.max(0, prev - 1)); + }; + }, []); + + return ( + + +
+ {children} + + {({ payload: Payload }) => ( + 0 ? "hidden" : undefined} + side="right" + > + {Payload !== undefined && } + + )} + +
+
+
+ ); +} + +export function useSidebarMenuOpen() { + return React.useContext(SidebarMenuOpenContext); +} + +function Sidebar({ + className, + children, + ...props +}: React.ComponentProps<"div">) { + return ( +
+
+
+ {children} +
+
+
+ ); +} + +function SidebarInset({ + className, + children, + ...props +}: React.ComponentProps<"main">) { + return ( +
+
{children}
+
+ ); +} + +function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function SidebarSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function SidebarContent({ className, ...props }: React.ComponentProps<"div">) { + return ( + +
+ + ); +} + +function SidebarGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function SidebarGroupLabel({ + className, + render, + ...props +}: useRender.ComponentProps<"div">) { + const defaultProps = { + className: cn( + "flex h-8 shrink-0 items-center rounded-lg px-2 font-medium text-sidebar-foreground/70 text-xs outline-hidden ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0", + "md:max-lg:-mt-8 md:max-lg:opacity-0", + className, + ), + "data-sidebar": "group-label", + "data-slot": "sidebar-group-label", + }; + + return useRender({ + defaultTagName: "div", + props: mergeProps(defaultProps, props), + render, + }); +} + +function SidebarGroupAction({ + className, + render, + ...props +}: useRender.ComponentProps<"button">) { + const defaultProps = { + className: cn( + "absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-lg p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg:not([class*='size-'])]:size-4 [&>svg]:shrink-0", + "after:-inset-2 after:absolute md:after:hidden", + "md:max-lg:hidden", + className, + ), + "data-sidebar": "group-action", + "data-slot": "sidebar-group-action", + }; + + return useRender({ + defaultTagName: "button", + props: mergeProps(defaultProps, props), + render, + }); +} + +function SidebarGroupContent({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) { + return ( +
    + ); +} + +function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) { + return ( +
  • + ); +} + +function SidebarMenuButton({ + isActive = false, + tooltip, + className, + render, + ...props +}: useRender.ComponentProps<"button"> & { + isActive?: boolean; + tooltip?: string | React.ComponentType; +}) { + const isMobile = useIsMobile(); + const isBetweenMdAndLg = useIsBetweenMdAndLg(); + const state = isBetweenMdAndLg ? "collapsed" : "expanded"; + const showTooltip = state === "collapsed" && !isMobile; + + const defaultProps = { + className: cn( + "peer/menu-button cursor-pointer flex w-full items-center gap-2 overflow-hidden rounded-lg p-2 text-left text-sm outline-hidden ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pe-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground data-pressed:bg-sidebar-accent data-pressed:text-sidebar-accent-foreground max-lg:size-10 max-lg:p-0 max-lg:justify-center h-8 [&>span:last-child]:truncate md:[&>svg:not([class*='size-'])]:size-4 [&>svg:not([class*='size-'])]:size-5 [&>svg]:shrink-0", + className, + ), + "data-active": isActive, + "data-sidebar": "menu-button", + "data-slot": "sidebar-menu-button", + }; + + const buttonProps = mergeProps<"button">(defaultProps, props); + + const buttonElement = useRender({ + defaultTagName: "button", + props: buttonProps, + render, + }); + + if (!tooltip || !showTooltip) { + return buttonElement; + } + + // Convert string tooltip to a component + const TooltipContent = typeof tooltip === "string" ? () => tooltip : tooltip; + + return ( + >} + /> + ); +} + +function SidebarMenuAction({ + className, + showOnHover = false, + render, + ...props +}: useRender.ComponentProps<"button"> & { + showOnHover?: boolean; +}) { + const defaultProps = { + className: cn( + "absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-lg p-0 text-sidebar-foreground outline-hidden ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg:not([class*='size-'])]:size-4 [&>svg]:shrink-0", + "after:-inset-2 after:absolute md:after:hidden", + "md:max-lg:hidden", + showOnHover && + "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0", + className, + ), + "data-sidebar": "menu-action", + "data-slot": "sidebar-menu-action", + }; + + return useRender({ + defaultTagName: "button", + props: mergeProps<"button">(defaultProps, props), + render, + }); +} + +function SidebarMenuBadge({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
    + ); +} + +function SidebarMenuSkeleton({ + className, + showIcon = false, + ...props +}: React.ComponentProps<"div"> & { + showIcon?: boolean; +}) { + // Random width between 50 to 90%. + const width = React.useMemo(() => { + return `${Math.floor(Math.random() * 40) + 50}%`; + }, []); + + return ( +
    + {showIcon && ( + + )} + +
    + ); +} + +function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) { + return ( +
      + ); +} + +function SidebarMenuSubItem({ + className, + ...props +}: React.ComponentProps<"li">) { + return ( +
    • + ); +} + +function SidebarMenuSubButton({ + isActive = false, + className, + render, + ...props +}: useRender.ComponentProps<"a"> & { + isActive?: boolean; +}) { + const defaultProps = { + className: cn( + "-translate-x-px flex h-7 min-w-0 items-center gap-2 overflow-hidden rounded-lg px-2 text-sm text-sidebar-foreground outline-hidden ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg:not([class*='size-'])]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground", + "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground", + "md:max-lg:hidden", + className, + ), + "data-active": isActive, + "data-sidebar": "menu-sub-button", + "data-slot": "sidebar-menu-sub-button", + }; + + return useRender({ + defaultTagName: "a", + props: mergeProps<"a">(defaultProps, props), + render, + }); +} + +export { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupAction, + SidebarGroupContent, + SidebarGroupLabel, + SidebarHeader, + SidebarInset, + SidebarMenu, + SidebarMenuAction, + SidebarMenuBadge, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSkeleton, + SidebarMenuSub, + SidebarMenuSubButton, + SidebarMenuSubItem, + SidebarProvider, + SidebarSeparator, +}; diff --git a/apps/examples/components/user-menu.tsx b/apps/examples/components/user-menu.tsx new file mode 100644 index 000000000..c1ba29213 --- /dev/null +++ b/apps/examples/components/user-menu.tsx @@ -0,0 +1,107 @@ +"use client"; + +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "@coss/ui/components/avatar"; +import { + Menu, + MenuGroup, + MenuGroupLabel, + MenuItem, + MenuPopup, + MenuSeparator, + MenuTrigger, +} from "@coss/ui/components/menu"; +import { + GaugeIcon, + LogOutIcon, + MessageCircleQuestionMarkIcon, + MilestoneIcon, + MonitorDownIcon, + MoonStarIcon, + SettingsIcon, + UserRoundIcon, +} from "lucide-react"; +import { SidebarMenuButton } from "@/components/ui/sidebar"; +import { useIsBetweenMdAndLg } from "@/hooks/use-mobile"; + +interface UserMenuProps { + variant?: "sidebar" | "mobile"; +} + +export function UserMenu({ variant = "sidebar" }: UserMenuProps) { + const isBetweenMdAndLg = useIsBetweenMdAndLg(); + + return ( + + + } + > + + + LT + + + User menu + + + + Luke Tracy + + + My profile + + + + My settings + + + + Out of office + + + + + + + Roadmap + + + + Help + + + + Download desktop app + + + + Platform + + + + + + Sign out + + + + ); +} diff --git a/apps/examples/hooks/use-mobile.ts b/apps/examples/hooks/use-mobile.ts new file mode 100644 index 000000000..afb93eb08 --- /dev/null +++ b/apps/examples/hooks/use-mobile.ts @@ -0,0 +1,48 @@ +import * as React from "react"; + +const MOBILE_BREAKPOINT = 768; // Tailwind md breakpoint +const LG_BREAKPOINT = 1024; // Tailwind lg breakpoint + +export function useIsMobile() { + const [isMobile, setIsMobile] = React.useState( + undefined, + ); + + React.useEffect(() => { + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); + const onChange = () => { + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + }; + mql.addEventListener("change", onChange); + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + return () => mql.removeEventListener("change", onChange); + }, []); + + return !!isMobile; +} + +export function useIsBetweenMdAndLg() { + const [isBetween, setIsBetween] = React.useState( + undefined, + ); + + React.useEffect(() => { + const mql = window.matchMedia( + `(min-width: ${MOBILE_BREAKPOINT}px) and (max-width: ${LG_BREAKPOINT - 1}px)`, + ); + const onChange = () => { + setIsBetween( + window.innerWidth >= MOBILE_BREAKPOINT && + window.innerWidth < LG_BREAKPOINT, + ); + }; + mql.addEventListener("change", onChange); + setIsBetween( + window.innerWidth >= MOBILE_BREAKPOINT && + window.innerWidth < LG_BREAKPOINT, + ); + return () => mql.removeEventListener("change", onChange); + }, []); + + return !!isBetween; +} diff --git a/apps/examples/hooks/use-scroll-hide.ts b/apps/examples/hooks/use-scroll-hide.ts new file mode 100644 index 000000000..d04b27130 --- /dev/null +++ b/apps/examples/hooks/use-scroll-hide.ts @@ -0,0 +1,38 @@ +import * as React from "react"; + +const DEFAULT_SCROLL_THRESHOLD = 48; + +export function useScrollHide(threshold = DEFAULT_SCROLL_THRESHOLD) { + const [isHidden, setIsHidden] = React.useState(false); + const lastScrollY = React.useRef(0); + + React.useEffect(() => { + const handleScroll = () => { + const currentY = window.scrollY; + const delta = currentY - lastScrollY.current; + + if (currentY <= 0) { + setIsHidden(false); + lastScrollY.current = currentY; + return; + } + + if (Math.abs(delta) < threshold) { + return; + } + + if (delta > 0) { + setIsHidden(true); + } else { + setIsHidden(false); + } + + lastScrollY.current = currentY; + }; + + window.addEventListener("scroll", handleScroll, { passive: true }); + return () => window.removeEventListener("scroll", handleScroll); + }, [threshold]); + + return isHidden; +} diff --git a/apps/examples/lib/navigation-data.ts b/apps/examples/lib/navigation-data.ts new file mode 100644 index 000000000..83903e362 --- /dev/null +++ b/apps/examples/lib/navigation-data.ts @@ -0,0 +1,145 @@ +import { + ActivityIcon, + CalendarIcon, + ClockFadingIcon, + ContactRoundIcon, + CopyIcon, + ExternalLinkIcon, + GiftIcon, + Grid2x2Plus, + Link2Icon, + type LucideIcon, + RouteIcon, + SettingsIcon, + UsersRoundIcon, + WorkflowIcon, +} from "lucide-react"; + +export interface NavItem { + title: string; + url: string; + icon: LucideIcon; + isActive?: boolean; + badge?: string; + items?: { + title: string; + url: string; + }[]; +} + +export interface User { + avatar: string; + email: string; + name: string; +} + +export const navMainItems: NavItem[] = [ + { + icon: Link2Icon, + isActive: true, + title: "Event Types", + url: "#", + }, + { + icon: CalendarIcon, + items: [ + { + title: "Upcoming", + url: "#", + }, + { + title: "Unconfirmed", + url: "#", + }, + { + title: "Recurring", + url: "#", + }, + { + title: "Past", + url: "#", + }, + { + title: "Canceled", + url: "#", + }, + ], + title: "Bookings", + url: "#", + }, + { + icon: ClockFadingIcon, + title: "Availability", + url: "#", + }, + { + icon: ContactRoundIcon, + title: "Members", + url: "#", + }, + { + icon: UsersRoundIcon, + title: "Teams", + url: "#", + }, + { + icon: Grid2x2Plus, + items: [ + { + title: "App Store", + url: "#", + }, + { + title: "Installed Apps", + url: "#", + }, + ], + title: "Apps", + url: "#", + }, + { + icon: RouteIcon, + title: "Routing", + url: "#", + }, + { + badge: "Cal.ai", + icon: WorkflowIcon, + title: "Workflows", + url: "#", + }, + { + icon: ActivityIcon, + title: "Insights", + url: "#", + }, +]; + +export const navFooterItems: NavItem[] = [ + { + icon: ExternalLinkIcon, + title: "View public page", + url: "#", + }, + { + icon: CopyIcon, + title: "Copy public page link", + url: "#", + }, + { + icon: GiftIcon, + title: "Refer and earn", + url: "#", + }, + { + icon: SettingsIcon, + title: "Settings", + url: "#", + }, +]; + +export const user: User = { + avatar: "", + email: "pasqua@example.com", + name: "Pasquale", +}; diff --git a/apps/examples/next.config.ts b/apps/examples/next.config.ts new file mode 100644 index 000000000..5dec87516 --- /dev/null +++ b/apps/examples/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + transpilePackages: ["@coss/ui"], +}; + +export default nextConfig; diff --git a/apps/examples/package.json b/apps/examples/package.json new file mode 100644 index 000000000..555bd5857 --- /dev/null +++ b/apps/examples/package.json @@ -0,0 +1,33 @@ +{ + "dependencies": { + "@base-ui-components/react": "^1.0.0-rc.0", + "@coss/ui": "workspace:*", + "@hugeicons/core-free-icons": "^2.0.0", + "@hugeicons/react": "^1.1.1", + "lucide-react": "^0.555.0", + "next": "16.0.9", + "react": "19.2.3", + "react-dom": "19.2.3" + }, + "devDependencies": { + "@coss/typescript-config": "workspace:*", + "@tailwindcss/postcss": "^4.1.17", + "@types/node": "^24.10.1", + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3", + "tailwindcss": "^4.1.17", + "typescript": "^5.9.3" + }, + "license": "AGPL-3.0-or-later", + "name": "examples", + "private": true, + "scripts": { + "build": "next build", + "clean": "rm -rf node_modules && rm -rf .turbo && rm -rf .next", + "dev": "next dev", + "lint": "biome lint .", + "start": "next start", + "typecheck": "tsc --noEmit" + }, + "version": "0.1.0" +} diff --git a/apps/examples/postcss.config.mjs b/apps/examples/postcss.config.mjs new file mode 100644 index 000000000..af6087cdf --- /dev/null +++ b/apps/examples/postcss.config.mjs @@ -0,0 +1,3 @@ +import { postcssConfig } from "@coss/ui/postcss.config"; + +export default postcssConfig; diff --git a/apps/examples/tsconfig.json b/apps/examples/tsconfig.json new file mode 100644 index 000000000..e84f6335c --- /dev/null +++ b/apps/examples/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "exclude": ["node_modules"], + "extends": "@coss/typescript-config/nextjs.json", + "include": [ + "**/*.ts", + "**/*.tsx", + "next-env.d.ts", + "next.config.ts", + ".next/types/**/*.ts" + ] +} diff --git a/bun.lock b/bun.lock index 4f15dd371..5eadee9a2 100644 --- a/bun.lock +++ b/bun.lock @@ -11,6 +11,29 @@ "typescript": "^5.9.3", }, }, + "apps/examples": { + "name": "examples", + "version": "0.1.0", + "dependencies": { + "@base-ui-components/react": "^1.0.0-rc.0", + "@coss/ui": "workspace:*", + "@hugeicons/core-free-icons": "^2.0.0", + "@hugeicons/react": "^1.1.1", + "lucide-react": "^0.555.0", + "next": "16.0.9", + "react": "19.2.3", + "react-dom": "19.2.3", + }, + "devDependencies": { + "@coss/typescript-config": "workspace:*", + "@tailwindcss/postcss": "^4.1.17", + "@types/node": "^24.10.1", + "@types/react": "19.2.6", + "@types/react-dom": "19.2.3", + "tailwindcss": "^4.1.17", + "typescript": "^5.9.3", + }, + }, "apps/origin": { "name": "origin", "version": "0.1.0", @@ -236,6 +259,10 @@ "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "7.27.1", "@babel/helper-validator-identifier": "7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], + "@base-ui-components/react": ["@base-ui-components/react@1.0.0-rc.0", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@base-ui-components/utils": "0.2.2", "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "reselect": "^5.1.1", "tabbable": "^6.3.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-9lhUFbJcbXvc9KulLev1WTFxS/alJRBWDH/ibKSQaNvmDwMFS2gKp1sTeeldYSfKuS/KC1w2MZutc0wHu2hRHQ=="], + + "@base-ui-components/utils": ["@base-ui-components/utils@0.2.2", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@floating-ui/utils": "^0.2.10", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-rNJCD6TFy3OSRDKVHJDzLpxO3esTV1/drRtWNUpe7rCpPN9HZVHUCuP+6rdDYDGWfXnQHbqi05xOyRP2iZAlkw=="], + "@base-ui/react": ["@base-ui/react@1.0.0", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@base-ui/utils": "0.2.3", "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "reselect": "^5.1.1", "tabbable": "^6.3.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-4USBWz++DUSLTuIYpbYkSgy1F9ZmNG9S/lXvlUN6qMK0P0RlW+6eQmDUB4DgZ7HVvtXl4pvi4z5J2fv6Z3+9hg=="], "@base-ui/utils": ["@base-ui/utils@0.2.3", "", { "dependencies": { "@babel/runtime": "^7.28.4", "@floating-ui/utils": "^0.2.10", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-/CguQ2PDaOzeVOkllQR8nocJ0FFIDqsWIcURsVmm53QGo8NhFNpePjNlyPIB41luxfOqnG7PU0xicMEw3ls7XQ=="], @@ -1236,6 +1263,8 @@ "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "examples": ["examples@workspace:apps/examples"], + "execa": ["execa@7.2.0", "", { "dependencies": { "cross-spawn": "7.0.6", "get-stream": "6.0.1", "human-signals": "4.3.1", "is-stream": "3.0.0", "merge-stream": "2.0.0", "npm-run-path": "5.3.0", "onetime": "6.0.0", "signal-exit": "3.0.7", "strip-final-newline": "3.0.0" } }, "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="], "express": ["express@5.1.0", "", { "dependencies": { "accepts": "2.0.0", "body-parser": "2.2.0", "content-disposition": "1.0.0", "content-type": "1.0.5", "cookie": "0.7.2", "cookie-signature": "1.2.2", "debug": "4.4.1", "encodeurl": "2.0.0", "escape-html": "1.0.3", "etag": "1.8.1", "finalhandler": "2.1.0", "fresh": "2.0.0", "http-errors": "2.0.0", "merge-descriptors": "2.0.0", "mime-types": "3.0.1", "on-finished": "2.4.1", "once": "1.4.0", "parseurl": "1.3.3", "proxy-addr": "2.0.7", "qs": "6.14.0", "range-parser": "1.2.1", "router": "2.2.0", "send": "1.2.0", "serve-static": "2.2.0", "statuses": "2.0.2", "type-is": "2.0.1", "vary": "1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], diff --git a/public/fonts/CalSans-Regular.woff2 b/public/fonts/CalSans-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6c83a2df3bdb000e5f6e86f8db4583102f9df455 GIT binary patch literal 37412 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 z zhQx(gU!&B1Luv-=1N;9E1r8nWJl+@eexwM9a0x17AAZ-U-BAdfUf( zLtth7lR)}B9iM9t&->ZFJskagwnS@6)emdXyq_O(-tYXv+otRM@Gi!4D{u?{>itWB z>{HkN3zXrM2VajJ3LF~i+~QfAJ}*+9-1a$Z{|hv=)Wa2Ofn3hmSSHOh<`<~>s@ipR zIf3mDbk_eZP8@yfJ0u#e;BYEz>FhgYvJwHWSSaMVON6pK7oe~f19`HNS-sa6mk8!} z^YRPaJZUp=;_>$#jV$>FZrp{MlBCv=~qNhqz z{&?fP;_p&@F`HHX2B{b*{Pp|cq>7#lz9!&S<-JW#~pUF@7I)K*N5-J06AXY$0j4yvQVVU2ol%&$)Hx*7bIWmQ|qsSnVmTTi>B zv9YqG*uQK1FhDCmHF|I>lJiQ#eIWgcjr+L2(wap2>uen22L${inBmfD066>#p)1ry zro8LcS~44U%bg?hQ;YmM*-3NBQNbSF00(e*dKG*^h$#55pa`&?4mfoZX`wHy6@6%FvF0Q?Od)F5`Km*@q(T{FHkB+O}MR8bP-x2~{0ma?`+pFQuk)(8Z zQSiTiTIitFz=f?~d9>_cs?QXhz-kGG)JavK{);9tKhrNY+F-4Yw$4S>Q__9gYWw0bNB2WI&KbZiT^#{}aRcl;aRs_2Bw4?g2k#eYxGjF6#Y4nNIej<4go+>Pu(6hV3n|3go4;WP>#0d6n>4M@EjC|(sFGHWKnRpWCezfa); zkrAPe+id3U{hWk0!;A{TWB|sx_t_AnwgPcRS7XDsfr>7B>`uVuzCK(bb#ks$FGh#I z7v-vbLHOSv?9o}M6C)Ba+LP!l>ie7xK$GzAg&gWw&8%NyzRw~}KaR9bPyL^M-=vWVC_Y07T6I ziN=_02n1Ns)!1-quzgY+;ZkS^`-_*2yDPUF`zAZZXM>crL3+LQ$9D-_qU)?NL zMPOO#@6A|{#qR@19W}rUlgfpj#X?5t1s=@mY#pmR#WW>-Pq$5VtkxSbiZQr#Vb1E3 zO{8Axq)NwxnAON;LrFw+o;R9>TZ_yMb8Kg2O`8Se%tj3{t1WbNDLSsLg%4v9`4lh>fq)MuFOgm>aXhShBic|XG`jHV*y(Px4Y8j|MyZBnKq)ygHPb*}E zS`ZT$q;6c>Zr8%@&i7^3rGi!F1FnGgy8^Sv@P2oY5@I3sQYTe9rqml6flz#faioKk zkQwGkw8)p+ETB!QA%GR2o5+nw+j>OZ&^O@Qvd|cjXiQP3@YTlpx7`zdc2>Mw7;^36A>k@cT6yRY5)WZ7o3v)b{0{l9GI>P@Y$%+?dF z%Ay$Gxke|0c7F$}|0lo`@BWEiehw$S>qi1Wmi|Ap3(&m+x$fkrn#J-Hw*N&*@y`TD zM~^ws%2dO@%0DDxY&m5$46|G-%&Rdgwc*|)mm6Oy`zs~;Duuib5=t@S*n3lTjlq+dx@wCW>mK!{rS560=B)f)>Tl zX2iejx+E9?u#$4>v&tNzU__uZ9f?`4UWEmifTG2H1ek|T8~45zQh+SVl6;BIMx9}v z#GJWXEjam#FnK2N6SYD-APaLIX|L6opTbDIyX;DdI^%%H0dyg_w@7%KWZ$IojRM)Xo-9=)uwCyQ|S;U@7`)B9~tEiWVV7~t4UXk zoKdy(dr8lPC+>-j?)UV2`aS)g;K?9b$;Qhxi@yZg8?c~N zH`nX$T)2en3bR`GU4o1`RkIH&HQW#I+j?s;3o`pvJhaYL7i!}761a^^Ed1Wg-kZRR zOE_F=C;B6_x9*ZIBe_6tKi~K{ay9V85UnHS+!>>Oq(K)UBI)K@Puap)*;nz1YM|6O z!1D(A60^*^NAdH+h-)+AN@>Y?7Jj8)=~w!dprkF8_#TqEWBi7c&e~B@fmufnl<+gm z02S@Cus7T10(%t_9W`m0>O!=2>O)d&T6ZNyL1;uHl(Z@^Ds3G&Kwk}HRD zLItWF0-XS$J1k+QWB!H|J_j%~{If9Q=!Fu8r{8R}uT-ooC~hg*Sw8c>E<8DnI{`p< z)cod`uN@cggY|+s108@av9^+QwaA$V|2=|LI)5lSJgXA^TRR_t02zFS6_9l1Fldre zT}gDTO4h6iR67JZ0YGUb95~=ArEyJZG#&0QTbU44d zrFQ9@SEfv=uVI$^4`lZ}BkZ;8BCtJ6x38^3dr4Az#d}4_e{A#!KLBzJZ>G<#*&Sr* z)d;P$#LtED>alynBw*yy{DjPNQ@P(>6i0p+SIW-S!VXu>sJ(FwAUo_5G2k`jsnEf5@Lm(UavJ)VPZSV`a;n;N!MVDEkeO0V z8NZfwss?oHE}JO-_3DMakO_AnuW{SDne*w|sx^l8%^*g~MRu%$&T!$)tlFhUj_*Fl}NL zIpq#~MMfS+D!Iw45Ax4{=d09X{+pXUuq=9X^!A*D-!1T8pBN^zBop>8nVfWV5Z zXOX<5z96x3$BhPitZG-pG}}Sfx)f@R#t&7xJEQT_a8ejzhY+sl8N1ldRpi#&^n6U? zD4;g>FuZHs$tygV6lax~=7d>?#5Lr_1{S+^z!^JZGEzHKob#Bu<5ps6a1WeBO8n)q z8oyw_fqK{;6+JxaUGre-8%sNYSHSpWRCFPr)w^DHGl?ZauRK=#sB^Cchd~%9Q|Inm z#}OvzXiTmBk2F9`0Qi?(b7&kVI-&c(UoSJ>;%#Y@&y8@?h(?I*eE zE4=pEkJ27P>ImGz`^#l1{FxB`Ku%-V(Q`cHgALqlEf8+>-nvXlO*G|HIp4yI0lTO+ z2@TQXN6Ag;J*j+cV=CvVEf|NuhZZf-hm7eigdFhi|E&D15I`%}OUXnbD_2B4NV$Hf zU)fZ!$1y%-`^zIRn{GgAjr2fvfCCPXF%{jUi!r9F{zgz8M(hD3)@I39tZi~&#F5)@ zPMoR6Okihl>#35aBF^w=_8V+8EIpV5KwH*N!>yFAKE|=psicuza+8*q+`ND+1Um}v zP-1x0ABt_{%gX4Y^4mZxSO%I#5|h4iDs@ATKE|b4n@YtP^emEq)8bg{;{G^58>DlF zyR29*ERJG6k83fD(*>JuVn;sZoh6?IjP7#4)`0%1C2jZ%gA=v7vUW=qv4}ShVSR(z zp>awib<+D=B%j4wzKTklev3UD1C2-?ePKn*D(BFLQo=efRT`ZN7wrrR{L|7Z$|=Df zc}4S-xUF%YB5B8cv<|M4C=d@EZ&3=#F2BV}%3bWyy;zpZB>s=-$=X$0rJb*Mpb-=( zwD8y6Rh_VMv6IrJ5SkMgCmr4(=suOccgYmrH=gL@|%z%_=6 zR}dcE#2w6HMPib3GS%7Rv7LmAH%~*1OawZ~jY1e2P z9fNu#P1DV|42@G}D1lNgFEW46hXPgOBpZ4jflR3-U>Bh#$Y zRa1RH>vLZ~tW8TROQ^!$X|tDx<5f$A_*^upgEe|VvK56;wRQCmqd(Ye!I0CFO%9ya zz5=wqt#3Xtfmsa>J(d?dc}ya&*$j>)_Y^<)6!|2HtwbVUkWKO)>@$t4w8-9KD~E4N z7&xQ>?h_jj&9{mWCR#nw0NKy6t6@|4#OIK~?@E4Y?s?-6=pLMy+Jy=)nfXVb8XjR4 zcVFwX^vA|x%`jgNIXtTO?Wh!LtEe&=Yl%yqDCfXxWdie%WN6WXE4WM$m#s;Cg`-Ri z*&iyFfO5jS(u7d$d15T1Kyp^qa89W$AlWbN}zV6byoY7Z|4~kP9LK3IJg}@OP)XI23bcT%kqhel(O&@VrR$JAbN0; z$A;i@A2-MCaqOEa!>&*AjW6@dZIdZ~n|1f)_e-u;c$-h#>ktl4!1X z1vaZg)z2iPDERgunmad_$9|{+d*%XxJdN2s$>;L}(LLyn6Z1o<}m16>^b zfjRF~L}8JjP`Q8H2DFNh9M3`8x(dcc*L2M{6_#KKLNo_KVaE%DQN0w0tq2*cn58Mf zbTzZ)Sr~ZKDr!kig+4!dCl*#7I|@j?iQLc2x!ZBkH`G3coWUH}bWZ?e<5;sj9(Df$ z)I{$9VAO!a6?Fo*AqD4Xfp8)T8}WZ=o?kWnuqks(;w}O0k^NsO_WH2jgRE~bl=^T+ zRH`nehq00^m{Jbj5!PGSc~H^01y@{e9`oB7Ro&UEe@#nJcyb09T{y!Qj8b#w8Fd(I z-jKb6aDSnD$-dzXm-{_(&~8eUNX3qEo^wsjB(B?bTm-OooiX2=euj84XGJsjI!oz7bCK-DOihFJ zfQ|%Gc!12!!*&<<6$lh9zt|+rBaaJ#cs4g(TP9lqmkx3ad;*s}SKpoOV-UWat~avN zk>H!Zk55le7xQuGSY2jm9I7T%w|}0WE9fB+;_>a9InAl<{>s6vlOLMYhz2s+0wLd{ zFSk-^$c!;Wf6>rDTGv4)HRLMbYG7LAB_dm|hMwSypI0~QoB7l)hhastIq zH3JG>cOU_;6(m^U-OdjL;GHIN?k>?&l?qrqNP=(=7eq;ckds2DD~Hzx6^&1{{d6j_E;=YoptV>vNQ^)v+|RC`#@XON!Q+Xt(>N}u!@4_T^ZxL9JB_=UG~}7 z`lseT5A3p`E>hcc`6|%7b~bBO5C-*zjlM+(2R60%aW<$p@T`%E94q)YV2GV~(55OE z!9z#^0=c#Enus=#CZOwEL%X*rK|a{QwCa$ZaXMleFL(E7jvqWSn=JJSNs8PYEiGB9 zR<`eS+LW|S!>*%Q4jLomz%d6}DTkr_InsNEPWmum*5qb2$|7gA9>B zhZ5<}8a-6U_d{!~S7$Kfu=s2QymVTAfcfk)kCi%qAd`0chsJAx1A5Ucp)UzA6M2WE zqEvP!Aueb%Qp$SHx|ao8eAQ=bUi{_($BM^z(<394OG|TDe)%GE1}g(EnXu_ z71cLhE%ipf#YPV~1L1LadhD_!418Dixv8b6g4y*U@%_E^{W5eyNqdZJJsc$?U4OoK zS~zT}O!ZYR4A1e5FZpWBfqC+qOnTF-_W||XuN+)8v8K1)RQ@$WpQax?4)=R#);IX9 z_YP{s+bkpK$g$uPO9mAAFFq4hpb=;>r^cRs}E z3puejFTNM?BiJ0d#O`e0gJA1)y3J}eO$6Wgy*f8PN~hytf41AKr{%O<%th6zCw$(L zHZcA{MJAcrvtUR@$6;`VCX61j6w|1A$WEgog;*n20{rin8tIDSF}%=ceuODFTc`Q% z57vB2fPdtnzD?sb9+mPG$-UlZ&iHLiBn=r^U0V*xNqI-7juL4MOFf$E&Uw;0zdE2A zv{yb$L~?kUC_MF9A{7V2E(2G)1xV&W&oO!r_-`JMF=?;exDu6u3@BGtig03rl774| z)|e%1<0L?DiZ5Y#Hut6MDS@(0V;i+`FuiXcs`X7N!NnC;w`=9J;{N^+$n>+F2FK!w z*8QQzMXamtexw)0gXl4|M?%_Y_>i9_G98ku$z zjJO!)K!D56-buX4fL`R>NMJuc&UX_BxDqH?6M}}qiBA#K*&_q~QH4V;r^%r6F=^8l z4n~36j`sWSeh^Q74Ngl!){>RV#C;+C&{Ap_HrsGRJ#own=%8;j@455 zFP#BUETjRlRp3qZy|;rXwQ_dO!uS8C;Ada`9Z$n?m8#B6G@W53&3r33&J_2~zDsS~ z=k1|#&&V@Pkw8S4dFkm#-4;g>Z{rNCUS{vZxno|n`+qSv$*n}{@z8{~Gx`w1m| z#|(YfMDb46G>x#U_w`u;k)3%PIGW_mwofIaO41uw18zAS>lO;$oVngn)86djTw2KW zU1Ia>DT$|7Pd|S4@%`=jalIUR)*y%vsOR_||D)Tzy6kfP>Q!>L3q;jz4Ty#&dLmdY zV5EmR%e>h}TbgcjILt5#y=hSvR7_Tv8~{oN?JO6^)aQLx*c->T`NDcx7CxWZr?fJ< zI%00&yR6fk@54k8zeG;wo2dQoNbvQaM?B%IMoTdcdT@j{zaDm1KAoOcg+BztOj8I9+Ft)3HY1m1 zcCd}7V`kU6;O^KJC0 zq(p{Y?V{O3q1Qx!wkBi<;wfO+Yl-%LE(MKxmn zj1yk2M47Ckaaa1jTbaGpf%&?hJcR>o0kx4@F*TL`-Wc#F3e$@x#mXAaReruakV`L zPX5i3V9=^mlsyl_ki}kY*8I(--vQp>&C8KB)TLq*qdu-UoAG_%EIvW0*)O?~ z<8sNhL7}#hT&H0?=-AC=&6cU#1viM_XoMcDX#GBS0}Y03Pa~}ehq*Q=V^!eUDQ%PR z#5yr5=uAi}rCn&mkA@L5^5zhUJkveeBzGTpnD?^5akzxsysTK4M}difO8Afo3f@bl zRhQF}fdw)YGH9%PNsvqnS-)@s-P&(oG7Te<_QWgG-U|1eskWt4d`nJRA?yG2d zY)uO6k(n0#^{Qnz1o%4Upw0Y6Re}6vFM?-ysFspd_!!sKwc@XM3by!lQEmfc=c4EV z0uqH>N&Aj2AxilEB$0TX!s>Cz8MEDr;Cf}nv=7rK%D|YbmOXr7Bt?%2OJ!T%KpnI0 z2Cer4_~#dzsr-L}3grBAhbWCLnQ2lmpRgqYv~xSP5;4sy+t#qb$DdIPAQADhyyDCK z%FHm_IHg{b>LuzJ8ZE=Yn9K(3a7F%Rk0uo2hJB(7e&)pKm=JEA#Y~)hXw7O4=;bS! z?T3cpYE&-rT|V_@+)sOfrcDxsW=z41(@8OD4R5Z~qr3EtXpF(By&r6Ej_5@ocneI| zhNoSgNKCMuYxY}Eih-3&2X*5LwHli49{(MBF*-tC^)%F* zW|Jj;6;zIA+FYs+z=#$~K67gJURITdY@6Jk^zn^W`G$5|E78<(GTv1L*DJ}UQGLl& z1w7>X-P=c4$e)Mae)H|u@4kNV4BtF@b9uhK-`y7&j%=K}%|D_=cik{{xrvLov_(V; z5ig0cv45eAYXbh!h!Bg~GBr(omAax=>Ens>QsD#z^1JDZaGjcX)u#-O6MIMEBs-E8 zzNi+wIxLohs+8OWRZ6op;R={NCg#Mo1hl)9EVW5|B>|EP_j8r)0_sjgLAnX9JON)X zgGk*f=;;+gNm{sCReH@aDo9ShNuh{Pub9bkJzUkQ=<|2}o#AIij6L!+3N6RaMsYjC zh?oNlgT%mfQ3nkT;1atRLxy|6)bP!v7r%)6ylDb)WqpxZAWcfKMFTEDC9YS5hPgku|~JR>aOh|+1m#T zDS%w2Ftm!5qAGB&(6p9^I^dln!7Yd{7?=dhJu->nVfHY2FR6b$31J?=UHcn%m|*`V zKlFZcqnM|^I>4i-yyv_zKjEACY%t#Yu#v3B$2a$`J^ZVEmc?+@gxu%%a1!P&icIMF zjOC4T=e=tIK0x_xiH8OzC>y&76z|F&?yr^&1vuyY!ojQ?gAzSOsShSg-sdDORaU#p zp+*+COEf!$ec)b##5Xh8hK8Qy;C1044`%k31t`zP}7>RC0aR$wd`@qMCqy@_2ZO^ac{VPsaA{*PQ z+GX(p`wllFGU0sijOD6}3O(=199Lu_tK$ZVh)dQM3@YAcJEDNJMoB!J8unRiV_nl) zbH+;GHupASZ8HO1vyh!ouyK4CC=7yJXg!zMP#d})m(~?gsbXuHfDN2yR zV2}&Sa^Ep5Jcjhy8uK+YZkK7;3B(?-;0D^lwbcukl>&k2^4`9>tGM+ZAY zX1|sKSY^QUq;+zSo#M2U?Dx>b6}u&o&NS`)_b>b<5S|gNGciSBBq6R#*oXKD_!#`? zc%|@`EWeS&SN5bO6P@G>@f%LaS^3S!pi(<}zWecGv-tHI4lum`dY$ojv1NJoux}A7 zKZRB(R4;|xrHy3qCu^i%b2j1kaV5R)p4Pe!8-IT@iM^O)lL(3$VDyS7ff7 z4tNg@%M3lWtF2w7Nh0-@DOcI{J?{~26Dj??`hfH`MI z0|Lca-GD)Ojx`YAbXtJ)_W;HJ8&OYv>>6kweuBR4&_VQY<0s2n+lv9sND(idym&_R z7!r|1`G_tmlptDSmP_L8X$J;3cM;dbl}|dgo`(N;^hkqh4lxf0IVJMcFSK{GD zK;QrYv6%)W)Kylqo7Ol7>)09@?uvO$PBd^u zB$*Oo!=}JNoAE(&8!TMFlD4D$QjYNB>XB*HX;E{N5Dx)*>Cu)nrhBAtF zgnyl-3-}!-zm6q97`wL3?z>Kup9!Y?xC#oQaEg$iiG_gJ}C<1TTsFL3MsU(1~s@Lp7C#J!vv&kcq3A#N^O1`3LXA!Y`XLrGK$UQ zRueO4$y!0S3M|F6uNPE}E5Rh>7v^K-fpQ|8ooK&`2>hskq7&EN1VKyr<8!2IZW!#<}-gtK+Fvm@PsYUh-l%S7`Cm|~Kd(!A7p&0B-U z8PM!`K%sq8EEV&4Y}qY3^FJ9ExS$0uWT6Y&pbg%T4c)LQH+&=1_^!{7jhqUR(bG&j z-SjieIMbk+S>oYL=oFG8#13ngij&E+t^gG)!#8b(E1G={7Rr}`2kA`G{@gaY-Ad!m6M zjM^GV7#sn1O&}-uCK_!S*u}mc?CW|=Z5CbjGotK#7bhO4S@ArL^OeB91UWu3v-cF| z<3!;KOOUS#YM4?c17U~@iso5`_Uf`_KzUinOI?vFVhD2Lw@f);5#E7(s{&n&^}4Rb4h!zo@ch~r=v`+qX+tonVOIO&A(a7c zFxP#3w6HBJ+wJIQ(zm4y{apJ2H~r~#f1SB!&=30@hRR#RAIVT`m!E8MdU9O9ji+c_ zkF3%a{*{7pbJ$h`D+d#r>(NQf4!tY9QTKv%@wN{Q9%tmW_!d6y?p69MWFPv9cUfv- z4?q0s&h7{rx4^2$vp#5(-HshQ$TAw{vMH z9AlE*%J$x>e}`XbB%P;|g$92_+I}e$LM_B=%;5_OVMjacCL7f`_JY5Z$p?-{qOs)G zdTohFGPRu#7Hi_B7)w4}AxTc~nJkvU0*vI+nh#AtuFT3$4%`viruZI z9M?}DVo6Y;M@b%{%7dKtEs@N}mw?MyEm!Z`1x+b#4V+J4i4+vZ&)2(CPF7!CNar?W zk)!>y(+aeEo2J{H94~TuMgz3==^oDDggThOf4|1-?%FTdy1Sl*Ks@T{XG7lI%O>jG z@~KMXwOgg`$QhLTRJS!`gFT4$3!L4JMOlC#cwZQ1=u~!%bc65&l+byUc?MH zGMwg}g=BZ+vLf%!MGhx}GhLFZe*3ICn)%+1qn_O1cxNo5?xD~f(>S~McYG0Ac}sT( zZ}t!OyBu+=!yXFb&$s0YZH!xXb|ut`#Uz?bXFE8vWDL|lmG+zrDfbcT=dpwL(&N~s zLluC8nFi8dYaO3ZgR#&1<#GSGrl|QI&JlNFFYL5x?jN-*g#s8X&Xhfpqf6IGmf2Ol zv6=0Wk+8YVY+uS=g!@F_D^#vHtwP|!$i}m~lM}$T$i&|P(-*X*2xWb}1pRL}X8Yk% zpsn@mVrvKTk6nM$md+zFv%0Gb)p|2A*7|)akU(G&V%-%+7;)U+6#`i2SEVTJ^V*UT zY1#_S^T{?<)1mAK>wMj@v|RPMNKb?+r+u#KD1Ml~(w=HL%$5I+nrpY$?Z28-|6ixf Mdtua=PXPb`0BRBLO8@`> literal 0 HcmV?d00001 diff --git a/public/fonts/CalSansUI[MODE,wght].woff2 b/public/fonts/CalSansUI[MODE,wght].woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d353c58932c8acd69fec41a6dbb72b614a475048 GIT binary patch literal 66368 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

      47*{@m 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ℑ7950U4atk$ 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 VgFWEKesW9iZ@K(`hIIh|008DfgR=kt literal 0 HcmV?d00001 From 09183f77703202fe437a9e26ad0ab9ce2aa16d16 Mon Sep 17 00:00:00 2001 From: pasqualevitiello Date: Mon, 15 Dec 2025 20:29:16 +0100 Subject: [PATCH 2/2] feat: update font weights and refactor font imports in examples app --- apps/examples/app/globals.css | 4 ++ apps/examples/app/layout.tsx | 14 +---- packages/ui/package.json | 1 + .../ui/src}/fonts/CalSans-Regular.woff2 | Bin .../ui/src}/fonts/CalSansUI[MODE,wght].woff2 | Bin packages/ui/src/fonts/README.md | 49 ++++++++++++++++++ packages/ui/src/fonts/index.ts | 13 +++++ 7 files changed, 68 insertions(+), 13 deletions(-) rename {public => packages/ui/src}/fonts/CalSans-Regular.woff2 (100%) rename {public => packages/ui/src}/fonts/CalSansUI[MODE,wght].woff2 (100%) create mode 100644 packages/ui/src/fonts/README.md create mode 100644 packages/ui/src/fonts/index.ts diff --git a/apps/examples/app/globals.css b/apps/examples/app/globals.css index d163e8820..2867b8cf3 100644 --- a/apps/examples/app/globals.css +++ b/apps/examples/app/globals.css @@ -14,6 +14,10 @@ --text-base--line-height: 1.5rem; --text-lg: 1.1875rem; --text-lg--line-height: 1.75rem; + --font-weight-normal: 350; + --font-weight-medium: 450; + --font-weight-semibold: 550; + --font-weight-bold: 650; } .dark { diff --git a/apps/examples/app/layout.tsx b/apps/examples/app/layout.tsx index 28f6e5d34..b846f7819 100644 --- a/apps/examples/app/layout.tsx +++ b/apps/examples/app/layout.tsx @@ -1,21 +1,9 @@ import "./globals.css"; import { ToastProvider } from "@coss/ui/components/toast"; +import { fontHeading, fontSans } from "@coss/ui/fonts"; import { ThemeProvider } from "@coss/ui/shared/theme-provider"; import type { Metadata } from "next"; -import localFont from "next/font/local"; - -const fontSans = localFont({ - display: "swap", - src: "../../../public/fonts/CalSansUI[MODE,wght].woff2", - variable: "--font-sans", -}); - -const fontHeading = localFont({ - display: "swap", - src: "../../../public/fonts/CalSans-Regular.woff2", - variable: "--font-heading", -}); export const metadata: Metadata = { description: "coss.com - the everything but AI company", diff --git a/packages/ui/package.json b/packages/ui/package.json index 52ac8bfb7..80f53d68d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -26,6 +26,7 @@ }, "exports": { "./components/*": "./src/components/*.tsx", + "./fonts": "./src/fonts/index.ts", "./globals.css": "./src/styles/globals.css", "./hooks/*": "./src/hooks/*.ts", "./lib/*": "./src/lib/*.ts", diff --git a/public/fonts/CalSans-Regular.woff2 b/packages/ui/src/fonts/CalSans-Regular.woff2 similarity index 100% rename from public/fonts/CalSans-Regular.woff2 rename to packages/ui/src/fonts/CalSans-Regular.woff2 diff --git a/public/fonts/CalSansUI[MODE,wght].woff2 b/packages/ui/src/fonts/CalSansUI[MODE,wght].woff2 similarity index 100% rename from public/fonts/CalSansUI[MODE,wght].woff2 rename to packages/ui/src/fonts/CalSansUI[MODE,wght].woff2 diff --git a/packages/ui/src/fonts/README.md b/packages/ui/src/fonts/README.md new file mode 100644 index 000000000..6e03ca1bc --- /dev/null +++ b/packages/ui/src/fonts/README.md @@ -0,0 +1,49 @@ +# Shared Fonts + +This directory contains shared font files and configurations used across all apps in the monorepo. + +## Usage + +Import fonts directly from the shared UI package: + +```tsx +import { fontSans, fontHeading } from "@coss/ui/fonts"; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} +``` + +## Available Fonts + +- `fontSans` - Cal Sans UI variable font (supports multiple weights and modes) +- `fontHeading` - Cal Sans Regular font + +## Adding New Fonts + +1. Place the font file in this directory (`packages/ui/src/fonts/`) +2. Add a new font configuration in `index.ts`: + +```typescript +export const yourNewFont = localFont({ + display: "swap", + src: "./YourFont.woff2", + variable: "--font-your-name", +}); +``` + +3. Use it in any app by importing from `@coss/ui/fonts` + +## Benefits of This Approach + +- Single source of truth for fonts +- No fragile relative paths +- Type-safe imports +- Versioned with the UI package +- Easy to update across all apps diff --git a/packages/ui/src/fonts/index.ts b/packages/ui/src/fonts/index.ts new file mode 100644 index 000000000..06ff61512 --- /dev/null +++ b/packages/ui/src/fonts/index.ts @@ -0,0 +1,13 @@ +import localFont from "next/font/local"; + +export const fontSans = localFont({ + display: "swap", + src: "./CalSansUI[MODE,wght].woff2", + variable: "--font-sans", +}); + +export const fontHeading = localFont({ + display: "swap", + src: "./CalSans-Regular.woff2", + variable: "--font-heading", +});