diff --git a/apps/web/.gitignore b/apps/web/.gitignore index 34a3d198..5607abad 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -48,3 +48,6 @@ next-env.d.ts # agent rules written by `next dev` (Next.js 16.3+) /AGENTS.md /CLAUDE.md + +# temporary tsconfig written by scripts/build-types-meta.ts +/.tsconfig.types-meta.*.json diff --git a/apps/web/.types/types-meta.json b/apps/web/.types/types-meta.json index dc82d9c2..a6c39979 100644 --- a/apps/web/.types/types-meta.json +++ b/apps/web/.types/types-meta.json @@ -30,7 +30,7 @@ "name": "TContext" } ], - "definition": "(prev: FiltersState, next: FiltersState, context?: TContext) => void" + "definition": "(\n prev: FiltersState,\n next: FiltersState,\n context?: TContext,\n) => void" }, "ColumnMeta": { "name": "ColumnMeta", @@ -54,7 +54,7 @@ { "name": "icon", "type": "ReactElement> | ElementType | undefined", - "formattedType": "| 'symbol'\n | 'object'\n | 'desc'\n | 'label'\n | ReactElement\n | 'a'\n | 'abbr'\n | 'address'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'cite'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'del'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'em'\n | 'embed'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'footer'\n | 'form'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'legend'\n | 'li'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'meter'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'picture'\n | 'pre'\n | 'progress'\n | 'q'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'search'\n | 'slot'\n | 'script'\n | 'section'\n | 'select'\n | 'small'\n | 'source'\n | 'span'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'table'\n | 'template'\n | 'tbody'\n | 'td'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'u'\n | 'ul'\n | 'var'\n | 'video'\n | 'wbr'\n | 'webview'\n | 'svg'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'circle'\n | 'clipPath'\n | 'defs'\n | 'ellipse'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'filter'\n | 'foreignObject'\n | 'g'\n | 'image'\n | 'line'\n | 'linearGradient'\n | 'marker'\n | 'mask'\n | 'metadata'\n | 'mpath'\n | 'path'\n | 'pattern'\n | 'polygon'\n | 'polyline'\n | 'radialGradient'\n | 'rect'\n | 'set'\n | 'stop'\n | 'switch'\n | 'text'\n | 'textPath'\n | 'tspan'\n | 'use'\n | 'view'\n | ComponentClass\n | FunctionComponent", + "formattedType": "| 'a'\n | 'abbr'\n | 'address'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'circle'\n | 'cite'\n | 'clipPath'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'defs'\n | 'del'\n | 'desc'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'ellipse'\n | 'em'\n | 'embed'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'filter'\n | 'footer'\n | 'foreignObject'\n | 'form'\n | 'g'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'image'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'label'\n | 'legend'\n | 'li'\n | 'line'\n | 'linearGradient'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'marker'\n | 'mask'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'metadata'\n | 'meter'\n | 'mpath'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'object'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'path'\n | 'pattern'\n | 'picture'\n | 'polygon'\n | 'polyline'\n | 'pre'\n | 'progress'\n | 'q'\n | 'radialGradient'\n | 'rect'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'script'\n | 'search'\n | 'section'\n | 'select'\n | 'set'\n | 'slot'\n | 'small'\n | 'source'\n | 'span'\n | 'stop'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'svg'\n | 'switch'\n | 'symbol'\n | 'table'\n | 'tbody'\n | 'td'\n | 'template'\n | 'text'\n | 'textPath'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'tspan'\n | 'u'\n | 'ul'\n | 'use'\n | 'var'\n | 'video'\n | 'view'\n | 'wbr'\n | 'webview'\n | ComponentClass\n | FunctionComponent\n | ReactElement", "required": false }, { @@ -94,7 +94,7 @@ { "name": "icon", "type": "ReactElement> | ElementType | undefined", - "formattedType": "| 'symbol'\n | 'object'\n | 'desc'\n | 'label'\n | ReactElement\n | 'a'\n | 'abbr'\n | 'address'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'cite'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'del'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'em'\n | 'embed'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'footer'\n | 'form'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'legend'\n | 'li'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'meter'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'picture'\n | 'pre'\n | 'progress'\n | 'q'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'search'\n | 'slot'\n | 'script'\n | 'section'\n | 'select'\n | 'small'\n | 'source'\n | 'span'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'table'\n | 'template'\n | 'tbody'\n | 'td'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'u'\n | 'ul'\n | 'var'\n | 'video'\n | 'wbr'\n | 'webview'\n | 'svg'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'circle'\n | 'clipPath'\n | 'defs'\n | 'ellipse'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'filter'\n | 'foreignObject'\n | 'g'\n | 'image'\n | 'line'\n | 'linearGradient'\n | 'marker'\n | 'mask'\n | 'metadata'\n | 'mpath'\n | 'path'\n | 'pattern'\n | 'polygon'\n | 'polyline'\n | 'radialGradient'\n | 'rect'\n | 'set'\n | 'stop'\n | 'switch'\n | 'text'\n | 'textPath'\n | 'tspan'\n | 'use'\n | 'view'\n | ComponentClass\n | FunctionComponent", + "formattedType": "| 'a'\n | 'abbr'\n | 'address'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'circle'\n | 'cite'\n | 'clipPath'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'defs'\n | 'del'\n | 'desc'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'ellipse'\n | 'em'\n | 'embed'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'filter'\n | 'footer'\n | 'foreignObject'\n | 'form'\n | 'g'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'image'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'label'\n | 'legend'\n | 'li'\n | 'line'\n | 'linearGradient'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'marker'\n | 'mask'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'metadata'\n | 'meter'\n | 'mpath'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'object'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'path'\n | 'pattern'\n | 'picture'\n | 'polygon'\n | 'polyline'\n | 'pre'\n | 'progress'\n | 'q'\n | 'radialGradient'\n | 'rect'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'script'\n | 'search'\n | 'section'\n | 'select'\n | 'set'\n | 'slot'\n | 'small'\n | 'source'\n | 'span'\n | 'stop'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'svg'\n | 'switch'\n | 'symbol'\n | 'table'\n | 'tbody'\n | 'td'\n | 'template'\n | 'text'\n | 'textPath'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'tspan'\n | 'u'\n | 'ul'\n | 'use'\n | 'var'\n | 'video'\n | 'view'\n | 'wbr'\n | 'webview'\n | ComponentClass\n | FunctionComponent\n | ReactElement", "required": false } ] @@ -107,17 +107,17 @@ "ColumnDataType": { "name": "ColumnDataType", "kind": "typealias", - "definition": "/* The column value is a string that should be searchable. */\n'text' | 'number' | 'bigint' | 'date' | 'boolean'\n/* The column value can be a single value from a list of options. */\n | 'option'\n/* The column value can be zero or more values from a list of options. */\n | 'multiOption'" + "definition": "/* The column value is a string that should be searchable. */\n| 'text'\n| 'number'\n| 'bigint'\n| 'date'\n| 'boolean'\n/* The column value can be a single value from a list of options. */\n| 'option'\n/* The column value can be zero or more values from a list of options. */\n| 'multiOption'" }, "OptionBasedColumnDataType": { "name": "OptionBasedColumnDataType", "kind": "typealias", - "definition": "Extract" + "definition": "Extract<\n ColumnDataType,\n 'option' | 'multiOption'\n>" }, "ColumnDataNativeMap": { "name": "ColumnDataNativeMap", "kind": "typealias", - "definition": "{\n text: string;\n number: number;\n bigint: bigint;\n date: Date;\n boolean: boolean;\n option: string;\n multiOption: string[];\n}", + "definition": "{\n text: string\n number: number\n bigint: bigint\n date: Date\n boolean: boolean\n option: string\n multiOption: string[]\n}", "props": [ { "name": "text", @@ -166,7 +166,7 @@ "constraint": "ColumnDataType" } ], - "definition": "Array>" + "definition": "Array<\n ElementType\n>" }, "TAccessorFn": { "name": "TAccessorFn", @@ -191,7 +191,7 @@ "default": "unknown" } ], - "definition": "(value: ElementType>) => ColumnOption" + "definition": "(\n value: ElementType>,\n) => ColumnOption" }, "TOrderFns": { "name": "TOrderFns", @@ -211,7 +211,7 @@ "TBuiltInOrderFn": { "name": "TBuiltInOrderFn", "kind": "typealias", - "definition": "(a: ColumnOption, b: ColumnOption, direction: OrderDirection) => number" + "definition": "(\n a: ColumnOption,\n b: ColumnOption,\n direction: OrderDirection,\n) => number" }, "TOrderFnArg": { "name": "TOrderFnArg", @@ -255,7 +255,7 @@ "default": "string" } ], - "definition": "{\n id: TId;\n accessor: TAccessorFn;\n displayName: string;\n icon?: React.ReactElement | React.ElementType;\n type: TType;\n hidden?: boolean;\n options?: TType extends OptionBasedColumnDataType ? ColumnOption[] : never;\n facetedOptions?: TType extends OptionBasedColumnDataType ? Map : never;\n min?: TType extends 'number' ? number : TType extends 'bigint' ? bigint : never;\n max?: TType extends 'number' ? number : TType extends 'bigint' ? bigint : never;\n transformValueToOptionFn?: TType extends OptionBasedColumnDataType ? TTransformValueToOptionFn : never;\n orderFn?: TType extends OptionBasedColumnDataType ? TOrderFns : never;\n transformOptionsFn?: TType extends OptionBasedColumnDataType ? TTransformOptionsFn : never;\n toggledStateName?: TType extends 'boolean' ? string : never;\n meta?: ColumnMeta;\n}", + "definition": "{\n id: TId\n accessor: TAccessorFn\n displayName: string\n icon?: React.ReactElement | React.ElementType\n type: TType\n hidden?: boolean\n options?: TType extends OptionBasedColumnDataType ? ColumnOption[] : never\n facetedOptions?: TType extends OptionBasedColumnDataType\n ? Map\n : never\n min?: TType extends 'number'\n ? number\n : TType extends 'bigint'\n ? bigint\n : never\n max?: TType extends 'number'\n ? number\n : TType extends 'bigint'\n ? bigint\n : never\n transformValueToOptionFn?: TType extends OptionBasedColumnDataType\n ? TTransformValueToOptionFn\n : never\n orderFn?: TType extends OptionBasedColumnDataType ? TOrderFns : never\n transformOptionsFn?: TType extends OptionBasedColumnDataType\n ? TTransformOptionsFn\n : never\n toggledStateName?: TType extends 'boolean' ? string : never\n meta?: ColumnMeta\n}", "props": [ { "name": "id", @@ -276,7 +276,7 @@ { "name": "icon", "type": "ReactElement> | ElementType | undefined", - "formattedType": "| 'symbol'\n | 'object'\n | 'desc'\n | 'label'\n | ReactElement\n | 'a'\n | 'abbr'\n | 'address'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'cite'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'del'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'em'\n | 'embed'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'footer'\n | 'form'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'legend'\n | 'li'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'meter'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'picture'\n | 'pre'\n | 'progress'\n | 'q'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'search'\n | 'slot'\n | 'script'\n | 'section'\n | 'select'\n | 'small'\n | 'source'\n | 'span'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'table'\n | 'template'\n | 'tbody'\n | 'td'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'u'\n | 'ul'\n | 'var'\n | 'video'\n | 'wbr'\n | 'webview'\n | 'svg'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'circle'\n | 'clipPath'\n | 'defs'\n | 'ellipse'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'filter'\n | 'foreignObject'\n | 'g'\n | 'image'\n | 'line'\n | 'linearGradient'\n | 'marker'\n | 'mask'\n | 'metadata'\n | 'mpath'\n | 'path'\n | 'pattern'\n | 'polygon'\n | 'polyline'\n | 'radialGradient'\n | 'rect'\n | 'set'\n | 'stop'\n | 'switch'\n | 'text'\n | 'textPath'\n | 'tspan'\n | 'use'\n | 'view'\n | ComponentClass\n | FunctionComponent", + "formattedType": "| 'a'\n | 'abbr'\n | 'address'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'circle'\n | 'cite'\n | 'clipPath'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'defs'\n | 'del'\n | 'desc'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'ellipse'\n | 'em'\n | 'embed'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'filter'\n | 'footer'\n | 'foreignObject'\n | 'form'\n | 'g'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'image'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'label'\n | 'legend'\n | 'li'\n | 'line'\n | 'linearGradient'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'marker'\n | 'mask'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'metadata'\n | 'meter'\n | 'mpath'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'object'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'path'\n | 'pattern'\n | 'picture'\n | 'polygon'\n | 'polyline'\n | 'pre'\n | 'progress'\n | 'q'\n | 'radialGradient'\n | 'rect'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'script'\n | 'search'\n | 'section'\n | 'select'\n | 'set'\n | 'slot'\n | 'small'\n | 'source'\n | 'span'\n | 'stop'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'svg'\n | 'switch'\n | 'symbol'\n | 'table'\n | 'tbody'\n | 'td'\n | 'template'\n | 'text'\n | 'textPath'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'tspan'\n | 'u'\n | 'ul'\n | 'use'\n | 'var'\n | 'video'\n | 'view'\n | 'wbr'\n | 'webview'\n | ComponentClass\n | FunctionComponent\n | ReactElement", "required": false }, { @@ -356,7 +356,7 @@ "name": "T" } ], - "definition": "T extends ColumnConfig ? TId : never" + "definition": "T extends ColumnConfig\n ? TId\n : never" }, "OptionColumnIds": { "name": "OptionColumnIds", @@ -367,7 +367,7 @@ "constraint": "ReadonlyArray>" } ], - "definition": "{\n [K in keyof T]: OptionColumnId;\n}[number]" + "definition": "{\n [K in keyof T]: OptionColumnId\n}[number]" }, "NumberColumnId": { "name": "NumberColumnId", @@ -388,7 +388,7 @@ "constraint": "ReadonlyArray>" } ], - "definition": "{\n [K in keyof T]: NumberColumnId;\n}[number]" + "definition": "{\n [K in keyof T]: NumberColumnId\n}[number]" }, "BigIntColumnId": { "name": "BigIntColumnId", @@ -409,7 +409,7 @@ "constraint": "ReadonlyArray>" } ], - "definition": "{\n [K in keyof T]: BigIntColumnId;\n}[number]" + "definition": "{\n [K in keyof T]: BigIntColumnId\n}[number]" }, "ColumnConfigHelper": { "name": "ColumnConfigHelper", @@ -419,7 +419,7 @@ "name": "TData" } ], - "definition": "{\n accessor: , TType extends ColumnDataType, TVal extends ReturnType>(accessor: TAccessor, config?: Omit, 'accessor'>) => ColumnConfig;\n}", + "definition": "{\n accessor: <\n TAccessor extends TAccessorFn,\n TType extends ColumnDataType,\n TVal extends ReturnType,\n >(\n accessor: TAccessor,\n config?: Omit, 'accessor'>,\n ) => ColumnConfig\n}", "props": [ { "name": "accessor", @@ -436,7 +436,7 @@ "name": "TData" } ], - "definition": "{\n data: TData[];\n columns: ColumnConfig[];\n}", + "definition": "{\n data: TData[]\n columns: ColumnConfig[]\n}", "props": [ { "name": "data", @@ -460,7 +460,7 @@ "constraint": "ColumnDataType" } ], - "definition": "T extends 'number' ? [number, number] | undefined : T extends 'bigint' ? [bigint, bigint] | undefined : undefined" + "definition": "T extends 'number'\n ? [number, number] | undefined\n : T extends 'bigint'\n ? [bigint, bigint] | undefined\n : undefined" }, "ColumnProperties": { "name": "ColumnProperties", @@ -477,7 +477,7 @@ "name": "TVal" } ], - "definition": "{\n getOptions: () => ColumnOption[];\n getValues: () => ElementType>[];\n getFacetedUniqueValues: () => Map | undefined;\n getFacetedMinMaxValues: () => MinMaxReturn;\n prefetchOptions: () => Promise; // Prefetch options\n prefetchValues: () => Promise; // Prefetch values\n prefetchFacetedUniqueValues: () => Promise; // Prefetch faceted unique values\n prefetchFacetedMinMaxValues: () => Promise; // Prefetch faceted min/max values\n}", + "definition": "{\n getOptions: () => ColumnOption[]\n getValues: () => ElementType>[]\n getFacetedUniqueValues: () => Map | undefined\n getFacetedMinMaxValues: () => MinMaxReturn\n prefetchOptions: () => Promise // Prefetch options\n prefetchValues: () => Promise // Prefetch values\n prefetchFacetedUniqueValues: () => Promise // Prefetch faceted unique values\n prefetchFacetedMinMaxValues: () => Promise // Prefetch faceted min/max values\n}", "props": [ { "name": "getOptions", @@ -533,7 +533,7 @@ "name": "TVal" } ], - "definition": "{\n _prefetchedOptionsCache: ColumnOption[] | null;\n _prefetchedValuesCache: ElementType>[] | null;\n _prefetchedFacetedUniqueValuesCache: Map | null;\n _prefetchedFacetedMinMaxValuesCache: [number, number] | null;\n}", + "definition": "{\n _prefetchedOptionsCache: ColumnOption[] | null\n _prefetchedValuesCache: ElementType>[] | null\n _prefetchedFacetedUniqueValuesCache: Map | null\n _prefetchedFacetedMinMaxValuesCache: [number, number] | null\n}", "props": [ { "name": "_prefetchedOptionsCache", @@ -580,7 +580,7 @@ "default": "unknown" } ], - "definition": "ColumnConfig & ColumnProperties & ColumnPrivateProperties", + "definition": "ColumnConfig &\n ColumnProperties &\n ColumnPrivateProperties", "props": [ { "name": "id", @@ -601,7 +601,7 @@ { "name": "icon", "type": "ReactElement> | ElementType | undefined", - "formattedType": "| 'symbol'\n | 'object'\n | 'desc'\n | 'label'\n | ReactElement\n | 'a'\n | 'abbr'\n | 'address'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'cite'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'del'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'em'\n | 'embed'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'footer'\n | 'form'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'legend'\n | 'li'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'meter'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'picture'\n | 'pre'\n | 'progress'\n | 'q'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'search'\n | 'slot'\n | 'script'\n | 'section'\n | 'select'\n | 'small'\n | 'source'\n | 'span'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'table'\n | 'template'\n | 'tbody'\n | 'td'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'u'\n | 'ul'\n | 'var'\n | 'video'\n | 'wbr'\n | 'webview'\n | 'svg'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'circle'\n | 'clipPath'\n | 'defs'\n | 'ellipse'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'filter'\n | 'foreignObject'\n | 'g'\n | 'image'\n | 'line'\n | 'linearGradient'\n | 'marker'\n | 'mask'\n | 'metadata'\n | 'mpath'\n | 'path'\n | 'pattern'\n | 'polygon'\n | 'polyline'\n | 'radialGradient'\n | 'rect'\n | 'set'\n | 'stop'\n | 'switch'\n | 'text'\n | 'textPath'\n | 'tspan'\n | 'use'\n | 'view'\n | ComponentClass\n | FunctionComponent", + "formattedType": "| 'a'\n | 'abbr'\n | 'address'\n | 'animate'\n | 'animateMotion'\n | 'animateTransform'\n | 'area'\n | 'article'\n | 'aside'\n | 'audio'\n | 'b'\n | 'base'\n | 'bdi'\n | 'bdo'\n | 'big'\n | 'blockquote'\n | 'body'\n | 'br'\n | 'button'\n | 'canvas'\n | 'caption'\n | 'center'\n | 'circle'\n | 'cite'\n | 'clipPath'\n | 'code'\n | 'col'\n | 'colgroup'\n | 'data'\n | 'datalist'\n | 'dd'\n | 'defs'\n | 'del'\n | 'desc'\n | 'details'\n | 'dfn'\n | 'dialog'\n | 'div'\n | 'dl'\n | 'dt'\n | 'ellipse'\n | 'em'\n | 'embed'\n | 'feBlend'\n | 'feColorMatrix'\n | 'feComponentTransfer'\n | 'feComposite'\n | 'feConvolveMatrix'\n | 'feDiffuseLighting'\n | 'feDisplacementMap'\n | 'feDistantLight'\n | 'feDropShadow'\n | 'feFlood'\n | 'feFuncA'\n | 'feFuncB'\n | 'feFuncG'\n | 'feFuncR'\n | 'feGaussianBlur'\n | 'feImage'\n | 'feMerge'\n | 'feMergeNode'\n | 'feMorphology'\n | 'feOffset'\n | 'fePointLight'\n | 'feSpecularLighting'\n | 'feSpotLight'\n | 'feTile'\n | 'feTurbulence'\n | 'fieldset'\n | 'figcaption'\n | 'figure'\n | 'filter'\n | 'footer'\n | 'foreignObject'\n | 'form'\n | 'g'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'head'\n | 'header'\n | 'hgroup'\n | 'hr'\n | 'html'\n | 'i'\n | 'iframe'\n | 'image'\n | 'img'\n | 'input'\n | 'ins'\n | 'kbd'\n | 'keygen'\n | 'label'\n | 'legend'\n | 'li'\n | 'line'\n | 'linearGradient'\n | 'link'\n | 'main'\n | 'map'\n | 'mark'\n | 'marker'\n | 'mask'\n | 'menu'\n | 'menuitem'\n | 'meta'\n | 'metadata'\n | 'meter'\n | 'mpath'\n | 'nav'\n | 'noindex'\n | 'noscript'\n | 'object'\n | 'ol'\n | 'optgroup'\n | 'option'\n | 'output'\n | 'p'\n | 'param'\n | 'path'\n | 'pattern'\n | 'picture'\n | 'polygon'\n | 'polyline'\n | 'pre'\n | 'progress'\n | 'q'\n | 'radialGradient'\n | 'rect'\n | 'rp'\n | 'rt'\n | 'ruby'\n | 's'\n | 'samp'\n | 'script'\n | 'search'\n | 'section'\n | 'select'\n | 'set'\n | 'slot'\n | 'small'\n | 'source'\n | 'span'\n | 'stop'\n | 'strong'\n | 'style'\n | 'sub'\n | 'summary'\n | 'sup'\n | 'svg'\n | 'switch'\n | 'symbol'\n | 'table'\n | 'tbody'\n | 'td'\n | 'template'\n | 'text'\n | 'textPath'\n | 'textarea'\n | 'tfoot'\n | 'th'\n | 'thead'\n | 'time'\n | 'title'\n | 'tr'\n | 'track'\n | 'tspan'\n | 'u'\n | 'ul'\n | 'use'\n | 'var'\n | 'video'\n | 'view'\n | 'wbr'\n | 'webview'\n | ComponentClass\n | FunctionComponent\n | ReactElement", "required": false }, { @@ -928,7 +928,7 @@ "NumberFilterOperator": { "name": "NumberFilterOperator", "kind": "typealias", - "definition": "'is' | 'is not' | 'is less than' | 'is greater than or equal to' | 'is greater than' | 'is less than or equal to' | 'is between' | 'is not between'" + "definition": "| 'is'\n| 'is not'\n| 'is less than'\n| 'is greater than or equal to'\n| 'is greater than'\n| 'is less than or equal to'\n| 'is between'\n| 'is not between'" }, "BigIntFilterOperator": { "name": "BigIntFilterOperator", @@ -938,7 +938,7 @@ "DateFilterOperator": { "name": "DateFilterOperator", "kind": "typealias", - "definition": "'is' | 'is not' | 'is before' | 'is on or after' | 'is after' | 'is on or before' | 'is between' | 'is not between'" + "definition": "| 'is'\n| 'is not'\n| 'is before'\n| 'is on or after'\n| 'is after'\n| 'is on or before'\n| 'is between'\n| 'is not between'" }, "BooleanFilterOperator": { "name": "BooleanFilterOperator", @@ -953,12 +953,12 @@ "MultiOptionFilterOperator": { "name": "MultiOptionFilterOperator", "kind": "typealias", - "definition": "'include' | 'exclude' | 'include any of' | 'include all of' | 'exclude if any of' | 'exclude if all'" + "definition": "| 'include'\n| 'exclude'\n| 'include any of'\n| 'include all of'\n| 'exclude if any of'\n| 'exclude if all'" }, "FilterOperators": { "name": "FilterOperators", "kind": "typealias", - "definition": "{\n text: TextFilterOperator;\n number: NumberFilterOperator;\n bigint: BigIntFilterOperator;\n date: DateFilterOperator;\n boolean: BooleanFilterOperator;\n option: OptionFilterOperator;\n multiOption: MultiOptionFilterOperator;\n}", + "definition": "{\n text: TextFilterOperator\n number: NumberFilterOperator\n bigint: BigIntFilterOperator\n date: DateFilterOperator\n boolean: BooleanFilterOperator\n option: OptionFilterOperator\n multiOption: MultiOptionFilterOperator\n}", "props": [ { "name": "text", @@ -970,21 +970,21 @@ { "name": "number", "type": "NumberFilterOperator", - "formattedType": "| 'is'\n | 'is not'\n | 'is less than'\n | 'is greater than or equal to'\n | 'is greater than'\n | 'is less than or equal to'\n | 'is between'\n | 'is not between'", + "formattedType": "| 'is'\n | 'is between'\n | 'is greater than'\n | 'is greater than or equal to'\n | 'is less than'\n | 'is less than or equal to'\n | 'is not'\n | 'is not between'", "required": true, "referencePath": "@bazza-ui/filters.NumberFilterOperator" }, { "name": "bigint", "type": "NumberFilterOperator", - "formattedType": "| 'is'\n | 'is not'\n | 'is less than'\n | 'is greater than or equal to'\n | 'is greater than'\n | 'is less than or equal to'\n | 'is between'\n | 'is not between'", + "formattedType": "| 'is'\n | 'is between'\n | 'is greater than'\n | 'is greater than or equal to'\n | 'is less than'\n | 'is less than or equal to'\n | 'is not'\n | 'is not between'", "required": true, "referencePath": "@bazza-ui/filters.NumberFilterOperator" }, { "name": "date", "type": "DateFilterOperator", - "formattedType": "| 'is'\n | 'is not'\n | 'is between'\n | 'is not between'\n | 'is before'\n | 'is on or after'\n | 'is after'\n | 'is on or before'", + "formattedType": "| 'is'\n | 'is after'\n | 'is before'\n | 'is between'\n | 'is not'\n | 'is not between'\n | 'is on or after'\n | 'is on or before'", "required": true, "referencePath": "@bazza-ui/filters.DateFilterOperator" }, @@ -998,14 +998,14 @@ { "name": "option", "type": "OptionFilterOperator", - "formattedType": "\"is\" | \"is not\" | \"is any of\" | \"is none of\"", + "formattedType": "\"is\" | \"is any of\" | \"is none of\" | \"is not\"", "required": true, "referencePath": "@bazza-ui/filters.OptionFilterOperator" }, { "name": "multiOption", "type": "MultiOptionFilterOperator", - "formattedType": "| 'include'\n | 'exclude'\n | 'include any of'\n | 'include all of'\n | 'exclude if any of'\n | 'exclude if all'", + "formattedType": "| 'exclude'\n | 'exclude if all'\n | 'exclude if any of'\n | 'include'\n | 'include all of'\n | 'include any of'", "required": true, "referencePath": "@bazza-ui/filters.MultiOptionFilterOperator" } @@ -1021,7 +1021,7 @@ "default": "any" } ], - "definition": "{\n columnId: string;\n type: TType;\n operator: FilterOperators[TType];\n values: FilterValues;\n}", + "definition": "{\n columnId: string\n type: TType\n operator: FilterOperators[TType]\n values: FilterValues\n}", "props": [ { "name": "columnId", @@ -1062,7 +1062,7 @@ "constraint": "ColumnDataType" } ], - "definition": "{\n [key in FilterOperators[T]]: FilterOperatorDetails;\n}" + "definition": "{\n [key in FilterOperators[T]]: FilterOperatorDetails\n}" }, "FilterOperatorTarget": { "name": "FilterOperatorTarget", @@ -1081,7 +1081,7 @@ "constraint": "ColumnDataType" } ], - "definition": "{\n /* The i18n key for the operator. */\n key: string;\n /* The operator value. Usually the string representation of the operator. */\n value: OperatorValue;\n /* How much data the operator applies to. */\n target: FilterOperatorTarget;\n /* The plural form of the operator, if applicable. */\n singularOf?: FilterOperators[T];\n /* The singular form of the operator, if applicable. */\n pluralOf?: FilterOperators[T];\n /* All related operators. Normally, all the operators which share the same target. */\n relativeOf: FilterOperators[T] | Array;\n /* Whether the operator is negated. */\n isNegated: boolean;\n /* If the operator is not negated, this provides the negated equivalent. */\n negation?: FilterOperators[T];\n /* If the operator is negated, this provides the positive equivalent. */\n negationOf?: FilterOperators[T];\n}", + "definition": "{\n /* The i18n key for the operator. */\n key: string\n /* The operator value. Usually the string representation of the operator. */\n value: OperatorValue\n /* How much data the operator applies to. */\n target: FilterOperatorTarget\n /* The plural form of the operator, if applicable. */\n singularOf?: FilterOperators[T]\n /* The singular form of the operator, if applicable. */\n pluralOf?: FilterOperators[T]\n /* All related operators. Normally, all the operators which share the same target. */\n relativeOf: FilterOperators[T] | Array\n /* Whether the operator is negated. */\n isNegated: boolean\n /* If the operator is not negated, this provides the negated equivalent. */\n negation?: FilterOperators[T]\n /* If the operator is negated, this provides the positive equivalent. */\n negationOf?: FilterOperators[T]\n}", "props": [ { "name": "key", @@ -1096,7 +1096,7 @@ { "name": "target", "type": "FilterOperatorTarget", - "formattedType": "\"single\" | \"multiple\"", + "formattedType": "\"multiple\" | \"single\"", "required": true, "referencePath": "@bazza-ui/filters.FilterOperatorTarget" }, @@ -1116,7 +1116,7 @@ }, { "name": "relativeOf", - "type": "FilterOperators[T] | FilterOperators[T][]", + "type": "FilterOperators[T][] | FilterOperators[T]", "required": true, "referencePath": "@bazza-ui/filters.FilterOperators" }, @@ -1154,18 +1154,13 @@ "constraint": "ColumnDataType" } ], - "definition": "FilterOperatorDetailsBase & ({\n singularOf?: never;\n pluralOf?: never;\n} | {\n target: 'single';\n singularOf: FilterOperators[T];\n pluralOf?: never;\n} | {\n target: 'multiple';\n singularOf?: never;\n pluralOf: FilterOperators[T];\n}) & ({\n isNegated: false;\n negation: FilterOperators[T];\n negationOf?: never;\n} | {\n isNegated: true;\n negation?: never;\n negationOf: FilterOperators[T];\n})" + "definition": "FilterOperatorDetailsBase &\n (\n | { singularOf?: never; pluralOf?: never }\n | { target: 'single'; singularOf: FilterOperators[T]; pluralOf?: never }\n | { target: 'multiple'; singularOf?: never; pluralOf: FilterOperators[T] }\n ) &\n (\n | { isNegated: false; negation: FilterOperators[T]; negationOf?: never }\n | { isNegated: true; negation?: never; negationOf: FilterOperators[T] }\n )" }, "FilterTypeOperatorDetails": { "name": "FilterTypeOperatorDetails", "kind": "typealias", - "definition": "{\n [key in ColumnDataType]: FilterDetails;\n}", + "definition": "{\n [key in ColumnDataType]: FilterDetails\n}", "props": [ - { - "name": "number", - "type": "FilterDetails<\"number\">", - "required": true - }, { "name": "bigint", "type": "FilterDetails<\"bigint\">", @@ -1177,23 +1172,28 @@ "required": true }, { - "name": "option", - "type": "FilterDetails<\"option\">", + "name": "date", + "type": "FilterDetails<\"date\">", "required": true }, { - "name": "text", - "type": "FilterDetails<\"text\">", + "name": "multiOption", + "type": "FilterDetails<\"multiOption\">", "required": true }, { - "name": "date", - "type": "FilterDetails<\"date\">", + "name": "number", + "type": "FilterDetails<\"number\">", "required": true }, { - "name": "multiOption", - "type": "FilterDetails<\"multiOption\">", + "name": "option", + "type": "FilterDetails<\"option\">", + "required": true + }, + { + "name": "text", + "type": "FilterDetails<\"text\">", "required": true } ] @@ -1208,7 +1208,7 @@ } ], "doc": "Faceted data for columns - provides pre-computed aggregation data.\n- Option/MultiOption columns: Map of value -> count\n- Number columns: [min, max] tuple\n- BigInt columns: [min, max] tuple", - "definition": "Partial, Map | undefined> | Record, [number, number] | undefined> | Record, [bigint, bigint] | undefined>>" + "definition": "Partial<\n | Record, Map | undefined>\n | Record, [number, number] | undefined>\n | Record, [bigint, bigint] | undefined>\n>" }, "DataTableFiltersOptions": { "name": "DataTableFiltersOptions", @@ -1276,7 +1276,7 @@ { "name": "faceted", "type": "FacetedColumnData | undefined", - "formattedType": "| Partial<\n Record<\n OptionColumnIds,\n Map | undefined\n >\n >\n | Partial<\n Record<\n NumberColumnIds,\n [number, number] | undefined\n >\n >\n | Partial<\n Record<\n BigIntColumnIds,\n [bigint, bigint] | undefined\n >\n >", + "formattedType": "| Partial<\n Record<\n BigIntColumnIds,\n [bigint, bigint] | undefined\n >\n >\n | Partial<\n Record<\n NumberColumnIds,\n [number, number] | undefined\n >\n >\n | Partial<\n Record<\n OptionColumnIds,\n Map | undefined\n >\n >", "required": false, "referencePath": "@bazza-ui/filters.FacetedColumnData" }, @@ -1376,8 +1376,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxClearState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.Clear.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxClearState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.Clear.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1426,7 +1426,7 @@ "name": "side", "type": "Side", "shortType": "Side", - "formattedType": "\"left\" | \"right\" | \"bottom\" | \"top\"", + "formattedType": "\"bottom\" | \"left\" | \"right\" | \"top\"", "required": true, "description": "The side of the popup relative to the input." }, @@ -1466,7 +1466,7 @@ { "name": "cursorBehavior", "type": "ComboboxInputCursorBehavior | undefined", - "formattedType": "\"none\" | \"end\" | \"select-all\"", + "formattedType": "\"end\" | \"none\" | \"select-all\"", "required": false, "description": "Cursor behavior when the combobox popup opens.\n- `'none'` - Don't move the cursor (cursor appears where clicked)\n- `'end'` - Move cursor to the end of the input\n- `'select-all'` - Move cursor to the end and select all text", "default": "'none'", @@ -1488,8 +1488,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxInputState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.Input.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxInputState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.Input.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1542,8 +1542,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxInputWrapperState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.InputWrapper.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxInputWrapperState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.InputWrapper.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1631,8 +1631,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1717,8 +1717,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.ItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.ItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1757,8 +1757,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ComboboxItemLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Combobox.ItemLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ComboboxItemLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Combobox.ItemLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -1793,8 +1793,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -1983,14 +1983,14 @@ { "name": "items", "type": "Items | undefined", - "formattedType": "Record | ItemsEntry[]", + "formattedType": "ItemsEntry[] | Record", "required": false, "description": "Data structure of the items rendered in the combobox popup.\nWhen specified, the input shows the label of the selected item\ninstead of the raw value.\n\nCan be a record mapping values to labels, or an array of\n`{ value, label, keywords? }` objects. Only the array form can express\n`keywords` (extra filter terms) or a `null` (clearable) value." }, { "name": "modal", - "type": "boolean | \"trap-focus\" | undefined", - "formattedType": "false | true | \"trap-focus\"", + "type": "\"trap-focus\" | boolean | undefined", + "formattedType": "\"trap-focus\" | false | true", "required": false, "description": "Determines if the combobox enters a modal state when open.\n\n- `true`: user interaction is limited to the combobox: document page scroll\n is locked, and pointer interactions on outside elements are disabled.\n- `false`: user interaction with the rest of the document is allowed.\n- `'trap-focus'`: focus is trapped inside the combobox, but document page\n scroll is not locked and pointer interactions outside of it remain enabled.", "default": "false" @@ -2078,19 +2078,12 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", "required": false, "description": "Whether to clear the search query when the combobox closes.\n- `true`: clear immediately when the combobox closes (default)\n- `false`: preserve search when the combobox closes\n- `'after-exit'`: clear after exit animation completes", "default": "true" }, - { - "name": "search", - "type": "string | undefined", - "formattedType": "string", - "required": false, - "description": "Controlled search value." - }, { "name": "style", "type": "CSSProperties | (CSSProperties & ((state: PopupMenuSurfaceState) => CSSProperties | undefined)) | undefined", @@ -2098,21 +2091,6 @@ "required": false, "description": "Style applied to the element, or a function that\nreturns a style object based on the component's state." }, - { - "name": "filter", - "type": "false | FilterFn | undefined", - "formattedType": "false | FilterFn", - "required": false, - "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", - "default": "commandScore (fuzzy matching)" - }, - { - "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", - "required": false, - "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity." - }, { "name": "className", "type": "string | ((state: PopupMenuSurfaceState) => string | undefined) | undefined", @@ -2121,54 +2099,41 @@ "description": "CSS class applied to the element, or a function that\nreturns a class based on the component's state." }, { - "name": "normalizeSearch", - "type": "SearchNormalizer | undefined", - "formattedType": "SearchNormalizer", - "required": false, - "description": "Transforms search input before filtering and visibility logic.", - "default": "trim whitespace (`search.trim()`)" - }, - { - "name": "loop", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "render", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", "required": false, - "description": "Whether navigation should loop from last to first item and vice versa.", - "default": "true" + "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { - "name": "resetScrollOnSearch", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "content", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, - "description": "Whether to reset the list scroll position when the search query changes.", - "default": "true" + "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity." }, { - "name": "onSearchChange", - "type": "((search: string) => void) | undefined", - "formattedType": "(search: string) => void", + "name": "asyncContent", + "type": "AsyncLoaderConfig | undefined", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, - "description": "Callback when search value changes." + "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`." }, { - "name": "orderedItems", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "asyncContentMode", + "type": "AsyncContentMode | undefined", + "formattedType": "\"append\" | \"replace\"", "required": false, - "description": "Ordered list of item values when using `filter={false}`.\nThis tells the store the intended display order for navigation/highlighting.\nRequired when `filter={false}` - must always be provided with the current visible items." - }, - { - "name": "children", - "type": "ReactNode", - "required": true + "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", + "default": "'replace'" }, { - "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", + "name": "asyncContentReveal", + "type": "AsyncResultBehavior | undefined", + "formattedType": "\"block\" | \"stream\"", "required": false, - "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." + "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", + "default": "'stream'" }, { "name": "deepSearch", @@ -2180,33 +2145,40 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", "default": "true" }, { - "name": "asyncContent", - "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "name": "filter", + "type": "false | FilterFn | undefined", + "formattedType": "false | FilterFn", "required": false, - "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`." + "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", + "default": "commandScore (fuzzy matching)" }, { - "name": "asyncContentMode", - "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "name": "normalizeSearch", + "type": "SearchNormalizer | undefined", + "formattedType": "SearchNormalizer", "required": false, - "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", - "default": "'replace'" + "description": "Transforms search input before filtering and visibility logic.", + "default": "trim whitespace (`search.trim()`)" }, { - "name": "asyncContentReveal", - "type": "AsyncResultBehavior | undefined", - "formattedType": "\"block\" | \"stream\"", + "name": "search", + "type": "string | undefined", + "formattedType": "string", "required": false, - "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", - "default": "'stream'" + "description": "Controlled search value." + }, + { + "name": "onSearchChange", + "type": "((search: string) => void) | undefined", + "formattedType": "(search: string) => void", + "required": false, + "description": "Callback when search value changes." }, { "name": "defaultSearch", @@ -2216,6 +2188,22 @@ "description": "Default search value for uncontrolled usage.", "default": "''" }, + { + "name": "loop", + "type": "boolean | undefined", + "formattedType": "false | true", + "required": false, + "description": "Whether navigation should loop from last to first item and vice versa.", + "default": "true" + }, + { + "name": "resetScrollOnSearch", + "type": "boolean | undefined", + "formattedType": "false | true", + "required": false, + "description": "Whether to reset the list scroll position when the search query changes.", + "default": "true" + }, { "name": "skipAutoFocus", "type": "boolean | undefined", @@ -2223,6 +2211,19 @@ "required": false, "description": "Whether to skip auto-focusing the input/list when this surface becomes the focus owner.\nUseful for Combobox where the input is outside the popup and should retain focus.", "default": "false" + }, + { + "name": "orderedItems", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Ordered list of item values when using `filter={false}`.\nThis tells the store the intended display order for navigation/highlighting.\nRequired when `filter={false}` - must always be provided with the current visible items." + }, + { + "name": "children", + "type": "ReactNode", + "required": true, + "description": "Children (Input, List, etc.)" } ] }, @@ -2239,8 +2240,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -2259,8 +2260,8 @@ "props": [ { "name": "showOn", - "type": "\"open\" | \"focus\" | undefined", - "formattedType": "\"open\" | \"focus\"", + "type": "\"focus\" | \"open\" | undefined", + "formattedType": "\"focus\" | \"open\"", "required": false, "description": "Controls when the backdrop becomes visible for submenus.\n- `\"focus\"`: Show when the submenu becomes the focus owner (prevents flicker on hover).\n If a deeper submenu is open, the backdrop remains visible.\n- `\"open\"`: Show as soon as the submenu opens, regardless of focus.", "default": "\"focus\" for submenus, \"open\" for root menu" @@ -2274,8 +2275,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -2313,8 +2314,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2363,8 +2364,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2437,8 +2438,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2503,8 +2504,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2548,8 +2549,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -2606,8 +2607,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2630,8 +2631,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes popup + subpage navigation state." }, @@ -2657,8 +2658,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -2679,7 +2680,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The direction to scroll when hovering over this arrow." }, @@ -2715,8 +2716,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -2730,7 +2731,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The scroll direction this arrow controls." }, @@ -2763,8 +2764,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -2806,8 +2807,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -2857,8 +2858,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -3307,7 +3308,7 @@ { "name": "items", "type": "Items | undefined", - "formattedType": "Record | ItemsEntry[]", + "formattedType": "ItemsEntry[] | Record", "required": false, "description": "Data structure of the items for label resolution.\nUsed to display labels before items mount (e.g., on initial render with defaultValue).\nCan be a record mapping values to labels, or an array of\n`{ value, label, keywords? }` objects." }, @@ -3462,7 +3463,7 @@ "ComboboxFilterFn": { "name": "ComboboxFilterFn", "kind": "typealias", - "definition": "(value: string, search: string, keywords?: string[]) => number" + "definition": "(\n value: string,\n search: string,\n keywords?: string[],\n) => number" }, "ComboboxItemRegistration": { "name": "ComboboxItemRegistration", @@ -3568,8 +3569,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\"", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean", + "formattedType": "\"after-exit\" | false | true", "required": true, "description": "Whether to clear search on close.\n- `true`: clear immediately when menu closes (default)\n- `false`: preserve search when menu closes\n- `'after-exit'`: clear after exit animation completes (requires Surface to call clearSearch)" }, @@ -3724,7 +3725,7 @@ { "name": "openMethod", "type": "OpenMethod | null", - "formattedType": "null | \"keyboard\" | \"touch\" | \"mouse\" | \"pen\"", + "formattedType": "null | \"keyboard\" | \"mouse\" | \"pen\" | \"touch\"", "required": true, "description": "How the listbox was most recently opened (`mouse`/`touch`/`pen`/`keyboard`).\n`null` until first opened. Retained after close (only updated on open)." }, @@ -3757,7 +3758,7 @@ { "name": "highlightSource", "type": "HighlightSource", - "formattedType": "null | \"pointer\" | \"keyboard\" | \"auto\"", + "formattedType": "null | \"auto\" | \"keyboard\" | \"pointer\"", "required": true, "description": "Source of the current highlight (keyboard or pointer)" }, @@ -3916,8 +3917,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -3990,8 +3991,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4139,8 +4140,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4229,8 +4230,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4274,8 +4275,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFocusZoneState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFocusZoneState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4306,8 +4307,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFooterState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFooterState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4343,8 +4344,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4417,8 +4418,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4483,8 +4484,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuHeaderState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuHeaderState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4515,8 +4516,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4629,8 +4630,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4766,8 +4767,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLinkItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLinkItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4840,8 +4841,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -4898,8 +4899,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4942,8 +4943,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLoadingState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLoadingState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -4995,8 +4996,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -5026,8 +5027,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuShortcutState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.Shortcut.State) => ReactNode", + "type": "((state: PopupMenuShortcutState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.Shortcut.State) => ReactNode", "required": false, "description": "Content to render inside the shortcut.\nCan be a render function that receives the shortcut value.\nIf not provided, renders the shortcut value from the parent Item." }, @@ -5047,8 +5048,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuShortcutState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuShortcutState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -5123,8 +5124,8 @@ }, { "name": "onSelectAsync", - "type": "((context: OnSelectAsyncContext) => Promise) | undefined", - "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", + "type": "((context: OnSelectAsyncContext) => Promise) | undefined", + "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", "required": false, "description": "Async callback when this item is selected.\n\nWhen provided, this takes precedence over `onSelect`.\nIf provided, this callback is awaited before navigating back.\nReturn `false` to prevent automatic navigation." }, @@ -5144,8 +5145,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -5229,8 +5230,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -5332,8 +5333,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -5464,8 +5465,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", "required": false, "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", "default": "'after-exit'" @@ -5496,7 +5497,8 @@ { "name": "children", "type": "ReactNode", - "required": true + "required": true, + "description": "Children (Input, List, etc.)" }, { "name": "style", @@ -5514,29 +5516,29 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity." }, { "name": "asyncContent", "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`." }, { "name": "asyncContentMode", "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "formattedType": "\"append\" | \"replace\"", "required": false, "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", "default": "'replace'" @@ -5559,7 +5561,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", "default": "true" @@ -5624,7 +5626,7 @@ { "name": "source", "type": "AsyncLoaderSource | undefined", - "formattedType": "\"tanstack-query\" | \"swr\" | \"vanilla\" | \"custom\"", + "formattedType": "\"custom\" | \"swr\" | \"tanstack-query\" | \"vanilla\"", "required": false, "description": "Source data library backing this result" }, @@ -5639,7 +5641,7 @@ "name": "status", "type": "AsyncLoaderStatus", "shortType": "Status", - "formattedType": "\"error\" | \"pending\" | \"idle\" | \"success\"", + "formattedType": "\"error\" | \"idle\" | \"pending\" | \"success\"", "required": true, "description": "Canonical status state" }, @@ -5647,7 +5649,7 @@ "name": "fetchStatus", "type": "AsyncLoaderFetchStatus", "shortType": "Status", - "formattedType": "\"paused\" | \"idle\" | \"fetching\"", + "formattedType": "\"fetching\" | \"idle\" | \"paused\"", "required": true, "description": "Canonical fetch state", "referencePath": "@bazza-ui/react.AsyncLoaderFetchStatus" @@ -5655,7 +5657,7 @@ { "name": "loadingPhase", "type": "AsyncLoaderLoadingPhase", - "formattedType": "\"none\" | \"initial\" | \"background\"", + "formattedType": "\"background\" | \"initial\" | \"none\"", "required": true, "description": "Distinguishes initial load vs background fetch", "referencePath": "@bazza-ui/react.AsyncLoaderLoadingPhase" @@ -5968,7 +5970,7 @@ "name": "status", "type": "AsyncLoaderStatus", "shortType": "Status", - "formattedType": "\"error\" | \"pending\" | \"idle\" | \"success\"", + "formattedType": "\"error\" | \"idle\" | \"pending\" | \"success\"", "required": true, "description": "Canonical status state", "referencePath": "@bazza-ui/react.AsyncLoaderStatus" @@ -5977,7 +5979,7 @@ "name": "fetchStatus", "type": "AsyncLoaderFetchStatus", "shortType": "Status", - "formattedType": "\"paused\" | \"idle\" | \"fetching\"", + "formattedType": "\"fetching\" | \"idle\" | \"paused\"", "required": true, "description": "Canonical fetch state", "referencePath": "@bazza-ui/react.AsyncLoaderFetchStatus" @@ -5985,7 +5987,7 @@ { "name": "loadingPhase", "type": "AsyncLoaderLoadingPhase", - "formattedType": "\"none\" | \"initial\" | \"background\"", + "formattedType": "\"background\" | \"initial\" | \"none\"", "required": true, "description": "Distinguishes initial load vs background fetch", "referencePath": "@bazza-ui/react.AsyncLoaderLoadingPhase" @@ -6145,14 +6147,14 @@ "props": [ { "name": "node", - "type": "TreeItemDef | SubmenuDef | SubpageDef", + "type": "SubmenuDef | SubpageDef | TreeItemDef", "required": true, "description": "The branch node definition" }, { "name": "menuNode", - "type": "PopupMenuNode", - "formattedType": "PopupMenuNode<\n TreeItemDef | SubmenuDef | SubpageDef\n>", + "type": "PopupMenuNode", + "formattedType": "PopupMenuNode<\n SubmenuDef | SubpageDef | TreeItemDef\n>", "required": true, "description": "The branch Menu Node. `node`, `value`, and `id` mirror its def for compatibility." }, @@ -6233,6 +6235,13 @@ "required": false, "description": "Optional render function for the checkbox group's label row.\nUsed by the default checkbox group container when no `render` is provided, and by\nvirtualized lists (which ignore `render` and use only the label row).\nPrecedence: `render` > `renderLabel` > `label`." }, + { + "name": "onValueChange", + "type": "((value: string[], eventDetails: CheckboxValueChangeEventDetails) => void) | undefined", + "formattedType": "(\n value: string[],\n eventDetails: CheckboxValueChangeEventDetails,\n) => void", + "required": false, + "description": "Callback fired when the selected value changes.\nThe second parameter contains event details including the reason for the change." + }, { "name": "disabled", "type": "boolean | undefined", @@ -6240,13 +6249,6 @@ "required": false, "description": "Whether all items in this group are disabled.", "default": "false" - }, - { - "name": "onValueChange", - "type": "((value: string[], eventDetails: CheckboxValueChangeEventDetails) => void) | undefined", - "formattedType": "(\n value: string[],\n eventDetails: CheckboxValueChangeEventDetails,\n) => void", - "required": false, - "description": "Callback fired when the selected value changes.\nThe second parameter contains event details including the reason for the change." } ] }, @@ -6314,7 +6316,7 @@ "name": "CheckboxGroupRenderProps", "kind": "typealias", "doc": "Props to spread onto the CheckboxGroup component.\nDerived from PopupMenuCheckboxGroupProps.", - "definition": "Required> & Pick & {\n value: string[];\n}", + "definition": "Required<\n Pick\n> &\n Pick & { value: string[] }", "props": [ { "name": "disabled", @@ -6376,41 +6378,33 @@ "description": "Whether this node is hidden" }, { - "name": "disabled", + "name": "checked", "type": "boolean | undefined", "formattedType": "false | true", "required": false, - "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation.", - "default": "false" + "description": "The controlled checked state." }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onCheckedChange", + "type": "((checked: boolean, eventDetails: CheckedChangeEventDetails) => void) | undefined", + "formattedType": "(\n checked: boolean,\n eventDetails: CheckedChangeEventDetails,\n) => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" + "description": "Callback fired when the checked state changes.\nThe second parameter contains event details including the reason for the change." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." }, { - "name": "checked", + "name": "disabled", "type": "boolean | undefined", "formattedType": "false | true", "required": false, - "description": "The controlled checked state." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", - "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation.", + "default": "false" }, { "name": "closeOnClick", @@ -6421,11 +6415,19 @@ "default": "false" }, { - "name": "onCheckedChange", - "type": "((checked: boolean, eventDetails: CheckedChangeEventDetails) => void) | undefined", - "formattedType": "(\n checked: boolean,\n eventDetails: CheckedChangeEventDetails,\n) => void", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Callback fired when the checked state changes.\nThe second parameter contains event details including the reason for the change." + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" + }, + { + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -6443,7 +6445,7 @@ { "name": "props", "type": "CheckboxItemRenderProps", - "formattedType": "{\n id: string\n value: string\n} & Required<\n Pick\n> &\n Pick<\n PopupMenu.CheckboxItem.Props,\n | 'forceOrder'\n | 'forceScore'\n | 'checked'\n | 'closeOnClick'\n | 'onCheckedChange'\n >", + "formattedType": "{\n id: string\n value: string\n} & Required<\n Pick\n> &\n Pick<\n PopupMenu.CheckboxItem.Props,\n | 'checked'\n | 'closeOnClick'\n | 'forceOrder'\n | 'forceScore'\n | 'onCheckedChange'\n >", "required": true, "description": "Props to spread onto the CheckboxItem component" }, @@ -6460,7 +6462,7 @@ "name": "CheckboxItemRenderProps", "kind": "typealias", "doc": "Props to spread onto the CheckboxItem component.\nDerived from PopupMenuCheckboxItemProps.", - "definition": "{\n /**\n * Qualified unique ID for the checkbox item.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string;\n /**\n * The original value from the node definition.\n */\n value: string;\n} & Required> & Pick", + "definition": "{\n /**\n * Qualified unique ID for the checkbox item.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string\n /**\n * The original value from the node definition.\n */\n value: string\n} & Required> &\n Pick<\n PopupMenuCheckboxItemProps,\n 'checked' | 'onCheckedChange' | 'closeOnClick' | 'forceOrder' | 'forceScore'\n >", "props": [ { "name": "id", @@ -6482,21 +6484,6 @@ "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation.", "default": "false" }, - { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" - }, - { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Overrides this row's computed fuzzy-match score." - }, { "name": "checked", "type": "boolean | undefined", @@ -6504,6 +6491,13 @@ "required": false, "description": "The controlled checked state." }, + { + "name": "onCheckedChange", + "type": "((checked: boolean, eventDetails: CheckedChangeEventDetails) => void) | undefined", + "formattedType": "(\n checked: boolean,\n eventDetails: CheckedChangeEventDetails,\n) => void", + "required": false, + "description": "Callback fired when the checked state changes.\nThe second parameter contains event details including the reason for the change." + }, { "name": "closeOnClick", "type": "boolean | undefined", @@ -6513,16 +6507,24 @@ "default": "false" }, { - "name": "onCheckedChange", - "type": "((checked: boolean, eventDetails: CheckedChangeEventDetails) => void) | undefined", - "formattedType": "(\n checked: boolean,\n eventDetails: CheckedChangeEventDetails,\n) => void", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Callback fired when the checked state changes.\nThe second parameter contains event details including the reason for the change." - } - ] - }, - "DataListChildrenState": { - "name": "DataListChildrenState", + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" + }, + { + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Overrides this row's computed fuzzy-match score." + } + ] + }, + "DataListChildrenState": { + "name": "DataListChildrenState", "kind": "interface", "doc": "State passed to the DataList render function.", "props": [ @@ -6579,7 +6581,7 @@ { "name": "asyncContent", "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for root-level async loading", "referencePath": "@bazza-ui/react.AsyncLoaderConfig" @@ -6588,7 +6590,7 @@ "name": "asyncContentMode", "type": "AsyncContentMode", "shortType": "Mode", - "formattedType": "\"replace\" | \"append\"", + "formattedType": "\"append\" | \"replace\"", "required": true, "description": "How `asyncContent` rows combine with `content`", "referencePath": "@bazza-ui/react.AsyncContentMode" @@ -6625,7 +6627,7 @@ { "name": "groupSearchBehavior", "type": "GroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\"", + "formattedType": "\"flatten\" | \"preserve\"", "required": false, "description": "How groups behave during search results.\nOnly affects search mode - groups are always shown in browse mode.\nNote: Radio groups have their own behavior controlled by radioGroupSearchBehavior.", "default": "'preserve'" @@ -6633,7 +6635,7 @@ { "name": "radioGroupSearchBehavior", "type": "RadioGroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\" | \"preserve-show-all\"", + "formattedType": "\"flatten\" | \"preserve\" | \"preserve-show-all\"", "required": false, "description": "How radio groups behave during search results.\n- 'flatten': Radio items shown individually (not recommended).\n- 'preserve': Only matching radio items are shown (default).\n- 'preserve-show-all': All radio items are shown when any item matches.", "default": "'preserve'" @@ -6641,7 +6643,7 @@ { "name": "checkboxGroupSearchBehavior", "type": "CheckboxGroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\" | \"preserve-show-all\"", + "formattedType": "\"flatten\" | \"preserve\" | \"preserve-show-all\"", "required": false, "description": "How checkbox groups behave during search results.\n- 'flatten': Checkbox items shown individually (not recommended).\n- 'preserve': Only matching checkbox items are shown (default).\n- 'preserve-show-all': All checkbox items are shown when any item matches.", "default": "'preserve'", @@ -6677,7 +6679,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": true, "description": "Default submenu inclusion mode for deep search" }, @@ -6711,7 +6713,7 @@ { "name": "groupSearchBehavior", "type": "GroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\"", + "formattedType": "\"flatten\" | \"preserve\"", "required": false, "description": "How groups behave during search results.\nOnly affects search mode - groups are always shown in browse mode.\nNote: Radio groups have their own behavior controlled by radioGroupSearchBehavior.", "default": "'preserve'" @@ -6719,7 +6721,7 @@ { "name": "radioGroupSearchBehavior", "type": "RadioGroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\" | \"preserve-show-all\"", + "formattedType": "\"flatten\" | \"preserve\" | \"preserve-show-all\"", "required": false, "description": "How radio groups behave during search results.\n- 'flatten': Radio items shown individually (not recommended).\n- 'preserve': Only matching radio items are shown (default).\n- 'preserve-show-all': All radio items are shown when any item matches.", "default": "'preserve'" @@ -6727,7 +6729,7 @@ { "name": "checkboxGroupSearchBehavior", "type": "CheckboxGroupBehavior | undefined", - "formattedType": "\"preserve\" | \"flatten\" | \"preserve-show-all\"", + "formattedType": "\"flatten\" | \"preserve\" | \"preserve-show-all\"", "required": false, "description": "How checkbox groups behave during search results.\n- 'flatten': Checkbox items shown individually (not recommended).\n- 'preserve': Only matching checkbox items are shown (default).\n- 'preserve-show-all': All checkbox items are shown when any item matches.", "default": "'preserve'", @@ -6838,7 +6840,7 @@ "name": "DisplayNode", "kind": "typealias", "doc": "Union of all display node types.\nCan be a row node (item/submenu/subpage), group node, radio group node, or separator.", - "definition": "DisplayRowNode | DisplayGroupNode | DisplayRadioGroupNode | DisplayCheckboxGroupNode | DisplaySeparatorNode" + "definition": "| DisplayRowNode\n| DisplayGroupNode\n| DisplayRadioGroupNode\n| DisplayCheckboxGroupNode\n| DisplaySeparatorNode" }, "DisplayRadioGroupNode": { "name": "DisplayRadioGroupNode", @@ -7146,6 +7148,13 @@ "required": false, "description": "Unique value for this item used for filtering.\nIf not provided, will be inferred from textContent." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -7154,19 +7163,19 @@ "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" + "description": "Callback when this item is selected (via click or Enter key)." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu.", + "default": "true" }, { "name": "shortcut", @@ -7176,26 +7185,19 @@ "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", - "required": false, - "description": "Callback when this item is selected (via click or Enter key)." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu.", - "default": "true" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -7213,7 +7215,7 @@ { "name": "props", "type": "ItemRenderProps", - "formattedType": "{\n id: string\n value: string\n} & Required> &\n Pick<\n PopupMenu.Item.Props,\n | 'forceOrder'\n | 'forceScore'\n | 'shortcut'\n | 'onSelect'\n | 'closeOnClick'\n >", + "formattedType": "{\n id: string\n value: string\n} & Required> &\n Pick<\n PopupMenu.Item.Props,\n | 'closeOnClick'\n | 'forceOrder'\n | 'forceScore'\n | 'onSelect'\n | 'shortcut'\n >", "required": true, "description": "Props to spread onto the Item component" }, @@ -7230,7 +7232,7 @@ "name": "ItemRenderProps", "kind": "typealias", "doc": "Props to spread onto the Item component.\nDerived from PopupMenuItemProps.", - "definition": "{\n /**\n * Canonical Resolved ID for the item, generated by the root policy: the\n * encoded surface Definition Path by default, or the Definition Key in\n * menu scope.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string;\n /**\n * The original value from the node definition.\n * Use this for display, search matching, or any logic that needs the raw value.\n */\n value: string;\n} & Required> & Pick", + "definition": "{\n /**\n * Canonical Resolved ID for the item, generated by the root policy: the\n * encoded surface Definition Path by default, or the Definition Key in\n * menu scope.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string\n /**\n * The original value from the node definition.\n * Use this for display, search matching, or any logic that needs the raw value.\n */\n value: string\n} & Required> &\n Pick<\n PopupMenuItemProps,\n 'closeOnClick' | 'onSelect' | 'shortcut' | 'forceOrder' | 'forceScore'\n >", "props": [ { "name": "id", @@ -7252,19 +7254,19 @@ "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" + "description": "Callback when this item is selected (via click or Enter key)." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu.", + "default": "true" }, { "name": "shortcut", @@ -7274,19 +7276,19 @@ "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Callback when this item is selected (via click or Enter key)." + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu.", - "default": "true" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -7326,6 +7328,13 @@ "required": false, "description": "Unique value for this item used for filtering.\nIf not provided, will be inferred from textContent." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -7334,19 +7343,19 @@ "description": "Whether this item is disabled.\nDisabled items do not navigate and are skipped during keyboard navigation." }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.", - "default": "0" + "description": "Callback when this item is selected (via click, Enter key, or shortcut)." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu. Defaults to false because\nfull-page navigation unmounts the menu anyway.", + "default": "false" }, { "name": "shortcut", @@ -7356,26 +7365,19 @@ "description": "Keyboard shortcut to trigger this item." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", - "required": false, - "description": "Callback when this item is selected (via click, Enter key, or shortcut)." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + "description": "Forces this row's relative order during score-based sorting.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu. Defaults to false because\nfull-page navigation unmounts the menu anyway.", - "default": "false" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -7391,7 +7393,7 @@ { "name": "props", "type": "LinkItemRenderProps", - "formattedType": "{\n id: string\n value: string\n href: string\n} & Required> &\n Pick<\n PopupMenuLinkItemProps,\n | 'forceOrder'\n | 'forceScore'\n | 'shortcut'\n | 'onSelect'\n | 'closeOnClick'\n >", + "formattedType": "{\n id: string\n value: string\n href: string\n} & Required> &\n Pick<\n PopupMenuLinkItemProps,\n | 'closeOnClick'\n | 'forceOrder'\n | 'forceScore'\n | 'onSelect'\n | 'shortcut'\n >", "required": true }, { @@ -7405,7 +7407,7 @@ "LinkItemRenderProps": { "name": "LinkItemRenderProps", "kind": "typealias", - "definition": "{\n id: string;\n value: string;\n href: string;\n} & Required> & Pick", + "definition": "{\n id: string\n value: string\n href: string\n} & Required> &\n Pick<\n PopupMenuLinkItemProps,\n 'closeOnClick' | 'onSelect' | 'shortcut' | 'forceOrder' | 'forceScore'\n >", "props": [ { "name": "id", @@ -7430,19 +7432,19 @@ "description": "Whether this item is disabled.\nDisabled items do not navigate and are skipped during keyboard navigation." }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.", - "default": "0" + "description": "Callback when this item is selected (via click, Enter key, or shortcut)." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu. Defaults to false because\nfull-page navigation unmounts the menu anyway.", + "default": "false" }, { "name": "shortcut", @@ -7452,19 +7454,19 @@ "description": "Keyboard shortcut to trigger this item." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Callback when this item is selected (via click, Enter key, or shortcut)." + "description": "Forces this row's relative order during score-based sorting.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu. Defaults to false because\nfull-page navigation unmounts the menu anyway.", - "default": "false" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -7499,7 +7501,7 @@ "name": "NodeDef", "kind": "typealias", "doc": "Union of all node definition types.", - "definition": "ItemDef | LinkItemDef | TreeItemDef | RadioItemDef | CheckboxItemDef | SubmenuDef | SubpageDef | SeparatorDef | GroupDef | RadioGroupDef | CheckboxGroupDef" + "definition": "| ItemDef\n| LinkItemDef\n| TreeItemDef\n| RadioItemDef\n| CheckboxItemDef\n| SubmenuDef\n| SubpageDef\n| SeparatorDef\n| GroupDef\n| RadioGroupDef\n| CheckboxGroupDef" }, "CommandMenuCheckboxGroupValueProps": { "name": "CommandMenuCheckboxGroupValueProps", @@ -7858,6 +7860,13 @@ "required": false, "description": "The controlled selected value." }, + { + "name": "onValueChange", + "type": "((value: string, eventDetails: RadioValueChangeEventDetails) => void) | undefined", + "formattedType": "(\n value: string,\n eventDetails: RadioValueChangeEventDetails,\n) => void", + "required": false, + "description": "Callback fired when the selected value changes.\nThe second parameter contains event details including the reason for the change." + }, { "name": "disabled", "type": "boolean | undefined", @@ -7865,13 +7874,6 @@ "required": false, "description": "Whether all items in this group are disabled.", "default": "false" - }, - { - "name": "onValueChange", - "type": "((value: string, eventDetails: RadioValueChangeEventDetails) => void) | undefined", - "formattedType": "(\n value: string,\n eventDetails: RadioValueChangeEventDetails,\n) => void", - "required": false, - "description": "Callback fired when the selected value changes.\nThe second parameter contains event details including the reason for the change." } ] }, @@ -7890,7 +7892,7 @@ { "name": "props", "type": "RadioGroupRenderProps", - "formattedType": "Required<\n Pick\n> &\n Pick<\n PopupMenu.RadioGroup.Props,\n 'value' | 'onValueChange'\n >", + "formattedType": "Required<\n Pick\n> &\n Pick<\n PopupMenu.RadioGroup.Props,\n 'onValueChange' | 'value'\n >", "required": true, "description": "Props to spread onto the RadioGroup component" }, @@ -7914,7 +7916,7 @@ "name": "RadioGroupRenderProps", "kind": "typealias", "doc": "Props to spread onto the RadioGroup component.\nDerived from PopupMenuRadioGroupProps.", - "definition": "Required> & Pick", + "definition": "Required<\n Pick\n> &\n Pick", "props": [ { "name": "disabled", @@ -7977,6 +7979,13 @@ "required": true, "description": "The value to set when this item is selected.\nThis is required and must be unique within the RadioGroup." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -7986,19 +7995,19 @@ "default": "false" }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" + "description": "Callback when this item is selected." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu.", + "default": "false" }, { "name": "shortcut", @@ -8008,26 +8017,19 @@ "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", - "required": false, - "description": "Callback when this item is selected." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu.", - "default": "false" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -8046,7 +8048,7 @@ { "name": "props", "type": "RadioItemRenderProps", - "formattedType": "{ id: string } & Required<\n Pick\n> &\n Pick<\n PopupMenu.RadioItem.Props,\n | 'forceOrder'\n | 'forceScore'\n | 'shortcut'\n | 'onSelect'\n | 'closeOnClick'\n >", + "formattedType": "{ id: string } & Required<\n Pick\n> &\n Pick<\n PopupMenu.RadioItem.Props,\n | 'closeOnClick'\n | 'forceOrder'\n | 'forceScore'\n | 'onSelect'\n | 'shortcut'\n >", "required": true, "description": "Props to spread onto the RadioItem component" }, @@ -8063,7 +8065,7 @@ "name": "RadioItemRenderProps", "kind": "typealias", "doc": "Props to spread onto the RadioItem component.\nDerived from PopupMenuRadioItemProps.", - "definition": "{\n /**\n * Qualified unique ID for the radio item.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string;\n} & Required> & Pick", + "definition": "{\n /**\n * Qualified unique ID for the radio item.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string\n} & Required> &\n Pick<\n PopupMenuRadioItemProps,\n 'closeOnClick' | 'onSelect' | 'shortcut' | 'forceOrder' | 'forceScore'\n >", "props": [ { "name": "id", @@ -8086,19 +8088,19 @@ "default": "false" }, { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" + "description": "Callback when this item is selected." }, { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", + "name": "closeOnClick", + "type": "boolean | undefined", + "formattedType": "false | true", "required": false, - "description": "Overrides this row's computed fuzzy-match score." + "description": "Whether clicking this item should close the menu.", + "default": "false" }, { "name": "shortcut", @@ -8108,19 +8110,19 @@ "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Callback when this item is selected." + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", "required": false, - "description": "Whether clicking this item should close the menu.", - "default": "false" + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -8348,7 +8350,7 @@ { "name": "asyncNodes", "type": "AsyncNodesConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async child nodes configuration.\nWhen provided, the Loader component will be rendered to fetch async data.\nAsync nodes are merged with static nodes.", "referencePath": "@bazza-ui/react.AsyncNodesConfig" @@ -8364,7 +8366,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Whether this submenu is included in ancestor deep search results.\n- `true`: include submenu trigger and descendants\n- `'trigger-only'`: include submenu trigger only\n- `false`: exclude submenu trigger and descendants", "default": "true", @@ -8397,6 +8399,13 @@ "required": false, "description": "Unique value for this item used for filtering.\nIf not provided, will be inferred from textContent." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -8418,13 +8427,6 @@ "formattedType": "number", "required": false, "description": "Overrides this row's computed fuzzy-match score." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", - "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." } ] }, @@ -8465,7 +8467,7 @@ { "name": "asyncContent", "type": "AsyncNodesConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for this submenu.\nPass this to the submenu's DataSurface to enable async loading\nwith the submenu's own search query (independent of parent search).", "referencePath": "@bazza-ui/react.AsyncNodesConfig" @@ -8483,7 +8485,7 @@ "name": "SubmenuRenderProps", "kind": "typealias", "doc": "Props to spread onto the SubmenuTrigger component.\nDerived from PopupMenuSubmenuTriggerProps.", - "definition": "{\n /**\n * Qualified unique ID for the submenu trigger.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string;\n /**\n * The original value from the node definition.\n */\n value: string;\n} & Required> & Pick", + "definition": "{\n /**\n * Qualified unique ID for the submenu trigger.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string\n /**\n * The original value from the node definition.\n */\n value: string\n} & Required> &\n Pick", "props": [ { "name": "id", @@ -8557,7 +8559,7 @@ { "name": "asyncContent", "type": "AsyncNodesConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for this subpage.\nPass this to the subpage's DataSurface to enable async loading\nwith the subpage's own search query (independent of parent search).", "referencePath": "@bazza-ui/react.AsyncNodesConfig" @@ -8592,7 +8594,7 @@ { "name": "asyncNodes", "type": "AsyncNodesConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async child nodes configuration.\nWhen provided, the Loader component will be rendered to fetch async data.\nAsync nodes are merged with static nodes.", "referencePath": "@bazza-ui/react.AsyncNodesConfig" @@ -8608,7 +8610,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Whether this subpage is included in ancestor deep search results.\n- `true`: include subpage trigger and descendants\n- `'trigger-only'`: include subpage trigger only\n- `false`: exclude subpage trigger and descendants", "default": "true", @@ -8648,6 +8650,13 @@ "required": false, "description": "Unique value for this item used for filtering." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering." + }, { "name": "disabled", "type": "boolean | undefined", @@ -8669,13 +8678,6 @@ "formattedType": "number", "required": false, "description": "Overrides this row's computed fuzzy-match score." - }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", - "required": false, - "description": "Additional keywords to match against when filtering." } ] }, @@ -8712,7 +8714,7 @@ "name": "SubpageTriggerRenderProps", "kind": "typealias", "doc": "Props to spread onto the SubpageTrigger component.\nDerived from PopupMenuSubpageTriggerProps.", - "definition": "{\n /**\n * Qualified unique ID for the subpage trigger.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string;\n /**\n * The original value from the node definition.\n */\n value: string;\n /**\n * Computed page ID for the associated Subpage content.\n * Must be passed to `targetPageId` on SubpageTrigger.\n */\n targetPageId: string;\n} & Required>", + "definition": "{\n /**\n * Qualified unique ID for the subpage trigger.\n * Must be passed to the rendered component for navigation to work.\n */\n id: string\n /**\n * The original value from the node definition.\n */\n value: string\n /**\n * Computed page ID for the associated Subpage content.\n * Must be passed to `targetPageId` on SubpageTrigger.\n */\n targetPageId: string\n} & Required>", "props": [ { "name": "id", @@ -8748,38 +8750,20 @@ "definition": "Omit", "props": [ { - "name": "index", - "type": "number", - "required": true, - "description": "Sibling index in the def tree (position within `parent.children`)." - }, - { - "name": "children", - "type": "PopupMenuNode[]", - "required": true, - "referencePath": "@bazza-ui/react.PopupMenuNode" - }, - { - "name": "depth", - "type": "number", + "name": "def", + "type": "NodeDef", + "formattedType": "| CheckboxGroupDef\n | CheckboxItemDef\n | GroupDef\n | ItemDef\n | LinkItemDef\n | RadioGroupDef\n | RadioItemDef\n | SeparatorDef\n | SubmenuDef\n | SubpageDef\n | TreeItemDef", "required": true, - "description": "Def-tree depth counting every node kind; roots are 0." + "description": "The originating def. Replaced in place when content is re-supplied.", + "referencePath": "@bazza-ui/react.NodeDef" }, { "name": "kind", - "type": "\"separator\" | \"item\" | \"group\" | \"checkbox-group\" | \"checkbox-item\" | \"link-item\" | \"radio-group\" | \"radio-item\" | \"tree-item\" | \"submenu\" | \"subpage\"", - "formattedType": "| 'separator'\n | 'item'\n | 'group'\n | 'checkbox-group'\n | 'checkbox-item'\n | 'link-item'\n | 'radio-group'\n | 'radio-item'\n | 'tree-item'\n | 'submenu'\n | 'subpage'", + "type": "\"checkbox-group\" | \"checkbox-item\" | \"group\" | \"item\" | \"link-item\" | \"radio-group\" | \"radio-item\" | \"separator\" | \"submenu\" | \"subpage\" | \"tree-item\"", + "formattedType": "| 'checkbox-group'\n | 'checkbox-item'\n | 'group'\n | 'item'\n | 'link-item'\n | 'radio-group'\n | 'radio-item'\n | 'separator'\n | 'submenu'\n | 'subpage'\n | 'tree-item'", "required": true, "description": "Mirror of `def.kind`, stable for the node's lifetime." }, - { - "name": "def", - "type": "NodeDef", - "formattedType": "| ItemDef\n | LinkItemDef\n | TreeItemDef\n | RadioItemDef\n | CheckboxItemDef\n | SubmenuDef\n | SubpageDef\n | SeparatorDef\n | GroupDef\n | RadioGroupDef\n | CheckboxGroupDef", - "required": true, - "description": "The originating def. Replaced in place when content is re-supplied.", - "referencePath": "@bazza-ui/react.NodeDef" - }, { "name": "definitionKey", "type": "string", @@ -8798,6 +8782,24 @@ "formattedType": "null | PopupMenuNode", "required": true, "referencePath": "@bazza-ui/react.PopupMenuNode" + }, + { + "name": "children", + "type": "PopupMenuNode[]", + "required": true, + "referencePath": "@bazza-ui/react.PopupMenuNode" + }, + { + "name": "depth", + "type": "number", + "required": true, + "description": "Def-tree depth counting every node kind; roots are 0." + }, + { + "name": "index", + "type": "number", + "required": true, + "description": "Sibling index in the def tree (position within `parent.children`)." } ] }, @@ -8814,8 +8816,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: DialogBackdropState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: DialogBackdropState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -8883,8 +8885,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuInputState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuInputState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -8917,8 +8919,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, CommandMenuPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: CommandMenuPopupState,\n ) => ReactElement)", + "type": "ComponentRenderFn, CommandMenuPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: CommandMenuPopupState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes dialog popup + subpage navigation state." }, @@ -8964,8 +8966,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: DialogPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: DialogPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -9072,8 +9074,8 @@ }, { "name": "dragSelection", - "type": "false | \"keep\" | \"rubber-band\" | undefined", - "formattedType": "false | \"keep\" | \"rubber-band\"", + "type": "\"keep\" | \"rubber-band\" | false | undefined", + "formattedType": "\"keep\" | \"rubber-band\" | false", "required": false, "description": "Lets the user press a checkbox item and drag across others to set them all\nto the pressed item's new state. Off by default. `'keep'` keeps rows set\nonce the pointer has reached them; `'rubber-band'` returns rows outside the\ncurrent span to their previous state. Mouse and pen only.", "default": "false" @@ -9125,8 +9127,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: DialogTriggerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: DialogTriggerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -9210,8 +9212,8 @@ }, { "name": "closeOnOutsidePress", - "type": "\"pointerdown\" | \"click\" | undefined", - "formattedType": "\"pointerdown\" | \"click\"", + "type": "\"click\" | \"pointerdown\" | undefined", + "formattedType": "\"click\" | \"pointerdown\"", "required": false, "description": "When to close the menu on outside interactions.\n- `'pointerdown'`: Close immediately when pointer is pressed outside (default)\n- `'click'`: Close when a full click (pointerdown + pointerup) occurs outside", "default": "'pointerdown'" @@ -9258,8 +9260,8 @@ }, { "name": "dragSelection", - "type": "false | \"keep\" | \"rubber-band\" | undefined", - "formattedType": "false | \"keep\" | \"rubber-band\"", + "type": "\"keep\" | \"rubber-band\" | false | undefined", + "formattedType": "\"keep\" | \"rubber-band\" | false", "required": false, "description": "Lets the user press a checkbox item and drag across others to set them all\nto the pressed item's new state. Off by default. `'keep'` keeps rows set\nonce the pointer has reached them; `'rubber-band'` returns rows outside the\ncurrent span to their previous state. Mouse and pen only.", "default": "false" @@ -9341,8 +9343,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, ContextMenuTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: ContextMenu.Trigger.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, ContextMenuTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: ContextMenu.Trigger.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9388,8 +9390,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -9408,8 +9410,8 @@ "props": [ { "name": "showOn", - "type": "\"open\" | \"focus\" | undefined", - "formattedType": "\"open\" | \"focus\"", + "type": "\"focus\" | \"open\" | undefined", + "formattedType": "\"focus\" | \"open\"", "required": false, "description": "Controls when the backdrop becomes visible for submenus.\n- `\"focus\"`: Show when the submenu becomes the focus owner (prevents flicker on hover).\n If a deeper submenu is open, the backdrop remains visible.\n- `\"open\"`: Show as soon as the submenu opens, regardless of focus.", "default": "\"focus\" for submenus, \"open\" for root menu" @@ -9423,8 +9425,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -9500,8 +9502,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9574,8 +9576,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9723,8 +9725,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9813,8 +9815,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9858,8 +9860,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFocusZoneState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFocusZoneState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9890,8 +9892,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFooterState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFooterState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -9927,8 +9929,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10001,8 +10003,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10067,8 +10069,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuHeaderState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuHeaderState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10099,8 +10101,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10169,8 +10171,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuInputState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuInputState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10283,8 +10285,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10420,8 +10422,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLinkItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLinkItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10494,8 +10496,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -10552,8 +10554,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10576,8 +10578,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes popup + subpage navigation state." }, @@ -10603,8 +10605,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -10621,7 +10623,7 @@ "name": "ContextMenuPositionerAlign", "kind": "typealias", "doc": "Extended align options for popup menus.\n- 'start' | 'center' | 'end': Standard Base UI alignment\n- 'list-start': Align trigger top with the top of the List component (horizontal sides only)", - "definition": "PopoverPositionerProps['align'] | 'list-start'" + "definition": "| PopoverPositionerProps['align']\n| 'list-start'" }, "ContextMenuPositionerProps": { "name": "ContextMenuPositionerProps", @@ -10631,7 +10633,7 @@ "name": "align", "type": "PopupMenuPositionerAlign", "shortType": "Align", - "formattedType": "\"center\" | \"end\" | \"start\" | \"list-start\"", + "formattedType": "\"center\" | \"end\" | \"list-start\" | \"start\"", "required": false, "description": "How to align the popup relative to the specified side.\n- 'start': align to start of anchor\n- 'center': align to center of anchor\n- 'end': align to end of anchor\n- 'list-start': align the List component's top with the anchor top (horizontal sides only)", "default": "'start' for submenus, 'center' for root dropdowns" @@ -10651,8 +10653,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10720,8 +10722,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioGroup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioGroup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10794,8 +10796,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10914,8 +10916,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioItem.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioItem.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -10980,7 +10982,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The direction to scroll when hovering over this arrow." }, @@ -11016,8 +11018,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11031,7 +11033,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The scroll direction this arrow controls." }, @@ -11064,8 +11066,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -11107,8 +11109,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -11158,8 +11160,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11189,8 +11191,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuShortcutState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.Shortcut.State) => ReactNode", + "type": "((state: PopupMenuShortcutState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.Shortcut.State) => ReactNode", "required": false, "description": "Content to render inside the shortcut.\nCan be a render function that receives the shortcut value.\nIf not provided, renders the shortcut value from the parent Item." }, @@ -11210,8 +11212,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuShortcutState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuShortcutState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11344,8 +11346,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubmenuTriggerIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTriggerIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubmenuTriggerIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTriggerIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11474,8 +11476,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubmenuTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTrigger.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubmenuTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTrigger.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11594,8 +11596,8 @@ }, { "name": "onSelectAsync", - "type": "((context: OnSelectAsyncContext) => Promise) | undefined", - "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", + "type": "((context: OnSelectAsyncContext) => Promise) | undefined", + "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", "required": false, "description": "Async callback when this item is selected.\n\nWhen provided, this takes precedence over `onSelect`.\nIf provided, this callback is awaited before navigating back.\nReturn `false` to prevent automatic navigation." }, @@ -11615,8 +11617,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11700,8 +11702,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11828,8 +11830,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -11960,8 +11962,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", "required": false, "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", "default": "'after-exit'" @@ -11992,7 +11994,8 @@ { "name": "children", "type": "ReactNode", - "required": true + "required": true, + "description": "Children (Input, List, etc.)" }, { "name": "style", @@ -12010,23 +12013,23 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity.", - "referencePath": "@bazza-ui/react.NodeDef" + "referencePath": "@bazza-ui/react.PopupMenuNode" }, { "name": "asyncContent", "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", "referencePath": "@bazza-ui/react.AsyncLoaderConfig" @@ -12034,7 +12037,7 @@ { "name": "asyncContentMode", "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "formattedType": "\"append\" | \"replace\"", "required": false, "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", "default": "'replace'", @@ -12059,7 +12062,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", "default": "true", @@ -12906,13 +12909,13 @@ }, { "name": "menuType", - "type": "\"dropdown\" | \"context\"", + "type": "\"context\" | \"dropdown\"", "required": true, "description": "Type of menu for positioning logic.\n- 'dropdown': positions relative to trigger button\n- 'context': positions at cursor with fixed positioning" }, { "name": "closeOnOutsidePress", - "type": "\"pointerdown\" | \"click\"", + "type": "\"click\" | \"pointerdown\"", "required": true, "description": "When to close the menu on outside interactions.\n- 'pointerdown': Close immediately when pointer is pressed outside (default)\n- 'click': Close when a full click (pointerdown + pointerup) occurs outside", "default": "'pointerdown'" @@ -12927,7 +12930,7 @@ }, { "name": "dragSelection", - "type": "false | \"keep\" | \"rubber-band\"", + "type": "\"keep\" | \"rubber-band\" | false", "required": true, "description": "Whether pressing a checkbox item and dragging performs drag selection, and\nhow rows the pointer moves back over are treated.", "default": "false" @@ -13116,7 +13119,7 @@ "ContextMenuFilterFn": { "name": "ContextMenuFilterFn", "kind": "typealias", - "definition": "(value: string, search: string, keywords?: string[]) => number" + "definition": "(\n value: string,\n search: string,\n keywords?: string[],\n) => number" }, "ContextMenuItemRegistration": { "name": "ContextMenuItemRegistration", @@ -13222,8 +13225,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\"", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean", + "formattedType": "\"after-exit\" | false | true", "required": true, "description": "Whether to clear search on close.\n- `true`: clear immediately when menu closes (default)\n- `false`: preserve search when menu closes\n- `'after-exit'`: clear after exit animation completes (requires Surface to call clearSearch)" }, @@ -13378,7 +13381,7 @@ { "name": "openMethod", "type": "OpenMethod | null", - "formattedType": "null | \"keyboard\" | \"touch\" | \"mouse\" | \"pen\"", + "formattedType": "null | \"keyboard\" | \"mouse\" | \"pen\" | \"touch\"", "required": true, "description": "How the listbox was most recently opened (`mouse`/`touch`/`pen`/`keyboard`).\n`null` until first opened. Retained after close (only updated on open)." }, @@ -13411,7 +13414,7 @@ { "name": "highlightSource", "type": "HighlightSource", - "formattedType": "null | \"pointer\" | \"keyboard\" | \"auto\"", + "formattedType": "null | \"auto\" | \"keyboard\" | \"pointer\"", "required": true, "description": "Source of the current highlight (keyboard or pointer)" }, @@ -13533,6 +13536,13 @@ "required": false, "description": "Unique value for this item used as identifier and for filtering.\nIf not provided, will be inferred from textContent.\nUsed for registration when `id` is not provided." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -13540,48 +13550,13 @@ "required": false, "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." }, - { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" - }, - { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Overrides this row's computed fuzzy-match score.\nUseful for pinning or manually ranking rows in score-based views." - }, - { - "name": "shortcut", - "type": "string | undefined", - "formattedType": "string", - "required": false, - "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." - }, { "name": "activatable", "type": "boolean | undefined", "formattedType": "false | true", "required": false, - "description": "Whether this item can be activated via Enter or click.\nNon-activatable items remain highlightable.", - "default": "true" - }, - { - "name": "children", - "type": "ReactNode", - "required": false, - "description": "Children (used for text content inference when value is not provided)." - }, - { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", - "required": false, - "description": "Callback when this item is selected (via click or Enter key).\nFor simple items, pass this directly. For checkbox/radio items,\nuse registerSelect() to register a dynamic handler." + "description": "Whether this item can be activated via Enter or click.\nNon-activatable items remain highlightable.", + "default": "true" }, { "name": "forceMount", @@ -13592,11 +13567,26 @@ "default": "false" }, { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "shortcut", + "type": "string | undefined", + "formattedType": "string", "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + "description": "Keyboard shortcut to trigger this item.\nWhen the menu is focused and the user presses this key, the item will be selected.\nShould be a single character (e.g., \"1\", \"a\", etc.)." + }, + { + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" + }, + { + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Overrides this row's computed fuzzy-match score.\nUseful for pinning or manually ranking rows in score-based views." }, { "name": "isSubmenuTrigger", @@ -13605,6 +13595,19 @@ "required": false, "description": "Whether this item is a submenu trigger (for store registration).", "default": "false" + }, + { + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", + "required": false, + "description": "Callback when this item is selected (via click or Enter key).\nFor simple items, pass this directly. For checkbox/radio items,\nuse registerSelect() to register a dynamic handler." + }, + { + "name": "children", + "type": "ReactNode", + "required": false, + "description": "Children (used for text content inference when value is not provided)." } ] }, @@ -13877,6 +13880,13 @@ "required": false, "description": "Unique value for this item used for filtering.\nIf not provided, will be inferred from textContent." }, + { + "name": "keywords", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." + }, { "name": "disabled", "type": "boolean | undefined", @@ -13884,21 +13894,6 @@ "required": false, "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." }, - { - "name": "forceOrder", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", - "default": "0" - }, - { - "name": "forceScore", - "type": "number | undefined", - "formattedType": "number", - "required": false, - "description": "Overrides this row's computed fuzzy-match score." - }, { "name": "onSelect", "type": "(() => void) | undefined", @@ -13906,13 +13901,6 @@ "required": false, "description": "Callback when this item is selected (via click or Enter key)." }, - { - "name": "keywords", - "type": "string[] | undefined", - "formattedType": "string[]", - "required": false, - "description": "Additional keywords to match against when filtering.\nUseful for aliases or synonyms." - }, { "name": "closeOnClick", "type": "boolean | undefined", @@ -13920,6 +13908,21 @@ "required": false, "description": "Whether clicking this item should close the menu.", "default": "true" + }, + { + "name": "forceOrder", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Forces this row's relative order during score-based sorting.\nLower values appear earlier.", + "default": "0" + }, + { + "name": "forceScore", + "type": "number | undefined", + "formattedType": "number", + "required": false, + "description": "Overrides this row's computed fuzzy-match score." } ] }, @@ -13954,26 +13957,29 @@ "name": "TreeItemRenderProps", "kind": "typealias", "doc": "Props to spread onto a TreeItem component.", - "definition": "Omit & {\n /** Whether this row can be selected. */\n selectable: boolean;\n}", + "definition": "Omit & {\n /** Whether this row can be selected. */\n selectable: boolean\n}", "props": [ { - "name": "id", - "type": "string", - "required": true, - "description": "Canonical Resolved ID for the item, generated by the root policy: the\nencoded surface Definition Path by default, or the Definition Key in\nmenu scope.\nMust be passed to the rendered component for navigation to work." + "name": "disabled", + "type": "boolean", + "formattedType": "false | true", + "required": false, + "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." }, { - "name": "value", - "type": "string", - "required": true, - "description": "The original value from the node definition.\nUse this for display, search matching, or any logic that needs the raw value." + "name": "onSelect", + "type": "(() => void) | undefined", + "formattedType": "() => void", + "required": false, + "description": "Callback when this item is selected (via click or Enter key)." }, { - "name": "disabled", - "type": "boolean", + "name": "closeOnClick", + "type": "boolean | undefined", "formattedType": "false | true", "required": false, - "description": "Whether this item is disabled.\nDisabled items are not selectable and are skipped during keyboard navigation." + "description": "Whether clicking this item should close the menu.", + "default": "true" }, { "name": "forceOrder", @@ -13991,19 +13997,16 @@ "description": "Overrides this row's computed fuzzy-match score." }, { - "name": "onSelect", - "type": "(() => void) | undefined", - "formattedType": "() => void", - "required": false, - "description": "Callback when this item is selected (via click or Enter key)." + "name": "id", + "type": "string", + "required": true, + "description": "Canonical Resolved ID for the item, generated by the root policy: the\nencoded surface Definition Path by default, or the Definition Key in\nmenu scope.\nMust be passed to the rendered component for navigation to work." }, { - "name": "closeOnClick", - "type": "boolean | undefined", - "formattedType": "false | true", - "required": false, - "description": "Whether clicking this item should close the menu.", - "default": "true" + "name": "value", + "type": "string", + "required": true, + "description": "The original value from the node definition.\nUse this for display, search matching, or any logic that needs the raw value." }, { "name": "selectable", @@ -14042,8 +14045,8 @@ }, { "name": "modal", - "type": "boolean | \"trap-focus\" | undefined", - "formattedType": "false | true | \"trap-focus\"", + "type": "\"trap-focus\" | boolean | undefined", + "formattedType": "\"trap-focus\" | false | true", "required": false, "description": "Determines if the dropdown menu enters a modal state when open.\n\n- `true`: user interaction is limited to the dropdown menu: document page scroll\n is locked, and pointer interactions on outside elements are disabled.\n- `false`: user interaction with the rest of the document is allowed.\n- `'trap-focus'`: focus is trapped inside the dropdown menu, but document page\n scroll is not locked and pointer interactions outside of it remain enabled.", "default": "true" @@ -14080,8 +14083,8 @@ }, { "name": "closeOnOutsidePress", - "type": "\"pointerdown\" | \"click\" | undefined", - "formattedType": "\"pointerdown\" | \"click\"", + "type": "\"click\" | \"pointerdown\" | undefined", + "formattedType": "\"click\" | \"pointerdown\"", "required": false, "description": "When to close the menu on outside interactions (clicking outside or clicking the trigger when open).\n- `'pointerdown'`: Close immediately when pointer is pressed outside (default)\n- `'click'`: Close when a full click (pointerdown + pointerup) occurs outside", "default": "'pointerdown'" @@ -14128,8 +14131,8 @@ }, { "name": "dragSelection", - "type": "false | \"keep\" | \"rubber-band\" | undefined", - "formattedType": "false | \"keep\" | \"rubber-band\"", + "type": "\"keep\" | \"rubber-band\" | false | undefined", + "formattedType": "\"keep\" | \"rubber-band\" | false", "required": false, "description": "Lets the user press a checkbox item and drag across others to set them all\nto the pressed item's new state. Off by default. `'keep'` keeps rows set\nonce the pointer has reached them; `'rubber-band'` returns rows outside the\ncurrent span to their previous state. Mouse and pen only.", "default": "false" @@ -14230,8 +14233,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, DropdownMenuTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: DropdownMenu.Trigger.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, DropdownMenuTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: DropdownMenu.Trigger.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14250,8 +14253,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -14270,8 +14273,8 @@ "props": [ { "name": "showOn", - "type": "\"open\" | \"focus\" | undefined", - "formattedType": "\"open\" | \"focus\"", + "type": "\"focus\" | \"open\" | undefined", + "formattedType": "\"focus\" | \"open\"", "required": false, "description": "Controls when the backdrop becomes visible for submenus.\n- `\"focus\"`: Show when the submenu becomes the focus owner (prevents flicker on hover).\n If a deeper submenu is open, the backdrop remains visible.\n- `\"open\"`: Show as soon as the submenu opens, regardless of focus.", "default": "\"focus\" for submenus, \"open\" for root menu" @@ -14285,8 +14288,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -14362,8 +14365,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxGroup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14436,8 +14439,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14585,8 +14588,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuCheckboxItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuCheckboxItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.CheckboxItem.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14675,8 +14678,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14720,8 +14723,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFocusZoneState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFocusZoneState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFocusZoneState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14752,8 +14755,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFooterState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFooterState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14789,8 +14792,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14863,8 +14866,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14929,8 +14932,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuHeaderState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuHeaderState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -14961,8 +14964,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15031,8 +15034,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuInputState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuInputState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15145,8 +15148,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15282,8 +15285,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLinkItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLinkItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15356,8 +15359,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -15414,8 +15417,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15458,8 +15461,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLoadingState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLoadingState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15496,8 +15499,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes popup + subpage navigation state." }, @@ -15523,8 +15526,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -15541,7 +15544,7 @@ "name": "DropdownMenuPositionerAlign", "kind": "typealias", "doc": "Extended align options for popup menus.\n- 'start' | 'center' | 'end': Standard Base UI alignment\n- 'list-start': Align trigger top with the top of the List component (horizontal sides only)", - "definition": "PopoverPositionerProps['align'] | 'list-start'" + "definition": "| PopoverPositionerProps['align']\n| 'list-start'" }, "DropdownMenuPositionerProps": { "name": "DropdownMenuPositionerProps", @@ -15551,7 +15554,7 @@ "name": "align", "type": "PopupMenuPositionerAlign", "shortType": "Align", - "formattedType": "\"center\" | \"end\" | \"start\" | \"list-start\"", + "formattedType": "\"center\" | \"end\" | \"list-start\" | \"start\"", "required": false, "description": "How to align the popup relative to the specified side.\n- 'start': align to start of anchor\n- 'center': align to center of anchor\n- 'end': align to end of anchor\n- 'list-start': align the List component's top with the anchor top (horizontal sides only)", "default": "'start' for submenus, 'center' for root dropdowns" @@ -15571,8 +15574,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15640,8 +15643,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioGroup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioGroup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15714,8 +15717,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15834,8 +15837,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuRadioItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.RadioItem.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuRadioItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.RadioItem.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15900,7 +15903,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The direction to scroll when hovering over this arrow." }, @@ -15936,8 +15939,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -15951,7 +15954,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The scroll direction this arrow controls." }, @@ -15984,8 +15987,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -16027,8 +16030,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -16078,8 +16081,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16109,8 +16112,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuShortcutState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.Shortcut.State) => ReactNode", + "type": "((state: PopupMenuShortcutState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.Shortcut.State) => ReactNode", "required": false, "description": "Content to render inside the shortcut.\nCan be a render function that receives the shortcut value.\nIf not provided, renders the shortcut value from the parent Item." }, @@ -16130,8 +16133,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuShortcutState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuShortcutState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Shortcut.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16264,8 +16267,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubmenuTriggerIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTriggerIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubmenuTriggerIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTriggerIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16394,8 +16397,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubmenuTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTrigger.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubmenuTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.SubmenuTrigger.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16514,8 +16517,8 @@ }, { "name": "onSelectAsync", - "type": "((context: OnSelectAsyncContext) => Promise) | undefined", - "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", + "type": "((context: OnSelectAsyncContext) => Promise) | undefined", + "formattedType": "(\n context: OnSelectAsyncContext,\n) => Promise", "required": false, "description": "Async callback when this item is selected.\n\nWhen provided, this takes precedence over `onSelect`.\nIf provided, this callback is awaited before navigating back.\nReturn `false` to prevent automatic navigation." }, @@ -16535,8 +16538,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16620,8 +16623,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageBackState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageBackState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageBackState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16748,8 +16751,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSubpageTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSubpageTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuSubpageTriggerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -16880,8 +16883,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", "required": false, "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", "default": "'after-exit'" @@ -16912,7 +16915,8 @@ { "name": "children", "type": "ReactNode", - "required": true + "required": true, + "description": "Children (Input, List, etc.)" }, { "name": "style", @@ -16930,23 +16934,23 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity.", - "referencePath": "@bazza-ui/react.NodeDef" + "referencePath": "@bazza-ui/react.PopupMenuNode" }, { "name": "asyncContent", "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", "referencePath": "@bazza-ui/react.AsyncLoaderConfig" @@ -16954,7 +16958,7 @@ { "name": "asyncContentMode", "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "formattedType": "\"append\" | \"replace\"", "required": false, "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", "default": "'replace'", @@ -16979,7 +16983,7 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", "default": "true", @@ -17742,7 +17746,7 @@ "DropdownMenuFilterFn": { "name": "DropdownMenuFilterFn", "kind": "typealias", - "definition": "(value: string, search: string, keywords?: string[]) => number" + "definition": "(\n value: string,\n search: string,\n keywords?: string[],\n) => number" }, "DropdownMenuItemRegistration": { "name": "DropdownMenuItemRegistration", @@ -17848,8 +17852,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\"", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean", + "formattedType": "\"after-exit\" | false | true", "required": true, "description": "Whether to clear search on close.\n- `true`: clear immediately when menu closes (default)\n- `false`: preserve search when menu closes\n- `'after-exit'`: clear after exit animation completes (requires Surface to call clearSearch)" }, @@ -18004,7 +18008,7 @@ { "name": "openMethod", "type": "OpenMethod | null", - "formattedType": "null | \"keyboard\" | \"touch\" | \"mouse\" | \"pen\"", + "formattedType": "null | \"keyboard\" | \"mouse\" | \"pen\" | \"touch\"", "required": true, "description": "How the listbox was most recently opened (`mouse`/`touch`/`pen`/`keyboard`).\n`null` until first opened. Retained after close (only updated on open)." }, @@ -18037,7 +18041,7 @@ { "name": "highlightSource", "type": "HighlightSource", - "formattedType": "null | \"pointer\" | \"keyboard\" | \"auto\"", + "formattedType": "null | \"auto\" | \"keyboard\" | \"pointer\"", "required": true, "description": "Source of the current highlight (keyboard or pointer)" }, @@ -18456,8 +18460,8 @@ }, { "name": "fetchStatus", - "type": "\"paused\" | \"idle\" | \"fetching\" | undefined", - "formattedType": "\"paused\" | \"idle\" | \"fetching\"", + "type": "\"fetching\" | \"idle\" | \"paused\" | undefined", + "formattedType": "\"fetching\" | \"idle\" | \"paused\"", "required": false, "description": "TanStack fetch status (`fetching` | `paused` | `idle`)" }, @@ -18700,8 +18704,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Select.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Select.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -18780,8 +18784,8 @@ }, { "name": "children", - "type": "ReactNode | ((state: SelectItemIndicatorState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: Select.ItemIndicator.State) => ReactNode", + "type": "((state: SelectItemIndicatorState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: Select.ItemIndicator.State) => ReactNode", "required": false, "description": "Content to render. Can be a ReactNode or a function that receives state." }, @@ -18801,8 +18805,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectItemIndicatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Select.ItemIndicator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectItemIndicatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Select.ItemIndicator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -18848,8 +18852,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectItemLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Select.ItemLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectItemLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Select.ItemLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -18868,8 +18872,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: Select.Popup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: Select.Popup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes Select-specific alignment state." }, @@ -18889,7 +18893,7 @@ { "name": "side", "type": "\"none\" | Side", - "formattedType": "| 'none'\n | 'left'\n | 'right'\n | 'bottom'\n | 'top'\n | 'inline-end'\n | 'inline-start'", + "formattedType": "| 'bottom'\n | 'inline-end'\n | 'inline-start'\n | 'left'\n | 'none'\n | 'right'\n | 'top'", "required": true, "description": "Side the popup is placed on relative to the trigger.\n\nReports `'none'` while `alignItemWithTrigger` positioning is active, because\nthe popup overlaps the trigger and therefore has no physical side. This\nmirrors Base UI's behavior instead of leaking the `'bottom'` fallback that\nthe underlying Popover computes when no side is provided." }, @@ -18900,6 +18904,13 @@ "required": true, "description": "Whether the popup is currently using align-item-with-trigger positioning.\nThis reflects the actual state, not just the prop value - it will be false\nif alignment couldn't be applied (e.g., not enough space, no selected item)." }, + { + "name": "isSubmenu", + "type": "boolean", + "formattedType": "false | true", + "required": true, + "description": "Whether this popup is a submenu (not the root menu)." + }, { "name": "hasOpenSubpage", "type": "boolean", @@ -18919,13 +18930,6 @@ "type": "string[]", "required": true, "description": "Ordered stack of open non-root subpage IDs.\nFor nested subpages this includes each page in open order." - }, - { - "name": "isSubmenu", - "type": "boolean", - "formattedType": "false | true", - "required": true, - "description": "Whether this popup is a submenu (not the root menu)." } ] }, @@ -18950,8 +18954,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -19126,22 +19130,22 @@ { "name": "items", "type": "Items | undefined", - "formattedType": "Record | ItemsEntry[]", + "formattedType": "ItemsEntry[] | Record", "required": false, "description": "Data structure of the items rendered in the select popup.\nWhen specified, `` renders the label of the selected item\ninstead of the raw value.\n\nCan be a record mapping values to labels, or an array of\n`{ value, label, keywords? }` objects. Only the array form can express\n`keywords` (extra filter terms) or a `null` (clearable) value." }, { "name": "modal", - "type": "boolean | \"trap-focus\" | undefined", - "formattedType": "false | true | \"trap-focus\"", + "type": "\"trap-focus\" | boolean | undefined", + "formattedType": "\"trap-focus\" | false | true", "required": false, "description": "Determines if the select enters a modal state when open.\n\n- `true`: user interaction is limited to the select: document page scroll\n is locked, and pointer interactions on outside elements are disabled.\n- `false`: user interaction with the rest of the document is allowed.\n- `'trap-focus'`: focus is trapped inside the select, but document page\n scroll is not locked and pointer interactions outside of it remain enabled.", "default": "true" }, { "name": "closeOnOutsidePress", - "type": "\"pointerdown\" | \"click\" | undefined", - "formattedType": "\"pointerdown\" | \"click\"", + "type": "\"click\" | \"pointerdown\" | undefined", + "formattedType": "\"click\" | \"pointerdown\"", "required": false, "description": "When to close the select on outside interactions.\n- 'pointerdown': Close immediately when pointer is pressed outside (default)\n- 'click': Close when a full click (pointerdown + pointerup) occurs outside", "default": "'pointerdown'" @@ -19234,8 +19238,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectTriggerState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Select.Trigger.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectTriggerState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Select.Trigger.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19287,8 +19291,8 @@ }, { "name": "children", - "type": "ReactNode | ((state: SelectValueState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: Select.Value.State) => ReactNode", + "type": "((state: SelectValueState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: Select.Value.State) => ReactNode", "required": false, "description": "Custom render function for the selected value content.\nReceives the current state and should return the content to render.\nThis is different from the `render` prop which replaces the element." }, @@ -19308,8 +19312,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, SelectValueState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: Select.Value.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, SelectValueState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: Select.Value.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19379,8 +19383,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -19399,8 +19403,8 @@ "props": [ { "name": "showOn", - "type": "\"open\" | \"focus\" | undefined", - "formattedType": "\"open\" | \"focus\"", + "type": "\"focus\" | \"open\" | undefined", + "formattedType": "\"focus\" | \"open\"", "required": false, "description": "Controls when the backdrop becomes visible for submenus.\n- `\"focus\"`: Show when the submenu becomes the focus owner (prevents flicker on hover).\n If a deeper submenu is open, the backdrop remains visible.\n- `\"open\"`: Show as soon as the submenu opens, regardless of focus.", "default": "\"focus\" for submenus, \"open\" for root menu" @@ -19414,8 +19418,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverBackdropState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -19453,8 +19457,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19503,8 +19507,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19577,8 +19581,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19643,8 +19647,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19713,8 +19717,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuInputState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuInputState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Input.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19758,8 +19762,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -19816,8 +19820,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19840,8 +19844,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -19862,7 +19866,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The direction to scroll when hovering over this arrow." }, @@ -19898,8 +19902,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -19913,7 +19917,7 @@ "name": "direction", "type": "Direction", "shortType": "Direction", - "formattedType": "\"up\" | \"down\"", + "formattedType": "\"down\" | \"up\"", "required": true, "description": "The scroll direction this arrow controls." }, @@ -19946,8 +19950,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -19989,8 +19993,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuScrollArrowState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuScrollArrowState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.ScrollArrow.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -20040,8 +20044,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -20325,13 +20329,6 @@ "description": "Controls auto-highlighting behavior when the select opens.\n- `true`: highlight the first item (default when alignItemWithTrigger is inactive)\n- `false`: don't auto-highlight any item\n- `'selected'`: highlight the currently selected item, or first item if none selected\n- `string`: highlight the item with this specific value\n\nNote: When the Positioner's `alignItemWithTrigger` is active and this prop\nis not explicitly set, the selected item is automatically highlighted.", "default": "true (or selected value when alignItemWithTrigger is active)" }, - { - "name": "search", - "type": "string | undefined", - "formattedType": "string", - "required": false, - "description": "Controlled search value." - }, { "name": "style", "type": "CSSProperties | (CSSProperties & ((state: PopupMenuSurfaceState) => CSSProperties | undefined)) | undefined", @@ -20339,22 +20336,6 @@ "required": false, "description": "Style applied to the element, or a function that\nreturns a style object based on the component's state." }, - { - "name": "filter", - "type": "false | FilterFn | undefined", - "formattedType": "false | FilterFn", - "required": false, - "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", - "default": "commandScore (fuzzy matching)" - }, - { - "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", - "required": false, - "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity.", - "referencePath": "@bazza-ui/react.NodeDef" - }, { "name": "className", "type": "string | ((state: PopupMenuSurfaceState) => string | undefined) | undefined", @@ -20363,62 +20344,45 @@ "description": "CSS class applied to the element, or a function that\nreturns a class based on the component's state." }, { - "name": "normalizeSearch", - "type": "SearchNormalizer | undefined", - "formattedType": "SearchNormalizer", - "required": false, - "description": "Transforms search input before filtering and visibility logic.", - "default": "trim whitespace (`search.trim()`)" - }, - { - "name": "loop", - "type": "boolean | undefined", - "formattedType": "false | true", - "required": false, - "description": "Whether navigation should loop from last to first item and vice versa.", - "default": "true" - }, - { - "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "name": "render", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", "required": false, - "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", - "default": "'after-exit'" + "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { - "name": "resetScrollOnSearch", - "type": "boolean | undefined", - "formattedType": "false | true", + "name": "content", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, - "description": "Whether to reset the list scroll position when the search query changes.", - "default": "true" + "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity.", + "referencePath": "@bazza-ui/react.PopupMenuNode" }, { - "name": "onSearchChange", - "type": "((search: string) => void) | undefined", - "formattedType": "(search: string) => void", + "name": "asyncContent", + "type": "AsyncLoaderConfig | undefined", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, - "description": "Callback when search value changes." + "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", + "referencePath": "@bazza-ui/react.AsyncLoaderConfig" }, { - "name": "orderedItems", - "type": "string[] | undefined", - "formattedType": "string[]", + "name": "asyncContentMode", + "type": "AsyncContentMode | undefined", + "formattedType": "\"append\" | \"replace\"", "required": false, - "description": "Ordered list of item values when using `filter={false}`.\nThis tells the store the intended display order for navigation/highlighting.\nRequired when `filter={false}` - must always be provided with the current visible items." - }, - { - "name": "children", - "type": "ReactNode", - "required": true + "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", + "default": "'replace'", + "referencePath": "@bazza-ui/react.AsyncContentMode" }, { - "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", + "name": "asyncContentReveal", + "type": "AsyncResultBehavior | undefined", + "formattedType": "\"block\" | \"stream\"", "required": false, - "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." + "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", + "default": "'stream'", + "referencePath": "@bazza-ui/react.AsyncResultBehavior" }, { "name": "deepSearch", @@ -20430,37 +20394,41 @@ { "name": "includeInDeepSearch", "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", + "formattedType": "\"trigger-only\" | false | true", "required": false, "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", "default": "true", "referencePath": "@bazza-ui/react.IncludeInDeepSearch" }, { - "name": "asyncContent", - "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", + "name": "filter", + "type": "false | FilterFn | undefined", + "formattedType": "false | FilterFn", "required": false, - "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", - "referencePath": "@bazza-ui/react.AsyncLoaderConfig" + "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", + "default": "commandScore (fuzzy matching)" }, { - "name": "asyncContentMode", - "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "name": "normalizeSearch", + "type": "SearchNormalizer | undefined", + "formattedType": "SearchNormalizer", "required": false, - "description": "How rows from `asyncContent` combine with `content` once they load.\n- `'replace'`: the loaded rows replace `content` (`content` shows until then).\n- `'append'`: `content` stays first and the loaded rows follow it. A loaded\n row whose Definition Key matches a row already in `content` (including\n rows inside groups and tree items) is dropped, so local rows win.", - "default": "'replace'", - "referencePath": "@bazza-ui/react.AsyncContentMode" + "description": "Transforms search input before filtering and visibility logic.", + "default": "trim whitespace (`search.trim()`)" }, { - "name": "asyncContentReveal", - "type": "AsyncResultBehavior | undefined", - "formattedType": "\"block\" | \"stream\"", + "name": "search", + "type": "string | undefined", + "formattedType": "string", + "required": false, + "description": "Controlled search value." + }, + { + "name": "onSearchChange", + "type": "((search: string) => void) | undefined", + "formattedType": "(search: string) => void", "required": false, - "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", - "default": "'stream'", - "referencePath": "@bazza-ui/react.AsyncResultBehavior" + "description": "Callback when search value changes." }, { "name": "defaultSearch", @@ -20470,6 +20438,30 @@ "description": "Default search value for uncontrolled usage.", "default": "''" }, + { + "name": "loop", + "type": "boolean | undefined", + "formattedType": "false | true", + "required": false, + "description": "Whether navigation should loop from last to first item and vice versa.", + "default": "true" + }, + { + "name": "clearSearchOnClose", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", + "required": false, + "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", + "default": "'after-exit'" + }, + { + "name": "resetScrollOnSearch", + "type": "boolean | undefined", + "formattedType": "false | true", + "required": false, + "description": "Whether to reset the list scroll position when the search query changes.", + "default": "true" + }, { "name": "skipAutoFocus", "type": "boolean | undefined", @@ -20477,6 +20469,19 @@ "required": false, "description": "Whether to skip auto-focusing the input/list when this surface becomes the focus owner.\nUseful for Combobox where the input is outside the popup and should retain focus.", "default": "false" + }, + { + "name": "orderedItems", + "type": "string[] | undefined", + "formattedType": "string[]", + "required": false, + "description": "Ordered list of item values when using `filter={false}`.\nThis tells the store the intended display order for navigation/highlighting.\nRequired when `filter={false}` - must always be provided with the current visible items." + }, + { + "name": "children", + "type": "ReactNode", + "required": true, + "description": "Children (Input, List, etc.)" } ] }, @@ -20594,7 +20599,7 @@ { "name": "items", "type": "Items | undefined", - "formattedType": "Record | ItemsEntry[]", + "formattedType": "ItemsEntry[] | Record", "required": false, "description": "Data structure of the items for label resolution.\nUsed to display labels before items mount (e.g., on initial render with defaultValue).\nCan be a record mapping values to labels, or an array of\n`{ value, label, keywords? }` objects." }, @@ -20669,7 +20674,7 @@ { "name": "side", "type": "\"none\" | Side", - "formattedType": "\"none\" | \"left\" | \"right\" | \"bottom\" | \"top\"", + "formattedType": "\"bottom\" | \"left\" | \"none\" | \"right\" | \"top\"", "required": true, "description": "The rendered side of the popup (or 'none' when using align-item-with-trigger)." }, @@ -20768,7 +20773,7 @@ "SelectFilterFn": { "name": "SelectFilterFn", "kind": "typealias", - "definition": "(value: string, search: string, keywords?: string[]) => number" + "definition": "(\n value: string,\n search: string,\n keywords?: string[],\n) => number" }, "SelectItemRegistration": { "name": "SelectItemRegistration", @@ -20874,8 +20879,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\"", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean", + "formattedType": "\"after-exit\" | false | true", "required": true, "description": "Whether to clear search on close.\n- `true`: clear immediately when menu closes (default)\n- `false`: preserve search when menu closes\n- `'after-exit'`: clear after exit animation completes (requires Surface to call clearSearch)" }, @@ -21030,7 +21035,7 @@ { "name": "openMethod", "type": "OpenMethod | null", - "formattedType": "null | \"keyboard\" | \"touch\" | \"mouse\" | \"pen\"", + "formattedType": "null | \"keyboard\" | \"mouse\" | \"pen\" | \"touch\"", "required": true, "description": "How the listbox was most recently opened (`mouse`/`touch`/`pen`/`keyboard`).\n`null` until first opened. Retained after close (only updated on open)." }, @@ -21063,7 +21068,7 @@ { "name": "highlightSource", "type": "HighlightSource", - "formattedType": "null | \"pointer\" | \"keyboard\" | \"auto\"", + "formattedType": "null | \"auto\" | \"keyboard\" | \"pointer\"", "required": true, "description": "Source of the current highlight (keyboard or pointer)" }, @@ -21163,18 +21168,18 @@ "name": "SuggestionMenuHighlightChangeEventDetails", "kind": "typealias", "doc": "Event details passed to the `onHighlightChange` callback.", - "definition": "GenericEventDetails", + "definition": "GenericEventDetails<\n SuggestionMenuHighlightChangeReason,\n { index: number }\n>", "props": [ { "name": "reason", "type": "SuggestionMenuHighlightChangeReason", - "formattedType": "\"pointer\" | \"keyboard\" | \"none\"", + "formattedType": "\"keyboard\" | \"none\" | \"pointer\"", "required": true, "description": "The reason why this event occurred." }, { "name": "event", - "type": "Event | MouseEvent | PointerEvent | KeyboardEvent", + "type": "Event | KeyboardEvent | MouseEvent | PointerEvent", "required": true, "description": "The native DOM event that triggered this event." } @@ -21184,7 +21189,7 @@ "name": "SuggestionMenuHighlightChangeReason", "kind": "typealias", "doc": "Reasons why the highlight changed.", - "definition": "typeof REASONS.pointer | typeof REASONS.keyboard | typeof REASONS.none" + "definition": "| typeof REASONS.pointer\n| typeof REASONS.keyboard\n| typeof REASONS.none" }, "SuggestionMenuOpenChangeEventDetails": { "name": "SuggestionMenuOpenChangeEventDetails", @@ -21195,14 +21200,14 @@ { "name": "reason", "type": "SuggestionMenuOpenChangeReason", - "formattedType": "| 'escape-key'\n | 'outside-press'\n | 'focus-out'\n | 'item-press'\n | 'imperative-action'\n | 'no-results'\n | 'none'", + "formattedType": "| 'escape-key'\n | 'focus-out'\n | 'imperative-action'\n | 'item-press'\n | 'no-results'\n | 'none'\n | 'outside-press'", "required": true, "description": "The reason why this state change occurred.\nUse this to conditionally handle different scenarios." }, { "name": "event", - "type": "Event | MouseEvent | PointerEvent | TouchEvent | KeyboardEvent | FocusEvent", - "formattedType": "| Event\n | MouseEvent\n | PointerEvent\n | TouchEvent\n | KeyboardEvent\n | FocusEvent", + "type": "Event | FocusEvent | KeyboardEvent | MouseEvent | PointerEvent | TouchEvent", + "formattedType": "| Event\n | FocusEvent\n | KeyboardEvent\n | MouseEvent\n | PointerEvent\n | TouchEvent", "required": true, "description": "The native DOM event that triggered this change.\nMay be a synthetic event in some cases." }, @@ -21245,7 +21250,7 @@ "name": "SuggestionMenuOpenChangeReason", "kind": "typealias", "doc": "Reasons why the suggestion menu's open state changed.\n- `imperative-action`: the handle's `update()` or `close()`, or the host\n input was detached or replaced\n- `item-press`: a row was chosen (click or Enter)\n- `escape-key`: Escape was pressed in the host input\n- `outside-press`: a press outside the popup and the host input\n- `focus-out`: the host input lost focus\n- `no-results`: with `noResults: 'close'`, the results settled empty", - "definition": "typeof REASONS.imperativeAction | typeof REASONS.itemPress | typeof REASONS.escapeKey | typeof REASONS.outsidePress | typeof REASONS.focusOut | typeof REASONS.noResults | typeof REASONS.none" + "definition": "| typeof REASONS.imperativeAction\n| typeof REASONS.itemPress\n| typeof REASONS.escapeKey\n| typeof REASONS.outsidePress\n| typeof REASONS.focusOut\n| typeof REASONS.noResults\n| typeof REASONS.none" }, "SuggestionMenuAnchor": { "name": "SuggestionMenuAnchor", @@ -21302,8 +21307,8 @@ }, { "name": "children", - "type": "ReactNode | ((state: PopupMenuListChildrenState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: PopupMenu.List.ChildrenState) => ReactNode", + "type": "((state: PopupMenuListChildrenState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: PopupMenu.List.ChildrenState) => ReactNode", "required": true, "description": "Content to render inside the list.\nCan be a render function that receives the current search state." }, @@ -21352,8 +21357,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuListState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuListState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.List.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -21372,8 +21377,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuPopupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuPopupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLAttributes,\n state: PopupMenu.Popup.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows replacing the popup element with a custom element.\nThe render state includes popup + subpage navigation state." }, @@ -21393,7 +21398,7 @@ { "name": "side", "type": "Side | undefined", - "formattedType": "| 'left'\n | 'right'\n | 'bottom'\n | 'top'\n | 'inline-end'\n | 'inline-start'", + "formattedType": "| 'bottom'\n | 'inline-end'\n | 'inline-start'\n | 'left'\n | 'right'\n | 'top'", "required": false, "description": "Which side of the anchor to place the popup on. If there's no room, it\nopens on the other side, and stays there until it closes.", "default": "'bottom'" @@ -21402,7 +21407,7 @@ "name": "align", "type": "PopupMenuPositionerAlign", "shortType": "Align", - "formattedType": "\"center\" | \"end\" | \"start\" | \"list-start\"", + "formattedType": "\"center\" | \"end\" | \"list-start\" | \"start\"", "required": false, "description": "How to align the popup against the anchor.", "default": "'start'" @@ -21422,8 +21427,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPositionerState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -21545,8 +21550,8 @@ }, { "name": "children", - "type": "ReactNode | ((state: SuggestionMenuRootRenderState) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (state: SuggestionMenuRootRenderState) => ReactNode", + "type": "((state: SuggestionMenuRootRenderState) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (state: SuggestionMenuRootRenderState) => ReactNode", "required": true, "description": "The menu's parts, or a function of the payload and query that returns them." } @@ -21585,7 +21590,7 @@ { "name": "asyncContentMode", "type": "AsyncContentMode | undefined", - "formattedType": "\"replace\" | \"append\"", + "formattedType": "\"append\" | \"replace\"", "required": false, "description": "How rows from `asyncContent` combine with `content`.", "default": "'append'", @@ -21599,27 +21604,67 @@ "description": "Style applied to the element, or a function that\nreturns a style object based on the component's state." }, { - "name": "filter", - "type": "false | FilterFn | undefined", - "formattedType": "false | FilterFn", + "name": "className", + "type": "string | ((state: PopupMenuSurfaceState) => string | undefined) | undefined", + "formattedType": "string | (state: PopupMenu.Surface.State) => string", "required": false, - "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", - "default": "commandScore (fuzzy matching)" + "description": "CSS class applied to the element, or a function that\nreturns a class based on the component's state." + }, + { + "name": "render", + "type": "ComponentRenderFn, PopupMenuSurfaceState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)\n | ReactElement", + "required": false, + "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, { "name": "content", - "type": "NodeDef[] | PopupMenuNode[] | undefined", - "formattedType": "NodeDef[] | PopupMenuNode[]", + "type": "PopupMenuNode[] | NodeDef[] | undefined", + "formattedType": "PopupMenuNode[] | NodeDef[]", "required": false, "description": "The menu content (node definitions with render functions). Resolved nodes\nare accepted anywhere defs are; they are unwrapped to their defs, and\nre-supplying the same nodes preserves identity.", - "referencePath": "@bazza-ui/react.NodeDef" + "referencePath": "@bazza-ui/react.PopupMenuNode" }, { - "name": "className", - "type": "string | ((state: PopupMenuSurfaceState) => string | undefined) | undefined", - "formattedType": "string | (state: PopupMenu.Surface.State) => string", + "name": "asyncContent", + "type": "AsyncLoaderConfig | undefined", + "formattedType": "QueryLoaderConfig | StaticLoaderConfig", "required": false, - "description": "CSS class applied to the element, or a function that\nreturns a class based on the component's state." + "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", + "referencePath": "@bazza-ui/react.AsyncLoaderConfig" + }, + { + "name": "asyncContentReveal", + "type": "AsyncResultBehavior | undefined", + "formattedType": "\"block\" | \"stream\"", + "required": false, + "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", + "default": "'stream'", + "referencePath": "@bazza-ui/react.AsyncResultBehavior" + }, + { + "name": "deepSearch", + "type": "boolean | DeepSearchConfig | undefined", + "formattedType": "false | true | DeepSearchConfig", + "required": false, + "description": "Deep search configuration" + }, + { + "name": "includeInDeepSearch", + "type": "IncludeInDeepSearch | undefined", + "formattedType": "\"trigger-only\" | false | true", + "required": false, + "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", + "default": "true", + "referencePath": "@bazza-ui/react.IncludeInDeepSearch" + }, + { + "name": "filter", + "type": "false | FilterFn | undefined", + "formattedType": "false | FilterFn", + "required": false, + "description": "Filter function for matching items against search query.\nReturns a score between 0 and 1 (0 = no match, > 0 = match).\nPass `false` to disable filtering entirely.", + "default": "commandScore (fuzzy matching)" }, { "name": "normalizeSearch", @@ -21647,8 +21692,8 @@ }, { "name": "clearSearchOnClose", - "type": "boolean | \"after-exit\" | undefined", - "formattedType": "false | true | \"after-exit\"", + "type": "\"after-exit\" | boolean | undefined", + "formattedType": "\"after-exit\" | false | true", "required": false, "description": "Whether to clear the search query when the menu closes.\n- `'after-exit'`: clear after exit animation completes (default)\n- `true`: clear immediately when menu closes\n- `false`: preserve search when menu closes", "default": "'after-exit'" @@ -21671,47 +21716,8 @@ { "name": "children", "type": "ReactNode", - "required": true - }, - { - "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSurfaceState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Surface.State,\n ) => ReactElement)", - "required": false, - "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." - }, - { - "name": "deepSearch", - "type": "boolean | DeepSearchConfig | undefined", - "formattedType": "false | true | DeepSearchConfig", - "required": false, - "description": "Deep search configuration" - }, - { - "name": "includeInDeepSearch", - "type": "IncludeInDeepSearch | undefined", - "formattedType": "false | true | \"trigger-only\"", - "required": false, - "description": "Default inclusion mode for descendant branch nodes in deep search results.\nSubmenus/subpages can override via `includeInDeepSearch`.", - "default": "true", - "referencePath": "@bazza-ui/react.IncludeInDeepSearch" - }, - { - "name": "asyncContent", - "type": "AsyncLoaderConfig | undefined", - "formattedType": "StaticLoaderConfig | QueryLoaderConfig", - "required": false, - "description": "Async content configuration for root-level async loading.\nWhen provided, the Loader component will be rendered to fetch async data.\nHow its rows combine with `content` is set by `asyncContentMode`.", - "referencePath": "@bazza-ui/react.AsyncLoaderConfig" - }, - { - "name": "asyncContentReveal", - "type": "AsyncResultBehavior | undefined", - "formattedType": "\"block\" | \"stream\"", - "required": false, - "description": "When rows from `asyncContent` appear.\n- `'stream'`: as soon as they load (local `content` shows meanwhile).\n- `'block'`: only once the loader has settled for the current search. Until\n then the previous settled list stays up unchanged; before anything has\n settled the list is empty and `Loading` shows. Rows kept from a previous\n search while the next one loads don't count as settled.\n\nDeep search has its own `deepSearch.asyncResultBehavior`, which still shows\nthe loading state while a new search loads.", - "default": "'stream'", - "referencePath": "@bazza-ui/react.AsyncResultBehavior" + "required": true, + "description": "Children (Input, List, etc.)" } ] }, @@ -21731,20 +21737,20 @@ "name": "SuggestionMenuTextTriggerHandle", "kind": "typealias", "doc": "What the binding needs from a handle.", - "definition": "Pick, 'attach' | 'update' | 'close' | 'handleKeyDown' | 'host' | 'subscribeOpenChange'>", + "definition": "Pick<\n SuggestionMenuHandle,\n | 'attach'\n | 'update'\n | 'close'\n | 'handleKeyDown'\n | 'host'\n | 'subscribeOpenChange'\n>", "props": [ { - "name": "close", - "type": "() => void", + "name": "host", + "type": "Element | null", + "formattedType": "null | Element", "required": true, - "description": "Closes the menu. Call it whenever the trigger ends (deleted, or the caret\nleft it), even if the menu is already closed: it also resets what the\nmenu remembers about the trigger, such as a query that had no results." + "description": "The attached host input, if any." }, { - "name": "handleKeyDown", - "type": "(event: KeyboardEvent | React.KeyboardEvent) => boolean", - "formattedType": "(\n event: KeyboardEvent | React.KeyboardEvent,\n) => boolean", + "name": "attach", + "type": "(element: Element) => () => void", "required": true, - "description": "Passes a key press from the host input to the menu. Returns `true` when\nthe menu used the key and prevented its default action; `false` means the\nkey keeps its normal meaning in the host." + "description": "Attaches the host input. Attaching another element detaches the previous\none and closes the menu if it was open for it. Returns a function that\ndetaches this element." }, { "name": "update", @@ -21754,17 +21760,17 @@ "description": "Opens the menu, or updates its query, anchor and payload while open." }, { - "name": "host", - "type": "Element | null", - "formattedType": "null | Element", + "name": "close", + "type": "() => void", "required": true, - "description": "The attached host input, if any." + "description": "Closes the menu. Call it whenever the trigger ends (deleted, or the caret\nleft it), even if the menu is already closed: it also resets what the\nmenu remembers about the trigger, such as a query that had no results." }, { - "name": "attach", - "type": "(element: Element) => () => void", + "name": "handleKeyDown", + "type": "(event: KeyboardEvent | React.KeyboardEvent) => boolean", + "formattedType": "(\n event: KeyboardEvent | React.KeyboardEvent,\n) => boolean", "required": true, - "description": "Attaches the host input. Attaching another element detaches the previous\none and closes the menu if it was open for it. Returns a function that\ndetaches this element." + "description": "Passes a key press from the host input to the menu. Returns `true` when\nthe menu used the key and prevented its default action; `false` means the\nkey keeps its normal meaning in the host." }, { "name": "subscribeOpenChange", @@ -21856,8 +21862,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverArrowState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -21895,8 +21901,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuEmptyState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuEmptyState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Empty.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -21940,8 +21946,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuFooterState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuFooterState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuFooterState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -21972,8 +21978,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupLabelState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupLabelState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.GroupLabel.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22012,8 +22018,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuGroupState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuGroupState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Group.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22039,8 +22045,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuHeaderState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuHeaderState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuHeaderState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22066,8 +22072,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuIconState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuIconState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Icon.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22167,8 +22173,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Item.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22304,8 +22310,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLinkItemState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLinkItemState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLinkItemState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22344,8 +22350,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuLoadingState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuLoadingState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenuLoadingState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22364,8 +22370,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)", + "type": "ComponentRenderFn | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopoverPortalState,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." }, @@ -22406,8 +22412,8 @@ }, { "name": "render", - "type": "ReactElement> | ComponentRenderFn, PopupMenuSeparatorState> | undefined", - "formattedType": "| ReactElement\n | ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)", + "type": "ComponentRenderFn, PopupMenuSeparatorState> | ReactElement> | undefined", + "formattedType": "| ((\n props: HTMLProps,\n state: PopupMenu.Separator.State,\n ) => ReactElement)\n | ReactElement", "required": false, "description": "Allows you to replace the component's HTML element\nwith a different tag, or compose it with another component.\n\nAccepts a `ReactElement` or a function that returns the element to render." } @@ -22437,13 +22443,19 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { "name": "variant", - "type": "\"link\" | \"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | null | undefined", - "formattedType": "| null\n | 'link'\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost'", + "type": "\"default\" | \"destructive\" | \"ghost\" | \"link\" | \"outline\" | \"secondary\" | null | undefined", + "formattedType": "| null\n | 'default'\n | 'destructive'\n | 'ghost'\n | 'link'\n | 'outline'\n | 'secondary'", + "required": false + }, + { + "name": "className", + "type": "string | undefined", + "formattedType": "string", "required": false }, { @@ -22453,16 +22465,10 @@ }, { "name": "size", - "type": "\"icon\" | \"default\" | \"sm\" | \"lg\" | null | undefined", - "formattedType": "null | \"icon\" | \"default\" | \"sm\" | \"lg\"", + "type": "\"default\" | \"icon\" | \"lg\" | \"sm\" | null | undefined", + "formattedType": "null | \"default\" | \"icon\" | \"lg\" | \"sm\"", "required": true }, - { - "name": "className", - "type": "string | undefined", - "formattedType": "string", - "required": false - }, { "name": "asChild", "type": "boolean | undefined", @@ -22511,7 +22517,7 @@ { "name": "locale", "type": "Locale", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": true }, { @@ -22553,16 +22559,16 @@ "type": "ReactNode", "required": false }, - { - "name": "style", - "type": "CSSProperties | undefined", - "required": false - }, { "name": "className", "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22584,6 +22590,12 @@ "required": false, "description": "Filter actions. If omitted, will be read from FilterItem or Filter context." }, + { + "name": "className", + "type": "string | undefined", + "formattedType": "string", + "required": false + }, { "name": "style", "type": "CSSProperties | undefined", @@ -22591,16 +22603,10 @@ }, { "name": "size", - "type": "\"icon\" | \"default\" | \"sm\" | \"lg\" | null | undefined", - "formattedType": "null | \"icon\" | \"default\" | \"sm\" | \"lg\"", + "type": "\"default\" | \"icon\" | \"lg\" | \"sm\" | null | undefined", + "formattedType": "null | \"default\" | \"icon\" | \"lg\" | \"sm\"", "required": true }, - { - "name": "className", - "type": "string | undefined", - "formattedType": "string", - "required": false - }, { "name": "asChild", "type": "boolean | undefined", @@ -22637,16 +22643,16 @@ "formattedType": "string", "required": false }, - { - "name": "style", - "type": "CSSProperties | undefined", - "required": false - }, { "name": "className", "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22662,13 +22668,8 @@ "props": [ { "name": "children", - "type": "ReactNode | ((props: FilterListRenderProps) => ReactNode)", - "formattedType": "null | string | number | bigint | false | true | ReactElement | Iterable | ReactPortal | Promise | (props: FilterListRenderProps) => ReactNode", - "required": false - }, - { - "name": "style", - "type": "CSSProperties | undefined", + "type": "((props: FilterListRenderProps) => ReactNode) | ReactNode", + "formattedType": "null | string | number | bigint | false | true | Iterable | Promise | ReactElement | ReactPortal | (props: FilterListRenderProps) => ReactNode", "required": false }, { @@ -22676,6 +22677,11 @@ "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22688,16 +22694,16 @@ "type": "ReactNode", "required": true }, - { - "name": "style", - "type": "CSSProperties | undefined", - "required": false - }, { "name": "className", "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22737,7 +22743,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { @@ -22789,7 +22795,7 @@ { "name": "locale", "type": "Locale", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": true }, { @@ -22810,16 +22816,16 @@ "formattedType": "null | RefObject | (instance: HTMLDivElement | null) => void | (() => VoidOrUndefinedOnly)", "required": false }, - { - "name": "style", - "type": "CSSProperties | undefined", - "required": false - }, { "name": "className", "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22836,12 +22842,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", - "required": false - }, - { - "name": "style", - "type": "CSSProperties | undefined", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { @@ -22849,6 +22850,11 @@ "type": "string | undefined", "formattedType": "string", "required": false + }, + { + "name": "style", + "type": "CSSProperties | undefined", + "required": false } ] }, @@ -22890,7 +22896,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false } ] @@ -22931,7 +22937,13 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", + "required": false + }, + { + "name": "className", + "type": "string | undefined", + "formattedType": "string", "required": false }, { @@ -22941,16 +22953,10 @@ }, { "name": "size", - "type": "\"icon\" | \"default\" | \"sm\" | \"lg\" | null | undefined", - "formattedType": "null | \"icon\" | \"default\" | \"sm\" | \"lg\"", + "type": "\"default\" | \"icon\" | \"lg\" | \"sm\" | null | undefined", + "formattedType": "null | \"default\" | \"icon\" | \"lg\" | \"sm\"", "required": true }, - { - "name": "className", - "type": "string | undefined", - "formattedType": "string", - "required": false - }, { "name": "asChild", "type": "boolean | undefined", @@ -22988,7 +22994,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { @@ -23041,7 +23047,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { @@ -23095,7 +23101,7 @@ { "name": "locale", "type": "Locale | undefined", - "formattedType": "\"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\" | \"de\"", + "formattedType": "\"de\" | \"en\" | \"fr\" | \"nl\" | \"zh_CN\" | \"zh_TW\"", "required": false }, { diff --git a/apps/web/package.json b/apps/web/package.json index d5fdacfa..f3a817e0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -109,7 +109,6 @@ "ts-morph": "^27.0.0", "tsx": "^4.20.5", "typescript": "7.0.2", - "typescript5": "npm:typescript@5.9.3", "unified": "^11.0.5" }, "overrides": { diff --git a/apps/web/scripts/build-types-meta.ts b/apps/web/scripts/build-types-meta.ts index 45c6eeb6..422c7692 100644 --- a/apps/web/scripts/build-types-meta.ts +++ b/apps/web/scripts/build-types-meta.ts @@ -1,7 +1,34 @@ import fs from 'node:fs' import path from 'node:path' import prettier from 'prettier' -import ts from 'typescript5' +import { + type EnumDeclaration, + type InterfaceDeclaration, + isEnumDeclaration, + isInterfaceDeclaration, + isPropertyDeclaration, + isPropertySignatureDeclaration, + isStringLiteral, + isTypeAliasDeclaration, + type Node, + SyntaxKind, + type TypeAliasDeclaration, +} from 'typescript/unstable/ast' +import { + API, + type Checker, + type Diagnostic, + DiagnosticCategory, + isIntersectionType, + isObjectType, + isTypeReference, + isUnionType, + type Program, + SymbolFlags, + type Symbol as TsSymbol, + type Type, + TypeFlags, +} from 'typescript/unstable/sync' import type { TypeExpansionConfig } from './type-extraction.config' import { defaultConfig, shouldExpandType } from './type-extraction.config' @@ -107,16 +134,45 @@ export type MetaOutput = Record /** ---------- TS helpers (typed) ---------- */ -function isUnionType(t: ts.Type): t is ts.UnionType { - return (t.flags & ts.TypeFlags.Union) !== 0 +/** + * `typeToString` flags. TypeScript 7's API takes the numeric flags but does + * not export the `TypeFormatFlags` enum; the values match TypeScript 5's. + */ +const TypeFormatFlags = { + NoTruncation: 1 << 0, + WriteTypeArgumentsOfSignature: 1 << 5, + InTypeAlias: 1 << 23, +} as const + +/** Resolve a symbol's declaration handles to AST nodes. */ +function declarationsOf(sym: TsSymbol): Node[] { + return sym.declarations + .map((handle) => handle.resolve()) + .filter((node): node is Node => node !== undefined) } -function isIntersectionType(t: ts.Type): t is ts.IntersectionType { - return (t.flags & ts.TypeFlags.Intersection) !== 0 +/** The value declaration if present, otherwise the first declaration. */ +function primaryDeclaration(sym: TsSymbol): Node | undefined { + return (sym.valueDeclaration ?? sym.declarations[0])?.resolve() +} + +/** + * `typeToString` of a symbol's type. TypeScript 7's `getTypeOfSymbol` can + * return nothing, which TypeScript 5's never did; say so instead of hiding it. + */ +function typeTextOfSymbol(sym: TsSymbol, checker: Checker): string { + const type = checker.getTypeOfSymbol(sym) + if (type) return checker.typeToString(type) + console.warn(`[types:meta] could not resolve the type of \`${sym.name}\``) + return 'unknown' } -function isObjectLikeType(t: ts.Type): boolean { - return (t.flags & ts.TypeFlags.Object) !== 0 +/** Whether a property signature or declaration is written as optional (`name?:`). */ +function isOptionalMember(decl: Node): boolean { + if (isPropertySignatureDeclaration(decl) || isPropertyDeclaration(decl)) { + return decl.postfixToken?.kind === SyntaxKind.QuestionToken + } + return false } /** @@ -125,23 +181,23 @@ function isObjectLikeType(t: ts.Type): boolean { * `Align` should be expanded to `'start' | 'center' | 'end'`. */ function expandTypeRecursively( - type: ts.Type, - checker: ts.TypeChecker, - visited: Set = new Set(), + type: Type, + checker: Checker, + visited: Set = new Set(), filterUndefined = true, ): string { - // Prevent infinite recursion - if (visited.has(type)) { + // Prevent infinite recursion (type objects are proxies; compare by id) + if (visited.has(type.id)) { return checker.typeToString(type) } - visited.add(type) + visited.add(type.id) // Handle union types - expand each member if (isUnionType(type)) { const expandedParts: string[] = [] - for (const memberType of type.types) { + for (const memberType of type.getTypes()) { // Filter out 'undefined' from unions (we show this via the Optional badge instead) - if (filterUndefined && memberType.flags & ts.TypeFlags.Undefined) { + if (filterUndefined && memberType.flags & TypeFlags.Undefined) { continue } const expanded = expandTypeRecursively( @@ -152,7 +208,7 @@ function expandTypeRecursively( ) // If the member itself expands to a union, we should include its parts individually // to avoid nested parentheses like `('start' | 'center' | 'end') | 'list-start'` - if (isUnionType(memberType) && !memberType.aliasSymbol) { + if (isUnionType(memberType) && !memberType.getAliasSymbol()) { expandedParts.push(expanded) } else { expandedParts.push(expanded) @@ -165,43 +221,37 @@ function expandTypeRecursively( // Handle intersection types if (isIntersectionType(type)) { - const parts = type.types.map((t) => - expandTypeRecursively(t, checker, visited), - ) + const parts = type + .getTypes() + .map((t) => expandTypeRecursively(t, checker, visited)) return parts.join(' & ') } // Handle type aliases - try to get the underlying type - const symbol = type.getSymbol() ?? type.aliasSymbol + const symbol = type.getSymbol() ?? type.getAliasSymbol() if (symbol) { - const declarations = symbol.getDeclarations() - if (declarations && declarations.length > 0) { - const decl = declarations[0]! - if (isTypeAliasDecl(decl)) { - // Get the type that the alias points to - const aliasedType = checker.getTypeFromTypeNode(decl.type) - // If the aliased type is a union, expand it - if (isUnionType(aliasedType)) { - return expandTypeRecursively(aliasedType, checker, visited) - } + const decl = declarationsOf(symbol)[0] + if (decl && isTypeAliasDeclaration(decl)) { + // Get the type that the alias points to + const aliasedType = checker.getTypeFromTypeNode(decl.type) + // If the aliased type is a union, expand it + if (aliasedType && isUnionType(aliasedType)) { + return expandTypeRecursively(aliasedType, checker, visited) } } } // For literal types and primitives, just use typeToString - return checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation) + return checker.typeToString(type, undefined, TypeFormatFlags.NoTruncation) } /** * Check if a type is a type alias (not a primitive, object, or anonymous type) * and return its expanded form if so. */ -function expandTypeAlias( - type: ts.Type, - checker: ts.TypeChecker, -): string | null { +function expandTypeAlias(type: Type, checker: Checker): string | null { // Check if this is an alias (type reference to a type alias) - const aliasSymbol = type.aliasSymbol + const aliasSymbol = type.getAliasSymbol() if (!aliasSymbol) { // Even without an alias symbol, unions should be expanded if (isUnionType(type)) { @@ -214,7 +264,7 @@ function expandTypeAlias( // Try recursive expansion first const expandedType = expandTypeRecursively(type, checker) - const aliasName = aliasSymbol.getName() + const aliasName = aliasSymbol.name // If the expanded type is different from just the alias name, return it if (expandedType !== aliasName) { @@ -225,40 +275,89 @@ function expandTypeAlias( const fallbackExpanded = checker.typeToString( type, undefined, - ts.TypeFormatFlags.NoTruncation | - ts.TypeFormatFlags.InTypeAlias | - ts.TypeFormatFlags.WriteTypeArgumentsOfSignature, + TypeFormatFlags.NoTruncation | + TypeFormatFlags.InTypeAlias | + TypeFormatFlags.WriteTypeArgumentsOfSignature, ) return fallbackExpanded !== aliasName ? fallbackExpanded : null } +/** + * Property names of `t` in declaration order: an interface's own members in + * source order, then each base type's in `extends` order; an intersection's + * parts one after another. TypeScript 5's checker returned properties in this + * order; TypeScript 7's does not (it lists inherited members first), and the + * docs tables render props in array order. + */ +function propertyOrder( + t: Type, + checker: Checker, + seen: Set = new Set(), +): string[] { + if (seen.has(t.id)) return [] + seen.add(t.id) + const names: string[] = [] + const add = (list: readonly string[]) => { + for (const n of list) if (!names.includes(n)) names.push(n) + } + // A generic interface instantiation (`Props`) orders like its interface. + const iface = t.isClassOrInterface() + ? t + : isTypeReference(t) && t.getTarget().isClassOrInterface() + ? t.getTarget() + : undefined + if (isIntersectionType(t)) { + for (const part of t.getTypes()) add(propertyOrder(part, checker, seen)) + } else if (iface?.isClassOrInterface()) { + const ownDecls = new Set( + declarationsOf(iface.getSymbol()!).filter(isInterfaceDeclaration), + ) + const own = checker + .getPropertiesOfType(iface) + .map((p) => ({ name: p.name, decl: primaryDeclaration(p) })) + .filter(({ decl }) => decl && ownDecls.has(decl.parent as never)) + .sort((a, b) => a.decl!.pos - b.decl!.pos) + add(own.map(({ name }) => name)) + for (const base of checker.getBaseTypes(iface)) { + add(propertyOrder(base, checker, seen)) + } + } + add(checker.getPropertiesOfType(t).map((p) => p.name)) + return names +} + /** Collect properties only from object(-like) types. Flattens intersections. */ async function collectObjectProps( - t: ts.Type, - checker: ts.TypeChecker, + t: Type, + checker: Checker, ctx?: TypeExpansionContext, ): Promise { - const seen = new Map() + const seen = new Map() - const addProps = (tt: ts.Type) => { - if (!isObjectLikeType(tt)) return + const addProps = (tt: Type) => { + if (!isObjectType(tt)) return for (const s of checker.getPropertiesOfType(tt)) { - seen.set(s.getName(), s) + seen.set(s.name, s) } } if (isIntersectionType(t)) { - for (const part of t.types) addProps(part) + for (const part of t.getTypes()) addProps(part) } else if (!isUnionType(t)) { // unions are skipped (e.g., 'a' | 'b'); object unions aren't summarized here addProps(t) } // Filter out inherited HTML/React props unless they have custom documentation - const filteredSymbols = [...seen.values()].filter((sym) => - shouldIncludeProp(sym, checker), - ) + const order = propertyOrder(t, checker) + const rank = (sym: TsSymbol) => { + const i = order.indexOf(sym.name) + return i === -1 ? order.length : i + } + const filteredSymbols = [...seen.values()] + .filter((sym) => shouldIncludeProp(sym, checker)) + .sort((a, b) => rank(a) - rank(b)) // If context is provided, use it for type expansion if (ctx) { @@ -267,159 +366,211 @@ async function collectObjectProps( // Fallback for backward compatibility (shouldn't happen in practice) return filteredSymbols.map((sym) => { - const decl = (sym.valueDeclaration ?? sym.declarations?.[0]) as - | ts.Declaration - | undefined + const decl = primaryDeclaration(sym) // If no valid declaration node exists, fall back to getTypeOfSymbol if (!decl) { - const type = checker.getTypeOfSymbol(sym) return { - name: sym.getName(), - type: checker.typeToString(type), + name: sym.name, + type: typeTextOfSymbol(sym, checker), required: true, description: getSymbolDoc(sym, checker), - default: getSymbolDefaultValue(sym), + default: getSymbolDefaultValue(sym, checker), } } const type = checker.getTypeOfSymbolAtLocation(sym, decl) - const required = ts.isPropertySignature(decl) - ? !decl.questionToken - : ts.isPropertyDeclaration(decl) - ? !decl.questionToken - : true return { - name: sym.getName(), + name: sym.name, type: checker.typeToString(type), - required, + required: !isOptionalMember(decl), description: getSymbolDoc(sym, checker), - default: getSymbolDefaultValue(sym), + default: getSymbolDefaultValue(sym, checker), } }) } -function loadCompilerOptions(tsconfigPath?: string): ts.CompilerOptions { - if (!tsconfigPath) return { skipLibCheck: true, strict: false } - const cfg = ts.readConfigFile(tsconfigPath, ts.sys.readFile) - if (cfg.error) - throw new Error( - ts.formatDiagnosticsWithColorAndContext([cfg.error], formatHost), - ) - const parsed = ts.parseJsonConfigFileContent( - cfg.config, - ts.sys, - path.dirname(tsconfigPath), - ) - return parsed.options +/** + * Write a throwaway tsconfig next to `tsconfigPath` that extends it, roots the + * program at the package entries, and makes the DOM/React/Node types available + * for analysis. It lives next to the original so relative `extends`, `paths`, + * and type-root lookups resolve exactly as they do for the app. + */ +function writeAnalysisTsconfig( + api: API, + entries: string[], + tsconfigPath?: string, +): string { + const dir = tsconfigPath ? path.dirname(tsconfigPath) : process.cwd() + const baseTypes = tsconfigPath + ? ((api.parseConfigFile(tsconfigPath).options.types as + | string[] + | undefined) ?? []) + : [] + const config = { + ...(tsconfigPath ? { extends: `./${path.basename(tsconfigPath)}` } : {}), + include: [], + files: entries, + compilerOptions: { + noEmit: true, + skipLibCheck: true, + ...(tsconfigPath ? {} : { strict: false }), + incremental: false, + composite: false, + types: [...new Set([...baseTypes, 'node', 'react', 'react-dom'])], + }, + } + const file = path.join(dir, `.tsconfig.types-meta.${process.pid}.json`) + fs.writeFileSync(file, JSON.stringify(config, null, 2)) + return file } -function sanitizeForAnalysis(options: ts.CompilerOptions): ts.CompilerOptions { - // We don't emit; ensure JSX + DOM + React types are available and resolution works with .js -> .tsx re-exports. - const merged: ts.CompilerOptions = { - ...options, - noEmit: true, - skipLibCheck: true, - jsx: options.jsx ?? ts.JsxEmit.ReactJSX, - jsxImportSource: options.jsxImportSource ?? 'react', - lib: options.lib ?? ['ES2021', 'DOM'], - types: Array.from( - new Set([...(options.types ?? []), 'node', 'react', 'react-dom']), - ), - moduleResolution: - options.moduleResolution ?? ts.ModuleResolutionKind.Bundler, +/** `file(line,col): category TS1234: message` plus the indented message chain. */ +function formatDiagnostic(d: Diagnostic, program: Program): string { + let location = '' + if (d.fileName) { + const file = path.relative(process.cwd(), d.fileName) + const sourceFile = program.getSourceFile(d.fileName) + const at = sourceFile?.getLineAndCharacterOfPosition(d.pos) + location = at + ? `${file}(${at.line + 1},${at.character + 1}): ` + : `${file}: ` } - // Remove build-only flags that cause diagnostics in analysis mode - delete (merged as any).incremental - delete (merged as any).tsBuildInfoFile - delete (merged as any).composite - return merged + const category = DiagnosticCategory[d.category].toLowerCase() + const chain = (items: readonly Diagnostic[] = [], depth = 1): string[] => + items.flatMap((c) => [ + `${' '.repeat(depth)}${c.text}`, + ...chain(c.messageChain, depth + 1), + ]) + return [ + `${location}${category} TS${d.code}: ${d.text}`, + ...chain(d.messageChain), + ].join('\n') } -const formatHost: ts.FormatDiagnosticsHost = { - getCanonicalFileName: (f) => f, - getCurrentDirectory: () => process.cwd(), - getNewLine: () => '\n', +function preEmitDiagnostics(program: Program): readonly Diagnostic[] { + return [ + ...program.getConfigFileParsingDiagnostics(), + ...program.getProgramDiagnostics(), + ...program.getSyntacticDiagnostics(), + ...program.getGlobalDiagnostics(), + ...program.getSemanticDiagnostics(), + ] } -const isInterfaceDecl = (n: ts.Node): n is ts.InterfaceDeclaration => - n.kind === ts.SyntaxKind.InterfaceDeclaration -const isTypeAliasDecl = (n: ts.Node): n is ts.TypeAliasDeclaration => - n.kind === ts.SyntaxKind.TypeAliasDeclaration -const isEnumDecl = (n: ts.Node): n is ts.EnumDeclaration => - n.kind === ts.SyntaxKind.EnumDeclaration - -function kindOfDecl( - d: ts.InterfaceDeclaration | ts.TypeAliasDeclaration | ts.EnumDeclaration, -): TypeMeta['kind'] { - if (isInterfaceDecl(d)) return 'interface' - if (isTypeAliasDecl(d)) return 'typealias' +type DocumentedDecl = + | InterfaceDeclaration + | TypeAliasDeclaration + | EnumDeclaration + +function isDocumentedDecl(n: Node): n is DocumentedDecl { + return ( + isInterfaceDeclaration(n) || + isTypeAliasDeclaration(n) || + isEnumDeclaration(n) + ) +} + +function kindOfDecl(d: DocumentedDecl): TypeMeta['kind'] { + if (isInterfaceDeclaration(d)) return 'interface' + if (isTypeAliasDeclaration(d)) return 'typealias' return 'enum' } -const printer = ts.createPrinter({ removeComments: false }) -function nodeText(node: ts.Node): string { - return printer.printNode(ts.EmitHint.Unspecified, node, node.getSourceFile()) +/** + * Source text of a type node, comments included (also a comment before the + * first union member), with continuation lines dedented by the indentation of + * the line the node starts on. TypeScript 7's printer drops comments, which + * the docs show for annotated unions. + */ +function nodeText(node: Node): string { + const sourceFile = node.getSourceFile() + const start = node.getStart(sourceFile) + const lineStart = sourceFile.text.lastIndexOf('\n', start - 1) + 1 + const lineIndent = /^[ \t]*/.exec(sourceFile.text.slice(lineStart))![0].length + const [first = '', ...rest] = node.getFullText(sourceFile).trim().split('\n') + const indent = new RegExp(`^[ \\t]{0,${lineIndent}}`) + return [first, ...rest.map((line) => line.replace(indent, ''))].join('\n') } -function getSymbolDoc( - sym: ts.Symbol, - checker: ts.TypeChecker, -): string | undefined { - const txt = ts - .displayPartsToString(sym.getDocumentationComment(checker)) - .trim() +function getSymbolDoc(sym: TsSymbol, checker: Checker): string | undefined { + const txt = + sym.getDocumentationComment(checker).trim() || getInheritedDoc(sym, checker) return txt || undefined } /** - * Extract @default value from JSDoc tags + * Documentation inherited by an undocumented interface member, following + * TypeScript 5's `getDocumentationComment` fallback: the first base type that + * has a same-named property with a single declaration supplies the docs, even + * when they are empty. TypeScript 7's API inherits by a different rule and + * misses some of these (e.g. a member redeclared over an `Omit<…>` base). */ -function getSymbolDefaultValue(sym: ts.Symbol): string | undefined { - const tags = sym.getJsDocTags() - const defaultTag = tags.find((tag) => tag.name === 'default') - if (!defaultTag) return undefined - - // Get the text of the default tag - const text = defaultTag.text - ? ts.displayPartsToString( - Array.isArray(defaultTag.text) ? defaultTag.text : [defaultTag.text], +function getInheritedDoc( + sym: TsSymbol, + checker: Checker, + seen: Set = new Set([sym.id]), +): string { + for (const decl of declarationsOf(sym)) { + const owner = decl.parent + if (!owner || !isInterfaceDeclaration(owner)) continue + const ownerSym = checker.getSymbolAtLocation(owner.name) + if (!ownerSym) continue + const ownerType = checker.getDeclaredTypeOfSymbol(ownerSym) + if (!ownerType.isClassOrInterface()) continue + for (const base of checker.getBaseTypes(ownerType)) { + const baseProp = checker.getPropertyOfType(base, sym.name) + if (!baseProp || seen.has(baseProp.id)) continue + seen.add(baseProp.id) + if (baseProp.declarations.length !== 1) continue + return ( + baseProp.getDocumentationComment(checker).trim() || + getInheritedDoc(baseProp, checker, seen) ) - : undefined + } + } + return '' +} - return text?.trim() || undefined +/** Text of the first JSDoc tag with this name (e.g. `default`, `type`). */ +function getSymbolTagText( + sym: TsSymbol, + checker: Checker, + tagName: string, +): string | undefined { + const tag = sym.getJsDocTags(checker).find((t) => t.name === tagName) + return tag?.text?.trim() || undefined } /** - * Extract @type value from JSDoc tags (used for data attribute value types) + * Extract @default value from JSDoc tags */ -function getSymbolTypeTag(sym: ts.Symbol): string | undefined { - const tags = sym.getJsDocTags() - const typeTag = tags.find((tag) => tag.name === 'type') - if (!typeTag) return undefined - - const text = typeTag.text - ? ts.displayPartsToString( - Array.isArray(typeTag.text) ? typeTag.text : [typeTag.text], - ) - : undefined +function getSymbolDefaultValue( + sym: TsSymbol, + checker: Checker, +): string | undefined { + return getSymbolTagText(sym, checker, 'default') +} - return text?.trim() || undefined +/** + * Extract @type value from JSDoc tags (used for data attribute value types) + */ +function getSymbolTypeTag(sym: TsSymbol, checker: Checker): string | undefined { + return getSymbolTagText(sym, checker, 'type') } /** * Check if a symbol has the @ignore JSDoc tag */ -function hasIgnoreTag(sym: ts.Symbol): boolean { - const tags = sym.getJsDocTags() - return tags.some((tag) => tag.name === 'ignore') +function hasIgnoreTag(sym: TsSymbol, checker: Checker): boolean { + return sym.getJsDocTags(checker).some((tag) => tag.name === 'ignore') } /** * Check if a declaration comes from a library file (node_modules or @types) */ -function isFromLibrary(decl: ts.Declaration | undefined): boolean { +function isFromLibrary(decl: Node | undefined): boolean { if (!decl) return false const sourceFile = decl.getSourceFile() const fileName = sourceFile.fileName @@ -522,14 +673,14 @@ function isDataAttribute(name: string): boolean { * Check if a prop should be included in documentation. * Excludes inherited HTML/React props. */ -function shouldIncludeProp(sym: ts.Symbol, _checker: ts.TypeChecker): boolean { +function shouldIncludeProp(sym: TsSymbol, checker: Checker): boolean { // Always skip props marked with @ignore - if (hasIgnoreTag(sym)) { + if (hasIgnoreTag(sym, checker)) { return false } - const name = sym.getName() - const decl = sym.valueDeclaration ?? sym.declarations?.[0] + const name = sym.name + const decl = primaryDeclaration(sym) // Always include core API props (render, className, style, children) if (ALWAYS_INCLUDE_PROPS.has(name)) { @@ -593,8 +744,8 @@ function getEnumCategory( * Extract enum members with their values and JSDoc */ function extractEnumMembers( - enumDecl: ts.EnumDeclaration, - checker: ts.TypeChecker, + enumDecl: EnumDeclaration, + checker: Checker, ): EnumMemberMeta[] { const members: EnumMemberMeta[] = [] @@ -606,7 +757,7 @@ function extractEnumMembers( let value: string | undefined if (member.initializer) { // If there's an explicit initializer, use it - if (ts.isStringLiteral(member.initializer)) { + if (isStringLiteral(member.initializer)) { value = member.initializer.text } else { value = member.initializer.getText() @@ -616,7 +767,9 @@ function extractEnumMembers( if (!value) continue // Skip members without explicit string values const description = memberSym ? getSymbolDoc(memberSym, checker) : undefined - const valueType = memberSym ? getSymbolTypeTag(memberSym) : undefined + const valueType = memberSym + ? getSymbolTypeTag(memberSym, checker) + : undefined members.push({ name: memberName, @@ -821,19 +974,19 @@ async function formatTypeString(typeStr: string): Promise { } function typeParamsMeta( - node: ts.InterfaceDeclaration | ts.TypeAliasDeclaration, + node: InterfaceDeclaration | TypeAliasDeclaration, ): Array<{ name: string; constraint?: string; default?: string }> | undefined { const tps = node.typeParameters?.map((tp) => ({ name: tp.name.getText(), constraint: tp.constraint ? nodeText(tp.constraint) : undefined, - default: tp.default ? nodeText(tp.default) : undefined, + default: tp.defaultType ? nodeText(tp.defaultType) : undefined, })) ?? [] return tps.length ? tps : undefined } interface TypeExpansionContext { - checker: ts.TypeChecker + checker: Checker config: TypeExpansionConfig currentDepth: number allTypes: Map // All documented types for reference lookup @@ -881,38 +1034,30 @@ function resolveTypeWithConstraints( } async function propMeta( - propSym: ts.Symbol, + propSym: TsSymbol, ctx: TypeExpansionContext, ): Promise { const { checker, config, currentDepth, allTypes, currentPackage } = ctx - const decl = (propSym.valueDeclaration ?? propSym.declarations?.[0]) as - | ts.Declaration - | undefined + const decl = primaryDeclaration(propSym) // If no valid declaration node exists, fall back to getTypeOfSymbol // (can happen with synthetic properties from mapped types, etc.) if (!decl) { - const type = checker.getTypeOfSymbol(propSym) - const rawTypeStr = checker.typeToString(type) const typeStr = resolveTypeWithConstraints( - rawTypeStr, + typeTextOfSymbol(propSym, checker), ctx.typeParamConstraints, ) return { - name: propSym.getName(), + name: propSym.name, type: typeStr, required: true, description: getSymbolDoc(propSym, checker), - default: getSymbolDefaultValue(propSym), + default: getSymbolDefaultValue(propSym, checker), } } const type = checker.getTypeOfSymbolAtLocation(propSym, decl) - const required = ts.isPropertySignature(decl) - ? !decl.questionToken - : ts.isPropertyDeclaration(decl) - ? !decl.questionToken - : true + const required = !isOptionalMember(decl) const rawTypeStr = checker.typeToString(type) // Resolve generic type parameters to their constraints for better documentation @@ -922,7 +1067,7 @@ async function propMeta( ) const baseTypeName = extractBaseTypeName(typeStr) const description = getSymbolDoc(propSym, checker) - const defaultValue = getSymbolDefaultValue(propSym) + const defaultValue = getSymbolDefaultValue(propSym, checker) // Well-known types that shouldn't be expanded (everyone knows what they are) const SKIP_EXPANSION_TYPES = new Set([ @@ -958,9 +1103,9 @@ async function propMeta( // Extract short type name from type alias (e.g., "Align" from PopupMenuPositionerAlign) // This is used for display in the collapsed type column let shortType: string | undefined - const aliasSymbol = type.aliasSymbol + const aliasSymbol = type.getAliasSymbol() if (aliasSymbol) { - const aliasName = aliasSymbol.getName() + const aliasName = aliasSymbol.name // Extract the last part of the type name (e.g., "Align" from "PopupMenuPositionerAlign") // Look for common suffixes like Align, Side, etc. const suffixMatch = aliasName.match( @@ -972,7 +1117,7 @@ async function propMeta( } const meta: PropMeta = { - name: propSym.getName(), + name: propSym.name, type: typeStr, shortType, formattedType, @@ -991,7 +1136,7 @@ async function propMeta( config, ) - if (shouldExpand && isObjectLikeType(type)) { + if (shouldExpand && isObjectType(type)) { // Recursively expand the type const expandedProps = await collectObjectProps(type, checker, { ...ctx, @@ -1032,20 +1177,9 @@ function findTypeReference( return undefined } -/** Resolve a SourceFile robustly (path normalization). */ -function findSourceFile( - program: ts.Program, - absPath: string, -): ts.SourceFile | undefined { - const want = path.normalize(absPath) - return program - .getSourceFiles() - .find((sf) => path.normalize(sf.fileName) === want) -} - /** Resolve re-exported symbols to their real declarations. */ -function resolveExport(sym: ts.Symbol, checker: ts.TypeChecker): ts.Symbol { - return (sym.getFlags() & ts.SymbolFlags.Alias) !== 0 +function resolveExport(sym: TsSymbol, checker: Checker): TsSymbol { + return (sym.flags & SymbolFlags.Alias) !== 0 ? checker.getAliasedSymbol(sym) : sym } @@ -1053,12 +1187,12 @@ function resolveExport(sym: ts.Symbol, checker: ts.TypeChecker): ts.Symbol { /** ---------- Collector ---------- */ async function collectPackageTypes( - prog: ts.Program, - checker: ts.TypeChecker, + prog: Program, + checker: Checker, pkg: PkgArg, config: TypeExpansionConfig, ): Promise { - const sf = findSourceFile(prog, pkg.entry) + const sf = prog.getSourceFile(pkg.entry) if (!sf) throw new Error(`Entry not in program: ${pkg.entry}`) const moduleSym = checker.getSymbolAtLocation(sf) if (!moduleSym) throw new Error(`No module symbol for: ${pkg.entry}`) @@ -1074,21 +1208,15 @@ async function collectPackageTypes( for (const exp of exportsArr) { const target = resolveExport(exp, checker) - const decls = target.getDeclarations() ?? [] - const decl = decls.find( - (d) => isInterfaceDecl(d) || isTypeAliasDecl(d) || isEnumDecl(d), - ) as - | ts.InterfaceDeclaration - | ts.TypeAliasDeclaration - | ts.EnumDeclaration - | undefined + const decls = declarationsOf(target) + const decl = decls.find(isDocumentedDecl) if (process.env.DEBUG_TYPES) { - const kinds = decls.map((d) => ts.SyntaxKind[d.kind]).join(', ') + const kinds = decls.map((d) => SyntaxKind[d.kind]).join(', ') console.log( ' export', - exp.getName(), - exp.getFlags() & ts.SymbolFlags.Alias ? '(alias)' : '', + exp.name, + exp.flags & SymbolFlags.Alias ? '(alias)' : '', '-> decl kinds:', kinds || '(none)', ) @@ -1097,23 +1225,25 @@ async function collectPackageTypes( if (!decl) continue const kind = kindOfDecl(decl) - const typeParams = isEnumDecl(decl) ? undefined : typeParamsMeta(decl) + const typeParams = isEnumDeclaration(decl) + ? undefined + : typeParamsMeta(decl) const doc = getSymbolDoc(target, checker) || getSymbolDoc(exp, checker) - const meta: TypeMeta = { name: exp.getName(), kind, typeParams, doc } + const meta: TypeMeta = { name: exp.name, kind, typeParams, doc } - if (isTypeAliasDecl(decl)) { + if (isTypeAliasDeclaration(decl)) { meta.definition = nodeText(decl.type) // e.g. "'item' | 'group' | 'submenu'" } - if (kind === 'enum' && isEnumDecl(decl)) { + if (kind === 'enum' && isEnumDeclaration(decl)) { // Extract enum members with values and JSDoc const members = extractEnumMembers(decl, checker) if (members.length > 0) { meta.members = members } // Categorize the enum (dataAttributes, cssVars, or other) - meta.enumCategory = getEnumCategory(exp.getName()) + meta.enumCategory = getEnumCategory(exp.name) } else if (kind !== 'enum') { const declaredType = checker.getDeclaredTypeOfSymbol( target /* not exp; see alias fix */, @@ -1122,7 +1252,7 @@ async function collectPackageTypes( // Build a map of type parameter names to their constraints // e.g., "TColumns" -> "ReadonlyArray>" const typeParamConstraints = new Map() - if (!isEnumDecl(decl) && decl.typeParameters) { + if (!isEnumDeclaration(decl) && decl.typeParameters) { for (const tp of decl.typeParameters) { if (tp.constraint) { typeParamConstraints.set(tp.name.getText(), nodeText(tp.constraint)) @@ -1156,47 +1286,76 @@ async function collectPackageTypes( async function main(): Promise { const args = parseArgs(process.argv.slice(2)) - const rawOptions = loadCompilerOptions(args.tsconfig) - const options = sanitizeForAnalysis(rawOptions) + const tsconfigPath = args.tsconfig + ? path.resolve(process.cwd(), args.tsconfig) + : undefined const rootNames = args.packages.map((p) => p.entry) - const program = ts.createProgram({ rootNames, options }) - const checker = program.getTypeChecker() - if (process.env.DEBUG_TYPES) { - console.log( - 'Program files:\n' + - program - .getSourceFiles() - .map((sf) => ` - ${sf.fileName}`) - .join('\n'), - ) + // TypeScript 7 runs the checker in a separate process; the API talks to it. + const api = new API({ cwd: process.cwd() }) + let analysisTsconfig: string | undefined + const removeAnalysisTsconfig = () => { + if (analysisTsconfig) fs.rmSync(analysisTsconfig, { force: true }) } + process.once('SIGINT', () => { + removeAnalysisTsconfig() + process.exit(130) + }) + process.once('SIGTERM', () => { + removeAnalysisTsconfig() + process.exit(143) + }) + try { + analysisTsconfig = writeAnalysisTsconfig(api, rootNames, tsconfigPath) + const snapshot = api.updateSnapshot({ openProjects: [analysisTsconfig] }) + const project = snapshot.getProject(analysisTsconfig) + if (!project) throw new Error(`Could not open ${analysisTsconfig}`) + const { program, checker } = project - // Trigger type checking so diagnostics surface early - const diagnostics = ts.getPreEmitDiagnostics(program) - if (diagnostics.length) { - console.warn( - ts.formatDiagnosticsWithColorAndContext(diagnostics, formatHost), - ) - } + if (process.env.DEBUG_TYPES) { + console.log( + 'Program files:\n' + + program + .getSourceFileNames() + .map((f) => ` - ${f}`) + .join('\n'), + ) + } - const output: MetaOutput = {} - for (const pkg of args.packages) { - const meta = await collectPackageTypes( - program, - checker, - pkg, - args.config ?? defaultConfig, - ) - if (process.env.DEBUG_TYPES && Object.keys(meta.types).length === 0) { - console.warn(`[warn] No exported types found for ${pkg.name}`) + // Trigger type checking so diagnostics surface early + const diagnostics = preEmitDiagnostics(program) + if (diagnostics.length) { + console.warn( + diagnostics.map((d) => formatDiagnostic(d, program)).join('\n'), + ) } - output[pkg.name] = meta - } - fs.mkdirSync(path.dirname(args.out), { recursive: true }) - fs.writeFileSync(args.out, JSON.stringify(output, null, 2)) - console.log(`[types:meta] wrote ${args.out}`) + const output: MetaOutput = {} + for (const pkg of args.packages) { + const meta = await collectPackageTypes( + program, + checker, + pkg, + args.config ?? defaultConfig, + ) + if (process.env.DEBUG_TYPES && Object.keys(meta.types).length === 0) { + console.warn(`[warn] No exported types found for ${pkg.name}`) + } + output[pkg.name] = meta + } + + fs.mkdirSync(path.dirname(args.out), { recursive: true }) + fs.writeFileSync(args.out, JSON.stringify(output, null, 2)) + console.log(`[types:meta] wrote ${args.out}`) + } finally { + try { + api.close() + } catch (error) { + // The checker process may already be gone; keep the original error. + if (process.env.DEBUG_TYPES) console.warn('api.close() failed:', error) + } + removeAnalysisTsconfig() + } } main().catch((err) => { diff --git a/bun.lock b/bun.lock index 72bd94fb..589f1d6d 100644 --- a/bun.lock +++ b/bun.lock @@ -125,7 +125,6 @@ "ts-morph": "^27.0.0", "tsx": "^4.20.5", "typescript": "7.0.2", - "typescript5": "npm:typescript@5.9.3", "unified": "^11.0.5", }, }, @@ -2158,8 +2157,6 @@ "typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], - "typescript5": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="],