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.
Files changed (222) hide show
  1. package/bin/create-huenei-frontend.js +2 -0
  2. package/dist/index.js +99 -0
  3. package/dist/templates/clean/.cursor/skills/architecture/SKILL.md +26 -0
  4. package/dist/templates/clean/.cursor/skills/components-shadcn/SKILL.md +23 -0
  5. package/dist/templates/clean/.cursor/skills/daisyui/SKILL.md +98 -0
  6. package/dist/templates/clean/.cursor/skills/routing/SKILL.md +32 -0
  7. package/dist/templates/clean/.cursor/skills/testing/SKILL.md +55 -0
  8. package/dist/templates/clean/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
  9. package/dist/templates/clean/.cursor/skills/ui-and-styling/SKILL.md +32 -0
  10. package/dist/templates/clean/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
  11. package/dist/templates/clean/.prettierrc +6 -0
  12. package/dist/templates/clean/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
  13. package/dist/templates/clean/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
  14. package/dist/templates/clean/.vscode/extensions.json +7 -0
  15. package/dist/templates/clean/README.md +75 -0
  16. package/dist/templates/clean/components.json +22 -0
  17. package/dist/templates/clean/eslint.config.js +31 -0
  18. package/dist/templates/clean/index.html +13 -0
  19. package/dist/templates/clean/package.json +62 -0
  20. package/dist/templates/clean/pnpm-lock.yaml +4487 -0
  21. package/dist/templates/clean/pnpm-workspace.yaml +2 -0
  22. package/dist/templates/clean/src/assets/react.svg +1 -0
  23. package/dist/templates/clean/src/components/ui/badge.tsx +37 -0
  24. package/dist/templates/clean/src/components/ui/breadcrumb.tsx +106 -0
  25. package/dist/templates/clean/src/components/ui/button.tsx +58 -0
  26. package/dist/templates/clean/src/components/ui/card.tsx +72 -0
  27. package/dist/templates/clean/src/components/ui/form.tsx +165 -0
  28. package/dist/templates/clean/src/components/ui/input.tsx +22 -0
  29. package/dist/templates/clean/src/components/ui/label.tsx +24 -0
  30. package/dist/templates/clean/src/components/ui/password-input.tsx +41 -0
  31. package/dist/templates/clean/src/components/ui/separator.tsx +28 -0
  32. package/dist/templates/clean/src/components/ui/tabs.tsx +62 -0
  33. package/dist/templates/clean/src/components/ui/textarea.tsx +21 -0
  34. package/dist/templates/clean/src/index.css +104 -0
  35. package/dist/templates/clean/src/lib/queryClient.ts +11 -0
  36. package/dist/templates/clean/src/lib/utils.ts +6 -0
  37. package/dist/templates/clean/src/main.tsx +33 -0
  38. package/dist/templates/clean/src/routeTree.gen.ts +77 -0
  39. package/dist/templates/clean/src/router.tsx +13 -0
  40. package/dist/templates/clean/src/routes/__root.tsx +82 -0
  41. package/dist/templates/clean/src/routes/index.tsx +187 -0
  42. package/dist/templates/clean/src/routes/otra-ruta.tsx +319 -0
  43. package/dist/templates/clean/src/test/setup.ts +1 -0
  44. package/dist/templates/clean/tsconfig.app.json +34 -0
  45. package/dist/templates/clean/tsconfig.json +10 -0
  46. package/dist/templates/clean/tsconfig.node.json +26 -0
  47. package/dist/templates/clean/vite.config.ts +22 -0
  48. package/dist/templates/clean/vitest.config.ts +9 -0
  49. package/dist/templates/help/.cursor/skills/architecture/SKILL.md +26 -0
  50. package/dist/templates/help/.cursor/skills/components-shadcn/SKILL.md +23 -0
  51. package/dist/templates/help/.cursor/skills/daisyui/SKILL.md +98 -0
  52. package/dist/templates/help/.cursor/skills/routing/SKILL.md +32 -0
  53. package/dist/templates/help/.cursor/skills/testing/SKILL.md +55 -0
  54. package/dist/templates/help/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
  55. package/dist/templates/help/.cursor/skills/ui-and-styling/SKILL.md +32 -0
  56. package/dist/templates/help/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
  57. package/dist/templates/help/.prettierrc +6 -0
  58. package/dist/templates/help/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
  59. package/dist/templates/help/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
  60. package/dist/templates/help/.vscode/extensions.json +7 -0
  61. package/dist/templates/help/README.md +75 -0
  62. package/dist/templates/help/components.json +22 -0
  63. package/dist/templates/help/eslint.config.js +31 -0
  64. package/dist/templates/help/index.html +13 -0
  65. package/dist/templates/help/package.json +62 -0
  66. package/dist/templates/help/pnpm-lock.yaml +4487 -0
  67. package/dist/templates/help/pnpm-workspace.yaml +2 -0
  68. package/dist/templates/help/src/assets/react.svg +1 -0
  69. package/dist/templates/help/src/components/documentacion/entorno.tsx +99 -0
  70. package/dist/templates/help/src/components/documentacion/estructura.tsx +100 -0
  71. package/dist/templates/help/src/components/documentacion/figma-mcp.tsx +200 -0
  72. package/dist/templates/help/src/components/documentacion/inicio.tsx +69 -0
  73. package/dist/templates/help/src/components/documentacion/instalacion.tsx +72 -0
  74. package/dist/templates/help/src/components/documentacion/personalizacion.tsx +163 -0
  75. package/dist/templates/help/src/components/documentacion/rutas.tsx +138 -0
  76. package/dist/templates/help/src/components/documentacion/stack.tsx +401 -0
  77. package/dist/templates/help/src/components/ui/badge.tsx +37 -0
  78. package/dist/templates/help/src/components/ui/breadcrumb.tsx +106 -0
  79. package/dist/templates/help/src/components/ui/button.tsx +58 -0
  80. package/dist/templates/help/src/components/ui/card.tsx +72 -0
  81. package/dist/templates/help/src/components/ui/form.tsx +165 -0
  82. package/dist/templates/help/src/components/ui/input.tsx +22 -0
  83. package/dist/templates/help/src/components/ui/label.tsx +24 -0
  84. package/dist/templates/help/src/components/ui/password-input.tsx +41 -0
  85. package/dist/templates/help/src/components/ui/separator.tsx +28 -0
  86. package/dist/templates/help/src/components/ui/tabs.tsx +62 -0
  87. package/dist/templates/help/src/components/ui/textarea.tsx +21 -0
  88. package/dist/templates/help/src/data/proyectos.json +56 -0
  89. package/dist/templates/help/src/index.css +104 -0
  90. package/dist/templates/help/src/lib/queryClient.ts +11 -0
  91. package/dist/templates/help/src/lib/utils.ts +6 -0
  92. package/dist/templates/help/src/main.tsx +33 -0
  93. package/dist/templates/help/src/routeTree.gen.ts +241 -0
  94. package/dist/templates/help/src/router.tsx +13 -0
  95. package/dist/templates/help/src/routes/__root.tsx +92 -0
  96. package/dist/templates/help/src/routes/auth/iniciar-sesion.tsx +139 -0
  97. package/dist/templates/help/src/routes/auth/registro.tsx +205 -0
  98. package/dist/templates/help/src/routes/contacto.tsx +60 -0
  99. package/dist/templates/help/src/routes/dashbord.tsx +9 -0
  100. package/dist/templates/help/src/routes/documentacion.tsx +80 -0
  101. package/dist/templates/help/src/routes/index.test.tsx +42 -0
  102. package/dist/templates/help/src/routes/index.tsx +211 -0
  103. package/dist/templates/help/src/routes/perfil.tsx +9 -0
  104. package/dist/templates/help/src/routes/proyectos.$proyectoId.tsx +156 -0
  105. package/dist/templates/help/src/routes/proyectos.tsx +93 -0
  106. package/dist/templates/help/src/test/setup.ts +1 -0
  107. package/dist/templates/help/tsconfig.app.json +34 -0
  108. package/dist/templates/help/tsconfig.json +10 -0
  109. package/dist/templates/help/tsconfig.node.json +26 -0
  110. package/dist/templates/help/vite.config.ts +22 -0
  111. package/dist/templates/help/vitest.config.ts +9 -0
  112. package/dist/test-cli.js +48 -0
  113. package/package.json +25 -0
  114. package/templates/clean/.cursor/skills/architecture/SKILL.md +26 -0
  115. package/templates/clean/.cursor/skills/components-shadcn/SKILL.md +23 -0
  116. package/templates/clean/.cursor/skills/daisyui/SKILL.md +98 -0
  117. package/templates/clean/.cursor/skills/routing/SKILL.md +32 -0
  118. package/templates/clean/.cursor/skills/testing/SKILL.md +55 -0
  119. package/templates/clean/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
  120. package/templates/clean/.cursor/skills/ui-and-styling/SKILL.md +32 -0
  121. package/templates/clean/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
  122. package/templates/clean/.prettierrc +6 -0
  123. package/templates/clean/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
  124. package/templates/clean/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
  125. package/templates/clean/.vscode/extensions.json +7 -0
  126. package/templates/clean/README.md +75 -0
  127. package/templates/clean/components.json +22 -0
  128. package/templates/clean/eslint.config.js +31 -0
  129. package/templates/clean/index.html +13 -0
  130. package/templates/clean/package.json +62 -0
  131. package/templates/clean/pnpm-lock.yaml +4487 -0
  132. package/templates/clean/pnpm-workspace.yaml +2 -0
  133. package/templates/clean/src/assets/react.svg +1 -0
  134. package/templates/clean/src/components/ui/badge.tsx +37 -0
  135. package/templates/clean/src/components/ui/breadcrumb.tsx +106 -0
  136. package/templates/clean/src/components/ui/button.tsx +58 -0
  137. package/templates/clean/src/components/ui/card.tsx +72 -0
  138. package/templates/clean/src/components/ui/form.tsx +165 -0
  139. package/templates/clean/src/components/ui/input.tsx +22 -0
  140. package/templates/clean/src/components/ui/label.tsx +24 -0
  141. package/templates/clean/src/components/ui/password-input.tsx +41 -0
  142. package/templates/clean/src/components/ui/separator.tsx +28 -0
  143. package/templates/clean/src/components/ui/tabs.tsx +62 -0
  144. package/templates/clean/src/components/ui/textarea.tsx +21 -0
  145. package/templates/clean/src/index.css +104 -0
  146. package/templates/clean/src/lib/queryClient.ts +11 -0
  147. package/templates/clean/src/lib/utils.ts +6 -0
  148. package/templates/clean/src/main.tsx +33 -0
  149. package/templates/clean/src/routeTree.gen.ts +77 -0
  150. package/templates/clean/src/router.tsx +13 -0
  151. package/templates/clean/src/routes/__root.tsx +82 -0
  152. package/templates/clean/src/routes/index.tsx +187 -0
  153. package/templates/clean/src/routes/otra-ruta.tsx +319 -0
  154. package/templates/clean/src/test/setup.ts +1 -0
  155. package/templates/clean/tsconfig.app.json +34 -0
  156. package/templates/clean/tsconfig.json +10 -0
  157. package/templates/clean/tsconfig.node.json +26 -0
  158. package/templates/clean/vite.config.ts +22 -0
  159. package/templates/clean/vitest.config.ts +9 -0
  160. package/templates/help/.cursor/skills/architecture/SKILL.md +26 -0
  161. package/templates/help/.cursor/skills/components-shadcn/SKILL.md +23 -0
  162. package/templates/help/.cursor/skills/daisyui/SKILL.md +98 -0
  163. package/templates/help/.cursor/skills/routing/SKILL.md +32 -0
  164. package/templates/help/.cursor/skills/testing/SKILL.md +55 -0
  165. package/templates/help/.cursor/skills/tooling-and-scripts/SKILL.md +24 -0
  166. package/templates/help/.cursor/skills/ui-and-styling/SKILL.md +32 -0
  167. package/templates/help/.cursor/skills/vibe-and-ia/SKILL.md +23 -0
  168. package/templates/help/.prettierrc +6 -0
  169. package/templates/help/.tanstack/tmp/c28007bb-2319511cf318e28129c8d8eb723db5fd +9 -0
  170. package/templates/help/.tanstack/tmp/c28007bb-bcef89e9e4593777e1c15ec4b4f32eea +9 -0
  171. package/templates/help/.vscode/extensions.json +7 -0
  172. package/templates/help/README.md +75 -0
  173. package/templates/help/components.json +22 -0
  174. package/templates/help/eslint.config.js +31 -0
  175. package/templates/help/index.html +13 -0
  176. package/templates/help/package.json +62 -0
  177. package/templates/help/pnpm-lock.yaml +4487 -0
  178. package/templates/help/pnpm-workspace.yaml +2 -0
  179. package/templates/help/src/assets/react.svg +1 -0
  180. package/templates/help/src/components/documentacion/entorno.tsx +99 -0
  181. package/templates/help/src/components/documentacion/estructura.tsx +100 -0
  182. package/templates/help/src/components/documentacion/figma-mcp.tsx +200 -0
  183. package/templates/help/src/components/documentacion/inicio.tsx +69 -0
  184. package/templates/help/src/components/documentacion/instalacion.tsx +72 -0
  185. package/templates/help/src/components/documentacion/personalizacion.tsx +163 -0
  186. package/templates/help/src/components/documentacion/rutas.tsx +138 -0
  187. package/templates/help/src/components/documentacion/stack.tsx +401 -0
  188. package/templates/help/src/components/ui/badge.tsx +37 -0
  189. package/templates/help/src/components/ui/breadcrumb.tsx +106 -0
  190. package/templates/help/src/components/ui/button.tsx +58 -0
  191. package/templates/help/src/components/ui/card.tsx +72 -0
  192. package/templates/help/src/components/ui/form.tsx +165 -0
  193. package/templates/help/src/components/ui/input.tsx +22 -0
  194. package/templates/help/src/components/ui/label.tsx +24 -0
  195. package/templates/help/src/components/ui/password-input.tsx +41 -0
  196. package/templates/help/src/components/ui/separator.tsx +28 -0
  197. package/templates/help/src/components/ui/tabs.tsx +62 -0
  198. package/templates/help/src/components/ui/textarea.tsx +21 -0
  199. package/templates/help/src/data/proyectos.json +56 -0
  200. package/templates/help/src/index.css +104 -0
  201. package/templates/help/src/lib/queryClient.ts +11 -0
  202. package/templates/help/src/lib/utils.ts +6 -0
  203. package/templates/help/src/main.tsx +33 -0
  204. package/templates/help/src/routeTree.gen.ts +241 -0
  205. package/templates/help/src/router.tsx +13 -0
  206. package/templates/help/src/routes/__root.tsx +92 -0
  207. package/templates/help/src/routes/auth/iniciar-sesion.tsx +139 -0
  208. package/templates/help/src/routes/auth/registro.tsx +205 -0
  209. package/templates/help/src/routes/contacto.tsx +60 -0
  210. package/templates/help/src/routes/dashbord.tsx +9 -0
  211. package/templates/help/src/routes/documentacion.tsx +80 -0
  212. package/templates/help/src/routes/index.test.tsx +42 -0
  213. package/templates/help/src/routes/index.tsx +211 -0
  214. package/templates/help/src/routes/perfil.tsx +9 -0
  215. package/templates/help/src/routes/proyectos.$proyectoId.tsx +156 -0
  216. package/templates/help/src/routes/proyectos.tsx +93 -0
  217. package/templates/help/src/test/setup.ts +1 -0
  218. package/templates/help/tsconfig.app.json +34 -0
  219. package/templates/help/tsconfig.json +10 -0
  220. package/templates/help/tsconfig.node.json +26 -0
  221. package/templates/help/vite.config.ts +22 -0
  222. 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,11 @@
1
+ import { QueryClient } from "@tanstack/react-query";
2
+
3
+ export const queryClient = new QueryClient({
4
+ defaultOptions: {
5
+ queries: {
6
+ staleTime: 60_000,
7
+ retry: 1,
8
+ refetchOnWindowFocus: false,
9
+ },
10
+ },
11
+ });
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -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
+ );