@skygraph/react 0.0.0-placeholder.0 → 0.5.0

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 (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -12
  3. package/dist/Table-BmesoMje.d.ts +1017 -0
  4. package/dist/Table-CpKMOH2x.d.cts +1017 -0
  5. package/dist/chunk-2OCEO636.js +91 -0
  6. package/dist/chunk-2OCEO636.js.map +1 -0
  7. package/dist/chunk-BNMJSYI2.js +54 -0
  8. package/dist/chunk-BNMJSYI2.js.map +1 -0
  9. package/dist/chunk-FSV73JI4.js +58 -0
  10. package/dist/chunk-FSV73JI4.js.map +1 -0
  11. package/dist/chunk-GJDDPZH7.js +226 -0
  12. package/dist/chunk-GJDDPZH7.js.map +1 -0
  13. package/dist/chunk-MLEBVELO.js +1412 -0
  14. package/dist/chunk-MLEBVELO.js.map +1 -0
  15. package/dist/chunk-NXB3VAVF.js +3794 -0
  16. package/dist/chunk-NXB3VAVF.js.map +1 -0
  17. package/dist/chunk-SEQI65CF.js +61 -0
  18. package/dist/chunk-SEQI65CF.js.map +1 -0
  19. package/dist/chunk-UO6VJC3C.js +1667 -0
  20. package/dist/chunk-UO6VJC3C.js.map +1 -0
  21. package/dist/chunk-Z5UGF7EO.js +847 -0
  22. package/dist/chunk-Z5UGF7EO.js.map +1 -0
  23. package/dist/chunk-ZJF6SJLP.js +200 -0
  24. package/dist/chunk-ZJF6SJLP.js.map +1 -0
  25. package/dist/common-CdpocIEz.d.cts +27 -0
  26. package/dist/common-CdpocIEz.d.ts +27 -0
  27. package/dist/datagrid-B6hg5yJh.d.cts +200 -0
  28. package/dist/datagrid-B6hg5yJh.d.ts +200 -0
  29. package/dist/datagrid.cjs +1053 -0
  30. package/dist/datagrid.cjs.map +1 -0
  31. package/dist/datagrid.d.cts +2 -0
  32. package/dist/datagrid.d.ts +2 -0
  33. package/dist/datagrid.js +10 -0
  34. package/dist/datagrid.js.map +1 -0
  35. package/dist/devtools.cjs +253 -0
  36. package/dist/devtools.cjs.map +1 -0
  37. package/dist/devtools.d.cts +29 -0
  38. package/dist/devtools.d.ts +29 -0
  39. package/dist/devtools.js +9 -0
  40. package/dist/devtools.js.map +1 -0
  41. package/dist/form.cjs +1723 -0
  42. package/dist/form.cjs.map +1 -0
  43. package/dist/form.d.cts +530 -0
  44. package/dist/form.d.ts +530 -0
  45. package/dist/form.js +49 -0
  46. package/dist/form.js.map +1 -0
  47. package/dist/index.cjs +22467 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +3685 -0
  50. package/dist/index.d.ts +3685 -0
  51. package/dist/index.js +14131 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/table.cjs +4134 -0
  54. package/dist/table.cjs.map +1 -0
  55. package/dist/table.d.cts +31 -0
  56. package/dist/table.d.ts +31 -0
  57. package/dist/table.js +26 -0
  58. package/dist/table.js.map +1 -0
  59. package/dist/tree.cjs +1822 -0
  60. package/dist/tree.cjs.map +1 -0
  61. package/dist/tree.d.cts +348 -0
  62. package/dist/tree.d.ts +348 -0
  63. package/dist/tree.js +13 -0
  64. package/dist/tree.js.map +1 -0
  65. package/dist/virtual.cjs +145 -0
  66. package/dist/virtual.cjs.map +1 -0
  67. package/dist/virtual.d.cts +50 -0
  68. package/dist/virtual.d.ts +50 -0
  69. package/dist/virtual.js +11 -0
  70. package/dist/virtual.js.map +1 -0
  71. package/package.json +108 -18
  72. package/index.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useField.ts","../src/hooks/useForm.ts","../src/components/complex/FormContext.ts","../src/components/complex/FormProvider.tsx","../src/components/complex/Form.tsx","../src/components/ui/Textarea.tsx","../src/components/ui/Tooltip.tsx","../src/components/complex/Field.tsx","../src/components/complex/SubmitButton.tsx","../src/hooks/useWatch.ts","../src/components/complex/FormList.tsx","../src/hooks/useFieldArray.ts","../src/components/complex/AutoField/AutoField.tsx","../src/adapters/zodAdapter.ts","../src/adapters/jsonSchemaAdapter.ts","../src/components/complex/SchemaForm.tsx"],"sourcesContent":["import { useEffect, useState, useCallback, useRef } from 'react'\nimport type { Core, FormEngine, FieldMeta } from '@skygraph/core'\n\nexport interface UseFieldReturn {\n value: unknown\n errors: string[]\n warnings: string[]\n error: string | null\n touched: boolean\n dirty: boolean\n validating: boolean\n status: 'success' | 'warning' | 'error' | 'validating' | undefined\n onChange: (value: unknown) => void\n onBlur: () => void\n}\n\nexport function useField(\n core: Core,\n form: FormEngine,\n name: string,\n): UseFieldReturn {\n const [value, setValue] = useState(() => form.getValue(name))\n const [meta, setMeta] = useState<FieldMeta>(() => form.getFieldState(name))\n const nameRef = useRef(name)\n nameRef.current = name\n\n useEffect(() => {\n const unsubs: (() => void)[] = []\n\n unsubs.push(\n core.subscribe(name, (v) => {\n setValue(v)\n }),\n )\n\n unsubs.push(\n core.subscribe(`$meta.${name}.errors`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.warnings`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.touched`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.dirty`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.validating`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n\n return () => {\n for (const u of unsubs) u()\n }\n }, [core, form, name])\n\n const onChange = useCallback(\n (v: unknown) => {\n form.setValue(nameRef.current, v)\n },\n [form],\n )\n\n const onBlur = useCallback(() => {\n form.onFieldBlur(nameRef.current)\n }, [form])\n\n return {\n value,\n errors: meta.errors,\n warnings: meta.warnings,\n error: meta.error,\n touched: meta.touched,\n dirty: meta.dirty,\n validating: meta.validating,\n status: meta.status,\n onChange,\n onBlur,\n }\n}\n","import { useState, useCallback, useMemo, useRef } from 'react'\nimport { createCore, createForm } from '@skygraph/core'\nimport type { Core, FormEngine, FormOptions, FormState, ValidationResult } from '@skygraph/core'\n\nexport interface UseFormOptions extends FormOptions {\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>\n onSubmitInvalid?: (errors: Record<string, string[]>) => void\n}\n\nexport interface UseFormReturn {\n core: Core\n form: FormEngine\n formState: FormState\n submit: () => Promise<void>\n reset: (values?: Record<string, unknown>) => void\n setFieldValue: (name: string, value: unknown) => void\n setFieldsValue: (values: Record<string, unknown>) => void\n getFieldValue: (name: string) => unknown\n getFieldsValue: () => Record<string, unknown>\n validateFields: (name?: string) => Promise<ValidationResult>\n}\n\nexport function useForm(options?: UseFormOptions): UseFormReturn {\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const [{ core, form }] = useState(() => {\n const c = createCore()\n const f = createForm(c, options)\n return { core: c, form: f }\n })\n\n const [formState, setFormState] = useState<FormState>(() => form.getFormState())\n\n const refreshState = useCallback(() => {\n setFormState(form.getFormState())\n }, [form])\n\n const submit = useCallback(async () => {\n refreshState()\n await form.submit(async (values) => {\n await optionsRef.current?.onSubmit?.(values)\n })\n\n const state = form.getFormState()\n setFormState(state)\n\n if (!state.isValid && optionsRef.current?.onSubmitInvalid) {\n optionsRef.current.onSubmitInvalid(\n (await form.validate()).errors,\n )\n }\n }, [form, refreshState])\n\n const reset = useCallback(\n (values?: Record<string, unknown>) => {\n form.reset(values)\n setFormState(form.getFormState())\n },\n [form],\n )\n\n const setFieldValue = useCallback(\n (name: string, value: unknown) => {\n form.setValue(name, value)\n },\n [form],\n )\n\n const setFieldsValue = useCallback(\n (values: Record<string, unknown>) => {\n form.setFieldsValue(values)\n },\n [form],\n )\n\n const getFieldValue = useCallback((name: string) => form.getValue(name), [form])\n\n const getFieldsValue = useCallback(() => form.getFieldsValue(), [form])\n\n const validateFields = useCallback((name?: string) => form.validate(name), [form])\n\n return useMemo(\n () => ({\n core,\n form,\n formState,\n submit,\n reset,\n setFieldValue,\n setFieldsValue,\n getFieldValue,\n getFieldsValue,\n validateFields,\n }),\n [\n core,\n form,\n formState,\n submit,\n reset,\n setFieldValue,\n setFieldsValue,\n getFieldValue,\n getFieldsValue,\n validateFields,\n ],\n )\n}\n","import { createContext, useContext } from 'react'\nimport type React from 'react'\nimport type { Core, FormEngine } from '@skygraph/core'\n\n/** Values exposed by {@link FormContext} to descendant fields and hooks. */\nexport interface FormContextValue {\n /** Shared Skygraph core instance for the form tree. */\n core: Core\n /** Form engine coordinating values, validation, and submit. */\n form: FormEngine\n /** Active form layout from the nearest {@link Form}. */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Active control size from the nearest {@link Form}. */\n size?: 'small' | 'middle' | 'large'\n /** Whether the form tree is disabled. */\n disabled?: boolean\n /** Whether labels show a trailing colon. */\n colon?: boolean\n /** Required/optional marking mode for labels. */\n requiredMark?: boolean | 'optional'\n /** Default label column grid for horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Default control column grid for horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Default label text alignment. */\n labelAlign?: 'left' | 'right'\n /** Whether unmounted field values are preserved. */\n preserve?: boolean\n /** Icons used for field feedback states. */\n feedbackIcons?: {\n /** Success-state icon. */\n success?: React.ReactNode\n /** Warning-state icon. */\n warning?: React.ReactNode\n /** Error-state icon. */\n error?: React.ReactNode\n /** Validating-state icon. */\n validating?: React.ReactNode\n }\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null)\n\n/**\n * Returns the current `FormContextValue` from the nearest {@link Form}.\n * @throws If used outside `<Form>`.\n */\nexport function useFormContext(): FormContextValue {\n const ctx = useContext(FormContext)\n if (!ctx) {\n throw new Error('SkyGraph: useFormContext must be used inside <Form>')\n }\n return ctx\n}\n","import React, { createContext, useCallback, useContext, useMemo, useRef } from 'react'\nimport type { FormEngine } from '@skygraph/core'\n\ninterface FormProviderContextValue {\n registerForm: (name: string, form: FormEngine) => void\n unregisterForm: (name: string) => void\n onFormFinish?: (\n name: string,\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\n ) => void\n onFormChange?: (\n name: string,\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\n ) => void\n}\n\nconst FormProviderContext = createContext<FormProviderContextValue | null>(null)\n\n/** Props for a registry of named forms and their lifecycle callbacks. */\nexport interface FormProviderProps {\n /** Called after a registered form finishes submit successfully. */\n onFormFinish?: (\n name: string,\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\n ) => void\n /** Called when values change in a registered form. */\n onFormChange?: (\n name: string,\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\n ) => void\n /** Tree of forms and other UI that may register with this provider. */\n children: React.ReactNode\n}\n\n/**\n * Provides a context so named {@link Form} instances can register and report\n * `onFormFinish` / `onFormChange` to a single parent.\n */\nexport function FormProvider({ onFormFinish, onFormChange, children }: FormProviderProps) {\n const formsRef = useRef<Record<string, FormEngine>>({})\n\n const registerForm = useCallback((name: string, form: FormEngine) => {\n formsRef.current[name] = form\n }, [])\n\n const unregisterForm = useCallback((name: string) => {\n delete formsRef.current[name]\n }, [])\n\n const value = useMemo<FormProviderContextValue>(\n () => ({\n registerForm,\n unregisterForm,\n onFormFinish,\n onFormChange,\n }),\n [registerForm, unregisterForm, onFormFinish, onFormChange],\n )\n\n return (\n <FormProviderContext.Provider value={value}>{children}</FormProviderContext.Provider>\n )\n}\n\n/**\n * Returns the optional multi-form provider context, or `null` if there is no {@link FormProvider}.\n */\nexport function useFormProvider() {\n return useContext(FormProviderContext)\n}\n\n/**\n * Registers/unregisters a {@link FormEngine} under `name` with the parent {@link FormProvider} on mount/unmount.\n */\nexport function useFormProviderRegister(name: string | undefined, form: FormEngine) {\n const provider = useContext(FormProviderContext)\n\n React.useEffect(() => {\n if (!provider || !name) return\n provider.registerForm(name, form)\n return () => provider.unregisterForm(name)\n }, [provider, name, form])\n\n return provider\n}\n","import React, { useRef } from 'react'\nimport { FormContext } from './FormContext'\nimport { useForm } from '../../hooks/useForm'\nimport { useConfig } from '../ConfigProvider'\nimport { useFormProviderRegister } from './FormProvider'\nimport type { UseFormOptions, UseFormReturn } from '../../hooks/useForm'\nimport type { ValidationMode } from '@skygraph/core'\n\n/** Props for the root form wrapper; merges {@link UseFormOptions} with layout and UI settings. */\nexport interface FormProps extends UseFormOptions {\n /** Controlled form instance from {@link useForm}; when omitted, an internal instance is created. */\n form?: UseFormReturn\n /** `name` attribute on the native `<form>` element. */\n name?: string\n /** Arrangement of labels and controls.\n * @default 'vertical'\n */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Field/control size for context consumers. */\n size?: 'small' | 'middle' | 'large'\n /** Disables fields that read this value from form context. */\n disabled?: boolean\n /** When `true`, appends a colon after labels that support it. */\n colon?: boolean\n /** How required fields are marked in labels (`*` vs “optional”). */\n requiredMark?: boolean | 'optional'\n /** Label column grid settings (24-column) for horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Control column grid settings (24-column) for horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Text alignment for the label column. */\n labelAlign?: 'left' | 'right'\n /** Additional class names on the `<form>`. */\n className?: string\n /** Inline styles on the `<form>`. */\n style?: React.CSSProperties\n /** Form body content. */\n children: React.ReactNode\n /** After submit, scroll the first invalid field into view (`true` uses smooth centering). */\n scrollToFirstError?: boolean | ScrollIntoViewOptions\n /** Keeps unmounted field values in the form store. */\n preserve?: boolean\n /** Events that trigger validation (passed through to form options). */\n validateTrigger?: ValidationMode | ValidationMode[]\n /** Custom icons shown for field feedback states. */\n feedbackIcons?: {\n /** Icon for successful validation. */\n success?: React.ReactNode\n /** Icon for warning validation. */\n warning?: React.ReactNode\n /** Icon for error validation. */\n error?: React.ReactNode\n /** Icon while async validation is running. */\n validating?: React.ReactNode\n }\n /**\n * Called with the form values when the form passes validation and submits.\n * Alias for `onSubmit`. Both fire; if both are provided, `onSubmit` runs first.\n */\n onFinish?: (values: Record<string, unknown>) => void | Promise<void>\n /**\n * Initial field values. Alias for `defaultValues` (the underlying Form\n * engine option). When both are provided, `defaultValues` wins.\n */\n initialValues?: Record<string, unknown>\n}\n\n/**\n * Renders a `<form>` and provides {@link FormContext} for fields and lists.\n * Submits via the engine’s `submit` and optionally scrolls to the first error.\n */\nexport function Form({\n form: externalForm,\n name: formName,\n layout = 'vertical',\n size: sizeProp,\n disabled: disabledProp,\n colon,\n requiredMark,\n labelCol,\n wrapperCol,\n labelAlign,\n className,\n style,\n children,\n scrollToFirstError,\n preserve,\n feedbackIcons,\n onFinish,\n initialValues,\n ...formOptions\n}: FormProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled\n\n // `initialValues` is an antd-style alias for the engine's `defaultValues`.\n const mergedFormOptions = {\n ...formOptions,\n defaultValues: formOptions.defaultValues ?? initialValues,\n onSubmit: async (values: Record<string, unknown>) => {\n await formOptions.onSubmit?.(values)\n await onFinish?.(values)\n },\n }\n\n const internalForm = useForm(externalForm ? undefined : mergedFormOptions)\n const { core, form, submit } = externalForm ?? internalForm\n const formRef = useRef<HTMLFormElement>(null)\n\n useFormProviderRegister(formName, form)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n await submit()\n\n if (scrollToFirstError) {\n const result = await form.validate()\n if (!result.valid) {\n const firstErrorField = Object.keys(result.errors)[0]\n if (firstErrorField && formRef.current) {\n const el =\n formRef.current.querySelector(`[data-field-name=\"${firstErrorField}\"]`) ??\n formRef.current.querySelector(`[name=\"${firstErrorField}\"]`)\n if (el) {\n const scrollOpts =\n typeof scrollToFirstError === 'object' ? scrollToFirstError : { behavior: 'smooth' as const, block: 'center' as const }\n el.scrollIntoView(scrollOpts)\n }\n }\n }\n }\n }\n\n const classes = ['sg-form', `sg-form-${layout}`, `sg-form-${size}`]\n if (disabled) classes.push('sg-form-disabled')\n if (className) classes.push(className)\n\n return (\n <FormContext.Provider\n value={{\n core,\n form,\n layout,\n size,\n disabled,\n colon,\n requiredMark,\n labelCol,\n wrapperCol,\n labelAlign,\n preserve,\n feedbackIcons,\n }}\n >\n <form\n ref={formRef}\n name={formName}\n className={classes.join(' ')}\n style={style}\n onSubmit={handleSubmit}\n noValidate\n >\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n","import React from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for the multiline text field with optional character count and loading overlay. */\nexport interface TextareaProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled value; when omitted, uses internal state seeded by `defaultValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Placeholder shown when empty. */\n placeholder?: string\n /** Visible row count on the native textarea. @default 4 */\n rows?: number\n /** Hard cap on input length enforced in the change handler. */\n maxLength?: number\n /** Shows current length (and `maxLength` when set) beside the field in styled mode. */\n showCount?: boolean\n /** DOM id forwarded to the underlying `<textarea>`. */\n id?: string\n /** Exposes invalid state to assistive technologies. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Connects the textarea to description / error nodes for assistive technologies. */\n 'aria-describedby'?: string\n /** Marks the field as required for assistive technologies. */\n 'aria-required'?: boolean | 'false' | 'true'\n /** Emits the full string on each change. */\n onChange?: (value: string) => void\n /** Passed through to the textarea blur event. */\n onBlur?: () => void\n /** Passed through to the textarea focus event. */\n onFocus?: () => void\n}\n\n/**\n * Styled textarea with configurable rows, optional character count, and loading state from shared interactive props.\n */\nexport function Textarea({\n value,\n defaultValue,\n placeholder,\n rows = 4,\n maxLength,\n showCount,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n onBlur,\n onFocus,\n id,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-required': ariaRequired,\n className,\n style,\n unstyled,\n}: TextareaProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const size = sizeProp ?? config.size ?? 'middle'\n\n const [internalValue, setInternalValue] = React.useState(value ?? defaultValue ?? '')\n const currentValue = value ?? internalValue\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value\n if (maxLength && v.length > maxLength) return\n setInternalValue(v)\n onChange?.(v)\n }\n\n const wrapperClass = unstyled\n ? className ?? ''\n : ['sg-textarea-wrapper', `sg-textarea-${size}`, loading ? 'sg-textarea-wrapper-loading' : '', className]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={wrapperClass} style={style}>\n <textarea\n id={id}\n className={unstyled ? '' : 'sg-input sg-textarea'}\n value={currentValue}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled || loading}\n aria-disabled={disabled || loading}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n aria-required={ariaRequired}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {showCount && !unstyled && (\n <span className=\"sg-textarea-count\">\n {currentValue.length}{maxLength ? ` / ${maxLength}` : ''}\n </span>\n )}\n </div>\n )\n}\n","import React, { useState, useRef, useId, cloneElement, isValidElement } from 'react'\nimport { Transition } from './Transition'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the Tooltip component. */\nexport interface TooltipProps extends BaseComponentProps {\n /** Content shown in the tooltip on hover. */\n title: React.ReactNode\n /** Tooltip position relative to the trigger. @default 'top' */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Single React element that receives hover / focus handlers as the trigger. */\n children: React.ReactElement\n}\n\ntype TriggerProps = {\n 'aria-describedby'?: string\n onFocus?: (e: React.FocusEvent) => void\n onBlur?: (e: React.FocusEvent) => void\n}\n\n/**\n * Shows floating help text on hover or keyboard focus, with optional placement and fade transition.\n * The `aria-describedby` link is forwarded to the trigger element so assistive tech reads it on focus.\n */\nexport function Tooltip({\n title,\n placement = 'top',\n children,\n className,\n unstyled,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const tooltipId = useId()\n\n const triggerWithAria = isValidElement(children)\n ? cloneElement(children as React.ReactElement<TriggerProps>, {\n 'aria-describedby': visible\n ? [(children.props as TriggerProps)['aria-describedby'], tooltipId].filter(Boolean).join(' ')\n : (children.props as TriggerProps)['aria-describedby'],\n onFocus: (e: React.FocusEvent) => {\n setVisible(true)\n ;(children.props as TriggerProps).onFocus?.(e)\n },\n onBlur: (e: React.FocusEvent) => {\n setVisible(false)\n ;(children.props as TriggerProps).onBlur?.(e)\n },\n })\n : children\n\n if (unstyled) {\n return (\n <div\n className={className}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {triggerWithAria}\n {visible && <div id={tooltipId} role=\"tooltip\">{title}</div>}\n </div>\n )\n }\n\n return (\n <div\n className={['sg-tooltip-wrapper', className].filter(Boolean).join(' ')}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n ref={ref}\n >\n {triggerWithAria}\n <Transition visible={visible} name=\"sg-fade\" unmountOnExit>\n <div id={tooltipId} role=\"tooltip\" className={`sg-tooltip sg-tooltip-${placement}`}>\n <div className=\"sg-tooltip-content\">{title}</div>\n <div className=\"sg-tooltip-arrow\" />\n </div>\n </Transition>\n </div>\n )\n}\n","import React, { useEffect, useId, useRef } from 'react'\nimport { useFormContext } from './FormContext'\nimport { useField } from '../../hooks/useField'\nimport { Input } from '../ui/Input'\nimport { Textarea } from '../ui/Textarea'\nimport { Tooltip } from '../ui/Tooltip'\nimport { Spin } from '../ui/Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { UseFieldReturn } from '../../hooks/useField'\nimport type { Rule } from '@skygraph/core'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for a single named field with validation, layout, and optional custom control. */\nexport interface FieldProps extends BaseComponentProps {\n /** Registered path in the form store. */\n name: string\n /** Visible label text; layout comes from {@link FormContext}. */\n label?: string\n /** When `true`, prepends a required rule in addition to `rules`. */\n required?: boolean\n /** Validation rules for this field.\n * @default []\n */\n rules?: Rule[]\n /** Rules that produce warnings without failing validation. */\n warningRules?: Rule[]\n /** Re-validates this field when any listed field changes. */\n dependencies?: string[]\n /** When `true`, the field renders nothing (values can remain registered). */\n hidden?: boolean\n /** Disables the control; falls back to form context `disabled`. */\n disabled?: boolean\n /** Placeholder for the built-in `Input` / `Textarea`. */\n placeholder?: string\n /** Built-in control type when `children` is not provided.\n * @default 'text'\n */\n type?: 'text' | 'email' | 'password' | 'number' | 'textarea'\n /** Helper text shown below the control when there are no errors/warnings. */\n help?: React.ReactNode\n /** Supplementary content below the control area. */\n extra?: React.ReactNode\n /** Tooltip title wrapping the label text. */\n tooltip?: string\n /** Custom control, render prop, or omit for default input/textarea. */\n children?: React.ReactNode | ((field: UseFieldReturn) => React.ReactNode)\n // New props\n /** Renders only the control (validation wiring) without layout chrome. */\n noStyle?: boolean\n /** Maps raw change values before committing to the store. */\n normalize?: (value: unknown, prevValue: unknown) => unknown\n /** Custom extractor for control events (reserved for controlled wrappers). */\n getValueFromEvent?: (...args: unknown[]) => unknown\n /** Prop name on the child that holds the value (for custom controls). */\n valuePropName?: string\n /** Stops after the first failing rule when validating. */\n validateFirst?: boolean\n /** Manual validation status badge; overrides engine-derived status when set. */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating'\n /** Shows feedback icons when the field has been touched. */\n hasFeedback?: boolean\n /** Keeps value on unregister; overrides form-level `preserve` when set. */\n preserve?: boolean\n /** Overrides form `labelCol` for this field in horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Overrides form `wrapperCol` for this field in horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Template variables merged into validation messages for this field. */\n messageVariables?: Record<string, string>\n}\n\nfunction FeedbackIcon({\n status,\n icons,\n}: {\n status: 'success' | 'warning' | 'error' | 'validating' | undefined\n icons?: {\n success?: React.ReactNode\n warning?: React.ReactNode\n error?: React.ReactNode\n validating?: React.ReactNode\n }\n}) {\n if (!status) return null\n\n const defaults: Record<string, React.ReactNode> = {\n validating: <Spin size=\"small\" />,\n error: <span className=\"sg-field-feedback-icon sg-field-feedback-error\">✕</span>,\n warning: <span className=\"sg-field-feedback-icon sg-field-feedback-warning\">!</span>,\n success: <span className=\"sg-field-feedback-icon sg-field-feedback-success\">✓</span>,\n }\n\n return <span className=\"sg-field-feedback\">{icons?.[status] ?? defaults[status]}</span>\n}\n\n/**\n * Registers `name` with the form engine, renders label/help/errors, and either\n * a built-in input or custom `children` / render-prop control.\n */\nexport function Field({\n name,\n label,\n required,\n rules = [],\n warningRules,\n dependencies,\n hidden,\n disabled: fieldDisabled,\n unstyled,\n placeholder,\n type = 'text',\n help,\n extra,\n tooltip,\n children,\n noStyle,\n normalize,\n getValueFromEvent: _getValueFromEvent,\n validateFirst,\n validateStatus: manualStatus,\n hasFeedback,\n preserve,\n labelCol: fieldLabelCol,\n wrapperCol: fieldWrapperCol,\n messageVariables: _messageVariables,\n}: FieldProps) {\n const ctx = useFormContext()\n const { core, form } = ctx\n const disabled = fieldDisabled ?? ctx.disabled\n const formLocale = useConfig().locale?.form\n const requiredMarker = formLocale?.required ?? '*'\n const optionalMarker = formLocale?.optional ?? '(optional)'\n const autoId = useId()\n const fieldId = `sg-field-${autoId.replace(/:/g, '')}-${name.replace(/\\./g, '-')}`\n const helpId = `${fieldId}-help`\n const field = useField(core, form, name)\n const prevValueRef = useRef<unknown>(field.value)\n\n useEffect(() => {\n const allRules: Rule[] = [...rules]\n if (required) {\n allRules.unshift({ required: true })\n }\n form.register(name, {\n rules: allRules,\n warningRules,\n dependencies,\n validateFirst,\n label,\n preserve: preserve ?? ctx.preserve,\n })\n return () => form.unregister(name)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, form, required])\n\n if (hidden) return null\n\n const wrappedOnChange = normalize\n ? (v: unknown) => {\n const normalized = normalize(v, prevValueRef.current)\n prevValueRef.current = normalized\n field.onChange(normalized)\n }\n : field.onChange\n\n const effectiveStatus = manualStatus ?? field.status\n const hasErrors = field.errors.length > 0\n const hasWarnings = field.warnings.length > 0\n\n // Layout\n const layout = ctx.layout ?? 'vertical'\n const lCol = fieldLabelCol ?? ctx.labelCol\n const wCol = fieldWrapperCol ?? ctx.wrapperCol\n const labelAlign = ctx.labelAlign ?? 'right'\n\n const labelNode = label ? (\n <label\n htmlFor={fieldId}\n className=\"sg-field-label\"\n style={\n layout === 'horizontal' && lCol?.offset\n ? { marginLeft: `${(lCol.offset / 24) * 100}%` }\n : undefined\n }\n >\n {tooltip ? (\n <Tooltip title={tooltip}>\n <span>{label}</span>\n </Tooltip>\n ) : (\n label\n )}\n {(required || ctx.requiredMark === true) && (\n <span className=\"sg-field-required\">{requiredMarker}</span>\n )}\n {ctx.requiredMark === 'optional' && !required && (\n <span className=\"sg-field-optional\">{optionalMarker}</span>\n )}\n {ctx.colon && ':'}\n </label>\n ) : null\n\n const errorNodes = hasErrors ? (\n <div id={helpId} className=\"sg-field-error\" role=\"alert\">\n {field.errors.map((e, i) => (\n <div key={i}>{e}</div>\n ))}\n </div>\n ) : null\n\n const warningNodes =\n hasWarnings && !hasErrors ? (\n <div id={helpId} className=\"sg-field-warning\">\n {field.warnings.map((w, i) => (\n <div key={i}>{w}</div>\n ))}\n </div>\n ) : null\n\n const helpNode =\n errorNodes ??\n warningNodes ??\n (help ? (\n <div id={helpId} className=\"sg-field-help\">\n {help}\n </div>\n ) : null)\n const describedBy = helpNode ? helpId : undefined\n\n const extraNode = extra ? <div className=\"sg-field-extra\">{extra}</div> : null\n\n const feedbackIcon =\n hasFeedback && field.touched ? (\n <FeedbackIcon status={effectiveStatus} icons={ctx.feedbackIcons} />\n ) : null\n\n // Render children\n const renderControl = () => {\n if (typeof children === 'function') {\n return (\n <>\n {children({ ...field, onChange: wrappedOnChange })}\n {feedbackIcon}\n </>\n )\n }\n\n if (children) {\n return (\n <>\n {children}\n {feedbackIcon}\n </>\n )\n }\n\n const inputElement =\n type === 'textarea' ? (\n <Textarea\n id={fieldId}\n value={(field.value as string) ?? ''}\n onChange={(v) => wrappedOnChange(v)}\n onBlur={field.onBlur}\n disabled={disabled}\n placeholder={placeholder}\n unstyled={unstyled}\n aria-invalid={hasErrors || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n ) : (\n <Input\n id={fieldId}\n type={type}\n value={(field.value as string) ?? ''}\n onChange={(v) => wrappedOnChange(type === 'number' ? Number(v) : v)}\n onBlur={field.onBlur}\n disabled={disabled}\n placeholder={placeholder}\n unstyled={unstyled}\n aria-invalid={hasErrors || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n )\n\n return (\n <>\n {inputElement}\n {feedbackIcon}\n </>\n )\n }\n\n // noStyle — just validation, no wrapper\n if (noStyle) {\n return <>{renderControl()}</>\n }\n\n // unstyled — minimal structure\n if (unstyled) {\n return (\n <>\n {labelNode}\n {renderControl()}\n {helpNode}\n {extraNode}\n </>\n )\n }\n\n // Horizontal layout with grid\n if (layout === 'horizontal' && lCol) {\n const labelSpan = lCol.span ?? 6\n const wrapperSpan = wCol?.span ?? 24 - labelSpan\n const labelPct = `${(labelSpan / 24) * 100}%`\n const wrapperPct = `${(wrapperSpan / 24) * 100}%`\n\n return (\n <div\n className={[\n 'sg-field',\n 'sg-field-horizontal',\n hasErrors ? 'sg-field-has-error' : '',\n hasWarnings && !hasErrors ? 'sg-field-has-warning' : '',\n effectiveStatus ? `sg-field-status-${effectiveStatus}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n data-field-name={name}\n >\n <div\n className=\"sg-field-label-wrap\"\n style={{\n width: labelPct,\n textAlign: labelAlign,\n }}\n >\n {labelNode}\n </div>\n <div className=\"sg-field-control-wrap\" style={{ width: wrapperPct }}>\n <div className=\"sg-field-control\">{renderControl()}</div>\n {helpNode}\n {extraNode}\n </div>\n </div>\n )\n }\n\n // Default vertical / inline layout\n const fieldClasses = [\n 'sg-field',\n hasErrors ? 'sg-field-has-error' : '',\n hasWarnings && !hasErrors ? 'sg-field-has-warning' : '',\n effectiveStatus ? `sg-field-status-${effectiveStatus}` : '',\n ]\n\n return (\n <div className={fieldClasses.filter(Boolean).join(' ')} data-field-name={name}>\n {labelNode}\n <div className=\"sg-field-control\">{renderControl()}</div>\n {helpNode}\n {extraNode}\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from '../ui/Button'\n\n/** Props for a primary-styled submit {@link Button} used inside {@link Form}. */\nexport interface SubmitButtonProps {\n /** Button label; falls back when omitted in destructuring.\n * @default 'Submit'\n */\n children?: React.ReactNode\n /** Disables the button. */\n disabled?: boolean\n /** Shows a loading state on the button. */\n loading?: boolean\n /** Extra class names passed to {@link Button}. */\n className?: string\n /** Inline styles forwarded to the underlying {@link Button}. */\n style?: React.CSSProperties\n /** Strips built-in button styles on the underlying {@link Button}. */\n unstyled?: boolean\n}\n\n/**\n * `type=\"submit\"` primary button; forwards disabled/loading and styling to {@link Button}.\n */\nexport function SubmitButton({\n children = 'Submit',\n disabled,\n loading,\n className,\n style,\n unstyled,\n}: SubmitButtonProps) {\n return (\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n disabled={disabled}\n loading={loading}\n className={className}\n style={style}\n unstyled={unstyled}\n >\n {children}\n </Button>\n )\n}\n","import { useEffect, useState } from 'react'\nimport type { Core } from '@skygraph/core'\n\nexport function useWatch(core: Core, name: string): unknown {\n const [value, setValue] = useState(() => core.get(name))\n\n useEffect(() => {\n setValue(core.get(name))\n return core.subscribe(name, (v) => {\n setValue(v)\n })\n }, [core, name])\n\n return value\n}\n","import React, { useState, useCallback, useMemo, useRef } from 'react'\nimport { useFormContext } from './FormContext'\nimport { useWatch } from '../../hooks/useWatch'\nimport type { FormListOperation } from '@skygraph/core'\n\nlet listUid = 0\nfunction genKey(): string {\n return `fl_${++listUid}`\n}\n\n/** Stable identity and position of one row in a {@link FormList}. */\nexport interface FormListField {\n /** Stable React key for list reconciliation. */\n key: string\n /** Zero-based index in the list value array. */\n index: number\n}\n\n/** Props for a dynamic array field bound to form state. */\nexport interface FormListProps {\n /** Field path in the form store holding the array value. */\n name: string\n /** Seeds the store when the path is unset on first mount. */\n initialValue?: unknown[]\n /** When `true`, each row receives `dragProps` for HTML5 drag-and-drop reordering. */\n draggable?: boolean\n /** Render function receiving fields, list operations, and validation meta. */\n children: (\n fields: FormListField[],\n operation: FormListOperation,\n meta: { errors: string[] },\n ) => React.ReactNode\n}\n\n/**\n * Manages an array at `name` with stable keys, add/remove/move/replace helpers,\n * and optional drag reordering when `draggable` is enabled.\n */\nexport function FormList({ name, initialValue, draggable, children }: FormListProps) {\n const { core, form } = useFormContext()\n\n React.useEffect(() => {\n if (initialValue && !Array.isArray(core.get(name))) {\n core.set(name, initialValue)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const listValue = useWatch(core, name)\n const items = Array.isArray(listValue) ? listValue : []\n\n const [keys, setKeys] = useState<string[]>(() => items.map(() => genKey()))\n\n React.useEffect(() => {\n setKeys((prev) => {\n if (prev.length === items.length) return prev\n if (items.length > prev.length) {\n return [...prev, ...Array.from({ length: items.length - prev.length }, () => genKey())]\n }\n return prev.slice(0, items.length)\n })\n }, [items.length])\n\n const fields = useMemo(\n () => keys.slice(0, items.length).map((key, index) => ({ key, index })),\n [keys, items.length],\n )\n\n const add = useCallback(\n (defaultValue?: unknown, insertIndex?: number) => {\n form.listAdd(name, defaultValue, insertIndex)\n setKeys((prev) => {\n const k = genKey()\n if (insertIndex !== undefined && insertIndex >= 0 && insertIndex <= prev.length) {\n const next = [...prev]\n next.splice(insertIndex, 0, k)\n return next\n }\n return [...prev, k]\n })\n },\n [form, name],\n )\n\n const remove = useCallback(\n (index: number | number[]) => {\n form.listRemove(name, index)\n setKeys((prev) => {\n if (Array.isArray(index)) {\n const indices = new Set(index)\n return prev.filter((_, i) => !indices.has(i))\n }\n return prev.filter((_, i) => i !== index)\n })\n },\n [form, name],\n )\n\n const move = useCallback(\n (from: number, to: number) => {\n form.listMove(name, from, to)\n setKeys((prev) => {\n const next = [...prev]\n const [item] = next.splice(from, 1)\n next.splice(to, 0, item)\n return next\n })\n },\n [form, name],\n )\n\n const replace = useCallback(\n (values: unknown[]) => {\n form.listReplace(name, values)\n setKeys(values.map(() => genKey()))\n },\n [form, name],\n )\n\n const operation: FormListOperation = useMemo(\n () => ({ add, remove, move, replace }),\n [add, remove, move, replace],\n )\n\n const meta = useMemo(() => ({ errors: form.getFieldErrors(name) }), [form, name])\n\n // Drag reorder support\n const dragIdx = useRef<number>(-1)\n const dragOverIdx = useRef<number>(-1)\n\n if (!draggable) {\n return <>{children(fields, operation, meta)}</>\n }\n\n const dragFields = fields.map((f) => ({\n ...f,\n dragProps: {\n draggable: true,\n onDragStart: () => {\n dragIdx.current = f.index\n },\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault()\n dragOverIdx.current = f.index\n },\n onDrop: () => {\n if (dragIdx.current !== -1 && dragOverIdx.current !== -1 && dragIdx.current !== dragOverIdx.current) {\n move(dragIdx.current, dragOverIdx.current)\n }\n dragIdx.current = -1\n dragOverIdx.current = -1\n },\n onDragEnd: () => {\n dragIdx.current = -1\n dragOverIdx.current = -1\n },\n },\n }))\n\n return <>{children(dragFields, operation, meta)}</>\n}\n","import { useState, useCallback, useMemo, useRef } from 'react'\nimport type { FormEngine } from '@skygraph/core'\n\nexport interface UseFieldArrayReturn {\n fields: { key: string; index: number }[]\n append: (defaultValue?: unknown) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n replace: (values: unknown[]) => void\n}\n\nexport function useFieldArray(form: FormEngine, name: string): UseFieldArrayReturn {\n const counterRef = useRef(0)\n const genKey = useCallback(() => `fa_${name}_${++counterRef.current}`, [name])\n\n const [keys, setKeys] = useState<string[]>(() => {\n const list = form.getListValue(name)\n return list.map(() => genKey())\n })\n\n const fields = useMemo(\n () => keys.map((key, index) => ({ key, index })),\n [keys],\n )\n\n const append = useCallback(\n (defaultValue?: unknown) => {\n form.listAdd(name, defaultValue)\n setKeys((prev) => [...prev, genKey()])\n },\n [form, name, genKey],\n )\n\n const remove = useCallback(\n (index: number) => {\n form.listRemove(name, index)\n setKeys((prev) => prev.filter((_, i) => i !== index))\n },\n [form, name],\n )\n\n const move = useCallback(\n (from: number, to: number) => {\n form.listMove(name, from, to)\n setKeys((prev) => {\n const next = [...prev]\n const [item] = next.splice(from, 1)\n next.splice(to, 0, item)\n return next\n })\n },\n [form, name],\n )\n\n const replace = useCallback(\n (values: unknown[]) => {\n const currentLen = form.getListValue(name).length\n for (let i = currentLen - 1; i >= 0; i--) {\n form.listRemove(name, i)\n }\n const newKeys: string[] = []\n for (const v of values) {\n form.listAdd(name, v)\n newKeys.push(genKey())\n }\n setKeys(newKeys)\n },\n [form, name, genKey],\n )\n\n return useMemo(\n () => ({ fields, append, remove, move, replace }),\n [fields, append, remove, move, replace],\n )\n}\n","import React, { useMemo } from 'react'\nimport { useFormContext } from '../FormContext'\nimport { useConfig } from '../../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../../types'\n\n/** Supported input kinds for form field rendering and inference. */\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'email'\n | 'url'\n | 'date'\n | 'time'\n | 'textarea'\n | 'select'\n | 'multiselect'\n | 'password'\n | 'color'\n | 'slider'\n | 'rate'\n | 'file'\n | 'switch'\n | 'radio'\n\n/** Single choice label/value pair for select, multiselect, or radio fields. */\nexport interface AutoFieldOption {\n /** Display text for the option. */\n label: string\n /** Stored value when the option is selected. */\n value: string | number\n}\n\n/** Props for a form field that picks its control from field name, value shape, and `type`. */\nexport interface AutoFieldProps extends BaseComponentProps, InteractiveProps {\n /** Form field key used with `useFormContext`. */\n name: string\n /** Caption shown above the control (or inline for checkbox/switch). */\n label?: React.ReactNode\n /** Forces a control type; otherwise inferred from value and `options`. */\n type?: FieldType\n /** Options for select, multiselect, or radio types. */\n options?: AutoFieldOption[]\n /** Placeholder or empty-option label where applicable. */\n placeholder?: string\n /** Minimum numeric or range value. */\n min?: number\n /** Maximum numeric, range, or star rating count. */\n max?: number\n /** Step for number inputs and range sliders. */\n step?: number\n /** `accept` attribute for file inputs. */\n accept?: string\n /** Allows multiple files when type is `file`. */\n multiple?: boolean\n}\n\n/**\n * Renders an appropriate input for a form field based on `type`, options, and current value.\n * Reads and writes through `FormContext` using `name`.\n */\nexport function AutoField(props: AutoFieldProps) {\n const {\n name,\n label,\n type: forcedType,\n options,\n placeholder,\n disabled: disabledProp,\n className,\n style,\n min,\n max,\n step,\n accept,\n multiple,\n } = props\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const { form } = useFormContext()\n\n const value = form.getValue(name)\n const meta = form.getFieldState(name)\n\n const inferredType = useMemo((): FieldType => {\n if (forcedType) return forcedType\n if (options && options.length > 0) return 'select'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') {\n if (value.includes('@')) return 'email'\n if (value.startsWith('http')) return 'url'\n }\n return 'string'\n }, [forcedType, options, value])\n\n const handleChange = (newValue: unknown) => {\n form.setValue(name, newValue)\n }\n\n const errorId = `${name}-error`\n const hasErrors = meta.errors.length > 0\n const hasWarnings = meta.warnings.length > 0\n\n const wrapperStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n ...style,\n }\n\n const inputStyle: React.CSSProperties = {\n padding: '6px 12px',\n border: `1px solid ${hasErrors ? 'var(--sg-error, #ff4d4f)' : hasWarnings ? 'var(--sg-warning, #faad14)' : 'var(--sg-border, #d9d9d9)'}`,\n borderRadius: 'var(--sg-radius, 6px)',\n fontSize: 14,\n outline: 'none',\n background: disabled ? 'var(--sg-bg-disabled, #f5f5f5)' : 'var(--sg-bg, #fff)',\n }\n\n function renderInput() {\n switch (inferredType) {\n case 'boolean':\n case 'switch':\n return (\n <label style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleChange(e.target.checked)}\n disabled={disabled}\n role={inferredType === 'switch' ? 'switch' : undefined}\n />\n {label}\n </label>\n )\n\n case 'number':\n return (\n <input\n type=\"number\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value === '' ? null : Number(e.target.value))}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'textarea':\n return (\n <textarea\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={{ ...inputStyle, minHeight: 80, resize: 'vertical' }}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'select':\n return (\n <select\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n >\n <option value=\"\">{placeholder ?? '-- Select --'}</option>\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n\n case 'multiselect':\n return (\n <select\n multiple\n value={Array.isArray(value) ? value.map(String) : []}\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, (o) => o.value)\n handleChange(selected)\n }}\n disabled={disabled}\n style={{ ...inputStyle, minHeight: 80 }}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n >\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n\n case 'radio':\n return (\n <div role=\"radiogroup\" style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {options?.map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={value === opt.value}\n onChange={() => handleChange(opt.value)}\n disabled={disabled}\n />\n {opt.label}\n </label>\n ))}\n </div>\n )\n\n case 'date':\n return (\n <input\n type=\"date\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'time':\n return (\n <input\n type=\"time\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'password':\n return (\n <input\n type=\"password\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'color':\n return (\n <input\n type=\"color\"\n value={value == null ? '#000000' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={{ ...inputStyle, padding: 2, width: 48, height: 32 }}\n />\n )\n\n case 'slider':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"range\"\n value={value == null ? (min ?? 0) : Number(value)}\n onChange={(e) => handleChange(Number(e.target.value))}\n min={min ?? 0}\n max={max ?? 100}\n step={step ?? 1}\n disabled={disabled}\n style={{ flex: 1 }}\n />\n <span style={{ minWidth: 32, textAlign: 'right', fontSize: 14 }}>\n {String(value ?? min ?? 0)}\n </span>\n </div>\n )\n\n case 'rate': {\n const maxStars = max ?? 5\n const currentRate = typeof value === 'number' ? value : 0\n return (\n <div style={{ display: 'flex', gap: 2 }}>\n {Array.from({ length: maxStars }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => !disabled && handleChange(i + 1)}\n disabled={disabled}\n style={{\n background: 'none',\n border: 'none',\n cursor: disabled ? 'default' : 'pointer',\n fontSize: 20,\n color: i < currentRate ? 'var(--sg-warning, #faad14)' : 'var(--sg-border, #d9d9d9)',\n padding: 0,\n }}\n aria-label={`${i + 1} star${i !== 0 ? 's' : ''}`}\n >\n ★\n </button>\n ))}\n </div>\n )\n }\n\n case 'file':\n return (\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => {\n const files = e.target.files\n if (files) handleChange(multiple ? Array.from(files) : files[0] ?? null)\n }}\n disabled={disabled}\n style={inputStyle}\n />\n )\n\n case 'email':\n case 'url':\n case 'string':\n default:\n return (\n <input\n type={inferredType === 'email' ? 'email' : inferredType === 'url' ? 'url' : 'text'}\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n }\n }\n\n return (\n <div className={`sg-autofield ${className ?? ''}`} style={wrapperStyle}>\n {inferredType !== 'boolean' && inferredType !== 'switch' && label && (\n <label style={{ fontWeight: 500, fontSize: 14 }}>{label}</label>\n )}\n {renderInput()}\n {hasErrors && (\n <span id={errorId} role=\"alert\" style={{ color: 'var(--sg-error, #ff4d4f)', fontSize: 12 }}>\n {meta.errors.join('; ')}\n </span>\n )}\n {hasWarnings && !hasErrors && (\n <span style={{ color: 'var(--sg-warning, #faad14)', fontSize: 12 }}>\n {meta.warnings.join('; ')}\n </span>\n )}\n </div>\n )\n}\n","import type { Rule, RuleFn } from '@skygraph/core'\n\n/**\n * Zod schema adapter. Converts a Zod schema (or any schema with .safeParse)\n * into SkyGraph form rules.\n *\n * Works with Zod v3/v4 or any library that implements:\n * { safeParse(value: unknown): { success: boolean; error?: { issues: Array<{ message: string }> } } }\n */\nexport interface ZodLikeSchema {\n safeParse(value: unknown): {\n success: boolean\n error?: { issues: Array<{ message: string; path?: (string | number)[] }> }\n }\n}\n\nexport interface ZodAdapterOptions {\n /** Custom error message override */\n message?: string\n /** Which issue to pick when multiple exist (default: 'first') */\n pick?: 'first' | 'all'\n}\n\n/**\n * Convert a single Zod schema into a SkyGraph Rule for one field.\n */\nexport function zodRule(schema: ZodLikeSchema, options?: ZodAdapterOptions): Rule {\n const rule: RuleFn = (value) => {\n const result = schema.safeParse(value)\n if (result.success) return null\n\n const issues = result.error?.issues ?? []\n if (issues.length === 0) return options?.message ?? 'Validation failed'\n\n if (options?.pick === 'all') {\n return issues.map((i) => i.message).join('; ')\n }\n\n return options?.message ?? issues[0].message\n }\n return rule\n}\n\n/**\n * Convert a Zod object schema into a map of field name -> Rule[].\n * Useful for auto-registering all fields from a schema.\n */\nexport interface ZodObjectLikeSchema {\n shape: Record<string, ZodLikeSchema>\n}\n\nexport function zodRules(\n schema: ZodObjectLikeSchema,\n options?: ZodAdapterOptions,\n): Record<string, Rule[]> {\n const result: Record<string, Rule[]> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n result[key] = [zodRule(fieldSchema, options)]\n }\n return result\n}\n\n/**\n * Extract default values from a Zod schema.\n * Uses safeParse(undefined) to trigger Zod's .default() mechanism,\n * then reads the parsed data for the actual default value.\n */\nexport function zodDefaults(schema: ZodObjectLikeSchema): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n try {\n const result = fieldSchema.safeParse(undefined) as {\n success: boolean\n data?: unknown\n error?: { issues: Array<{ message: string }> }\n }\n if (result.success && result.data !== undefined) {\n defaults[key] = result.data\n }\n } catch {\n // skip fields without defaults\n }\n }\n return defaults\n}\n\ninterface ZodDef {\n typeName?: string\n checks?: Array<{ kind: string; value?: unknown; regex?: RegExp; message?: string }>\n values?: unknown[]\n innerType?: { _def: ZodDef }\n type?: { _def: ZodDef }\n options?: Array<{ _def: ZodDef }>\n}\n\ninterface ZodFieldSchema {\n _def: ZodDef\n description?: string\n}\n\ninterface ZodObjectSchema {\n _def: ZodDef\n shape?: Record<string, ZodFieldSchema>\n}\n\n/**\n * Converts a Zod schema to a minimal JSON Schema representation for SchemaForm.\n */\nexport function zodToJsonSchema(\n schema: ZodObjectSchema,\n): import('../adapters/jsonSchemaAdapter').JSONSchema {\n const properties: Record<string, Record<string, unknown>> = {}\n const required: string[] = []\n\n const shape = schema.shape ?? (schema as unknown as { shape: Record<string, ZodFieldSchema> }).shape\n if (!shape) return { properties, required }\n\n for (const [key, field] of Object.entries(shape)) {\n const prop: Record<string, unknown> = { title: key }\n let def: ZodDef = field._def\n\n if (def.typeName === 'ZodOptional' || def.typeName === 'ZodNullable') {\n def = def.innerType?._def ?? def\n } else {\n required.push(key)\n }\n\n if (def.typeName === 'ZodDefault') {\n prop.default = (def as unknown as { defaultValue: () => unknown }).defaultValue?.()\n def = def.innerType?._def ?? def\n }\n\n switch (def.typeName) {\n case 'ZodString':\n prop.type = 'string'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minLength = check.value\n if (check.kind === 'max') prop.maxLength = check.value\n if (check.kind === 'email') prop.format = 'email'\n if (check.kind === 'url') prop.format = 'url'\n if (check.kind === 'regex' && check.regex) prop.pattern = check.regex.source\n }\n break\n case 'ZodNumber':\n prop.type = 'number'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minimum = check.value\n if (check.kind === 'max') prop.maximum = check.value\n }\n break\n case 'ZodBoolean':\n prop.type = 'boolean'\n break\n case 'ZodEnum':\n prop.type = 'string'\n prop.enum = def.values ?? []\n break\n case 'ZodDate':\n prop.type = 'string'\n prop.format = 'date'\n break\n default:\n prop.type = 'string'\n }\n\n if (field.description) prop.description = field.description\n\n properties[key] = prop\n }\n\n return { properties, required }\n}\n","import type { Rule } from '@skygraph/core'\nimport type { FieldType, AutoFieldOption } from '../components/complex/AutoField/AutoField'\n\nexport interface JSONSchemaProperty {\n type?: string\n title?: string\n description?: string\n default?: unknown\n enum?: unknown[]\n enumNames?: string[]\n minimum?: number\n maximum?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n format?: string\n items?: JSONSchemaProperty\n required?: string[]\n properties?: Record<string, JSONSchemaProperty>\n oneOf?: Array<{ const: unknown; title?: string }>\n}\n\nexport interface JSONSchema extends JSONSchemaProperty {\n $schema?: string\n}\n\nexport interface AutoFieldConfig {\n name: string\n label?: string\n type: FieldType\n placeholder?: string\n options?: AutoFieldOption[]\n min?: number\n max?: number\n step?: number\n}\n\nfunction jsonTypeToFieldType(schema: JSONSchemaProperty): FieldType {\n if (schema.enum || schema.oneOf) return 'select'\n if (schema.format === 'email') return 'email'\n if (schema.format === 'uri' || schema.format === 'url') return 'url'\n if (schema.format === 'date') return 'date'\n if (schema.format === 'time') return 'time'\n if (schema.format === 'password') return 'password'\n if (schema.format === 'color') return 'color'\n\n switch (schema.type) {\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'multiselect'\n default:\n if (schema.maxLength && schema.maxLength > 200) return 'textarea'\n return 'string'\n }\n}\n\nfunction buildOptions(schema: JSONSchemaProperty): AutoFieldOption[] | undefined {\n if (schema.oneOf) {\n return schema.oneOf.map((item) => ({\n value: item.const as string | number,\n label: item.title ?? String(item.const),\n }))\n }\n if (schema.enum) {\n return schema.enum.map((val, i) => ({\n value: val as string | number,\n label: schema.enumNames?.[i] ?? String(val),\n }))\n }\n return undefined\n}\n\nexport function jsonSchemaToFields(schema: JSONSchema): AutoFieldConfig[] {\n const result: AutoFieldConfig[] = []\n const props = schema.properties ?? {}\n\n for (const [name, prop] of Object.entries(props)) {\n result.push({\n name,\n label: prop.title ?? name,\n type: jsonTypeToFieldType(prop),\n placeholder: prop.description,\n options: buildOptions(prop),\n min: prop.minimum,\n max: prop.maximum,\n })\n }\n\n return result\n}\n\nexport function jsonSchemaToRules(schema: JSONSchema): Record<string, Rule[]> {\n const result: Record<string, Rule[]> = {}\n const props = schema.properties ?? {}\n const requiredFields = new Set(schema.required ?? [])\n\n for (const [name, prop] of Object.entries(props)) {\n const rules: Rule[] = []\n\n if (requiredFields.has(name)) {\n rules.push({ required: true, message: `${prop.title ?? name} is required` })\n }\n\n if (prop.type === 'string') {\n if (prop.minLength !== undefined) {\n rules.push({ min: prop.minLength, message: `Minimum ${prop.minLength} characters` })\n }\n if (prop.maxLength !== undefined) {\n rules.push({ max: prop.maxLength, message: `Maximum ${prop.maxLength} characters` })\n }\n if (prop.pattern) {\n rules.push({ pattern: new RegExp(prop.pattern), message: `Invalid format` })\n }\n }\n\n if (prop.type === 'number' || prop.type === 'integer') {\n if (prop.minimum !== undefined) {\n rules.push({ min: prop.minimum, type: 'number' })\n }\n if (prop.maximum !== undefined) {\n rules.push({ max: prop.maximum, type: 'number' })\n }\n }\n\n if (prop.format === 'email') {\n rules.push({ type: 'email' })\n }\n if (prop.format === 'uri' || prop.format === 'url') {\n rules.push({ type: 'url' })\n }\n\n if (rules.length > 0) {\n result[name] = rules\n }\n }\n\n return result\n}\n\nexport function jsonSchemaToDefaults(schema: JSONSchema): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const props = schema.properties ?? {}\n\n for (const [name, prop] of Object.entries(props)) {\n if (prop.default !== undefined) {\n result[name] = prop.default\n }\n }\n\n return result\n}\n","import React from 'react'\nimport { Form } from './Form'\nimport { Field } from './Field'\nimport { AutoField } from './AutoField/AutoField'\nimport { useForm } from '../../hooks/useForm'\nimport { useConfig } from '../ConfigProvider'\nimport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n} from '../../adapters/jsonSchemaAdapter'\nimport { zodToJsonSchema } from '../../adapters/zodAdapter'\nimport type { JSONSchema } from '../../adapters/jsonSchemaAdapter'\nimport type { UseFormReturn } from '../../hooks/useForm'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Builds a {@link Form} from JSON Schema or Zod (converted to JSON Schema) with {@link Field} + {@link AutoField} rows. */\nexport interface SchemaFormProps extends BaseComponentProps, SizableProps {\n /** JSON Schema object or a Zod schema (`_def` present) to derive fields and rules. */\n schema: JSONSchema | { _def?: unknown }\n /** Called with all values on successful submit. */\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>\n /** Passed through to the inner {@link Form}. */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Disables generated controls and the inner {@link Form}. */\n disabled?: boolean\n /** External form instance; otherwise an internal `useForm` is created with schema defaults. */\n form?: UseFormReturn\n /** Passed through to the inner {@link Form}. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Passed through to the inner {@link Form}. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n className?: string\n style?: React.CSSProperties\n /** Label for the default submit button when `children` is omitted.\n * @default 'Submit'\n */\n submitText?: string\n /** Replaces the default submit button; omit to use a primary `<button type=\"submit\">`. */\n children?: React.ReactNode\n}\n\nfunction isZodSchema(schema: unknown): boolean {\n return typeof schema === 'object' && schema !== null && '_def' in schema\n}\n\n/**\n * Generates fields from `schema`, wires validation, and wraps them in {@link Form}.\n * Supports Zod input by converting it to JSON Schema first.\n */\nexport function SchemaForm({\n schema: rawSchema,\n onSubmit,\n layout,\n size,\n disabled,\n form: externalForm,\n labelCol,\n wrapperCol,\n className,\n style,\n submitText: submitTextProp,\n children,\n}: SchemaFormProps) {\n const config = useConfig()\n const submitText = submitTextProp ?? config.locale?.form?.submitText ?? 'Submit'\n const jsonSchema: JSONSchema = isZodSchema(rawSchema)\n ? zodToJsonSchema(rawSchema as Parameters<typeof zodToJsonSchema>[0])\n : (rawSchema as JSONSchema)\n\n const fields = jsonSchemaToFields(jsonSchema)\n const rulesMap = jsonSchemaToRules(jsonSchema)\n const defaults = jsonSchemaToDefaults(jsonSchema)\n\n const internalForm = useForm({\n defaultValues: defaults,\n onSubmit: onSubmit as (values: Record<string, unknown>) => Promise<void>,\n })\n\n const formInstance = externalForm ?? internalForm\n\n return (\n <Form\n form={formInstance}\n layout={layout}\n size={size}\n disabled={disabled}\n labelCol={labelCol}\n wrapperCol={wrapperCol}\n className={className}\n style={style}\n >\n {fields.map((fieldConfig) => (\n <Field\n key={fieldConfig.name}\n name={fieldConfig.name}\n label={typeof fieldConfig.label === 'string' ? fieldConfig.label : undefined}\n rules={rulesMap[fieldConfig.name]}\n >\n {(field) => (\n <AutoField\n name={fieldConfig.name}\n type={fieldConfig.type}\n options={fieldConfig.options}\n placeholder={fieldConfig.placeholder}\n min={fieldConfig.min}\n max={fieldConfig.max}\n disabled={disabled ?? field.validating}\n />\n )}\n </Field>\n ))}\n {children ?? (\n <button type=\"submit\" className=\"sg-button sg-button-primary\">\n {submitText}\n </button>\n )}\n </Form>\n )\n}\n"],"mappings":"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","names":["useState","useCallback","useRef","createContext","useCallback","useContext","useMemo","useRef","useRef","jsx","useRef","React","jsx","React","useState","useRef","jsx","jsxs","useState","useRef","useEffect","useId","useRef","jsx","jsxs","useId","useRef","useEffect","jsx","useEffect","useState","React","useState","useCallback","useMemo","useRef","Fragment","jsx","React","useState","useMemo","useCallback","useRef","useState","useCallback","useMemo","useRef","genKey","useMemo","jsx","jsxs","useMemo","jsx","jsxs"]}