diff --git a/.agents/skills/homarr-custom-widget/SKILL.md b/.agents/skills/homarr-custom-widget/SKILL.md
index 2ba62e8c2..1e3010204 100644
--- a/.agents/skills/homarr-custom-widget/SKILL.md
+++ b/.agents/skills/homarr-custom-widget/SKILL.md
@@ -1,36 +1,43 @@
---
name: homarr-custom-widget
-description: Author, validate, preview, install, and configure safe Homarr Custom JSX v2 widgets. Use when creating a widget from API documentation, testing its states and actions, installing one from Workshop, or configuring sources and credentials through Homarr.
+description: Author, validate, preview, test, install, or configure API-backed Homarr Custom JSX v2 widgets.
---
# Homarr Custom Widget
-Author one widget at a time. When connected to Homarr, retrieve `homarr://custom-widgets/schema` and only the component resources needed for the design. The live resources are authoritative for the installed release.
+Author one widget or a coordinated set of widgets. Load only needed release-matched context. Run lifecycle tools alone; independent reads may run together. For a set, research once and finish each widget's validation, evidence, and persistence before the next.
-Keep documentation retrieval targeted: fetch at most eight named component documents before the first validation, or at most four after loading a complete example. Fetch another component only when a validation issue or a concrete missing interaction requires it; never load the catalog component-by-component.
+1. Read primary API documentation. Use web search when documentation is not supplied or may have changed.
+2. Create credential-free definitions with keyed `sources`, `requests`, optional `options`, and safe JSX `template`.
+3. While drafting, use `customWidget_validateTemplate` for focused JSX diagnostics without resending the manifest.
+4. Send the definition once to `customWidget_previewCreate` and test its queries/actions. For a JSX-only fix, validate, call `customWidget_previewReviseTemplate` with its session, and retest; it inherits the manifest and resets evidence. Create a preview only for source/request/option changes.
+5. Configure deployment-specific source URLs and credentials through Homarr; never repeat plaintext.
+6. Persist each exact final tested preview with `customWidget_createFromPreview`. Do not resend a large definition through `customWidget_create` when a preview session is available.
-1. Read the API documentation.
-2. Create one credential-free widget with keyed `sources`, keyed `requests`, optional keyed `options`, and safe JSX `template`.
-3. Validate, preview, test queries and simulated actions, visually inspect, and iterate.
-4. Configure deployment-specific source URLs and request credentials through Homarr; never repeat plaintext.
-5. Save only after narrow/wide, light/dark, loading, empty, error, and success states work. When connected through MCP, persist the exact final tested preview with `customWidget_createFromPreview`; do not resend a large template through `customWidget_create` unless no preview session is available.
+Treat a supplied sample or successful preview response as the binding contract. Render every core requested field, guard optional arrays and nested values before indexing, and do not silently drop returned items. Humanize numeric enums with indexed literal label arrays, omit absent numeric values instead of inventing zero, and label timestamp timezones. Give recoverable load errors and empty states a clear refresh or retry path.
-Treat a supplied sample or successful preview response as the binding contract. Render every core requested field, guard optional arrays and nested values before indexing, and do not silently drop returned items. Show concise freshness context when the API supplies a timestamp. Give recoverable load errors and empty states a clear refresh or retry path.
+Use `{option:name}` or `$option` for saved options. Use `{param:name}` or `$param` for values supplied by `SubFetch`, `ActionButton`, or `ToggleSwitch`. Load queries cannot use invocation parameters. Render load queries from `data` and `status` with `RefreshButton`; reserve `SubFetch` for manual parameterized queries. Templates read `data`, `status`, `options`, and temporary `inputs`.
-Use `{option:name}` or `$option` for saved options. Use `{param:name}` or `$param` for values supplied by `SubFetch`, `ActionButton`, or `ToggleSwitch`. Load queries cannot use invocation parameters. Templates read `data`, `status`, `options`, and temporary `inputs`.
+For a bound control that depends on another input, declare its default and set `resetKey` to that scalar dependency. For example, `` restores page 1 when a search changes without fetching by itself.
-`SubFetch` with `trigger="manual"` renders its own load button. Pass a card or image through `triggerContent` with `triggerAriaLabel` when that content should launch the request. Its callback is `(result, meta)`; never author `onClick` or a fetch callback.
+`SubFetch` with `trigger="manual"` renders its own load button. Pass a card or image through `triggerContent` with `triggerAriaLabel` when that content should launch the request. Its callback is `(result, meta)`; callback names must not shadow the reserved roots `data`, `status`, `options`, or `inputs`. Never author `onClick` or a fetch callback. Use `Icon` or `TablerIcon` with a `name`; never invent an `IconFoo` component.
-Use standard Mantine compound names and deliberate visual hierarchy, spacing, restrained semantic color, and responsive layouts. Avoid excessive nested cards.
+Plan capabilities. Use one `customWidget_findComponents` search per job. Batch selected non-obvious binding or interaction documentation with `customWidget_getComponents`; reserve `customWidget_getComponent` for one unknown-prop repair. Failed validation reopens discovery; otherwise search only for a missing capability. The full catalog is for broad exploration; load at most one example. Context never limits composition. Prefer clear hierarchy, responsive grids, divided lists, and aligned actions over nested row cards.
-Aim for distinctive polish without decorative gradients or fragile custom styling: use one semantic accent, clear surface contrast, purposeful typography, and compact rows that remain scannable in narrow tiles. Give standalone icons an accessible label or pair them with visible text.
+Do not simplify a useful workflow merely because the template is interpreted. Freely compose any supported installed components with multiple sources, requests, options, `choicesFrom`, bound filters, charts, responsive detail areas, manual queries, and safe actions when they improve the user's job. Complexity must remain purposeful rather than decorative.
-Make initial states actionable with an example, useful hint, or clear next step. Use wrapping groups for variable-length labels and values on narrow tiles. Do not use an unlabeled decorative icon as an empty state.
+Polish with a divided list or responsive media grid. Make one metric/action asymmetrically primary; keep headers compact, identity/state clear, metadata quiet, and one badge. At base artwork fills its row and caps above xs; never combine full-width media and nowrap.
+
+Make initial states actionable and wrap variable labels/values on narrow tiles. Do not use an unlabeled decorative icon as an empty state.
Do not use imports, hooks, refs, raw HTML, raw event callbacks, browser requests, arbitrary functions, eval, bigint, npm packages, authored statement blocks, IIFEs, or recursion. Do not pretend MCP tools exist in an offline chat session.
-To install an existing widget, use `customWidget_workshopSearch`, inspect it with `customWidget_workshopGet`, then use `customWidget_workshopInstall`. Configure each self-hosted source afterward with `customWidget_sourceConfigure`, or call `customWidget_configurationRequestUser` so the user can enter the server URL and credentials directly in Homarr.
+For a community widget, use `customWidget_workshopSearch`, `customWidget_workshopGet`, then `customWidget_workshopInstall`; configure its source securely. Preview configuration expires, so create before persisting configuration.
-Preview-scoped configuration expires with the preview. To persist user-entered values for a new widget, create the widget first, request configuration for its definition ID, then create a final preview with that definition ID so Homarr loads the stored credentials.
+Reference routing:
-When this skill is installed from the repository, optional offline details are in `references/schema.md`, `references/runtime.md`, and `references/security.md`. MCP-only clients should use the live Homarr resources instead.
+- Load `schema` once before a new manifest; otherwise only for concrete request or option ambiguity.
+- Load `runtime` for bound inputs, manual queries, actions, or other interaction.
+- Load `security` once for any authenticated source or mutation, or to resolve a URL or interpreter limitation.
+
+Repository installations expose these as files under `references/`. MCP clients can call `customWidget_getReference` or read `homarr://custom-widgets/references/{name}` instead of loading every reference.
diff --git a/.agents/skills/homarr-custom-widget/references/runtime.md b/.agents/skills/homarr-custom-widget/references/runtime.md
index 7c2cab770..421391c09 100644
--- a/.agents/skills/homarr-custom-widget/references/runtime.md
+++ b/.agents/skills/homarr-custom-widget/references/runtime.md
@@ -1,16 +1,37 @@
# Runtime
-Templates read `data.requestId`, `status.requestId`, `options.name`, and temporary `inputs.name`. Status contains `loading`, `ok`, `status`, `statusText`, and `error`.
+Templates read `data.requestId`, `status.requestId`, `options.name`, and temporary `inputs.name`. Status is `{ loading, ok, status, statusText, error }`. Render load queries directly from `data` and `status` with `RefreshButton`; never wrap them in `SubFetch`.
`bind="search"` creates an in-memory input. It is never persisted. Supply invocation values only through `params`, for example:
```jsx
-
- {(items) => {(items ?? []).map(item => {item.name})}}
+
+
+ {(result) => {(result.results ?? []).map(item => {item.name})}}
```
-`SubFetch` with `trigger="manual"` renders its own load button. To make a card or image launch the request, pass that node through `triggerContent` and provide `triggerAriaLabel`; Homarr supplies the click and keyboard behavior. Its optional second callback argument contains `{ ok, status, statusText, loading: false }`; loading and request failures are rendered by `SubFetch` before the callback runs. Do not author `onClick` or a fetch callback.
+Manual queries require `trigger: "manual"` on request and `SubFetch`; otherwise they run automatically. `triggerContent` with `triggerAriaLabel` makes custom content the launcher. `SubFetch` owns loading/error/retry; its child receives success plus `{ ok, status, statusText, loading: false }`. Never author `onClick` or fetch callbacks.
-Use expression callbacks for supported collection methods and trusted slots. Do not use callback blocks, IIFEs, authored recursion, or raw events. Bounded regex literals work only with safe string matching/replacement operations.
+`SubFetch`, `ActionButton`, and `ToggleSwitch` need literal `requestId`; validation rejects missing/computed IDs.
+
+Inside a successful manual result, `` reruns the same parameters.
+
+When a manual SubFetch request ID, parameters, or effective definition changes, Homarr immediately hides its prior result and returns to the trigger. It cannot fetch the new parameters until the user triggers it again.
+
+The `SubFetch` callback receives the entire JSON response exactly as previewed. If the response is `{ "results": [...] }`, render and map `result.results`; never map the envelope itself. Trace every rendered field from the preview response before persistence.
+
+Format timestamps with safe static helpers; never use `new Date`. Never invent a formatter component. Use `Date.toLocaleString(value, "en-US", "UTC")` plus a visible `UTC` label. Also available: `Date.toISOString`, `Date.toLocaleDateString`, and `Date.toLocaleTimeString`.
+
+For compact numeric enums, index a literal label array with a fallback:
+
+```jsx
+{["Unknown", "Pending", "Ready"][(item.status ?? 1) - 1] ?? "Unknown"}
+```
+
+Every stateful control must use `bind`, and its `inputs.` value must feed a supported request/helper when it is meant to change remote data. For dependent pagination, declare `defaultValue={1}` and use `resetKey={inputs.search}` to restore page 1 when the query changes. If a control cannot affect the workflow through a binding, option, or runtime helper, render concise context instead of a dead control.
+
+Callback parameters must not shadow the reserved roots `data`, `status`, `options`, or `inputs`. Use `` or ``; never invent components such as ``.
+
+Use expression callbacks for supported collections and trusted slots. No callback blocks, IIFEs, authored recursion, or raw events. Regex is limited to safe string operations.
diff --git a/.agents/skills/homarr-custom-widget/references/schema.md b/.agents/skills/homarr-custom-widget/references/schema.md
index ad1a1b1a0..2363462b6 100644
--- a/.agents/skills/homarr-custom-widget/references/schema.md
+++ b/.agents/skills/homarr-custom-widget/references/schema.md
@@ -13,10 +13,37 @@ interface HomarrCustomWidgetV2 {
}
```
-Sources require `default`. A request defaults to the default source, query, GET, load, inherited auth, and view permission. An action defaults to manual and modify permission. DELETE uses full permission and confirmation.
+The object key `default` is the required source ID; `default` is not a property on a source. Source properties are `name?`, `baseUrl`, `networkScope`, and `auth?`:
+
+```json
+{
+ "sources": {
+ "default": {
+ "name": "Service",
+ "baseUrl": "http://service.local:5055/api/v1",
+ "networkScope": "private",
+ "auth": { "type": "apiKeyHeader", "name": "X-Api-Key" }
+ }
+ },
+ "requests": {
+ "summary": { "path": "/summary" },
+ "search": { "trigger": "manual", "path": "/search", "query": { "q": { "$param": "query" } } },
+ "create": {
+ "kind": "action",
+ "method": "POST",
+ "path": "/items",
+ "body": { "id": { "$param": "id" } },
+ "confirmation": "Create this item?",
+ "invalidates": ["search"]
+ }
+ }
+}
+```
+
+Auth is `none`, `bearer`, `basic`, `{ "type": "apiKeyHeader", "name": "X-Api-Key" }`, or `{ "type": "apiKeyQuery", "name": "api_key" }`. A request defaults to source `default`, kind `query`, method `GET`, trigger `load`, inherited auth, and view permission. Set `trigger: "manual"` for a parameterized query. An action defaults to manual and modify permission. DELETE uses full permission and confirmation. Do not use `load: false`.
Use stable real URLs for public APIs and clear suggested URLs for self-hosted services. Homarr collects the installer's server URL, network scope, and credentials as source setup; credentials remain outside the manifest.
-Paths use `{option:name}` and `{param:name}`. Query/body data uses `{ "$option": "name" }` and `{ "$param": "name" }`. Load queries cannot use params. Runtime parameter names and primitive values are inferred from references.
+Paths use `{option:name}` and `{param:name}`; query/body references use `{ "$option": "name" }` and `{ "$param": "name" }`. Constants stay primitive (`take: 10`); `$param` is only for manual helpers, never load queries. Names and types are inferred.
Every option has `label`, `control`, and `default`. Optional fields are `description`, `choices`, `choicesFrom`, `min`, `max`, `step`, `advanced`, and `group`.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 551ad055d..1e99d0556 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -51,7 +51,7 @@ jobs:
name: Fast gate
if: github.event_name != 'pull_request_target' && (github.event_name != 'workflow_dispatch' || inputs.operation != 'cleanup')
runs-on: ubuntu-latest
- timeout-minutes: 15
+ timeout-minutes: 20
env:
TURBO_API: ${{ secrets.TURBO_API }}
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
diff --git a/apps/docs/docs/management/api/index.mdx b/apps/docs/docs/management/api/index.mdx
index 8b72e3bd6..df5ac4e32 100644
--- a/apps/docs/docs/management/api/index.mdx
+++ b/apps/docs/docs/management/api/index.mdx
@@ -170,12 +170,27 @@ Gutter columns are reserved from the layout's total column count, and changing t
## Get Custom Widget authoring resources
-Custom JSX v2 provides four HTTP discovery endpoints:
+Custom JSX v2 provides focused HTTP discovery endpoints:
- `GET /api/custom-widgets/authoring-prompt` returns the current prompt plus MCP and HTTP resource identifiers.
- `GET /api/custom-widgets/schema` returns the canonical widget JSON Schema.
- `GET /api/custom-widgets/components` returns the release-matched static component catalog.
-- `GET /api/custom-widgets/skill` returns the concise live `SKILL.md` plus skills.sh, source, and install metadata. Retrieve the schema, component catalog, and examples through their dedicated resources only when needed.
+- `GET /api/custom-widgets/skill` returns the concise live `SKILL.md`, a named-reference index, and installation metadata.
+- `GET /api/custom-widgets/reference-schema`, `/reference-runtime`, and `/reference-security` return one authoring
+ reference at a time.
+
+Retrieve the schema, component catalog, references, and examples only when needed. Preview creation returns separate
+`queries` and `actions` evidence lists. Each action includes its HTTP method, invocation parameters, minimum board
+permission, confirmation, and invalidated query IDs so clients can simulate and verify mutations before persistence.
+
+For an evidence-driven JSX correction, `customWidget_previewReviseTemplate` accepts only the preview session,
+optional expected revision, and `template` or `templateLines`. It inherits and fully revalidates the manifest, advances
+the session revision, and returns fresh query/action lists without echoing sources, requests, options, or secrets.
+`customWidget_createFromPreview` requires current-revision evidence for every query and action; simulated action checks
+count as evidence without executing the mutation.
+
+MCP clients can call `customWidget_findComponents` with a capability query for a small release-matched component subset
+instead of retrieving the complete component catalog.
Call `customWidget_configurationRequestUser` to create a temporary API source setup URL where the user can confirm their server URL and enter credentials. Do not construct or save this URL.
diff --git a/apps/docs/docs/management/assistant.mdx b/apps/docs/docs/management/assistant.mdx
index 69cf28b9e..b78473da0 100644
--- a/apps/docs/docs/management/assistant.mdx
+++ b/apps/docs/docs/management/assistant.mdx
@@ -46,8 +46,14 @@ add Homarr items as context, `/` for shortcuts, and the paperclip for supported
Use **Conversations** to search, switch, rename, export, or delete threads.
-Each request includes the user's name, current page and board, home board, server time, browser time zone, and a small
-summary of accessible Homarr resources. Live status is fetched only when needed.
+Each request includes the user's name, current page and board, home board, server time, browser time zone, and only
+explicitly mentioned Homarr entities. Live status is fetched only when needed. The full Homarr tool catalog remains
+available server-side, while the model receives a small relevant subset and can discover another capability on demand.
+
+When web search is enabled, Assistant uses bounded search context and prefers primary documentation. Custom Widget
+authoring starts with a compact skill and template validator, then discovers schema, preview, reference, and component
+tools only when the task needs them. A response-driven JSX correction revises the existing preview without resending
+its manifest; Homarr then requires fresh query and simulated-action evidence for that preview revision before saving.
## Permissions and privacy
diff --git a/apps/docs/docs/management/custom-widgets/agent-authoring.mdx b/apps/docs/docs/management/custom-widgets/agent-authoring.mdx
index 00b7ffcb8..97b6e5548 100644
--- a/apps/docs/docs/management/custom-widgets/agent-authoring.mdx
+++ b/apps/docs/docs/management/custom-widgets/agent-authoring.mdx
@@ -1,8 +1,11 @@
# Use agents and skills.sh
-An external agent creates one widget at a time with the Homarr MCP server. The agent harness manages the list for multiple widgets.
+An external agent can create one widget or a coordinated set with the Homarr MCP server. For a set, it researches a
+service once, divides distinct user jobs into useful widgets, and validates every definition independently.
-Homarr does not create widget packs or drafts for multiple widgets.
+For example, a request for a Seerr widget can become a coordinated library/request-status widget and an interactive
+media-search widget that submits requests, when the service's documented API and the user's permissions support those
+flows.
The MCP API key must belong to a Homarr administrator. Non-administrator keys do not list Custom Widget tools, prompts,
or resources. The same administrator requirement applies to the matching HTTP authoring endpoints.
@@ -17,9 +20,9 @@ Install the Agent Skill from the verified Homarr repository:
npx skills add https://github.com/homarr-labs/homarr --skill homarr-custom-widget
```
-The portable skill gives concise authoring guidance. For connected agents, Homarr returns the complete `SKILL.md` and
-all bundled skill references once in one lazy tool response. The Homarr MCP prompt then gives the agent a
-retrieval workflow: read the live schema and fetch only the component documentation needed for the widget.
+The portable skill gives concise authoring guidance. For connected agents, Homarr returns a compact `SKILL.md` and a
+reference index. The agent loads only the named schema, runtime, or security reference and component documentation the
+current design needs.
The workbench's **Copy AI prompt** action is separate. It creates a self-contained prompt below 12,000 characters for an ordinary ChatGPT or Claude conversation. It includes the lean contract, bindings, recommended components, and two polished examples. It never tells an offline model to call MCP tools.
@@ -34,66 +37,104 @@ Repository code cannot give this attribution.
## Get MCP resources
- Prompt: `homarr-custom-widget-author`
-- Resources: `homarr://custom-widgets/schema`, `components`, `components/{name}`, `examples/{name}`, and `skill`
-- HTTP: `GET /api/custom-widgets/authoring-prompt`, `schema`, `components`, and `skill`
+- Resources: `homarr://custom-widgets/schema`, `components`, `components/{name}`, `examples/{name}`, `skill`, and
+ `references/{schema|runtime|security}`
+- HTTP: `GET /api/custom-widgets/authoring-prompt`, `schema`, `components`, `skill`, and
+ `reference-{schema|runtime|security}`
The authoring-prompt tool description contains one sentence. The prompt contains the workflow instructions and resource links.
-`GET /api/custom-widgets/skill` and `customWidget_getSkill` return a self-contained structured skill payload:
+`GET /api/custom-widgets/skill` and `customWidget_getSkill` return a compact structured skill payload:
```ts
{
name: "homarr-custom-widget";
version: string;
- skillMd: string; // Complete SKILL.md
- references: Record;
+ skillMd: string;
+ references: Array<{
+ name: "schema" | "runtime" | "security";
+ tool: "customWidget_getReference";
+ toolInput: { name: string };
+ resource: string;
+ httpResource: string;
+ }>;
skillsShUrl: string;
sourceUrl: string;
installCommand: string;
}
```
-The `homarr://custom-widgets/skill` MCP resource returns the same `SKILL.md` and references once as bundled Markdown.
+The `homarr://custom-widgets/skill` MCP resource returns only the entrypoint Markdown. Named references remain separate
+so clients do not pay for unrelated material.
The component catalog is a compact index of names, categories, safety levels, shared prop names, policies, and example
IDs. Per-component results contain only component-specific props and a reference to shared prop documentation. Use
`customWidget_getSharedProps` once with only the shared prop names needed across the selected components. This avoids
-repeating hundreds of global props in every tool result. The catalog is deliberately not embedded in the skill or
-clipboard prompt; the skill response still contains the complete authoring, schema, runtime, and security references.
+repeating hundreds of global props in every tool result. The catalog and detailed references are deliberately not
+embedded in the skill or clipboard prompt.
These interfaces do not return an archive URL or archive hash.
## Create a Custom Widget with MCP
-1. Load `customWidget_getSkill`, then get the prompt and live schema.
-2. Call `customWidget_getComponentCatalog`, followed by `customWidget_getComponent` for only the relevant installed
- components and `customWidget_getExample` when one catalog example matches the interaction pattern. Fetch at most
- eight component documents before the first validation (or four after a complete example already matches). If shared
- props are needed, collect their catalog names and call `customWidget_getSharedProps` once for that set.
+Independent read-only discovery and reference calls can run together. Validation, preview, evidence, revision, and
+persistence calls run alone because each changes the active authoring phase.
+
+1. Load `customWidget_getSkill`. Use its routing index to fetch only applicable named references with
+ `customWidget_getReference`.
+2. For a new manifest, load the compact `schema` reference once; skip it when repairing a supplied valid v2 draft.
+ Load the heavyweight live schema only when its extra detail is needed. Prefer `customWidget_findComponents` for a focused release-matched
+ subset and reserve the full catalog for broad exploration, followed by `customWidget_getComponent` for only relevant
+ installed components and `customWidget_getExample` when one example matches the interaction pattern. Fetch whatever
+ named documentation the intended design requires without walking the whole catalog. If shared props are needed,
+ collect their catalog names and call `customWidget_getSharedProps` once for that set.
3. Read the external API documentation.
-4. Build one definition, using `templateLines` for multiline JSX tool input.
-5. Validate the definition without saving it and repair every reported issue.
-6. Create a preview session.
-7. Run `customWidget_previewQuery` for every query returned by the preview and inspect its actual status and data shape. Assistant conversations retain a bounded response preview so large APIs cannot exhaust the model context. Use
+4. Build each definition, using `templateLines` for multiline JSX tool input. Call `customWidget_validateTemplate`
+ while drafting to repair JSX without resending the complete manifest. A valid template with an unknown-prop warning
+ keeps one concrete `customWidget_getComponent` repair lookup active; otherwise proceed directly to preview. Homarr
+ Assistant exposes only `templateLines` for validation and revision to prevent duplicate JSX tokens; direct MCP clients
+ may send exactly one of `template` or `templateLines`.
+5. Send the coherent complete definition once to `customWidget_previewCreate`. It performs full validation and creates
+ the preview session.
+6. Run `customWidget_previewQuery` for every query returned by the preview and inspect its actual status and data shape. Assistant conversations retain a bounded response preview so large APIs cannot exhaust the model context. Use
`{}` for load queries; manual queries require exactly the returned primitive `parameterNames`.
-8. Test relevant actions in simulation mode.
-9. Open the returned preview path with browser tools.
-10. Inspect the redacted journal and revise the local candidate until validation, data, and rendering all work. Keep the
- exact tested preview candidate locally. Any definition, template, or source change requires a new validation and preview;
- earlier query evidence belongs to the previous preview revision.
+7. Test every relevant action returned by the preview in simulation mode. Verify its method, parameters, minimum board
+ permission, confirmation, and invalidated queries before persistence.
+8. Open the returned preview path with browser tools.
+9. Inspect the redacted journal. For a JSX-only correction, validate the replacement template, then call
+ `customWidget_previewReviseTemplate` with the session ID. Direct MCP clients may also pass the returned current revision
+ for optimistic concurrency. It inherits sources, requests, options, and secrets without resending them, increments the
+ revision, and returns fresh evidence lists. Use a new
+ `customWidget_previewCreate` session only when sources, requests, or options change.
+10. Retest every returned query and action for the current revision. Earlier evidence remains in the journal but cannot
+ satisfy persistence.
11. Create the widget from that final tested preview with `customWidget_createFromPreview`. The preview session already carries
the source URLs and encrypted credentials supplied during preview; the create call accepts only its session ID plus an
- optional target board and persists that tested preview.
+ optional target board and persists that tested preview only after every query and action has current evidence.
12. Open its returned management path, and use a structured question when the user must choose whether to place it on a board.
13. Otherwise, ask the user to configure the saved definition with the ten-minute Homarr source-setup URL.
14. Create a final preview with the saved definition ID so Homarr loads its stored credentials, then test it again.
15. Update the saved definition if the final verification finds a problem. `customWidget_update` also accepts
`templateLines` for multiline JSX without resetting omitted options.
-16. Repeat the procedure for the next widget.
+16. Repeat the independent preview and persistence lifecycle for every widget in the requested set.
-Successful validation returns a compact summary instead of echoing the full widget and template. Preview creation
-returns its session, links, and query checklist without repeating the submitted definition. Keep the candidate locally
-and reuse it for the next lifecycle step.
+Template validation returns focused diagnostics. Preview creation and template revision return session metadata plus
+query/action checklists without echoing the definition. Keep the candidate locally and reuse the preview session for
+persistence.
+
+For numeric API enums, prefer a guarded indexed literal label array in JSX over repeating a long ternary chain. The
+interpreter validates this pattern independently, and it keeps generated templates and repair calls substantially
+smaller while still rendering readable statuses.
+
+A manual `SubFetch` returns to its trigger immediately when its request ID, parameters, or effective definition
+changes. Homarr hides the earlier result and does not fetch the new parameters until the user triggers it again, so
+bound search and pagination edits cannot silently relabel stale results.
+
+Dependent bound controls can reset declaratively: ``
+returns to page 1 whenever the scalar search value changes. The reset remains local and does not execute a request.
+
+After a successful manual query, a result-local `` reruns that
+query with unchanged parameters without adding another request definition or raw event handler.
Each source-configuration URL applies to one definition or preview and one source. It is short-lived, single-use, and
can only be opened and completed by an authenticated Homarr administrator. The administrator confirms the server URL,
diff --git a/apps/docs/docs/management/custom-widgets/custom-jsx.mdx b/apps/docs/docs/management/custom-widgets/custom-jsx.mdx
index b1f8e6aff..7e3424858 100644
--- a/apps/docs/docs/management/custom-widgets/custom-jsx.mdx
+++ b/apps/docs/docs/management/custom-widgets/custom-jsx.mdx
@@ -28,7 +28,8 @@ before it reaches `data`, so treat it as untrusted input even when the source is
```jsx
-
+
+
{(results, meta) => (
{(results ?? []).map((item) => (
@@ -42,10 +43,14 @@ before it reaches `data`, so treat it as untrusted input even when the source is
Bound values live only in React memory while the widget is mounted. They are not saved to the database, board options, exports, browser storage, or `localStorage`. Remounting resets them. Components can share a binding when their adapter types agree.
+Bindable controls accept a scalar `resetKey`. When it changes, Homarr restores that control to its declared `defaultValue` or `defaultChecked` without running a request. This keeps dependent pagination correct while a manual `SubFetch` waits for the user to submit the new query.
+
## Expression language
Use expressions, conditionals, optional chaining, arrays, objects, template strings, safe standard helpers, and expression callbacks for `map`, `filter`, `sort`, and trusted runtime slots. Callback blocks, authored `const`, IIFEs, authored recursion, arbitrary functions, imports, hooks, refs, raw events, browser requests, `eval`, and bigint are blocked.
+For user-facing timestamps, use the safe static helpers instead of `new Date` or an invented component. `Date.toLocaleString(value, "en-US", "UTC")` produces a concise absolute date and time for an explicitly labeled UTC value. `Date.toISOString`, `Date.toLocaleDateString`, and `Date.toLocaleTimeString` are also available.
+
Bounded regex literals are supported for string matching, splitting, search, and replacement. Regex literals are limited to
128 characters and flags `gimsu`; lookarounds, backreferences, repeated alternatives/groups, unsupported flags, and more
than one variable quantifier are rejected.
@@ -58,11 +63,14 @@ than one variable quantifier are rejected.
- `SubFetch` with `trigger="manual"` keeps its result local to that instance; it does not populate the shared
`data.requestId` or `status.requestId` roots. The child callback receives `(result, meta)`, while loading, errors, and
retry are handled by `SubFetch`. Provide both `triggerContent` and `triggerAriaLabel` when custom content launches it.
+- `SubFetch`, `ActionButton`, and `ToggleSwitch` require a quoted literal `requestId`. Independent JSX validation rejects
+ missing or computed IDs before a complete manifest or preview must be sent.
- `ActionButton` and `ToggleSwitch` run actions only when the widget is mounted outside edit mode. A toggle needs both
enabled and disabled request parameters and rolls back its visual state if the action fails.
- `RefreshButton` renders a compact, accessible icon control that invalidates the client's load-query cache so active load
- queries can refetch; it does not execute a request itself. It is disabled when the widget has no active item or preview
- session, or while the board is in edit mode.
+ queries can refetch. Set `requestId` inside a successful manual `SubFetch` result to rerun only that named query with the
+ same parameters. A targeted rerun respects an explicit request `cacheSeconds`; an untargeted button also clears the
+ widget's server cache. It is disabled when there is no active item/preview or while the board is in edit mode.
- `Icon`/`TablerIcon` resolves installed safe icons.
Always include responsive loading, empty, error, and success states. Runtime failures remain inside the widget tile.
diff --git a/apps/docs/docs/management/mcp.mdx b/apps/docs/docs/management/mcp.mdx
index 9deb3585f..2b0de0f5e 100644
--- a/apps/docs/docs/management/mcp.mdx
+++ b/apps/docs/docs/management/mcp.mdx
@@ -15,11 +15,12 @@ stateless compatibility path. It does not create protocol sessions or require st
server and extracts its tools only after an authenticated request reaches the route. The previous `/api/mcp/mcp` URL
remains available as a compatibility alias, but new clients should always use `/api/mcp`.
-With MCP, you can ask your AI assistant to manage apps, integrations, users, boards, Docker containers, media servers, DNS settings, and more - all through Homarr's existing tRPC API, now exposed as 50+ AI-callable tools.
+With MCP, you can ask your AI assistant to manage apps, integrations, users, boards, Docker and Kubernetes resources,
+media servers, DNS settings, and more through Homarr's existing tRPC API.
-The optional [Assistant](./assistant) uses these same tool definitions internally.
-Unlike external MCP clients, it uses the current Homarr session directly and asks for in-conversation
-approval before running mutating procedures.
+The optional [Assistant](./assistant) uses this same complete tool catalog internally, but sends only a relevant subset
+of schemas to the model at each step. It uses the current Homarr session directly and asks for in-conversation approval
+before running mutating procedures.
## Getting Started
@@ -186,45 +187,50 @@ The tools table on the MCP tab is dynamically generated - it always reflects the
- **"How many users are on my Homarr instance?"** - AI lists all users (admin only)
- **"Toggle Pi-hole blocking for 5 minutes"** - AI interacts with DNS controls
- **"How are my servers doing?"** - AI fetches Beszel system stats including CPU, memory, disk, and alerts
-- **"Build a Custom Widget for this API"** - AI validates and previews one definition before it saves the definition
+- **"Build two Custom Widgets for this API"** - AI researches once, then validates and previews each definition before saving it
## Create a Custom Widget with an AI agent
-An agent creates one `homarr-custom-widget-v2` definition at a time. Start with the native prompt `homarr-custom-widget-author`.
+An agent can create one `homarr-custom-widget-v2` definition or a coordinated set. Start with the native prompt
+`homarr-custom-widget-author`.
The API key owner must be a Homarr administrator. The same rule applies to management, import, migration, preview,
secrets, publication, Workshop installation, and the HTTP authoring resources.
-Load the installed skill before authoring. `customWidget_getSkill` returns the complete `SKILL.md` entrypoint and every
-bundled reference in one response, so an MCP client does not need filesystem access or a second documentation fetch.
-Then read the live schema and only the component resources required by the design. These resources describe the
-installed Mantine components.
+Load the installed skill before authoring. `customWidget_getSkill` returns its compact `SKILL.md` entrypoint and a
+reference index. Load a named schema, runtime, or security reference with `customWidget_getReference` only when the
+design needs it. Read the live JSON Schema or component resources when their detail is required by the design.
-1. Call `customWidget_getSkill`, `customWidget_getAuthoringPrompt`, `customWidget_schema`, and
- `customWidget_getComponentCatalog`.
-2. Fetch only the relevant installed component documentation with `customWidget_getComponent` and, when useful,
+1. Call `customWidget_getSkill`. Homarr Assistant stages the next typed authoring tools automatically as the widget
+ moves through context, validation, preview, evidence, and persistence phases.
+2. Load the live schema and applicable named references on demand. Prefer `customWidget_findComponents` for a small
+ release-matched result set; reserve the full catalog for broad exploration. Fetch only relevant installed component
+ documentation with `customWidget_getComponents` (or `customWidget_getComponent` for one repair) and, when useful,
one interaction example with `customWidget_getExample`. Component results contain component-specific props; collect
any needed shared prop names from the compact catalog and fetch them together once with `customWidget_getSharedProps`.
-3. Build one Custom Widget definition. Use `templateLines` for generated multiline JSX to avoid a fragile JSON-escaped
- template string.
-4. Call `customWidget_validate` without saving the definition and repair every returned issue path.
-5. Call `customWidget_previewCreate`.
-6. Call `customWidget_previewQuery` for every entry in the returned `queries` list. Supply the listed invocation
+3. Build each Custom Widget definition. Use `templateLines` for generated multiline JSX and
+ `customWidget_validateTemplate` for focused JSX diagnostics without resending the complete manifest.
+4. Send the coherent complete definition once to `customWidget_previewCreate`; preview creation performs full
+ validation and creates the testable preview.
+5. Call `customWidget_previewQuery` for every entry in the returned `queries` list. Supply the listed invocation
parameters for manual queries and inspect the real HTTP status and response shape before binding template fields.
-7. Test relevant actions with `customWidget_previewAction` in simulation mode.
-8. Open the returned `previewPath` or `previewUrl`.
-9. Examine `customWidget_previewJournal`.
-10. Revise the local candidate and create another preview session until validation, query data, actions, and rendering
- are ready.
-11. Call `customWidget_create`, supplying any credentials and deployment-specific source URLs the user already provided.
-12. Open the returned `managementPath` to review the exact saved definition.
-13. If the user must enter the source URL or credentials, call `customWidget_configurationRequestUser` with the new definition ID and wait for completion.
-14. Create a final preview with that definition ID so Homarr loads its stored credentials, then test it again.
-15. Use `customWidget_update` or `customWidget_templatePatch` for any final saved-definition corrections.
-16. Repeat this procedure for the next Custom Widget.
+6. Test every relevant entry in the returned `actions` list with `customWidget_previewAction` in simulation mode. The
+ list exposes each action's method, parameters, minimum board permission, confirmation, and invalidated queries.
+7. Open the returned `previewPath` or `previewUrl`.
+8. Examine `customWidget_previewJournal`.
+9. For a JSX-only evidence correction, validate it and call `customWidget_previewReviseTemplate` with the session ID
+ and revision. It inherits the manifest and returns fresh evidence lists without resending sources, requests, or
+ options. Create another preview only when those manifest sections change.
+10. Retest every returned query and action for the current revision, then call `customWidget_createFromPreview` with
+ the session ID so the definition is not streamed again.
+11. Open the returned `managementPath` to review the exact saved definition.
+12. If the user must enter the source URL or credentials, call `customWidget_configurationRequestUser` with the new definition ID and wait for completion.
+13. Create a final preview with that definition ID so Homarr loads its stored credentials, then test it again.
+14. Use `customWidget_update` or `customWidget_templatePatch` for any final saved-definition corrections.
+15. Repeat the independent preview and persistence lifecycle for every definition in the requested set.
-Validation and preview creation return compact lifecycle metadata. They do not echo the submitted widget or duplicate
-its template as both a string and line array; the agent should retain and reuse its local candidate.
+Validation, preview creation, and template revision return compact lifecycle metadata. They do not echo the submitted
+widget or duplicate its template as both a string and line array; the agent should retain and reuse its local candidate.
The agent receives the configuration-request status. The agent does not receive plaintext credentials. A preview-scoped setup URL configures only that temporary preview; use a definition-scoped URL when the values must persist.
@@ -235,6 +241,7 @@ Discovery resources:
- `homarr://custom-widgets/components/{name}`
- `homarr://custom-widgets/examples/{name}`
- `homarr://custom-widgets/skill`
+- `homarr://custom-widgets/references/{schema|runtime|security}`
An authenticated administrator can use the matching `/api/custom-widgets/authoring-prompt`, `/schema`, `/components`,
and `/skill` endpoints instead of MCP resource URIs. These endpoints are not public schema downloads.
@@ -243,13 +250,16 @@ The Custom Widget tools are:
- `customWidget_schema`
- `customWidget_validate`
+- `customWidget_validateTemplate`
- `customWidget_list`
- `customWidget_get`
- `customWidget_create`
+- `customWidget_createFromPreview`
- `customWidget_update`
- `customWidget_delete`
- `customWidget_templatePatch`
- `customWidget_previewCreate`
+- `customWidget_previewReviseTemplate`
- `customWidget_previewQuery`
- `customWidget_previewAction`
- `customWidget_previewJournal`
@@ -261,10 +271,13 @@ The Custom Widget tools are:
- `customWidget_workshopInstall`
- `customWidget_getAuthoringPrompt`
- `customWidget_getComponentCatalog`
+- `customWidget_findComponents`
+- `customWidget_getComponents`
- `customWidget_getComponent`
- `customWidget_getSharedProps`
- `customWidget_getExample`
- `customWidget_getSkill`
+- `customWidget_getReference`
Custom Widget permissions are not assignable group capabilities. Administrator status is required for the complete
authoring surface. A source-configuration URL is short-lived and single-use, requires the same logged-in administrator
diff --git a/apps/docs/static/custom-widgets/component-catalog-v1.json b/apps/docs/static/custom-widgets/component-catalog-v1.json
index b302fa69a..7fb8f95fb 100644
--- a/apps/docs/static/custom-widgets/component-catalog-v1.json
+++ b/apps/docs/static/custom-widgets/component-catalog-v1.json
@@ -1 +1 @@
-{"schemaVersion":1,"mantineVersion":"9.4.1","customWidgetVersion":"2.0.0","types":["\"\" | \"anonymous\" | \"use-credentials\"","\"-moz-initial\" | \"inherit\" | \"initial\" | \"revert\" | \"revert-layer\" | \"unset\" | \"auto\" | \"fixed\"","\"-moz-initial\" | \"inherit\" | \"initial\" | \"revert\" | \"revert-layer\" | \"unset\" | \"none\" | \"auto\" | \"all\" | \"fill\" | \"stroke\" | \"painted\" | \"visible\" | \"visibleFill\" | \"visiblePainted\" | \"visibleStroke\"","\"-moz-initial\" | \"inherit\" | \"initial\" | \"revert\" | \"revert-layer\" | \"unset\" | \"none\" | \"block\" | \"inline\" | \"both\" | \"horizontal\" | \"vertical\"","\"-moz-initial\" | \"inherit\" | \"initial\" | \"revert\" | \"revert-layer\" | \"unset\" | \"none\" | \"contain\" | \"cover\" | \"fill\" | \"scale-down\"","\"-moz-initial\" | \"inherit\" | \"initial\" | \"revert\" | \"revert-layer\" | \"unset\" | \"wrap\" | \"nowrap\" | \"wrap-reverse\"","\"12h\" | \"24h\"","\"activity\" | \"display-none\"","\"all\" | \"parent\" | \"child\"","\"all\" | \"segment\"","\"always\" | \"hover\" | \"not-hover\" | \"never\"","\"area\" | \"radial\" | \"scatter\"","\"auto\" | \"scroll\" | \"always\" | \"hover\" | \"never\"","\"auto-fit\" | \"auto-fill\"","\"block\" | \"grid\"","\"both\" | \"rightSection\" | \"clear\"","\"bottom\" | \"top\"","\"bottom\" | \"top\" | \"baseline\" | \"middle\"","\"bottom\" | \"top\" | \"middle\"","\"bottom-end\" | \"bottom-start\" | \"top-end\" | \"top-start\" | \"bottom-center\" | \"top-center\" | \"middle-center\" | \"middle-end\" | \"middle-start\"","\"button\" | \"submit\" | \"reset\"","\"center\" | \"bottom\"","\"center\" | \"left\" | \"right\"","\"center\" | \"left\" | \"right\" | \"justify\" | \"char\"","\"center\" | \"side\" | \"merge\"","\"checkbox\" | \"radio\"","\"dashed\" | \"dotted\" | \"solid\"","\"default\" | \"gradient\"","\"default\" | \"responsive\"","\"default\" | \"stacked\" | \"percent\" | \"split\"","\"default\" | \"stacked\" | \"percent\" | \"waterfall\"","\"div\" | \"label\"","\"end\" | \"start\"","\"filled\" | \"light\"","\"fixed\" | \"absolute\"","\"hex\" | \"hexa\" | \"rgba\" | \"rgb\" | \"hsl\" | \"hsla\"","\"horizontal\" | \"vertical\"","\"hover\" | \"click\" | \"click-hover\"","\"inherit\" | \"auto\" | \"baseline\" | \"before-edge\" | \"text-before-edge\" | \"middle\" | \"central\" | \"after-edge\" | \"text-after-edge\" | \"ideographic\" | \"alphabetic\" | \"hanging\" | \"mathematical\"","\"inherit\" | \"auto\" | \"sRGB\" | \"linearRGB\"","\"inherit\" | \"auto\" | \"text-before-edge\" | \"middle\" | \"central\" | \"text-after-edge\" | \"ideographic\" | \"alphabetic\" | \"hanging\" | \"mathematical\" | \"use-script\" | \"no-change\" | \"reset-size\"","\"inherit\" | \"end\" | \"start\" | \"middle\"","\"inherit\" | \"nonzero\" | \"evenodd\"","\"inherit\" | \"round\" | \"butt\" | \"square\"","\"inherit\" | \"round\" | \"miter\" | \"bevel\"","\"initial\" | \"medial\" | \"terminal\" | \"isolated\"","\"inside\" | \"outside\"","\"left\" | \"right\"","\"left\" | \"right\" | \"bottom\" | \"top\" | \"left-end\" | \"left-start\" | \"right-end\" | \"right-start\" | \"bottom-end\" | \"bottom-start\" | \"top-end\" | \"top-start\"","\"left\" | \"right\" | \"inside\"","\"link\" | \"none\" | \"copy\" | \"execute\" | \"move\" | \"popup\"","\"media\" | \"container\"","\"month\" | \"year\" | \"decade\"","\"native\" | \"scrollarea\"","\"none\" | \"all\" | \"rows\" | \"groups\" | \"columns\"","\"none\" | \"all\" | \"with-indicators\"","\"none\" | \"ascending\" | \"descending\" | \"other\"","\"none\" | \"inline\" | \"list\" | \"both\"","\"none\" | \"strict\" | \"blur\"","\"none\" | \"sum\"","\"none\" | \"thousand\" | \"lakh\" | \"wan\"","\"none\" | \"x\" | \"y\" | \"xy\"","\"number\" | RegExp | \"alphanumeric\"","\"off\" | \"assertive\" | \"polite\"","\"off\" | \"on\"","\"ordered\" | \"unordered\"","\"right-to-left\" | \"left-to-right\"","\"search\" | \"enter\" | \"done\" | \"go\" | \"next\" | \"previous\" | \"send\"","\"search\" | \"text\" | \"none\" | \"tel\" | \"url\" | \"email\" | \"numeric\" | \"decimal\"","\"step\" | \"bump\" | \"linear\" | \"natural\" | \"monotone\" | \"stepBefore\" | \"stepAfter\"","\"stepInactive\" | \"stepProgress\" | \"stepCompleted\"","\"sum\" | \"replace\"","\"td\" | \"th\"","\"text\" | \"additions\" | \"additions removals\" | \"additions text\" | \"all\" | \"removals\" | \"removals additions\" | \"removals text\" | \"text additions\" | \"text removals\"","\"text\" | \"tel\" | \"password\"","\"time\" | \"duration\"","\"up\" | \"down\"","\"value\" | \"name\" | \"percent\"","\"viewport\"","\"wrap\" | \"nowrap\" | \"balance\" | \"pretty\" | \"stable\"","\"x\" | \"y\"","\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"","\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | (string & {})","\"yes\" | \"no\"","'Text' | 'Title' | 'Badge' | 'Code' | 'Image'","'auto' | 'manual'","'json' | 'text'","'xs' | 'sm' | 'md' | 'lg' | 'xl'","(\"input\" | \"label\" | \"description\" | \"error\")[]","(\"next\" | \"previous\" | \"level\")[]","(ActionIconProps & React.ClassAttributes & React.ButtonHTMLAttributes)","(CartesianChartProps & { ref?: React.Ref; })","(CloseButtonProps & ElementProps<\"button\"> & DataAttributes)","(CloseButtonProps & React.ClassAttributes & React.ButtonHTMLAttributes)","(ElementProps<\"button\"> & DataAttributes)","(InputDescriptionProps & DataAttributes)","(InputErrorProps & DataAttributes)","(InputLabelProps & DataAttributes)","(InputSuccessProps & DataAttributes)","(Multiple extends true ? Value[] : Value | null)","(OverlayProps & ElementProps<\"div\">)","(PolarChartProps & { ref?: React.Ref; })","(React.ClassAttributes & React.ButtonHTMLAttributes & DataAttributes)","(React.ClassAttributes & React.HTMLAttributes & DataAttributes)","(React.ClassAttributes & React.InputHTMLAttributes & DataAttributes)","(React.ClassAttributes & React.SelectHTMLAttributes & DataAttributes)","(Type extends \"default\" ? boolean : never)","(Type extends \"range\" ? boolean : never)","(Value | SegmentedControlItem)[]","(number | null)[]","(string & {}) | \"bars\" | \"dots\" | \"oval\"","(string & {}) | \"none\" | \"off\" | \"on\" | \"sentences\" | \"words\" | \"characters\"","(string & {}) | AccordionVariant","(string & {}) | ActionIconVariant","(string & {}) | AlertVariant","(string & {}) | AvatarVariant","(string & {}) | BadgeVariant","(string & {}) | ButtonVariant","(string & {}) | CheckboxIndicatorVariant","(string & {}) | CheckboxVariant","(string & {}) | ChipVariant","(string & {}) | CloseButtonVariant","(string & {}) | DividerVariant","(string & {}) | FieldsetVariant","(string & {}) | InputVariant","(string & {}) | NavLinkVariant","(string & {}) | PillVariant","(string & {}) | RadioIndicatorVariant","(string & {}) | RadioVariant","(string & {}) | TableVariant","(string & {}) | TabsVariant","(string & {}) | TextVariant","(string & {}) | ThemeIconVariant","0 | -1","0 | 2 | 3 | 4 | 5 | 6 | 1","1 | 2 | 3 | 4 | 5 | 6","2 | 3 | 4 | 5 | 6","2 | 3 | 4 | 5 | 6 | 1","AccordionValue","AreaChartSeries[]","AriaRole","BarChartSeries[]","BarsListBarData[]","BoxMod","BubbleChartDataKey","ButtonSize","CSSProperties","CalendarAriaLabels","ChartData","ChartReferenceLineProps[]","ChartSeries[]","ComboboxData","ComboboxGenericData","ComboboxProps","ComboboxStringGroupData","CompositeChartSeries[]","DatePickerPreset<\"default\">[]","DatePickerPreset[]","DatePickerType | Type","DatePickerValue","DateValue","DayOfWeek[]","DefaultMantineColor","DefaultMantineColor | \"initials\"","DefaultMantineColor[]","DonutChartCell[]","FlatTreeLineState[]","FunnelChartCell[]","GridBreakpoints","HTMLElement | null","HTMLInputAutoCompleteAttribute","HTMLInputTypeAttribute","InputClearButtonProps","Key | null","LineChartGradientStop[]","LineChartSeries[]","LoaderProps","MantineBreakpoint","MantineChartDotProps","MantineGradient","MantineRadius","MantineShadow","MantineSize | (string & {})","MantineSpacing","Mode","MonthPickerPreset[]","Multiple","NumberInputValue","Omit, \"data\" | \"ref\" | \"dataKey\">","Omit","Omit","Omit","Omit","Omit","Omit","Omit, HTMLInputElement>, \"value\">","Omit","Omit, \"ref\">","Omit","Omit","Omit, \"ref\">","OverlayProps","Partial>","Partial>","Partial>","Partial>","Partial, \"data\" | \"ref\" | \"dataKey\">>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial>","Partial","PieChartCell[]","PopoverMiddlewares","PopoverProps","PopoverWidth","Property.AlignItems","Property.BackgroundColor","Property.BorderRadius","Property.Height","Property.JustifyContent","Property.ListStyleType","Property.MaxHeight","Property.MinWidth","Property.Overflow","Property.OverscrollBehavior","Property.Width","RadarChartSeries[]","RangeSliderValue","React.CSSProperties","React.DetailedHTMLProps, HTMLButtonElement>","React.DetailedHTMLProps, HTMLDivElement>","React.DetailedHTMLProps, HTMLImageElement>","React.DetailedHTMLProps, HTMLInputElement>","React.HTMLInputTypeAttribute","React.ReactNode","ReactNode","Record","Record","Record[]","Record[] | readonly Record[]","Record","Record","RingProgressSection[]","SankeyChartData","ScatterChartSeries[]","ScrollAreaProps","SimpleGridProps","SliderMark[]","SparklineTrendColors","SplitterPaneSize","SplitterPaneSize[]","SplitterStep","StyleProp<\"text\" | (string & {}) | \"monospace\" | \"heading\">","StyleProp","StyleProp","StyleProp","StyleProp","StyleProp","StyleProp","StyleProp>","StyleProp","StyleProp>","StyleProp>","StyleProp","StyleProp>","StyleProp","StyleProp","StyleProp","StyleProp","StyleProp>","StyleProp","StyleProp>","StyleProp>","StyleProp>","StyleProp>","StyleProp>","StyleProp","StyleProp","StyleProp>","StyleProp","StyleProp>","StyleProp","StyleProp","StyleProp","T","T[]","TableData","TimePickerAmPmLabels","TimePickerPresets","TitleSize","TooltipMiddlewares","TreeNodeData","TreeNodeData[]","TreeSelectChevronAriaLabels","TreeSelectValue","TreemapData[]","Type","Type | DatePickerType","UseTreeReturnType","Value","Value | null","Value[]","WrapperProps","YearPickerPreset[]","[DefaultMantineColor, DefaultMantineColor]","[number, number]","[string, string]","boolean","boolean | SafePolygonOptions","boolean | string","boolean[]","false | \"x\" | \"y\" | \"xy\"","false | true","false | true | \"auto\" | \"true\" | \"false\"","false | true | \"dialog\" | \"menu\" | \"grid\" | \"true\" | \"false\" | \"listbox\" | \"tree\"","false | true | \"end\" | \"start\"","false | true | \"odd\" | \"even\"","false | true | \"time\" | \"true\" | \"false\" | \"page\" | \"step\" | \"location\" | \"date\"","false | true | \"true\" | \"false\"","false | true | \"true\" | \"false\" | \"grammar\" | \"spelling\"","false | true | \"true\" | \"false\" | \"mixed\"","false | true | \"user\" | \"environment\"","false | true | \"x\" | \"y\" | \"present\"","null | string","number","number | FloatingAxesOffsets","number | MantineSize | (string & {})","number | MantineSize | (string & {}) | \"input-xs\" | \"input-sm\" | \"input-md\" | \"input-lg\" | \"input-xl\"","number | { x: number; y: number; }","readonly Record[]","string","string | (string & {})","string | (string | RegExp)[]","string | Date","string | Date | null","string | false | true","string | number","string | number | readonly string[]","string | string[] | HighlightTerm[]","string[]","undefined","unknown","{ area?: Record; legend?: Record; grid?: Record; root?: Record; ... 14 more ...; tooltipBody?: Record<...>; }","{ area?: Record; legend?: Record; line?: Record; grid?: Record; ... 16 more ...; tooltipBody?: Record<...>; }","{ body?: Record; input?: Record; label?: Record; root?: Record; ... 4 more ...; labelWrapper?: Record<...>; }","{ body?: Record; input?: Record; label?: Record; section?: Record; ... 19 more ...; swatch?: Record<...>; }","{ body?: Record; input?: Record; label?: Record; track?: Record; ... 5 more ...; trackLabel?: Record<...>; }","{ body?: Record; label?: Record; root?: Record; icon?: Record; ... 4 more ...; labelWrapper?: Record<...>; }","{ body?: Record; label?: Record; section?: Record; children?: Record; root?: Record<...>; chevron?: Record<...>; description?: Record<...>; collapse?: Record<...>; } | u...","{ body?: Record; label?: Record; title?: Record; root?: Record; icon?: Record<...>; wrapper?: Record<...>; message?: Record<...>; closeButton?: Record<...>; }","{ body?: Record; slider?: Record; wrapper?: Record; sliderOverlay?: Record; ... 6 more ...; swatch?: Record<...>; }","{ body?: Record; title?: Record; root?: Record; description?: Record; indicator?: Record<...>; actions?: Record<...>; }","{ body?: Record; title?: Record; root?: Record; icon?: Record; loader?: Record<...>; closeButton?: Record<...>; description?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 12 more ...; monthPickerRoot?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 4 more ...; monthsListControl?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 4 more ...; yearsListRow?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 5 more ...; monthsListControl?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 5 more ...; yearsListRow?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; ... 8 more ...; yearPickerRoot?: Record<...>; }","{ calendarHeader?: Record; calendarHeaderControl?: Record; calendarHeaderLevel?: Record; calendarHeaderControlIcon?: Record<...>; }","{ caption?: Record; table?: Record; tbody?: Record; td?: Record; tfoot?: Record<...>; th?: Record<...>; thead?: Record<...>; tr?: Record<...>; }","{ card?: Record; }","{ cite?: Record; root?: Record; icon?: Record; }","{ col?: Record; root?: Record; inner?: Record; container?: Record; }","{ content?: Record; root?: Record; chevron?: Record; control?: Record; container?: Record<...>; }","{ content?: Record; root?: Record; control?: Record; }","{ content?: Record; root?: Record; group?: Record; }","{ content?: Record; root?: Record; scrollbar?: Record; thumb?: Record; viewport?: Record<...>; corner?: Record<...>; }","{ content?: Record; root?: Record; separator?: Record; step?: Record; ... 9 more ...; stepDescription?: Record<...>; }","{ day?: Record; }","{ dropdown?: Record; overlay?: Record; arrow?: Record; }","{ group?: Record; }","{ groupSection?: Record; }","{ hover: boolean; focus: boolean; touch: boolean; }","{ icon?: Record; indicator?: Record; }","{ image?: Record; root?: Record; placeholder?: Record; }","{ input?: Record; label?: Record; option?: Record; section?: Record; ... 11 more ...; groupLabel?: Record<...>; }","{ input?: Record; label?: Record; option?: Record; section?: Record; ... 14 more ...; inputField?: Record<...>; }","{ input?: Record; label?: Record; root?: Record; control?: Record; indicator?: Record<...>; innerLabel?: Record<...>; }","{ input?: Record; label?: Record; root?: Record; iconWrapper?: Record; checkIcon?: Record<...>; }","{ input?: Record; label?: Record