diff --git a/.changeset/kind-candies-float.md b/.changeset/kind-candies-float.md deleted file mode 100644 index 4f7b86391e..0000000000 --- a/.changeset/kind-candies-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"shadcn": patch ---- - -Fix: skip all transforms for universal registry items diff --git a/.github/changeset-version.js b/.github/changeset-version.js index e1b4cef66f..ea1fc05e66 100644 --- a/.github/changeset-version.js +++ b/.github/changeset-version.js @@ -1,12 +1,12 @@ // ORIGINALLY FROM CLOUDFLARE WRANGLER: // https://github.com/cloudflare/wrangler2/blob/main/.github/changeset-version.js -import { exec } from "child_process" +import { execSync } from "child_process" // This script is used by the `release.yml` workflow to update the version of the packages being released. -// The standard step is only to run `changeset version` but this does not update the package-lock.json file. -// So we also run `npm install`, which does this update. +// The standard step is only to run `changeset version` but this does not update the pnpm-lock.yaml file. +// So we also run `pnpm install`, which does this update. // This is a workaround until this is handled automatically by `changeset version`. // See https://github.com/changesets/changesets/issues/421. -exec("npx changeset version") -exec("npm install") +execSync("npx changeset version", { stdio: "inherit" }) +execSync("pnpm install --lockfile-only", { stdio: "inherit" }) diff --git a/apps/v4/app/(app)/(root)/components/button-group-demo.tsx b/apps/v4/app/(app)/(root)/components/button-group-demo.tsx index bdf259d1d5..ccfc877544 100644 --- a/apps/v4/app/(app)/(root)/components/button-group-demo.tsx +++ b/apps/v4/app/(app)/(root)/components/button-group-demo.tsx @@ -56,7 +56,7 @@ export function ButtonGroupDemo() { - + diff --git a/apps/v4/app/(app)/(root)/components/field-demo.tsx b/apps/v4/app/(app)/(root)/components/field-demo.tsx index 795129225d..035bcd5107 100644 --- a/apps/v4/app/(app)/(root)/components/field-demo.tsx +++ b/apps/v4/app/(app)/(root)/components/field-demo.tsx @@ -13,6 +13,7 @@ import { Input } from "@/examples/radix/ui/input" import { Select, SelectContent, + SelectGroup, SelectItem, SelectTrigger, SelectValue, @@ -69,18 +70,20 @@ export function FieldDemo() { - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 + + 01 + 02 + 03 + 04 + 05 + 06 + 07 + 08 + 09 + 10 + 11 + 12 + @@ -93,12 +96,14 @@ export function FieldDemo() { - 2024 - 2025 - 2026 - 2027 - 2028 - 2029 + + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + diff --git a/apps/v4/app/(app)/(root)/components/field-hear.tsx b/apps/v4/app/(app)/(root)/components/field-hear.tsx index ad28d31289..704cdc9aee 100644 --- a/apps/v4/app/(app)/(root)/components/field-hear.tsx +++ b/apps/v4/app/(app)/(root)/components/field-hear.tsx @@ -50,7 +50,7 @@ export function FieldHear() { > Auto - + Auto Agent Manual diff --git a/apps/v4/app/(app)/docs/[[...slug]]/page.tsx b/apps/v4/app/(app)/docs/[[...slug]]/page.tsx index 49c018249c..d531d3acad 100644 --- a/apps/v4/app/(app)/docs/[[...slug]]/page.tsx +++ b/apps/v4/app/(app)/docs/[[...slug]]/page.tsx @@ -95,12 +95,14 @@ export default async function Page(props: {
-
-

+
+

{doc.title}

