create-huenei-frontend 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/create-huenei-frontend.js +2 -0
- package/dist/index.js +99 -0
- package/dist/templates/clean/.cursor/skills/architecture/SKILL.md +26 -0
- package/dist/templates/clean/.cursor/skills/components-shadcn/SKILL.md +23 -0
- package/dist/templates/clean/.cursor/skills/daisyui/SKILL.md +98 -0
- package/dist/templates/clean/.cursor/skills/routing/SKILL.md +32 -0
- package/dist/templates/clean/.cursor/skills/testing/SKILL.md +55 -0
- package/dist/templates/clean/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
- package/dist/templates/clean/.cursor/skills/ui-and-styling/SKILL.md +32 -0
- package/dist/templates/clean/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
- package/dist/templates/clean/.prettierrc +6 -0
- package/dist/templates/clean/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
- package/dist/templates/clean/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
- package/dist/templates/clean/.vscode/extensions.json +7 -0
- package/dist/templates/clean/README.md +75 -0
- package/dist/templates/clean/components.json +22 -0
- package/dist/templates/clean/eslint.config.js +31 -0
- package/dist/templates/clean/index.html +13 -0
- package/dist/templates/clean/package.json +62 -0
- package/dist/templates/clean/pnpm-lock.yaml +4487 -0
- package/dist/templates/clean/pnpm-workspace.yaml +2 -0
- package/dist/templates/clean/src/assets/react.svg +1 -0
- package/dist/templates/clean/src/components/ui/badge.tsx +37 -0
- package/dist/templates/clean/src/components/ui/breadcrumb.tsx +106 -0
- package/dist/templates/clean/src/components/ui/button.tsx +58 -0
- package/dist/templates/clean/src/components/ui/card.tsx +72 -0
- package/dist/templates/clean/src/components/ui/form.tsx +165 -0
- package/dist/templates/clean/src/components/ui/input.tsx +22 -0
- package/dist/templates/clean/src/components/ui/label.tsx +24 -0
- package/dist/templates/clean/src/components/ui/password-input.tsx +41 -0
- package/dist/templates/clean/src/components/ui/separator.tsx +28 -0
- package/dist/templates/clean/src/components/ui/tabs.tsx +62 -0
- package/dist/templates/clean/src/components/ui/textarea.tsx +21 -0
- package/dist/templates/clean/src/index.css +104 -0
- package/dist/templates/clean/src/lib/queryClient.ts +11 -0
- package/dist/templates/clean/src/lib/utils.ts +6 -0
- package/dist/templates/clean/src/main.tsx +33 -0
- package/dist/templates/clean/src/routeTree.gen.ts +77 -0
- package/dist/templates/clean/src/router.tsx +13 -0
- package/dist/templates/clean/src/routes/__root.tsx +82 -0
- package/dist/templates/clean/src/routes/index.tsx +187 -0
- package/dist/templates/clean/src/routes/otra-ruta.tsx +319 -0
- package/dist/templates/clean/src/test/setup.ts +1 -0
- package/dist/templates/clean/tsconfig.app.json +34 -0
- package/dist/templates/clean/tsconfig.json +10 -0
- package/dist/templates/clean/tsconfig.node.json +26 -0
- package/dist/templates/clean/vite.config.ts +22 -0
- package/dist/templates/clean/vitest.config.ts +9 -0
- package/dist/templates/help/.cursor/skills/architecture/SKILL.md +26 -0
- package/dist/templates/help/.cursor/skills/components-shadcn/SKILL.md +23 -0
- package/dist/templates/help/.cursor/skills/daisyui/SKILL.md +98 -0
- package/dist/templates/help/.cursor/skills/routing/SKILL.md +32 -0
- package/dist/templates/help/.cursor/skills/testing/SKILL.md +55 -0
- package/dist/templates/help/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
- package/dist/templates/help/.cursor/skills/ui-and-styling/SKILL.md +32 -0
- package/dist/templates/help/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
- package/dist/templates/help/.prettierrc +6 -0
- package/dist/templates/help/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
- package/dist/templates/help/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
- package/dist/templates/help/.vscode/extensions.json +7 -0
- package/dist/templates/help/README.md +75 -0
- package/dist/templates/help/components.json +22 -0
- package/dist/templates/help/eslint.config.js +31 -0
- package/dist/templates/help/index.html +13 -0
- package/dist/templates/help/package.json +62 -0
- package/dist/templates/help/pnpm-lock.yaml +4487 -0
- package/dist/templates/help/pnpm-workspace.yaml +2 -0
- package/dist/templates/help/src/assets/react.svg +1 -0
- package/dist/templates/help/src/components/documentacion/entorno.tsx +99 -0
- package/dist/templates/help/src/components/documentacion/estructura.tsx +100 -0
- package/dist/templates/help/src/components/documentacion/figma-mcp.tsx +200 -0
- package/dist/templates/help/src/components/documentacion/inicio.tsx +69 -0
- package/dist/templates/help/src/components/documentacion/instalacion.tsx +72 -0
- package/dist/templates/help/src/components/documentacion/personalizacion.tsx +163 -0
- package/dist/templates/help/src/components/documentacion/rutas.tsx +138 -0
- package/dist/templates/help/src/components/documentacion/stack.tsx +401 -0
- package/dist/templates/help/src/components/ui/badge.tsx +37 -0
- package/dist/templates/help/src/components/ui/breadcrumb.tsx +106 -0
- package/dist/templates/help/src/components/ui/button.tsx +58 -0
- package/dist/templates/help/src/components/ui/card.tsx +72 -0
- package/dist/templates/help/src/components/ui/form.tsx +165 -0
- package/dist/templates/help/src/components/ui/input.tsx +22 -0
- package/dist/templates/help/src/components/ui/label.tsx +24 -0
- package/dist/templates/help/src/components/ui/password-input.tsx +41 -0
- package/dist/templates/help/src/components/ui/separator.tsx +28 -0
- package/dist/templates/help/src/components/ui/tabs.tsx +62 -0
- package/dist/templates/help/src/components/ui/textarea.tsx +21 -0
- package/dist/templates/help/src/data/proyectos.json +56 -0
- package/dist/templates/help/src/index.css +104 -0
- package/dist/templates/help/src/lib/queryClient.ts +11 -0
- package/dist/templates/help/src/lib/utils.ts +6 -0
- package/dist/templates/help/src/main.tsx +33 -0
- package/dist/templates/help/src/routeTree.gen.ts +241 -0
- package/dist/templates/help/src/router.tsx +13 -0
- package/dist/templates/help/src/routes/__root.tsx +92 -0
- package/dist/templates/help/src/routes/auth/iniciar-sesion.tsx +139 -0
- package/dist/templates/help/src/routes/auth/registro.tsx +205 -0
- package/dist/templates/help/src/routes/contacto.tsx +60 -0
- package/dist/templates/help/src/routes/dashbord.tsx +9 -0
- package/dist/templates/help/src/routes/documentacion.tsx +80 -0
- package/dist/templates/help/src/routes/index.test.tsx +42 -0
- package/dist/templates/help/src/routes/index.tsx +211 -0
- package/dist/templates/help/src/routes/perfil.tsx +9 -0
- package/dist/templates/help/src/routes/proyectos.$proyectoId.tsx +156 -0
- package/dist/templates/help/src/routes/proyectos.tsx +93 -0
- package/dist/templates/help/src/test/setup.ts +1 -0
- package/dist/templates/help/tsconfig.app.json +34 -0
- package/dist/templates/help/tsconfig.json +10 -0
- package/dist/templates/help/tsconfig.node.json +26 -0
- package/dist/templates/help/vite.config.ts +22 -0
- package/dist/templates/help/vitest.config.ts +9 -0
- package/dist/test-cli.js +48 -0
- package/package.json +25 -0
- package/templates/clean/.cursor/skills/architecture/SKILL.md +26 -0
- package/templates/clean/.cursor/skills/components-shadcn/SKILL.md +23 -0
- package/templates/clean/.cursor/skills/daisyui/SKILL.md +98 -0
- package/templates/clean/.cursor/skills/routing/SKILL.md +32 -0
- package/templates/clean/.cursor/skills/testing/SKILL.md +55 -0
- package/templates/clean/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
- package/templates/clean/.cursor/skills/ui-and-styling/SKILL.md +32 -0
- package/templates/clean/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
- package/templates/clean/.prettierrc +6 -0
- package/templates/clean/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
- package/templates/clean/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
- package/templates/clean/.vscode/extensions.json +7 -0
- package/templates/clean/README.md +75 -0
- package/templates/clean/components.json +22 -0
- package/templates/clean/eslint.config.js +31 -0
- package/templates/clean/index.html +13 -0
- package/templates/clean/package.json +62 -0
- package/templates/clean/pnpm-lock.yaml +4487 -0
- package/templates/clean/pnpm-workspace.yaml +2 -0
- package/templates/clean/src/assets/react.svg +1 -0
- package/templates/clean/src/components/ui/badge.tsx +37 -0
- package/templates/clean/src/components/ui/breadcrumb.tsx +106 -0
- package/templates/clean/src/components/ui/button.tsx +58 -0
- package/templates/clean/src/components/ui/card.tsx +72 -0
- package/templates/clean/src/components/ui/form.tsx +165 -0
- package/templates/clean/src/components/ui/input.tsx +22 -0
- package/templates/clean/src/components/ui/label.tsx +24 -0
- package/templates/clean/src/components/ui/password-input.tsx +41 -0
- package/templates/clean/src/components/ui/separator.tsx +28 -0
- package/templates/clean/src/components/ui/tabs.tsx +62 -0
- package/templates/clean/src/components/ui/textarea.tsx +21 -0
- package/templates/clean/src/index.css +104 -0
- package/templates/clean/src/lib/queryClient.ts +11 -0
- package/templates/clean/src/lib/utils.ts +6 -0
- package/templates/clean/src/main.tsx +33 -0
- package/templates/clean/src/routeTree.gen.ts +77 -0
- package/templates/clean/src/router.tsx +13 -0
- package/templates/clean/src/routes/__root.tsx +82 -0
- package/templates/clean/src/routes/index.tsx +187 -0
- package/templates/clean/src/routes/otra-ruta.tsx +319 -0
- package/templates/clean/src/test/setup.ts +1 -0
- package/templates/clean/tsconfig.app.json +34 -0
- package/templates/clean/tsconfig.json +10 -0
- package/templates/clean/tsconfig.node.json +26 -0
- package/templates/clean/vite.config.ts +22 -0
- package/templates/clean/vitest.config.ts +9 -0
- package/templates/help/.cursor/skills/architecture/SKILL.md +26 -0
- package/templates/help/.cursor/skills/components-shadcn/SKILL.md +23 -0
- package/templates/help/.cursor/skills/daisyui/SKILL.md +98 -0
- package/templates/help/.cursor/skills/routing/SKILL.md +32 -0
- package/templates/help/.cursor/skills/testing/SKILL.md +55 -0
- package/templates/help/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
- package/templates/help/.cursor/skills/ui-and-styling/SKILL.md +32 -0
- package/templates/help/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
- package/templates/help/.prettierrc +6 -0
- package/templates/help/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
- package/templates/help/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
- package/templates/help/.vscode/extensions.json +7 -0
- package/templates/help/README.md +75 -0
- package/templates/help/components.json +22 -0
- package/templates/help/eslint.config.js +31 -0
- package/templates/help/index.html +13 -0
- package/templates/help/package.json +62 -0
- package/templates/help/pnpm-lock.yaml +4487 -0
- package/templates/help/pnpm-workspace.yaml +2 -0
- package/templates/help/src/assets/react.svg +1 -0
- package/templates/help/src/components/documentacion/entorno.tsx +99 -0
- package/templates/help/src/components/documentacion/estructura.tsx +100 -0
- package/templates/help/src/components/documentacion/figma-mcp.tsx +200 -0
- package/templates/help/src/components/documentacion/inicio.tsx +69 -0
- package/templates/help/src/components/documentacion/instalacion.tsx +72 -0
- package/templates/help/src/components/documentacion/personalizacion.tsx +163 -0
- package/templates/help/src/components/documentacion/rutas.tsx +138 -0
- package/templates/help/src/components/documentacion/stack.tsx +401 -0
- package/templates/help/src/components/ui/badge.tsx +37 -0
- package/templates/help/src/components/ui/breadcrumb.tsx +106 -0
- package/templates/help/src/components/ui/button.tsx +58 -0
- package/templates/help/src/components/ui/card.tsx +72 -0
- package/templates/help/src/components/ui/form.tsx +165 -0
- package/templates/help/src/components/ui/input.tsx +22 -0
- package/templates/help/src/components/ui/label.tsx +24 -0
- package/templates/help/src/components/ui/password-input.tsx +41 -0
- package/templates/help/src/components/ui/separator.tsx +28 -0
- package/templates/help/src/components/ui/tabs.tsx +62 -0
- package/templates/help/src/components/ui/textarea.tsx +21 -0
- package/templates/help/src/data/proyectos.json +56 -0
- package/templates/help/src/index.css +104 -0
- package/templates/help/src/lib/queryClient.ts +11 -0
- package/templates/help/src/lib/utils.ts +6 -0
- package/templates/help/src/main.tsx +33 -0
- package/templates/help/src/routeTree.gen.ts +241 -0
- package/templates/help/src/router.tsx +13 -0
- package/templates/help/src/routes/__root.tsx +92 -0
- package/templates/help/src/routes/auth/iniciar-sesion.tsx +139 -0
- package/templates/help/src/routes/auth/registro.tsx +205 -0
- package/templates/help/src/routes/contacto.tsx +60 -0
- package/templates/help/src/routes/dashbord.tsx +9 -0
- package/templates/help/src/routes/documentacion.tsx +80 -0
- package/templates/help/src/routes/index.test.tsx +42 -0
- package/templates/help/src/routes/index.tsx +211 -0
- package/templates/help/src/routes/perfil.tsx +9 -0
- package/templates/help/src/routes/proyectos.$proyectoId.tsx +156 -0
- package/templates/help/src/routes/proyectos.tsx +93 -0
- package/templates/help/src/test/setup.ts +1 -0
- package/templates/help/tsconfig.app.json +34 -0
- package/templates/help/tsconfig.json +10 -0
- package/templates/help/tsconfig.node.json +26 -0
- package/templates/help/vite.config.ts +22 -0
- package/templates/help/vitest.config.ts +9 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import type * as LabelPrimitive from "@radix-ui/react-label"
|
|
3
|
+
import { Slot } from "@radix-ui/react-slot"
|
|
4
|
+
import {
|
|
5
|
+
Controller,
|
|
6
|
+
FormProvider,
|
|
7
|
+
useFormContext,
|
|
8
|
+
useFormState,
|
|
9
|
+
type ControllerProps,
|
|
10
|
+
type FieldPath,
|
|
11
|
+
type FieldValues,
|
|
12
|
+
} from "react-hook-form"
|
|
13
|
+
|
|
14
|
+
import { cn } from "@/lib/utils"
|
|
15
|
+
import { Label } from "@/components/ui/label"
|
|
16
|
+
|
|
17
|
+
const Form = FormProvider
|
|
18
|
+
|
|
19
|
+
type FormFieldContextValue<
|
|
20
|
+
TFieldValues extends FieldValues = FieldValues,
|
|
21
|
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
22
|
+
> = {
|
|
23
|
+
name: TName
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const FormFieldContext = React.createContext<FormFieldContextValue>(
|
|
27
|
+
{} as FormFieldContextValue
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
const FormField = <
|
|
31
|
+
TFieldValues extends FieldValues = FieldValues,
|
|
32
|
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
33
|
+
>({
|
|
34
|
+
...props
|
|
35
|
+
}: ControllerProps<TFieldValues, TName>) => {
|
|
36
|
+
return (
|
|
37
|
+
<FormFieldContext.Provider value={{ name: props.name }}>
|
|
38
|
+
<Controller {...props} />
|
|
39
|
+
</FormFieldContext.Provider>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const useFormField = () => {
|
|
44
|
+
const fieldContext = React.useContext(FormFieldContext)
|
|
45
|
+
const itemContext = React.useContext(FormItemContext)
|
|
46
|
+
const { getFieldState } = useFormContext()
|
|
47
|
+
const formState = useFormState({ name: fieldContext.name })
|
|
48
|
+
const fieldState = getFieldState(fieldContext.name, formState)
|
|
49
|
+
|
|
50
|
+
if (!fieldContext) {
|
|
51
|
+
throw new Error("useFormField should be used within <FormField>")
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const { id } = itemContext
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
name: fieldContext.name,
|
|
59
|
+
formItemId: `${id}-form-item`,
|
|
60
|
+
formDescriptionId: `${id}-form-item-description`,
|
|
61
|
+
formMessageId: `${id}-form-item-message`,
|
|
62
|
+
...fieldState,
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
type FormItemContextValue = {
|
|
67
|
+
id: string
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const FormItemContext = React.createContext<FormItemContextValue>(
|
|
71
|
+
{} as FormItemContextValue
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
function FormItem({ className, ...props }: React.ComponentProps<"div">) {
|
|
75
|
+
const id = React.useId()
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<FormItemContext.Provider value={{ id }}>
|
|
79
|
+
<div
|
|
80
|
+
data-slot="form-item"
|
|
81
|
+
className={cn("grid gap-2", className)}
|
|
82
|
+
{...props}
|
|
83
|
+
/>
|
|
84
|
+
</FormItemContext.Provider>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function FormLabel({
|
|
89
|
+
className,
|
|
90
|
+
...props
|
|
91
|
+
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
|
|
92
|
+
const { error, formItemId } = useFormField()
|
|
93
|
+
|
|
94
|
+
return (
|
|
95
|
+
<Label
|
|
96
|
+
data-slot="form-label"
|
|
97
|
+
data-error={!!error}
|
|
98
|
+
className={cn("data-[error=true]:text-error", className)}
|
|
99
|
+
htmlFor={formItemId}
|
|
100
|
+
{...props}
|
|
101
|
+
/>
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function FormControl({ ...props }: React.ComponentProps<typeof Slot>) {
|
|
106
|
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<Slot
|
|
110
|
+
data-slot="form-control"
|
|
111
|
+
id={formItemId}
|
|
112
|
+
aria-describedby={
|
|
113
|
+
!error
|
|
114
|
+
? `${formDescriptionId}`
|
|
115
|
+
: `${formDescriptionId} ${formMessageId}`
|
|
116
|
+
}
|
|
117
|
+
aria-invalid={!!error}
|
|
118
|
+
{...props}
|
|
119
|
+
/>
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function FormDescription({ className, ...props }: React.ComponentProps<"p">) {
|
|
124
|
+
const { formDescriptionId } = useFormField()
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<p
|
|
128
|
+
data-slot="form-description"
|
|
129
|
+
id={formDescriptionId}
|
|
130
|
+
className={cn("text-base-content/70 text-sm", className)}
|
|
131
|
+
{...props}
|
|
132
|
+
/>
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function FormMessage({ className, ...props }: React.ComponentProps<"p">) {
|
|
137
|
+
const { error, formMessageId } = useFormField()
|
|
138
|
+
const body = error ? String(error?.message ?? "") : props.children
|
|
139
|
+
|
|
140
|
+
if (!body) {
|
|
141
|
+
return null
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return (
|
|
145
|
+
<p
|
|
146
|
+
data-slot="form-message"
|
|
147
|
+
id={formMessageId}
|
|
148
|
+
className={cn("text-error text-sm", className)}
|
|
149
|
+
{...props}
|
|
150
|
+
>
|
|
151
|
+
{body}
|
|
152
|
+
</p>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export {
|
|
157
|
+
useFormField,
|
|
158
|
+
Form,
|
|
159
|
+
FormItem,
|
|
160
|
+
FormLabel,
|
|
161
|
+
FormControl,
|
|
162
|
+
FormDescription,
|
|
163
|
+
FormMessage,
|
|
164
|
+
FormField,
|
|
165
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils"
|
|
4
|
+
|
|
5
|
+
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
6
|
+
return (
|
|
7
|
+
<input
|
|
8
|
+
type={type}
|
|
9
|
+
data-slot="input"
|
|
10
|
+
className={cn(
|
|
11
|
+
"input input-bordered w-full",
|
|
12
|
+
"file:text-base-content placeholder:text-base-content/50",
|
|
13
|
+
"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
14
|
+
"aria-invalid:input-error",
|
|
15
|
+
className
|
|
16
|
+
)}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { Input }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import * as LabelPrimitive from "@radix-ui/react-label"
|
|
3
|
+
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
|
|
6
|
+
function Label({
|
|
7
|
+
className,
|
|
8
|
+
...props
|
|
9
|
+
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
|
|
10
|
+
return (
|
|
11
|
+
<LabelPrimitive.Root
|
|
12
|
+
data-slot="label"
|
|
13
|
+
className={cn(
|
|
14
|
+
"label flex items-center gap-2 text-sm leading-none font-medium select-none",
|
|
15
|
+
"group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50",
|
|
16
|
+
"peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Label }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { Eye, EyeOff } from "lucide-react"
|
|
3
|
+
import { Input } from "@/components/ui/input"
|
|
4
|
+
import { Button } from "@/components/ui/button"
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
|
|
7
|
+
type PasswordInputProps = React.ComponentProps<"input">
|
|
8
|
+
|
|
9
|
+
const PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(
|
|
10
|
+
({ className, ...props }, ref) => {
|
|
11
|
+
const [showPassword, setShowPassword] = React.useState(false)
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<div className="relative">
|
|
15
|
+
<Input
|
|
16
|
+
type={showPassword ? "text" : "password"}
|
|
17
|
+
className={cn("pr-10", className)}
|
|
18
|
+
ref={ref}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
<Button
|
|
22
|
+
type="button"
|
|
23
|
+
variant="ghost"
|
|
24
|
+
size="icon-sm"
|
|
25
|
+
className="absolute right-1 top-1/2 -translate-y-1/2 h-7 w-7 p-0 hover:bg-transparent"
|
|
26
|
+
onClick={() => setShowPassword((prev) => !prev)}
|
|
27
|
+
aria-label={showPassword ? "Ocultar contraseña" : "Mostrar contraseña"}
|
|
28
|
+
>
|
|
29
|
+
{showPassword ? (
|
|
30
|
+
<EyeOff className="h-4 w-4 text-muted-foreground" />
|
|
31
|
+
) : (
|
|
32
|
+
<Eye className="h-4 w-4 text-muted-foreground" />
|
|
33
|
+
)}
|
|
34
|
+
</Button>
|
|
35
|
+
</div>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
PasswordInput.displayName = "PasswordInput"
|
|
40
|
+
|
|
41
|
+
export { PasswordInput }
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import * as SeparatorPrimitive from "@radix-ui/react-separator"
|
|
3
|
+
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
|
|
6
|
+
function Separator({
|
|
7
|
+
className,
|
|
8
|
+
orientation = "horizontal",
|
|
9
|
+
decorative = true,
|
|
10
|
+
...props
|
|
11
|
+
}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
|
|
12
|
+
return (
|
|
13
|
+
<SeparatorPrimitive.Root
|
|
14
|
+
data-slot="separator"
|
|
15
|
+
decorative={decorative}
|
|
16
|
+
orientation={orientation}
|
|
17
|
+
className={cn(
|
|
18
|
+
"bg-base-300 shrink-0",
|
|
19
|
+
"data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full",
|
|
20
|
+
"data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
21
|
+
className
|
|
22
|
+
)}
|
|
23
|
+
{...props}
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { Separator }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
3
|
+
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
|
|
6
|
+
function Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {
|
|
7
|
+
return (
|
|
8
|
+
<TabsPrimitive.Root
|
|
9
|
+
data-slot="tabs"
|
|
10
|
+
className={cn("flex flex-col gap-2", className)}
|
|
11
|
+
{...props}
|
|
12
|
+
/>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {
|
|
17
|
+
return (
|
|
18
|
+
<TabsPrimitive.List
|
|
19
|
+
data-slot="tabs-list"
|
|
20
|
+
role="tablist"
|
|
21
|
+
className={cn(
|
|
22
|
+
"tabs tabs-box bg-base-200 inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
|
|
23
|
+
className
|
|
24
|
+
)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
|
|
31
|
+
return (
|
|
32
|
+
<TabsPrimitive.Trigger
|
|
33
|
+
data-slot="tabs-trigger"
|
|
34
|
+
role="tab"
|
|
35
|
+
className={cn(
|
|
36
|
+
"tab inline-flex flex-1 items-center justify-center gap-1.5 px-2 py-1 text-sm font-medium whitespace-nowrap transition-colors",
|
|
37
|
+
"data-[state=active]:tab-active",
|
|
38
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
39
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
40
|
+
"hover:cursor-pointer",
|
|
41
|
+
className
|
|
42
|
+
)}
|
|
43
|
+
{...props}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {
|
|
49
|
+
return (
|
|
50
|
+
<TabsPrimitive.Content
|
|
51
|
+
data-slot="tabs-content"
|
|
52
|
+
className={cn(
|
|
53
|
+
"tab-content flex-1 outline-none",
|
|
54
|
+
"data-[state=active]:block data-[state=inactive]:hidden",
|
|
55
|
+
className
|
|
56
|
+
)}
|
|
57
|
+
{...props}
|
|
58
|
+
/>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils"
|
|
4
|
+
|
|
5
|
+
function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
|
|
6
|
+
return (
|
|
7
|
+
<textarea
|
|
8
|
+
data-slot="textarea"
|
|
9
|
+
className={cn(
|
|
10
|
+
"textarea textarea-bordered w-full min-h-16 field-sizing-content",
|
|
11
|
+
"placeholder:text-base-content/50",
|
|
12
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
13
|
+
"aria-invalid:textarea-error",
|
|
14
|
+
className
|
|
15
|
+
)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Textarea }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": 1,
|
|
4
|
+
"titulo": "Sistema de Gestión Empresarial",
|
|
5
|
+
"descripcion": "Plataforma completa para la gestión de recursos empresariales, incluyendo módulos de contabilidad, recursos humanos y inventario.",
|
|
6
|
+
"tecnologias": ["React", "TypeScript", "Node.js", "PostgreSQL"],
|
|
7
|
+
"imagen": "https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&h=600&fit=crop",
|
|
8
|
+
"estado": "En Producción",
|
|
9
|
+
"fecha": "2024-01-15"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": 2,
|
|
13
|
+
"titulo": "Dashboard Analítico",
|
|
14
|
+
"descripcion": "Dashboard interactivo con visualizaciones en tiempo real para análisis de datos y métricas de negocio.",
|
|
15
|
+
"tecnologias": ["React", "D3.js", "Tailwind CSS", "Vite"],
|
|
16
|
+
"imagen": "https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=800&h=600&fit=crop",
|
|
17
|
+
"estado": "En Desarrollo",
|
|
18
|
+
"fecha": "2024-02-20"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": 3,
|
|
22
|
+
"titulo": "Aplicación E-commerce",
|
|
23
|
+
"descripcion": "Plataforma de comercio electrónico con carrito de compras, pasarela de pagos y gestión de inventario.",
|
|
24
|
+
"tecnologias": ["React", "TypeScript", "Stripe", "MongoDB"],
|
|
25
|
+
"imagen": "https://images.unsplash.com/photo-1556742049-0cfed4f6a45d?w=800&h=600&fit=crop",
|
|
26
|
+
"estado": "En Producción",
|
|
27
|
+
"fecha": "2023-11-10"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": 4,
|
|
31
|
+
"titulo": "Portal de Clientes",
|
|
32
|
+
"descripcion": "Sistema de autogestión para clientes con acceso a facturas, tickets de soporte y documentación.",
|
|
33
|
+
"tecnologias": ["React", "TypeScript", "Express", "MySQL"],
|
|
34
|
+
"imagen": "https://images.unsplash.com/photo-1551434678-e076c223a692?w=800&h=600&fit=crop",
|
|
35
|
+
"estado": "En Producción",
|
|
36
|
+
"fecha": "2023-09-05"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": 5,
|
|
40
|
+
"titulo": "App Móvil de Productividad",
|
|
41
|
+
"descripcion": "Aplicación móvil multiplataforma para gestión de tareas y colaboración en equipo.",
|
|
42
|
+
"tecnologias": ["React Native", "TypeScript", "Firebase", "Redux"],
|
|
43
|
+
"imagen": "https://images.unsplash.com/photo-1512941937669-90a1b58e7e9c?w=800&h=600&fit=crop",
|
|
44
|
+
"estado": "En Desarrollo",
|
|
45
|
+
"fecha": "2024-03-01"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": 6,
|
|
49
|
+
"titulo": "Sistema de Reservas",
|
|
50
|
+
"descripcion": "Plataforma para gestión de reservas y citas con calendario interactivo y notificaciones automáticas.",
|
|
51
|
+
"tecnologias": ["React", "TypeScript", "Node.js", "Redis"],
|
|
52
|
+
"imagen": "https://images.unsplash.com/photo-1484480974693-6ca0a78fb36b?w=800&h=600&fit=crop",
|
|
53
|
+
"estado": "En Producción",
|
|
54
|
+
"fecha": "2023-12-18"
|
|
55
|
+
}
|
|
56
|
+
]
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@plugin "daisyui" {
|
|
5
|
+
logs: true;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Main theme */
|
|
9
|
+
|
|
10
|
+
@plugin "daisyui/theme" {
|
|
11
|
+
name: "huenei";
|
|
12
|
+
default: true;
|
|
13
|
+
prefersdark: false;
|
|
14
|
+
color-scheme: light;
|
|
15
|
+
--color-base-100: oklch(100% 0 0);
|
|
16
|
+
--color-base-200: oklch(97% 0 0);
|
|
17
|
+
--color-base-300: oklch(94% 0 0);
|
|
18
|
+
--color-base-content: oklch(0% 0 0);
|
|
19
|
+
--color-primary: oklch(15.906% 0 0);
|
|
20
|
+
--color-primary-content: oklch(100% 0 0);
|
|
21
|
+
--color-secondary: oklch(21.455% 0.001 17.278);
|
|
22
|
+
--color-secondary-content: oklch(100% 0 0);
|
|
23
|
+
--color-accent: oklch(26.861% 0 0);
|
|
24
|
+
--color-accent-content: oklch(100% 0 0);
|
|
25
|
+
--color-neutral: oklch(0% 0 0);
|
|
26
|
+
--color-neutral-content: oklch(100% 0 0);
|
|
27
|
+
--color-info: oklch(79.54% 0.103 205.9);
|
|
28
|
+
--color-info-content: oklch(15.908% 0.02 205.9);
|
|
29
|
+
--color-success: oklch(90.13% 0.153 164.14);
|
|
30
|
+
--color-success-content: oklch(18.026% 0.03 164.14);
|
|
31
|
+
--color-warning: oklch(88.37% 0.135 79.94);
|
|
32
|
+
--color-warning-content: oklch(17.674% 0.027 79.94);
|
|
33
|
+
--color-error: oklch(78.66% 0.15 28.47);
|
|
34
|
+
--color-error-content: oklch(15.732% 0.03 28.47);
|
|
35
|
+
--radius-selector: 2rem;
|
|
36
|
+
--radius-field: 0.25rem;
|
|
37
|
+
--radius-box: 0.5rem;
|
|
38
|
+
--size-selector: 0.25rem;
|
|
39
|
+
--size-field: 0.25rem;
|
|
40
|
+
--border: 1px;
|
|
41
|
+
--depth: 0;
|
|
42
|
+
--noise: 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Toastify theme */
|
|
46
|
+
:root {
|
|
47
|
+
--toastify-color-light: #fff;
|
|
48
|
+
--toastify-color-dark: #121212;
|
|
49
|
+
--toastify-color-info: #3498db;
|
|
50
|
+
--toastify-color-success: #07bc0c;
|
|
51
|
+
--toastify-color-warning: #f1c40f;
|
|
52
|
+
--toastify-color-error: hsl(6, 78%, 57%);
|
|
53
|
+
--toastify-color-transparent: rgba(255, 255, 255, 0.7);
|
|
54
|
+
|
|
55
|
+
--toastify-icon-color-info: var(--toastify-color-info);
|
|
56
|
+
--toastify-icon-color-success: var(--toastify-color-success);
|
|
57
|
+
--toastify-icon-color-warning: var(--toastify-color-warning);
|
|
58
|
+
--toastify-icon-color-error: var(--toastify-color-error);
|
|
59
|
+
|
|
60
|
+
--toastify-container-width: fit-content;
|
|
61
|
+
--toastify-toast-width: 320px;
|
|
62
|
+
--toastify-toast-offset: 16px;
|
|
63
|
+
--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));
|
|
64
|
+
--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));
|
|
65
|
+
--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));
|
|
66
|
+
--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));
|
|
67
|
+
--toastify-toast-background: #fff;
|
|
68
|
+
--toastify-toast-padding: 14px;
|
|
69
|
+
--toastify-toast-min-height: 64px;
|
|
70
|
+
--toastify-toast-max-height: 800px;
|
|
71
|
+
--toastify-toast-bd-radius: 6px;
|
|
72
|
+
--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, 0.1);
|
|
73
|
+
--toastify-font-family: sans-serif;
|
|
74
|
+
--toastify-z-index: 9999;
|
|
75
|
+
--toastify-text-color-light: #757575;
|
|
76
|
+
--toastify-text-color-dark: #fff;
|
|
77
|
+
|
|
78
|
+
/* Used only for colored theme */
|
|
79
|
+
--toastify-text-color-info: #fff;
|
|
80
|
+
--toastify-text-color-success: #fff;
|
|
81
|
+
--toastify-text-color-warning: #fff;
|
|
82
|
+
--toastify-text-color-error: #fff;
|
|
83
|
+
|
|
84
|
+
--toastify-spinner-color: #616161;
|
|
85
|
+
--toastify-spinner-color-empty-area: #e0e0e0;
|
|
86
|
+
--toastify-color-progress-light: linear-gradient(
|
|
87
|
+
to right,
|
|
88
|
+
#4cd964,
|
|
89
|
+
#5ac8fa,
|
|
90
|
+
#007aff,
|
|
91
|
+
#34aadc,
|
|
92
|
+
#5856d6,
|
|
93
|
+
#ff2d55
|
|
94
|
+
);
|
|
95
|
+
--toastify-color-progress-dark: #bb86fc;
|
|
96
|
+
--toastify-color-progress-info: var(--toastify-color-info);
|
|
97
|
+
--toastify-color-progress-success: var(--toastify-color-success);
|
|
98
|
+
--toastify-color-progress-warning: var(--toastify-color-warning);
|
|
99
|
+
--toastify-color-progress-error: var(--toastify-color-error);
|
|
100
|
+
/* used to control the opacity of the progress trail */
|
|
101
|
+
--toastify-color-progress-bgo: 0.2;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@custom-variant dark (&:where([data-theme=night], [data-theme=night] *));
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { StrictMode } from "react";
|
|
2
|
+
import { createRoot } from "react-dom/client";
|
|
3
|
+
import { RouterProvider } from "@tanstack/react-router";
|
|
4
|
+
import { QueryClientProvider } from "@tanstack/react-query";
|
|
5
|
+
import { ToastContainer } from "react-toastify";
|
|
6
|
+
|
|
7
|
+
import { TanStackRouterDevtools } from "@tanstack/react-router-devtools";
|
|
8
|
+
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
|
9
|
+
import { router } from "./router";
|
|
10
|
+
import { queryClient } from "@/lib/queryClient";
|
|
11
|
+
import "./index.css";
|
|
12
|
+
|
|
13
|
+
createRoot(document.getElementById("root")!).render(
|
|
14
|
+
<StrictMode>
|
|
15
|
+
<QueryClientProvider client={queryClient}>
|
|
16
|
+
<RouterProvider router={router} />
|
|
17
|
+
<TanStackRouterDevtools router={router} initialIsOpen={false} />
|
|
18
|
+
<ReactQueryDevtools initialIsOpen={false} />
|
|
19
|
+
<ToastContainer
|
|
20
|
+
position="bottom-center"
|
|
21
|
+
autoClose={5000}
|
|
22
|
+
hideProgressBar={false}
|
|
23
|
+
newestOnTop={false}
|
|
24
|
+
closeOnClick={false}
|
|
25
|
+
rtl={false}
|
|
26
|
+
pauseOnFocusLoss
|
|
27
|
+
draggable
|
|
28
|
+
pauseOnHover
|
|
29
|
+
theme="light"
|
|
30
|
+
/>
|
|
31
|
+
</QueryClientProvider>
|
|
32
|
+
</StrictMode>
|
|
33
|
+
);
|