@skybin-tech/nebula-ui 0.0.30 → 0.0.31
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/dist/cjs/components/Form/DatePicker.cjs +8 -2
- package/dist/cjs/components/Form/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/Form/DateTimePicker.cjs +202 -0
- package/dist/cjs/components/Form/DateTimePicker.cjs.map +1 -0
- package/dist/cjs/components/Form/PasswordRevealToggle.cjs +21 -0
- package/dist/cjs/components/Form/PasswordRevealToggle.cjs.map +1 -0
- package/dist/cjs/components/Form/TextBox.cjs +29 -14
- package/dist/cjs/components/Form/TextBox.cjs.map +1 -1
- package/dist/cjs/components/Form/TimePicker.cjs +111 -0
- package/dist/cjs/components/Form/TimePicker.cjs.map +1 -0
- package/dist/cjs/components/Form/context.cjs +1 -1
- package/dist/cjs/components/Form/context.cjs.map +1 -1
- package/dist/cjs/components/Form/index.cjs +7 -0
- package/dist/cjs/components/Input/Input.cjs +32 -4
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/cjs/index.cjs +7 -0
- package/dist/components/Form/DatePicker.d.ts.map +1 -1
- package/dist/components/Form/DatePicker.js +9 -3
- package/dist/components/Form/DatePicker.js.map +1 -1
- package/dist/components/Form/DateTimePicker.d.ts +28 -0
- package/dist/components/Form/DateTimePicker.d.ts.map +1 -0
- package/dist/components/Form/DateTimePicker.js +202 -0
- package/dist/components/Form/DateTimePicker.js.map +1 -0
- package/dist/components/Form/PasswordRevealToggle.d.ts +7 -0
- package/dist/components/Form/PasswordRevealToggle.d.ts.map +1 -0
- package/dist/components/Form/PasswordRevealToggle.js +21 -0
- package/dist/components/Form/PasswordRevealToggle.js.map +1 -0
- package/dist/components/Form/TextBox.d.ts +5 -0
- package/dist/components/Form/TextBox.d.ts.map +1 -1
- package/dist/components/Form/TextBox.js +30 -15
- package/dist/components/Form/TextBox.js.map +1 -1
- package/dist/components/Form/TimePicker.d.ts +14 -0
- package/dist/components/Form/TimePicker.d.ts.map +1 -0
- package/dist/components/Form/TimePicker.js +111 -0
- package/dist/components/Form/TimePicker.js.map +1 -0
- package/dist/components/Form/context.d.ts +1 -1
- package/dist/components/Form/context.d.ts.map +1 -1
- package/dist/components/Form/context.js +1 -1
- package/dist/components/Form/context.js.map +1 -1
- package/dist/components/Form/index.d.ts +6 -0
- package/dist/components/Form/index.d.ts.map +1 -1
- package/dist/components/Form/index.js +4 -1
- package/dist/components/Input/Input.d.ts +14 -2
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/Input.js +34 -6
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextBox.d.ts","sourceRoot":"","sources":["../../../src/components/Form/TextBox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAsD,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"TextBox.d.ts","sourceRoot":"","sources":["../../../src/components/Form/TextBox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAsD,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQlE,QAAA,MAAM,eAAe;;;8EAoBpB,CAAC;AAEF;;GAEG;AACH,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,YAAY,CAC3B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,CAC/D,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,EAClI,YAAY,CAAC,OAAO,eAAe,CAAC;IACtC,iDAAiD;IACjD,IAAI,EAAE,KAAK,CAAC;IACZ,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qBAAqB;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAGhC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,iCAAiC;IACjC,SAAS,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,gCAAgC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,gCAAgC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,mCAAmC;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjC,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,qBAAqB;IACrB,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;CAC7E;AA+OD,eAAO,MAAM,OAAO,EAA+B,CACjD,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAE/D,KAAK,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;CAAE,KACtF,KAAK,CAAC,YAAY,CAAC"}
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
import { cn } from "../../utils/cn.js";
|
|
4
4
|
import { FormConfigContext } from "./context.js";
|
|
5
5
|
import { FieldLayout } from "./FieldLayout.js";
|
|
6
|
+
import { PasswordRevealToggle } from "./PasswordRevealToggle.js";
|
|
6
7
|
import { TextBoxPrimitive } from "../../primitives/textbox.js";
|
|
7
|
-
import { forwardRef, useContext, useEffect, useId } from "react";
|
|
8
|
+
import { forwardRef, useContext, useEffect, useId, useState } from "react";
|
|
8
9
|
import { cva } from "class-variance-authority";
|
|
9
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
11
|
import { useController, useFormContext } from "react-hook-form";
|
|
@@ -37,6 +38,7 @@ var textBoxVariants = cva("", {
|
|
|
37
38
|
* - Label, helper text, and error message support
|
|
38
39
|
* - Prefix/suffix elements
|
|
39
40
|
* - Clear button functionality
|
|
41
|
+
* - Built-in password reveal toggle when `type="password"`
|
|
40
42
|
*
|
|
41
43
|
* @example
|
|
42
44
|
* ```tsx
|
|
@@ -44,14 +46,18 @@ var textBoxVariants = cva("", {
|
|
|
44
46
|
* <Form onSubmit={handleSubmit} defaultValues={{ username: "", email: "" }}>
|
|
45
47
|
* <TextBox name="username" label="Username" required minLength={3} maxLength={50} />
|
|
46
48
|
* <TextBox name="email" label="Email" type="email" required email />
|
|
49
|
+
* <TextBox name="password" label="Password" type="password" required />
|
|
47
50
|
* <TextBox name="website" label="Website" url />
|
|
48
51
|
* <Button type="submit">Submit</Button>
|
|
49
52
|
* </Form>
|
|
50
53
|
* ```
|
|
51
54
|
*/
|
|
52
|
-
function TextBoxInner({ name, label, helperText, showError = true, error: customError, size, variant, fullWidth = true, className, disabled, prefix, suffix, allowClear, onClear, id: providedId, control: externalControl, required, minLength, maxLength, minValue, maxValue, pattern, email, url, validate, ...props }, ref) {
|
|
55
|
+
function TextBoxInner({ name, label, helperText, showError = true, error: customError, size, variant, fullWidth = true, className, disabled, prefix, suffix, allowClear, onClear, passwordToggle, id: providedId, control: externalControl, required, minLength, maxLength, minValue, maxValue, pattern, email, url, validate, ...props }, ref) {
|
|
53
56
|
const generatedId = useId();
|
|
54
57
|
const inputId = providedId ?? generatedId;
|
|
58
|
+
const [passwordVisible, setPasswordVisible] = useState(false);
|
|
59
|
+
const showPasswordToggle = props.type === "password" && passwordToggle !== false;
|
|
60
|
+
const resolvedType = showPasswordToggle && passwordVisible ? "text" : props.type;
|
|
55
61
|
const formConfigContext = useContext(FormConfigContext);
|
|
56
62
|
const formConfig = formConfigContext ?? {};
|
|
57
63
|
const rhfContext = useFormContext();
|
|
@@ -137,6 +143,7 @@ function TextBoxInner({ name, label, helperText, showError = true, error: custom
|
|
|
137
143
|
/* @__PURE__ */ jsx(TextBoxPrimitive, {
|
|
138
144
|
...props,
|
|
139
145
|
...field,
|
|
146
|
+
type: resolvedType,
|
|
140
147
|
ref: (node) => {
|
|
141
148
|
if (typeof ref === "function") ref(node);
|
|
142
149
|
else if (ref) ref.current = node;
|
|
@@ -149,21 +156,29 @@ function TextBoxInner({ name, label, helperText, showError = true, error: custom
|
|
|
149
156
|
className: cn(textBoxVariants({
|
|
150
157
|
size: effectiveSize,
|
|
151
158
|
variant: effectiveVariant
|
|
152
|
-
}), prefix && "pl-10", (suffix || allowClear) && "pr-10", className)
|
|
159
|
+
}), prefix && "pl-10", (suffix || allowClear || showPasswordToggle) && "pr-10", className)
|
|
153
160
|
}),
|
|
154
|
-
(suffix || allowClear && field.value) && /* @__PURE__ */ jsxs("div", {
|
|
161
|
+
(suffix || allowClear && field.value || showPasswordToggle) && /* @__PURE__ */ jsxs("div", {
|
|
155
162
|
className: "absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1",
|
|
156
|
-
children: [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
children: [
|
|
164
|
+
allowClear && field.value && /* @__PURE__ */ jsx("button", {
|
|
165
|
+
type: "button",
|
|
166
|
+
onClick: handleClear,
|
|
167
|
+
className: "text-muted-foreground hover:text-foreground transition-colors",
|
|
168
|
+
tabIndex: -1,
|
|
169
|
+
"aria-label": "Clear",
|
|
170
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
171
|
+
}),
|
|
172
|
+
showPasswordToggle && /* @__PURE__ */ jsx(PasswordRevealToggle, {
|
|
173
|
+
visible: passwordVisible,
|
|
174
|
+
onToggle: () => setPasswordVisible((visible) => !visible),
|
|
175
|
+
disabled: effectiveDisabled
|
|
176
|
+
}),
|
|
177
|
+
suffix && /* @__PURE__ */ jsx("span", {
|
|
178
|
+
className: "text-muted-foreground",
|
|
179
|
+
children: suffix
|
|
180
|
+
})
|
|
181
|
+
]
|
|
167
182
|
})
|
|
168
183
|
]
|
|
169
184
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextBox.js","names":[],"sources":["../../../src/components/Form/TextBox.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { forwardRef, useId, useContext, useEffect } from \"react\";\r\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\r\nimport { useController, useFormContext as useRHFFormContext, type FieldValues, type FieldPath, type Control } from \"react-hook-form\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { FormConfigContext, type FormConfig, type FieldValidationRules } from \"../Form/context\";\r\nimport { FieldLayout } from \"./FieldLayout\";\r\nimport { TextBoxPrimitive } from \"../../primitives/textbox\";\r\nimport { X } from \"lucide-react\";\r\n\r\nconst textBoxVariants = cva(\r\n \"\",\r\n {\r\n variants: {\r\n size: {\r\n sm: \"h-8 text-xs px-2\",\r\n md: \"h-10 text-sm px-3\",\r\n lg: \"h-12 text-base px-4\",\r\n },\r\n variant: {\r\n default: \"border-input focus-visible:ring-ring\",\r\n error: \"border-destructive focus-visible:ring-destructive\",\r\n success: \"border-green-500 focus-visible:ring-green-500\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n variant: \"default\",\r\n },\r\n }\r\n);\r\n\r\n/**\r\n * Validation rule with optional custom message\r\n */\r\ntype ValidationRule<T> = T | { value: T; message: string };\r\n\r\nexport interface TextBoxProps<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n> extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"name\" | \"prefix\" | \"pattern\" | \"required\" | \"minLength\" | \"maxLength\">,\r\n VariantProps<typeof textBoxVariants> {\r\n /** Field name - required for form integration */\r\n name: TName;\r\n /** Label text for the input */\r\n label?: string;\r\n /** Helper text displayed below the input */\r\n helperText?: string;\r\n /** Whether to show the error message */\r\n showError?: boolean;\r\n /** Custom error message (overrides form error) */\r\n error?: string;\r\n /** Whether the input should take full width */\r\n fullWidth?: boolean;\r\n /** Prefix element */\r\n prefix?: ReactNode;\r\n /** Suffix element */\r\n suffix?: ReactNode;\r\n /** Allow clear button */\r\n allowClear?: boolean;\r\n /** Callback when clear is clicked */\r\n onClear?: () => void;\r\n /** External control (for use outside Form) */\r\n control?: Control<TFieldValues>;\r\n \r\n // Validation props\r\n /** Field is required */\r\n required?: boolean | string;\r\n /** Minimum length for strings */\r\n minLength?: ValidationRule<number>;\r\n /** Maximum length for strings */\r\n maxLength?: ValidationRule<number>;\r\n /** Minimum value for numbers */\r\n minValue?: ValidationRule<number>;\r\n /** Maximum value for numbers */\r\n maxValue?: ValidationRule<number>;\r\n /** Regex pattern for validation */\r\n pattern?: ValidationRule<RegExp>;\r\n /** Email validation */\r\n email?: boolean | string;\r\n /** URL validation */\r\n url?: boolean | string;\r\n /** Custom validation function */\r\n validate?: (value: unknown) => boolean | string | Promise<boolean | string>;\r\n}\r\n\r\n/**\r\n * TextBox component with form integration and automatic validation registration\r\n * \r\n * This is a wrapper around the shadcn/ui Input primitive that adds:\r\n * - Form integration with react-hook-form\r\n * - Automatic validation registration\r\n * - Label, helper text, and error message support\r\n * - Prefix/suffix elements\r\n * - Clear button functionality\r\n * \r\n * @example\r\n * ```tsx\r\n * // Inside a Form component - validation is automatically registered\r\n * <Form onSubmit={handleSubmit} defaultValues={{ username: \"\", email: \"\" }}>\r\n * <TextBox name=\"username\" label=\"Username\" required minLength={3} maxLength={50} />\r\n * <TextBox name=\"email\" label=\"Email\" type=\"email\" required email />\r\n * <TextBox name=\"website\" label=\"Website\" url />\r\n * <Button type=\"submit\">Submit</Button>\r\n * </Form>\r\n * ```\r\n */\r\nfunction TextBoxInner<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>(\r\n {\r\n name,\r\n label,\r\n helperText,\r\n showError = true,\r\n error: customError,\r\n size,\r\n variant,\r\n fullWidth = true,\r\n className,\r\n disabled,\r\n prefix,\r\n suffix,\r\n allowClear,\r\n onClear,\r\n id: providedId,\r\n control: externalControl,\r\n // Validation props\r\n required,\r\n minLength,\r\n maxLength,\r\n minValue,\r\n maxValue,\r\n pattern,\r\n email,\r\n url,\r\n validate,\r\n ...props\r\n }: TextBoxProps<TFieldValues, TName>,\r\n ref: React.ForwardedRef<HTMLInputElement>\r\n) {\r\n const generatedId = useId();\r\n const inputId = providedId ?? generatedId;\r\n \r\n // Try to get form context\r\n const formConfigContext = useContext(FormConfigContext);\r\n const formConfig: FormConfig = formConfigContext ?? {};\r\n\r\n // Get form context from react-hook-form\r\n const rhfContext = useRHFFormContext<TFieldValues>();\r\n const control = externalControl ?? rhfContext?.control;\r\n\r\n // Destructure stable function references so the effect doesn't depend on the\r\n // context object identity (which changes every render due to inline construction).\r\n const registerFieldValidation = formConfigContext?.registerFieldValidation;\r\n const unregisterFieldValidation = formConfigContext?.unregisterFieldValidation;\r\n\r\n // Register validation rules with the form\r\n useEffect(() => {\r\n if (registerFieldValidation) {\r\n const rules: FieldValidationRules = {};\r\n\r\n if (required !== undefined) rules.required = required;\r\n if (minLength !== undefined) rules.minLength = minLength;\r\n if (maxLength !== undefined) rules.maxLength = maxLength;\r\n if (minValue !== undefined) rules.min = minValue;\r\n if (maxValue !== undefined) rules.max = maxValue;\r\n if (pattern !== undefined) rules.pattern = pattern;\r\n if (email !== undefined) rules.email = email;\r\n if (url !== undefined) rules.url = url;\r\n if (validate !== undefined) rules.validate = validate;\r\n\r\n // Determine field type and auto-infer rules from input type\r\n const inputType = props.type ?? \"text\";\r\n let fieldType: \"string\" | \"number\" | \"date\" = \"string\";\r\n\r\n if (inputType === \"number\") {\r\n fieldType = \"number\";\r\n } else if (inputType === \"date\") {\r\n fieldType = \"date\";\r\n } else if (inputType === \"email\" && rules.email === undefined) {\r\n rules.email = true;\r\n } else if (inputType === \"url\" && rules.url === undefined) {\r\n rules.url = true;\r\n } else if (inputType === \"tel\" && rules.pattern === undefined) {\r\n rules.pattern = { value: /^\\+?[\\d\\s\\-().]{7,}$/, message: \"Invalid phone number\" };\r\n }\r\n\r\n registerFieldValidation({\r\n name: name as string,\r\n type: fieldType,\r\n rules,\r\n });\r\n\r\n return () => {\r\n unregisterFieldValidation?.(name as string);\r\n };\r\n }\r\n }, [\r\n registerFieldValidation,\r\n unregisterFieldValidation,\r\n name,\r\n required,\r\n minLength,\r\n maxLength,\r\n minValue,\r\n maxValue,\r\n pattern,\r\n email,\r\n url,\r\n validate,\r\n props.type,\r\n ]);\r\n\r\n // Use controller for form integration\r\n const { field, fieldState } = useController<TFieldValues, TName>({\r\n name,\r\n control,\r\n });\r\n\r\n const fieldError = fieldState.error?.message;\r\n const errorMessage = customError ?? fieldError;\r\n const hasError = !!errorMessage;\r\n \r\n // Merge sizes - prop takes precedence over form config\r\n const effectiveSize = size ?? formConfig.size ?? \"md\";\r\n const effectiveDisabled = disabled ?? formConfig.disabled;\r\n \r\n // Determine variant based on error state\r\n const effectiveVariant = hasError ? \"error\" : variant;\r\n\r\n const handleClear = () => {\r\n field.onChange(\"\");\r\n onClear?.();\r\n };\r\n\r\n return (\r\n <FieldLayout\r\n inputId={inputId}\r\n label={label}\r\n required={!!required}\r\n helperText={helperText}\r\n errorMessage={showError ? errorMessage : undefined}\r\n showError={showError}\r\n fullWidth={fullWidth}\r\n formConfig={formConfig}\r\n >\r\n <div className=\"relative\">\r\n {prefix && (\r\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\r\n {prefix}\r\n </div>\r\n )}\r\n\r\n <TextBoxPrimitive\r\n {...props}\r\n {...field}\r\n ref={(node) => {\r\n if (typeof ref === \"function\") {\r\n ref(node);\r\n } else if (ref) {\r\n ref.current = node;\r\n }\r\n field.ref(node);\r\n }}\r\n id={inputId}\r\n disabled={effectiveDisabled}\r\n aria-invalid={hasError}\r\n aria-describedby={\r\n hasError\r\n ? `${inputId}-error`\r\n : helperText\r\n ? `${inputId}-helper`\r\n : undefined\r\n }\r\n className={cn(\r\n textBoxVariants({ size: effectiveSize, variant: effectiveVariant }),\r\n prefix && \"pl-10\",\r\n (suffix || allowClear) && \"pr-10\",\r\n className\r\n )}\r\n />\r\n\r\n {(suffix || (allowClear && field.value)) && (\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {allowClear && field.value && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\r\n tabIndex={-1}\r\n aria-label=\"Clear\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n {suffix && (\r\n <span className=\"text-muted-foreground\">{suffix}</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </FieldLayout>\r\n );\r\n}\r\n\r\n// Use forwardRef with generic support\r\nexport const TextBox = forwardRef(TextBoxInner) as <\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>(\r\n props: TextBoxProps<TFieldValues, TName> & { ref?: React.ForwardedRef<HTMLInputElement> }\r\n) => React.ReactElement;\r\n\r\n(TextBox as React.FC).displayName = \"TextBox\";\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextBox.js","names":[],"sources":["../../../src/components/Form/TextBox.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { forwardRef, useId, useContext, useEffect, useState } from \"react\";\r\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\r\nimport { useController, useFormContext as useRHFFormContext, type FieldValues, type FieldPath, type Control } from \"react-hook-form\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { FormConfigContext, type FormConfig, type FieldValidationRules } from \"../Form/context\";\r\nimport { FieldLayout } from \"./FieldLayout\";\r\nimport { PasswordRevealToggle } from \"./PasswordRevealToggle\";\r\nimport { TextBoxPrimitive } from \"../../primitives/textbox\";\r\nimport { X } from \"lucide-react\";\r\n\r\nconst textBoxVariants = cva(\r\n \"\",\r\n {\r\n variants: {\r\n size: {\r\n sm: \"h-8 text-xs px-2\",\r\n md: \"h-10 text-sm px-3\",\r\n lg: \"h-12 text-base px-4\",\r\n },\r\n variant: {\r\n default: \"border-input focus-visible:ring-ring\",\r\n error: \"border-destructive focus-visible:ring-destructive\",\r\n success: \"border-green-500 focus-visible:ring-green-500\",\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n variant: \"default\",\r\n },\r\n }\r\n);\r\n\r\n/**\r\n * Validation rule with optional custom message\r\n */\r\ntype ValidationRule<T> = T | { value: T; message: string };\r\n\r\nexport interface TextBoxProps<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n> extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"name\" | \"prefix\" | \"pattern\" | \"required\" | \"minLength\" | \"maxLength\">,\r\n VariantProps<typeof textBoxVariants> {\r\n /** Field name - required for form integration */\r\n name: TName;\r\n /** Label text for the input */\r\n label?: string;\r\n /** Helper text displayed below the input */\r\n helperText?: string;\r\n /** Whether to show the error message */\r\n showError?: boolean;\r\n /** Custom error message (overrides form error) */\r\n error?: string;\r\n /** Whether the input should take full width */\r\n fullWidth?: boolean;\r\n /** Prefix element */\r\n prefix?: ReactNode;\r\n /** Suffix element */\r\n suffix?: ReactNode;\r\n /** Allow clear button */\r\n allowClear?: boolean;\r\n /** Callback when clear is clicked */\r\n onClear?: () => void;\r\n /**\r\n * Show an eye toggle for password fields.\r\n * Defaults to true when `type=\"password\"`.\r\n */\r\n passwordToggle?: boolean;\r\n /** External control (for use outside Form) */\r\n control?: Control<TFieldValues>;\r\n \r\n // Validation props\r\n /** Field is required */\r\n required?: boolean | string;\r\n /** Minimum length for strings */\r\n minLength?: ValidationRule<number>;\r\n /** Maximum length for strings */\r\n maxLength?: ValidationRule<number>;\r\n /** Minimum value for numbers */\r\n minValue?: ValidationRule<number>;\r\n /** Maximum value for numbers */\r\n maxValue?: ValidationRule<number>;\r\n /** Regex pattern for validation */\r\n pattern?: ValidationRule<RegExp>;\r\n /** Email validation */\r\n email?: boolean | string;\r\n /** URL validation */\r\n url?: boolean | string;\r\n /** Custom validation function */\r\n validate?: (value: unknown) => boolean | string | Promise<boolean | string>;\r\n}\r\n\r\n/**\r\n * TextBox component with form integration and automatic validation registration\r\n * \r\n * This is a wrapper around the shadcn/ui Input primitive that adds:\r\n * - Form integration with react-hook-form\r\n * - Automatic validation registration\r\n * - Label, helper text, and error message support\r\n * - Prefix/suffix elements\r\n * - Clear button functionality\r\n * - Built-in password reveal toggle when `type=\"password\"`\r\n * \r\n * @example\r\n * ```tsx\r\n * // Inside a Form component - validation is automatically registered\r\n * <Form onSubmit={handleSubmit} defaultValues={{ username: \"\", email: \"\" }}>\r\n * <TextBox name=\"username\" label=\"Username\" required minLength={3} maxLength={50} />\r\n * <TextBox name=\"email\" label=\"Email\" type=\"email\" required email />\r\n * <TextBox name=\"password\" label=\"Password\" type=\"password\" required />\r\n * <TextBox name=\"website\" label=\"Website\" url />\r\n * <Button type=\"submit\">Submit</Button>\r\n * </Form>\r\n * ```\r\n */\r\nfunction TextBoxInner<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>(\r\n {\r\n name,\r\n label,\r\n helperText,\r\n showError = true,\r\n error: customError,\r\n size,\r\n variant,\r\n fullWidth = true,\r\n className,\r\n disabled,\r\n prefix,\r\n suffix,\r\n allowClear,\r\n onClear,\r\n passwordToggle,\r\n id: providedId,\r\n control: externalControl,\r\n // Validation props\r\n required,\r\n minLength,\r\n maxLength,\r\n minValue,\r\n maxValue,\r\n pattern,\r\n email,\r\n url,\r\n validate,\r\n ...props\r\n }: TextBoxProps<TFieldValues, TName>,\r\n ref: React.ForwardedRef<HTMLInputElement>\r\n) {\r\n const generatedId = useId();\r\n const inputId = providedId ?? generatedId;\r\n const [passwordVisible, setPasswordVisible] = useState(false);\r\n const isPasswordType = props.type === \"password\";\r\n const showPasswordToggle = isPasswordType && passwordToggle !== false;\r\n const resolvedType = showPasswordToggle && passwordVisible ? \"text\" : props.type;\r\n \r\n // Try to get form context\r\n const formConfigContext = useContext(FormConfigContext);\r\n const formConfig: FormConfig = formConfigContext ?? {};\r\n\r\n // Get form context from react-hook-form\r\n const rhfContext = useRHFFormContext<TFieldValues>();\r\n const control = externalControl ?? rhfContext?.control;\r\n\r\n // Destructure stable function references so the effect doesn't depend on the\r\n // context object identity (which changes every render due to inline construction).\r\n const registerFieldValidation = formConfigContext?.registerFieldValidation;\r\n const unregisterFieldValidation = formConfigContext?.unregisterFieldValidation;\r\n\r\n // Register validation rules with the form\r\n useEffect(() => {\r\n if (registerFieldValidation) {\r\n const rules: FieldValidationRules = {};\r\n\r\n if (required !== undefined) rules.required = required;\r\n if (minLength !== undefined) rules.minLength = minLength;\r\n if (maxLength !== undefined) rules.maxLength = maxLength;\r\n if (minValue !== undefined) rules.min = minValue;\r\n if (maxValue !== undefined) rules.max = maxValue;\r\n if (pattern !== undefined) rules.pattern = pattern;\r\n if (email !== undefined) rules.email = email;\r\n if (url !== undefined) rules.url = url;\r\n if (validate !== undefined) rules.validate = validate;\r\n\r\n // Determine field type and auto-infer rules from input type\r\n const inputType = props.type ?? \"text\";\r\n let fieldType: \"string\" | \"number\" | \"date\" = \"string\";\r\n\r\n if (inputType === \"number\") {\r\n fieldType = \"number\";\r\n } else if (inputType === \"date\") {\r\n fieldType = \"date\";\r\n } else if (inputType === \"email\" && rules.email === undefined) {\r\n rules.email = true;\r\n } else if (inputType === \"url\" && rules.url === undefined) {\r\n rules.url = true;\r\n } else if (inputType === \"tel\" && rules.pattern === undefined) {\r\n rules.pattern = { value: /^\\+?[\\d\\s\\-().]{7,}$/, message: \"Invalid phone number\" };\r\n }\r\n\r\n registerFieldValidation({\r\n name: name as string,\r\n type: fieldType,\r\n rules,\r\n });\r\n\r\n return () => {\r\n unregisterFieldValidation?.(name as string);\r\n };\r\n }\r\n }, [\r\n registerFieldValidation,\r\n unregisterFieldValidation,\r\n name,\r\n required,\r\n minLength,\r\n maxLength,\r\n minValue,\r\n maxValue,\r\n pattern,\r\n email,\r\n url,\r\n validate,\r\n props.type,\r\n ]);\r\n\r\n // Use controller for form integration\r\n const { field, fieldState } = useController<TFieldValues, TName>({\r\n name,\r\n control,\r\n });\r\n\r\n const fieldError = fieldState.error?.message;\r\n const errorMessage = customError ?? fieldError;\r\n const hasError = !!errorMessage;\r\n \r\n // Merge sizes - prop takes precedence over form config\r\n const effectiveSize = size ?? formConfig.size ?? \"md\";\r\n const effectiveDisabled = disabled ?? formConfig.disabled;\r\n \r\n // Determine variant based on error state\r\n const effectiveVariant = hasError ? \"error\" : variant;\r\n\r\n const handleClear = () => {\r\n field.onChange(\"\");\r\n onClear?.();\r\n };\r\n\r\n return (\r\n <FieldLayout\r\n inputId={inputId}\r\n label={label}\r\n required={!!required}\r\n helperText={helperText}\r\n errorMessage={showError ? errorMessage : undefined}\r\n showError={showError}\r\n fullWidth={fullWidth}\r\n formConfig={formConfig}\r\n >\r\n <div className=\"relative\">\r\n {prefix && (\r\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\">\r\n {prefix}\r\n </div>\r\n )}\r\n\r\n <TextBoxPrimitive\r\n {...props}\r\n {...field}\r\n type={resolvedType}\r\n ref={(node) => {\r\n if (typeof ref === \"function\") {\r\n ref(node);\r\n } else if (ref) {\r\n ref.current = node;\r\n }\r\n field.ref(node);\r\n }}\r\n id={inputId}\r\n disabled={effectiveDisabled}\r\n aria-invalid={hasError}\r\n aria-describedby={\r\n hasError\r\n ? `${inputId}-error`\r\n : helperText\r\n ? `${inputId}-helper`\r\n : undefined\r\n }\r\n className={cn(\r\n textBoxVariants({ size: effectiveSize, variant: effectiveVariant }),\r\n prefix && \"pl-10\",\r\n (suffix || allowClear || showPasswordToggle) && \"pr-10\",\r\n className\r\n )}\r\n />\r\n\r\n {(suffix || (allowClear && field.value) || showPasswordToggle) && (\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {allowClear && field.value && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"text-muted-foreground hover:text-foreground transition-colors\"\r\n tabIndex={-1}\r\n aria-label=\"Clear\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n {showPasswordToggle && (\r\n <PasswordRevealToggle\r\n visible={passwordVisible}\r\n onToggle={() => setPasswordVisible((visible) => !visible)}\r\n disabled={effectiveDisabled}\r\n />\r\n )}\r\n {suffix && (\r\n <span className=\"text-muted-foreground\">{suffix}</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </FieldLayout>\r\n );\r\n}\r\n\r\n// Use forwardRef with generic support\r\nexport const TextBox = forwardRef(TextBoxInner) as <\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>(\r\n props: TextBoxProps<TFieldValues, TName> & { ref?: React.ForwardedRef<HTMLInputElement> }\r\n) => React.ReactElement;\r\n\r\n(TextBox as React.FC).displayName = \"TextBox\";\r\n"],"mappings":";;;;;;;;;;;;;AAaA,IAAM,kBAAkB,IACtB,IACA;CACE,UAAU;EACR,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,SAAS;GACP,SAAS;GACT,OAAO;GACP,SAAS;EACX;CACF;CACA,iBAAiB;EACf,MAAM;EACN,SAAS;CACX;AACF,CACF;;;;;;;;;;;;;;;;;;;;;;;;AAoFA,SAAS,aAIP,EACE,MACA,OACA,YACA,YAAY,MACZ,OAAO,aACP,MACA,SACA,YAAY,MACZ,WACA,UACA,QACA,QACA,YACA,SACA,gBACA,IAAI,YACJ,SAAS,iBAET,UACA,WACA,WACA,UACA,UACA,SACA,OACA,KACA,UACA,GAAG,SAEL,KACA;CACA,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,cAAc;CAC9B,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,KAAK;CAE5D,MAAM,qBADiB,MAAM,SAAS,cACO,mBAAmB;CAChE,MAAM,eAAe,sBAAsB,kBAAkB,SAAS,MAAM;CAG5E,MAAM,oBAAoB,WAAW,iBAAiB;CACtD,MAAM,aAAyB,qBAAqB,CAAC;CAGrD,MAAM,aAAa,eAAgC;CACnD,MAAM,UAAU,mBAAmB,YAAY;CAI/C,MAAM,0BAA0B,mBAAmB;CACnD,MAAM,4BAA4B,mBAAmB;CAGrD,gBAAgB;EACd,IAAI,yBAAyB;GAC3B,MAAM,QAA8B,CAAC;GAErC,IAAI,aAAa,KAAA,GAAW,MAAM,WAAW;GAC7C,IAAI,cAAc,KAAA,GAAW,MAAM,YAAY;GAC/C,IAAI,cAAc,KAAA,GAAW,MAAM,YAAY;GAC/C,IAAI,aAAa,KAAA,GAAW,MAAM,MAAM;GACxC,IAAI,aAAa,KAAA,GAAW,MAAM,MAAM;GACxC,IAAI,YAAY,KAAA,GAAW,MAAM,UAAU;GAC3C,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ;GACvC,IAAI,QAAQ,KAAA,GAAW,MAAM,MAAM;GACnC,IAAI,aAAa,KAAA,GAAW,MAAM,WAAW;GAG7C,MAAM,YAAY,MAAM,QAAQ;GAChC,IAAI,YAA0C;GAE9C,IAAI,cAAc,UAChB,YAAY;QACP,IAAI,cAAc,QACvB,YAAY;QACP,IAAI,cAAc,WAAW,MAAM,UAAU,KAAA,GAClD,MAAM,QAAQ;QACT,IAAI,cAAc,SAAS,MAAM,QAAQ,KAAA,GAC9C,MAAM,MAAM;QACP,IAAI,cAAc,SAAS,MAAM,YAAY,KAAA,GAClD,MAAM,UAAU;IAAE,OAAO;IAAwB,SAAS;GAAuB;GAGnF,wBAAwB;IAChB;IACN,MAAM;IACN;GACF,CAAC;GAED,aAAa;IACX,4BAA4B,IAAc;GAC5C;EACF;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM;CACR,CAAC;CAGD,MAAM,EAAE,OAAO,eAAe,cAAmC;EAC/D;EACA;CACF,CAAC;CAED,MAAM,aAAa,WAAW,OAAO;CACrC,MAAM,eAAe,eAAe;CACpC,MAAM,WAAW,CAAC,CAAC;CAGnB,MAAM,gBAAgB,QAAQ,WAAW,QAAQ;CACjD,MAAM,oBAAoB,YAAY,WAAW;CAGjD,MAAM,mBAAmB,WAAW,UAAU;CAE9C,MAAM,oBAAoB;EACxB,MAAM,SAAS,EAAE;EACjB,UAAU;CACZ;CAEA,OACE,oBAAC,aAAD;EACW;EACF;EACP,UAAU,CAAC,CAAC;EACA;EACZ,cAAc,YAAY,eAAe,KAAA;EAC9B;EACA;EACC;EAEZ,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG,UACC,oBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;IACE,CAAA;IAGP,oBAAC,kBAAD;KACE,GAAI;KACJ,GAAI;KACJ,MAAM;KACN,MAAM,SAAS;MACb,IAAI,OAAO,QAAQ,YACjB,IAAI,IAAI;WACH,IAAI,KACT,IAAI,UAAU;MAEhB,MAAM,IAAI,IAAI;KAChB;KACA,IAAI;KACJ,UAAU;KACV,gBAAc;KACd,oBACE,WACI,GAAG,QAAQ,UACX,aACE,GAAG,QAAQ,WACX,KAAA;KAER,WAAW,GACT,gBAAgB;MAAE,MAAM;MAAe,SAAS;KAAiB,CAAC,GAClE,UAAU,UACT,UAAU,cAAc,uBAAuB,SAChD,SACF;IACD,CAAA;KAEC,UAAW,cAAc,MAAM,SAAU,uBACzC,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACG,cAAc,MAAM,SACnB,oBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;OACV,UAAU;OACV,cAAW;OAEX,UAAA,oBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;MAClB,CAAA;MAET,sBACC,oBAAC,sBAAD;OACE,SAAS;OACT,gBAAgB,oBAAoB,YAAY,CAAC,OAAO;OACxD,UAAU;MACX,CAAA;MAEF,UACC,oBAAC,QAAD;OAAM,WAAU;OAAyB,UAAA;MAAa,CAAA;KAErD;;GAEJ;;CACM,CAAA;AAEjB;AAGA,IAAa,UAAU,WAAW,YAAY;AAO9C,QAAsB,cAAc"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type DayPeriod = "AM" | "PM";
|
|
2
|
+
export interface TimePickerProps {
|
|
3
|
+
value?: Date;
|
|
4
|
+
onChange: (date: Date) => void;
|
|
5
|
+
onClear?: () => void;
|
|
6
|
+
minuteStep?: number;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function TimePicker({ value, onChange, onClear, minuteStep, disabled, className, }: TimePickerProps): import("react").JSX.Element;
|
|
11
|
+
export declare namespace TimePicker {
|
|
12
|
+
var displayName: string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=TimePicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/Form/TimePicker.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,UAAc,EACd,QAAQ,EACR,SAAS,GACV,EAAE,eAAe,+BAoFjB;yBA3Fe,UAAU"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../../utils/cn.js";
|
|
4
|
+
import { Button } from "../../primitives/button.js";
|
|
5
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../primitives/select.js";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { setHours, setMinutes, startOfDay } from "date-fns";
|
|
8
|
+
//#region src/components/Form/TimePicker.tsx
|
|
9
|
+
function getHour12(date) {
|
|
10
|
+
const hour = date.getHours() % 12;
|
|
11
|
+
return hour === 0 ? 12 : hour;
|
|
12
|
+
}
|
|
13
|
+
function getPeriod(date) {
|
|
14
|
+
return date.getHours() >= 12 ? "PM" : "AM";
|
|
15
|
+
}
|
|
16
|
+
function toHours24(hour12, period) {
|
|
17
|
+
const hour = hour12 % 12;
|
|
18
|
+
return period === "PM" ? hour + 12 : hour;
|
|
19
|
+
}
|
|
20
|
+
function applyTime(base, hour12, minute, period) {
|
|
21
|
+
const next = base ? new Date(base) : startOfDay(/* @__PURE__ */ new Date());
|
|
22
|
+
return setMinutes(setHours(next, toHours24(hour12, period)), minute);
|
|
23
|
+
}
|
|
24
|
+
function minuteOptions(minuteStep, currentMinute) {
|
|
25
|
+
const steps = [];
|
|
26
|
+
for (let minute = 0; minute < 60; minute += minuteStep) steps.push(minute);
|
|
27
|
+
if (currentMinute !== void 0 && !steps.includes(currentMinute)) return [...steps, currentMinute].sort((a, b) => a - b);
|
|
28
|
+
return steps;
|
|
29
|
+
}
|
|
30
|
+
function TimePicker({ value, onChange, onClear, minuteStep = 5, disabled, className }) {
|
|
31
|
+
const hour = value ? getHour12(value) : void 0;
|
|
32
|
+
const minute = value ? value.getMinutes() : void 0;
|
|
33
|
+
const period = value ? getPeriod(value) : void 0;
|
|
34
|
+
const minutes = minuteOptions(minuteStep, minute);
|
|
35
|
+
const commit = (nextHour, nextMinute, nextPeriod) => {
|
|
36
|
+
onChange(applyTime(value, nextHour, nextMinute, nextPeriod));
|
|
37
|
+
};
|
|
38
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
39
|
+
className: cn("flex flex-col gap-2", className),
|
|
40
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
41
|
+
className: "flex items-center gap-2",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ jsxs(Select, {
|
|
44
|
+
value: hour !== void 0 ? String(hour) : void 0,
|
|
45
|
+
onValueChange: (next) => {
|
|
46
|
+
commit(Number(next), minute ?? 0, period ?? "AM");
|
|
47
|
+
},
|
|
48
|
+
disabled,
|
|
49
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
50
|
+
"aria-label": "Hour",
|
|
51
|
+
className: "h-8 w-[4.5rem] text-xs",
|
|
52
|
+
children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "HH" })
|
|
53
|
+
}), /* @__PURE__ */ jsx(SelectContent, { children: Array.from({ length: 12 }, (_, index) => index + 1).map((option) => /* @__PURE__ */ jsx(SelectItem, {
|
|
54
|
+
value: String(option),
|
|
55
|
+
children: option
|
|
56
|
+
}, option)) })]
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ jsx("span", {
|
|
59
|
+
className: "text-muted-foreground text-sm",
|
|
60
|
+
children: ":"
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ jsxs(Select, {
|
|
63
|
+
value: minute !== void 0 ? String(minute) : void 0,
|
|
64
|
+
onValueChange: (next) => {
|
|
65
|
+
commit(hour ?? 12, Number(next), period ?? "AM");
|
|
66
|
+
},
|
|
67
|
+
disabled,
|
|
68
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
69
|
+
"aria-label": "Minute",
|
|
70
|
+
className: "h-8 w-[4.5rem] text-xs",
|
|
71
|
+
children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "MM" })
|
|
72
|
+
}), /* @__PURE__ */ jsx(SelectContent, { children: minutes.map((option) => /* @__PURE__ */ jsx(SelectItem, {
|
|
73
|
+
value: String(option),
|
|
74
|
+
children: String(option).padStart(2, "0")
|
|
75
|
+
}, option)) })]
|
|
76
|
+
}),
|
|
77
|
+
/* @__PURE__ */ jsxs(Select, {
|
|
78
|
+
value: period,
|
|
79
|
+
onValueChange: (next) => {
|
|
80
|
+
commit(hour ?? 12, minute ?? 0, next);
|
|
81
|
+
},
|
|
82
|
+
disabled,
|
|
83
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
84
|
+
"aria-label": "AM or PM",
|
|
85
|
+
className: "h-8 w-[4.75rem] text-xs",
|
|
86
|
+
children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "AM" })
|
|
87
|
+
}), /* @__PURE__ */ jsxs(SelectContent, { children: [/* @__PURE__ */ jsx(SelectItem, {
|
|
88
|
+
value: "AM",
|
|
89
|
+
children: "AM"
|
|
90
|
+
}), /* @__PURE__ */ jsx(SelectItem, {
|
|
91
|
+
value: "PM",
|
|
92
|
+
children: "PM"
|
|
93
|
+
})] })]
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
}), onClear && value ? /* @__PURE__ */ jsx(Button, {
|
|
97
|
+
type: "button",
|
|
98
|
+
variant: "link",
|
|
99
|
+
size: "sm",
|
|
100
|
+
disabled,
|
|
101
|
+
className: "h-auto self-start px-0",
|
|
102
|
+
onClick: onClear,
|
|
103
|
+
children: "Clear time"
|
|
104
|
+
}) : null]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
TimePicker.displayName = "TimePicker";
|
|
108
|
+
//#endregion
|
|
109
|
+
export { TimePicker };
|
|
110
|
+
|
|
111
|
+
//# sourceMappingURL=TimePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.js","names":[],"sources":["../../../src/components/Form/TimePicker.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { setHours, setMinutes, startOfDay } from \"date-fns\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Button } from \"../../primitives/button\";\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"../../primitives/select\";\r\n\r\nexport type DayPeriod = \"AM\" | \"PM\";\r\n\r\nexport interface TimePickerProps {\r\n value?: Date;\r\n onChange: (date: Date) => void;\r\n onClear?: () => void;\r\n minuteStep?: number;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\n\r\nfunction getHour12(date: Date): number {\r\n const hour = date.getHours() % 12;\r\n return hour === 0 ? 12 : hour;\r\n}\r\n\r\nfunction getPeriod(date: Date): DayPeriod {\r\n return date.getHours() >= 12 ? \"PM\" : \"AM\";\r\n}\r\n\r\nfunction toHours24(hour12: number, period: DayPeriod): number {\r\n const hour = hour12 % 12;\r\n return period === \"PM\" ? hour + 12 : hour;\r\n}\r\n\r\nfunction applyTime(\r\n base: Date | undefined,\r\n hour12: number,\r\n minute: number,\r\n period: DayPeriod\r\n): Date {\r\n const next = base ? new Date(base) : startOfDay(new Date());\r\n return setMinutes(setHours(next, toHours24(hour12, period)), minute);\r\n}\r\n\r\nfunction minuteOptions(minuteStep: number, currentMinute?: number): number[] {\r\n const steps: number[] = [];\r\n for (let minute = 0; minute < 60; minute += minuteStep) {\r\n steps.push(minute);\r\n }\r\n\r\n if (currentMinute !== undefined && !steps.includes(currentMinute)) {\r\n return [...steps, currentMinute].sort((a, b) => a - b);\r\n }\r\n\r\n return steps;\r\n}\r\n\r\nexport function TimePicker({\r\n value,\r\n onChange,\r\n onClear,\r\n minuteStep = 5,\r\n disabled,\r\n className,\r\n}: TimePickerProps) {\r\n const hour = value ? getHour12(value) : undefined;\r\n const minute = value ? value.getMinutes() : undefined;\r\n const period = value ? getPeriod(value) : undefined;\r\n const minutes = minuteOptions(minuteStep, minute);\r\n\r\n const commit = (nextHour: number, nextMinute: number, nextPeriod: DayPeriod) => {\r\n onChange(applyTime(value, nextHour, nextMinute, nextPeriod));\r\n };\r\n\r\n return (\r\n <div className={cn(\"flex flex-col gap-2\", className)}>\r\n <div className=\"flex items-center gap-2\">\r\n <Select\r\n value={hour !== undefined ? String(hour) : undefined}\r\n onValueChange={(next) => {\r\n commit(Number(next), minute ?? 0, period ?? \"AM\");\r\n }}\r\n disabled={disabled}\r\n >\r\n <SelectTrigger aria-label=\"Hour\" className=\"h-8 w-[4.5rem] text-xs\">\r\n <SelectValue placeholder=\"HH\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {Array.from({ length: 12 }, (_, index) => index + 1).map((option) => (\r\n <SelectItem key={option} value={String(option)}>\r\n {option}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n\r\n <span className=\"text-muted-foreground text-sm\">:</span>\r\n\r\n <Select\r\n value={minute !== undefined ? String(minute) : undefined}\r\n onValueChange={(next) => {\r\n commit(hour ?? 12, Number(next), period ?? \"AM\");\r\n }}\r\n disabled={disabled}\r\n >\r\n <SelectTrigger aria-label=\"Minute\" className=\"h-8 w-[4.5rem] text-xs\">\r\n <SelectValue placeholder=\"MM\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {minutes.map((option) => (\r\n <SelectItem key={option} value={String(option)}>\r\n {String(option).padStart(2, \"0\")}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n\r\n <Select\r\n value={period}\r\n onValueChange={(next) => {\r\n commit(hour ?? 12, minute ?? 0, next as DayPeriod);\r\n }}\r\n disabled={disabled}\r\n >\r\n <SelectTrigger aria-label=\"AM or PM\" className=\"h-8 w-[4.75rem] text-xs\">\r\n <SelectValue placeholder=\"AM\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"AM\">AM</SelectItem>\r\n <SelectItem value=\"PM\">PM</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n {onClear && value ? (\r\n <Button\r\n type=\"button\"\r\n variant=\"link\"\r\n size=\"sm\"\r\n disabled={disabled}\r\n className=\"h-auto self-start px-0\"\r\n onClick={onClear}\r\n >\r\n Clear time\r\n </Button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nTimePicker.displayName = \"TimePicker\";\r\n"],"mappings":"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"}
|
|
@@ -64,7 +64,7 @@ export interface FormConfig {
|
|
|
64
64
|
*/
|
|
65
65
|
export interface FieldRegistration {
|
|
66
66
|
name: string;
|
|
67
|
-
type: "string" | "number" | "boolean" | "date" | "array";
|
|
67
|
+
type: "string" | "number" | "boolean" | "date" | "datetime" | "array";
|
|
68
68
|
rules: FieldValidationRules;
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/Form/context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,uBAAuB;IACvB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,qBAAqB;IACrB,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uBAAuB;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,uBAAuB;IACvB,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC9C,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/Form/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ function buildZodSchemaFromRules(type, rules) {
|
|
|
72
72
|
if (rules.required) return finalizeSchema(schema.refine((val) => val === true, { message: typeof rules.required === "string" ? rules.required : "This field is required" }), rules);
|
|
73
73
|
return finalizeSchema(schema.optional(), rules);
|
|
74
74
|
}
|
|
75
|
-
if (type === "date") {
|
|
75
|
+
if (type === "date" || type === "datetime") {
|
|
76
76
|
const schema = z.coerce.date();
|
|
77
77
|
if (!rules.required) return finalizeSchema(schema.optional(), rules);
|
|
78
78
|
return finalizeSchema(schema, rules);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/Form/context.ts"],"sourcesContent":["'use client';\r\n\r\nimport { createContext, useCallback, useRef } from \"react\";\r\nimport type { UseFormReturn, FieldValues } from \"react-hook-form\";\r\nimport { z } from \"zod\";\r\n\r\n/**\r\n * Validation rule types that can be applied to form fields\r\n */\r\nexport interface FieldValidationRules {\r\n /** Field is required */\r\n required?: boolean | string;\r\n /** Minimum length for strings */\r\n minLength?: number | { value: number; message: string };\r\n /** Maximum length for strings */\r\n maxLength?: number | { value: number; message: string };\r\n /** Minimum value for numbers */\r\n min?: number | { value: number; message: string };\r\n /** Maximum value for numbers */\r\n max?: number | { value: number; message: string };\r\n /** Regex pattern for validation */\r\n pattern?: RegExp | { value: RegExp; message: string };\r\n /** Email validation */\r\n email?: boolean | string;\r\n /** URL validation */\r\n url?: boolean | string;\r\n /** Custom validation function */\r\n validate?: (value: unknown) => boolean | string | Promise<boolean | string>;\r\n}\r\n\r\n/**\r\n * Form configuration options\r\n */\r\nexport interface FormConfig {\r\n /** Show validation errors inline */\r\n showInlineErrors?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Size of form controls */\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n /** Layout direction */\r\n layout?: \"horizontal\" | \"vertical\" | \"inline\";\r\n /** Label width for horizontal layout */\r\n labelWidth?: string | number;\r\n /** Whether form is disabled */\r\n disabled?: boolean;\r\n /** Colon after label */\r\n colon?: boolean;\r\n}\r\n\r\n/**\r\n * Field registration info\r\n */\r\nexport interface FieldRegistration {\r\n name: string;\r\n type: \"string\" | \"number\" | \"boolean\" | \"date\" | \"array\";\r\n rules: FieldValidationRules;\r\n}\r\n\r\n/**\r\n * Form context value\r\n */\r\nexport interface FormContextValue<TFieldValues extends FieldValues = FieldValues>\r\n extends FormConfig {\r\n form: UseFormReturn<TFieldValues>;\r\n /** Register a field's validation rules */\r\n registerFieldValidation: (field: FieldRegistration) => void;\r\n /** Unregister a field's validation rules */\r\n unregisterFieldValidation: (name: string) => void;\r\n /** Get current validation schema */\r\n getValidationSchema: () => z.ZodObject<Record<string, z.ZodTypeAny>>;\r\n /** Trigger validation for a specific field */\r\n triggerValidation: (name: string) => Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Default form configuration\r\n */\r\nexport const defaultFormConfig: FormConfig = {\r\n showInlineErrors: true,\r\n validateOnBlur: true,\r\n validateOnChange: false,\r\n size: \"md\",\r\n layout: \"vertical\",\r\n disabled: false,\r\n colon: true,\r\n};\r\n\r\n/**\r\n * Form context for sharing form state and configuration\r\n */\r\nexport const FormConfigContext = createContext<FormContextValue | null>(null);\r\n\r\n/**\r\n * Build a Zod schema from validation rules\r\n */\r\nexport function buildZodSchemaFromRules(\r\n type: FieldRegistration[\"type\"],\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n // Helper to extract value and message\r\n const getValueAndMessage = <T>(\r\n rule: T | { value: T; message: string } | undefined,\r\n defaultMessage: string\r\n ): { value: T; message: string } | null => {\r\n if (rule === undefined) return null;\r\n if (typeof rule === \"object\" && rule !== null && \"value\" in rule) {\r\n return rule as { value: T; message: string };\r\n }\r\n return { value: rule as T, message: defaultMessage };\r\n };\r\n\r\n // Build string schema\r\n if (type === \"string\") {\r\n let schema = z.string();\r\n\r\n const minLengthRule = getValueAndMessage(\r\n rules.minLength,\r\n `Minimum ${typeof rules.minLength === \"number\" ? rules.minLength : (rules.minLength as { value: number })?.value} characters required`\r\n );\r\n if (minLengthRule) {\r\n schema = schema.min(minLengthRule.value as number, minLengthRule.message);\r\n }\r\n\r\n const maxLengthRule = getValueAndMessage(\r\n rules.maxLength,\r\n `Maximum ${typeof rules.maxLength === \"number\" ? rules.maxLength : (rules.maxLength as { value: number })?.value} characters allowed`\r\n );\r\n if (maxLengthRule) {\r\n schema = schema.max(maxLengthRule.value as number, maxLengthRule.message);\r\n }\r\n\r\n if (rules.pattern !== undefined) {\r\n const patternRule = rules.pattern instanceof RegExp\r\n ? { value: rules.pattern, message: \"Invalid format\" }\r\n : rules.pattern;\r\n schema = schema.regex(patternRule.value, patternRule.message);\r\n }\r\n\r\n if (rules.email) {\r\n const message = typeof rules.email === \"string\" ? rules.email : \"Invalid email address\";\r\n schema = schema.email(message);\r\n }\r\n\r\n if (rules.url) {\r\n const message = typeof rules.url === \"string\" ? rules.url : \"Invalid URL\";\r\n schema = schema.url(message);\r\n }\r\n\r\n // Handle required - for strings, require non-empty\r\n if (rules.required) {\r\n const message = typeof rules.required === \"string\" ? rules.required : \"This field is required\";\r\n return finalizeSchema(\r\n z.preprocess(\r\n (value) => (value === undefined || value === null ? \"\" : value),\r\n schema.min(1, message)\r\n ),\r\n rules\r\n );\r\n }\r\n\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n\r\n // Build number schema\r\n if (type === \"number\") {\r\n let schema = z.coerce.number();\r\n\r\n const minRule = getValueAndMessage(\r\n rules.min,\r\n `Minimum value is ${typeof rules.min === \"number\" ? rules.min : (rules.min as { value: number })?.value}`\r\n );\r\n if (minRule) {\r\n schema = schema.min(minRule.value as number, minRule.message);\r\n }\r\n\r\n const maxRule = getValueAndMessage(\r\n rules.max,\r\n `Maximum value is ${typeof rules.max === \"number\" ? rules.max : (rules.max as { value: number })?.value}`\r\n );\r\n if (maxRule) {\r\n schema = schema.max(maxRule.value as number, maxRule.message);\r\n }\r\n\r\n if (!rules.required) {\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Build boolean schema\r\n if (type === \"boolean\") {\r\n const schema = z.boolean();\r\n if (rules.required) {\r\n return finalizeSchema(\r\n schema.refine((val) => val === true, {\r\n message: typeof rules.required === \"string\" ? rules.required : \"This field is required\",\r\n }),\r\n rules\r\n );\r\n }\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n\r\n // Build date schema\r\n if (type === \"date\") {\r\n const schema = z.coerce.date();\r\n if (!rules.required) {\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Build array schema\r\n if (type === \"array\") {\r\n let schema = z.array(z.unknown());\r\n if (rules.required) {\r\n const message = typeof rules.required === \"string\" ? rules.required : \"This field is required\";\r\n schema = schema.min(1, message);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Default fallback\r\n return finalizeSchema(z.unknown(), rules);\r\n}\r\n\r\nfunction applyCustomValidate(\r\n schema: z.ZodTypeAny,\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n if (!rules.validate) {\r\n return schema;\r\n }\r\n\r\n const validateFn = rules.validate;\r\n\r\n return schema.superRefine(async (value, ctx) => {\r\n const result = await validateFn(value);\r\n\r\n if (result === true) {\r\n return;\r\n }\r\n\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: typeof result === \"string\" ? result : \"Invalid value\",\r\n });\r\n });\r\n}\r\n\r\nfunction finalizeSchema(\r\n schema: z.ZodTypeAny,\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n return applyCustomValidate(schema, rules);\r\n}\r\n\r\n/**\r\n * Hook to manage field validations\r\n */\r\nexport function useFieldValidationRegistry() {\r\n const fieldsRef = useRef<Map<string, FieldRegistration>>(new Map());\r\n\r\n const registerFieldValidation = useCallback((field: FieldRegistration) => {\r\n fieldsRef.current.set(field.name, field);\r\n }, []);\r\n\r\n const unregisterFieldValidation = useCallback((name: string) => {\r\n fieldsRef.current.delete(name);\r\n }, []);\r\n\r\n const getValidationSchema = useCallback(() => {\r\n const shape: Record<string, z.ZodTypeAny> = {};\r\n \r\n fieldsRef.current.forEach((field) => {\r\n shape[field.name] = buildZodSchemaFromRules(field.type, field.rules);\r\n });\r\n\r\n return z.object(shape);\r\n }, []);\r\n\r\n return {\r\n registerFieldValidation,\r\n unregisterFieldValidation,\r\n getValidationSchema,\r\n fieldsRef,\r\n };\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../src/components/Form/context.ts"],"sourcesContent":["'use client';\r\n\r\nimport { createContext, useCallback, useRef } from \"react\";\r\nimport type { UseFormReturn, FieldValues } from \"react-hook-form\";\r\nimport { z } from \"zod\";\r\n\r\n/**\r\n * Validation rule types that can be applied to form fields\r\n */\r\nexport interface FieldValidationRules {\r\n /** Field is required */\r\n required?: boolean | string;\r\n /** Minimum length for strings */\r\n minLength?: number | { value: number; message: string };\r\n /** Maximum length for strings */\r\n maxLength?: number | { value: number; message: string };\r\n /** Minimum value for numbers */\r\n min?: number | { value: number; message: string };\r\n /** Maximum value for numbers */\r\n max?: number | { value: number; message: string };\r\n /** Regex pattern for validation */\r\n pattern?: RegExp | { value: RegExp; message: string };\r\n /** Email validation */\r\n email?: boolean | string;\r\n /** URL validation */\r\n url?: boolean | string;\r\n /** Custom validation function */\r\n validate?: (value: unknown) => boolean | string | Promise<boolean | string>;\r\n}\r\n\r\n/**\r\n * Form configuration options\r\n */\r\nexport interface FormConfig {\r\n /** Show validation errors inline */\r\n showInlineErrors?: boolean;\r\n /** Validate on blur */\r\n validateOnBlur?: boolean;\r\n /** Validate on change */\r\n validateOnChange?: boolean;\r\n /** Size of form controls */\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n /** Layout direction */\r\n layout?: \"horizontal\" | \"vertical\" | \"inline\";\r\n /** Label width for horizontal layout */\r\n labelWidth?: string | number;\r\n /** Whether form is disabled */\r\n disabled?: boolean;\r\n /** Colon after label */\r\n colon?: boolean;\r\n}\r\n\r\n/**\r\n * Field registration info\r\n */\r\nexport interface FieldRegistration {\r\n name: string;\r\n type: \"string\" | \"number\" | \"boolean\" | \"date\" | \"datetime\" | \"array\";\r\n rules: FieldValidationRules;\r\n}\r\n\r\n/**\r\n * Form context value\r\n */\r\nexport interface FormContextValue<TFieldValues extends FieldValues = FieldValues>\r\n extends FormConfig {\r\n form: UseFormReturn<TFieldValues>;\r\n /** Register a field's validation rules */\r\n registerFieldValidation: (field: FieldRegistration) => void;\r\n /** Unregister a field's validation rules */\r\n unregisterFieldValidation: (name: string) => void;\r\n /** Get current validation schema */\r\n getValidationSchema: () => z.ZodObject<Record<string, z.ZodTypeAny>>;\r\n /** Trigger validation for a specific field */\r\n triggerValidation: (name: string) => Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Default form configuration\r\n */\r\nexport const defaultFormConfig: FormConfig = {\r\n showInlineErrors: true,\r\n validateOnBlur: true,\r\n validateOnChange: false,\r\n size: \"md\",\r\n layout: \"vertical\",\r\n disabled: false,\r\n colon: true,\r\n};\r\n\r\n/**\r\n * Form context for sharing form state and configuration\r\n */\r\nexport const FormConfigContext = createContext<FormContextValue | null>(null);\r\n\r\n/**\r\n * Build a Zod schema from validation rules\r\n */\r\nexport function buildZodSchemaFromRules(\r\n type: FieldRegistration[\"type\"],\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n // Helper to extract value and message\r\n const getValueAndMessage = <T>(\r\n rule: T | { value: T; message: string } | undefined,\r\n defaultMessage: string\r\n ): { value: T; message: string } | null => {\r\n if (rule === undefined) return null;\r\n if (typeof rule === \"object\" && rule !== null && \"value\" in rule) {\r\n return rule as { value: T; message: string };\r\n }\r\n return { value: rule as T, message: defaultMessage };\r\n };\r\n\r\n // Build string schema\r\n if (type === \"string\") {\r\n let schema = z.string();\r\n\r\n const minLengthRule = getValueAndMessage(\r\n rules.minLength,\r\n `Minimum ${typeof rules.minLength === \"number\" ? rules.minLength : (rules.minLength as { value: number })?.value} characters required`\r\n );\r\n if (minLengthRule) {\r\n schema = schema.min(minLengthRule.value as number, minLengthRule.message);\r\n }\r\n\r\n const maxLengthRule = getValueAndMessage(\r\n rules.maxLength,\r\n `Maximum ${typeof rules.maxLength === \"number\" ? rules.maxLength : (rules.maxLength as { value: number })?.value} characters allowed`\r\n );\r\n if (maxLengthRule) {\r\n schema = schema.max(maxLengthRule.value as number, maxLengthRule.message);\r\n }\r\n\r\n if (rules.pattern !== undefined) {\r\n const patternRule = rules.pattern instanceof RegExp\r\n ? { value: rules.pattern, message: \"Invalid format\" }\r\n : rules.pattern;\r\n schema = schema.regex(patternRule.value, patternRule.message);\r\n }\r\n\r\n if (rules.email) {\r\n const message = typeof rules.email === \"string\" ? rules.email : \"Invalid email address\";\r\n schema = schema.email(message);\r\n }\r\n\r\n if (rules.url) {\r\n const message = typeof rules.url === \"string\" ? rules.url : \"Invalid URL\";\r\n schema = schema.url(message);\r\n }\r\n\r\n // Handle required - for strings, require non-empty\r\n if (rules.required) {\r\n const message = typeof rules.required === \"string\" ? rules.required : \"This field is required\";\r\n return finalizeSchema(\r\n z.preprocess(\r\n (value) => (value === undefined || value === null ? \"\" : value),\r\n schema.min(1, message)\r\n ),\r\n rules\r\n );\r\n }\r\n\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n\r\n // Build number schema\r\n if (type === \"number\") {\r\n let schema = z.coerce.number();\r\n\r\n const minRule = getValueAndMessage(\r\n rules.min,\r\n `Minimum value is ${typeof rules.min === \"number\" ? rules.min : (rules.min as { value: number })?.value}`\r\n );\r\n if (minRule) {\r\n schema = schema.min(minRule.value as number, minRule.message);\r\n }\r\n\r\n const maxRule = getValueAndMessage(\r\n rules.max,\r\n `Maximum value is ${typeof rules.max === \"number\" ? rules.max : (rules.max as { value: number })?.value}`\r\n );\r\n if (maxRule) {\r\n schema = schema.max(maxRule.value as number, maxRule.message);\r\n }\r\n\r\n if (!rules.required) {\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Build boolean schema\r\n if (type === \"boolean\") {\r\n const schema = z.boolean();\r\n if (rules.required) {\r\n return finalizeSchema(\r\n schema.refine((val) => val === true, {\r\n message: typeof rules.required === \"string\" ? rules.required : \"This field is required\",\r\n }),\r\n rules\r\n );\r\n }\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n\r\n // Build date / datetime schema\r\n if (type === \"date\" || type === \"datetime\") {\r\n const schema = z.coerce.date();\r\n if (!rules.required) {\r\n return finalizeSchema(schema.optional(), rules);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Build array schema\r\n if (type === \"array\") {\r\n let schema = z.array(z.unknown());\r\n if (rules.required) {\r\n const message = typeof rules.required === \"string\" ? rules.required : \"This field is required\";\r\n schema = schema.min(1, message);\r\n }\r\n return finalizeSchema(schema, rules);\r\n }\r\n\r\n // Default fallback\r\n return finalizeSchema(z.unknown(), rules);\r\n}\r\n\r\nfunction applyCustomValidate(\r\n schema: z.ZodTypeAny,\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n if (!rules.validate) {\r\n return schema;\r\n }\r\n\r\n const validateFn = rules.validate;\r\n\r\n return schema.superRefine(async (value, ctx) => {\r\n const result = await validateFn(value);\r\n\r\n if (result === true) {\r\n return;\r\n }\r\n\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: typeof result === \"string\" ? result : \"Invalid value\",\r\n });\r\n });\r\n}\r\n\r\nfunction finalizeSchema(\r\n schema: z.ZodTypeAny,\r\n rules: FieldValidationRules\r\n): z.ZodTypeAny {\r\n return applyCustomValidate(schema, rules);\r\n}\r\n\r\n/**\r\n * Hook to manage field validations\r\n */\r\nexport function useFieldValidationRegistry() {\r\n const fieldsRef = useRef<Map<string, FieldRegistration>>(new Map());\r\n\r\n const registerFieldValidation = useCallback((field: FieldRegistration) => {\r\n fieldsRef.current.set(field.name, field);\r\n }, []);\r\n\r\n const unregisterFieldValidation = useCallback((name: string) => {\r\n fieldsRef.current.delete(name);\r\n }, []);\r\n\r\n const getValidationSchema = useCallback(() => {\r\n const shape: Record<string, z.ZodTypeAny> = {};\r\n \r\n fieldsRef.current.forEach((field) => {\r\n shape[field.name] = buildZodSchemaFromRules(field.type, field.rules);\r\n });\r\n\r\n return z.object(shape);\r\n }, []);\r\n\r\n return {\r\n registerFieldValidation,\r\n unregisterFieldValidation,\r\n getValidationSchema,\r\n fieldsRef,\r\n };\r\n}\r\n"],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ export { Form } from './Form';
|
|
|
2
2
|
export type { FormProps } from './Form';
|
|
3
3
|
export { TextBox } from './TextBox';
|
|
4
4
|
export type { TextBoxProps } from './TextBox';
|
|
5
|
+
export { PasswordRevealToggle } from './PasswordRevealToggle';
|
|
6
|
+
export type { PasswordRevealToggleProps } from './PasswordRevealToggle';
|
|
5
7
|
export { TextArea } from './TextArea';
|
|
6
8
|
export type { TextAreaProps } from './TextArea';
|
|
7
9
|
export { Select, Select as FormSelect } from './Select';
|
|
@@ -12,6 +14,10 @@ export { PhoneInput, PhoneInput as FormPhoneInput } from './PhoneInput';
|
|
|
12
14
|
export type { PhoneInputProps, PhoneInputProps as FormPhoneInputProps } from './PhoneInput';
|
|
13
15
|
export { DatePicker, DatePicker as FormDatePicker } from './DatePicker';
|
|
14
16
|
export type { DatePickerProps, DatePickerProps as FormDatePickerProps } from './DatePicker';
|
|
17
|
+
export { DateTimePicker, DateTimePicker as FormDateTimePicker } from './DateTimePicker';
|
|
18
|
+
export type { DateTimePickerProps, DateTimePickerProps as FormDateTimePickerProps, } from './DateTimePicker';
|
|
19
|
+
export { TimePicker } from './TimePicker';
|
|
20
|
+
export type { TimePickerProps, DayPeriod } from './TimePicker';
|
|
15
21
|
export { Combobox, Combobox as FormCombobox } from './Combobox';
|
|
16
22
|
export type { ComboboxProps, ComboboxProps as FormComboboxProps } from './Combobox';
|
|
17
23
|
export { Checkbox, Checkbox as FormCheckbox } from './Checkbox';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Form/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpF,YAAY,EACV,kBAAkB,EAClB,kBAAkB,IAAI,sBAAsB,GAC7C,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Form/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,IAAI,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,EAAE,aAAa,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpF,YAAY,EACV,kBAAkB,EAClB,kBAAkB,IAAI,sBAAsB,GAC7C,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,eAAe,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,cAAc,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { FormConfigContext, buildZodSchemaFromRules, defaultFormConfig, useFieldValidationRegistry } from "./context.js";
|
|
3
3
|
import { Form } from "./Form.js";
|
|
4
4
|
import { FieldLayout } from "./FieldLayout.js";
|
|
5
|
+
import { PasswordRevealToggle } from "./PasswordRevealToggle.js";
|
|
5
6
|
import { TextBox } from "./TextBox.js";
|
|
6
7
|
import { TextArea } from "./TextArea.js";
|
|
7
8
|
import { Select } from "./Select.js";
|
|
@@ -9,9 +10,11 @@ import { CountryPicker } from "./CountryPicker.js";
|
|
|
9
10
|
import { CountrySelect } from "./CountrySelect.js";
|
|
10
11
|
import { PhoneInput } from "./PhoneInput.js";
|
|
11
12
|
import { DatePicker } from "./DatePicker.js";
|
|
13
|
+
import { TimePicker } from "./TimePicker.js";
|
|
14
|
+
import { DateTimePicker } from "./DateTimePicker.js";
|
|
12
15
|
import { Combobox } from "./Combobox.js";
|
|
13
16
|
import { Checkbox } from "./Checkbox.js";
|
|
14
17
|
import { RadioGroup, RadioItem } from "./Radio.js";
|
|
15
18
|
import { FormSwitch } from "./FormSwitch.js";
|
|
16
19
|
import { useFieldError, useForm, useFormConfig, useFormField } from "./hooks.js";
|
|
17
|
-
export { Checkbox, Combobox, CountryPicker, CountrySelect, DatePicker, FieldLayout, Form, Checkbox as FormCheckbox, Combobox as FormCombobox, FormConfigContext, CountrySelect as FormCountrySelect, DatePicker as FormDatePicker, PhoneInput as FormPhoneInput, Select as FormSelect, FormSwitch, PhoneInput, RadioGroup, RadioItem, Select, TextArea, TextBox, buildZodSchemaFromRules, defaultFormConfig, useFieldError, useFieldValidationRegistry, useForm, useFormConfig, useFormField };
|
|
20
|
+
export { Checkbox, Combobox, CountryPicker, CountrySelect, DatePicker, DateTimePicker, FieldLayout, Form, Checkbox as FormCheckbox, Combobox as FormCombobox, FormConfigContext, CountrySelect as FormCountrySelect, DatePicker as FormDatePicker, DateTimePicker as FormDateTimePicker, PhoneInput as FormPhoneInput, Select as FormSelect, FormSwitch, PasswordRevealToggle, PhoneInput, RadioGroup, RadioItem, Select, TextArea, TextBox, TimePicker, buildZodSchemaFromRules, defaultFormConfig, useFieldError, useFieldValidationRegistry, useForm, useFormConfig, useFormField };
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { ComponentPropsWithoutRef } from 'react';
|
|
2
2
|
import { Input as InputPrimitive } from '../../primitives/input';
|
|
3
|
-
export type InputProps = ComponentPropsWithoutRef<typeof InputPrimitive
|
|
4
|
-
|
|
3
|
+
export type InputProps = ComponentPropsWithoutRef<typeof InputPrimitive> & {
|
|
4
|
+
/**
|
|
5
|
+
* Show an eye toggle for password fields.
|
|
6
|
+
* Defaults to true when `type="password"`.
|
|
7
|
+
*/
|
|
8
|
+
passwordToggle?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const Input: import('react').ForwardRefExoticComponent<Omit<Omit<import('react').DetailedHTMLProps<import('react').InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref"> & import('react').RefAttributes<HTMLInputElement>, "ref"> & {
|
|
11
|
+
/**
|
|
12
|
+
* Show an eye toggle for password fields.
|
|
13
|
+
* Defaults to true when `type="password"`.
|
|
14
|
+
*/
|
|
15
|
+
passwordToggle?: boolean;
|
|
16
|
+
} & import('react').RefAttributes<HTMLInputElement>>;
|
|
5
17
|
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAc,MAAM,OAAO,CAAA;AACjE,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAIhE,MAAM,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,cAAc,CAAC,GAAG;IACzE;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,KAAK;IAPhB;;;OAGG;qBACc,OAAO;oDA0CxB,CAAA"}
|
|
@@ -1,12 +1,40 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
import { cn } from "../../utils/cn.js";
|
|
4
|
+
import { PasswordRevealToggle } from "../Form/PasswordRevealToggle.js";
|
|
2
5
|
import { TextBoxPrimitive } from "../../primitives/textbox.js";
|
|
3
|
-
import { forwardRef } from "react";
|
|
4
|
-
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
import { forwardRef, useState } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
8
|
//#region src/components/Input/Input.tsx
|
|
6
|
-
var Input = forwardRef((props, ref) =>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
var Input = forwardRef(({ type, className, passwordToggle, disabled, ...props }, ref) => {
|
|
10
|
+
const [passwordVisible, setPasswordVisible] = useState(false);
|
|
11
|
+
const showPasswordToggle = type === "password" && passwordToggle !== false;
|
|
12
|
+
const resolvedType = showPasswordToggle && passwordVisible ? "text" : type;
|
|
13
|
+
if (!showPasswordToggle) return /* @__PURE__ */ jsx(TextBoxPrimitive, {
|
|
14
|
+
ref,
|
|
15
|
+
type,
|
|
16
|
+
className,
|
|
17
|
+
disabled,
|
|
18
|
+
...props
|
|
19
|
+
});
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
className: "relative w-full",
|
|
22
|
+
children: [/* @__PURE__ */ jsx(TextBoxPrimitive, {
|
|
23
|
+
ref,
|
|
24
|
+
type: resolvedType,
|
|
25
|
+
className: cn("pr-10", className),
|
|
26
|
+
disabled,
|
|
27
|
+
...props
|
|
28
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
29
|
+
className: "absolute right-3 top-1/2 -translate-y-1/2",
|
|
30
|
+
children: /* @__PURE__ */ jsx(PasswordRevealToggle, {
|
|
31
|
+
visible: passwordVisible,
|
|
32
|
+
onToggle: () => setPasswordVisible((visible) => !visible),
|
|
33
|
+
disabled
|
|
34
|
+
})
|
|
35
|
+
})]
|
|
36
|
+
});
|
|
37
|
+
});
|
|
10
38
|
Input.displayName = "Input";
|
|
11
39
|
//#endregion
|
|
12
40
|
export { Input };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":[],"sources":["../../../src/components/Input/Input.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"Input.js","names":[],"sources":["../../../src/components/Input/Input.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport { forwardRef, useState } from \"react\"\r\nimport type { ComponentPropsWithoutRef, ElementRef } from \"react\"\r\nimport { Input as InputPrimitive } from \"../../primitives/input\"\r\nimport { cn } from \"../../utils/cn\"\r\nimport { PasswordRevealToggle } from \"../Form/PasswordRevealToggle\"\r\n\r\nexport type InputProps = ComponentPropsWithoutRef<typeof InputPrimitive> & {\r\n /**\r\n * Show an eye toggle for password fields.\r\n * Defaults to true when `type=\"password\"`.\r\n */\r\n passwordToggle?: boolean\r\n}\r\n\r\nexport const Input = forwardRef<\r\n ElementRef<typeof InputPrimitive>,\r\n InputProps\r\n>(({ type, className, passwordToggle, disabled, ...props }, ref) => {\r\n const [passwordVisible, setPasswordVisible] = useState(false)\r\n const isPasswordType = type === \"password\"\r\n const showPasswordToggle = isPasswordType && passwordToggle !== false\r\n const resolvedType = showPasswordToggle && passwordVisible ? \"text\" : type\r\n\r\n if (!showPasswordToggle) {\r\n return (\r\n <InputPrimitive\r\n ref={ref}\r\n type={type}\r\n className={className}\r\n disabled={disabled}\r\n {...props}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"relative w-full\">\r\n <InputPrimitive\r\n ref={ref}\r\n type={resolvedType}\r\n className={cn(\"pr-10\", className)}\r\n disabled={disabled}\r\n {...props}\r\n />\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2\">\r\n <PasswordRevealToggle\r\n visible={passwordVisible}\r\n onToggle={() => setPasswordVisible((visible) => !visible)}\r\n disabled={disabled}\r\n />\r\n </div>\r\n </div>\r\n )\r\n})\r\nInput.displayName = \"Input\"\r\n"],"mappings":";;;;;;;;AAgBA,IAAa,QAAQ,YAGlB,EAAE,MAAM,WAAW,gBAAgB,UAAU,GAAG,SAAS,QAAQ;CAClE,MAAM,CAAC,iBAAiB,sBAAsB,SAAS,KAAK;CAE5D,MAAM,qBADiB,SAAS,cACa,mBAAmB;CAChE,MAAM,eAAe,sBAAsB,kBAAkB,SAAS;CAEtE,IAAI,CAAC,oBACH,OACE,oBAAC,kBAAD;EACO;EACC;EACK;EACD;EACV,GAAI;CACL,CAAA;CAIL,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,kBAAD;GACO;GACL,MAAM;GACN,WAAW,GAAG,SAAS,SAAS;GACtB;GACV,GAAI;EACL,CAAA,GACD,oBAAC,OAAD;GAAK,WAAU;GACb,UAAA,oBAAC,sBAAD;IACE,SAAS;IACT,gBAAgB,oBAAoB,YAAY,CAAC,OAAO;IAC9C;GACX,CAAA;EACE,CAAA,CACF;;AAET,CAAC;AACD,MAAM,cAAc"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { Button, buttonVariants } from './components/Button';
|
|
2
2
|
export type { ButtonProps } from './components/Button';
|
|
3
|
-
export { Form, TextBox, TextArea, FormCheckbox, RadioGroup, RadioItem, FormSwitch, FormConfigContext, defaultFormConfig, buildZodSchemaFromRules, useFieldValidationRegistry, useFormConfig, useForm, useFormField, useFieldError, CountrySelect, FormCountrySelect, PhoneInput, FormPhoneInput, DatePicker, FormDatePicker, Combobox, FormCombobox, } from './components/Form';
|
|
3
|
+
export { Form, TextBox, PasswordRevealToggle, TextArea, FormCheckbox, RadioGroup, RadioItem, FormSwitch, FormConfigContext, defaultFormConfig, buildZodSchemaFromRules, useFieldValidationRegistry, useFormConfig, useForm, useFormField, useFieldError, CountrySelect, FormCountrySelect, PhoneInput, FormPhoneInput, DatePicker, FormDatePicker, DateTimePicker, FormDateTimePicker, TimePicker, Combobox, FormCombobox, } from './components/Form';
|
|
4
4
|
export { Select as FormSelect } from './components/Form/Select';
|
|
5
|
-
export type { FormProps, TextBoxProps, TextAreaProps, CheckboxProps, RadioGroupProps, RadioItemProps, RadioOption, FormSwitchProps, FormConfig, FormContextValue, FieldValidationRules, FieldRegistration, CountrySelectProps, FormCountrySelectProps, PhoneInputProps, FormPhoneInputProps, DatePickerProps, FormDatePickerProps, ComboboxProps, FormComboboxProps, } from './components/Form';
|
|
5
|
+
export type { FormProps, TextBoxProps, PasswordRevealToggleProps, TextAreaProps, CheckboxProps, RadioGroupProps, RadioItemProps, RadioOption, FormSwitchProps, FormConfig, FormContextValue, FieldValidationRules, FieldRegistration, CountrySelectProps, FormCountrySelectProps, PhoneInputProps, FormPhoneInputProps, DatePickerProps, FormDatePickerProps, DateTimePickerProps, FormDateTimePickerProps, TimePickerProps, ComboboxProps, FormComboboxProps, } from './components/Form';
|
|
6
6
|
export type { SelectProps as FormSelectProps, SelectOption } from './components/Form/Select';
|
|
7
7
|
export { getCountryFlag, getCountryByCode, getCountryName, getCountryDialCode, formatE164, parseE164, COUNTRIES, } from './data/countries';
|
|
8
8
|
export type { Country } from './data/countries';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|