@skygraph/react 0.5.3 → 0.6.4

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/form.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/form.ts","../src/hooks/useField.ts","../src/hooks/useForm.ts","../src/hooks/useFieldArray.ts","../src/hooks/useWatch.ts","../src/components/complex/Form.tsx","../src/components/complex/FormContext.ts","../src/components/ConfigProvider.tsx","../src/components/complex/FormProvider.tsx","../src/components/complex/Field.tsx","../src/components/ui/Input.tsx","../src/components/ui/Spin.tsx","../src/components/ui/Textarea.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/Transition.tsx","../src/components/ui/Button.tsx","../src/components/complex/SubmitButton.tsx","../src/components/complex/FormList.tsx","../src/components/complex/AutoField/AutoField.tsx","../src/adapters/jsonSchemaAdapter.ts","../src/adapters/zodAdapter.ts","../src/components/complex/SchemaForm.tsx"],"sourcesContent":["export { useField } from './hooks/useField'\nexport type { UseFieldReturn } from './hooks/useField'\nexport { useForm } from './hooks/useForm'\nexport type { UseFormOptions, UseFormReturn } from './hooks/useForm'\nexport { useFieldArray } from './hooks/useFieldArray'\nexport type { UseFieldArrayReturn } from './hooks/useFieldArray'\nexport { useWatch } from './hooks/useWatch'\n\nexport { Form } from './components/complex/Form'\nexport type { FormProps } from './components/complex/Form'\nexport { Field } from './components/complex/Field'\nexport type { FieldProps } from './components/complex/Field'\nexport { SubmitButton } from './components/complex/SubmitButton'\nexport type { SubmitButtonProps } from './components/complex/SubmitButton'\nexport { FormContext, useFormContext } from './components/complex/FormContext'\nexport { FormList } from './components/complex/FormList'\nexport type { FormListProps, FormListField } from './components/complex/FormList'\nexport { FormProvider, useFormProvider } from './components/complex/FormProvider'\nexport type { FormProviderProps } from './components/complex/FormProvider'\nexport { SchemaForm } from './components/complex/SchemaForm'\nexport type { SchemaFormProps } from './components/complex/SchemaForm'\n\nexport { AutoField } from './components/complex/AutoField'\nexport type { AutoFieldProps, FieldType, AutoFieldOption } from './components/complex/AutoField'\n\nexport { zodRule, zodRules, zodDefaults, zodToJsonSchema } from './adapters/zodAdapter'\nexport type { ZodLikeSchema, ZodObjectLikeSchema, ZodAdapterOptions } from './adapters/zodAdapter'\n\nexport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n} from './adapters/jsonSchemaAdapter'\nexport type {\n JSONSchema,\n JSONSchemaProperty,\n AutoFieldConfig,\n} from './adapters/jsonSchemaAdapter'\n","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 { 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 { 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, { 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 { 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, useContext, useMemo } from 'react'\nimport type { SizeType, SgLocale } from '../types'\n\n/** Text/layout direction shared by descendant components. */\nexport type Direction = 'ltr' | 'rtl'\n\n/**\n * Friendly design-token overrides. Each entry is mapped to a `--sg-*` CSS\n * custom property and emitted onto a `display: contents` scope wrapper, so\n * overrides cascade to every descendant without affecting layout.\n *\n * Numeric values for length-like tokens (`borderRadius`, `fontSize`) are\n * suffixed with `px`; everything else is emitted verbatim.\n */\nexport interface SgThemeToken {\n /** Brand / primary color → `--sg-color-primary`. */\n colorPrimary?: string\n /** Success color → `--sg-color-success`. */\n colorSuccess?: string\n /** Warning color → `--sg-color-warning`. */\n colorWarning?: string\n /** Error / danger color → `--sg-color-error`. */\n colorError?: string\n /** Base text color → `--sg-color-text`. */\n colorText?: string\n /** Base background color → `--sg-color-bg`. */\n colorBg?: string\n /** Base border color → `--sg-color-border`. */\n colorBorder?: string\n /** Base corner radius → `--sg-border-radius` (number ⇒ px). */\n borderRadius?: number | string\n /** Base font size → `--sg-font-size` (number ⇒ px). */\n fontSize?: number | string\n /** Base font family → `--sg-font-sans`. */\n fontFamily?: string\n}\n\n/**\n * Theme configuration. Combines a built-in light/dark preset (`mode`),\n * friendly token overrides (`token`), and an escape hatch for raw CSS\n * variables (`cssVars`). All three are applied to a scope wrapper.\n */\nexport interface ThemeConfig {\n /** Built-in palette preset applied via `data-sg-theme`. */\n mode?: 'light' | 'dark'\n /** Friendly token overrides mapped to `--sg-*` variables. */\n token?: SgThemeToken\n /** Raw CSS variable overrides (full names, e.g. `{ '--sg-color-link': '#f50' }`). */\n cssVars?: Record<string, string>\n}\n\n/** Content-Security-Policy options for runtime-injected styles. */\nexport interface CSPConfig {\n /** `nonce` attribute applied to dynamically created `<style>` tags. */\n nonce?: string\n}\n\n/** Customizes the empty state rendered by data components (`Empty`, `Table`, …). */\nexport type RenderEmptyHandler = (componentName?: string) => React.ReactNode\n\n/**\n * Global Skygraph component configuration merged through React context.\n *\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\n */\nexport interface SgConfig {\n /** Default size token for nested components. */\n size?: SizeType\n /** Disables interactions for nested components when true. */\n disabled?: boolean\n /** Enables bordered styling for nested components when true. */\n bordered?: boolean\n /** Text / layout direction (`ltr` by default) applied via the `dir` attribute. */\n direction?: Direction\n /** Locale messages shallow-merged with the parent provider when set. */\n locale?: SgLocale\n /** Theme preset + token overrides applied to a scope wrapper. */\n theme?: ThemeConfig\n /**\n * Returns the mount node for popups (dropdowns, tooltips, pickers). Defaults\n * to `document.body` in consumers. Useful to keep overlays inside a scrolling\n * or scoped container.\n */\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\n /** Returns the scroll/target container for affix-like positioning. */\n getTargetContainer?: () => HTMLElement\n /** Global override for the default empty state. */\n renderEmpty?: RenderEmptyHandler\n /** Content-Security-Policy options for injected styles. */\n csp?: CSPConfig\n}\n\nconst SgConfigContext = createContext<SgConfig>({})\n\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\nexport interface ConfigProviderProps extends SgConfig {\n /** Tree of components that consume merged configuration from this provider. */\n children: React.ReactNode\n}\n\n/** Maps friendly token names to their `--sg-*` CSS variable. */\nconst TOKEN_TO_CSS_VAR: Record<keyof SgThemeToken, string> = {\n colorPrimary: '--sg-color-primary',\n colorSuccess: '--sg-color-success',\n colorWarning: '--sg-color-warning',\n colorError: '--sg-color-error',\n colorText: '--sg-color-text',\n colorBg: '--sg-color-bg',\n colorBorder: '--sg-color-border',\n borderRadius: '--sg-border-radius',\n fontSize: '--sg-font-size',\n fontFamily: '--sg-font-sans',\n}\n\n/** Token keys whose numeric values should be emitted as `px` lengths. */\nconst PX_TOKENS = new Set<keyof SgThemeToken>(['borderRadius', 'fontSize'])\n\n/** Builds a CSS-variable map from a theme's `token` + `cssVars`. */\nexport function buildThemeVars(theme?: ThemeConfig): Record<string, string> {\n const vars: Record<string, string> = {}\n if (!theme) return vars\n if (theme.token) {\n for (const key of Object.keys(theme.token) as Array<keyof SgThemeToken>) {\n const value = theme.token[key]\n if (value == null) continue\n const cssVar = TOKEN_TO_CSS_VAR[key]\n if (!cssVar) continue\n vars[cssVar] = typeof value === 'number' && PX_TOKENS.has(key) ? `${value}px` : String(value)\n }\n }\n if (theme.cssVars) {\n for (const [name, value] of Object.entries(theme.cssVars)) {\n if (value == null) continue\n vars[name.startsWith('--') ? name : `--${name}`] = String(value)\n }\n }\n return vars\n}\n\n/** Shallow-merges a parent and child theme (`token` / `cssVars` merged key-wise). */\nfunction mergeTheme(parent?: ThemeConfig, child?: ThemeConfig): ThemeConfig | undefined {\n if (!parent) return child\n if (!child) return parent\n return {\n mode: child.mode ?? parent.mode,\n token: { ...parent.token, ...child.token },\n cssVars: { ...parent.cssVars, ...child.cssVars },\n }\n}\n\n/**\n * Merges Skygraph configuration with any parent provider and exposes it via context.\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\n *\n * When `theme` or `direction` is set, children are wrapped in a `display: contents`\n * element that carries the `dir`/`data-sg-theme` attributes and CSS variables, so\n * the scope inherits without introducing an extra layout box.\n */\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\n const parent = useContext(SgConfigContext)\n\n const merged = useMemo<SgConfig>(\n () => ({\n size: config.size ?? parent.size,\n disabled: config.disabled ?? parent.disabled,\n bordered: config.bordered ?? parent.bordered,\n direction: config.direction ?? parent.direction,\n locale: config.locale\n ? parent.locale\n ? { ...parent.locale, ...config.locale }\n : config.locale\n : parent.locale,\n theme: mergeTheme(parent.theme, config.theme),\n getPopupContainer: config.getPopupContainer ?? parent.getPopupContainer,\n getTargetContainer: config.getTargetContainer ?? parent.getTargetContainer,\n renderEmpty: config.renderEmpty ?? parent.renderEmpty,\n csp: config.csp ?? parent.csp,\n }),\n [\n config.size,\n config.disabled,\n config.bordered,\n config.direction,\n config.locale,\n config.theme,\n config.getPopupContainer,\n config.getTargetContainer,\n config.renderEmpty,\n config.csp,\n parent,\n ],\n )\n\n // Only the *own* props are emitted to the DOM scope; CSS variables and the\n // `dir` attribute cascade to descendants, so nested providers stay correct.\n const ownVars = useMemo(() => buildThemeVars(config.theme), [config.theme])\n const mode = config.theme?.mode\n const direction = config.direction\n const needsScope = Boolean(direction || mode || Object.keys(ownVars).length > 0)\n\n const content = needsScope ? (\n <div\n className=\"sg-config-provider\"\n style={{ display: 'contents', ...ownVars } as React.CSSProperties}\n dir={direction}\n data-sg-theme={mode}\n >\n {children}\n </div>\n ) : (\n children\n )\n\n return <SgConfigContext.Provider value={merged}>{content}</SgConfigContext.Provider>\n}\n\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\nexport function useConfig(): SgConfig {\n return useContext(SgConfigContext)\n}\n\n/**\n * Resolves effective `size`, `disabled`, and `direction` from props, context,\n * and explicit defaults. Returns the original props plus the resolved values.\n */\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\n props: T,\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean; direction?: Direction },\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean; resolvedDirection: Direction } {\n const config = useContext(SgConfigContext)\n\n return useMemo(() => {\n const resolvedSize =\n ((props as Record<string, unknown>).size as SizeType | undefined) ??\n config.size ??\n defaults.size ??\n 'middle'\n const resolvedDisabled =\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\n config.disabled ??\n defaults.disabled ??\n false\n const resolvedDirection =\n ((props as Record<string, unknown>).direction as Direction | undefined) ??\n config.direction ??\n defaults.direction ??\n 'ltr'\n\n return { ...props, resolvedSize, resolvedDisabled, resolvedDirection }\n }, [\n props,\n config.size,\n config.disabled,\n config.direction,\n defaults.size,\n defaults.disabled,\n defaults.direction,\n ])\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, { 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 { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Input component. */\nexport interface InputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled input value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Placeholder text when the field is empty. */\n placeholder?: string\n /** Native HTML input type. @default 'text' */\n type?: 'text' | 'email' | 'password' | 'number'\n /**\n * Marks the field as read-only. The value is selectable and submitted\n * but cannot be edited. Sets the HTML `readonly` attribute,\n * `aria-readonly=\"true\"`, and adds the `sg-input-readonly` modifier class.\n * @default false\n */\n readOnly?: boolean\n /** DOM id forwarded to the underlying `<input>`. */\n id?: string\n /**\n * When true, renders a clear (×) button while the field has a value.\n * Disabled and read-only fields hide the button. @default false\n */\n allowClear?: boolean\n /**\n * Validation status badge. Adds `sg-input-wrapper-status-{status}` and\n * `sg-input-status-{status}` modifier classes and sets `aria-invalid` when\n * `error`.\n */\n status?: 'error' | 'warning'\n /** Optional content rendered before the `<input>` (e.g. icon). */\n prefix?: React.ReactNode\n /** Optional content rendered after the `<input>` (e.g. icon, unit). */\n suffix?: React.ReactNode\n /** Exposes invalid state to assistive technologies. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Marks the field as required for assistive technologies. */\n 'aria-required'?: boolean | 'false' | 'true'\n /** Connects the input to description / error nodes for assistive technologies. */\n 'aria-describedby'?: string\n /** Called when the text value changes. */\n onChange?: (value: string) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n /** Called when the input gains focus. */\n onFocus?: () => void\n /** Called when the user activates the built-in clear button. */\n onClear?: () => void\n}\n\n/** Single-line text input with optional loading indicator and configurable HTML type. */\nexport function Input({\n value,\n defaultValue,\n placeholder,\n type = 'text',\n readOnly = false,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n allowClear = false,\n status,\n prefix,\n suffix,\n onChange,\n onBlur,\n onFocus,\n onClear,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-describedby': ariaDescribedBy,\n id,\n className,\n style,\n unstyled,\n}: InputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalValue, setInternalValue] = React.useState<string>(defaultValue ?? '')\n const currentValue = value ?? internalValue\n const isControlled = value !== undefined\n\n const wrapperClasses = unstyled\n ? (className ?? '')\n : [\n 'sg-input-wrapper',\n `sg-input-wrapper-${size}`,\n loading ? 'sg-input-wrapper-loading' : '',\n readOnly ? 'sg-input-wrapper-readonly' : '',\n status ? `sg-input-wrapper-status-${status}` : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const inputClasses = unstyled\n ? ''\n : [\n 'sg-input',\n `sg-input-${size}`,\n readOnly ? 'sg-input-readonly' : '',\n status ? `sg-input-status-${status}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const clearLabel = config.locale?.input?.clear ?? 'Clear'\n const showClear = allowClear && !disabled && !readOnly && !loading && currentValue !== ''\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChange?.(e.target.value)\n }\n\n const handleClear = () => {\n if (!isControlled) setInternalValue('')\n onChange?.('')\n onClear?.()\n }\n\n const resolvedAriaInvalid = ariaInvalid ?? (status === 'error' ? true : undefined)\n\n return (\n <span className={wrapperClasses} style={style}>\n {prefix && <span className=\"sg-input-prefix\">{prefix}</span>}\n <input\n id={id}\n type={type}\n className={inputClasses}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled || loading}\n readOnly={readOnly}\n aria-invalid={resolvedAriaInvalid}\n aria-required={ariaRequired}\n aria-readonly={readOnly || undefined}\n aria-describedby={ariaDescribedBy}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"sg-input-clear\"\n aria-label={clearLabel}\n onClick={handleClear}\n >\n ×\n </button>\n )}\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {suffix && <span className=\"sg-input-suffix\">{suffix}</span>}\n </span>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for loading spinner, overlay, and optional content blur. */\nexport interface SpinProps extends BaseComponentProps, SizableProps {\n /** When `true`, shows the loading state (subject to `delay`). @default true */\n spinning?: boolean\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\n delay?: number\n /** Optional text below the indicator. */\n tip?: string\n /** When `true`, covers the viewport instead of inline or wrapping children. */\n fullscreen?: boolean\n /** Custom spinner node; defaults to a styled status element. */\n indicator?: React.ReactNode\n /** When set, shows an overlay with blur on this content while loading. */\n children?: React.ReactNode\n}\n\n/**\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\n */\nexport function Spin({\n spinning = true,\n size: sizeProp,\n delay,\n tip,\n fullscreen,\n indicator,\n children,\n className,\n style,\n unstyled,\n}: SpinProps) {\n const config = useConfig()\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n\n const [visible, setVisible] = React.useState(delay ? false : spinning)\n\n React.useEffect(() => {\n if (!delay) {\n setVisible(spinning)\n return\n }\n\n if (spinning) {\n const timer = setTimeout(() => setVisible(true), delay)\n return () => clearTimeout(timer)\n }\n\n setVisible(false)\n }, [spinning, delay])\n\n if (!visible && !children) return null\n if (!visible && children) return <>{children}</>\n\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\n const spinClasses = unstyled\n ? (className ?? '')\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\n\n const spinElement = indicator ?? (\n <span\n className={spinClasses}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\n />\n )\n\n if (fullscreen) {\n return (\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n </div>\n )\n }\n\n if (!children) {\n return (\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </span>\n )\n }\n\n return (\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\n </div>\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, { useState, useEffect, useRef, useCallback } from 'react'\n\n/** Props for class-based enter/leave animation on a single child element. */\nexport interface TransitionProps {\n /** When `true`, runs enter; when `false`, runs leave (and may unmount). */\n visible: boolean\n /** Base class name prefix for default enter/leave classes (e.g. `sg-fade-enter-from`). @default 'sg-fade' */\n name?: string\n /** Animation length in ms before idle phase and after callbacks. @default 200 */\n duration?: number\n /** Custom initial class for the enter frame (with `-enter-active`). */\n enterFrom?: string\n /** Custom final class for the enter-active frame. */\n enterTo?: string\n /** Custom initial class for the leave frame (with `-leave-active`). */\n leaveFrom?: string\n /** Custom final class for the leave-active frame. */\n leaveTo?: string\n /** Fires once the enter transition timer completes. */\n onAfterEnter?: () => void\n /** Fires once the leave transition timer completes. */\n onAfterLeave?: () => void\n /** Single React element whose `className` will be merged with transition classes. */\n children: React.ReactElement<{ className?: string; ref?: React.Ref<HTMLElement> }>\n /** When `true`, removes the child from the tree after leave; when `false`, keeps it mounted. @default true */\n unmountOnExit?: boolean\n}\n\ntype Phase = 'idle' | 'enter' | 'enter-active' | 'leave' | 'leave-active'\n\n/**\n * Clones a single child and toggles CSS classes over `duration` when `visible` changes, optionally unmounting after leave.\n */\nexport function Transition({\n visible,\n name = 'sg-fade',\n duration = 200,\n enterFrom,\n enterTo,\n leaveFrom,\n leaveTo,\n onAfterEnter,\n onAfterLeave,\n children,\n unmountOnExit = true,\n}: TransitionProps) {\n const [mounted, setMounted] = useState(visible)\n const [phase, setPhase] = useState<Phase>(visible ? 'idle' : 'idle')\n const nodeRef = useRef<HTMLElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const prevVisible = useRef(visible)\n\n const getEnterClasses = useCallback(() => {\n if (enterFrom && enterTo) return { from: enterFrom, active: `${name}-enter-active`, to: enterTo }\n return { from: `${name}-enter-from`, active: `${name}-enter-active`, to: `${name}-enter-to` }\n }, [name, enterFrom, enterTo])\n\n const getLeaveClasses = useCallback(() => {\n if (leaveFrom && leaveTo) return { from: leaveFrom, active: `${name}-leave-active`, to: leaveTo }\n return { from: `${name}-leave-from`, active: `${name}-leave-active`, to: `${name}-leave-to` }\n }, [name, leaveFrom, leaveTo])\n\n useEffect(() => {\n if (visible === prevVisible.current) return\n prevVisible.current = visible\n clearTimeout(timerRef.current)\n\n if (visible) {\n setMounted(true)\n setPhase('enter')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('enter-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n onAfterEnter?.()\n }, duration)\n } else {\n setPhase('leave')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('leave-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n if (unmountOnExit) setMounted(false)\n onAfterLeave?.()\n }, duration)\n }\n }, [visible, duration, unmountOnExit, onAfterEnter, onAfterLeave])\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current)\n }, [])\n\n if (!mounted && unmountOnExit) return null\n\n const enterC = getEnterClasses()\n const leaveC = getLeaveClasses()\n\n let transitionClass = ''\n switch (phase) {\n case 'enter':\n transitionClass = `${enterC.from} ${enterC.active}`\n break\n case 'enter-active':\n transitionClass = `${enterC.to} ${enterC.active}`\n break\n case 'leave':\n transitionClass = `${leaveC.from} ${leaveC.active}`\n break\n case 'leave-active':\n transitionClass = `${leaveC.to} ${leaveC.active}`\n break\n }\n\n return React.cloneElement(children, {\n ref: nodeRef,\n className: [children.props.className, transitionClass].filter(Boolean).join(' '),\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 Button component. */\nexport interface ButtonProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Visual style variant. @default 'default' */\n type?: 'default' | 'primary' | 'dashed' | 'text' | 'link'\n /** Native HTML button type attribute. @default 'button' */\n htmlType?: 'button' | 'submit' | 'reset'\n /**\n * Visually flags a destructive action. Combines with `type` (e.g. a\n * `danger` `primary` button is solid red, a `danger` `text` is red text).\n * Adds the `sg-button-danger` modifier class.\n * @default false\n */\n danger?: boolean\n /** Stretches the button to fill its parent container. @default false */\n block?: boolean\n /** Click event handler. */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** Button content. */\n children?: React.ReactNode\n}\n\n/** General-purpose button with multiple visual variants, sizes, and loading state. */\nexport function Button({\n type = 'default',\n size: sizeProp,\n disabled: disabledProp,\n loading,\n htmlType = 'button',\n danger = false,\n block = false,\n onClick,\n children,\n className,\n style,\n unstyled,\n}: ButtonProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const classes = unstyled\n ? className ?? ''\n : [\n 'sg-button',\n `sg-button-${type}`,\n `sg-button-${size}`,\n danger ? 'sg-button-danger' : '',\n block ? 'sg-button-block' : '',\n loading ? 'sg-button-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n type={htmlType}\n className={classes}\n style={style}\n disabled={disabled || loading}\n aria-disabled={disabled || loading}\n aria-busy={loading}\n onClick={onClick}\n >\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {children}\n </button>\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 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 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 inputClass = [\n 'sg-autofield-input',\n hasErrors ? 'sg-autofield-input-error' : hasWarnings ? 'sg-autofield-input-warning' : '',\n ]\n .filter(Boolean)\n .join(' ')\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-textarea`}\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-multiple`}\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\n key={opt.value}\n style={{ display: 'flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}\n >\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 className={inputClass}\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 className={inputClass}\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-color`}\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:\n i < currentRate\n ? 'var(--sg-color-warning, #faad14)'\n : 'var(--sg-color-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 className={inputClass}\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 className={inputClass}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n }\n }\n\n return (\n <div className={`sg-autofield ${className ?? ''}`} style={style}>\n {inferredType !== 'boolean' && inferredType !== 'switch' && label && (\n <label className=\"sg-autofield-label\">{label}</label>\n )}\n {renderInput()}\n {hasErrors && (\n <span\n id={errorId}\n role=\"alert\"\n style={{ color: 'var(--sg-color-error, #ff4d4f)', fontSize: 12 }}\n >\n {meta.errors.join('; ')}\n </span>\n )}\n {hasWarnings && !hasErrors && (\n <span style={{ color: 'var(--sg-color-warning, #faad14)', fontSize: 12 }}>\n {meta.warnings.join('; ')}\n </span>\n )}\n </div>\n )\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 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 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":["import_react","import_react","genKey","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/form.ts","../src/hooks/useField.ts","../src/hooks/useForm.ts","../src/hooks/useFieldArray.ts","../src/hooks/useWatch.ts","../src/components/complex/Form.tsx","../src/components/complex/FormContext.ts","../src/components/ConfigProvider.tsx","../src/components/complex/FormProvider.tsx","../src/components/complex/Field.tsx","../src/components/ui/Input.tsx","../src/components/ui/Spin.tsx","../src/components/ui/Textarea.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/Transition.tsx","../src/components/ui/Button.tsx","../src/components/complex/SubmitButton.tsx","../src/components/complex/FormList.tsx","../src/components/complex/AutoField/AutoField.tsx","../src/adapters/jsonSchemaAdapter.ts","../src/adapters/zodAdapter.ts","../src/components/complex/SchemaForm.tsx"],"sourcesContent":["export { useField } from './hooks/useField'\nexport type { UseFieldReturn } from './hooks/useField'\nexport { useForm } from './hooks/useForm'\nexport type { UseFormOptions, UseFormReturn } from './hooks/useForm'\nexport { useFieldArray } from './hooks/useFieldArray'\nexport type { UseFieldArrayReturn } from './hooks/useFieldArray'\nexport { useWatch } from './hooks/useWatch'\n\nexport { Form } from './components/complex/Form'\nexport type { FormProps } from './components/complex/Form'\nexport { Field } from './components/complex/Field'\nexport type { FieldProps } from './components/complex/Field'\nexport { SubmitButton } from './components/complex/SubmitButton'\nexport type { SubmitButtonProps } from './components/complex/SubmitButton'\nexport { FormContext, useFormContext } from './components/complex/FormContext'\nexport { FormList } from './components/complex/FormList'\nexport type { FormListProps, FormListField } from './components/complex/FormList'\nexport { FormProvider, useFormProvider } from './components/complex/FormProvider'\nexport type { FormProviderProps } from './components/complex/FormProvider'\nexport { SchemaForm } from './components/complex/SchemaForm'\nexport type { SchemaFormProps } from './components/complex/SchemaForm'\n\nexport { AutoField } from './components/complex/AutoField'\nexport type { AutoFieldProps, FieldType, AutoFieldOption } from './components/complex/AutoField'\n\nexport { zodRule, zodRules, zodDefaults, zodToJsonSchema } from './adapters/zodAdapter'\nexport type { ZodLikeSchema, ZodObjectLikeSchema, ZodAdapterOptions } from './adapters/zodAdapter'\n\nexport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n} from './adapters/jsonSchemaAdapter'\nexport type {\n JSONSchema,\n JSONSchemaProperty,\n AutoFieldConfig,\n} from './adapters/jsonSchemaAdapter'\n","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 { 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 { 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, { 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 { 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, useContext, useMemo } from 'react'\nimport type { SizeType, SgLocale } from '../types'\n\n/** Text/layout direction shared by descendant components. */\nexport type Direction = 'ltr' | 'rtl'\n\n/**\n * Friendly design-token overrides. Each entry is mapped to a `--sg-*` CSS\n * custom property and emitted onto a `display: contents` scope wrapper, so\n * overrides cascade to every descendant without affecting layout.\n *\n * Numeric values for length-like tokens (`borderRadius`, `fontSize`) are\n * suffixed with `px`; everything else is emitted verbatim.\n */\nexport interface SgThemeToken {\n /** Brand / primary color → `--sg-color-primary`. */\n colorPrimary?: string\n /** Success color → `--sg-color-success`. */\n colorSuccess?: string\n /** Warning color → `--sg-color-warning`. */\n colorWarning?: string\n /** Error / danger color → `--sg-color-error`. */\n colorError?: string\n /** Base text color → `--sg-color-text`. */\n colorText?: string\n /** Base background color → `--sg-color-bg`. */\n colorBg?: string\n /** Base border color → `--sg-color-border`. */\n colorBorder?: string\n /** Base corner radius → `--sg-border-radius` (number ⇒ px). */\n borderRadius?: number | string\n /** Base font size → `--sg-font-size` (number ⇒ px). */\n fontSize?: number | string\n /** Base font family → `--sg-font-sans`. */\n fontFamily?: string\n}\n\n/**\n * Theme configuration. Combines a built-in light/dark preset (`mode`),\n * friendly token overrides (`token`), and an escape hatch for raw CSS\n * variables (`cssVars`). All three are applied to a scope wrapper.\n */\nexport interface ThemeConfig {\n /** Built-in palette preset applied via `data-sg-theme`. */\n mode?: 'light' | 'dark'\n /** Friendly token overrides mapped to `--sg-*` variables. */\n token?: SgThemeToken\n /** Raw CSS variable overrides (full names, e.g. `{ '--sg-color-link': '#f50' }`). */\n cssVars?: Record<string, string>\n}\n\n/** Content-Security-Policy options for runtime-injected styles. */\nexport interface CSPConfig {\n /** `nonce` attribute applied to dynamically created `<style>` tags. */\n nonce?: string\n}\n\n/** Customizes the empty state rendered by data components (`Empty`, `Table`, …). */\nexport type RenderEmptyHandler = (componentName?: string) => React.ReactNode\n\n/**\n * Global Skygraph component configuration merged through React context.\n *\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\n */\nexport interface SgConfig {\n /** Default size token for nested components. */\n size?: SizeType\n /** Disables interactions for nested components when true. */\n disabled?: boolean\n /** Enables bordered styling for nested components when true. */\n bordered?: boolean\n /** Text / layout direction (`ltr` by default) applied via the `dir` attribute. */\n direction?: Direction\n /** Locale messages shallow-merged with the parent provider when set. */\n locale?: SgLocale\n /** Theme preset + token overrides applied to a scope wrapper. */\n theme?: ThemeConfig\n /**\n * Returns the mount node for popups (dropdowns, tooltips, pickers). Defaults\n * to `document.body` in consumers. Useful to keep overlays inside a scrolling\n * or scoped container.\n */\n getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement\n /** Returns the scroll/target container for affix-like positioning. */\n getTargetContainer?: () => HTMLElement\n /** Global override for the default empty state. */\n renderEmpty?: RenderEmptyHandler\n /** Content-Security-Policy options for injected styles. */\n csp?: CSPConfig\n}\n\nconst SgConfigContext = createContext<SgConfig>({})\n\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\nexport interface ConfigProviderProps extends SgConfig {\n /** Tree of components that consume merged configuration from this provider. */\n children: React.ReactNode\n}\n\n/** Maps friendly token names to their `--sg-*` CSS variable. */\nconst TOKEN_TO_CSS_VAR: Record<keyof SgThemeToken, string> = {\n colorPrimary: '--sg-color-primary',\n colorSuccess: '--sg-color-success',\n colorWarning: '--sg-color-warning',\n colorError: '--sg-color-error',\n colorText: '--sg-color-text',\n colorBg: '--sg-color-bg',\n colorBorder: '--sg-color-border',\n borderRadius: '--sg-border-radius',\n fontSize: '--sg-font-size',\n fontFamily: '--sg-font-sans',\n}\n\n/** Token keys whose numeric values should be emitted as `px` lengths. */\nconst PX_TOKENS = new Set<keyof SgThemeToken>(['borderRadius', 'fontSize'])\n\n/** Builds a CSS-variable map from a theme's `token` + `cssVars`. */\nexport function buildThemeVars(theme?: ThemeConfig): Record<string, string> {\n const vars: Record<string, string> = {}\n if (!theme) return vars\n if (theme.token) {\n for (const key of Object.keys(theme.token) as Array<keyof SgThemeToken>) {\n const value = theme.token[key]\n if (value == null) continue\n const cssVar = TOKEN_TO_CSS_VAR[key]\n if (!cssVar) continue\n vars[cssVar] = typeof value === 'number' && PX_TOKENS.has(key) ? `${value}px` : String(value)\n }\n }\n if (theme.cssVars) {\n for (const [name, value] of Object.entries(theme.cssVars)) {\n if (value == null) continue\n vars[name.startsWith('--') ? name : `--${name}`] = String(value)\n }\n }\n return vars\n}\n\n/** Shallow-merges a parent and child theme (`token` / `cssVars` merged key-wise). */\nfunction mergeTheme(parent?: ThemeConfig, child?: ThemeConfig): ThemeConfig | undefined {\n if (!parent) return child\n if (!child) return parent\n return {\n mode: child.mode ?? parent.mode,\n token: { ...parent.token, ...child.token },\n cssVars: { ...parent.cssVars, ...child.cssVars },\n }\n}\n\n/**\n * Merges Skygraph configuration with any parent provider and exposes it via context.\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\n *\n * When `theme` or `direction` is set, children are wrapped in a `display: contents`\n * element that carries the `dir`/`data-sg-theme` attributes and CSS variables, so\n * the scope inherits without introducing an extra layout box.\n */\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\n const parent = useContext(SgConfigContext)\n\n const merged = useMemo<SgConfig>(\n () => ({\n size: config.size ?? parent.size,\n disabled: config.disabled ?? parent.disabled,\n bordered: config.bordered ?? parent.bordered,\n direction: config.direction ?? parent.direction,\n locale: config.locale\n ? parent.locale\n ? { ...parent.locale, ...config.locale }\n : config.locale\n : parent.locale,\n theme: mergeTheme(parent.theme, config.theme),\n getPopupContainer: config.getPopupContainer ?? parent.getPopupContainer,\n getTargetContainer: config.getTargetContainer ?? parent.getTargetContainer,\n renderEmpty: config.renderEmpty ?? parent.renderEmpty,\n csp: config.csp ?? parent.csp,\n }),\n [\n config.size,\n config.disabled,\n config.bordered,\n config.direction,\n config.locale,\n config.theme,\n config.getPopupContainer,\n config.getTargetContainer,\n config.renderEmpty,\n config.csp,\n parent,\n ],\n )\n\n // Only the *own* props are emitted to the DOM scope; CSS variables and the\n // `dir` attribute cascade to descendants, so nested providers stay correct.\n const ownVars = useMemo(() => buildThemeVars(config.theme), [config.theme])\n const mode = config.theme?.mode\n const direction = config.direction\n const needsScope = Boolean(direction || mode || Object.keys(ownVars).length > 0)\n\n const content = needsScope ? (\n <div\n className=\"sg-config-provider\"\n style={{ display: 'contents', ...ownVars } as React.CSSProperties}\n dir={direction}\n data-sg-theme={mode}\n >\n {children}\n </div>\n ) : (\n children\n )\n\n return <SgConfigContext.Provider value={merged}>{content}</SgConfigContext.Provider>\n}\n\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\nexport function useConfig(): SgConfig {\n return useContext(SgConfigContext)\n}\n\n/**\n * Resolves effective `size`, `disabled`, and `direction` from props, context,\n * and explicit defaults. Returns the original props plus the resolved values.\n */\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\n props: T,\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean; direction?: Direction },\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean; resolvedDirection: Direction } {\n const config = useContext(SgConfigContext)\n\n return useMemo(() => {\n const resolvedSize =\n ((props as Record<string, unknown>).size as SizeType | undefined) ??\n config.size ??\n defaults.size ??\n 'middle'\n const resolvedDisabled =\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\n config.disabled ??\n defaults.disabled ??\n false\n const resolvedDirection =\n ((props as Record<string, unknown>).direction as Direction | undefined) ??\n config.direction ??\n defaults.direction ??\n 'ltr'\n\n return { ...props, resolvedSize, resolvedDisabled, resolvedDirection }\n }, [\n props,\n config.size,\n config.disabled,\n config.direction,\n defaults.size,\n defaults.disabled,\n defaults.direction,\n ])\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, { cloneElement, isValidElement, 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 valuePropName,\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 // Which prop carries the value on the controlled child. `value` for\n // most controls; `checked` for boolean toggles (Switch / Checkbox).\n const valueProp = valuePropName ?? 'value'\n\n // Extracts the next value from a control's change callback. SkyGraph\n // controls call `onChange(value)` with a bare value, but we also\n // tolerate raw DOM change events (`e.target.value` / `.checked`) so a\n // native `<input>` dropped into `<Field>` binds too. `getValueFromEvent`\n // overrides everything when supplied.\n const extractValue = (...args: unknown[]): unknown => {\n if (_getValueFromEvent) return _getValueFromEvent(...args)\n const first = args[0]\n if (first !== null && typeof first === 'object' && 'target' in (first as object)) {\n const target = (first as { target: HTMLInputElement | null }).target\n if (target && typeof target === 'object' && 'value' in target) {\n return valueProp === 'checked' ? target.checked : target.value\n }\n }\n return first\n }\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 // A single control element is wired to the form by injecting the\n // value prop + a change handler. Without this the control keeps\n // its own internal state and the form never sees the value — so\n // required/validator rules never clear after a choice and submit\n // reads stale defaults. Composed with the child's own handlers so\n // user-supplied `onChange` / `onBlur` still fire.\n if (isValidElement(children)) {\n const childProps = children.props as Record<string, unknown>\n const childOnChange = childProps.onChange as ((...a: unknown[]) => void) | undefined\n const childOnBlur = childProps.onBlur as ((...a: unknown[]) => void) | undefined\n\n const injected: Record<string, unknown> = {\n [valueProp]: field.value,\n onChange: (...args: unknown[]) => {\n wrappedOnChange(extractValue(...args))\n childOnChange?.(...args)\n },\n onBlur: (...args: unknown[]) => {\n field.onBlur()\n childOnBlur?.(...args)\n },\n }\n if (childProps.id === undefined) injected.id = fieldId\n if (childProps.disabled === undefined && disabled) injected.disabled = true\n if (childProps['aria-describedby'] === undefined && describedBy) {\n injected['aria-describedby'] = describedBy\n }\n if (childProps['aria-invalid'] === undefined && hasErrors) {\n injected['aria-invalid'] = true\n }\n\n return (\n <>\n {cloneElement(children, injected)}\n {feedbackIcon}\n </>\n )\n }\n\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 { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Input component. */\nexport interface InputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled input value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Placeholder text when the field is empty. */\n placeholder?: string\n /** Native HTML input type. @default 'text' */\n type?: 'text' | 'email' | 'password' | 'number'\n /**\n * Marks the field as read-only. The value is selectable and submitted\n * but cannot be edited. Sets the HTML `readonly` attribute,\n * `aria-readonly=\"true\"`, and adds the `sg-input-readonly` modifier class.\n * @default false\n */\n readOnly?: boolean\n /** DOM id forwarded to the underlying `<input>`. */\n id?: string\n /**\n * When true, renders a clear (×) button while the field has a value.\n * Disabled and read-only fields hide the button. @default false\n */\n allowClear?: boolean\n /**\n * Validation status badge. Adds `sg-input-wrapper-status-{status}` and\n * `sg-input-status-{status}` modifier classes and sets `aria-invalid` when\n * `error`.\n */\n status?: 'error' | 'warning'\n /** Optional content rendered before the `<input>` (e.g. icon). */\n prefix?: React.ReactNode\n /** Optional content rendered after the `<input>` (e.g. icon, unit). */\n suffix?: React.ReactNode\n /** Exposes invalid state to assistive technologies. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Marks the field as required for assistive technologies. */\n 'aria-required'?: boolean | 'false' | 'true'\n /** Connects the input to description / error nodes for assistive technologies. */\n 'aria-describedby'?: string\n /** Called when the text value changes. */\n onChange?: (value: string) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n /** Called when the input gains focus. */\n onFocus?: () => void\n /** Called when the user activates the built-in clear button. */\n onClear?: () => void\n}\n\n/** Single-line text input with optional loading indicator and configurable HTML type. */\nexport function Input({\n value,\n defaultValue,\n placeholder,\n type = 'text',\n readOnly = false,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n allowClear = false,\n status,\n prefix,\n suffix,\n onChange,\n onBlur,\n onFocus,\n onClear,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-describedby': ariaDescribedBy,\n id,\n className,\n style,\n unstyled,\n}: InputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalValue, setInternalValue] = React.useState<string>(defaultValue ?? '')\n const currentValue = value ?? internalValue\n const isControlled = value !== undefined\n\n const wrapperClasses = unstyled\n ? (className ?? '')\n : [\n 'sg-input-wrapper',\n `sg-input-wrapper-${size}`,\n loading ? 'sg-input-wrapper-loading' : '',\n readOnly ? 'sg-input-wrapper-readonly' : '',\n status ? `sg-input-wrapper-status-${status}` : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const inputClasses = unstyled\n ? ''\n : [\n 'sg-input',\n `sg-input-${size}`,\n readOnly ? 'sg-input-readonly' : '',\n status ? `sg-input-status-${status}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const clearLabel = config.locale?.input?.clear ?? 'Clear'\n const showClear = allowClear && !disabled && !readOnly && !loading && currentValue !== ''\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value)\n onChange?.(e.target.value)\n }\n\n const handleClear = () => {\n if (!isControlled) setInternalValue('')\n onChange?.('')\n onClear?.()\n }\n\n const resolvedAriaInvalid = ariaInvalid ?? (status === 'error' ? true : undefined)\n\n return (\n <span className={wrapperClasses} style={style}>\n {prefix && <span className=\"sg-input-prefix\">{prefix}</span>}\n <input\n id={id}\n type={type}\n className={inputClasses}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled || loading}\n readOnly={readOnly}\n aria-invalid={resolvedAriaInvalid}\n aria-required={ariaRequired}\n aria-readonly={readOnly || undefined}\n aria-describedby={ariaDescribedBy}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"sg-input-clear\"\n aria-label={clearLabel}\n onClick={handleClear}\n >\n ×\n </button>\n )}\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {suffix && <span className=\"sg-input-suffix\">{suffix}</span>}\n </span>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for loading spinner, overlay, and optional content blur. */\nexport interface SpinProps extends BaseComponentProps, SizableProps {\n /** When `true`, shows the loading state (subject to `delay`). @default true */\n spinning?: boolean\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\n delay?: number\n /** Optional text below the indicator. */\n tip?: string\n /** When `true`, covers the viewport instead of inline or wrapping children. */\n fullscreen?: boolean\n /** Custom spinner node; defaults to a styled status element. */\n indicator?: React.ReactNode\n /** When set, shows an overlay with blur on this content while loading. */\n children?: React.ReactNode\n}\n\n/**\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\n */\nexport function Spin({\n spinning = true,\n size: sizeProp,\n delay,\n tip,\n fullscreen,\n indicator,\n children,\n className,\n style,\n unstyled,\n}: SpinProps) {\n const config = useConfig()\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n\n const [visible, setVisible] = React.useState(delay ? false : spinning)\n\n React.useEffect(() => {\n if (!delay) {\n setVisible(spinning)\n return\n }\n\n if (spinning) {\n const timer = setTimeout(() => setVisible(true), delay)\n return () => clearTimeout(timer)\n }\n\n setVisible(false)\n }, [spinning, delay])\n\n if (!visible && !children) return null\n if (!visible && children) return <>{children}</>\n\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\n const spinClasses = unstyled\n ? (className ?? '')\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\n\n const spinElement = indicator ?? (\n <span\n className={spinClasses}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\n />\n )\n\n if (fullscreen) {\n return (\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n </div>\n )\n }\n\n if (!children) {\n return (\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </span>\n )\n }\n\n return (\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\n </div>\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, { useState, useEffect, useRef, useCallback } from 'react'\n\n/** Props for class-based enter/leave animation on a single child element. */\nexport interface TransitionProps {\n /** When `true`, runs enter; when `false`, runs leave (and may unmount). */\n visible: boolean\n /** Base class name prefix for default enter/leave classes (e.g. `sg-fade-enter-from`). @default 'sg-fade' */\n name?: string\n /** Animation length in ms before idle phase and after callbacks. @default 200 */\n duration?: number\n /** Custom initial class for the enter frame (with `-enter-active`). */\n enterFrom?: string\n /** Custom final class for the enter-active frame. */\n enterTo?: string\n /** Custom initial class for the leave frame (with `-leave-active`). */\n leaveFrom?: string\n /** Custom final class for the leave-active frame. */\n leaveTo?: string\n /** Fires once the enter transition timer completes. */\n onAfterEnter?: () => void\n /** Fires once the leave transition timer completes. */\n onAfterLeave?: () => void\n /** Single React element whose `className` will be merged with transition classes. */\n children: React.ReactElement<{ className?: string; ref?: React.Ref<HTMLElement> }>\n /** When `true`, removes the child from the tree after leave; when `false`, keeps it mounted. @default true */\n unmountOnExit?: boolean\n}\n\ntype Phase = 'idle' | 'enter' | 'enter-active' | 'leave' | 'leave-active'\n\n/**\n * Clones a single child and toggles CSS classes over `duration` when `visible` changes, optionally unmounting after leave.\n */\nexport function Transition({\n visible,\n name = 'sg-fade',\n duration = 200,\n enterFrom,\n enterTo,\n leaveFrom,\n leaveTo,\n onAfterEnter,\n onAfterLeave,\n children,\n unmountOnExit = true,\n}: TransitionProps) {\n const [mounted, setMounted] = useState(visible)\n const [phase, setPhase] = useState<Phase>(visible ? 'idle' : 'idle')\n const nodeRef = useRef<HTMLElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const prevVisible = useRef(visible)\n\n const getEnterClasses = useCallback(() => {\n if (enterFrom && enterTo) return { from: enterFrom, active: `${name}-enter-active`, to: enterTo }\n return { from: `${name}-enter-from`, active: `${name}-enter-active`, to: `${name}-enter-to` }\n }, [name, enterFrom, enterTo])\n\n const getLeaveClasses = useCallback(() => {\n if (leaveFrom && leaveTo) return { from: leaveFrom, active: `${name}-leave-active`, to: leaveTo }\n return { from: `${name}-leave-from`, active: `${name}-leave-active`, to: `${name}-leave-to` }\n }, [name, leaveFrom, leaveTo])\n\n useEffect(() => {\n if (visible === prevVisible.current) return\n prevVisible.current = visible\n clearTimeout(timerRef.current)\n\n if (visible) {\n setMounted(true)\n setPhase('enter')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('enter-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n onAfterEnter?.()\n }, duration)\n } else {\n setPhase('leave')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('leave-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n if (unmountOnExit) setMounted(false)\n onAfterLeave?.()\n }, duration)\n }\n }, [visible, duration, unmountOnExit, onAfterEnter, onAfterLeave])\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current)\n }, [])\n\n if (!mounted && unmountOnExit) return null\n\n const enterC = getEnterClasses()\n const leaveC = getLeaveClasses()\n\n let transitionClass = ''\n switch (phase) {\n case 'enter':\n transitionClass = `${enterC.from} ${enterC.active}`\n break\n case 'enter-active':\n transitionClass = `${enterC.to} ${enterC.active}`\n break\n case 'leave':\n transitionClass = `${leaveC.from} ${leaveC.active}`\n break\n case 'leave-active':\n transitionClass = `${leaveC.to} ${leaveC.active}`\n break\n }\n\n return React.cloneElement(children, {\n ref: nodeRef,\n className: [children.props.className, transitionClass].filter(Boolean).join(' '),\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 Button component. */\nexport interface ButtonProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Visual style variant. @default 'default' */\n type?: 'default' | 'primary' | 'dashed' | 'text' | 'link'\n /** Native HTML button type attribute. @default 'button' */\n htmlType?: 'button' | 'submit' | 'reset'\n /**\n * Visually flags a destructive action. Combines with `type` (e.g. a\n * `danger` `primary` button is solid red, a `danger` `text` is red text).\n * Adds the `sg-button-danger` modifier class.\n * @default false\n */\n danger?: boolean\n /** Stretches the button to fill its parent container. @default false */\n block?: boolean\n /** Click event handler. */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** Button content. */\n children?: React.ReactNode\n}\n\n/** General-purpose button with multiple visual variants, sizes, and loading state. */\nexport function Button({\n type = 'default',\n size: sizeProp,\n disabled: disabledProp,\n loading,\n htmlType = 'button',\n danger = false,\n block = false,\n onClick,\n children,\n className,\n style,\n unstyled,\n}: ButtonProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const classes = unstyled\n ? className ?? ''\n : [\n 'sg-button',\n `sg-button-${type}`,\n `sg-button-${size}`,\n danger ? 'sg-button-danger' : '',\n block ? 'sg-button-block' : '',\n loading ? 'sg-button-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n type={htmlType}\n className={classes}\n style={style}\n disabled={disabled || loading}\n aria-disabled={disabled || loading}\n aria-busy={loading}\n onClick={onClick}\n >\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {children}\n </button>\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 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 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 inputClass = [\n 'sg-autofield-input',\n hasErrors ? 'sg-autofield-input-error' : hasWarnings ? 'sg-autofield-input-warning' : '',\n ]\n .filter(Boolean)\n .join(' ')\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-textarea`}\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-multiple`}\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\n key={opt.value}\n style={{ display: 'flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}\n >\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 className={inputClass}\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 className={inputClass}\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 className={inputClass}\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 className={`${inputClass} sg-autofield-input-color`}\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:\n i < currentRate\n ? 'var(--sg-color-warning, #faad14)'\n : 'var(--sg-color-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 className={inputClass}\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 className={inputClass}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n }\n }\n\n return (\n <div className={`sg-autofield ${className ?? ''}`} style={style}>\n {inferredType !== 'boolean' && inferredType !== 'switch' && label && (\n <label className=\"sg-autofield-label\">{label}</label>\n )}\n {renderInput()}\n {hasErrors && (\n <span\n id={errorId}\n role=\"alert\"\n style={{ color: 'var(--sg-color-error, #ff4d4f)', fontSize: 12 }}\n >\n {meta.errors.join('; ')}\n </span>\n )}\n {hasWarnings && !hasErrors && (\n <span style={{ color: 'var(--sg-color-warning, #faad14)', fontSize: 12 }}>\n {meta.warnings.join('; ')}\n </span>\n )}\n </div>\n )\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 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 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":["import_react","import_react","genKey","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_react","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_jsx_runtime"]}