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
2 changes: 1 addition & 1 deletion apps/ui/public/r/p-dialog-4.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"files": [
{
"path": "registry/default/particles/p-dialog-4.tsx",
"content": "\"use client\";\n\nimport { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogClose,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogPopup,\n AlertDialogTitle,\n} from \"@/registry/default/ui/alert-dialog\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n Dialog,\n DialogClose,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogPanel,\n DialogPopup,\n DialogTitle,\n DialogTrigger,\n} from \"@/registry/default/ui/dialog\";\nimport { Field } from \"@/registry/default/ui/field\";\nimport { Form } from \"@/registry/default/ui/form\";\nimport { Textarea } from \"@/registry/default/ui/textarea\";\n\nexport default function Particle() {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [value, setValue] = useState(\"\");\n\n return (\n <Dialog\n onOpenChange={(o) => {\n if (!o && value) {\n setConfirmOpen(true);\n } else {\n setDialogOpen(o);\n }\n }}\n open={dialogOpen}\n >\n <DialogTrigger render={<Button variant=\"outline\" />}>\n Compose\n </DialogTrigger>\n <DialogPopup showCloseButton={false}>\n <DialogHeader>\n <DialogTitle>New message</DialogTitle>\n <DialogDescription>Type something and try closing.</DialogDescription>\n </DialogHeader>\n <Form\n className=\"contents\"\n onSubmit={(event) => {\n event.preventDefault();\n // Close the dialog when submitting\n setDialogOpen(false);\n }}\n >\n <DialogPanel>\n <Field>\n <Textarea\n onChange={(e) => setValue(e.target.value)}\n value={value}\n />\n </Field>\n </DialogPanel>\n <DialogFooter>\n <DialogClose render={<Button variant=\"ghost\" />}>\n Cancel\n </DialogClose>\n <Button\n onClick={() => {\n setValue(\"\");\n setDialogOpen(false);\n }}\n >\n Send\n </Button>\n </DialogFooter>\n </Form>\n </DialogPopup>\n\n {/* Confirmation dialog */}\n <AlertDialog onOpenChange={setConfirmOpen} open={confirmOpen}>\n <AlertDialogPopup>\n <AlertDialogHeader>\n <AlertDialogTitle>Discard changes?</AlertDialogTitle>\n <AlertDialogDescription>\n Your message will be lost.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogClose render={<Button variant=\"ghost\" />}>\n Go back\n </AlertDialogClose>\n <Button\n onClick={() => {\n setConfirmOpen(false);\n setValue(\"\");\n setDialogOpen(false);\n }}\n >\n Discard\n </Button>\n </AlertDialogFooter>\n </AlertDialogPopup>\n </AlertDialog>\n </Dialog>\n );\n}\n",
"content": "\"use client\";\n\nimport { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogClose,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogPopup,\n AlertDialogTitle,\n} from \"@/registry/default/ui/alert-dialog\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n Dialog,\n DialogClose,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogPanel,\n DialogPopup,\n DialogTitle,\n DialogTrigger,\n} from \"@/registry/default/ui/dialog\";\nimport { Field } from \"@/registry/default/ui/field\";\nimport { Form } from \"@/registry/default/ui/form\";\nimport { Textarea } from \"@/registry/default/ui/textarea\";\n\nexport default function Particle() {\n const [dialogOpen, setDialogOpen] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [value, setValue] = useState(\"\");\n\n return (\n <Dialog\n onOpenChange={(o) => {\n if (!o && value) {\n setConfirmOpen(true);\n } else {\n setDialogOpen(o);\n }\n }}\n open={dialogOpen}\n >\n <DialogTrigger render={<Button variant=\"outline\" />}>\n Compose\n </DialogTrigger>\n <DialogPopup showCloseButton={false}>\n <DialogHeader>\n <DialogTitle>New message</DialogTitle>\n <DialogDescription>Type something and try closing.</DialogDescription>\n </DialogHeader>\n <Form\n className=\"contents\"\n onSubmit={(event) => {\n event.preventDefault();\n // Close the dialog when submitting\n setDialogOpen(false);\n }}\n >\n <DialogPanel>\n <Field>\n <Textarea\n aria-label=\"Message\"\n onChange={(e) => setValue(e.target.value)}\n value={value}\n />\n </Field>\n </DialogPanel>\n <DialogFooter>\n <DialogClose render={<Button variant=\"ghost\" />}>\n Cancel\n </DialogClose>\n <Button\n onClick={() => {\n setValue(\"\");\n setDialogOpen(false);\n }}\n >\n Send\n </Button>\n </DialogFooter>\n </Form>\n </DialogPopup>\n\n {/* Confirmation dialog */}\n <AlertDialog onOpenChange={setConfirmOpen} open={confirmOpen}>\n <AlertDialogPopup>\n <AlertDialogHeader>\n <AlertDialogTitle>Discard changes?</AlertDialogTitle>\n <AlertDialogDescription>\n Your message will be lost.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogClose render={<Button variant=\"ghost\" />}>\n Go back\n </AlertDialogClose>\n <Button\n onClick={() => {\n setConfirmOpen(false);\n setValue(\"\");\n setDialogOpen(false);\n }}\n >\n Discard\n </Button>\n </AlertDialogFooter>\n </AlertDialogPopup>\n </AlertDialog>\n </Dialog>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
2 changes: 1 addition & 1 deletion apps/ui/public/r/p-field-10.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"files": [
{
"path": "registry/default/particles/p-field-10.tsx",
"content": "\"use client\";\n\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"@/registry/default/ui/field\";\nimport { Textarea } from \"@/registry/default/ui/textarea\";\n\nexport default function Particle() {\n return (\n <Field>\n <FieldLabel>Bio</FieldLabel>\n <Textarea placeholder=\"Tell us about yourself…\" />\n <FieldDescription>\n Write a short bio. Maximum 500 characters.\n </FieldDescription>\n </Field>\n );\n}\n",
"content": "\"use client\";\n\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"@/registry/default/ui/field\";\nimport { Textarea } from \"@/registry/default/ui/textarea\";\n\nexport default function Particle() {\n return (\n <Field>\n <FieldLabel>Bio</FieldLabel>\n <Textarea maxLength={500} placeholder=\"Tell us about yourself…\" />\n <FieldDescription>\n Write a short bio. Maximum 500 characters.\n </FieldDescription>\n </Field>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
2 changes: 1 addition & 1 deletion apps/ui/public/r/p-input-group-22.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"files": [
{
"path": "registry/default/particles/p-input-group-22.tsx",
"content": "\"use client\";\n\nimport { XIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/default/ui/input-group\";\n\nexport default function Particle() {\n const [value, setValue] = useState(\"Clear me\");\n\n return (\n <InputGroup>\n <InputGroupInput\n aria-label=\"Text input with clear button\"\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Enter text\"\n type=\"text\"\n value={value}\n />\n {value && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n aria-label=\"Clear input\"\n onClick={() => setValue(\"\")}\n size=\"icon-xs\"\n variant=\"ghost\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n}\n",
"content": "\"use client\";\n\nimport { XIcon } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"@/registry/default/ui/input-group\";\n\nexport default function Particle() {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(\"Clear me\");\n\n return (\n <InputGroup>\n <InputGroupInput\n aria-label=\"Text input with clear button\"\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Enter text\"\n ref={inputRef}\n type=\"text\"\n value={value}\n />\n {value && (\n <InputGroupAddon align=\"inline-end\">\n <Button\n aria-label=\"Clear input\"\n onClick={() => {\n setValue(\"\");\n inputRef.current?.focus();\n }}\n size=\"icon-xs\"\n variant=\"ghost\"\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
2 changes: 1 addition & 1 deletion apps/ui/public/r/p-input-group-29.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"files": [
{
"path": "registry/default/particles/p-input-group-29.tsx",
"content": "\"use client\";\n\nimport { ArrowRightIcon, MicIcon } from \"lucide-react\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupTextarea,\n} from \"@/registry/default/ui/input-group\";\nimport {\n Tooltip,\n TooltipPopup,\n TooltipTrigger,\n} from \"@/registry/default/ui/tooltip\";\n\nexport default function Particle() {\n return (\n <InputGroup>\n <InputGroupTextarea placeholder=\"Type a message…\" />\n <InputGroupAddon align=\"block-end\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Voice message\"\n className=\"rounded-full\"\n size=\"icon-sm\"\n variant=\"ghost\"\n />\n }\n >\n <MicIcon />\n </TooltipTrigger>\n <TooltipPopup>Record voice message</TooltipPopup>\n </Tooltip>\n <InputGroupText className=\"ml-auto text-muted-foreground text-xs\">\n Press Enter to send\n </InputGroupText>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Send message\"\n className=\"rounded-full\"\n size=\"icon-sm\"\n />\n }\n >\n <ArrowRightIcon />\n </TooltipTrigger>\n <TooltipPopup>Send</TooltipPopup>\n </Tooltip>\n </InputGroupAddon>\n </InputGroup>\n );\n}\n",
"content": "\"use client\";\n\nimport { ArrowRightIcon, MicIcon } from \"lucide-react\";\nimport { Button } from \"@/registry/default/ui/button\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupTextarea,\n} from \"@/registry/default/ui/input-group\";\nimport {\n Tooltip,\n TooltipPopup,\n TooltipTrigger,\n} from \"@/registry/default/ui/tooltip\";\n\nexport default function Particle() {\n return (\n <InputGroup>\n <InputGroupTextarea placeholder=\"Type a message…\" />\n <InputGroupAddon align=\"block-end\">\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Voice message\"\n className=\"rounded-full\"\n size=\"icon-sm\"\n variant=\"ghost\"\n />\n }\n >\n <MicIcon />\n </TooltipTrigger>\n <TooltipPopup>Record voice message</TooltipPopup>\n </Tooltip>\n <InputGroupText className=\"ms-auto text-muted-foreground text-xs\">\n Press Enter to send\n </InputGroupText>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n aria-label=\"Send message\"\n className=\"rounded-full\"\n size=\"icon-sm\"\n />\n }\n >\n <ArrowRightIcon />\n </TooltipTrigger>\n <TooltipPopup>Send</TooltipPopup>\n </Tooltip>\n </InputGroupAddon>\n </InputGroup>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
5 changes: 3 additions & 2 deletions apps/ui/public/r/p-otp-field-1.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
"name": "p-otp-field-1",
"description": "Basic OTP field",
"registryDependencies": [
"@coss/otp-field"
"@coss/otp-field",
"@coss/field"
],
"files": [
{
"path": "registry/default/particles/p-otp-field-1.tsx",
"content": "import { OTPField, OTPFieldInput } from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 6;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <OTPField aria-label=\"One-time password\" length={OTP_LENGTH}>\n {OTP_SLOT_KEYS.map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0 ? undefined : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n </OTPField>\n );\n}\n",
"content": "import { Field, FieldLabel } from \"@/registry/default/ui/field\";\nimport { OTPField, OTPFieldInput } from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 6;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <Field>\n <FieldLabel className=\"sr-only\">One-time password</FieldLabel>\n <OTPField length={OTP_LENGTH}>\n {OTP_SLOT_KEYS.map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0\n ? undefined\n : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n </OTPField>\n </Field>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
5 changes: 3 additions & 2 deletions apps/ui/public/r/p-otp-field-2.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
"name": "p-otp-field-2",
"description": "Large OTP field",
"registryDependencies": [
"@coss/otp-field"
"@coss/otp-field",
"@coss/field"
],
"files": [
{
"path": "registry/default/particles/p-otp-field-2.tsx",
"content": "import { OTPField, OTPFieldInput } from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 4;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <OTPField aria-label=\"One-time password\" length={OTP_LENGTH} size=\"lg\">\n {OTP_SLOT_KEYS.map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0 ? undefined : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n </OTPField>\n );\n}\n",
"content": "import { Field, FieldLabel } from \"@/registry/default/ui/field\";\nimport { OTPField, OTPFieldInput } from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 4;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <Field>\n <FieldLabel className=\"sr-only\">One-time password</FieldLabel>\n <OTPField length={OTP_LENGTH} size=\"lg\">\n {OTP_SLOT_KEYS.map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0\n ? undefined\n : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n </OTPField>\n </Field>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
5 changes: 3 additions & 2 deletions apps/ui/public/r/p-otp-field-3.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
"name": "p-otp-field-3",
"description": "OTP field with separator",
"registryDependencies": [
"@coss/otp-field"
"@coss/otp-field",
"@coss/field"
],
"files": [
{
"path": "registry/default/particles/p-otp-field-3.tsx",
"content": "import {\n OTPField,\n OTPFieldInput,\n OTPFieldSeparator,\n} from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 6;\nconst GROUP_LENGTH = 3;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <OTPField aria-label=\"Verification code\" length={OTP_LENGTH}>\n {OTP_SLOT_KEYS.slice(0, GROUP_LENGTH).map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0 ? undefined : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n <OTPFieldSeparator />\n {OTP_SLOT_KEYS.slice(GROUP_LENGTH).map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={`Character ${index + GROUP_LENGTH + 1} of ${OTP_LENGTH}`}\n />\n ))}\n </OTPField>\n );\n}\n",
"content": "import { Field, FieldLabel } from \"@/registry/default/ui/field\";\nimport {\n OTPField,\n OTPFieldInput,\n OTPFieldSeparator,\n} from \"@/registry/default/ui/otp-field\";\n\nconst OTP_LENGTH = 6;\nconst GROUP_LENGTH = 3;\n\nconst OTP_SLOT_KEYS = Array.from(\n { length: OTP_LENGTH },\n (_, i) => `otp-slot-${i}`,\n);\n\nexport default function Particle() {\n return (\n <Field>\n <FieldLabel className=\"sr-only\">Verification code</FieldLabel>\n <OTPField length={OTP_LENGTH}>\n {OTP_SLOT_KEYS.slice(0, GROUP_LENGTH).map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={\n index === 0\n ? undefined\n : `Character ${index + 1} of ${OTP_LENGTH}`\n }\n />\n ))}\n <OTPFieldSeparator />\n {OTP_SLOT_KEYS.slice(GROUP_LENGTH).map((slotKey, index) => (\n <OTPFieldInput\n key={slotKey}\n aria-label={`Character ${index + GROUP_LENGTH + 1} of ${OTP_LENGTH}`}\n />\n ))}\n </OTPField>\n </Field>\n );\n}\n",
"type": "registry:block"
}
],
Expand Down
Loading
Loading