Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 2 additions & 3 deletions .github/workflows/validate-registries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ on:
pull_request:
paths:
- "apps/v4/public/r/registries.json"
- "apps/v4/registry/directory.json"
push:
branches:
- main
paths:
- "apps/v4/public/r/registries.json"
- "apps/v4/registry/directory.json"

jobs:
validate:
Expand Down Expand Up @@ -47,8 +49,5 @@ jobs:
- name: Install dependencies
run: pnpm install

- name: Build packages
run: pnpm build --filter=shadcn

- name: Validate registries
run: pnpm --filter=v4 validate:registries
16 changes: 8 additions & 8 deletions apps/v4/components/block-viewer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -154,20 +154,20 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
value={view}
onValueChange={(value) => setView(value as "preview" | "code")}
>
<TabsList className="grid h-8 grid-cols-2 items-center rounded-md p-1 *:data-[slot=tabs-trigger]:h-6 *:data-[slot=tabs-trigger]:rounded-sm *:data-[slot=tabs-trigger]:px-2 *:data-[slot=tabs-trigger]:text-xs">
<TabsList className="grid h-8! grid-cols-2 items-center rounded-lg p-1 *:data-[slot=tabs-trigger]:h-6 *:data-[slot=tabs-trigger]:rounded-sm *:data-[slot=tabs-trigger]:px-2 *:data-[slot=tabs-trigger]:text-xs">
<TabsTrigger value="preview">Preview</TabsTrigger>
<TabsTrigger value="code">Code</TabsTrigger>
</TabsList>
</Tabs>
<Separator orientation="vertical" className="mx-2 !h-4" />
<Separator orientation="vertical" className="mx-2 h-4!" />
<a
href={`#${item.name}`}
className="flex-1 text-center text-sm font-medium underline-offset-2 hover:underline md:flex-auto md:text-left"
>
{item.description?.replace(/\.$/, "")}
</a>
<div className="ml-auto flex items-center gap-2">
<div className="h-8 items-center gap-1.5 rounded-md border p-1 shadow-none">
<div className="h-8 items-center gap-1.5 rounded-md border p-[3px] shadow-none">
<ToggleGroup
type="single"
defaultValue="100"
Expand All @@ -177,7 +177,7 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
resizablePanelRef.current.resize(parseInt(value))
}
}}
className="gap-1 *:data-[slot=toggle-group-item]:!size-6 *:data-[slot=toggle-group-item]:!rounded-sm"
className="gap-1 *:data-[slot=toggle-group-item]:size-6! *:data-[slot=toggle-group-item]:rounded-sm!"
>
<ToggleGroupItem value="100" title="Desktop">
<Monitor />
Expand All @@ -188,7 +188,7 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
<ToggleGroupItem value="30" title="Mobile">
<Smartphone />
</ToggleGroupItem>
<Separator orientation="vertical" className="!h-4" />
<Separator orientation="vertical" className="h-4!" />
<Button
size="icon"
variant="ghost"
Expand All @@ -201,7 +201,7 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
<Fullscreen />
</Link>
</Button>
<Separator orientation="vertical" className="!h-4" />
<Separator orientation="vertical" className="h-4!" />
<Button
size="icon"
variant="ghost"
Expand All @@ -218,7 +218,7 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
</Button>
</ToggleGroup>
</div>
<Separator orientation="vertical" className="mx-1 !h-4" />
<Separator orientation="vertical" className="mx-1 h-4!" />
<Button
variant="outline"
className="w-fit gap-1 px-2 shadow-none"
Expand All @@ -230,7 +230,7 @@ function BlockViewerToolbar({ styleName }: { styleName: Style["name"] }) {
{isCopied ? <Check /> : <Terminal />}
<span>npx shadcn add {item.name}</span>
</Button>
<Separator orientation="vertical" className="mx-1 !h-4" />
<Separator orientation="vertical" className="mx-1 h-4!" />
<OpenInV0Button name={item.name} />
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/v4/components/command-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ function DialogContent({
<DialogPrimitive.Content
data-slot="dialog-content"
className={cn(
"bg-background fixed top-1/3 left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg",
"bg-background fixed top-[15%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg",
className
)}
{...props}
Expand Down
10 changes: 10 additions & 0 deletions apps/v4/content/docs/components/base/toggle-group.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ Use `orientation="vertical"` for vertical toggle groups.

<ComponentPreview styleName="base-nova" name="toggle-group-disabled" />

### Custom

A custom toggle group example.

<ComponentPreview
styleName="base-nova"
name="toggle-group-font-weight-selector"
previewClassName="*:data-[slot=field]:max-w-xs"
/>

## RTL

To enable RTL support in shadcn/ui, see the [RTL configuration guide](/docs/rtl).
Expand Down
10 changes: 10 additions & 0 deletions apps/v4/content/docs/components/radix/toggle-group.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@ Use `orientation="vertical"` for vertical toggle groups.

<ComponentPreview styleName="radix-nova" name="toggle-group-disabled" />

### Custom

A custom toggle group example.

<ComponentPreview
styleName="radix-nova"
name="toggle-group-font-weight-selector"
previewClassName="*:data-[slot=field]:max-w-xs"
/>

## RTL

To enable RTL support in shadcn/ui, see the [RTL configuration guide](/docs/rtl).
Expand Down
26 changes: 26 additions & 0 deletions apps/v4/examples/__index__.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5244,6 +5244,19 @@ export const ExamplesIndex: Record<string, Record<string, any>> = {
return { default: mod.default || mod[exportName] }
}),
},
"toggle-group-font-weight-selector": {
name: "toggle-group-font-weight-selector",
filePath: "examples/radix/toggle-group-font-weight-selector.tsx",
component: React.lazy(async () => {
const mod = await import("./radix/toggle-group-font-weight-selector")
const exportName =
Object.keys(mod).find(
(key) =>
typeof mod[key] === "function" || typeof mod[key] === "object"
) || "toggle-group-font-weight-selector"
return { default: mod.default || mod[exportName] }
}),
},
"toggle-group-outline": {
name: "toggle-group-outline",
filePath: "examples/radix/toggle-group-outline.tsx",
Expand Down Expand Up @@ -10862,6 +10875,19 @@ export const ExamplesIndex: Record<string, Record<string, any>> = {
return { default: mod.default || mod[exportName] }
}),
},
"toggle-group-font-weight-selector": {
name: "toggle-group-font-weight-selector",
filePath: "examples/base/toggle-group-font-weight-selector.tsx",
component: React.lazy(async () => {
const mod = await import("./base/toggle-group-font-weight-selector")
const exportName =
Object.keys(mod).find(
(key) =>
typeof mod[key] === "function" || typeof mod[key] === "object"
) || "toggle-group-font-weight-selector"
return { default: mod.default || mod[exportName] }
}),
},
"toggle-group-outline": {
name: "toggle-group-outline",
filePath: "examples/base/toggle-group-outline.tsx",
Expand Down
19 changes: 12 additions & 7 deletions apps/v4/examples/base/calendar-hijri.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,27 @@ import {
} from "lucide-react"
import { getDefaultClassNames, type DayButton } from "react-day-picker"
import { DayPicker } from "react-day-picker/persian"
import { Vazirmatn } from "next/font/google"

import { cn } from "@/lib/utils"

const vazirmatn = Vazirmatn({ subsets: ["arabic"] })

export default function CalendarHijri() {
const [date, setDate] = React.useState<Date | undefined>(
new Date(2025, 5, 12)
)

return (
<Calendar
mode="single"
defaultMonth={date}
selected={date}
onSelect={setDate}
className="rounded-lg border"
/>
<div className={vazirmatn.className}>
<Calendar
mode="single"
defaultMonth={date}
selected={date}
onSelect={setDate}
className="rounded-lg border"
/>
</div>
)
}

Expand Down
61 changes: 61 additions & 0 deletions apps/v4/examples/base/toggle-group-font-weight-selector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
"use client"

import * as React from "react"
import { Field, FieldDescription, FieldLabel } from "@/examples/base/ui/field"
import { ToggleGroup, ToggleGroupItem } from "@/examples/base/ui/toggle-group"

export function ToggleGroupFontWeightSelector() {
const [fontWeight, setFontWeight] = React.useState("normal")
return (
<Field>
<FieldLabel>Font Weight</FieldLabel>
<ToggleGroup
value={[fontWeight]}
onValueChange={(value) => setFontWeight(value[0])}
variant="outline"
spacing={2}
size="lg"
>
<ToggleGroupItem
value="light"
aria-label="Light"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-light">Aa</span>
<span className="text-muted-foreground text-xs">Light</span>
</ToggleGroupItem>
<ToggleGroupItem
value="normal"
aria-label="Normal"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-normal">Aa</span>
<span className="text-muted-foreground text-xs">Normal</span>
</ToggleGroupItem>
<ToggleGroupItem
value="medium"
aria-label="Medium"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-medium">Aa</span>
<span className="text-muted-foreground text-xs">Medium</span>
</ToggleGroupItem>
<ToggleGroupItem
value="bold"
aria-label="Bold"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-bold">Aa</span>
<span className="text-muted-foreground text-xs">Bold</span>
</ToggleGroupItem>
</ToggleGroup>
<FieldDescription>
Use{" "}
<code className="bg-muted rounded-md px-1 py-0.5 font-mono">
font-{fontWeight}
</code>{" "}
to set the font weight.
</FieldDescription>
</Field>
)
}
6 changes: 3 additions & 3 deletions apps/v4/examples/base/ui-rtl/sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -289,8 +289,8 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
title="Toggle Sidebar"
className={cn(
"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2",
"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize rtl:in-data-[side=left]:cursor-e-resize rtl:in-data-[side=right]:cursor-w-resize",
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-e-resize",
"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize rtl:in-data-[side=left]:cursor-e-resize rtl:in-data-[side=right]:cursor-e-resize",
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:start-full rtl:group-data-[collapsible=offcanvas]:-translate-x-0",
"[[data-side=left][data-collapsible=offcanvas]_&]:-end-2",
"[[data-side=right][data-collapsible=offcanvas]_&]:-start-2",
Expand Down Expand Up @@ -565,7 +565,7 @@ function SidebarMenuAction({
className: cn(
"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 end-1 aspect-square w-5 rounded-md p-0 peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 focus-visible:ring-2 [&>svg]:size-4 flex items-center justify-center outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 md:after:hidden [&>svg]:shrink-0",
showOnHover &&
"peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0",
"peer-data-active/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0",
className
),
},
Expand Down
19 changes: 12 additions & 7 deletions apps/v4/examples/radix/calendar-hijri.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,27 @@ import {
} from "lucide-react"
import { getDefaultClassNames, type DayButton } from "react-day-picker"
import { DayPicker } from "react-day-picker/persian"
import { Vazirmatn } from "next/font/google"

import { cn } from "@/lib/utils"

const vazirmatn = Vazirmatn({ subsets: ["arabic"] })

export default function CalendarHijri() {
const [date, setDate] = React.useState<Date | undefined>(
new Date(2025, 5, 12)
)

return (
<Calendar
mode="single"
defaultMonth={date}
selected={date}
onSelect={setDate}
className="rounded-lg border"
/>
<div className={vazirmatn.className}>
<Calendar
mode="single"
defaultMonth={date}
selected={date}
onSelect={setDate}
className="rounded-lg border"
/>
</div>
)
}

Expand Down
3 changes: 2 additions & 1 deletion apps/v4/examples/radix/sidebar-rtl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,8 @@ function SidebarContentInner({

return (
<>
<Sidebar collapsible="icon" dir={dir}>
<Sidebar collapsible="icon" dir={dir}
side={dir === "ltr" ? "left" : "right"}>
<SidebarHeader>
<SidebarMenu>
<SidebarMenuItem>
Expand Down
62 changes: 62 additions & 0 deletions apps/v4/examples/radix/toggle-group-font-weight-selector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
"use client"

import * as React from "react"
import { Field, FieldDescription, FieldLabel } from "@/examples/radix/ui/field"
import { ToggleGroup, ToggleGroupItem } from "@/examples/radix/ui/toggle-group"

export function ToggleGroupFontWeightSelector() {
const [fontWeight, setFontWeight] = React.useState("normal")
return (
<Field>
<FieldLabel>Font Weight</FieldLabel>
<ToggleGroup
type="single"
value={fontWeight}
onValueChange={(value) => setFontWeight(value)}
variant="outline"
spacing={2}
size="lg"
>
<ToggleGroupItem
value="light"
aria-label="Light"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-light">Aa</span>
<span className="text-muted-foreground text-xs">Light</span>
</ToggleGroupItem>
<ToggleGroupItem
value="normal"
aria-label="Normal"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-normal">Aa</span>
<span className="text-muted-foreground text-xs">Normal</span>
</ToggleGroupItem>
<ToggleGroupItem
value="medium"
aria-label="Medium"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-medium">Aa</span>
<span className="text-muted-foreground text-xs">Medium</span>
</ToggleGroupItem>
<ToggleGroupItem
value="bold"
aria-label="Bold"
className="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span className="text-2xl leading-none font-bold">Aa</span>
<span className="text-muted-foreground text-xs">Bold</span>
</ToggleGroupItem>
</ToggleGroup>
<FieldDescription>
Use{" "}
<code className="bg-muted rounded-md px-1 py-0.5 font-mono">
font-{fontWeight}
</code>{" "}
to set the font weight.
</FieldDescription>
</Field>
)
}
Loading
Loading