-
- +
+
+ +
{neighbours.previous && (
-
+
{doc.toc?.length ? (
diff --git a/apps/v4/app/(app)/docs/changelog/page.tsx b/apps/v4/app/(app)/docs/changelog/page.tsx index 0893562065..eb32733b67 100644 --- a/apps/v4/app/(app)/docs/changelog/page.tsx +++ b/apps/v4/app/(app)/docs/changelog/page.tsx @@ -82,21 +82,25 @@ export default function ChangelogPage() {

More Updates

-
    +
    {olderPages.map((page) => { const data = page.data as ChangelogPageData + const [date, ...titleParts] = data.title.split(" - ") + const title = titleParts.join(" - ") return ( -
  • - - {data.title} - -
  • + + + {date} + + {title} + ) })} -
+
)}
diff --git a/apps/v4/app/(app)/docs/layout.tsx b/apps/v4/app/(app)/docs/layout.tsx index 339c2ca804..465f5d0665 100644 --- a/apps/v4/app/(app)/docs/layout.tsx +++ b/apps/v4/app/(app)/docs/layout.tsx @@ -11,7 +11,11 @@ export default function DocsLayout({
{children}
diff --git a/apps/v4/app/(app)/examples/layout.tsx b/apps/v4/app/(app)/examples/layout.tsx index 4267903319..b8c5b03105 100644 --- a/apps/v4/app/(app)/examples/layout.tsx +++ b/apps/v4/app/(app)/examples/layout.tsx @@ -70,7 +70,7 @@ export default function ExamplesLayout({
-
+
{children}
diff --git a/apps/v4/app/(app)/examples/playground/components/maxlength-selector.tsx b/apps/v4/app/(app)/examples/playground/components/maxlength-selector.tsx index 3a19f81384..44008c9e2d 100644 --- a/apps/v4/app/(app)/examples/playground/components/maxlength-selector.tsx +++ b/apps/v4/app/(app)/examples/playground/components/maxlength-selector.tsx @@ -1,7 +1,7 @@ "use client" import * as React from "react" -import { type SliderProps } from "@radix-ui/react-slider" +import type { Slider as SliderPrimitive } from "radix-ui" import { HoverCard, @@ -12,7 +12,9 @@ import { Label } from "@/registry/new-york-v4/ui/label" import { Slider } from "@/registry/new-york-v4/ui/slider" interface MaxLengthSelectorProps { - defaultValue: SliderProps["defaultValue"] + defaultValue: React.ComponentProps< + typeof SliderPrimitive.Root + >["defaultValue"] } export function MaxLengthSelector({ defaultValue }: MaxLengthSelectorProps) { diff --git a/apps/v4/app/(app)/examples/playground/components/model-selector.tsx b/apps/v4/app/(app)/examples/playground/components/model-selector.tsx index 5e7dfcb8b4..908dba2dcb 100644 --- a/apps/v4/app/(app)/examples/playground/components/model-selector.tsx +++ b/apps/v4/app/(app)/examples/playground/components/model-selector.tsx @@ -1,8 +1,8 @@ "use client" import * as React from "react" -import { type PopoverProps } from "@radix-ui/react-popover" import { Check, ChevronsUpDown } from "lucide-react" +import type { Popover as PopoverPrimitive } from "radix-ui" import { cn } from "@/lib/utils" import { useMutationObserver } from "@/hooks/use-mutation-observer" @@ -29,7 +29,8 @@ import { import { type Model, type ModelType } from "../data/models" -interface ModelSelectorProps extends PopoverProps { +interface ModelSelectorProps + extends React.ComponentProps { types: readonly ModelType[] models: Model[] } diff --git a/apps/v4/app/(app)/examples/playground/components/preset-actions.tsx b/apps/v4/app/(app)/examples/playground/components/preset-actions.tsx index 3f0e80fc28..a1178653c5 100644 --- a/apps/v4/app/(app)/examples/playground/components/preset-actions.tsx +++ b/apps/v4/app/(app)/examples/playground/components/preset-actions.tsx @@ -1,7 +1,6 @@ "use client" import * as React from "react" -import { Dialog } from "@radix-ui/react-dialog" import { MoreHorizontal } from "lucide-react" import { toast } from "sonner" @@ -16,6 +15,7 @@ import { } from "@/registry/new-york-v4/ui/alert-dialog" import { Button } from "@/registry/new-york-v4/ui/button" import { + Dialog, DialogClose, DialogContent, DialogDescription, diff --git a/apps/v4/app/(app)/examples/playground/components/preset-selector.tsx b/apps/v4/app/(app)/examples/playground/components/preset-selector.tsx index f764fcb280..aa9944535b 100644 --- a/apps/v4/app/(app)/examples/playground/components/preset-selector.tsx +++ b/apps/v4/app/(app)/examples/playground/components/preset-selector.tsx @@ -1,8 +1,8 @@ "use client" import * as React from "react" -import { type PopoverProps } from "@radix-ui/react-popover" import { Check, ChevronsUpDown } from "lucide-react" +import type { Popover as PopoverPrimitive } from "radix-ui" import { cn } from "@/lib/utils" import { Button } from "@/registry/new-york-v4/ui/button" @@ -23,7 +23,8 @@ import { import { type Preset } from "../data/presets" -interface PresetSelectorProps extends PopoverProps { +interface PresetSelectorProps + extends React.ComponentProps { presets: Preset[] } diff --git a/apps/v4/app/(app)/examples/playground/components/temperature-selector.tsx b/apps/v4/app/(app)/examples/playground/components/temperature-selector.tsx index 7dbbdbb253..cbf308bd64 100644 --- a/apps/v4/app/(app)/examples/playground/components/temperature-selector.tsx +++ b/apps/v4/app/(app)/examples/playground/components/temperature-selector.tsx @@ -1,7 +1,7 @@ "use client" import * as React from "react" -import { type SliderProps } from "@radix-ui/react-slider" +import type { Slider as SliderPrimitive } from "radix-ui" import { HoverCard, @@ -12,7 +12,9 @@ import { Label } from "@/registry/new-york-v4/ui/label" import { Slider } from "@/registry/new-york-v4/ui/slider" interface TemperatureSelectorProps { - defaultValue: SliderProps["defaultValue"] + defaultValue: React.ComponentProps< + typeof SliderPrimitive.Root + >["defaultValue"] } export function TemperatureSelector({ diff --git a/apps/v4/app/(app)/examples/playground/components/top-p-selector.tsx b/apps/v4/app/(app)/examples/playground/components/top-p-selector.tsx index a33bd2c2b1..1f02acd323 100644 --- a/apps/v4/app/(app)/examples/playground/components/top-p-selector.tsx +++ b/apps/v4/app/(app)/examples/playground/components/top-p-selector.tsx @@ -1,7 +1,7 @@ "use client" import * as React from "react" -import { type SliderProps } from "@radix-ui/react-slider" +import type { Slider as SliderPrimitive } from "radix-ui" import { HoverCard, @@ -12,7 +12,9 @@ import { Label } from "@/registry/new-york-v4/ui/label" import { Slider } from "@/registry/new-york-v4/ui/slider" interface TopPSelectorProps { - defaultValue: SliderProps["defaultValue"] + defaultValue: React.ComponentProps< + typeof SliderPrimitive.Root + >["defaultValue"] } export function TopPSelector({ defaultValue }: TopPSelectorProps) { diff --git a/apps/v4/app/(app)/examples/rtl/components/appearance-settings.tsx b/apps/v4/app/(app)/examples/rtl/components/appearance-settings.tsx new file mode 100644 index 0000000000..2ec0b008d6 --- /dev/null +++ b/apps/v4/app/(app)/examples/rtl/components/appearance-settings.tsx @@ -0,0 +1,170 @@ +"use client" + +import * as React from "react" +import { Button } from "@/examples/base/ui-rtl/button" +import { ButtonGroup } from "@/examples/base/ui-rtl/button-group" +import { + Field, + FieldContent, + FieldDescription, + FieldGroup, + FieldLabel, + FieldLegend, + FieldSeparator, + FieldSet, + FieldTitle, +} from "@/examples/base/ui-rtl/field" +import { Input } from "@/examples/base/ui-rtl/input" +import { RadioGroup, RadioGroupItem } from "@/examples/base/ui-rtl/radio-group" +import { Switch } from "@/examples/base/ui-rtl/switch" +import { IconMinus, IconPlus } from "@tabler/icons-react" + +import { useLanguageContext } from "@/components/language-selector" + +const translations = { + ar: { + dir: "rtl" as const, + computeEnvironment: "بيئة الحوسبة", + computeDescription: "اختر بيئة الحوسبة لمجموعتك.", + kubernetes: "كوبرنيتس", + kubernetesDescription: + "تشغيل أحمال عمل GPU على مجموعة مُهيأة بـ K8s. هذا هو الافتراضي.", + virtualMachine: "جهاز افتراضي", + vmDescription: "الوصول إلى مجموعة VM مُهيأة لتشغيل أحمال العمل. (قريبًا)", + numberOfGpus: "عدد وحدات GPU", + gpuDescription: "يمكنك إضافة المزيد لاحقًا.", + decrement: "إنقاص", + increment: "زيادة", + wallpaperTinting: "تلوين الخلفية", + wallpaperDescription: "السماح بتلوين الخلفية.", + }, + he: { + dir: "rtl" as const, + computeEnvironment: "סביבת מחשוב", + computeDescription: "בחר את סביבת המחשוב לאשכול שלך.", + kubernetes: "קוברנטיס", + kubernetesDescription: + "הפעל עומסי עבודה של GPU באשכול מוגדר K8s. זו ברירת המחדל.", + virtualMachine: "מכונה וירטואלית", + vmDescription: "גש לאשכול VM מוגדר להפעלת עומסי עבודה. (בקרוב)", + numberOfGpus: "מספר GPUs", + gpuDescription: "תוכל להוסיף עוד מאוחר יותר.", + decrement: "הפחת", + increment: "הגדל", + wallpaperTinting: "צביעת טפט", + wallpaperDescription: "אפשר לטפט להיצבע.", + }, +} + +export function AppearanceSettings() { + const context = useLanguageContext() + const lang = context?.language === "he" ? "he" : "ar" + const t = translations[lang] + const [gpuCount, setGpuCount] = React.useState(8) + + const handleGpuAdjustment = React.useCallback((adjustment: number) => { + setGpuCount((prevCount) => + Math.max(1, Math.min(99, prevCount + adjustment)) + ) + }, []) + + const handleGpuInputChange = React.useCallback( + (e: React.ChangeEvent) => { + const value = parseInt(e.target.value, 10) + if (!isNaN(value) && value >= 1 && value <= 99) { + setGpuCount(value) + } + }, + [] + ) + + return ( +
+
+ +
+ {t.computeEnvironment} + {t.computeDescription} + + + + + {t.kubernetes} + + {t.kubernetesDescription} + + + + + + + + + {t.virtualMachine} + {t.vmDescription} + + + + + +
+ + + + {t.numberOfGpus} + {t.gpuDescription} + + + + + + + + + + + + {t.wallpaperTinting} + + {t.wallpaperDescription} + + + +
+
+
+ ) +} diff --git a/apps/v4/app/(app)/examples/rtl/components/button-group-demo.tsx b/apps/v4/app/(app)/examples/rtl/components/button-group-demo.tsx new file mode 100644 index 0000000000..cda018e544 --- /dev/null +++ b/apps/v4/app/(app)/examples/rtl/components/button-group-demo.tsx @@ -0,0 +1,179 @@ +"use client" + +import * as React from "react" +import { Button } from "@/examples/base/ui-rtl/button" +import { ButtonGroup } from "@/examples/base/ui-rtl/button-group" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from "@/examples/base/ui-rtl/dropdown-menu" +import { + ArchiveIcon, + ArrowLeftIcon, + CalendarPlusIcon, + ClockIcon, + ListFilterIcon, + MailCheckIcon, + MoreHorizontalIcon, + TagIcon, + Trash2Icon, +} from "lucide-react" + +import { useLanguageContext } from "@/components/language-selector" + +const translations = { + ar: { + dir: "rtl" as const, + goBack: "رجوع", + archive: "أرشفة", + report: "إبلاغ", + snooze: "تأجيل", + moreOptions: "خيارات أخرى", + markAsRead: "تحديد كمقروء", + addToCalendar: "إضافة إلى التقويم", + addToList: "إضافة إلى القائمة", + labelAs: "تصنيف كـ...", + personal: "شخصي", + work: "عمل", + other: "أخرى", + trash: "حذف", + }, + he: { + dir: "rtl" as const, + goBack: "חזור", + archive: "ארכיון", + report: "דווח", + snooze: "נודניק", + moreOptions: "אפשרויות נוספות", + markAsRead: "סמן כנקרא", + addToCalendar: "הוסף ליומן", + addToList: "הוסף לרשימה", + labelAs: "תייג כ...", + personal: "אישי", + work: "עבודה", + other: "אחר", + trash: "מחק", + }, +} + +export function ButtonGroupDemo() { + const context = useLanguageContext() + const lang = context?.language === "he" ? "he" : "ar" + const t = translations[lang] + const [label, setLabel] = React.useState("personal") + + return ( +
+ + + + + + + + + + + + + } + > + + + + + + + {t.markAsRead} + + + + {t.archive} + + + + + + + {t.snooze} + + + + {t.addToCalendar} + + + + {t.addToList} + + + + + {t.labelAs} + + + + + + {t.personal} + + + {t.work} + + + {t.other} + + + + + + + + + + + {t.trash} + + + + + + +
+ ) +} diff --git a/apps/v4/app/(app)/examples/rtl/components/button-group-input-group.tsx b/apps/v4/app/(app)/examples/rtl/components/button-group-input-group.tsx new file mode 100644 index 0000000000..7493207b87 --- /dev/null +++ b/apps/v4/app/(app)/examples/rtl/components/button-group-input-group.tsx @@ -0,0 +1,82 @@ +"use client" + +import * as React from "react" +import { Button } from "@/examples/base/ui-rtl/button" +import { ButtonGroup } from "@/examples/base/ui-rtl/button-group" +import { + InputGroup, + InputGroupAddon, + InputGroupButton, + InputGroupInput, +} from "@/examples/base/ui-rtl/input-group" +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/examples/base/ui-rtl/tooltip" +import { AudioLinesIcon, PlusIcon } from "lucide-react" + +import { useLanguageContext } from "@/components/language-selector" + +const translations = { + ar: { + dir: "rtl" as const, + add: "إضافة", + voicePlaceholder: "سجل وأرسل صوتًا...", + messagePlaceholder: "أرسل رسالة...", + voiceMode: "الوضع الصوتي", + }, + he: { + dir: "rtl" as const, + add: "הוסף", + voicePlaceholder: "הקלט ושלח אודיו...", + messagePlaceholder: "שלח הודעה...", + voiceMode: "מצב קולי", + }, +} + +export function ButtonGroupInputGroup() { + const context = useLanguageContext() + const lang = context?.language === "he" ? "he" : "ar" + const t = translations[lang] + const [voiceEnabled, setVoiceEnabled] = React.useState(false) + + return ( + + + + + + + + + + setVoiceEnabled(!voiceEnabled)} + data-active={voiceEnabled} + className="data-[active=true]:bg-primary data-[active=true]:text-primary-foreground" + aria-pressed={voiceEnabled} + size="icon-xs" + aria-label={t.voiceMode} + /> + } + > + + + {t.voiceMode} + + + + + + ) +} diff --git a/apps/v4/app/(app)/examples/rtl/components/button-group-nested.tsx b/apps/v4/app/(app)/examples/rtl/components/button-group-nested.tsx new file mode 100644 index 0000000000..938c11d137 --- /dev/null +++ b/apps/v4/app/(app)/examples/rtl/components/button-group-nested.tsx @@ -0,0 +1,56 @@ +"use client" + +import { Button } from "@/examples/base/ui-rtl/button" +import { ButtonGroup } from "@/examples/base/ui-rtl/button-group" +import { ArrowLeftIcon, ArrowRightIcon } from "lucide-react" + +import { useLanguageContext } from "@/components/language-selector" + +const translations = { + ar: { + dir: "rtl" as const, + locale: "ar-SA", + previous: "السابق", + next: "التالي", + }, + he: { + dir: "rtl" as const, + locale: "he-IL", + previous: "הקודם", + next: "הבא", + }, +} + +function formatNumber(value: number, locale: string) { + return new Intl.NumberFormat(locale).format(value) +} + +export function ButtonGroupNested() { + const context = useLanguageContext() + const lang = context?.language === "he" ? "he" : "ar" + const t = translations[lang] + + return ( + + + + + + + + + + + + ) +} diff --git a/apps/v4/app/(app)/examples/rtl/components/button-group-popover.tsx b/apps/v4/app/(app)/examples/rtl/components/button-group-popover.tsx new file mode 100644 index 0000000000..e570d0f5c1 --- /dev/null +++ b/apps/v4/app/(app)/examples/rtl/components/button-group-popover.tsx @@ -0,0 +1,83 @@ +"use client" + +import { Button } from "@/examples/base/ui-rtl/button" +import { ButtonGroup } from "@/examples/base/ui-rtl/button-group" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/examples/base/ui-rtl/popover" +import { Separator } from "@/examples/base/ui-rtl/separator" +import { Textarea } from "@/examples/base/ui-rtl/textarea" +import { BotIcon, ChevronDownIcon } from "lucide-react" + +import { useLanguageContext } from "@/components/language-selector" + +const translations = { + ar: { + dir: "rtl" as const, + copilot: "المساعد", + openPopover: "فتح القائمة", + agentTasks: "مهام الوكيل", + placeholder: "صف مهمتك بلغة طبيعية.", + startTask: "ابدأ مهمة جديدة مع المساعد", + description: + "صف مهمتك بلغة طبيعية. سيعمل المساعد في الخلفية ويفتح طلب سحب لمراجعتك.", + }, + he: { + dir: "rtl" as const, + copilot: "עוזר", + openPopover: "פתח תפריט", + agentTasks: "משימות סוכן", + placeholder: "תאר את המשימה שלך בשפה טבעית.", + startTask: "התחל משימה חדשה עם העוזר", + description: + "תאר את המשימה שלך בשפה טבעית. העוזר יעבוד ברקע ויפתח בקשת משיכה לבדיקתך.", + }, +} + +export function ButtonGroupPopover() { + const context = useLanguageContext() + const lang = context?.language === "he" ? "he" : "ar" + const t = translations[lang] + + return ( + + + + + } + > + + + +
+
{t.agentTasks}
+
+ +
+