From 7a3ff87947e5c07612e0bb75cf121d87427ea0a5 Mon Sep 17 00:00:00 2001 From: guynikan Date: Sun, 1 Feb 2026 12:55:36 +0000 Subject: [PATCH 1/7] refactor: remove unnecessary renderer registry overrides --- .../core/src/registry/renderer-registry.ts | 53 +------------------ 1 file changed, 2 insertions(+), 51 deletions(-) diff --git a/packages/core/src/registry/renderer-registry.ts b/packages/core/src/registry/renderer-registry.ts index 5526302..d15a1c0 100644 --- a/packages/core/src/registry/renderer-registry.ts +++ b/packages/core/src/registry/renderer-registry.ts @@ -37,24 +37,7 @@ export const defaultTypeRenderers: Record = { return runtime.create(spec, propsWithChildren); }, 'container': (spec, props, runtime, children) => { - const xComponentProps = props['x-component-props'] || {}; - const mergedProps = { ...props, ...xComponentProps }; - const sanitized = sanitizePropsForDOM(mergedProps); - const propsWithChildren = children && children.length > 0 - ? { ...sanitized, children } - : sanitized; - return runtime.create(spec, propsWithChildren); - }, - 'FormContainer': (spec, props, runtime, children) => { - const { onSubmit, externalContext } = props; - const sanitized = sanitizePropsForDOM(props); - const propsWithChildren = { - ...sanitized, - onSubmit, - externalContext, - ...(children && children.length > 0 ? { children } : {}), - }; - return runtime.create(spec, propsWithChildren); + return runtime.create(spec, {...props, children}); }, content: (spec, props, runtime, children) => { const sanitized = sanitizePropsForDOM(props); @@ -83,29 +66,10 @@ export const defaultTypeRenderers: Record = { }, }; -/** - * Renderer registry overrides - */ -const rendererRegistryOverrides = new Map(); - -/** - * Register a renderer override globally - */ -export function registerRenderer(type: ComponentType, renderer: RendererFn): void { - rendererRegistryOverrides.set(type, renderer); -} - -/** - * Get renderer by type with registry overrides - */ -export function getRendererByType(type: ComponentType): RendererFn { - return rendererRegistryOverrides.get(type) || defaultTypeRenderers[type]; -} - /** * Get unified renderer registry with hierarchical merging * - * Priority order: local > global > registry overrides > default + * Priority order: local > global > default */ export function getRendererRegistry( globalRenderers?: Partial>, @@ -114,11 +78,6 @@ export function getRendererRegistry( // Start with built-in renderers let merged = { ...defaultTypeRenderers }; - // Apply registry overrides (global registrations) - rendererRegistryOverrides.forEach((renderer, type) => { - merged[type] = renderer; - }); - // Apply global renderers (from provider) if (globalRenderers) { Object.keys(globalRenderers).forEach(type => { @@ -168,14 +127,6 @@ export function getRendererForType( return globalRenderers[type]!; } - // Registry overrides third priority - if (rendererRegistryOverrides.has(type)) { - if (debugEnabled) { - console.log(`Renderer resolved from registry override: ${type}`); - } - return rendererRegistryOverrides.get(type)!; - } - // Default renderer last if (debugEnabled) { console.log(`Renderer resolved from default: ${type}`); From 7e63d69261873b9b2d0019fa19bdeb385e9b17e1 Mon Sep 17 00:00:00 2001 From: guynikan Date: Sun, 1 Feb 2026 13:19:21 +0000 Subject: [PATCH 2/7] refactor: remove FormContainer renderer and destruct internal props before pass to html elements --- package.json | 2 +- .../core/src/registry/component-registry.ts | 1 - packages/core/src/runtime/types.ts | 1 - .../react/src/components/DefaultFormField.tsx | 13 +++++++-- .../DefaultFormSectionContainer.tsx | 4 +++ .../components/DefaultFormSectionGroup.tsx | 2 ++ .../DefaultFormSectionGroupContainer.tsx | 2 ++ .../components/DefaultFormSectionTitle.tsx | 6 +++- .../components/DefaultInputAutocomplete.tsx | 5 +++- .../src/components/DefaultInputCheckbox.tsx | 6 +++- .../react/src/components/DefaultInputDate.tsx | 5 +++- .../src/components/DefaultInputNumber.tsx | 5 +++- .../src/components/DefaultInputPhone.tsx | 5 +++- .../src/components/DefaultInputSelect.tsx | 5 ++++ .../react/src/components/DefaultInputText.tsx | 5 +++- .../src/components/DefaultInputTextarea.tsx | 5 +++- .../src/components/DefaultSubmitButton.tsx | 5 +++- .../factories/vanilla/src/form-factory.ts | 2 +- packages/factories/vue/src/form-factory.ts | 2 +- .../components/Forms/FormWithFormik.tsx | 2 +- .../basic-ui/components/Forms/FormWithRHF.tsx | 2 +- .../basic-ui/components/Inputs/InputText.tsx | 6 ++-- .../components/rhf/RHFFormContainer.tsx | 3 +- .../components/ComponentRegistry.tsx | 2 +- .../components/Containers/FormField.tsx | 20 +++++++++++-- .../Containers/FormSectionContainer.tsx | 21 ++++++++++++-- .../Containers/FormSectionGroup.tsx | 26 ++++++++++++----- .../Containers/FormSectionGroupContainer.tsx | 22 +++++++++++++-- .../Containers/FormSectionTitle.tsx | 28 ++++++++++++++----- .../components/Inputs/InputCheckbox.tsx | 4 +++ .../chakra-ui/components/Inputs/InputDate.tsx | 4 +++ .../components/Inputs/InputNumber.tsx | 4 +++ .../components/Inputs/InputPhone.tsx | 4 +++ .../components/Inputs/InputSelect.tsx | 4 +++ .../chakra-ui/components/Inputs/InputText.tsx | 4 +++ .../components/Inputs/InputTextarea.tsx | 4 +++ .../components/ComponentRegistry.tsx | 2 +- .../components/Containers/FormContainer.tsx | 3 ++ .../components/Containers/FormField.tsx | 18 ++++++++++-- .../Containers/FormSectionContainer.tsx | 11 +++++++- .../Containers/FormSectionGroup.tsx | 5 +++- .../Containers/FormSectionGroupContainer.tsx | 19 +++++++++++-- .../Containers/FormSectionTitle.tsx | 4 +++ .../components/Inputs/InputCheckbox.tsx | 4 +++ .../components/Inputs/InputDate.tsx | 4 +++ .../components/Inputs/InputNumber.tsx | 4 +++ .../components/Inputs/InputPhone.tsx | 4 +++ .../components/Inputs/InputSelect.tsx | 4 +++ .../components/Inputs/InputText.tsx | 4 +++ .../components/Inputs/InputTextarea.tsx | 4 +++ 50 files changed, 278 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 234702c..27c99cd 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "private": true, "scripts": { "build": "turbo build", - "dev": "turbo dev", + "showcases:dev": "turbo --filter showcases dev", "test": "turbo test --filter='./packages/*'", "test:e2e": "playwright test --config=tests/playwright.config.ts", "test:e2e:ui": "playwright test --ui --config=tests/playwright.config.ts", diff --git a/packages/core/src/registry/component-registry.ts b/packages/core/src/registry/component-registry.ts index 01aae8b..08463e1 100644 --- a/packages/core/src/registry/component-registry.ts +++ b/packages/core/src/registry/component-registry.ts @@ -14,7 +14,6 @@ export const defaultTypeProps: Record> = { field: { fullWidth: true }, 'field-wrapper': {}, 'container': {}, - 'FormContainer': {}, content: {}, addon: {}, 'menu-item': {}, diff --git a/packages/core/src/runtime/types.ts b/packages/core/src/runtime/types.ts index f0f9b35..19b8a46 100644 --- a/packages/core/src/runtime/types.ts +++ b/packages/core/src/runtime/types.ts @@ -104,7 +104,6 @@ export type ComponentType = | 'field' | 'field-wrapper' | 'container' - | 'FormContainer' | 'content' | 'addon' | 'menu-item' diff --git a/packages/factories/react/src/components/DefaultFormField.tsx b/packages/factories/react/src/components/DefaultFormField.tsx index 8e44d38..0a56577 100644 --- a/packages/factories/react/src/components/DefaultFormField.tsx +++ b/packages/factories/react/src/components/DefaultFormField.tsx @@ -4,7 +4,7 @@ * Wrapper (grid cell) for a single form field. Can be overridden via createComponentSpec. */ -import React from 'react'; +import React from "react"; /** * Props passed to the FormField component. @@ -14,8 +14,10 @@ export interface FormFieldProps extends React.HTMLAttributes { /** Form field children (typically the rendered input) */ children?: React.ReactNode; /** Test ID for the form field */ - 'data-test-id'?: string; + "data-test-id"?: string; externalContext?: Record; + "x-component-props"?: Record; + "x-ui"?: Record; } /** @@ -30,10 +32,15 @@ export type FormFieldComponentType = React.ComponentType; export const DefaultFormField: React.FC = ({ children, externalContext, + "x-component-props": xComponentProps, + "x-ui": xUi, ...props }) => { return ( -
+
{children}
); diff --git a/packages/factories/react/src/components/DefaultFormSectionContainer.tsx b/packages/factories/react/src/components/DefaultFormSectionContainer.tsx index 579148d..a4330d9 100644 --- a/packages/factories/react/src/components/DefaultFormSectionContainer.tsx +++ b/packages/factories/react/src/components/DefaultFormSectionContainer.tsx @@ -17,6 +17,8 @@ export interface FormSectionContainerProps /** Test ID for the form section container */ 'data-test-id'?: string; externalContext?: Record; + "x-component-props"?: Record; + 'x-ui'?: Record; } /** @@ -32,6 +34,8 @@ export type FormSectionContainerComponentType = export const DefaultFormSectionContainer: React.FC = ({ children, externalContext, + 'x-ui': xUi, + "x-component-props": xComponentProps, ...props }) => { return ( diff --git a/packages/factories/react/src/components/DefaultFormSectionGroup.tsx b/packages/factories/react/src/components/DefaultFormSectionGroup.tsx index c35dcef..0ebc8bb 100644 --- a/packages/factories/react/src/components/DefaultFormSectionGroup.tsx +++ b/packages/factories/react/src/components/DefaultFormSectionGroup.tsx @@ -16,6 +16,7 @@ export interface FormSectionGroupProps children?: React.ReactNode; /** Test ID for the form section group */ 'data-test-id'?: string; + 'x-component-props'?: Record; externalContext?: Record; [key: string]: any; } @@ -33,6 +34,7 @@ export type FormSectionGroupComponentType = export const DefaultFormSectionGroup: React.FC = ({ children, externalContext, + 'x-component-props': xComponentProps, ...props }) => { return ( diff --git a/packages/factories/react/src/components/DefaultFormSectionGroupContainer.tsx b/packages/factories/react/src/components/DefaultFormSectionGroupContainer.tsx index 30f6f88..8944ce1 100644 --- a/packages/factories/react/src/components/DefaultFormSectionGroupContainer.tsx +++ b/packages/factories/react/src/components/DefaultFormSectionGroupContainer.tsx @@ -17,6 +17,8 @@ export interface FormSectionGroupContainerProps /** Test ID for the form section group container */ 'data-test-id'?: string; externalContext?: Record; + "x-component-props"?: Record; + "x-ui"?: Record; } /** diff --git a/packages/factories/react/src/components/DefaultFormSectionTitle.tsx b/packages/factories/react/src/components/DefaultFormSectionTitle.tsx index 7d3f9e8..8386263 100644 --- a/packages/factories/react/src/components/DefaultFormSectionTitle.tsx +++ b/packages/factories/react/src/components/DefaultFormSectionTitle.tsx @@ -19,6 +19,8 @@ export interface FormSectionTitleProps /** Test ID for the form section title */ 'data-test-id'?: string; externalContext?: Record; + "x-component-props"?: Record; + "x-ui"?: Record; } /** @@ -35,10 +37,12 @@ export const DefaultFormSectionTitle: React.FC = ({ 'x-content': content, children, externalContext, + "x-component-props": xComponentProps, + "x-ui": xUi, ...props }) => { return ( -

+

{content ?? children}

); diff --git a/packages/factories/react/src/components/DefaultInputAutocomplete.tsx b/packages/factories/react/src/components/DefaultInputAutocomplete.tsx index 6a1f24a..4b5b0ab 100644 --- a/packages/factories/react/src/components/DefaultInputAutocomplete.tsx +++ b/packages/factories/react/src/components/DefaultInputAutocomplete.tsx @@ -30,6 +30,8 @@ export interface InputAutocompleteProps /** List of options for autocomplete (value used for both value and label if label omitted) */ options?: InputAutocompleteOption[] | string[]; externalContext?: Record; + "x-component-props"?: Record; + "x-ui"?: Record; } /** @@ -67,7 +69,7 @@ function normalizeOptions( export const DefaultInputAutocomplete = React.forwardRef< HTMLInputElement, InputAutocompleteProps ->(({ label, name, value, onChange, placeholder, options = [], externalContext, ...rest }, ref) => { +>(({ label, name, value, onChange, placeholder, options = [], externalContext, "x-component-props": xComponentProps, "x-ui": xUi, ...rest }, ref) => { const listId = `${name}-datalist`; const normalizedOptions = normalizeOptions(options); @@ -87,6 +89,7 @@ export const DefaultInputAutocomplete = React.forwardRef< placeholder={placeholder} onChange={(e) => onChange?.(e.target.value)} style={inputStyle} + {...xComponentProps} {...rest} /> diff --git a/packages/factories/react/src/components/DefaultInputCheckbox.tsx b/packages/factories/react/src/components/DefaultInputCheckbox.tsx index b902aff..2b726a8 100644 --- a/packages/factories/react/src/components/DefaultInputCheckbox.tsx +++ b/packages/factories/react/src/components/DefaultInputCheckbox.tsx @@ -22,6 +22,9 @@ export interface InputCheckboxProps onChange?: (value: boolean) => void; label?: string; children?: React.ReactNode; + externalContext?: Record; + "x-component-props"?: Record; + "x-ui"?: Record; } /** @@ -42,7 +45,7 @@ const labelStyle: React.CSSProperties = { * Default checkbox input component. */ export const DefaultInputCheckbox = React.forwardRef( - ({ label, name, value, onChange, children, ...rest }, ref) => { + ({ label, name, value, onChange, children, externalContext, "x-component-props": xComponentProps, "x-ui": xUi, ...rest }, ref) => { return (