336 lines
9.3 KiB
TypeScript
336 lines
9.3 KiB
TypeScript
"use client"
|
|
|
|
import * as React from "react"
|
|
import { Questionnaire as QuestionnairePrimitive } from "@shadcn/react/questionnaire"
|
|
import { cn } from "cn"
|
|
|
|
import { buttonVariants, type Button } from "@/registry/bases/aria/ui/button"
|
|
import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder"
|
|
|
|
function Questionnaire({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Root>) {
|
|
return (
|
|
<QuestionnairePrimitive.Root
|
|
data-slot="questionnaire"
|
|
className={cn("cn-questionnaire flex w-full min-w-0 flex-col", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireProgress({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Progress>) {
|
|
return (
|
|
<QuestionnairePrimitive.Progress
|
|
data-slot="questionnaire-progress"
|
|
className={cn(
|
|
"cn-questionnaire-progress min-h-[1lh] w-fit min-w-[14ch] font-medium text-muted-foreground tabular-nums",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireItem({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Item>) {
|
|
return (
|
|
<QuestionnairePrimitive.Item
|
|
data-slot="questionnaire-item"
|
|
className={cn(
|
|
"cn-questionnaire-item min-w-0 border-0 p-0 outline-none",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireTitle({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Title>) {
|
|
return (
|
|
<QuestionnairePrimitive.Title
|
|
data-slot="questionnaire-title"
|
|
className={cn(
|
|
"cn-questionnaire-title cn-font-heading text-pretty",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireDescription({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Description>) {
|
|
return (
|
|
<QuestionnairePrimitive.Description
|
|
data-slot="questionnaire-description"
|
|
className={cn(
|
|
"cn-questionnaire-description text-pretty text-muted-foreground",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireChoices({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Choices>) {
|
|
return (
|
|
<QuestionnairePrimitive.Choices
|
|
data-slot="questionnaire-choices"
|
|
className={cn(
|
|
"cn-questionnaire-choices group/questionnaire-choices grid min-w-0",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireChoice({
|
|
children,
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Choice>) {
|
|
return (
|
|
<QuestionnairePrimitive.Choice
|
|
data-slot="questionnaire-choice"
|
|
className={cn(
|
|
"cn-questionnaire-choice group/questionnaire-choice relative flex min-h-11 cursor-pointer items-start text-start transition-colors outline-none select-none",
|
|
"data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-disabled:opacity-50",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
<QuestionnairePrimitive.ChoiceInput
|
|
data-slot="questionnaire-choice-input"
|
|
className="cn-questionnaire-choice-input absolute inset-0 z-10 size-full cursor-pointer opacity-0"
|
|
/>
|
|
<span
|
|
aria-hidden="true"
|
|
data-slot="questionnaire-choice-indicator"
|
|
className="cn-questionnaire-choice-indicator pointer-events-none relative flex shrink-0 items-center justify-center border group-data-[type=radio]/questionnaire-choice:rounded-full"
|
|
>
|
|
<span
|
|
data-slot="questionnaire-choice-indicator-dot"
|
|
className="cn-questionnaire-choice-indicator-dot hidden rounded-full group-data-[type=checkbox]/questionnaire-choice:hidden group-data-checked/questionnaire-choice:block"
|
|
/>
|
|
<IconPlaceholder
|
|
data-slot="questionnaire-choice-indicator-check"
|
|
className="cn-questionnaire-choice-indicator-check hidden group-data-[type=radio]/questionnaire-choice:hidden group-data-checked/questionnaire-choice:block"
|
|
lucide="CheckIcon"
|
|
tabler="IconCheck"
|
|
hugeicons="Tick02Icon"
|
|
phosphor="CheckIcon"
|
|
remixicon="RiCheckLine"
|
|
/>
|
|
</span>
|
|
<QuestionnairePrimitive.ChoiceLabel
|
|
data-slot="questionnaire-choice-label"
|
|
className="cn-questionnaire-choice-label cn-questionnaire-choice-content flex min-w-0 flex-1 flex-col leading-snug"
|
|
>
|
|
{children}
|
|
</QuestionnairePrimitive.ChoiceLabel>
|
|
<QuestionnairePrimitive.ChoiceShortcut
|
|
data-slot="questionnaire-choice-shortcut"
|
|
className="cn-questionnaire-choice-shortcut cn-questionnaire-shortcut pointer-events-none ms-auto hidden shrink-0 group-data-[shortcut]/questionnaire-choice:inline-flex"
|
|
/>
|
|
</QuestionnairePrimitive.Choice>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireChoiceDescription({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<"span">) {
|
|
return (
|
|
<span
|
|
data-slot="questionnaire-choice-description"
|
|
className={cn("cn-questionnaire-choice-description", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireInput({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Input>) {
|
|
return (
|
|
<div
|
|
data-slot="questionnaire-input-wrapper"
|
|
className="cn-questionnaire-input-wrapper group/questionnaire-input relative min-w-0"
|
|
>
|
|
<QuestionnairePrimitive.Input
|
|
data-slot="questionnaire-input"
|
|
className={cn(
|
|
"cn-questionnaire-input min-h-11 w-full min-w-0 transition-[color,box-shadow,background-color] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 sm:min-h-0",
|
|
"selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireError({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Error>) {
|
|
return (
|
|
<QuestionnairePrimitive.Error
|
|
data-slot="questionnaire-error"
|
|
className={cn("cn-questionnaire-error text-destructive", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireActions({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<"div">) {
|
|
return (
|
|
<div
|
|
data-slot="questionnaire-actions"
|
|
className={cn(
|
|
"cn-questionnaire-actions grid min-h-11 w-full grid-cols-[minmax(0,1fr)_auto_auto] items-center",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function QuestionnairePrevious({
|
|
children,
|
|
className,
|
|
size = "default",
|
|
variant = "outline",
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Previous> &
|
|
Pick<React.ComponentProps<typeof Button>, "size" | "variant">) {
|
|
return (
|
|
<QuestionnairePrimitive.Previous
|
|
data-slot="questionnaire-previous"
|
|
data-size={size}
|
|
data-variant={variant}
|
|
className={cn(
|
|
buttonVariants({ size, variant }),
|
|
"cn-questionnaire-previous col-start-1 row-start-1 min-h-11 justify-self-start sm:min-h-0",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children ?? "Previous"}
|
|
</QuestionnairePrimitive.Previous>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireSkip({
|
|
children,
|
|
className,
|
|
size = "default",
|
|
variant = "outline",
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Skip> &
|
|
Pick<React.ComponentProps<typeof Button>, "size" | "variant">) {
|
|
return (
|
|
<QuestionnairePrimitive.Skip
|
|
data-slot="questionnaire-skip"
|
|
data-size={size}
|
|
data-variant={variant}
|
|
className={cn(
|
|
buttonVariants({ size, variant }),
|
|
"cn-questionnaire-skip col-start-2 row-start-1 min-h-11 justify-self-end sm:min-h-0",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children ?? "Skip"}
|
|
</QuestionnairePrimitive.Skip>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireNext({
|
|
children,
|
|
className,
|
|
size = "default",
|
|
variant = "default",
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Next> &
|
|
Pick<React.ComponentProps<typeof Button>, "size" | "variant">) {
|
|
return (
|
|
<QuestionnairePrimitive.Next
|
|
data-slot="questionnaire-next"
|
|
data-size={size}
|
|
data-variant={variant}
|
|
className={cn(
|
|
buttonVariants({ size, variant }),
|
|
"cn-questionnaire-next col-start-3 row-start-1 min-h-11 justify-self-end sm:min-h-0",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children ?? "Next"}
|
|
</QuestionnairePrimitive.Next>
|
|
)
|
|
}
|
|
|
|
function QuestionnaireSubmit({
|
|
children,
|
|
className,
|
|
size = "default",
|
|
variant = "default",
|
|
...props
|
|
}: React.ComponentProps<typeof QuestionnairePrimitive.Submit> &
|
|
Pick<React.ComponentProps<typeof Button>, "size" | "variant">) {
|
|
return (
|
|
<QuestionnairePrimitive.Submit
|
|
data-slot="questionnaire-submit"
|
|
data-size={size}
|
|
data-variant={variant}
|
|
className={cn(
|
|
buttonVariants({ size, variant }),
|
|
"cn-questionnaire-submit col-start-3 row-start-1 min-h-11 justify-self-end sm:min-h-0",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children ?? "Submit"}
|
|
</QuestionnairePrimitive.Submit>
|
|
)
|
|
}
|
|
|
|
export {
|
|
Questionnaire,
|
|
QuestionnaireActions,
|
|
QuestionnaireChoice,
|
|
QuestionnaireChoiceDescription,
|
|
QuestionnaireChoices,
|
|
QuestionnaireDescription,
|
|
QuestionnaireError,
|
|
QuestionnaireInput,
|
|
QuestionnaireItem,
|
|
QuestionnaireNext,
|
|
QuestionnairePrevious,
|
|
QuestionnaireProgress,
|
|
QuestionnaireSkip,
|
|
QuestionnaireSubmit,
|
|
QuestionnaireTitle,
|
|
}
|