@alfakit/core 0.1.12 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cms.d.ts +10 -1
- package/dist/cms.d.ts.map +1 -1
- package/dist/cms.js +30 -1
- package/dist/cms.js.map +1 -1
- package/dist/form.d.ts +10 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +26 -4
- package/dist/form.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/kanban.d.ts.map +1 -1
- package/dist/kanban.js +25 -1
- package/dist/kanban.js.map +1 -1
- package/dist/schema/cms.d.ts +23 -0
- package/dist/schema/cms.d.ts.map +1 -1
- package/dist/schema/components.d.ts +2 -0
- package/dist/schema/components.d.ts.map +1 -1
- package/dist/schema/components.js.map +1 -1
- package/dist/schema/index.d.ts +2 -2
- package/package.json +1 -1
- package/themes.css +92 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @alfakit/core
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- CMS site design and block style types and helpers (`cmsDesignCss`, `cmsDesignLinks`, `cmsBlockAttributes`); `FormStore.trackUpload()` so submits wait for uploads in progress; Kanban drops on a refused column return the card with a message; FileUpload accepted-type labels.
|
|
8
|
+
|
|
9
|
+
## 0.1.13
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Released with AlfaKit 0.1.13 to keep the npm and PHP versions the same (no core changes).
|
|
14
|
+
|
|
3
15
|
## 0.1.12
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/cms.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Translator } from "./i18n.js";
|
|
2
|
-
import { CmsBlockSchema, CmsPayload, CmsSeoSchema } from "./schema/cms.js";
|
|
2
|
+
import { CmsBlockSchema, CmsPayload, CmsSeoSchema, CmsSiteDesign } from "./schema/cms.js";
|
|
3
3
|
//#region src/cms.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* The framework-agnostic half of the CMS renderers (alfasix/alfakit-cms): registry keys,
|
|
@@ -39,6 +39,15 @@ export interface CmsLinkTag {
|
|
|
39
39
|
href: string;
|
|
40
40
|
hreflang?: string;
|
|
41
41
|
}
|
|
42
|
+
/** The favicon and font stylesheet of the site design, for `<head>`. */
|
|
43
|
+
export declare function cmsDesignLinks(design: CmsSiteDesign | null | undefined): CmsLinkTag[];
|
|
44
|
+
/** The design's CSS for a `<style>` element; checked again so it can never close the element. */
|
|
45
|
+
export declare function cmsDesignCss(design: CmsSiteDesign | null | undefined): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* The attributes of a block's wrapper (`data-slot="cms-block"`): its `id` (the anchor
|
|
48
|
+
* from **Style**, else the block id) and the `data-cms-*` hooks `themes.css` styles.
|
|
49
|
+
*/
|
|
50
|
+
export declare function cmsBlockAttributes(block: CmsBlockSchema): Record<string, string>;
|
|
42
51
|
export interface CmsHeadTags {
|
|
43
52
|
title: string;
|
|
44
53
|
meta: CmsMetaTag[];
|
package/dist/cms.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cms.d.ts","names":[],"sources":["../src/cms.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"cms.d.ts","names":[],"sources":["../src/cms.ts"],"mappings":";;;;;;;;;qBAgBa;;qBAGA;;qBAGA;;qBAGA;qBACA;;qBAGA;wBAeG,YAAY;;wBAKZ,UAAU,kBAAkB;;wBAsB5B,aAAa;;wBAWb,gBAAgB;wBAYhB,eAAe;;wBAYf,cAAc;;wBAKd,WAAW;iBAIV;EACf;EACA;EACA;;iBAGe;EACf;EACA;EACA;;;wBAIc,eAAe,QAAQ,mCAAmC;;wBAU1D,aAAa,QAAQ;;;;;wBAUrB,mBAAmB,OAAO,iBAAiB;iBAU1C;EACf;EACA,MAAM;EACN,OAAO;;EAEP;;;wBAIc,YAAY,KAAK,kCAAkC;;wBAsCnD,oBACd,SAAS,KAAK,0DACb;;wBAKa,WAAW,iBAAiB"}
|
package/dist/cms.js
CHANGED
|
@@ -80,6 +80,35 @@ function cmsWidthClass(width) {
|
|
|
80
80
|
function cmsLinkRel(newTab) {
|
|
81
81
|
return newTab ? "noopener noreferrer" : void 0;
|
|
82
82
|
}
|
|
83
|
+
/** The favicon and font stylesheet of the site design, for `<head>`. */
|
|
84
|
+
function cmsDesignLinks(design) {
|
|
85
|
+
const links = [];
|
|
86
|
+
if (design?.favicon) links.push({
|
|
87
|
+
rel: "icon",
|
|
88
|
+
href: design.favicon
|
|
89
|
+
});
|
|
90
|
+
if (design?.fonts) links.push({
|
|
91
|
+
rel: "stylesheet",
|
|
92
|
+
href: design.fonts
|
|
93
|
+
});
|
|
94
|
+
return links;
|
|
95
|
+
}
|
|
96
|
+
/** The design's CSS for a `<style>` element; checked again so it can never close the element. */
|
|
97
|
+
function cmsDesignCss(design) {
|
|
98
|
+
const css = design?.css;
|
|
99
|
+
return typeof css === "string" && css !== "" && !css.includes("<") ? css : null;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The attributes of a block's wrapper (`data-slot="cms-block"`): its `id` (the anchor
|
|
103
|
+
* from **Style**, else the block id) and the `data-cms-*` hooks `themes.css` styles.
|
|
104
|
+
*/
|
|
105
|
+
function cmsBlockAttributes(block) {
|
|
106
|
+
const attributes = { id: block.style?.anchor ?? block.id };
|
|
107
|
+
if (block.style?.background) attributes["data-cms-background"] = block.style.background;
|
|
108
|
+
if (block.style?.spacing) attributes["data-cms-spacing"] = block.style.spacing;
|
|
109
|
+
if (block.style?.visibility) attributes["data-cms-visibility"] = block.style.visibility;
|
|
110
|
+
return attributes;
|
|
111
|
+
}
|
|
83
112
|
/** The `<head>` tags of a page, in the order the PHP `Seo::toHtml()` prints them. */
|
|
84
113
|
function cmsHeadTags(seo) {
|
|
85
114
|
if (!seo) return {
|
|
@@ -133,6 +162,6 @@ function cmsPayload(props) {
|
|
|
133
162
|
return typeof cms === "object" && cms !== null && "page" in cms ? cms : null;
|
|
134
163
|
}
|
|
135
164
|
//#endregion
|
|
136
|
-
export { CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, cmsAspectClass, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsWidthClass, createCmsTranslator };
|
|
165
|
+
export { CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, cmsAspectClass, cmsBlockAttributes, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsDesignCss, cmsDesignLinks, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsWidthClass, createCmsTranslator };
|
|
137
166
|
|
|
138
167
|
//# sourceMappingURL=cms.js.map
|
package/dist/cms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cms.js","names":[],"sources":["../src/cms.ts"],"sourcesContent":["import { Translator } from './i18n'\nimport type { CmsAspectRatio, CmsBlockSchema, CmsPayload, CmsSeoSchema } from './schema/cms'\n\n/**\n * The framework-agnostic half of the CMS renderers (alfasix/alfakit-cms): registry keys,\n * the Tailwind classes block layouts pick from (spelled out so Tailwind generates them),\n * the head tags of a page and the translator of its strings.\n */\n\n/** The Inertia page component public CMS pages render (`CmsPlugin::inertiaComponent()`). */\nexport const CMS_PAGE_COMPONENT = 'Alfakit/CmsPage'\n\n/** Registry keys: `cms:block:{type}` replaces or adds a block renderer. */\nexport const CMS_BLOCK_PREFIX = 'cms:block:'\n\n/** Renders the form block's payload (`CmsPlugin::formUsing()`); nothing is shown without one. */\nexport const CMS_FORM_KEY = 'cms:form'\n\n/** Replace the default page header or footer of `CmsPage`. */\nexport const CMS_HEADER_KEY = 'cms:header'\nexport const CMS_FOOTER_KEY = 'cms:footer'\n\n/** The built-in block types every renderer draws. */\nexport const CMS_BUILT_IN_BLOCKS = [\n 'hero',\n 'rich-text',\n 'image',\n 'gallery',\n 'call-to-action',\n 'features',\n 'faq',\n 'testimonials',\n 'embed',\n 'columns',\n 'form',\n 'section',\n] as const\n\nexport function cmsBlockKey(type: string): string {\n return `${CMS_BLOCK_PREFIX}${type}`\n}\n\n/** Blocks that look like rendered blocks (`{ type, id, data }`), others dropped. */\nexport function cmsBlocks(blocks: unknown): CmsBlockSchema[] {\n if (!Array.isArray(blocks)) return []\n\n return blocks.filter(\n (block): block is CmsBlockSchema =>\n typeof block === 'object' &&\n block !== null &&\n typeof (block as CmsBlockSchema).type === 'string' &&\n typeof (block as CmsBlockSchema).id === 'string' &&\n typeof (block as CmsBlockSchema).data === 'object' &&\n (block as CmsBlockSchema).data !== null,\n )\n}\n\nconst GRID_COLUMNS: Record<number, string> = {\n 1: 'grid grid-cols-1 gap-6',\n 2: 'grid grid-cols-1 gap-6 sm:grid-cols-2',\n 3: 'grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/** A responsive grid of 1 to 4 columns (one column on phones). */\nexport function cmsGridClass(columns: number): string {\n return GRID_COLUMNS[Math.min(4, Math.max(1, Math.round(columns)))] ?? GRID_COLUMNS[3]!\n}\n\nconst COLUMNS_LAYOUT: Record<number, string> = {\n 2: 'grid grid-cols-1 gap-8 md:grid-cols-2',\n 3: 'grid grid-cols-1 gap-8 md:grid-cols-3',\n 4: 'grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4',\n}\n\n/** The columns block layout (stacked below `md`). */\nexport function cmsColumnsClass(count: number): string {\n return COLUMNS_LAYOUT[Math.min(4, Math.max(2, Math.round(count)))] ?? COLUMNS_LAYOUT[2]!\n}\n\nconst ASPECT: Record<CmsAspectRatio, string> = {\n '16/9': 'aspect-video',\n '4/3': 'aspect-[4/3]',\n '1/1': 'aspect-square',\n '21/9': 'aspect-[21/9]',\n '9/16': 'aspect-[9/16] max-w-sm mx-auto',\n}\n\nexport function cmsAspectClass(ratio: string | null | undefined): string {\n return ASPECT[ratio as CmsAspectRatio] ?? ASPECT['16/9']\n}\n\nconst WIDTH: Record<string, string> = {\n prose: 'mx-auto max-w-3xl',\n contained: 'mx-auto max-w-4xl',\n wide: 'mx-auto max-w-6xl',\n full: 'w-full',\n}\n\n/** The content width of a block (`prose`, `contained`, `wide`, `full`). */\nexport function cmsWidthClass(width: string | null | undefined): string {\n return WIDTH[width ?? 'prose'] ?? WIDTH.prose!\n}\n\n/** The `rel` of a link: new-tab links never get a handle on this window. */\nexport function cmsLinkRel(newTab: boolean): string | undefined {\n return newTab ? 'noopener noreferrer' : undefined\n}\n\nexport interface CmsMetaTag {\n name?: string\n property?: string\n content: string\n}\n\nexport interface CmsLinkTag {\n rel: string\n href: string\n hreflang?: string\n}\n\nexport interface CmsHeadTags {\n title: string\n meta: CmsMetaTag[]\n links: CmsLinkTag[]\n /** Pre-encoded JSON-LD (no `<` in it), for a `<script type=\"application/ld+json\">`. */\n jsonLd: string | null\n}\n\n/** The `<head>` tags of a page, in the order the PHP `Seo::toHtml()` prints them. */\nexport function cmsHeadTags(seo: CmsSeoSchema | null | undefined): CmsHeadTags {\n if (!seo) return { title: '', meta: [], links: [], jsonLd: null }\n\n const meta: CmsMetaTag[] = []\n\n if (seo.description) meta.push({ name: 'description', content: seo.description })\n if (seo.robots) meta.push({ name: 'robots', content: seo.robots })\n\n for (const [property, content] of Object.entries(seo.openGraph ?? {})) {\n if (typeof content === 'string' && content !== '') {\n meta.push({\n property: `og:${property.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)}`,\n content,\n })\n }\n }\n\n for (const [name, content] of Object.entries(seo.twitter ?? {})) {\n if (typeof content === 'string' && content !== '') {\n meta.push({ name: `twitter:${name}`, content })\n }\n }\n\n const links: CmsLinkTag[] = []\n\n if (seo.canonical) links.push({ rel: 'canonical', href: seo.canonical })\n\n for (const alternate of seo.alternates ?? []) {\n links.push({ rel: 'alternate', href: alternate.href, hreflang: alternate.hreflang })\n }\n\n // Encoded by the server; checked again so a `<` can never end the script element.\n const jsonLd = typeof seo.jsonLd === 'string' && !seo.jsonLd.includes('<') ? seo.jsonLd : null\n\n return { title: seo.title, meta, links, jsonLd }\n}\n\n/** A translator over the page's `cms.*` strings, for pages rendered outside panels. */\nexport function createCmsTranslator(\n payload: Pick<CmsPayload, 'translations' | 'site'> | null | undefined,\n): Translator {\n return new Translator(payload?.translations ?? {}, payload?.site?.tag ?? 'en')\n}\n\n/** The `cms` prop, when the Inertia page has one. */\nexport function cmsPayload(props: unknown): CmsPayload | null {\n const cms = (props as { cms?: unknown } | null | undefined)?.cms\n\n return typeof cms === 'object' && cms !== null && 'page' in cms ? (cms as CmsPayload) : null\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cms.js","names":[],"sources":["../src/cms.ts"],"sourcesContent":["import { Translator } from './i18n'\nimport type {\n CmsAspectRatio,\n CmsBlockSchema,\n CmsPayload,\n CmsSeoSchema,\n CmsSiteDesign,\n} from './schema/cms'\n\n/**\n * The framework-agnostic half of the CMS renderers (alfasix/alfakit-cms): registry keys,\n * the Tailwind classes block layouts pick from (spelled out so Tailwind generates them),\n * the head tags of a page and the translator of its strings.\n */\n\n/** The Inertia page component public CMS pages render (`CmsPlugin::inertiaComponent()`). */\nexport const CMS_PAGE_COMPONENT = 'Alfakit/CmsPage'\n\n/** Registry keys: `cms:block:{type}` replaces or adds a block renderer. */\nexport const CMS_BLOCK_PREFIX = 'cms:block:'\n\n/** Renders the form block's payload (`CmsPlugin::formUsing()`); nothing is shown without one. */\nexport const CMS_FORM_KEY = 'cms:form'\n\n/** Replace the default page header or footer of `CmsPage`. */\nexport const CMS_HEADER_KEY = 'cms:header'\nexport const CMS_FOOTER_KEY = 'cms:footer'\n\n/** The built-in block types every renderer draws. */\nexport const CMS_BUILT_IN_BLOCKS = [\n 'hero',\n 'rich-text',\n 'image',\n 'gallery',\n 'call-to-action',\n 'features',\n 'faq',\n 'testimonials',\n 'embed',\n 'columns',\n 'form',\n 'section',\n] as const\n\nexport function cmsBlockKey(type: string): string {\n return `${CMS_BLOCK_PREFIX}${type}`\n}\n\n/** Blocks that look like rendered blocks (`{ type, id, data }`), others dropped. */\nexport function cmsBlocks(blocks: unknown): CmsBlockSchema[] {\n if (!Array.isArray(blocks)) return []\n\n return blocks.filter(\n (block): block is CmsBlockSchema =>\n typeof block === 'object' &&\n block !== null &&\n typeof (block as CmsBlockSchema).type === 'string' &&\n typeof (block as CmsBlockSchema).id === 'string' &&\n typeof (block as CmsBlockSchema).data === 'object' &&\n (block as CmsBlockSchema).data !== null,\n )\n}\n\nconst GRID_COLUMNS: Record<number, string> = {\n 1: 'grid grid-cols-1 gap-6',\n 2: 'grid grid-cols-1 gap-6 sm:grid-cols-2',\n 3: 'grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/** A responsive grid of 1 to 4 columns (one column on phones). */\nexport function cmsGridClass(columns: number): string {\n return GRID_COLUMNS[Math.min(4, Math.max(1, Math.round(columns)))] ?? GRID_COLUMNS[3]!\n}\n\nconst COLUMNS_LAYOUT: Record<number, string> = {\n 2: 'grid grid-cols-1 gap-8 md:grid-cols-2',\n 3: 'grid grid-cols-1 gap-8 md:grid-cols-3',\n 4: 'grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4',\n}\n\n/** The columns block layout (stacked below `md`). */\nexport function cmsColumnsClass(count: number): string {\n return COLUMNS_LAYOUT[Math.min(4, Math.max(2, Math.round(count)))] ?? COLUMNS_LAYOUT[2]!\n}\n\nconst ASPECT: Record<CmsAspectRatio, string> = {\n '16/9': 'aspect-video',\n '4/3': 'aspect-[4/3]',\n '1/1': 'aspect-square',\n '21/9': 'aspect-[21/9]',\n '9/16': 'aspect-[9/16] max-w-sm mx-auto',\n}\n\nexport function cmsAspectClass(ratio: string | null | undefined): string {\n return ASPECT[ratio as CmsAspectRatio] ?? ASPECT['16/9']\n}\n\nconst WIDTH: Record<string, string> = {\n prose: 'mx-auto max-w-3xl',\n contained: 'mx-auto max-w-4xl',\n wide: 'mx-auto max-w-6xl',\n full: 'w-full',\n}\n\n/** The content width of a block (`prose`, `contained`, `wide`, `full`). */\nexport function cmsWidthClass(width: string | null | undefined): string {\n return WIDTH[width ?? 'prose'] ?? WIDTH.prose!\n}\n\n/** The `rel` of a link: new-tab links never get a handle on this window. */\nexport function cmsLinkRel(newTab: boolean): string | undefined {\n return newTab ? 'noopener noreferrer' : undefined\n}\n\nexport interface CmsMetaTag {\n name?: string\n property?: string\n content: string\n}\n\nexport interface CmsLinkTag {\n rel: string\n href: string\n hreflang?: string\n}\n\n/** The favicon and font stylesheet of the site design, for `<head>`. */\nexport function cmsDesignLinks(design: CmsSiteDesign | null | undefined): CmsLinkTag[] {\n const links: CmsLinkTag[] = []\n\n if (design?.favicon) links.push({ rel: 'icon', href: design.favicon })\n if (design?.fonts) links.push({ rel: 'stylesheet', href: design.fonts })\n\n return links\n}\n\n/** The design's CSS for a `<style>` element; checked again so it can never close the element. */\nexport function cmsDesignCss(design: CmsSiteDesign | null | undefined): string | null {\n const css = design?.css\n\n return typeof css === 'string' && css !== '' && !css.includes('<') ? css : null\n}\n\n/**\n * The attributes of a block's wrapper (`data-slot=\"cms-block\"`): its `id` (the anchor\n * from **Style**, else the block id) and the `data-cms-*` hooks `themes.css` styles.\n */\nexport function cmsBlockAttributes(block: CmsBlockSchema): Record<string, string> {\n const attributes: Record<string, string> = { id: block.style?.anchor ?? block.id }\n\n if (block.style?.background) attributes['data-cms-background'] = block.style.background\n if (block.style?.spacing) attributes['data-cms-spacing'] = block.style.spacing\n if (block.style?.visibility) attributes['data-cms-visibility'] = block.style.visibility\n\n return attributes\n}\n\nexport interface CmsHeadTags {\n title: string\n meta: CmsMetaTag[]\n links: CmsLinkTag[]\n /** Pre-encoded JSON-LD (no `<` in it), for a `<script type=\"application/ld+json\">`. */\n jsonLd: string | null\n}\n\n/** The `<head>` tags of a page, in the order the PHP `Seo::toHtml()` prints them. */\nexport function cmsHeadTags(seo: CmsSeoSchema | null | undefined): CmsHeadTags {\n if (!seo) return { title: '', meta: [], links: [], jsonLd: null }\n\n const meta: CmsMetaTag[] = []\n\n if (seo.description) meta.push({ name: 'description', content: seo.description })\n if (seo.robots) meta.push({ name: 'robots', content: seo.robots })\n\n for (const [property, content] of Object.entries(seo.openGraph ?? {})) {\n if (typeof content === 'string' && content !== '') {\n meta.push({\n property: `og:${property.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`)}`,\n content,\n })\n }\n }\n\n for (const [name, content] of Object.entries(seo.twitter ?? {})) {\n if (typeof content === 'string' && content !== '') {\n meta.push({ name: `twitter:${name}`, content })\n }\n }\n\n const links: CmsLinkTag[] = []\n\n if (seo.canonical) links.push({ rel: 'canonical', href: seo.canonical })\n\n for (const alternate of seo.alternates ?? []) {\n links.push({ rel: 'alternate', href: alternate.href, hreflang: alternate.hreflang })\n }\n\n // Encoded by the server; checked again so a `<` can never end the script element.\n const jsonLd = typeof seo.jsonLd === 'string' && !seo.jsonLd.includes('<') ? seo.jsonLd : null\n\n return { title: seo.title, meta, links, jsonLd }\n}\n\n/** A translator over the page's `cms.*` strings, for pages rendered outside panels. */\nexport function createCmsTranslator(\n payload: Pick<CmsPayload, 'translations' | 'site'> | null | undefined,\n): Translator {\n return new Translator(payload?.translations ?? {}, payload?.site?.tag ?? 'en')\n}\n\n/** The `cms` prop, when the Inertia page has one. */\nexport function cmsPayload(props: unknown): CmsPayload | null {\n const cms = (props as { cms?: unknown } | null | undefined)?.cms\n\n return typeof cms === 'object' && cms !== null && 'page' in cms ? (cms as CmsPayload) : null\n}\n"],"mappings":"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"}
|
package/dist/form.d.ts
CHANGED
|
@@ -182,9 +182,18 @@ export declare class FormStore {
|
|
|
182
182
|
* sends the state the server computed (`$set` in `afterStateUpdated`), not the one before.
|
|
183
183
|
*/
|
|
184
184
|
settle(): Promise<void>;
|
|
185
|
+
/**
|
|
186
|
+
* Register an upload of one of the form's fields (FileUpload, RichEditor attachments)
|
|
187
|
+
* while it runs: `settle()` and `whenSettled()`, and so every submit, wait for it.
|
|
188
|
+
* Returns the same promise; a failed upload stops counting as pending.
|
|
189
|
+
*/
|
|
190
|
+
trackUpload<T>(upload: Promise<T>): Promise<T>;
|
|
191
|
+
/** Whether an upload registered with `trackUpload()` is still running. */
|
|
192
|
+
get hasPendingUploads(): boolean;
|
|
193
|
+
private readonly uploadsInFlight;
|
|
185
194
|
/**
|
|
186
195
|
* Run `callback` once the form is settled (see `settle()`): straight away when no live
|
|
187
|
-
* refresh is waiting or in flight, so a submit stays synchronous in the usual case.
|
|
196
|
+
* refresh or upload is waiting or in flight, so a submit stays synchronous in the usual case.
|
|
188
197
|
*/
|
|
189
198
|
whenSettled(callback: () => void): void;
|
|
190
199
|
private refreshInFlight;
|
package/dist/form.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","names":[],"sources":["../src/form.ts"],"mappings":";;;;;;;;iBAsBiB;EACf,YAAY;EACZ,QAAQ;EACR,QAAQ;;EAER,OAAO;;EAEP;EACA;EACA,SAAS;;iBAGM;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;EAKA,eAAe;EACf,WAAW;;EAEX,mBAAmB,eAAe;;EAElC,eAAe;;;;;EAKf;;;wBAIc,aAAa;;wBAKb,WAAW,gBAAgB;;;;wBAO3B,cACd,YAAY,mBACZ,OAAM,gBACL;;;;;;;;wBA2Ba,gBACd,YAAY,mBACZ,cACA,SAAQ,0BACP;;;;;;wBAmEa,mBACd,OAAO,mBACP,gBAAgB,yBAChB,QAAQ;;;;;;wBAkBM,mBACd,WAAW,KAAK,2DAChB,QAAQ;;;;;wBAkBM,cAAc,KAAK,KAAK;;;;;wBAQxB,aACd,MAAM,MAAM,KAAK,mCACjB;;;;;wBAcc,YACd,MAAM,MAAM,KAAK,oEACjB,mBACA,gBAAgB,yBAChB,QAAQ;;;;;;;wBA4BM,WACd,QAAQ,SAAS,gDACjB;;;;;qBAiBW;UAyBD;WAxBM,OAAO,MAAM;mBAEZ;UAET;;;;;UAMA;;;;;;UAOA;;UAGA;EAGN,YAAA,SAAS,aACD,SAAS;MAkBf,SAAS;;;;;EAQb,SAAS;;MAKL;;MAKA;MAIA;MAIA;MAIA;MAIA;;MAKA,uBAAuB;;EAK3B,kBAAkB;;;;;;EAiBlB,gBAAgB;EAahB,UAAU,WAAW,OAAO;EAM5B,SAAS,aAAa,cAAc,WAAW,IAAI;;;;;EAQnD,SAAS,cAAc,gBAAgB;IAAW;;;EAoClD,KAAK;;;;;;UAaG;;EAmBR,KAAK,SAAS,aAAa;IAAW;;EAYtC,UAAU,QAAQ;EAUlB;EAIA,SAAS;EAIT,cAAc;MAIV;EAIJ,UAAU,eAAe;UAMjB;;;;;EAiBR,QAAQ,gBAAgB;;;;;;EAgBlB,UAAU;;;;;
|
|
1
|
+
{"version":3,"file":"form.d.ts","names":[],"sources":["../src/form.ts"],"mappings":";;;;;;;;iBAsBiB;EACf,YAAY;EACZ,QAAQ;EACR,QAAQ;;EAER,OAAO;;EAEP;EACA;EACA,SAAS;;iBAGM;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;EAKA,eAAe;EACf,WAAW;;EAEX,mBAAmB,eAAe;;EAElC,eAAe;;;;;EAKf;;;wBAIc,aAAa;;wBAKb,WAAW,gBAAgB;;;;wBAO3B,cACd,YAAY,mBACZ,OAAM,gBACL;;;;;;;;wBA2Ba,gBACd,YAAY,mBACZ,cACA,SAAQ,0BACP;;;;;;wBAmEa,mBACd,OAAO,mBACP,gBAAgB,yBAChB,QAAQ;;;;;;wBAkBM,mBACd,WAAW,KAAK,2DAChB,QAAQ;;;;;wBAkBM,cAAc,KAAK,KAAK;;;;;wBAQxB,aACd,MAAM,MAAM,KAAK,mCACjB;;;;;wBAcc,YACd,MAAM,MAAM,KAAK,oEACjB,mBACA,gBAAgB,yBAChB,QAAQ;;;;;;;wBA4BM,WACd,QAAQ,SAAS,gDACjB;;;;;qBAiBW;UAyBD;WAxBM,OAAO,MAAM;mBAEZ;UAET;;;;;UAMA;;;;;;UAOA;;UAGA;EAGN,YAAA,SAAS,aACD,SAAS;MAkBf,SAAS;;;;;EAQb,SAAS;;MAKL;;MAKA;MAIA;MAIA;MAIA;MAIA;;MAKA,uBAAuB;;EAK3B,kBAAkB;;;;;;EAiBlB,gBAAgB;EAahB,UAAU,WAAW,OAAO;EAM5B,SAAS,aAAa,cAAc,WAAW,IAAI;;;;;EAQnD,SAAS,cAAc,gBAAgB;IAAW;;;EAoClD,KAAK;;;;;;UAaG;;EAmBR,KAAK,SAAS,aAAa;IAAW;;EAYtC,UAAU,QAAQ;EAUlB;EAIA,SAAS;EAIT,cAAc;MAIV;EAIJ,UAAU,eAAe;UAMjB;;;;;EAiBR,QAAQ,gBAAgB;;;;;;EAgBlB,UAAU;;;;;;EAsBhB,YAAY,GAAG,QAAQ,QAAQ,KAAK,QAAQ;;MAaxC;mBAIa;;;;;EAMjB,YAAY;UAYJ;UAEM;;;;;;;EAoEd,cACE,UAAU,uBACV,MAAM,yBACN,QAAO;;;;;;EAqCH,aAAa,iBAAiB,uBAAuB;;EA8CrD,cACJ,cACA,iBACC,QAAQ;IAAQ;IAAe;;EAe5B,aACJ,cACA,QAAQ,yBACP,QAAQ;;EAgBL,YACJ,cACA;IAAS;IAAiB;IAAqB;KAC/C,SAAS,cACR,QAAQ;;;;;EAqBL,WACJ,cACA,oBACA,OAAO,YACP,SAAS,cACR,QAAQ;EAgBX;;;;;;;;wBAkCc,aACd;EAAQ;EAAgB;sBACxB;EAAS;EAAa;EAAmB;;;iBAY1B;EACf;EACA,KAAK;EACL;EACA;EACA;;;;;;;;wBASc,eAAe,OAAO,cAAc;iBAuBnC;EACf;EACA,OAAO;;;wBAIO,mBACd,kBACA,eAAe;wBAKD,mBAAmB,kBAAkB;wBAIrC,iBAAiB,kBAAkB,cAAc;wBAYjD,kBAAkB,kBAAkB;;;;;YAWxC,aAAa,KAAK,eAAe;wBAiB7B,iBAAiB,GAC/B,OAAO,aAAa,IACpB,cACA,aACC,aAAa;wBAYA,mBAAmB,GAAG,OAAO,aAAa,IAAI,kBAAkB,aAAa;wBAM7E,kBAAkB,GAAG,OAAO,aAAa,IAAI,iBAAiB,aAAa"}
|
package/dist/form.js
CHANGED
|
@@ -337,15 +337,37 @@ var FormStore = class {
|
|
|
337
337
|
* sends the state the server computed (`$set` in `afterStateUpdated`), not the one before.
|
|
338
338
|
*/
|
|
339
339
|
async settle() {
|
|
340
|
-
for (
|
|
341
|
-
|
|
340
|
+
for (;;) {
|
|
341
|
+
for (const debounced of this.liveDebouncers.values()) debounced.flush();
|
|
342
|
+
if (this.refreshInFlight) await this.refreshInFlight.catch(() => void 0);
|
|
343
|
+
else if (this.uploadsInFlight.size > 0) await Promise.allSettled([...this.uploadsInFlight]);
|
|
344
|
+
else return;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Register an upload of one of the form's fields (FileUpload, RichEditor attachments)
|
|
349
|
+
* while it runs: `settle()` and `whenSettled()`, and so every submit, wait for it.
|
|
350
|
+
* Returns the same promise; a failed upload stops counting as pending.
|
|
351
|
+
*/
|
|
352
|
+
trackUpload(upload) {
|
|
353
|
+
this.uploadsInFlight.add(upload);
|
|
354
|
+
const forget = () => {
|
|
355
|
+
this.uploadsInFlight.delete(upload);
|
|
356
|
+
};
|
|
357
|
+
upload.then(forget, forget);
|
|
358
|
+
return upload;
|
|
359
|
+
}
|
|
360
|
+
/** Whether an upload registered with `trackUpload()` is still running. */
|
|
361
|
+
get hasPendingUploads() {
|
|
362
|
+
return this.uploadsInFlight.size > 0;
|
|
342
363
|
}
|
|
364
|
+
uploadsInFlight = /* @__PURE__ */ new Set();
|
|
343
365
|
/**
|
|
344
366
|
* Run `callback` once the form is settled (see `settle()`): straight away when no live
|
|
345
|
-
* refresh is waiting or in flight, so a submit stays synchronous in the usual case.
|
|
367
|
+
* refresh or upload is waiting or in flight, so a submit stays synchronous in the usual case.
|
|
346
368
|
*/
|
|
347
369
|
whenSettled(callback) {
|
|
348
|
-
if (![...this.liveDebouncers.values()].some((debounced) => debounced.pending) && !this.refreshInFlight) {
|
|
370
|
+
if (![...this.liveDebouncers.values()].some((debounced) => debounced.pending) && !this.refreshInFlight && this.uploadsInFlight.size === 0) {
|
|
349
371
|
callback();
|
|
350
372
|
return;
|
|
351
373
|
}
|
package/dist/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","names":[],"sources":["../src/form.ts"],"sourcesContent":["import { modalTableQuery } from './advanced-fields'\nimport { debugRecorder } from './debug'\nimport { reportRequestError } from './error-notifications'\nimport { HttpError, requestJson } from './http'\nimport { currentPageQuery } from './page-query'\nimport { mergeRefreshResponse } from './partial'\nimport type { ModalTableSelectResponse } from './schema/advanced-fields'\nimport type { FieldSchema, SchemaComponent, TabSchema } from './schema/components'\nimport { isField } from './schema/components'\nimport type {\n FormPayload,\n SchemaRefreshResponse,\n StepValidationHaltedResponse,\n} from './schema/form'\nimport type { IconPickerResponse } from './schema/icon-picker'\nimport type { NotificationSchema } from './schema/notifications'\nimport { createStore, type Store } from './store'\nimport type { TableQuery } from './table'\nimport { cloneState } from './utils/clone'\nimport { debounce, type Debounced } from './utils/debounce'\nimport { getPath, setPath } from './utils/path'\n\nexport interface FormState {\n components: SchemaComponent[]\n values: Record<string, unknown>\n errors: Record<string, string[]>\n /** State paths that changed since the last fill. */\n dirty: Set<string>\n /** True while a live refresh or submit is in flight. */\n processing: boolean\n refreshing: boolean\n columns: FormPayload['columns']\n}\n\nexport interface FormStoreOptions {\n /** Encrypted page context token. */\n token: string\n /** Context component name (`form`, `action:table.edit`, …). */\n component: string\n /** Record key when the schema belongs to a table action. */\n record?: string | number | null\n /** URL of the schema refresh endpoint. */\n refreshUrl?: string\n /** URL of the select options endpoint. */\n optionsUrl?: string\n /** URL of the step validation endpoint (wizards validate each step on \"Next\"). */\n validateUrl?: string\n /**\n * Extra parameters for every request (refresh, options). The modal form of a field\n * action sends its owning form's state (`ownerState`) so the server can find the field.\n */\n params?: () => Record<string, unknown>\n onError?: (error: unknown) => void\n /** Shows notifications the server sent with a JSON answer (a halted wizard step). */\n onNotifications?: (notifications: NotificationSchema[]) => void\n /** Called after a live refresh was merged (e.g. to reload what depends on the form). */\n onRefreshed?: (path: string | undefined) => void\n /**\n * Prefix of the fields' DOM ids (`{idPrefix}-{statePath}`), default `alfakit`. Forms shown\n * over another form (action modals) use their own, so ids never repeat on the page.\n */\n idPrefix?: string\n}\n\n/** A DOM-safe id prefix for a form, e.g. `action:field.category_id.createOption` -> `alfakit-action-field-category_id-createOption`. */\nexport function formIdPrefix(scope: string): string {\n return `alfakit-${scope.replace(/[^a-zA-Z0-9_-]/g, '-')}`\n}\n\n/** The DOM id of a field: `{prefix}-{statePath}` with unsafe characters replaced. */\nexport function fieldDomId(prefix: string, statePath: string): string {\n return `${prefix}-${statePath.replace(/[^a-zA-Z0-9_-]/g, '-')}`\n}\n\n/**\n * Walk a component tree and collect every field (including those inside Repeater items).\n */\nexport function collectFields(\n components: SchemaComponent[],\n into: FieldSchema[] = [],\n): FieldSchema[] {\n for (const component of components) {\n if (isField(component)) {\n into.push(component)\n\n if (component.type === 'Repeater' || component.type === 'Builder') {\n for (const item of component.items) {\n collectFields(item.schema, into)\n }\n }\n }\n\n if (component.schema) {\n collectFields(component.schema, into)\n }\n }\n\n return into\n}\n\n/**\n * The field at `path`. Items the browser added (or cloned) before the server has seen\n * them have no per-item schema yet: their fields are found in the Repeater's `template`\n * (or the Builder block's schema, preferring the block named by the item's `type` in\n * `values`), whose `__INDEX__` placeholders stand for any item index, so `live()` fields\n * of fresh items refresh like any other.\n */\nexport function findFieldByPath(\n components: SchemaComponent[],\n path: string,\n values: Record<string, unknown> = {},\n): FieldSchema | undefined {\n return (\n collectFields(components).find((field) => field.statePath === path) ??\n findTemplateField(components, path, values)\n )\n}\n\nfunction findTemplateField(\n components: SchemaComponent[],\n path: string,\n values: Record<string, unknown>,\n): FieldSchema | undefined {\n for (const field of collectFields(components)) {\n for (const template of itemTemplates(field, path, values)) {\n const found =\n collectFields(template).find((candidate) =>\n templatePathMatches(candidate.statePath, path),\n ) ?? findTemplateField(template, path, values)\n\n if (found) return found\n }\n }\n\n return undefined\n}\n\n/** The blank item schemas of a Repeater or Builder (the item's own block first). */\nfunction itemTemplates(\n field: FieldSchema,\n path: string,\n values: Record<string, unknown>,\n): SchemaComponent[][] {\n if (field.type === 'Repeater') {\n return [(field as unknown as { template?: SchemaComponent[] }).template ?? []]\n }\n\n if (field.type !== 'Builder') return []\n\n const blocks =\n (field as unknown as { blocks?: Array<{ name: string; schema: SchemaComponent[] }> }).blocks ??\n []\n const item = new RegExp(`^(${templatePathPattern(field.statePath)}\\\\.\\\\d+)\\\\.`).exec(path)\n const type = item ? getPath<unknown>(values, `${item[1]}.type`) : undefined\n\n return [...blocks]\n .sort((a, b) => Number(b.name === type) - Number(a.name === type))\n .map((block) => block.schema)\n}\n\nfunction templatePathPattern(statePath: string): string {\n return statePath\n .split('__INDEX__')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('\\\\d+')\n}\n\nfunction templatePathMatches(statePath: string, path: string): boolean {\n return (\n statePath.includes('__INDEX__') && new RegExp(`^${templatePathPattern(statePath)}$`).test(path)\n )\n}\n\n/**\n * The wizard step to reveal after the errors change: the first step with an error, but\n * only when new error keys arrived (a submit or validation response), so the user can\n * still move between steps while errors are shown.\n */\nexport function wizardStepToReveal(\n steps: SchemaComponent[],\n previousErrors: Record<string, unknown>,\n errors: Record<string, unknown>,\n): number | null {\n if (!Object.keys(errors).some((key) => !(key in previousErrors))) {\n return null\n }\n\n const index = steps.findIndex((step) =>\n collectFields(step.schema ?? []).some((field) => errors[field.statePath]),\n )\n\n return index === -1 ? null : index\n}\n\n/**\n * Whether a layout component (a tab, a section) holds a field with a validation error:\n * one of its fields, a nested repeater/builder item field (`items.0.sku`), or, while the\n * component is deferred and its fields aren't loaded, one of its `deferredPaths`.\n */\nexport function componentHasErrors(\n component: Pick<SchemaComponent, 'schema' | 'deferred' | 'deferredPaths'>,\n errors: Record<string, unknown>,\n): boolean {\n const keys = Object.keys(errors).filter((key) => errors[key])\n\n if (keys.length === 0) return false\n\n const paths =\n component.deferred && !component.schema?.length\n ? (component.deferredPaths ?? [])\n : collectFields(component.schema ?? []).map((field) => field.statePath)\n\n return paths.some((path) => keys.some((key) => key === path || key.startsWith(`${path}.`)))\n}\n\n/**\n * The value a tab is written to the query string as (`persistTabInQueryString()`): its\n * readable `queryValue` (`billing-address`), else its key.\n */\nexport function tabQueryValue(tab: Pick<TabSchema, 'key' | 'queryValue'>): string {\n return tab.queryValue ?? tab.key\n}\n\n/**\n * The key of the tab a query-string value names: a tab's `queryValue`, or its key (links\n * written before tabs had readable values, `?tab=tabs-0.tab-1`). Null when none matches.\n */\nexport function tabFromQuery(\n tabs: Array<Pick<TabSchema, 'key' | 'queryValue'>>,\n value: string | null | undefined,\n): string | null {\n if (!value) return null\n\n return (\n (tabs.find((tab) => tab.queryValue === value) ?? tabs.find((tab) => tab.key === value))?.key ??\n null\n )\n}\n\n/**\n * The tab to show after the errors change: when new error keys arrived (a submit or\n * validation response) and the active tab has none, the first tab with an error.\n */\nexport function tabToReveal(\n tabs: Array<Pick<SchemaComponent, 'key' | 'schema' | 'deferred' | 'deferredPaths'>>,\n activeKey: string,\n previousErrors: Record<string, unknown>,\n errors: Record<string, unknown>,\n): string | null {\n if (!Object.keys(errors).some((key) => !(key in previousErrors))) {\n return null\n }\n\n const active = tabs.find((tab) => tab.key === activeKey)\n\n if (active && componentHasErrors(active, errors)) return null\n\n return tabs.find((tab) => componentHasErrors(tab, errors))?.key ?? null\n}\n\n/** Whether `key` is the error of one item of the list field at `path` (`labels.2`). */\nfunction isItemErrorKey(key: string, path: string): boolean {\n return (\n key.length > path.length + 1 &&\n key.startsWith(`${path}.`) &&\n /^\\d+$/.test(key.slice(path.length + 1))\n )\n}\n\n/**\n * The validation message a field shows: its own, else the first of its items' (`labels.2`\n * for a tag refused by `nestedRecursiveRules()`, `attachments.0` for one upload). Those\n * errors have no field of their own, so without this the form refused to save with no\n * message anywhere. Deeper paths (`items.0.name`) belong to item fields and are left out.\n */\nexport function fieldError(\n errors: Readonly<Record<string, readonly string[] | undefined>>,\n path: string,\n): string | undefined {\n const own = errors[path]?.[0]\n\n if (own) return own\n\n for (const key of Object.keys(errors)) {\n if (isItemErrorKey(key, path) && errors[key]?.[0]) return errors[key][0]\n }\n\n return undefined\n}\n\n/**\n * Framework-agnostic form state: values addressed by `statePath`, validation errors,\n * dirty tracking and server round-trips for `live()` fields.\n */\nexport class FormStore {\n public readonly store: Store<FormState>\n\n private readonly liveDebouncers = new Map<string, Debounced<[]>>()\n\n private refreshController: AbortController | null = null\n\n /**\n * The values as the server last sent them, so a refresh can tell `afterStateUpdated`\n * hooks what the field held before the change (`$old`).\n */\n private serverValues: Record<string, unknown>\n\n /**\n * Paths the user changed while a live refresh was in flight. Only these keep their\n * client value when the response is merged; every other path takes the server's value\n * (including values set by `$set` in `afterStateUpdated` hooks).\n */\n private editsInFlight: Set<string> | null = null\n\n /** The fingerprints of the components the store holds (see `PartialFormPayload`). */\n private fingerprints: Record<string, string> | undefined\n\n constructor(\n payload: FormPayload,\n private options: FormStoreOptions,\n ) {\n this.serverValues = payload.state ?? {}\n this.fingerprints = payload.fingerprints\n this.store = createStore<FormState>({\n components: payload.components,\n values: payload.state ?? {},\n errors: {},\n dirty: new Set(),\n processing: false,\n refreshing: false,\n columns: payload.columns,\n })\n\n // Listed by the developer debug panel while it is enabled; a no-op otherwise.\n debugRecorder.registerForm(this)\n }\n\n get state(): FormState {\n return this.store.get()\n }\n\n /**\n * Swap in a fresher context token (every response re-issues it) without touching the\n * form state, so live refreshes keep working after unrelated reloads.\n */\n setToken(token: string): void {\n this.options = { ...this.options, token }\n }\n\n /** Context component name of the schema (`form`, `action:table.edit`, …). */\n get component(): string {\n return this.options.component\n }\n\n /** Prefix of the fields' DOM ids (see `FormStoreOptions.idPrefix`). */\n get idPrefix(): string {\n return this.options.idPrefix ?? 'alfakit'\n }\n\n get record(): string | number | null {\n return this.options.record ?? null\n }\n\n get token(): string {\n return this.options.token\n }\n\n get optionsUrl(): string | undefined {\n return this.options.optionsUrl\n }\n\n get validateUrl(): string | undefined {\n return this.options.validateUrl\n }\n\n /** The fingerprints of the held components, sent so responses can be partial. */\n get currentFingerprints(): Record<string, string> | undefined {\n return this.fingerprints\n }\n\n /** The parameters that identify this schema to the internal endpoints. */\n requestContext(): Record<string, unknown> {\n return {\n token: this.options.token,\n component: this.options.component,\n record: this.options.record ?? undefined,\n // A record action's modal on a list tab: the server finds the record through the\n // page's tab and filters, as the modal request itself does.\n tableQuery: currentPageQuery(),\n ...this.options.params?.(),\n }\n }\n\n /**\n * `requestContext()` plus the form state for GET requests (options, picker tables,\n * mentions). States travel as JSON: a query string drops nulls and empty arrays, and with\n * them repeater items that are still blank, so the server couldn't find their fields.\n */\n queryContext(): Record<string, unknown> {\n const context = this.requestContext()\n const ownerState = context.ownerState\n\n return {\n ...context,\n ...(ownerState !== null && typeof ownerState === 'object'\n ? { ownerState: JSON.stringify(ownerState) }\n : {}),\n state: JSON.stringify(this.state.values),\n }\n }\n\n subscribe(listener: (state: FormState) => void): () => void {\n return this.store.subscribe(listener)\n }\n\n // ---------------------------------------------------------------- Values\n\n getValue<T = unknown>(path: string, fallback?: T): T {\n return getPath<T>(this.state.values, path, fallback)\n }\n\n /**\n * Set a value. Live fields schedule a server refresh (debounced); `onBlur` fields\n * refresh via `blur()` instead.\n */\n setValue(path: string, value: unknown, options: { silent?: boolean } = {}): void {\n const current = this.getValue(path)\n\n if (Object.is(current, value)) {\n return\n }\n\n this.store.set((state) => {\n const dirty = new Set(state.dirty)\n dirty.add(path)\n\n const errors = { ...state.errors }\n delete errors[path]\n\n // Item errors of a list field (`labels.2` from `nestedRecursiveRules()`) go with it.\n for (const key of Object.keys(errors)) {\n if (isItemErrorKey(key, path)) delete errors[key]\n }\n\n return { ...state, values: setPath(state.values, path, value), dirty, errors }\n })\n\n this.editsInFlight?.add(path)\n\n if (options.silent) {\n return\n }\n\n const target = this.liveTarget(path)\n\n if (target?.field.live && !target.field.live.onBlur) {\n this.scheduleRefresh(target.path, target.field.live.debounce ?? 150)\n }\n }\n\n /** Call when a field loses focus so `live(onBlur: true)` fields refresh. */\n blur(path: string): void {\n const target = this.liveTarget(path)\n\n if (target?.field.live?.onBlur && this.state.dirty.has(path)) {\n void this.refresh(target.path)\n }\n }\n\n /**\n * The field whose `live()` a change at `path` triggers, and the path to refresh: a\n * translatable field's language input (`title.en`) reports its field (`title`), whose\n * `afterStateUpdated()` gets the whole `{ code: value }` state.\n */\n private liveTarget(path: string): { field: FieldSchema; path: string } | undefined {\n const field = this.findField(path)\n\n if (field) return { field, path }\n\n const dot = path.lastIndexOf('.')\n\n if (dot <= 0) return undefined\n\n const parentPath = path.slice(0, dot)\n const parent = this.findField(parentPath)\n const code = path.slice(dot + 1)\n\n return parent?.translatable?.locales.some((locale) => locale.code === code)\n ? { field: parent, path: parentPath }\n : undefined\n }\n\n /** Replace the whole state (e.g. after the server returns a refreshed payload). */\n fill(payload: FormPayload, options: { keepDirty?: boolean } = {}): void {\n this.serverValues = payload.state ?? {}\n this.fingerprints = payload.fingerprints\n this.store.set((state) => ({\n ...state,\n components: payload.components,\n values: payload.state ?? {},\n columns: payload.columns ?? state.columns,\n dirty: options.keepDirty ? state.dirty : new Set(),\n }))\n }\n\n setErrors(errors: Record<string, string[] | string>): void {\n const normalized: Record<string, string[]> = {}\n\n for (const [key, value] of Object.entries(errors)) {\n normalized[key] = Array.isArray(value) ? value : [value]\n }\n\n this.store.update({ errors: normalized })\n }\n\n clearErrors(): void {\n this.store.update({ errors: {} })\n }\n\n getError(path: string): string | undefined {\n return fieldError(this.state.errors, path)\n }\n\n setProcessing(processing: boolean): void {\n this.store.update({ processing })\n }\n\n get isDirty(): boolean {\n return this.state.dirty.size > 0\n }\n\n findField(path: string): FieldSchema | undefined {\n return findFieldByPath(this.state.components, path, this.state.values)\n }\n\n // ---------------------------------------------------------------- Live refresh\n\n private scheduleRefresh(path: string, wait: number): void {\n let debounced = this.liveDebouncers.get(path)\n\n if (!debounced) {\n debounced = debounce(() => {\n void this.refresh(path)\n }, wait)\n this.liveDebouncers.set(path, debounced)\n }\n\n debounced()\n }\n\n /**\n * Send the current state to the server, which re-evaluates closures and\n * `afterStateUpdated` hooks, and replace components + values with the response.\n */\n refresh(path?: string): Promise<void> {\n const request = this.sendRefresh(path)\n this.refreshInFlight = request\n\n void request.finally(() => {\n if (this.refreshInFlight === request) this.refreshInFlight = null\n })\n\n return request\n }\n\n /**\n * Resolves once no live refresh is waiting or in flight: debounced refreshes are sent\n * now and awaited. Submits wait for it, so a click that blurs a `live(onBlur: true)` field\n * sends the state the server computed (`$set` in `afterStateUpdated`), not the one before.\n */\n async settle(): Promise<void> {\n for (const debounced of this.liveDebouncers.values()) debounced.flush()\n\n while (this.refreshInFlight) {\n await this.refreshInFlight.catch(() => undefined)\n }\n }\n\n /**\n * Run `callback` once the form is settled (see `settle()`): straight away when no live\n * refresh is waiting or in flight, so a submit stays synchronous in the usual case.\n */\n whenSettled(callback: () => void): void {\n const waiting = [...this.liveDebouncers.values()].some((debounced) => debounced.pending)\n\n if (!waiting && !this.refreshInFlight) {\n callback()\n\n return\n }\n\n void this.settle().then(callback)\n }\n\n private refreshInFlight: Promise<void> | null = null\n\n private async sendRefresh(path?: string): Promise<void> {\n if (!this.options.refreshUrl) {\n return\n }\n\n this.refreshController?.abort()\n const controller = new AbortController()\n this.refreshController = controller\n // The request carries the current state, so only edits made from now on are newer\n // than what the server sees.\n const edits = new Set<string>()\n this.editsInFlight = edits\n\n this.store.update({ refreshing: true })\n const sent = this.state.values\n\n try {\n const response = await requestJson<SchemaRefreshResponse>(this.options.refreshUrl, {\n method: 'POST',\n body: {\n ...this.requestContext(),\n state: sent,\n path,\n old: path ? (getPath(this.serverValues, path) ?? null) : undefined,\n // With fingerprints the server answers with only what changed.\n fingerprints: this.fingerprints,\n },\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) {\n return\n }\n\n if (this.editsInFlight === edits) {\n this.editsInFlight = null\n }\n\n if (!this.applyResponse(response, sent, edits)) {\n // The patches didn't fit the tree: ask for the whole form instead.\n this.fingerprints = undefined\n await this.sendRefresh(path)\n\n return\n }\n\n this.options.onRefreshed?.(path)\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return\n }\n\n if (this.editsInFlight === edits) {\n this.editsInFlight = null\n }\n\n this.store.update({ refreshing: false })\n // Without an `onError`, the panel's error notification for the status is shown.\n ;(this.options.onError ?? reportRequestError)(error)\n }\n }\n\n /**\n * Merge a refresh response (full or partial) for the state `sent` with the request.\n * Paths in `edits` changed while the request was in flight and keep their client value;\n * everything else takes the server's (including values set by `$set`). Returns false\n * when a partial response doesn't fit the tree the store holds.\n */\n applyResponse(\n response: SchemaRefreshResponse,\n sent: Record<string, unknown>,\n edits: Iterable<string> = [],\n ): boolean {\n const merged = mergeRefreshResponse(this.state.components, sent, response)\n\n if (!merged) {\n this.store.update({ refreshing: false })\n\n return false\n }\n\n this.serverValues = merged.values\n this.fingerprints = merged.fingerprints\n\n this.store.set((state) => {\n let values = merged.values\n\n for (const editedPath of edits) {\n values = setPath(values, editedPath, getPath(state.values, editedPath))\n }\n\n return {\n ...state,\n components: merged.components,\n values,\n columns: merged.columns ?? state.columns,\n refreshing: false,\n }\n })\n\n return true\n }\n\n /**\n * Validate the fields of one wizard step (by the Step component's `key`) on the server.\n * Resolves with true when they pass; otherwise the step's errors replace the errors of\n * those fields and false is returned. Without a validation endpoint every step passes.\n */\n async validateStep(stepKey: string, fieldPaths: string[]): Promise<boolean> {\n if (!this.options.validateUrl) {\n return true\n }\n\n try {\n const response = await requestJson<StepValidationHaltedResponse | null>(\n this.options.validateUrl,\n {\n method: 'POST',\n body: {\n ...this.requestContext(),\n state: this.state.values,\n step: stepKey,\n },\n },\n )\n\n // A step hook halted: stay on the step, keep the field errors as they are.\n if (response !== null && typeof response === 'object' && response.halted) {\n const notifications = response.notifications ?? []\n\n if (notifications.length > 0) this.options.onNotifications?.(notifications)\n\n return false\n }\n } catch (error) {\n if (error instanceof HttpError && error.status === 422) {\n this.store.update({\n errors: { ...withoutStepErrors(this.state.errors, fieldPaths), ...error.errors },\n })\n\n return false\n }\n\n ;(this.options.onError ?? reportRequestError)(error)\n\n return false\n }\n\n this.store.update({ errors: withoutStepErrors(this.state.errors, fieldPaths) })\n\n return true\n }\n\n /** Search options for a searchable select at `path`. */\n async searchOptions(\n path: string,\n search: string,\n ): Promise<Array<{ value: string; label: string }>> {\n if (!this.options.optionsUrl) {\n return []\n }\n\n const response = await requestJson<{ options?: Array<{ value: string; label: string }> }>(\n this.options.optionsUrl,\n {\n query: { ...this.queryContext(), path, search },\n },\n )\n\n return response.options ?? []\n }\n\n async optionLabels(\n path: string,\n values: Array<string | number>,\n ): Promise<Record<string, string>> {\n if (!this.options.optionsUrl || values.length === 0) {\n return {}\n }\n\n const response = await requestJson<{ labels?: Record<string, string> }>(\n this.options.optionsUrl,\n {\n query: { ...this.queryContext(), path, values },\n },\n )\n\n return response.labels ?? {}\n }\n\n /** One page of icons for the IconPicker at `path` (`set`: one of its sets, or all). */\n async searchIcons(\n path: string,\n query: { search?: string; set?: string | null; page?: number },\n signal?: AbortSignal,\n ): Promise<IconPickerResponse | null> {\n if (!this.options.optionsUrl) {\n return null\n }\n\n return requestJson<IconPickerResponse>(this.options.optionsUrl, {\n query: {\n ...this.queryContext(),\n path,\n search: query.search ?? '',\n ...(query.set ? { set: query.set } : {}),\n page: query.page ?? 1,\n },\n signal,\n })\n }\n\n /**\n * The picker table of a ModalTableSelect at `path` (`query` is its table state) and the\n * labels of the records it lists.\n */\n async modalTable(\n path: string,\n identifier: string,\n query: TableQuery,\n signal?: AbortSignal,\n ): Promise<ModalTableSelectResponse | null> {\n if (!this.options.optionsUrl) {\n return null\n }\n\n return requestJson<ModalTableSelectResponse>(this.options.optionsUrl, {\n query: {\n ...this.queryContext(),\n path,\n table: 1,\n ...modalTableQuery(identifier, query),\n },\n signal,\n })\n }\n\n destroy(): void {\n debugRecorder.unregisterForm(this)\n this.refreshController?.abort()\n\n for (const debounced of this.liveDebouncers.values()) {\n debounced.cancel()\n }\n\n this.liveDebouncers.clear()\n }\n}\n\n/** The errors without those of the given fields (and of their nested paths). */\nfunction withoutStepErrors(\n errors: Record<string, string[]>,\n fieldPaths: string[],\n): Record<string, string[]> {\n const kept: Record<string, string[]> = {}\n\n for (const [key, messages] of Object.entries(errors)) {\n if (!fieldPaths.some((path) => key === path || key.startsWith(`${path}.`))) {\n kept[key] = messages\n }\n }\n\n return kept\n}\n\n/**\n * A stable key for a page form: the page class, record and the form's own key/component.\n * The context token is re-encrypted on every response, so it cannot identify a form.\n * Renderers re-initialise a FormStore from server state only when this key changes (or\n * after the form's own successful submit), never on unrelated reloads of the same page.\n */\nexport function formIdentity(\n page: { class?: string; record?: string | number | null } | null | undefined,\n block: { key: string; component: string; operation?: string | null },\n): string {\n return JSON.stringify([\n page?.class ?? null,\n page?.record ?? null,\n block.key,\n block.component,\n block.operation ?? null,\n ])\n}\n\n/** The parts of an Inertia visit the unsaved-changes guard needs. */\nexport interface GuardedVisit {\n method: string\n url: URL | string\n only?: string[]\n except?: string[]\n preserveState?: unknown\n}\n\n/**\n * True when an Inertia visit would navigate away from the current form, i.e. when the\n * unsaved-changes guard should ask. Partial reloads (`only`/`except`, used by table\n * sorting, paging and polling) and state-preserving visits to the same path stay on the\n * page and keep the form, so they never prompt. Non-GET visits are submissions.\n */\nexport function isLeavingVisit(visit: GuardedVisit, currentUrl?: string): boolean {\n if (visit.method.toLowerCase() !== 'get') {\n return false\n }\n\n if ((visit.only?.length ?? 0) > 0 || (visit.except?.length ?? 0) > 0) {\n return false\n }\n\n const base =\n currentUrl ?? (typeof window !== 'undefined' ? window.location.href : 'http://localhost/')\n const here = new URL(base)\n const target = new URL(String(visit.url), here)\n\n return !(\n visit.preserveState === true &&\n target.origin === here.origin &&\n target.pathname === here.pathname\n )\n}\n\n// ---------------------------------------------------------------- Repeater helpers\n\nexport interface RepeaterItemState {\n key: string\n state: Record<string, unknown>\n}\n\n/** Append a blank item using the Repeater's template state. */\nexport function appendRepeaterItem(\n items: unknown[],\n templateState: Record<string, unknown>,\n): unknown[] {\n return [...items, cloneState(templateState)]\n}\n\nexport function removeRepeaterItem(items: unknown[], index: number): unknown[] {\n return items.filter((_, i) => i !== index)\n}\n\nexport function moveRepeaterItem(items: unknown[], from: number, to: number): unknown[] {\n if (from === to || from < 0 || to < 0 || from >= items.length || to >= items.length) {\n return items\n }\n\n const copy = [...items]\n const [item] = copy.splice(from, 1)\n copy.splice(to, 0, item)\n\n return copy\n}\n\nexport function cloneRepeaterItem(items: unknown[], index: number): unknown[] {\n const copy = [...items]\n copy.splice(index + 1, 0, cloneState(items[index]))\n\n return copy\n}\n\n/**\n * Per-item UI state (collapsed flags, …) keyed by item index, remapped after the items\n * are reordered, removed or cloned with the helpers above so it stays with its item.\n */\nexport type IndexedState<T> = Record<number, T>\n\nfunction remapIndexedState<T>(\n state: IndexedState<T>,\n newIndex: (index: number) => number | null,\n): IndexedState<T> {\n const result: IndexedState<T> = {}\n\n for (const [key, value] of Object.entries(state) as [string, T][]) {\n const index = newIndex(Number(key))\n\n if (index !== null) result[index] = value\n }\n\n return result\n}\n\nexport function moveIndexedState<T>(\n state: IndexedState<T>,\n from: number,\n to: number,\n): IndexedState<T> {\n if (from === to) return state\n\n return remapIndexedState(state, (index) => {\n if (index === from) return to\n if (from < to && index > from && index <= to) return index - 1\n if (from > to && index >= to && index < from) return index + 1\n\n return index\n })\n}\n\nexport function removeIndexedState<T>(state: IndexedState<T>, removed: number): IndexedState<T> {\n return remapIndexedState(state, (index) =>\n index === removed ? null : index > removed ? index - 1 : index,\n )\n}\n\nexport function cloneIndexedState<T>(state: IndexedState<T>, cloned: number): IndexedState<T> {\n const result = remapIndexedState(state, (index) => (index > cloned ? index + 1 : index))\n\n if (cloned in state) result[cloned + 1] = state[cloned] as T\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;;AAiEA,SAAgB,aAAa,OAAuB;CAClD,OAAO,WAAW,MAAM,QAAQ,mBAAmB,GAAG;AACxD;;AAGA,SAAgB,WAAW,QAAgB,WAA2B;CACpE,OAAO,GAAG,OAAO,GAAG,UAAU,QAAQ,mBAAmB,GAAG;AAC9D;;;;AAKA,SAAgB,cACd,YACA,OAAsB,CAAC,GACR;CACf,KAAK,MAAM,aAAa,YAAY;EAClC,IAAI,QAAQ,SAAS,GAAG;GACtB,KAAK,KAAK,SAAS;GAEnB,IAAI,UAAU,SAAS,cAAc,UAAU,SAAS,WACtD,KAAK,MAAM,QAAQ,UAAU,OAC3B,cAAc,KAAK,QAAQ,IAAI;EAGrC;EAEA,IAAI,UAAU,QACZ,cAAc,UAAU,QAAQ,IAAI;CAExC;CAEA,OAAO;AACT;;;;;;;;AASA,SAAgB,gBACd,YACA,MACA,SAAkC,CAAC,GACV;CACzB,OACE,cAAc,UAAU,CAAC,CAAC,MAAM,UAAU,MAAM,cAAc,IAAI,KAClE,kBAAkB,YAAY,MAAM,MAAM;AAE9C;AAEA,SAAS,kBACP,YACA,MACA,QACyB;CACzB,KAAK,MAAM,SAAS,cAAc,UAAU,GAC1C,KAAK,MAAM,YAAY,cAAc,OAAO,MAAM,MAAM,GAAG;EACzD,MAAM,QACJ,cAAc,QAAQ,CAAC,CAAC,MAAM,cAC5B,oBAAoB,UAAU,WAAW,IAAI,CAC/C,KAAK,kBAAkB,UAAU,MAAM,MAAM;EAE/C,IAAI,OAAO,OAAO;CACpB;AAIJ;;AAGA,SAAS,cACP,OACA,MACA,QACqB;CACrB,IAAI,MAAM,SAAS,YACjB,OAAO,CAAE,MAAsD,YAAY,CAAC,CAAC;CAG/E,IAAI,MAAM,SAAS,WAAW,OAAO,CAAC;CAEtC,MAAM,SACH,MAAqF,UACtF,CAAC;CACH,MAAM,OAAO,IAAI,OAAO,KAAK,oBAAoB,MAAM,SAAS,EAAE,YAAY,CAAC,CAAC,KAAK,IAAI;CACzF,MAAM,OAAO,OAAO,QAAiB,QAAQ,GAAG,KAAK,GAAG,MAAM,IAAI,KAAA;CAElE,OAAO,CAAC,GAAG,MAAM,CAAC,CACf,MAAM,GAAG,MAAM,OAAO,EAAE,SAAS,IAAI,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CACjE,KAAK,UAAU,MAAM,MAAM;AAChC;AAEA,SAAS,oBAAoB,WAA2B;CACtD,OAAO,UACJ,MAAM,WAAW,CAAC,CAClB,KAAK,SAAS,KAAK,QAAQ,uBAAuB,MAAM,CAAC,CAAC,CAC1D,KAAK,MAAM;AAChB;AAEA,SAAS,oBAAoB,WAAmB,MAAuB;CACrE,OACE,UAAU,SAAS,WAAW,KAAK,IAAI,OAAO,IAAI,oBAAoB,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI;AAElG;;;;;;AAOA,SAAgB,mBACd,OACA,gBACA,QACe;CACf,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,OAAO,eAAe,GAC7D,OAAO;CAGT,MAAM,QAAQ,MAAM,WAAW,SAC7B,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,UAAU,OAAO,MAAM,UAAU,CAC1E;CAEA,OAAO,UAAU,KAAK,OAAO;AAC/B;;;;;;AAOA,SAAgB,mBACd,WACA,QACS;CACT,MAAM,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QAAQ,OAAO,IAAI;CAE5D,IAAI,KAAK,WAAW,GAAG,OAAO;CAO9B,QAJE,UAAU,YAAY,CAAC,UAAU,QAAQ,SACpC,UAAU,iBAAiB,CAAC,IAC7B,cAAc,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,MAAM,SAAS,EAAA,CAE7D,MAAM,SAAS,KAAK,MAAM,QAAQ,QAAQ,QAAQ,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC,CAAC;AAC5F;;;;;AAMA,SAAgB,cAAc,KAAoD;CAChF,OAAO,IAAI,cAAc,IAAI;AAC/B;;;;;AAMA,SAAgB,aACd,MACA,OACe;CACf,IAAI,CAAC,OAAO,OAAO;CAEnB,QACG,KAAK,MAAM,QAAQ,IAAI,eAAe,KAAK,KAAK,KAAK,MAAM,QAAQ,IAAI,QAAQ,KAAK,EAAA,EAAI,OACzF;AAEJ;;;;;AAMA,SAAgB,YACd,MACA,WACA,gBACA,QACe;CACf,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,MAAM,QAAQ,EAAE,OAAO,eAAe,GAC7D,OAAO;CAGT,MAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,QAAQ,SAAS;CAEvD,IAAI,UAAU,mBAAmB,QAAQ,MAAM,GAAG,OAAO;CAEzD,OAAO,KAAK,MAAM,QAAQ,mBAAmB,KAAK,MAAM,CAAC,CAAC,EAAE,OAAO;AACrE;;AAGA,SAAS,eAAe,KAAa,MAAuB;CAC1D,OACE,IAAI,SAAS,KAAK,SAAS,KAC3B,IAAI,WAAW,GAAG,KAAK,EAAE,KACzB,QAAQ,KAAK,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC;AAE3C;;;;;;;AAQA,SAAgB,WACd,QACA,MACoB;CACpB,MAAM,MAAM,OAAO,KAAK,GAAG;CAE3B,IAAI,KAAK,OAAO;CAEhB,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAClC,IAAI,eAAe,KAAK,IAAI,KAAK,OAAO,IAAI,GAAG,IAAI,OAAO,OAAO,IAAI,CAAC;AAI1E;;;;;AAMA,IAAa,YAAb,MAAuB;CAyBX;CAxBV;CAEA,iCAAkC,IAAI,IAA2B;CAEjE,oBAAoD;;;;;CAMpD;;;;;;CAOA,gBAA4C;;CAG5C;CAEA,YACE,SACA,SACA;EADQ,KAAA,UAAA;EAER,KAAK,eAAe,QAAQ,SAAS,CAAC;EACtC,KAAK,eAAe,QAAQ;EAC5B,KAAK,QAAQ,YAAuB;GAClC,YAAY,QAAQ;GACpB,QAAQ,QAAQ,SAAS,CAAC;GAC1B,QAAQ,CAAC;GACT,uBAAO,IAAI,IAAI;GACf,YAAY;GACZ,YAAY;GACZ,SAAS,QAAQ;EACnB,CAAC;EAGD,cAAc,aAAa,IAAI;CACjC;CAEA,IAAI,QAAmB;EACrB,OAAO,KAAK,MAAM,IAAI;CACxB;;;;;CAMA,SAAS,OAAqB;EAC5B,KAAK,UAAU;GAAE,GAAG,KAAK;GAAS;EAAM;CAC1C;;CAGA,IAAI,YAAoB;EACtB,OAAO,KAAK,QAAQ;CACtB;;CAGA,IAAI,WAAmB;EACrB,OAAO,KAAK,QAAQ,YAAY;CAClC;CAEA,IAAI,SAAiC;EACnC,OAAO,KAAK,QAAQ,UAAU;CAChC;CAEA,IAAI,QAAgB;EAClB,OAAO,KAAK,QAAQ;CACtB;CAEA,IAAI,aAAiC;EACnC,OAAO,KAAK,QAAQ;CACtB;CAEA,IAAI,cAAkC;EACpC,OAAO,KAAK,QAAQ;CACtB;;CAGA,IAAI,sBAA0D;EAC5D,OAAO,KAAK;CACd;;CAGA,iBAA0C;EACxC,OAAO;GACL,OAAO,KAAK,QAAQ;GACpB,WAAW,KAAK,QAAQ;GACxB,QAAQ,KAAK,QAAQ,UAAU,KAAA;GAG/B,YAAY,iBAAiB;GAC7B,GAAG,KAAK,QAAQ,SAAS;EAC3B;CACF;;;;;;CAOA,eAAwC;EACtC,MAAM,UAAU,KAAK,eAAe;EACpC,MAAM,aAAa,QAAQ;EAE3B,OAAO;GACL,GAAG;GACH,GAAI,eAAe,QAAQ,OAAO,eAAe,WAC7C,EAAE,YAAY,KAAK,UAAU,UAAU,EAAE,IACzC,CAAC;GACL,OAAO,KAAK,UAAU,KAAK,MAAM,MAAM;EACzC;CACF;CAEA,UAAU,UAAkD;EAC1D,OAAO,KAAK,MAAM,UAAU,QAAQ;CACtC;CAIA,SAAsB,MAAc,UAAiB;EACnD,OAAO,QAAW,KAAK,MAAM,QAAQ,MAAM,QAAQ;CACrD;;;;;CAMA,SAAS,MAAc,OAAgB,UAAgC,CAAC,GAAS;EAC/E,MAAM,UAAU,KAAK,SAAS,IAAI;EAElC,IAAI,OAAO,GAAG,SAAS,KAAK,GAC1B;EAGF,KAAK,MAAM,KAAK,UAAU;GACxB,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAK;GACjC,MAAM,IAAI,IAAI;GAEd,MAAM,SAAS,EAAE,GAAG,MAAM,OAAO;GACjC,OAAO,OAAO;GAGd,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAClC,IAAI,eAAe,KAAK,IAAI,GAAG,OAAO,OAAO;GAG/C,OAAO;IAAE,GAAG;IAAO,QAAQ,QAAQ,MAAM,QAAQ,MAAM,KAAK;IAAG;IAAO;GAAO;EAC/E,CAAC;EAED,KAAK,eAAe,IAAI,IAAI;EAE5B,IAAI,QAAQ,QACV;EAGF,MAAM,SAAS,KAAK,WAAW,IAAI;EAEnC,IAAI,QAAQ,MAAM,QAAQ,CAAC,OAAO,MAAM,KAAK,QAC3C,KAAK,gBAAgB,OAAO,MAAM,OAAO,MAAM,KAAK,YAAY,GAAG;CAEvE;;CAGA,KAAK,MAAoB;EACvB,MAAM,SAAS,KAAK,WAAW,IAAI;EAEnC,IAAI,QAAQ,MAAM,MAAM,UAAU,KAAK,MAAM,MAAM,IAAI,IAAI,GACzD,KAAU,QAAQ,OAAO,IAAI;CAEjC;;;;;;CAOA,WAAmB,MAAgE;EACjF,MAAM,QAAQ,KAAK,UAAU,IAAI;EAEjC,IAAI,OAAO,OAAO;GAAE;GAAO;EAAK;EAEhC,MAAM,MAAM,KAAK,YAAY,GAAG;EAEhC,IAAI,OAAO,GAAG,OAAO,KAAA;EAErB,MAAM,aAAa,KAAK,MAAM,GAAG,GAAG;EACpC,MAAM,SAAS,KAAK,UAAU,UAAU;EACxC,MAAM,OAAO,KAAK,MAAM,MAAM,CAAC;EAE/B,OAAO,QAAQ,cAAc,QAAQ,MAAM,WAAW,OAAO,SAAS,IAAI,IACtE;GAAE,OAAO;GAAQ,MAAM;EAAW,IAClC,KAAA;CACN;;CAGA,KAAK,SAAsB,UAAmC,CAAC,GAAS;EACtE,KAAK,eAAe,QAAQ,SAAS,CAAC;EACtC,KAAK,eAAe,QAAQ;EAC5B,KAAK,MAAM,KAAK,WAAW;GACzB,GAAG;GACH,YAAY,QAAQ;GACpB,QAAQ,QAAQ,SAAS,CAAC;GAC1B,SAAS,QAAQ,WAAW,MAAM;GAClC,OAAO,QAAQ,YAAY,MAAM,wBAAQ,IAAI,IAAI;EACnD,EAAE;CACJ;CAEA,UAAU,QAAiD;EACzD,MAAM,aAAuC,CAAC;EAE9C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,WAAW,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;EAGzD,KAAK,MAAM,OAAO,EAAE,QAAQ,WAAW,CAAC;CAC1C;CAEA,cAAoB;EAClB,KAAK,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;CAClC;CAEA,SAAS,MAAkC;EACzC,OAAO,WAAW,KAAK,MAAM,QAAQ,IAAI;CAC3C;CAEA,cAAc,YAA2B;EACvC,KAAK,MAAM,OAAO,EAAE,WAAW,CAAC;CAClC;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,MAAM,MAAM,OAAO;CACjC;CAEA,UAAU,MAAuC;EAC/C,OAAO,gBAAgB,KAAK,MAAM,YAAY,MAAM,KAAK,MAAM,MAAM;CACvE;CAIA,gBAAwB,MAAc,MAAoB;EACxD,IAAI,YAAY,KAAK,eAAe,IAAI,IAAI;EAE5C,IAAI,CAAC,WAAW;GACd,YAAY,eAAe;IACzB,KAAU,QAAQ,IAAI;GACxB,GAAG,IAAI;GACP,KAAK,eAAe,IAAI,MAAM,SAAS;EACzC;EAEA,UAAU;CACZ;;;;;CAMA,QAAQ,MAA8B;EACpC,MAAM,UAAU,KAAK,YAAY,IAAI;EACrC,KAAK,kBAAkB;EAEvB,QAAa,cAAc;GACzB,IAAI,KAAK,oBAAoB,SAAS,KAAK,kBAAkB;EAC/D,CAAC;EAED,OAAO;CACT;;;;;;CAOA,MAAM,SAAwB;EAC5B,KAAK,MAAM,aAAa,KAAK,eAAe,OAAO,GAAG,UAAU,MAAM;EAEtE,OAAO,KAAK,iBACV,MAAM,KAAK,gBAAgB,YAAY,KAAA,CAAS;CAEpD;;;;;CAMA,YAAY,UAA4B;EAGtC,IAAI,CAFY,CAAC,GAAG,KAAK,eAAe,OAAO,CAAC,CAAC,CAAC,MAAM,cAAc,UAAU,OAErE,KAAK,CAAC,KAAK,iBAAiB;GACrC,SAAS;GAET;EACF;EAEA,KAAU,OAAO,CAAC,CAAC,KAAK,QAAQ;CAClC;CAEA,kBAAgD;CAEhD,MAAc,YAAY,MAA8B;EACtD,IAAI,CAAC,KAAK,QAAQ,YAChB;EAGF,KAAK,mBAAmB,MAAM;EAC9B,MAAM,aAAa,IAAI,gBAAgB;EACvC,KAAK,oBAAoB;EAGzB,MAAM,wBAAQ,IAAI,IAAY;EAC9B,KAAK,gBAAgB;EAErB,KAAK,MAAM,OAAO,EAAE,YAAY,KAAK,CAAC;EACtC,MAAM,OAAO,KAAK,MAAM;EAExB,IAAI;GACF,MAAM,WAAW,MAAM,YAAmC,KAAK,QAAQ,YAAY;IACjF,QAAQ;IACR,MAAM;KACJ,GAAG,KAAK,eAAe;KACvB,OAAO;KACP;KACA,KAAK,OAAQ,QAAQ,KAAK,cAAc,IAAI,KAAK,OAAQ,KAAA;KAEzD,cAAc,KAAK;IACrB;IACA,QAAQ,WAAW;GACrB,CAAC;GAED,IAAI,WAAW,OAAO,SACpB;GAGF,IAAI,KAAK,kBAAkB,OACzB,KAAK,gBAAgB;GAGvB,IAAI,CAAC,KAAK,cAAc,UAAU,MAAM,KAAK,GAAG;IAE9C,KAAK,eAAe,KAAA;IACpB,MAAM,KAAK,YAAY,IAAI;IAE3B;GACF;GAEA,KAAK,QAAQ,cAAc,IAAI;EACjC,SAAS,OAAO;GACd,IAAK,MAAgB,SAAS,cAC5B;GAGF,IAAI,KAAK,kBAAkB,OACzB,KAAK,gBAAgB;GAGvB,KAAK,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;GAEtC,CAAC,KAAK,QAAQ,WAAW,mBAAA,CAAoB,KAAK;EACrD;CACF;;;;;;;CAQA,cACE,UACA,MACA,QAA0B,CAAC,GAClB;EACT,MAAM,SAAS,qBAAqB,KAAK,MAAM,YAAY,MAAM,QAAQ;EAEzE,IAAI,CAAC,QAAQ;GACX,KAAK,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;GAEvC,OAAO;EACT;EAEA,KAAK,eAAe,OAAO;EAC3B,KAAK,eAAe,OAAO;EAE3B,KAAK,MAAM,KAAK,UAAU;GACxB,IAAI,SAAS,OAAO;GAEpB,KAAK,MAAM,cAAc,OACvB,SAAS,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,UAAU,CAAC;GAGxE,OAAO;IACL,GAAG;IACH,YAAY,OAAO;IACnB;IACA,SAAS,OAAO,WAAW,MAAM;IACjC,YAAY;GACd;EACF,CAAC;EAED,OAAO;CACT;;;;;;CAOA,MAAM,aAAa,SAAiB,YAAwC;EAC1E,IAAI,CAAC,KAAK,QAAQ,aAChB,OAAO;EAGT,IAAI;GACF,MAAM,WAAW,MAAM,YACrB,KAAK,QAAQ,aACb;IACE,QAAQ;IACR,MAAM;KACJ,GAAG,KAAK,eAAe;KACvB,OAAO,KAAK,MAAM;KAClB,MAAM;IACR;GACF,CACF;GAGA,IAAI,aAAa,QAAQ,OAAO,aAAa,YAAY,SAAS,QAAQ;IACxE,MAAM,gBAAgB,SAAS,iBAAiB,CAAC;IAEjD,IAAI,cAAc,SAAS,GAAG,KAAK,QAAQ,kBAAkB,aAAa;IAE1E,OAAO;GACT;EACF,SAAS,OAAO;GACd,IAAI,iBAAiB,aAAa,MAAM,WAAW,KAAK;IACtD,KAAK,MAAM,OAAO,EAChB,QAAQ;KAAE,GAAG,kBAAkB,KAAK,MAAM,QAAQ,UAAU;KAAG,GAAG,MAAM;IAAO,EACjF,CAAC;IAED,OAAO;GACT;GAEC,CAAC,KAAK,QAAQ,WAAW,mBAAA,CAAoB,KAAK;GAEnD,OAAO;EACT;EAEA,KAAK,MAAM,OAAO,EAAE,QAAQ,kBAAkB,KAAK,MAAM,QAAQ,UAAU,EAAE,CAAC;EAE9E,OAAO;CACT;;CAGA,MAAM,cACJ,MACA,QACkD;EAClD,IAAI,CAAC,KAAK,QAAQ,YAChB,OAAO,CAAC;EAUV,QAAO,MAPgB,YACrB,KAAK,QAAQ,YACb,EACE,OAAO;GAAE,GAAG,KAAK,aAAa;GAAG;GAAM;EAAO,EAChD,CACF,EAAA,CAEgB,WAAW,CAAC;CAC9B;CAEA,MAAM,aACJ,MACA,QACiC;EACjC,IAAI,CAAC,KAAK,QAAQ,cAAc,OAAO,WAAW,GAChD,OAAO,CAAC;EAUV,QAAO,MAPgB,YACrB,KAAK,QAAQ,YACb,EACE,OAAO;GAAE,GAAG,KAAK,aAAa;GAAG;GAAM;EAAO,EAChD,CACF,EAAA,CAEgB,UAAU,CAAC;CAC7B;;CAGA,MAAM,YACJ,MACA,OACA,QACoC;EACpC,IAAI,CAAC,KAAK,QAAQ,YAChB,OAAO;EAGT,OAAO,YAAgC,KAAK,QAAQ,YAAY;GAC9D,OAAO;IACL,GAAG,KAAK,aAAa;IACrB;IACA,QAAQ,MAAM,UAAU;IACxB,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,QAAQ;GACtB;GACA;EACF,CAAC;CACH;;;;;CAMA,MAAM,WACJ,MACA,YACA,OACA,QAC0C;EAC1C,IAAI,CAAC,KAAK,QAAQ,YAChB,OAAO;EAGT,OAAO,YAAsC,KAAK,QAAQ,YAAY;GACpE,OAAO;IACL,GAAG,KAAK,aAAa;IACrB;IACA,OAAO;IACP,GAAG,gBAAgB,YAAY,KAAK;GACtC;GACA;EACF,CAAC;CACH;CAEA,UAAgB;EACd,cAAc,eAAe,IAAI;EACjC,KAAK,mBAAmB,MAAM;EAE9B,KAAK,MAAM,aAAa,KAAK,eAAe,OAAO,GACjD,UAAU,OAAO;EAGnB,KAAK,eAAe,MAAM;CAC5B;AACF;;AAGA,SAAS,kBACP,QACA,YAC0B;CAC1B,MAAM,OAAiC,CAAC;CAExC,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,MAAM,GACjD,IAAI,CAAC,WAAW,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC,GACvE,KAAK,OAAO;CAIhB,OAAO;AACT;;;;;;;AAQA,SAAgB,aACd,MACA,OACQ;CACR,OAAO,KAAK,UAAU;EACpB,MAAM,SAAS;EACf,MAAM,UAAU;EAChB,MAAM;EACN,MAAM;EACN,MAAM,aAAa;CACrB,CAAC;AACH;;;;;;;AAiBA,SAAgB,eAAe,OAAqB,YAA8B;CAChF,IAAI,MAAM,OAAO,YAAY,MAAM,OACjC,OAAO;CAGT,KAAK,MAAM,MAAM,UAAU,KAAK,MAAM,MAAM,QAAQ,UAAU,KAAK,GACjE,OAAO;CAGT,MAAM,OACJ,eAAe,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;CACxE,MAAM,OAAO,IAAI,IAAI,IAAI;CACzB,MAAM,SAAS,IAAI,IAAI,OAAO,MAAM,GAAG,GAAG,IAAI;CAE9C,OAAO,EACL,MAAM,kBAAkB,QACxB,OAAO,WAAW,KAAK,UACvB,OAAO,aAAa,KAAK;AAE7B;;AAUA,SAAgB,mBACd,OACA,eACW;CACX,OAAO,CAAC,GAAG,OAAO,WAAW,aAAa,CAAC;AAC7C;AAEA,SAAgB,mBAAmB,OAAkB,OAA0B;CAC7E,OAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,KAAK;AAC3C;AAEA,SAAgB,iBAAiB,OAAkB,MAAc,IAAuB;CACtF,IAAI,SAAS,MAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,MAAM,UAAU,MAAM,MAAM,QAC3E,OAAO;CAGT,MAAM,OAAO,CAAC,GAAG,KAAK;CACtB,MAAM,CAAC,QAAQ,KAAK,OAAO,MAAM,CAAC;CAClC,KAAK,OAAO,IAAI,GAAG,IAAI;CAEvB,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAAkB,OAA0B;CAC5E,MAAM,OAAO,CAAC,GAAG,KAAK;CACtB,KAAK,OAAO,QAAQ,GAAG,GAAG,WAAW,MAAM,MAAM,CAAC;CAElD,OAAO;AACT;AAQA,SAAS,kBACP,OACA,UACiB;CACjB,MAAM,SAA0B,CAAC;CAEjC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAoB;EACjE,MAAM,QAAQ,SAAS,OAAO,GAAG,CAAC;EAElC,IAAI,UAAU,MAAM,OAAO,SAAS;CACtC;CAEA,OAAO;AACT;AAEA,SAAgB,iBACd,OACA,MACA,IACiB;CACjB,IAAI,SAAS,IAAI,OAAO;CAExB,OAAO,kBAAkB,QAAQ,UAAU;EACzC,IAAI,UAAU,MAAM,OAAO;EAC3B,IAAI,OAAO,MAAM,QAAQ,QAAQ,SAAS,IAAI,OAAO,QAAQ;EAC7D,IAAI,OAAO,MAAM,SAAS,MAAM,QAAQ,MAAM,OAAO,QAAQ;EAE7D,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,mBAAsB,OAAwB,SAAkC;CAC9F,OAAO,kBAAkB,QAAQ,UAC/B,UAAU,UAAU,OAAO,QAAQ,UAAU,QAAQ,IAAI,KAC3D;AACF;AAEA,SAAgB,kBAAqB,OAAwB,QAAiC;CAC5F,MAAM,SAAS,kBAAkB,QAAQ,UAAW,QAAQ,SAAS,QAAQ,IAAI,KAAM;CAEvF,IAAI,UAAU,OAAO,OAAO,SAAS,KAAK,MAAM;CAEhD,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"form.js","names":[],"sources":["../src/form.ts"],"sourcesContent":["import { modalTableQuery } from './advanced-fields'\nimport { debugRecorder } from './debug'\nimport { reportRequestError } from './error-notifications'\nimport { HttpError, requestJson } from './http'\nimport { currentPageQuery } from './page-query'\nimport { mergeRefreshResponse } from './partial'\nimport type { ModalTableSelectResponse } from './schema/advanced-fields'\nimport type { FieldSchema, SchemaComponent, TabSchema } from './schema/components'\nimport { isField } from './schema/components'\nimport type {\n FormPayload,\n SchemaRefreshResponse,\n StepValidationHaltedResponse,\n} from './schema/form'\nimport type { IconPickerResponse } from './schema/icon-picker'\nimport type { NotificationSchema } from './schema/notifications'\nimport { createStore, type Store } from './store'\nimport type { TableQuery } from './table'\nimport { cloneState } from './utils/clone'\nimport { debounce, type Debounced } from './utils/debounce'\nimport { getPath, setPath } from './utils/path'\n\nexport interface FormState {\n components: SchemaComponent[]\n values: Record<string, unknown>\n errors: Record<string, string[]>\n /** State paths that changed since the last fill. */\n dirty: Set<string>\n /** True while a live refresh or submit is in flight. */\n processing: boolean\n refreshing: boolean\n columns: FormPayload['columns']\n}\n\nexport interface FormStoreOptions {\n /** Encrypted page context token. */\n token: string\n /** Context component name (`form`, `action:table.edit`, …). */\n component: string\n /** Record key when the schema belongs to a table action. */\n record?: string | number | null\n /** URL of the schema refresh endpoint. */\n refreshUrl?: string\n /** URL of the select options endpoint. */\n optionsUrl?: string\n /** URL of the step validation endpoint (wizards validate each step on \"Next\"). */\n validateUrl?: string\n /**\n * Extra parameters for every request (refresh, options). The modal form of a field\n * action sends its owning form's state (`ownerState`) so the server can find the field.\n */\n params?: () => Record<string, unknown>\n onError?: (error: unknown) => void\n /** Shows notifications the server sent with a JSON answer (a halted wizard step). */\n onNotifications?: (notifications: NotificationSchema[]) => void\n /** Called after a live refresh was merged (e.g. to reload what depends on the form). */\n onRefreshed?: (path: string | undefined) => void\n /**\n * Prefix of the fields' DOM ids (`{idPrefix}-{statePath}`), default `alfakit`. Forms shown\n * over another form (action modals) use their own, so ids never repeat on the page.\n */\n idPrefix?: string\n}\n\n/** A DOM-safe id prefix for a form, e.g. `action:field.category_id.createOption` -> `alfakit-action-field-category_id-createOption`. */\nexport function formIdPrefix(scope: string): string {\n return `alfakit-${scope.replace(/[^a-zA-Z0-9_-]/g, '-')}`\n}\n\n/** The DOM id of a field: `{prefix}-{statePath}` with unsafe characters replaced. */\nexport function fieldDomId(prefix: string, statePath: string): string {\n return `${prefix}-${statePath.replace(/[^a-zA-Z0-9_-]/g, '-')}`\n}\n\n/**\n * Walk a component tree and collect every field (including those inside Repeater items).\n */\nexport function collectFields(\n components: SchemaComponent[],\n into: FieldSchema[] = [],\n): FieldSchema[] {\n for (const component of components) {\n if (isField(component)) {\n into.push(component)\n\n if (component.type === 'Repeater' || component.type === 'Builder') {\n for (const item of component.items) {\n collectFields(item.schema, into)\n }\n }\n }\n\n if (component.schema) {\n collectFields(component.schema, into)\n }\n }\n\n return into\n}\n\n/**\n * The field at `path`. Items the browser added (or cloned) before the server has seen\n * them have no per-item schema yet: their fields are found in the Repeater's `template`\n * (or the Builder block's schema, preferring the block named by the item's `type` in\n * `values`), whose `__INDEX__` placeholders stand for any item index, so `live()` fields\n * of fresh items refresh like any other.\n */\nexport function findFieldByPath(\n components: SchemaComponent[],\n path: string,\n values: Record<string, unknown> = {},\n): FieldSchema | undefined {\n return (\n collectFields(components).find((field) => field.statePath === path) ??\n findTemplateField(components, path, values)\n )\n}\n\nfunction findTemplateField(\n components: SchemaComponent[],\n path: string,\n values: Record<string, unknown>,\n): FieldSchema | undefined {\n for (const field of collectFields(components)) {\n for (const template of itemTemplates(field, path, values)) {\n const found =\n collectFields(template).find((candidate) =>\n templatePathMatches(candidate.statePath, path),\n ) ?? findTemplateField(template, path, values)\n\n if (found) return found\n }\n }\n\n return undefined\n}\n\n/** The blank item schemas of a Repeater or Builder (the item's own block first). */\nfunction itemTemplates(\n field: FieldSchema,\n path: string,\n values: Record<string, unknown>,\n): SchemaComponent[][] {\n if (field.type === 'Repeater') {\n return [(field as unknown as { template?: SchemaComponent[] }).template ?? []]\n }\n\n if (field.type !== 'Builder') return []\n\n const blocks =\n (field as unknown as { blocks?: Array<{ name: string; schema: SchemaComponent[] }> }).blocks ??\n []\n const item = new RegExp(`^(${templatePathPattern(field.statePath)}\\\\.\\\\d+)\\\\.`).exec(path)\n const type = item ? getPath<unknown>(values, `${item[1]}.type`) : undefined\n\n return [...blocks]\n .sort((a, b) => Number(b.name === type) - Number(a.name === type))\n .map((block) => block.schema)\n}\n\nfunction templatePathPattern(statePath: string): string {\n return statePath\n .split('__INDEX__')\n .map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('\\\\d+')\n}\n\nfunction templatePathMatches(statePath: string, path: string): boolean {\n return (\n statePath.includes('__INDEX__') && new RegExp(`^${templatePathPattern(statePath)}$`).test(path)\n )\n}\n\n/**\n * The wizard step to reveal after the errors change: the first step with an error, but\n * only when new error keys arrived (a submit or validation response), so the user can\n * still move between steps while errors are shown.\n */\nexport function wizardStepToReveal(\n steps: SchemaComponent[],\n previousErrors: Record<string, unknown>,\n errors: Record<string, unknown>,\n): number | null {\n if (!Object.keys(errors).some((key) => !(key in previousErrors))) {\n return null\n }\n\n const index = steps.findIndex((step) =>\n collectFields(step.schema ?? []).some((field) => errors[field.statePath]),\n )\n\n return index === -1 ? null : index\n}\n\n/**\n * Whether a layout component (a tab, a section) holds a field with a validation error:\n * one of its fields, a nested repeater/builder item field (`items.0.sku`), or, while the\n * component is deferred and its fields aren't loaded, one of its `deferredPaths`.\n */\nexport function componentHasErrors(\n component: Pick<SchemaComponent, 'schema' | 'deferred' | 'deferredPaths'>,\n errors: Record<string, unknown>,\n): boolean {\n const keys = Object.keys(errors).filter((key) => errors[key])\n\n if (keys.length === 0) return false\n\n const paths =\n component.deferred && !component.schema?.length\n ? (component.deferredPaths ?? [])\n : collectFields(component.schema ?? []).map((field) => field.statePath)\n\n return paths.some((path) => keys.some((key) => key === path || key.startsWith(`${path}.`)))\n}\n\n/**\n * The value a tab is written to the query string as (`persistTabInQueryString()`): its\n * readable `queryValue` (`billing-address`), else its key.\n */\nexport function tabQueryValue(tab: Pick<TabSchema, 'key' | 'queryValue'>): string {\n return tab.queryValue ?? tab.key\n}\n\n/**\n * The key of the tab a query-string value names: a tab's `queryValue`, or its key (links\n * written before tabs had readable values, `?tab=tabs-0.tab-1`). Null when none matches.\n */\nexport function tabFromQuery(\n tabs: Array<Pick<TabSchema, 'key' | 'queryValue'>>,\n value: string | null | undefined,\n): string | null {\n if (!value) return null\n\n return (\n (tabs.find((tab) => tab.queryValue === value) ?? tabs.find((tab) => tab.key === value))?.key ??\n null\n )\n}\n\n/**\n * The tab to show after the errors change: when new error keys arrived (a submit or\n * validation response) and the active tab has none, the first tab with an error.\n */\nexport function tabToReveal(\n tabs: Array<Pick<SchemaComponent, 'key' | 'schema' | 'deferred' | 'deferredPaths'>>,\n activeKey: string,\n previousErrors: Record<string, unknown>,\n errors: Record<string, unknown>,\n): string | null {\n if (!Object.keys(errors).some((key) => !(key in previousErrors))) {\n return null\n }\n\n const active = tabs.find((tab) => tab.key === activeKey)\n\n if (active && componentHasErrors(active, errors)) return null\n\n return tabs.find((tab) => componentHasErrors(tab, errors))?.key ?? null\n}\n\n/** Whether `key` is the error of one item of the list field at `path` (`labels.2`). */\nfunction isItemErrorKey(key: string, path: string): boolean {\n return (\n key.length > path.length + 1 &&\n key.startsWith(`${path}.`) &&\n /^\\d+$/.test(key.slice(path.length + 1))\n )\n}\n\n/**\n * The validation message a field shows: its own, else the first of its items' (`labels.2`\n * for a tag refused by `nestedRecursiveRules()`, `attachments.0` for one upload). Those\n * errors have no field of their own, so without this the form refused to save with no\n * message anywhere. Deeper paths (`items.0.name`) belong to item fields and are left out.\n */\nexport function fieldError(\n errors: Readonly<Record<string, readonly string[] | undefined>>,\n path: string,\n): string | undefined {\n const own = errors[path]?.[0]\n\n if (own) return own\n\n for (const key of Object.keys(errors)) {\n if (isItemErrorKey(key, path) && errors[key]?.[0]) return errors[key][0]\n }\n\n return undefined\n}\n\n/**\n * Framework-agnostic form state: values addressed by `statePath`, validation errors,\n * dirty tracking and server round-trips for `live()` fields.\n */\nexport class FormStore {\n public readonly store: Store<FormState>\n\n private readonly liveDebouncers = new Map<string, Debounced<[]>>()\n\n private refreshController: AbortController | null = null\n\n /**\n * The values as the server last sent them, so a refresh can tell `afterStateUpdated`\n * hooks what the field held before the change (`$old`).\n */\n private serverValues: Record<string, unknown>\n\n /**\n * Paths the user changed while a live refresh was in flight. Only these keep their\n * client value when the response is merged; every other path takes the server's value\n * (including values set by `$set` in `afterStateUpdated` hooks).\n */\n private editsInFlight: Set<string> | null = null\n\n /** The fingerprints of the components the store holds (see `PartialFormPayload`). */\n private fingerprints: Record<string, string> | undefined\n\n constructor(\n payload: FormPayload,\n private options: FormStoreOptions,\n ) {\n this.serverValues = payload.state ?? {}\n this.fingerprints = payload.fingerprints\n this.store = createStore<FormState>({\n components: payload.components,\n values: payload.state ?? {},\n errors: {},\n dirty: new Set(),\n processing: false,\n refreshing: false,\n columns: payload.columns,\n })\n\n // Listed by the developer debug panel while it is enabled; a no-op otherwise.\n debugRecorder.registerForm(this)\n }\n\n get state(): FormState {\n return this.store.get()\n }\n\n /**\n * Swap in a fresher context token (every response re-issues it) without touching the\n * form state, so live refreshes keep working after unrelated reloads.\n */\n setToken(token: string): void {\n this.options = { ...this.options, token }\n }\n\n /** Context component name of the schema (`form`, `action:table.edit`, …). */\n get component(): string {\n return this.options.component\n }\n\n /** Prefix of the fields' DOM ids (see `FormStoreOptions.idPrefix`). */\n get idPrefix(): string {\n return this.options.idPrefix ?? 'alfakit'\n }\n\n get record(): string | number | null {\n return this.options.record ?? null\n }\n\n get token(): string {\n return this.options.token\n }\n\n get optionsUrl(): string | undefined {\n return this.options.optionsUrl\n }\n\n get validateUrl(): string | undefined {\n return this.options.validateUrl\n }\n\n /** The fingerprints of the held components, sent so responses can be partial. */\n get currentFingerprints(): Record<string, string> | undefined {\n return this.fingerprints\n }\n\n /** The parameters that identify this schema to the internal endpoints. */\n requestContext(): Record<string, unknown> {\n return {\n token: this.options.token,\n component: this.options.component,\n record: this.options.record ?? undefined,\n // A record action's modal on a list tab: the server finds the record through the\n // page's tab and filters, as the modal request itself does.\n tableQuery: currentPageQuery(),\n ...this.options.params?.(),\n }\n }\n\n /**\n * `requestContext()` plus the form state for GET requests (options, picker tables,\n * mentions). States travel as JSON: a query string drops nulls and empty arrays, and with\n * them repeater items that are still blank, so the server couldn't find their fields.\n */\n queryContext(): Record<string, unknown> {\n const context = this.requestContext()\n const ownerState = context.ownerState\n\n return {\n ...context,\n ...(ownerState !== null && typeof ownerState === 'object'\n ? { ownerState: JSON.stringify(ownerState) }\n : {}),\n state: JSON.stringify(this.state.values),\n }\n }\n\n subscribe(listener: (state: FormState) => void): () => void {\n return this.store.subscribe(listener)\n }\n\n // ---------------------------------------------------------------- Values\n\n getValue<T = unknown>(path: string, fallback?: T): T {\n return getPath<T>(this.state.values, path, fallback)\n }\n\n /**\n * Set a value. Live fields schedule a server refresh (debounced); `onBlur` fields\n * refresh via `blur()` instead.\n */\n setValue(path: string, value: unknown, options: { silent?: boolean } = {}): void {\n const current = this.getValue(path)\n\n if (Object.is(current, value)) {\n return\n }\n\n this.store.set((state) => {\n const dirty = new Set(state.dirty)\n dirty.add(path)\n\n const errors = { ...state.errors }\n delete errors[path]\n\n // Item errors of a list field (`labels.2` from `nestedRecursiveRules()`) go with it.\n for (const key of Object.keys(errors)) {\n if (isItemErrorKey(key, path)) delete errors[key]\n }\n\n return { ...state, values: setPath(state.values, path, value), dirty, errors }\n })\n\n this.editsInFlight?.add(path)\n\n if (options.silent) {\n return\n }\n\n const target = this.liveTarget(path)\n\n if (target?.field.live && !target.field.live.onBlur) {\n this.scheduleRefresh(target.path, target.field.live.debounce ?? 150)\n }\n }\n\n /** Call when a field loses focus so `live(onBlur: true)` fields refresh. */\n blur(path: string): void {\n const target = this.liveTarget(path)\n\n if (target?.field.live?.onBlur && this.state.dirty.has(path)) {\n void this.refresh(target.path)\n }\n }\n\n /**\n * The field whose `live()` a change at `path` triggers, and the path to refresh: a\n * translatable field's language input (`title.en`) reports its field (`title`), whose\n * `afterStateUpdated()` gets the whole `{ code: value }` state.\n */\n private liveTarget(path: string): { field: FieldSchema; path: string } | undefined {\n const field = this.findField(path)\n\n if (field) return { field, path }\n\n const dot = path.lastIndexOf('.')\n\n if (dot <= 0) return undefined\n\n const parentPath = path.slice(0, dot)\n const parent = this.findField(parentPath)\n const code = path.slice(dot + 1)\n\n return parent?.translatable?.locales.some((locale) => locale.code === code)\n ? { field: parent, path: parentPath }\n : undefined\n }\n\n /** Replace the whole state (e.g. after the server returns a refreshed payload). */\n fill(payload: FormPayload, options: { keepDirty?: boolean } = {}): void {\n this.serverValues = payload.state ?? {}\n this.fingerprints = payload.fingerprints\n this.store.set((state) => ({\n ...state,\n components: payload.components,\n values: payload.state ?? {},\n columns: payload.columns ?? state.columns,\n dirty: options.keepDirty ? state.dirty : new Set(),\n }))\n }\n\n setErrors(errors: Record<string, string[] | string>): void {\n const normalized: Record<string, string[]> = {}\n\n for (const [key, value] of Object.entries(errors)) {\n normalized[key] = Array.isArray(value) ? value : [value]\n }\n\n this.store.update({ errors: normalized })\n }\n\n clearErrors(): void {\n this.store.update({ errors: {} })\n }\n\n getError(path: string): string | undefined {\n return fieldError(this.state.errors, path)\n }\n\n setProcessing(processing: boolean): void {\n this.store.update({ processing })\n }\n\n get isDirty(): boolean {\n return this.state.dirty.size > 0\n }\n\n findField(path: string): FieldSchema | undefined {\n return findFieldByPath(this.state.components, path, this.state.values)\n }\n\n // ---------------------------------------------------------------- Live refresh\n\n private scheduleRefresh(path: string, wait: number): void {\n let debounced = this.liveDebouncers.get(path)\n\n if (!debounced) {\n debounced = debounce(() => {\n void this.refresh(path)\n }, wait)\n this.liveDebouncers.set(path, debounced)\n }\n\n debounced()\n }\n\n /**\n * Send the current state to the server, which re-evaluates closures and\n * `afterStateUpdated` hooks, and replace components + values with the response.\n */\n refresh(path?: string): Promise<void> {\n const request = this.sendRefresh(path)\n this.refreshInFlight = request\n\n void request.finally(() => {\n if (this.refreshInFlight === request) this.refreshInFlight = null\n })\n\n return request\n }\n\n /**\n * Resolves once no live refresh is waiting or in flight: debounced refreshes are sent\n * now and awaited. Submits wait for it, so a click that blurs a `live(onBlur: true)` field\n * sends the state the server computed (`$set` in `afterStateUpdated`), not the one before.\n */\n async settle(): Promise<void> {\n for (;;) {\n for (const debounced of this.liveDebouncers.values()) debounced.flush()\n\n if (this.refreshInFlight) {\n await this.refreshInFlight.catch(() => undefined)\n } else if (this.uploadsInFlight.size > 0) {\n // A file still uploading isn't in the state yet: saving now would drop it. Its\n // field commits the upload's key when it completes (which may refresh a live\n // field, so the loop runs again).\n await Promise.allSettled([...this.uploadsInFlight])\n } else {\n return\n }\n }\n }\n\n /**\n * Register an upload of one of the form's fields (FileUpload, RichEditor attachments)\n * while it runs: `settle()` and `whenSettled()`, and so every submit, wait for it.\n * Returns the same promise; a failed upload stops counting as pending.\n */\n trackUpload<T>(upload: Promise<T>): Promise<T> {\n this.uploadsInFlight.add(upload)\n\n const forget = () => {\n this.uploadsInFlight.delete(upload)\n }\n\n upload.then(forget, forget)\n\n return upload\n }\n\n /** Whether an upload registered with `trackUpload()` is still running. */\n get hasPendingUploads(): boolean {\n return this.uploadsInFlight.size > 0\n }\n\n private readonly uploadsInFlight = new Set<Promise<unknown>>()\n\n /**\n * Run `callback` once the form is settled (see `settle()`): straight away when no live\n * refresh or upload is waiting or in flight, so a submit stays synchronous in the usual case.\n */\n whenSettled(callback: () => void): void {\n const waiting = [...this.liveDebouncers.values()].some((debounced) => debounced.pending)\n\n if (!waiting && !this.refreshInFlight && this.uploadsInFlight.size === 0) {\n callback()\n\n return\n }\n\n void this.settle().then(callback)\n }\n\n private refreshInFlight: Promise<void> | null = null\n\n private async sendRefresh(path?: string): Promise<void> {\n if (!this.options.refreshUrl) {\n return\n }\n\n this.refreshController?.abort()\n const controller = new AbortController()\n this.refreshController = controller\n // The request carries the current state, so only edits made from now on are newer\n // than what the server sees.\n const edits = new Set<string>()\n this.editsInFlight = edits\n\n this.store.update({ refreshing: true })\n const sent = this.state.values\n\n try {\n const response = await requestJson<SchemaRefreshResponse>(this.options.refreshUrl, {\n method: 'POST',\n body: {\n ...this.requestContext(),\n state: sent,\n path,\n old: path ? (getPath(this.serverValues, path) ?? null) : undefined,\n // With fingerprints the server answers with only what changed.\n fingerprints: this.fingerprints,\n },\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) {\n return\n }\n\n if (this.editsInFlight === edits) {\n this.editsInFlight = null\n }\n\n if (!this.applyResponse(response, sent, edits)) {\n // The patches didn't fit the tree: ask for the whole form instead.\n this.fingerprints = undefined\n await this.sendRefresh(path)\n\n return\n }\n\n this.options.onRefreshed?.(path)\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return\n }\n\n if (this.editsInFlight === edits) {\n this.editsInFlight = null\n }\n\n this.store.update({ refreshing: false })\n // Without an `onError`, the panel's error notification for the status is shown.\n ;(this.options.onError ?? reportRequestError)(error)\n }\n }\n\n /**\n * Merge a refresh response (full or partial) for the state `sent` with the request.\n * Paths in `edits` changed while the request was in flight and keep their client value;\n * everything else takes the server's (including values set by `$set`). Returns false\n * when a partial response doesn't fit the tree the store holds.\n */\n applyResponse(\n response: SchemaRefreshResponse,\n sent: Record<string, unknown>,\n edits: Iterable<string> = [],\n ): boolean {\n const merged = mergeRefreshResponse(this.state.components, sent, response)\n\n if (!merged) {\n this.store.update({ refreshing: false })\n\n return false\n }\n\n this.serverValues = merged.values\n this.fingerprints = merged.fingerprints\n\n this.store.set((state) => {\n let values = merged.values\n\n for (const editedPath of edits) {\n values = setPath(values, editedPath, getPath(state.values, editedPath))\n }\n\n return {\n ...state,\n components: merged.components,\n values,\n columns: merged.columns ?? state.columns,\n refreshing: false,\n }\n })\n\n return true\n }\n\n /**\n * Validate the fields of one wizard step (by the Step component's `key`) on the server.\n * Resolves with true when they pass; otherwise the step's errors replace the errors of\n * those fields and false is returned. Without a validation endpoint every step passes.\n */\n async validateStep(stepKey: string, fieldPaths: string[]): Promise<boolean> {\n if (!this.options.validateUrl) {\n return true\n }\n\n try {\n const response = await requestJson<StepValidationHaltedResponse | null>(\n this.options.validateUrl,\n {\n method: 'POST',\n body: {\n ...this.requestContext(),\n state: this.state.values,\n step: stepKey,\n },\n },\n )\n\n // A step hook halted: stay on the step, keep the field errors as they are.\n if (response !== null && typeof response === 'object' && response.halted) {\n const notifications = response.notifications ?? []\n\n if (notifications.length > 0) this.options.onNotifications?.(notifications)\n\n return false\n }\n } catch (error) {\n if (error instanceof HttpError && error.status === 422) {\n this.store.update({\n errors: { ...withoutStepErrors(this.state.errors, fieldPaths), ...error.errors },\n })\n\n return false\n }\n\n ;(this.options.onError ?? reportRequestError)(error)\n\n return false\n }\n\n this.store.update({ errors: withoutStepErrors(this.state.errors, fieldPaths) })\n\n return true\n }\n\n /** Search options for a searchable select at `path`. */\n async searchOptions(\n path: string,\n search: string,\n ): Promise<Array<{ value: string; label: string }>> {\n if (!this.options.optionsUrl) {\n return []\n }\n\n const response = await requestJson<{ options?: Array<{ value: string; label: string }> }>(\n this.options.optionsUrl,\n {\n query: { ...this.queryContext(), path, search },\n },\n )\n\n return response.options ?? []\n }\n\n async optionLabels(\n path: string,\n values: Array<string | number>,\n ): Promise<Record<string, string>> {\n if (!this.options.optionsUrl || values.length === 0) {\n return {}\n }\n\n const response = await requestJson<{ labels?: Record<string, string> }>(\n this.options.optionsUrl,\n {\n query: { ...this.queryContext(), path, values },\n },\n )\n\n return response.labels ?? {}\n }\n\n /** One page of icons for the IconPicker at `path` (`set`: one of its sets, or all). */\n async searchIcons(\n path: string,\n query: { search?: string; set?: string | null; page?: number },\n signal?: AbortSignal,\n ): Promise<IconPickerResponse | null> {\n if (!this.options.optionsUrl) {\n return null\n }\n\n return requestJson<IconPickerResponse>(this.options.optionsUrl, {\n query: {\n ...this.queryContext(),\n path,\n search: query.search ?? '',\n ...(query.set ? { set: query.set } : {}),\n page: query.page ?? 1,\n },\n signal,\n })\n }\n\n /**\n * The picker table of a ModalTableSelect at `path` (`query` is its table state) and the\n * labels of the records it lists.\n */\n async modalTable(\n path: string,\n identifier: string,\n query: TableQuery,\n signal?: AbortSignal,\n ): Promise<ModalTableSelectResponse | null> {\n if (!this.options.optionsUrl) {\n return null\n }\n\n return requestJson<ModalTableSelectResponse>(this.options.optionsUrl, {\n query: {\n ...this.queryContext(),\n path,\n table: 1,\n ...modalTableQuery(identifier, query),\n },\n signal,\n })\n }\n\n destroy(): void {\n debugRecorder.unregisterForm(this)\n this.refreshController?.abort()\n\n for (const debounced of this.liveDebouncers.values()) {\n debounced.cancel()\n }\n\n this.liveDebouncers.clear()\n }\n}\n\n/** The errors without those of the given fields (and of their nested paths). */\nfunction withoutStepErrors(\n errors: Record<string, string[]>,\n fieldPaths: string[],\n): Record<string, string[]> {\n const kept: Record<string, string[]> = {}\n\n for (const [key, messages] of Object.entries(errors)) {\n if (!fieldPaths.some((path) => key === path || key.startsWith(`${path}.`))) {\n kept[key] = messages\n }\n }\n\n return kept\n}\n\n/**\n * A stable key for a page form: the page class, record and the form's own key/component.\n * The context token is re-encrypted on every response, so it cannot identify a form.\n * Renderers re-initialise a FormStore from server state only when this key changes (or\n * after the form's own successful submit), never on unrelated reloads of the same page.\n */\nexport function formIdentity(\n page: { class?: string; record?: string | number | null } | null | undefined,\n block: { key: string; component: string; operation?: string | null },\n): string {\n return JSON.stringify([\n page?.class ?? null,\n page?.record ?? null,\n block.key,\n block.component,\n block.operation ?? null,\n ])\n}\n\n/** The parts of an Inertia visit the unsaved-changes guard needs. */\nexport interface GuardedVisit {\n method: string\n url: URL | string\n only?: string[]\n except?: string[]\n preserveState?: unknown\n}\n\n/**\n * True when an Inertia visit would navigate away from the current form, i.e. when the\n * unsaved-changes guard should ask. Partial reloads (`only`/`except`, used by table\n * sorting, paging and polling) and state-preserving visits to the same path stay on the\n * page and keep the form, so they never prompt. Non-GET visits are submissions.\n */\nexport function isLeavingVisit(visit: GuardedVisit, currentUrl?: string): boolean {\n if (visit.method.toLowerCase() !== 'get') {\n return false\n }\n\n if ((visit.only?.length ?? 0) > 0 || (visit.except?.length ?? 0) > 0) {\n return false\n }\n\n const base =\n currentUrl ?? (typeof window !== 'undefined' ? window.location.href : 'http://localhost/')\n const here = new URL(base)\n const target = new URL(String(visit.url), here)\n\n return !(\n visit.preserveState === true &&\n target.origin === here.origin &&\n target.pathname === here.pathname\n )\n}\n\n// ---------------------------------------------------------------- Repeater helpers\n\nexport interface RepeaterItemState {\n key: string\n state: Record<string, unknown>\n}\n\n/** Append a blank item using the Repeater's template state. */\nexport function appendRepeaterItem(\n items: unknown[],\n templateState: Record<string, unknown>,\n): unknown[] {\n return [...items, cloneState(templateState)]\n}\n\nexport function removeRepeaterItem(items: unknown[], index: number): unknown[] {\n return items.filter((_, i) => i !== index)\n}\n\nexport function moveRepeaterItem(items: unknown[], from: number, to: number): unknown[] {\n if (from === to || from < 0 || to < 0 || from >= items.length || to >= items.length) {\n return items\n }\n\n const copy = [...items]\n const [item] = copy.splice(from, 1)\n copy.splice(to, 0, item)\n\n return copy\n}\n\nexport function cloneRepeaterItem(items: unknown[], index: number): unknown[] {\n const copy = [...items]\n copy.splice(index + 1, 0, cloneState(items[index]))\n\n return copy\n}\n\n/**\n * Per-item UI state (collapsed flags, …) keyed by item index, remapped after the items\n * are reordered, removed or cloned with the helpers above so it stays with its item.\n */\nexport type IndexedState<T> = Record<number, T>\n\nfunction remapIndexedState<T>(\n state: IndexedState<T>,\n newIndex: (index: number) => number | null,\n): IndexedState<T> {\n const result: IndexedState<T> = {}\n\n for (const [key, value] of Object.entries(state) as [string, T][]) {\n const index = newIndex(Number(key))\n\n if (index !== null) result[index] = value\n }\n\n return result\n}\n\nexport function moveIndexedState<T>(\n state: IndexedState<T>,\n from: number,\n to: number,\n): IndexedState<T> {\n if (from === to) return state\n\n return remapIndexedState(state, (index) => {\n if (index === from) return to\n if (from < to && index > from && index <= to) return index - 1\n if (from > to && index >= to && index < from) return index + 1\n\n return index\n })\n}\n\nexport function removeIndexedState<T>(state: IndexedState<T>, removed: number): IndexedState<T> {\n return remapIndexedState(state, (index) =>\n index === removed ? null : index > removed ? index - 1 : index,\n )\n}\n\nexport function cloneIndexedState<T>(state: IndexedState<T>, cloned: number): IndexedState<T> {\n const result = remapIndexedState(state, (index) => (index > cloned ? index + 1 : index))\n\n if (cloned in state) result[cloned + 1] = state[cloned] as T\n\n return result\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -36,8 +36,8 @@ import { AlfakitPageProps, BreadcrumbSchema, ContentBlock, DefaultActionSchema,
|
|
|
36
36
|
import { LocaleFormatter, MoneyOptions, Translator, applyDocumentLocale, collapsesLanguageSwitcher, currencyDecimals, formatPhpDate, selectPlural, showsLanguageSwitcher, switchLocale, t, toAsciiDigits, translator } from "./i18n.js";
|
|
37
37
|
import { CALENDAR_ARGUMENTS_KEY, CALENDAR_EVENT_DROP_ACTION, CALENDAR_EVENT_RESIZE_ACTION, CALENDAR_FETCH_EVENTS_ACTION, CALENDAR_REGISTRY_KEY, CalendarEnvironment, CalendarEventApi, CalendarEventChangeInfo, CalendarEventClickInfo, CalendarFetchInfo, CalendarSelectInfo, calendarActionContext, calendarIdentity, calendarOptions, calendarWallTime, clientErrorNotification } from "./calendar.js";
|
|
38
38
|
import { ChartConfigInput, ChartConfigOutput, ChartFormatter, buildChartConfig, chartColorVariable, configureCharts, getChartFormatters, getChartPlugins, mergeChartOptions, observeThemeChanges, registerChartFormatters, registerChartPlugins, resetChartRegistrations, resolveChartCallbacks, resolveCssColor, withAlpha } from "./chart.js";
|
|
39
|
-
import { CmsAdminBarSchema, CmsAlternateSchema, CmsAspectRatio, CmsAutosaveResult, CmsBlockSchema, CmsBreadcrumbSchema, CmsBuiltInBlocks, CmsCallToActionBlockData, CmsColumnsBlockData, CmsEditorStatusSchema, CmsEmbedBlockData, CmsFaqBlockData, CmsFeatureSchema, CmsFeaturesBlockData, CmsFormBlockData, CmsGalleryBlockData, CmsHeroBlockData, CmsImageBlockData, CmsImageSchema, CmsLinkSchema, CmsLivePreviewSchema, CmsMenuItemSchema, CmsMenuSchema, CmsPageProps, CmsPageSchema, CmsPayload, CmsRichTextBlockData, CmsSectionBlockData, CmsSeoSchema, CmsSiteSchema, CmsTestimonialSchema, CmsTestimonialsBlockData } from "./schema/cms.js";
|
|
40
|
-
import { CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, CmsHeadTags, CmsLinkTag, CmsMetaTag, cmsAspectClass, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsWidthClass, createCmsTranslator } from "./cms.js";
|
|
39
|
+
import { CmsAdminBarSchema, CmsAlternateSchema, CmsAspectRatio, CmsAutosaveResult, CmsBlockSchema, CmsBlockStyle, CmsBreadcrumbSchema, CmsBuiltInBlocks, CmsCallToActionBlockData, CmsColumnsBlockData, CmsEditorStatusSchema, CmsEmbedBlockData, CmsFaqBlockData, CmsFeatureSchema, CmsFeaturesBlockData, CmsFormBlockData, CmsGalleryBlockData, CmsHeroBlockData, CmsImageBlockData, CmsImageSchema, CmsLinkSchema, CmsLivePreviewSchema, CmsMenuItemSchema, CmsMenuSchema, CmsPageProps, CmsPageSchema, CmsPayload, CmsRichTextBlockData, CmsSectionBlockData, CmsSeoSchema, CmsSiteDesign, CmsSiteSchema, CmsTestimonialSchema, CmsTestimonialsBlockData } from "./schema/cms.js";
|
|
40
|
+
import { CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, CmsHeadTags, CmsLinkTag, CmsMetaTag, cmsAspectClass, cmsBlockAttributes, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsDesignCss, cmsDesignLinks, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsWidthClass, createCmsTranslator } from "./cms.js";
|
|
41
41
|
import { CMS_PREVIEW_DEVICES, CMS_PREVIEW_STORAGE_KEY, CmsAutosave, CmsAutosaveOptions, CmsAutosaveSnapshot, CmsAutosaveStatus, CmsPreviewDevice, callCmsAutosave, cmsPreviewFitsBeside, cmsPreviewOpensByDefault, cmsPreviewOpensOnLoad, cmsPreviewPaneWidth, rememberedCmsPreview, reserveCmsPreviewSpace } from "./cms-live-preview.js";
|
|
42
42
|
import { CodeToken, CodeTokenKind, countCodeLines, highlightCode, isHighlightedLanguage } from "./code-highlight.js";
|
|
43
43
|
import { Appearance, BUILT_IN_COLORS, SEMANTIC_COLORS, applyAppearance, applyPanelColors, applyPanelFavicon, applyPanelTheme, customColorClasses, getStoredAppearance, initializeAppearance, isCustomColorName, panelAppearance, resolveAppearance, setAppearance, sidebarDefaultOpen } from "./theme.js";
|
|
@@ -133,4 +133,4 @@ import { applyMask } from "./utils/mask.js";
|
|
|
133
133
|
import { PathSegment, deletePath, getPath, hasPath, joinPath, parentPath, replacePlaceholder, setPath, splitPath, templateForIndex } from "./utils/path.js";
|
|
134
134
|
import { DEFAULT_VIRTUALIZE_THRESHOLD, VIRTUAL_ESTIMATES, VirtualList, VirtualListOptions, VirtualRange, firstErroredItemIndex, hasNewErrors, virtualizeOptions } from "./virtual.js";
|
|
135
135
|
import { WIZARD_STEP_QUERY_KEY, completedStepIcon, initialWizardStep, persistWizardStep, wizardRequestedStepIndex, wizardStepFieldPaths, wizardStepQueryKey } from "./wizard.js";
|
|
136
|
-
export { ACTION_PATH_SEPARATOR, ACTIVE_TAB_QUERY_KEY, AI_COPILOT_REGISTRY_KEY, AI_STREAM_REGISTRY_KEY, ALL_SELECTED_RECORDS_ARGUMENT, ActionButtonSize, ActionContext, ActionGroupSchema, ActionModalCancelledResponse, ActionModalSchema, ActionResultEditor, ActionResultFlash, ActionRunner, ActionRunnerOptions, ActionRunnerState, ActionSchema, ActionVariant, ActionsComponentSchema, Affixes, AiActionStatus, AiConversationSchema, AiCopilotSchema, AiMessageRole, AiMessageSchema, AiProposedActionSchema, AiSetupNoticeSchema, AiStreamController, AiStreamOptions, AiStreamSchema, AiStreamState, AiStreamStatus, AlfakitFlash, AlfakitOptions, AlfakitPageProps, Alignment, AnalyticsBreakdownRowSchema, AnalyticsBreakdownTabSchema, AnalyticsBreakdownWidgetSchema, AnalyticsTracker, AnalyticsTrackerOptions, AnyActionSchema, AnyPaginationSchema, Appearance, AppendingPaginationSchema, Attributes, BOTTOM_NAVIGATION_SLOTS, BROADCAST_NOTIFICATION, BUILT_IN_COLORS, BUILT_IN_WIDGET_TYPES, BaseColumnSchema, BaseComponent, BaseEntry, BaseField, BaseWidgetSchema, BlockProps, BottomNavigationItems, BreadcrumbSchema, Breakpoint, Breakpoints, BuilderBlockGroup, BuilderBlockSchema, BuilderItemSchema, BuilderItemState, BuilderPickerRect, BuilderSchema, BulkToggleActionSchema, CALENDAR_ARGUMENTS_KEY, CALENDAR_EVENT_DROP_ACTION, CALENDAR_EVENT_RESIZE_ACTION, CALENDAR_FETCH_EVENTS_ACTION, CALENDAR_REGISTRY_KEY, CLOSE_NOTIFICATION_EVENT, CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, CMS_PREVIEW_DEVICES, CMS_PREVIEW_STORAGE_KEY, COMMANDS_COMPONENT, CONFLICT_ERROR_KEY, CONSTRAINT_PICKER_WIDTH_CLASSES, CONTAINER_BREAKPOINTS, CREATE_ANOTHER_ARGUMENT, CalendarChangeResult, CalendarEnvironment, CalendarEventApi, CalendarEventChangeInfo, CalendarEventClickInfo, CalendarEventSchema, CalendarFetchInfo, CalendarSelectInfo, CalendarView, CalendarWidgetSchema, CallPageMethodOptions, CalloutSchema, CellSchema, ChartConfigInput, ChartConfigOutput, ChartEmptyStateSchema, ChartFiltersFormSchema, ChartFormatter, ChartWidgetSchema, CheckboxColumnSchema, CheckboxListSchema, CheckboxSchema, CmsAdminBarSchema, CmsAlternateSchema, CmsAspectRatio, CmsAutosave, CmsAutosaveOptions, CmsAutosaveResult, CmsAutosaveSnapshot, CmsAutosaveStatus, CmsBlockSchema, CmsBreadcrumbSchema, CmsBuiltInBlocks, CmsCallToActionBlockData, CmsColumnsBlockData, CmsEditorStatusSchema, CmsEmbedBlockData, CmsFaqBlockData, CmsFeatureSchema, CmsFeaturesBlockData, CmsFormBlockData, CmsGalleryBlockData, CmsHeadTags, CmsHeroBlockData, CmsImageBlockData, CmsImageSchema, CmsLinkSchema, CmsLinkTag, CmsLivePreviewSchema, CmsMenuItemSchema, CmsMenuSchema, CmsMetaTag, CmsPageProps, CmsPageSchema, CmsPayload, CmsPreviewDevice, CmsRichTextBlockData, CmsSectionBlockData, CmsSeoSchema, CmsSiteSchema, CmsTestimonialSchema, CmsTestimonialsBlockData, CodeEditorSchema, CodeEntrySchema, CodeToken, CodeTokenKind, Color, ColorColumnSchema, ColorEntrySchema, ColorFormat, ColorPickerSchema, ColumnGroupHeaderCell, ColumnGroupSchema, ColumnLayoutColumnRef, ColumnLayoutNode, ColumnLayoutSchema, ColumnManagerPosition, ColumnProps, ColumnSchema, ColumnSpanValue, ColumnSummariesSchema, CommandPaletteLinkSchema, CommandPaletteResponse, CommandPaletteSchema, CommandSchema, ComponentDiscovery, ComponentRegistry, ConflictField, ConflictMonitor, ConflictMonitorOptions, ConflictMonitorState, ConflictsSchema, ConstraintPickerSection, ContainerBreakpoint, ContentBlock, ContentSlotItem, ContentSlotName, ContentSlotSchema, ContentSlots, CopilotController, CopilotControllerOptions, CopilotState, CopilotTotals, CopilotView, CropHandle, CropRect, CursorPaginationSchema, CustomBlockGroup, CustomBlockNodeOptions, CustomBlockPreview, CustomBlockResult, CustomWidgetSchema, DATABASE_NOTIFICATIONS_EVENT, DATABASE_NOTIFICATIONS_SENT, DEFAULT_ACTION_QUERY_KEYS, DEFAULT_LINK_PROTOCOLS, DEFAULT_VIRTUALIZE_THRESHOLD, DISCOVERY_FOLDERS, DashboardCustomizeSchema, DashboardEditor, DashboardEditorOptions, DashboardEditorState, DashboardLayoutEntry, DashboardLibraryWidget, DashboardMove, DashboardSpanOption, DashboardTranslator, DatabaseNotificationsResponse, DatePickerSchema, Debounced, DebugClosure, DebugDeprecation, DebugNode, DebugRecorder, DebugRequest, DebugRequestOutcome, DebugSchema, DebugServerTimings, DebugState, DefaultActionOpener, DefaultActionSchema, DeferredBadgeSchema, DeferredRequestOptions, DeferredTabBadges, DeprecationOptions, DevToolsClass, DevToolsContext, DevToolsSchema, Direction, DiscoveredEntry, DiscoveryFolder, DiscoveryKey, DiscoveryModules, DiscoveryOptions, DropdownPlacement, EchoChannelLike, EchoConnectionOptions, EchoEventChannel, EchoFactory, EchoLike, EchoPresenceChannelLike, EchoWithChannels, EditConflict, EditableColumnSchema, EditorAttachments, EditorSuggestions, EmptyStateComponentSchema, EmptyStateSchema, EntryProps, EntrySchema, ErrorNotificationEntrySchema, ErrorNotificationsSchema, ExecuteOptions, FIELD_ACTION_PREFIX, FIELD_TYPES, FILAMENT_CLOSE_NOTIFICATION_EVENT, FILE_MANAGER_DRAG_TYPE, FILE_MANAGER_PICKER_REGISTRY_KEY, FILE_MANAGER_REGISTRY_KEY, FILTERS_FORM_WIDTH_CLASSES, FILTERS_MODAL_WIDTH_CLASSES, FILTERS_SIDEBAR_WIDTH_CLASSES, FieldActionContextOptions, FieldActionResponse, FieldActions, FieldAriaAttributes, FieldAriaSource, FieldDescriptionIds, FieldProps, FieldSchema, FieldsetSchema, FileManagerActionNames, FileManagerBreadcrumbSchema, FileManagerClick, FileManagerController, FileManagerDataTransfer, FileManagerDetailsSchema, FileManagerDialog, FileManagerEntrySchema, FileManagerEnvironment, FileManagerFolderSchema, FileManagerKeyEvent, FileManagerKeyResult, FileManagerKind, FileManagerLinkSchema, FileManagerListingSchema, FileManagerPermissionsSchema, FileManagerPickedFileSchema, FileManagerPickerSchema, FileManagerPreviewSchema, FileManagerPreviewState, FileManagerResult, FileManagerSchema, FileManagerSort, FileManagerSortField, FileManagerState, FileManagerUpload, FileManagerUploader, FileUploadImageEditorSchema, FileUploadPositions, FileUploadSchema, FilterFormSync, FilterIndicator, FilterSchema, FiltersFormWidth, FiltersPlacement, FlashNotificationTracker, FlatNavigationItem, FlexSchema, FloatingToolbarEditor, FloatingToolbarState, FormBlock, FormPayload, FormState, FormStore, FormStoreOptions, FormattedStateProps, FusedGroupSchema, GLOBAL_SEARCH_DEBOUNCE, GRID_MAX_COLUMNS, GRID_MIN_COLUMNS, GlobalSearchGroupSchema, GlobalSearchResultSchema, GridBounds, GridCell, GridLayoutSchema, GridSchema, GroupSchema, GroupedTableRow, GuardedVisit, HELPDESK_ACTIVITY_EVENT, HELPDESK_SHORTCUTS, HELPDESK_TYPING_MS, HeadingTag, HelpdeskActivity, HelpdeskAttachment, HelpdeskBadge, HelpdeskChatClient, HelpdeskChatConfig, HelpdeskChatConversation, HelpdeskChatMessage, HelpdeskChatOptions, HelpdeskChatResponse, HelpdeskChatState, HelpdeskComposerMode, HelpdeskInboxController, HelpdeskInboxEnvironment, HelpdeskInboxList, HelpdeskInboxSchema, HelpdeskInboxState, HelpdeskMessage, HelpdeskSla, HelpdeskTicket, HelpdeskTicketSummary, HelpdeskView, HiddenSchema, HtmlSchema, HttpError, IMAGE_EDITOR_ZOOM_STEP, ITEM_MOVE_ATTRIBUTE, IconCellItem, IconColumnSchema, IconEntrySchema, IconName, IconPickerOption, IconPickerResponse, IconPickerSchema, IconPickerSearch, IconPickerSearchState, IconPickerSetSchema, IconPickerSource, IconPosition, IconSchema, IconSource, ImageCellSchema, ImageColumnSchema, ImageEditor, ImageEditorData, ImageEditorDragMode, ImageEditorMode, ImageEditorOptions, ImageEditorPoint, ImageEditorState, ImageEntrySchema, ImageGeometry, ImageSchema, ImageStackProps, ImageTransformOptions, ImpersonationSchema, ImplicitSubmitEvent, IndexedState, InfolistBlock, ItemActionFallback, ItemActionName, ItemActionSchema, ItemActionsItemProps, ItemActionsProps, ItemActionsSchema, ItemMoveDirection, ItemMoveTracker, JsonEntry, JsonKind, JsonRequestOptions, JsonSearchResult, KANBAN_NO_LANE, KANBAN_REGISTRY_KEY, KanbanAssigneeSchema, KanbanBadgeSchema, KanbanCardSchema, KanbanColumnSchema, KanbanController, KanbanEnvironment, KanbanFetchResult, KanbanFiltersSchema, KanbanKeyResult, KanbanLaneSchema, KanbanLocation, KanbanMoveResult, KanbanPicked, KanbanPointerOptions, KanbanRefusal, KanbanSchema, KanbanState, KanbanTarget, KanbanWidgetSchema, KeyLike, KeyValueEntrySchema, KeyValueSchema, KeyboardShortcutsSchema, LABEL_SLOTS, LAZY_PROP, LanguageSwitcherPosition, LatestRequest, LayoutSchema, LazyComponentCache, LazyRelationManagerSchema, LazyWidgetSchema, LinksBlock, ListTabSchema, ListTabsProps, Listener, LiveConfig, LivePropsOptions, LiveUpdates, LiveUpdatesOptions, LiveUpdatesSchema, LiveUpdatesState, LoadTableTotalsOptions, LoadedRichEditorExtensions, LocaleFormatter, LocaleSchema, LocalizationSchema, MAX_DEBUG_REQUESTS, MERGE_TAG_TRIGGER, MenuItemSchema, MergedRefresh, ModalTablePaging, ModalTableSelectResponse, ModalTableSelectSchema, MoneyInputSchema, MoneyOptions, NOT_PROSE_CLASS, NavigationBadgeSchema, NavigationGroupSchema, NavigationItemSchema, NavigationStateSchema, NotificationActionSchema, NotificationCenter, NotificationCenterState, NotificationEndpoints, NotificationSchema, NotificationUndoSchema, OPEN_DATABASE_NOTIFICATIONS_EVENT, OneTimeCodeInputSchema, OneTimeCodeSubmitter, OpenModal, Operation, Option, OptionGroup, OptionOrGroup, OptionsGridDirection, PAGE_EXPIRED_STATUS, PALETTE_GROUP_ORDER, PANEL_TOAST_OFFSET, PASSWORD_CONFIRMATION_INPUT, POLL_HEADER, POLL_PROP, PREFETCH_CACHE_FOR, PRESENCE_STATE_WHISPER, PageComponentProps, PageEventsOptions, PageLayout, PageMethodArguments, PageMethodCallOptions, PageMethodError, PageMethodResponse, PageMethodRuntime, PageSchema, PaginationSchema, PaletteGroup, PaletteItem, PaletteItemKind, PaletteLabels, PaletteSources, PanelDesignSchema, PanelEndpoints, PanelLayoutSchema, PanelSchema, PanelThemeSchema, PanelUserSchema, ParsedKeyBinding, PartialFormPayload, PastePlan, PathSegment, PersistStorage, PlaceholderSchema, PollScheduler, PolledComponents, PresenceMember, PresenceRoom, PresenceRoomOptions, PresenceRoomState, PresenceSchema, PresenceState, PwaInstallOutcome, PwaPushOutcome, PwaPushSchema, PwaPushStatus, PwaSchema, PwaState, QueryBuilderConstraintRule, QueryBuilderConstraintSchema, QueryBuilderGroup, QueryBuilderGroupRule, QueryBuilderInput, QueryBuilderOperatorSchema, QueryBuilderRule, QueryBuilderRulesSchema, RECORD_CHANGED_EVENT, RECORD_VERSION_INPUT, RELATION_MANAGERS_CONTENT_TAB, RELATION_QUERY_KEY, REMAINING_TEXT_SIZE_CLASSES, RadioSchema, RealtimeConfig, RealtimeSchema, RealtimeSubscriptionOptions, RecordChange, RecordKey, RecordVersionChangeSchema, RecordVersionSchema, RecordVersionsSchema, RegisteredShortcut, RelationGroupSchema, RelationManagerSchema, RelationManagerTab, RelationManagersBlock, RelationManagersContentTabSchema, RepeatableEntrySchema, RepeaterItemSchema, RepeaterItemState, RepeaterSchema, RichEditorCustomBlockSchema, RichEditorExtensionLoader, RichEditorMentionSchema, RichEditorMergeTagSchema, RichEditorPanel, RichEditorRemote, RichEditorSchema, RichEditorToolSchema, RichEditorToolbarGroupSchema, RulePath, SCHEMA_CONTRACT_VERSION, SELECTED_RECORDS_ARGUMENT, SEMANTIC_COLORS, SHORTCUT_IDS, SPREADSHEET_CLASSES, SPREADSHEET_ISSUE_MESSAGES, STACKED_TABLE_CLASSES, STARTER_KIT_COPILOT_SHORTCUT, STARTER_KIT_TOASTER_ID, SchemaBlock, SchemaComponent, SchemaComponentContext, SchemaComponentContextValue, SchemaComponentProps, SchemaContractCheck, SchemaPatch, SchemaRefreshResponse, SectionSchema, SelectColumnSchema, SelectOptionsResponse, SelectSchema, SelectionLimits, SelectionState, ShortcutDefinition, ShortcutGroup, ShortcutListGroup, ShortcutListItem, ShortcutOptions, ShortcutRecorder, ShortcutRegistry, ShortcutRegistryOptions, SimplePaginationSchema, Size, SliderBehavior, SliderNonLinearPoint, SliderPip, SliderPipSchema, SliderSchema, SlotDataValue, SlotItemSchema, SonnerPosition, SplitLayoutSchema, SpreadsheetAnnouncement, SpreadsheetCellKind, SpreadsheetChange, SpreadsheetColumn, SpreadsheetEdit, SpreadsheetGrid, SpreadsheetKey, SpreadsheetKeyResult, SpreadsheetRow, SpreadsheetSaveResult, SpreadsheetState, StackLayoutSchema, StandaloneComponentSchema, StandaloneComponentState, StandaloneDefaults, StarterKitBreadcrumb, StarterKitDashboardWidgetsSchema, StarterKitNavGroup, StarterKitNavItem, StarterKitNavigationSchema, StarterKitUserMenuItem, StarterKitWidgets, StarterKitWidgetsSchema, StatSchema, StatsOverviewWidgetSchema, StepSchema, StepValidationHaltedResponse, Store, StreamAnnouncer, StreamEvent, SubNavigationSchema, SuggestionEditor, SuggestionItem, SuggestionMatch, SuggestionState, SummaryValueSchema, TABLE_TOOLBAR_BUTTONS, TENANT_MENU_COMPONENT, TOOLBAR_COMMANDS, TRANSLATION_MANAGER_REGISTRY_KEY, TREE_REGISTRY_KEY, TabSchema, TableBlock, TableColumnSchema, TableDeferredTotalsSchema, TableEndpoints, TableGroupOptionSchema, TableGroupingSchema, TablePersistedStateKey, TableQuery, TableRecordGroupSchema, TableRecordSchema, TableSchema, TableSelection, TableSortSchema, TableSpreadsheetSchema, TableSummariesSchema, TableSummaryRowSchema, TableTotalsSchema, TableTriggerActionKey, TableTriggerActionSchema, TableTriggerModalSchema, TableViewItemSchema, TableViewOperation, TableViewResponse, TableViewsSchema, TableVisitCallbacks, TableWidgetSchema, TabsSchema, TagsInputSchema, TemporaryUploadOptions, TemporaryUploadResult, TenantSchema, TextAlignment, TextColumnSchema, TextEdit, TextEntrySchema, TextInputColumnSchema, TextInputSchema, TextSchema, TextStyleProps, TextareaSchema, ToastPosition, ToggleButtonsSchema, ToggleColumnSchema, ToggleSchema, ToolCommandContext, ToolbarCommand, ToolbarContext, ToolbarEditor, ToolbarKeyboardOptions, TranslatableLocaleSchema, TranslatableSchema, TranslationCellRef, TranslationCellSchema, TranslationFilter, TranslationHistoryEntry, TranslationHistoryState, TranslationKeyResult, TranslationLocaleSchema, TranslationManagerController, TranslationManagerEnvironment, TranslationManagerSchema, TranslationManagerState, TranslationProgressSchema, TranslationRowSchema, TranslationRowsResult, TranslationSaveResult, TranslationSuggestionSchema, Translator, TreeController, TreeDropPosition, TreeEnvironment, TreeKeyResult, TreeMove, TreeNodeSchema, TreeRow, TreeSaveResult, TreeSchema, TreeState, TreeStructureItem, TreeWidgetSchema, TriggerButtonDefaults, TriggerButtonView, USER_MENU_COMPONENT, UndoShortcuts, UnorderedListSchema, UploadedFile, VIRTUAL_ESTIMATES, VerticalAlignment, ViewColumnSchema, ViewEntrySchema, ViewSchema, VirtualList, VirtualListOptions, VirtualRange, VirtualizeSchema, WIZARD_STEP_QUERY_KEY, WidgetProps, WidgetSchema, WidgetsBlock, Width, WizardProgress, WizardSchema, acquireChannel, actionEndpoint, actionFormComponent, actionFormParams, actionPath, actionsAccessSelectedRecords, actionsAlignmentClass, activeTableView, addActionJustify, addGroup, addRule, allToolbarButtons, analyticsAllowed, analyticsChangeColor, analyticsInitialTab, announceDatabaseNotificationsSent, appendRepeaterItem, applyAppearance, applyBodyAttributes, applyDocumentLocale, applyEditorActionResult, applyFormRefresh, applyMask, applyPanelColors, applyPanelFavicon, applyPanelTheme, applyPwaUpdate, applySchemaPatches, ariaSort, asHelpdeskActivity, attachKanbanPointer, attachToolbarKeyboard, beginTableLoading, bindUndo, bindingFromEvent, bindsKeyBindings, bottomNavigationItems, buildChartConfig, buildQuery, buildTableUrl, builderBlockCounts, builderItemLabel, builderItemSchema, builderItems, builderPickerMove, byteLength, cachedTableTotals, calendarActionContext, calendarIdentity, calendarOptions, calendarWallTime, callCmsAutosave, callPageMethod, canAddBuilderBlock, canEditImage, canEditImageName, canInstallPwa, canNestGroup, canSelectAllRecords, cancelChunkedUpload, chartColorVariable, chartFiltersUrl, checkSchemaContract, clearRichEditorExtensions, clientErrorNotification, cloneIndexedState, cloneRepeaterItem, cloneTreeNodes, closeNotification, cmsAspectClass, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsPreviewFitsBeside, cmsPreviewOpensByDefault, cmsPreviewOpensOnLoad, cmsPreviewPaneWidth, cmsWidthClass, coerceSpreadsheetValue, collapsesLanguageSwitcher, collectFieldStatePaths, collectFields, colorAlpha, colorToHex, columnDraftChanged, columnGroupHeaderRow, columnManagerPosition, columnOrderChanged, columnOrderClasses, columnRegistryKey, columnSpanClasses, columnStartClasses, columnVisibilityClasses, commandLabel, commandPaletteItems, commandShortcutId, completedStepIcon, componentHasErrors, concurrencyLimiter, configureCharts, configureRealtime, confirmModalClose, conflictMessage, constraintPickerClasses, constraintPickerSections, containerColumnSpanClasses, containerGridColumnsClasses, copilotBlocks, countCodeLines, createAnalyticsTracker, createAnotherState, createCmsTranslator, createKanbanFiltersStore, createLatestRequest, createRule, createSchemaComponentContext, createStore, csrfHeader, cssAspectRatio, currencyDecimals, currentPageQuery, currentRecordVersion, currentSocketId, currentStarterKitPanel, currentStarterKitPanelId, customBlockNodeConfig, customColorClasses, customPageProps, dashboardMoveForKey, debounce, debugRecorder, defaultActionContext, defaultActionKey, defaultVisibleColumns, deferredComponentReference, deferredHasErrors, deletePath, deprecate, deprecationMessage, derived, detailsNodeConfigs, discoveryKey, distributePageFormErrors, documentNonce, dropTreeNode, editableImageName, effectiveErrorNotifications, endTableLoading, errorNotificationOutcome, extremePageLinks, fetchEditableImage, fetchStandaloneComponents, fieldActionComponent, fieldActionContext, fieldAria, fieldDomId, fieldError, fieldIds, fieldMemory, fileAttachmentError, fileManagerAcceptAttribute, fileManagerAccepts, fileManagerErrorMessage, fileManagerExpiry, fileManagerSize, fileUploadAccept, fileUploadEntries, fileUploadPaths, filesFromClipboard, filterBuilderBlocks, filterCommandPalette, filterFormComponents, filterQueryBuilderOptions, filterSelectColumnOptions, filterSuggestionItems, filterTenants, filtersAreDeferred, filtersCollapsible, filtersFormWidthClass, filtersPlacement, findAutofocusField, findConstraint, findFieldByPath, findGridContext, findOperator, findPageFormBlock, findStandalonePropName, findSuggestionMatch, firstErroredItemIndex, firstErrors, fixedContainingBlockOffset, flattenActionGroup, flattenNavigationItems, flattenTreeStructure, flexItemClasses, flexLayoutClasses, floatingToolbarStyle, focusAutofocusField, focusMovedItem, focusTableSearch, focusToolbar, forgetFieldMemory, formActionsVisible, formIdPrefix, formIdentity, formRefreshFor, formatBytes, formatColor, formatKeyBinding, formatPhpDate, formatShortcut, fuzzyScore, getChartFormatters, getChartPlugins, getConflictForm, getEcho, getPageForm, getPath, getScriptData, getStoredAppearance, globalSearchDebounce, globalSearchStatus, globalSearchSuffix, gridColumnsClasses, gridContent, gridNodeConfigs, groupAt, groupBuilderBlocks, groupCustomBlocks, groupMenuItems, groupTableRows, groupTableViews, groupTriggerButton, guardModalUnload, hasActiveNavigationItem, hasCommandPalette, hasContainerBreakpoints, hasDevTools, hasMobilePreset, hasNewErrors, hasPath, hasRelationManagerTabs, hasRichEditorExtension, hasSlots, hasThemeSwitcher, hasTopbar, headingTag, helpdeskChatString, helpdeskFileSize, helpdeskSlaTone, highlightCode, highlightMarkConfig, htmlLabelToText, htmlToMarkdown, iconAlias, iconAliasOverride, iconButtonSize, iconGridMove, iconPickerPreview, iconSource, imageEditorOptionsKey, imageGeometry, indentCode, inertiaPost, inertiaReload, inertiaVisit, initialCollapsedGroups, initialTranslatableLocale, initialWizardStep, initializeAppearance, initials, insertBuilderItem, insertUploadedFile, inspectableProps, installErrorNotifications, installPrefetchInvalidation, installSpaUrlExceptions, installStarterKitRuntime, interpolate, invalidatePrefetchedPages, invalidateTableTotals, isActionGroup, isActionLoading, isActionProcessing, isAlfakitPage, isAllowedLinkUrl, isAppendingPagination, isCustomBlockResult, isCustomColorName, isCustomSvgIcon, isDeferredPlaceholder, isEditableTarget, isField, isFieldActionContext, isGroupedColumn, isHighlightedLanguage, isIconAlias, isImplicitSubmit, isIosSafari, isLazyPlaceholder, isLeavingVisit, isMacLike, isModalHiddenByChild, isModalSubmitVisible, isMutatingRequest, isNavigationItemActive, isOptionGroup, isPageFullySelected, isPartialFormPayload, isRealtimeEnabled, isRightToLeft, isSafeColor, isStandalone, isStandaloneComponent, isStarterKitPanel, isTableLoading, isToolbarGroup, isToolbarShortcut, isUndoFinished, isUndoShortcut, isValidShortcut, itemActionContext, itemActionIcon, itemExtraActions, joinPath, jsonEntries, jsonKind, jsonScalar, jsonSize, kanbanActiveFilters, kanbanCardPosition, kanbanCardsIn, kanbanInitials, kanbanMovePayload, kanbanRefusal, kanbanWipState, keepMoveButtonFocus, latestServerTiming, layoutColumnNames, layoutNodeGrows, layoutVisibilityClasses, lazyComponentCache, lazyComponents, leadExtensionConfig, limitedListItems, linkExtensionOptions, listTabIds, listTabUrl, listenForPageEvents, listenForRecordChanges, loadDeferredBadge, loadDeferredComponent, loadEditorImage, loadRichEditorExtensions, loadScript, loadStarterKitPanel, loadStyle, loadTableTotals, loadedStarterKitPanel, locateKanbanCard, logicalArrowKey, markFailedLazyWidgets, markRecordSubmitted, matchesKeyBinding, matchesShortcutStep, matchesUrlPattern, maxColumns, mentionNodeConfig, mentionText, menuActionContext, mergeAttributes, mergeChartOptions, mergeDeferredComponent, mergePolledComponents, mergeRefreshResponse, mergeStatePatch, mergeTagNodeConfig, mergeTagText, mobileCardLayout, mobileTable, modalFooterAlignment, modalTablePaging, modalTableQuery, modalTableSelected, moveColumn, moveColumnInManager, moveColumnTo, moveIndexedState, moveKanbanCard, moveListItem, moveRepeaterItem, moveTreeNode, navigationItemText, navigationItemUrl, nestedActionContext, newlineWithIndent, nextPageQuery, nextToolbarItem, normalizeRichEditorExtensions, normalizeRuleTree, notificationTintStyles, observeThemeChanges, onCloseNotification, onDatabaseNotificationsSent, onOpenDatabaseNotifications, onPageFormsChanged, onSaveConflict, oneTimeCodeDigits, openDatabaseNotifications, openDefaultAction, openRequestedStarterKitSearch, optimistic, optionText, orderColumnsBy, overlayPlacementDirection, pageFlash, pageFormName, pageSelectionState, paginationTotal, paletteGroupKey, panelAppearance, panelUploadOptions, parentPath, parseAspectRatio, parseDropdownPlacement, parseEventStream, parseGridColumns, parseInterval, parseKeyBinding, parseServerTiming, parseTsv, performUndo, persistWizardStep, pickerFilterFormOptions, pollComponent, pollPageProps, pollScheduler, postFormWithProgress, preferCurrentStarterKitPanel, prefetchTablePage, presenceInitials, prettyJson, previousPageQuery, primaryColumnName, promptPwaInstall, propsPollScheduler, pwaStore, queryBuilderInputType, queryBuilderOptions, readEventStream, readPersisted, realtimeHeaders, realtimeSettings, recordActionsAtStart, registerChartFormatters, registerChartPlugins, registerConflictForm, registerFormSubmitter, registerKeyBindings, registerPageForm, registerRichEditorExtensions, registerShortcut, registerStandaloneProp, registerStarterKitCopilotShortcut, registerStarterKitSearchShortcut, registerTablePersistence, relationGroupBadgeTarget, relationManagerBadgeTarget, relationManagerTabs, relationTabFromQuery, relationTabSlug, reloadExpiredPage, reloadOnExpiredPage, reloadPageProps, reloadPolledComponents, remainingTextSizeClass, rememberedCmsPreview, removeAllFilterIndicators, removeFilterIndicator, removeIndexedState, removeRepeaterItem, removeRule, reorderOffset, reorderTable, reorderedItemKeys, reorderingListsAllRecords, replaceComponentByKey, replacePlaceholder, reportRequestError, reportSaveConflict, reportSchemaContractMismatch, reportWizardProgress, reportedDeprecations, requestJson, requestStarterKitCopilot, requestStarterKitLanguages, requestStarterKitSearch, requestTableView, requiresFullPageLoad, reserveCmsPreviewSpace, resetChartRegistrations, resetDeprecations, resetPwa, resetRealtime, resetSchemaContractReports, resetStarterKitPanels, resetTableTotals, resizableImageAttributes, resizableImageOptions, resolveActionSize, resolveAppearance, resolveChartCallbacks, resolveContainerStatePath, resolveCssColor, resolveDeferredBadge, resolveDeferredGroupBadge, resolveEcho, resolveErrorNotification, resolveFirst, resolveFloatingToolbar, resolveItemAction, resolveLazyComponents, resolveNavigation, resolvePanelNavigation, resolvePartialProps, resolveRequestErrorNotification, resolveStatePath, resolveStickyOffset, resolveToastPosition, revealAutofocusField, router, runEditorCommands, runPageMethod, runsItemActionOnServer, saveColumnOrder, saveShortcutOverrides, saveSpreadsheetChanges, scheduleAutofocus, schemaComponentNames, schemaContractMajor, schemaContractMismatchMessage, schemaGapClass, scorePaletteItem, searchJson, searchTableColumnOptions, selectAllState, selectColumnEmptyMessage, selectPlural, selectedRecordsArguments, setAppearance, setCombinator, setIconAliases, setPath, setRecordVersion, setRequestErrorReporter, setTextColor, shortcutOverlayGroups, shortcutSteps, shortcuts, shortcutsClash, shouldChunkUpload, shouldConfirmModalClose, shouldResyncForm, shownRecordKeys, showsLanguageSwitcher, showsTableToolbar, sidebarDefaultOpen, sidebarWidthStyle, skeletonRowCount, slideOverSide, sliderBehavior, sliderBlocksTap, sliderBounds, sliderDirection, sliderFillSections, sliderFillStyle, sliderFromPrimitive, sliderHasTooltips, sliderNextValues, sliderPercent, sliderPips, sliderPrimitive, sliderShift, sliderShowsTooltip, sliderSnap, sliderState, sliderToPrimitive, sliderValueAt, sliderValues, slotAlignmentClass, slotDataMatches, slotItems, smallMarkConfig, splitClasses, splitPath, spreadsheetAnnouncement, spreadsheetAria, spreadsheetCellClass, spreadsheetCellId, spreadsheetCellKey, spreadsheetCellKind, spreadsheetColumns, spreadsheetRows, spreadsheetSelectionSize, stackClasses, stackedCellClasses, stackedImageStyle, standaloneDirection, standalonePageSchema, standalonePanelSchema, standaloneWidgetCount, startAnalytics, startDownload, startPwa, startSliderRangeDrag, startTableReordering, startUndoCountdown, starterKitBreadcrumbsFromProps, starterKitCopilot, starterKitDashboardWidgets, starterKitNavigation, starterKitNavigations, starterKitPanelLocale, starterKitWidgets, starterKitWidgetsPage, starterKitWidgetsPanel, stickyCollisionPadding, stopTableReordering, submitFormById, subscribeToNotifications, subscribeToPush, subscriptMarkConfig, superscriptMarkConfig, switchLocale, syncStarterKitPage, syncToolbarTabStops, t, tabFromQuery, tabKeyTarget, tabQueryValue, tabToReveal, tableColumnAlignmentClass, tableColumnCells, tableLoadingStore, tableQueryKey, tableTotalsFailed, tableTotalsStore, tableViewError, tableViewFollowUp, tableViewUrl, takeRequestedStarterKitCopilot, takeRequestedStarterKitLanguages, templateForIndex, tenantNameText, textAlignExtensionConfig, textColorMarkConfig, timeInputStep, toAsciiDigits, toEditorDocument, toStarterKitBreadcrumbs, toStarterKitNavGroups, toStarterKitUserMenuItems, toTsv, toggleButtonsNext, toggleButtonsSelected, toggleCollapsedGroup, toggleModalTableKey, togglePushNotifications, toggleVisibleColumn, toolCommand, toolbarButtonLabel, toolbarCommands, toolbarItems, toolbarPanel, trackAnalyticsEvent, transformImage, translatableLocaleField, translatableLocalesWithErrors, translationCellValue, translator, treeParentKeys, treeSubtreeHeight, triggerButtonView, undoShortcuts, uniqueId, unsubscribeFromPush, updateGroup, updateRule, updateTableCell, uploadPageMethodFiles, uploadTemporaryFile, uploadWithProgress, uploadedFileLinks, urlBase64ToUint8Array, usesDefaultImageStack, usesStarterKitHostLayout, virtualizeOptions, visibleColumns, visiblePresenceMembers, visibleTreeRows, visitTable, visitTableView, wallClockNow, watchPageProps, whenIdle, whenVisible, widgetPollTarget, widgetRegistryKeys, withAlpha, withColorAlpha, withDeferredTabBadges, withEcho, withItemActionState, withTableTotals, withoutDefaultActionQuery, withoutRequired, wizardProgressStore, wizardRequestedStepIndex, wizardStepFieldPaths, wizardStepQueryKey, wizardStepToReveal, writePersisted };
|
|
136
|
+
export { ACTION_PATH_SEPARATOR, ACTIVE_TAB_QUERY_KEY, AI_COPILOT_REGISTRY_KEY, AI_STREAM_REGISTRY_KEY, ALL_SELECTED_RECORDS_ARGUMENT, ActionButtonSize, ActionContext, ActionGroupSchema, ActionModalCancelledResponse, ActionModalSchema, ActionResultEditor, ActionResultFlash, ActionRunner, ActionRunnerOptions, ActionRunnerState, ActionSchema, ActionVariant, ActionsComponentSchema, Affixes, AiActionStatus, AiConversationSchema, AiCopilotSchema, AiMessageRole, AiMessageSchema, AiProposedActionSchema, AiSetupNoticeSchema, AiStreamController, AiStreamOptions, AiStreamSchema, AiStreamState, AiStreamStatus, AlfakitFlash, AlfakitOptions, AlfakitPageProps, Alignment, AnalyticsBreakdownRowSchema, AnalyticsBreakdownTabSchema, AnalyticsBreakdownWidgetSchema, AnalyticsTracker, AnalyticsTrackerOptions, AnyActionSchema, AnyPaginationSchema, Appearance, AppendingPaginationSchema, Attributes, BOTTOM_NAVIGATION_SLOTS, BROADCAST_NOTIFICATION, BUILT_IN_COLORS, BUILT_IN_WIDGET_TYPES, BaseColumnSchema, BaseComponent, BaseEntry, BaseField, BaseWidgetSchema, BlockProps, BottomNavigationItems, BreadcrumbSchema, Breakpoint, Breakpoints, BuilderBlockGroup, BuilderBlockSchema, BuilderItemSchema, BuilderItemState, BuilderPickerRect, BuilderSchema, BulkToggleActionSchema, CALENDAR_ARGUMENTS_KEY, CALENDAR_EVENT_DROP_ACTION, CALENDAR_EVENT_RESIZE_ACTION, CALENDAR_FETCH_EVENTS_ACTION, CALENDAR_REGISTRY_KEY, CLOSE_NOTIFICATION_EVENT, CMS_BLOCK_PREFIX, CMS_BUILT_IN_BLOCKS, CMS_FOOTER_KEY, CMS_FORM_KEY, CMS_HEADER_KEY, CMS_PAGE_COMPONENT, CMS_PREVIEW_DEVICES, CMS_PREVIEW_STORAGE_KEY, COMMANDS_COMPONENT, CONFLICT_ERROR_KEY, CONSTRAINT_PICKER_WIDTH_CLASSES, CONTAINER_BREAKPOINTS, CREATE_ANOTHER_ARGUMENT, CalendarChangeResult, CalendarEnvironment, CalendarEventApi, CalendarEventChangeInfo, CalendarEventClickInfo, CalendarEventSchema, CalendarFetchInfo, CalendarSelectInfo, CalendarView, CalendarWidgetSchema, CallPageMethodOptions, CalloutSchema, CellSchema, ChartConfigInput, ChartConfigOutput, ChartEmptyStateSchema, ChartFiltersFormSchema, ChartFormatter, ChartWidgetSchema, CheckboxColumnSchema, CheckboxListSchema, CheckboxSchema, CmsAdminBarSchema, CmsAlternateSchema, CmsAspectRatio, CmsAutosave, CmsAutosaveOptions, CmsAutosaveResult, CmsAutosaveSnapshot, CmsAutosaveStatus, CmsBlockSchema, CmsBlockStyle, CmsBreadcrumbSchema, CmsBuiltInBlocks, CmsCallToActionBlockData, CmsColumnsBlockData, CmsEditorStatusSchema, CmsEmbedBlockData, CmsFaqBlockData, CmsFeatureSchema, CmsFeaturesBlockData, CmsFormBlockData, CmsGalleryBlockData, CmsHeadTags, CmsHeroBlockData, CmsImageBlockData, CmsImageSchema, CmsLinkSchema, CmsLinkTag, CmsLivePreviewSchema, CmsMenuItemSchema, CmsMenuSchema, CmsMetaTag, CmsPageProps, CmsPageSchema, CmsPayload, CmsPreviewDevice, CmsRichTextBlockData, CmsSectionBlockData, CmsSeoSchema, CmsSiteDesign, CmsSiteSchema, CmsTestimonialSchema, CmsTestimonialsBlockData, CodeEditorSchema, CodeEntrySchema, CodeToken, CodeTokenKind, Color, ColorColumnSchema, ColorEntrySchema, ColorFormat, ColorPickerSchema, ColumnGroupHeaderCell, ColumnGroupSchema, ColumnLayoutColumnRef, ColumnLayoutNode, ColumnLayoutSchema, ColumnManagerPosition, ColumnProps, ColumnSchema, ColumnSpanValue, ColumnSummariesSchema, CommandPaletteLinkSchema, CommandPaletteResponse, CommandPaletteSchema, CommandSchema, ComponentDiscovery, ComponentRegistry, ConflictField, ConflictMonitor, ConflictMonitorOptions, ConflictMonitorState, ConflictsSchema, ConstraintPickerSection, ContainerBreakpoint, ContentBlock, ContentSlotItem, ContentSlotName, ContentSlotSchema, ContentSlots, CopilotController, CopilotControllerOptions, CopilotState, CopilotTotals, CopilotView, CropHandle, CropRect, CursorPaginationSchema, CustomBlockGroup, CustomBlockNodeOptions, CustomBlockPreview, CustomBlockResult, CustomWidgetSchema, DATABASE_NOTIFICATIONS_EVENT, DATABASE_NOTIFICATIONS_SENT, DEFAULT_ACTION_QUERY_KEYS, DEFAULT_LINK_PROTOCOLS, DEFAULT_VIRTUALIZE_THRESHOLD, DISCOVERY_FOLDERS, DashboardCustomizeSchema, DashboardEditor, DashboardEditorOptions, DashboardEditorState, DashboardLayoutEntry, DashboardLibraryWidget, DashboardMove, DashboardSpanOption, DashboardTranslator, DatabaseNotificationsResponse, DatePickerSchema, Debounced, DebugClosure, DebugDeprecation, DebugNode, DebugRecorder, DebugRequest, DebugRequestOutcome, DebugSchema, DebugServerTimings, DebugState, DefaultActionOpener, DefaultActionSchema, DeferredBadgeSchema, DeferredRequestOptions, DeferredTabBadges, DeprecationOptions, DevToolsClass, DevToolsContext, DevToolsSchema, Direction, DiscoveredEntry, DiscoveryFolder, DiscoveryKey, DiscoveryModules, DiscoveryOptions, DropdownPlacement, EchoChannelLike, EchoConnectionOptions, EchoEventChannel, EchoFactory, EchoLike, EchoPresenceChannelLike, EchoWithChannels, EditConflict, EditableColumnSchema, EditorAttachments, EditorSuggestions, EmptyStateComponentSchema, EmptyStateSchema, EntryProps, EntrySchema, ErrorNotificationEntrySchema, ErrorNotificationsSchema, ExecuteOptions, FIELD_ACTION_PREFIX, FIELD_TYPES, FILAMENT_CLOSE_NOTIFICATION_EVENT, FILE_MANAGER_DRAG_TYPE, FILE_MANAGER_PICKER_REGISTRY_KEY, FILE_MANAGER_REGISTRY_KEY, FILTERS_FORM_WIDTH_CLASSES, FILTERS_MODAL_WIDTH_CLASSES, FILTERS_SIDEBAR_WIDTH_CLASSES, FieldActionContextOptions, FieldActionResponse, FieldActions, FieldAriaAttributes, FieldAriaSource, FieldDescriptionIds, FieldProps, FieldSchema, FieldsetSchema, FileManagerActionNames, FileManagerBreadcrumbSchema, FileManagerClick, FileManagerController, FileManagerDataTransfer, FileManagerDetailsSchema, FileManagerDialog, FileManagerEntrySchema, FileManagerEnvironment, FileManagerFolderSchema, FileManagerKeyEvent, FileManagerKeyResult, FileManagerKind, FileManagerLinkSchema, FileManagerListingSchema, FileManagerPermissionsSchema, FileManagerPickedFileSchema, FileManagerPickerSchema, FileManagerPreviewSchema, FileManagerPreviewState, FileManagerResult, FileManagerSchema, FileManagerSort, FileManagerSortField, FileManagerState, FileManagerUpload, FileManagerUploader, FileUploadImageEditorSchema, FileUploadPositions, FileUploadSchema, FilterFormSync, FilterIndicator, FilterSchema, FiltersFormWidth, FiltersPlacement, FlashNotificationTracker, FlatNavigationItem, FlexSchema, FloatingToolbarEditor, FloatingToolbarState, FormBlock, FormPayload, FormState, FormStore, FormStoreOptions, FormattedStateProps, FusedGroupSchema, GLOBAL_SEARCH_DEBOUNCE, GRID_MAX_COLUMNS, GRID_MIN_COLUMNS, GlobalSearchGroupSchema, GlobalSearchResultSchema, GridBounds, GridCell, GridLayoutSchema, GridSchema, GroupSchema, GroupedTableRow, GuardedVisit, HELPDESK_ACTIVITY_EVENT, HELPDESK_SHORTCUTS, HELPDESK_TYPING_MS, HeadingTag, HelpdeskActivity, HelpdeskAttachment, HelpdeskBadge, HelpdeskChatClient, HelpdeskChatConfig, HelpdeskChatConversation, HelpdeskChatMessage, HelpdeskChatOptions, HelpdeskChatResponse, HelpdeskChatState, HelpdeskComposerMode, HelpdeskInboxController, HelpdeskInboxEnvironment, HelpdeskInboxList, HelpdeskInboxSchema, HelpdeskInboxState, HelpdeskMessage, HelpdeskSla, HelpdeskTicket, HelpdeskTicketSummary, HelpdeskView, HiddenSchema, HtmlSchema, HttpError, IMAGE_EDITOR_ZOOM_STEP, ITEM_MOVE_ATTRIBUTE, IconCellItem, IconColumnSchema, IconEntrySchema, IconName, IconPickerOption, IconPickerResponse, IconPickerSchema, IconPickerSearch, IconPickerSearchState, IconPickerSetSchema, IconPickerSource, IconPosition, IconSchema, IconSource, ImageCellSchema, ImageColumnSchema, ImageEditor, ImageEditorData, ImageEditorDragMode, ImageEditorMode, ImageEditorOptions, ImageEditorPoint, ImageEditorState, ImageEntrySchema, ImageGeometry, ImageSchema, ImageStackProps, ImageTransformOptions, ImpersonationSchema, ImplicitSubmitEvent, IndexedState, InfolistBlock, ItemActionFallback, ItemActionName, ItemActionSchema, ItemActionsItemProps, ItemActionsProps, ItemActionsSchema, ItemMoveDirection, ItemMoveTracker, JsonEntry, JsonKind, JsonRequestOptions, JsonSearchResult, KANBAN_NO_LANE, KANBAN_REGISTRY_KEY, KanbanAssigneeSchema, KanbanBadgeSchema, KanbanCardSchema, KanbanColumnSchema, KanbanController, KanbanEnvironment, KanbanFetchResult, KanbanFiltersSchema, KanbanKeyResult, KanbanLaneSchema, KanbanLocation, KanbanMoveResult, KanbanPicked, KanbanPointerOptions, KanbanRefusal, KanbanSchema, KanbanState, KanbanTarget, KanbanWidgetSchema, KeyLike, KeyValueEntrySchema, KeyValueSchema, KeyboardShortcutsSchema, LABEL_SLOTS, LAZY_PROP, LanguageSwitcherPosition, LatestRequest, LayoutSchema, LazyComponentCache, LazyRelationManagerSchema, LazyWidgetSchema, LinksBlock, ListTabSchema, ListTabsProps, Listener, LiveConfig, LivePropsOptions, LiveUpdates, LiveUpdatesOptions, LiveUpdatesSchema, LiveUpdatesState, LoadTableTotalsOptions, LoadedRichEditorExtensions, LocaleFormatter, LocaleSchema, LocalizationSchema, MAX_DEBUG_REQUESTS, MERGE_TAG_TRIGGER, MenuItemSchema, MergedRefresh, ModalTablePaging, ModalTableSelectResponse, ModalTableSelectSchema, MoneyInputSchema, MoneyOptions, NOT_PROSE_CLASS, NavigationBadgeSchema, NavigationGroupSchema, NavigationItemSchema, NavigationStateSchema, NotificationActionSchema, NotificationCenter, NotificationCenterState, NotificationEndpoints, NotificationSchema, NotificationUndoSchema, OPEN_DATABASE_NOTIFICATIONS_EVENT, OneTimeCodeInputSchema, OneTimeCodeSubmitter, OpenModal, Operation, Option, OptionGroup, OptionOrGroup, OptionsGridDirection, PAGE_EXPIRED_STATUS, PALETTE_GROUP_ORDER, PANEL_TOAST_OFFSET, PASSWORD_CONFIRMATION_INPUT, POLL_HEADER, POLL_PROP, PREFETCH_CACHE_FOR, PRESENCE_STATE_WHISPER, PageComponentProps, PageEventsOptions, PageLayout, PageMethodArguments, PageMethodCallOptions, PageMethodError, PageMethodResponse, PageMethodRuntime, PageSchema, PaginationSchema, PaletteGroup, PaletteItem, PaletteItemKind, PaletteLabels, PaletteSources, PanelDesignSchema, PanelEndpoints, PanelLayoutSchema, PanelSchema, PanelThemeSchema, PanelUserSchema, ParsedKeyBinding, PartialFormPayload, PastePlan, PathSegment, PersistStorage, PlaceholderSchema, PollScheduler, PolledComponents, PresenceMember, PresenceRoom, PresenceRoomOptions, PresenceRoomState, PresenceSchema, PresenceState, PwaInstallOutcome, PwaPushOutcome, PwaPushSchema, PwaPushStatus, PwaSchema, PwaState, QueryBuilderConstraintRule, QueryBuilderConstraintSchema, QueryBuilderGroup, QueryBuilderGroupRule, QueryBuilderInput, QueryBuilderOperatorSchema, QueryBuilderRule, QueryBuilderRulesSchema, RECORD_CHANGED_EVENT, RECORD_VERSION_INPUT, RELATION_MANAGERS_CONTENT_TAB, RELATION_QUERY_KEY, REMAINING_TEXT_SIZE_CLASSES, RadioSchema, RealtimeConfig, RealtimeSchema, RealtimeSubscriptionOptions, RecordChange, RecordKey, RecordVersionChangeSchema, RecordVersionSchema, RecordVersionsSchema, RegisteredShortcut, RelationGroupSchema, RelationManagerSchema, RelationManagerTab, RelationManagersBlock, RelationManagersContentTabSchema, RepeatableEntrySchema, RepeaterItemSchema, RepeaterItemState, RepeaterSchema, RichEditorCustomBlockSchema, RichEditorExtensionLoader, RichEditorMentionSchema, RichEditorMergeTagSchema, RichEditorPanel, RichEditorRemote, RichEditorSchema, RichEditorToolSchema, RichEditorToolbarGroupSchema, RulePath, SCHEMA_CONTRACT_VERSION, SELECTED_RECORDS_ARGUMENT, SEMANTIC_COLORS, SHORTCUT_IDS, SPREADSHEET_CLASSES, SPREADSHEET_ISSUE_MESSAGES, STACKED_TABLE_CLASSES, STARTER_KIT_COPILOT_SHORTCUT, STARTER_KIT_TOASTER_ID, SchemaBlock, SchemaComponent, SchemaComponentContext, SchemaComponentContextValue, SchemaComponentProps, SchemaContractCheck, SchemaPatch, SchemaRefreshResponse, SectionSchema, SelectColumnSchema, SelectOptionsResponse, SelectSchema, SelectionLimits, SelectionState, ShortcutDefinition, ShortcutGroup, ShortcutListGroup, ShortcutListItem, ShortcutOptions, ShortcutRecorder, ShortcutRegistry, ShortcutRegistryOptions, SimplePaginationSchema, Size, SliderBehavior, SliderNonLinearPoint, SliderPip, SliderPipSchema, SliderSchema, SlotDataValue, SlotItemSchema, SonnerPosition, SplitLayoutSchema, SpreadsheetAnnouncement, SpreadsheetCellKind, SpreadsheetChange, SpreadsheetColumn, SpreadsheetEdit, SpreadsheetGrid, SpreadsheetKey, SpreadsheetKeyResult, SpreadsheetRow, SpreadsheetSaveResult, SpreadsheetState, StackLayoutSchema, StandaloneComponentSchema, StandaloneComponentState, StandaloneDefaults, StarterKitBreadcrumb, StarterKitDashboardWidgetsSchema, StarterKitNavGroup, StarterKitNavItem, StarterKitNavigationSchema, StarterKitUserMenuItem, StarterKitWidgets, StarterKitWidgetsSchema, StatSchema, StatsOverviewWidgetSchema, StepSchema, StepValidationHaltedResponse, Store, StreamAnnouncer, StreamEvent, SubNavigationSchema, SuggestionEditor, SuggestionItem, SuggestionMatch, SuggestionState, SummaryValueSchema, TABLE_TOOLBAR_BUTTONS, TENANT_MENU_COMPONENT, TOOLBAR_COMMANDS, TRANSLATION_MANAGER_REGISTRY_KEY, TREE_REGISTRY_KEY, TabSchema, TableBlock, TableColumnSchema, TableDeferredTotalsSchema, TableEndpoints, TableGroupOptionSchema, TableGroupingSchema, TablePersistedStateKey, TableQuery, TableRecordGroupSchema, TableRecordSchema, TableSchema, TableSelection, TableSortSchema, TableSpreadsheetSchema, TableSummariesSchema, TableSummaryRowSchema, TableTotalsSchema, TableTriggerActionKey, TableTriggerActionSchema, TableTriggerModalSchema, TableViewItemSchema, TableViewOperation, TableViewResponse, TableViewsSchema, TableVisitCallbacks, TableWidgetSchema, TabsSchema, TagsInputSchema, TemporaryUploadOptions, TemporaryUploadResult, TenantSchema, TextAlignment, TextColumnSchema, TextEdit, TextEntrySchema, TextInputColumnSchema, TextInputSchema, TextSchema, TextStyleProps, TextareaSchema, ToastPosition, ToggleButtonsSchema, ToggleColumnSchema, ToggleSchema, ToolCommandContext, ToolbarCommand, ToolbarContext, ToolbarEditor, ToolbarKeyboardOptions, TranslatableLocaleSchema, TranslatableSchema, TranslationCellRef, TranslationCellSchema, TranslationFilter, TranslationHistoryEntry, TranslationHistoryState, TranslationKeyResult, TranslationLocaleSchema, TranslationManagerController, TranslationManagerEnvironment, TranslationManagerSchema, TranslationManagerState, TranslationProgressSchema, TranslationRowSchema, TranslationRowsResult, TranslationSaveResult, TranslationSuggestionSchema, Translator, TreeController, TreeDropPosition, TreeEnvironment, TreeKeyResult, TreeMove, TreeNodeSchema, TreeRow, TreeSaveResult, TreeSchema, TreeState, TreeStructureItem, TreeWidgetSchema, TriggerButtonDefaults, TriggerButtonView, USER_MENU_COMPONENT, UndoShortcuts, UnorderedListSchema, UploadedFile, VIRTUAL_ESTIMATES, VerticalAlignment, ViewColumnSchema, ViewEntrySchema, ViewSchema, VirtualList, VirtualListOptions, VirtualRange, VirtualizeSchema, WIZARD_STEP_QUERY_KEY, WidgetProps, WidgetSchema, WidgetsBlock, Width, WizardProgress, WizardSchema, acquireChannel, actionEndpoint, actionFormComponent, actionFormParams, actionPath, actionsAccessSelectedRecords, actionsAlignmentClass, activeTableView, addActionJustify, addGroup, addRule, allToolbarButtons, analyticsAllowed, analyticsChangeColor, analyticsInitialTab, announceDatabaseNotificationsSent, appendRepeaterItem, applyAppearance, applyBodyAttributes, applyDocumentLocale, applyEditorActionResult, applyFormRefresh, applyMask, applyPanelColors, applyPanelFavicon, applyPanelTheme, applyPwaUpdate, applySchemaPatches, ariaSort, asHelpdeskActivity, attachKanbanPointer, attachToolbarKeyboard, beginTableLoading, bindUndo, bindingFromEvent, bindsKeyBindings, bottomNavigationItems, buildChartConfig, buildQuery, buildTableUrl, builderBlockCounts, builderItemLabel, builderItemSchema, builderItems, builderPickerMove, byteLength, cachedTableTotals, calendarActionContext, calendarIdentity, calendarOptions, calendarWallTime, callCmsAutosave, callPageMethod, canAddBuilderBlock, canEditImage, canEditImageName, canInstallPwa, canNestGroup, canSelectAllRecords, cancelChunkedUpload, chartColorVariable, chartFiltersUrl, checkSchemaContract, clearRichEditorExtensions, clientErrorNotification, cloneIndexedState, cloneRepeaterItem, cloneTreeNodes, closeNotification, cmsAspectClass, cmsBlockAttributes, cmsBlockKey, cmsBlocks, cmsColumnsClass, cmsDesignCss, cmsDesignLinks, cmsGridClass, cmsHeadTags, cmsLinkRel, cmsPayload, cmsPreviewFitsBeside, cmsPreviewOpensByDefault, cmsPreviewOpensOnLoad, cmsPreviewPaneWidth, cmsWidthClass, coerceSpreadsheetValue, collapsesLanguageSwitcher, collectFieldStatePaths, collectFields, colorAlpha, colorToHex, columnDraftChanged, columnGroupHeaderRow, columnManagerPosition, columnOrderChanged, columnOrderClasses, columnRegistryKey, columnSpanClasses, columnStartClasses, columnVisibilityClasses, commandLabel, commandPaletteItems, commandShortcutId, completedStepIcon, componentHasErrors, concurrencyLimiter, configureCharts, configureRealtime, confirmModalClose, conflictMessage, constraintPickerClasses, constraintPickerSections, containerColumnSpanClasses, containerGridColumnsClasses, copilotBlocks, countCodeLines, createAnalyticsTracker, createAnotherState, createCmsTranslator, createKanbanFiltersStore, createLatestRequest, createRule, createSchemaComponentContext, createStore, csrfHeader, cssAspectRatio, currencyDecimals, currentPageQuery, currentRecordVersion, currentSocketId, currentStarterKitPanel, currentStarterKitPanelId, customBlockNodeConfig, customColorClasses, customPageProps, dashboardMoveForKey, debounce, debugRecorder, defaultActionContext, defaultActionKey, defaultVisibleColumns, deferredComponentReference, deferredHasErrors, deletePath, deprecate, deprecationMessage, derived, detailsNodeConfigs, discoveryKey, distributePageFormErrors, documentNonce, dropTreeNode, editableImageName, effectiveErrorNotifications, endTableLoading, errorNotificationOutcome, extremePageLinks, fetchEditableImage, fetchStandaloneComponents, fieldActionComponent, fieldActionContext, fieldAria, fieldDomId, fieldError, fieldIds, fieldMemory, fileAttachmentError, fileManagerAcceptAttribute, fileManagerAccepts, fileManagerErrorMessage, fileManagerExpiry, fileManagerSize, fileUploadAccept, fileUploadEntries, fileUploadPaths, filesFromClipboard, filterBuilderBlocks, filterCommandPalette, filterFormComponents, filterQueryBuilderOptions, filterSelectColumnOptions, filterSuggestionItems, filterTenants, filtersAreDeferred, filtersCollapsible, filtersFormWidthClass, filtersPlacement, findAutofocusField, findConstraint, findFieldByPath, findGridContext, findOperator, findPageFormBlock, findStandalonePropName, findSuggestionMatch, firstErroredItemIndex, firstErrors, fixedContainingBlockOffset, flattenActionGroup, flattenNavigationItems, flattenTreeStructure, flexItemClasses, flexLayoutClasses, floatingToolbarStyle, focusAutofocusField, focusMovedItem, focusTableSearch, focusToolbar, forgetFieldMemory, formActionsVisible, formIdPrefix, formIdentity, formRefreshFor, formatBytes, formatColor, formatKeyBinding, formatPhpDate, formatShortcut, fuzzyScore, getChartFormatters, getChartPlugins, getConflictForm, getEcho, getPageForm, getPath, getScriptData, getStoredAppearance, globalSearchDebounce, globalSearchStatus, globalSearchSuffix, gridColumnsClasses, gridContent, gridNodeConfigs, groupAt, groupBuilderBlocks, groupCustomBlocks, groupMenuItems, groupTableRows, groupTableViews, groupTriggerButton, guardModalUnload, hasActiveNavigationItem, hasCommandPalette, hasContainerBreakpoints, hasDevTools, hasMobilePreset, hasNewErrors, hasPath, hasRelationManagerTabs, hasRichEditorExtension, hasSlots, hasThemeSwitcher, hasTopbar, headingTag, helpdeskChatString, helpdeskFileSize, helpdeskSlaTone, highlightCode, highlightMarkConfig, htmlLabelToText, htmlToMarkdown, iconAlias, iconAliasOverride, iconButtonSize, iconGridMove, iconPickerPreview, iconSource, imageEditorOptionsKey, imageGeometry, indentCode, inertiaPost, inertiaReload, inertiaVisit, initialCollapsedGroups, initialTranslatableLocale, initialWizardStep, initializeAppearance, initials, insertBuilderItem, insertUploadedFile, inspectableProps, installErrorNotifications, installPrefetchInvalidation, installSpaUrlExceptions, installStarterKitRuntime, interpolate, invalidatePrefetchedPages, invalidateTableTotals, isActionGroup, isActionLoading, isActionProcessing, isAlfakitPage, isAllowedLinkUrl, isAppendingPagination, isCustomBlockResult, isCustomColorName, isCustomSvgIcon, isDeferredPlaceholder, isEditableTarget, isField, isFieldActionContext, isGroupedColumn, isHighlightedLanguage, isIconAlias, isImplicitSubmit, isIosSafari, isLazyPlaceholder, isLeavingVisit, isMacLike, isModalHiddenByChild, isModalSubmitVisible, isMutatingRequest, isNavigationItemActive, isOptionGroup, isPageFullySelected, isPartialFormPayload, isRealtimeEnabled, isRightToLeft, isSafeColor, isStandalone, isStandaloneComponent, isStarterKitPanel, isTableLoading, isToolbarGroup, isToolbarShortcut, isUndoFinished, isUndoShortcut, isValidShortcut, itemActionContext, itemActionIcon, itemExtraActions, joinPath, jsonEntries, jsonKind, jsonScalar, jsonSize, kanbanActiveFilters, kanbanCardPosition, kanbanCardsIn, kanbanInitials, kanbanMovePayload, kanbanRefusal, kanbanWipState, keepMoveButtonFocus, latestServerTiming, layoutColumnNames, layoutNodeGrows, layoutVisibilityClasses, lazyComponentCache, lazyComponents, leadExtensionConfig, limitedListItems, linkExtensionOptions, listTabIds, listTabUrl, listenForPageEvents, listenForRecordChanges, loadDeferredBadge, loadDeferredComponent, loadEditorImage, loadRichEditorExtensions, loadScript, loadStarterKitPanel, loadStyle, loadTableTotals, loadedStarterKitPanel, locateKanbanCard, logicalArrowKey, markFailedLazyWidgets, markRecordSubmitted, matchesKeyBinding, matchesShortcutStep, matchesUrlPattern, maxColumns, mentionNodeConfig, mentionText, menuActionContext, mergeAttributes, mergeChartOptions, mergeDeferredComponent, mergePolledComponents, mergeRefreshResponse, mergeStatePatch, mergeTagNodeConfig, mergeTagText, mobileCardLayout, mobileTable, modalFooterAlignment, modalTablePaging, modalTableQuery, modalTableSelected, moveColumn, moveColumnInManager, moveColumnTo, moveIndexedState, moveKanbanCard, moveListItem, moveRepeaterItem, moveTreeNode, navigationItemText, navigationItemUrl, nestedActionContext, newlineWithIndent, nextPageQuery, nextToolbarItem, normalizeRichEditorExtensions, normalizeRuleTree, notificationTintStyles, observeThemeChanges, onCloseNotification, onDatabaseNotificationsSent, onOpenDatabaseNotifications, onPageFormsChanged, onSaveConflict, oneTimeCodeDigits, openDatabaseNotifications, openDefaultAction, openRequestedStarterKitSearch, optimistic, optionText, orderColumnsBy, overlayPlacementDirection, pageFlash, pageFormName, pageSelectionState, paginationTotal, paletteGroupKey, panelAppearance, panelUploadOptions, parentPath, parseAspectRatio, parseDropdownPlacement, parseEventStream, parseGridColumns, parseInterval, parseKeyBinding, parseServerTiming, parseTsv, performUndo, persistWizardStep, pickerFilterFormOptions, pollComponent, pollPageProps, pollScheduler, postFormWithProgress, preferCurrentStarterKitPanel, prefetchTablePage, presenceInitials, prettyJson, previousPageQuery, primaryColumnName, promptPwaInstall, propsPollScheduler, pwaStore, queryBuilderInputType, queryBuilderOptions, readEventStream, readPersisted, realtimeHeaders, realtimeSettings, recordActionsAtStart, registerChartFormatters, registerChartPlugins, registerConflictForm, registerFormSubmitter, registerKeyBindings, registerPageForm, registerRichEditorExtensions, registerShortcut, registerStandaloneProp, registerStarterKitCopilotShortcut, registerStarterKitSearchShortcut, registerTablePersistence, relationGroupBadgeTarget, relationManagerBadgeTarget, relationManagerTabs, relationTabFromQuery, relationTabSlug, reloadExpiredPage, reloadOnExpiredPage, reloadPageProps, reloadPolledComponents, remainingTextSizeClass, rememberedCmsPreview, removeAllFilterIndicators, removeFilterIndicator, removeIndexedState, removeRepeaterItem, removeRule, reorderOffset, reorderTable, reorderedItemKeys, reorderingListsAllRecords, replaceComponentByKey, replacePlaceholder, reportRequestError, reportSaveConflict, reportSchemaContractMismatch, reportWizardProgress, reportedDeprecations, requestJson, requestStarterKitCopilot, requestStarterKitLanguages, requestStarterKitSearch, requestTableView, requiresFullPageLoad, reserveCmsPreviewSpace, resetChartRegistrations, resetDeprecations, resetPwa, resetRealtime, resetSchemaContractReports, resetStarterKitPanels, resetTableTotals, resizableImageAttributes, resizableImageOptions, resolveActionSize, resolveAppearance, resolveChartCallbacks, resolveContainerStatePath, resolveCssColor, resolveDeferredBadge, resolveDeferredGroupBadge, resolveEcho, resolveErrorNotification, resolveFirst, resolveFloatingToolbar, resolveItemAction, resolveLazyComponents, resolveNavigation, resolvePanelNavigation, resolvePartialProps, resolveRequestErrorNotification, resolveStatePath, resolveStickyOffset, resolveToastPosition, revealAutofocusField, router, runEditorCommands, runPageMethod, runsItemActionOnServer, saveColumnOrder, saveShortcutOverrides, saveSpreadsheetChanges, scheduleAutofocus, schemaComponentNames, schemaContractMajor, schemaContractMismatchMessage, schemaGapClass, scorePaletteItem, searchJson, searchTableColumnOptions, selectAllState, selectColumnEmptyMessage, selectPlural, selectedRecordsArguments, setAppearance, setCombinator, setIconAliases, setPath, setRecordVersion, setRequestErrorReporter, setTextColor, shortcutOverlayGroups, shortcutSteps, shortcuts, shortcutsClash, shouldChunkUpload, shouldConfirmModalClose, shouldResyncForm, shownRecordKeys, showsLanguageSwitcher, showsTableToolbar, sidebarDefaultOpen, sidebarWidthStyle, skeletonRowCount, slideOverSide, sliderBehavior, sliderBlocksTap, sliderBounds, sliderDirection, sliderFillSections, sliderFillStyle, sliderFromPrimitive, sliderHasTooltips, sliderNextValues, sliderPercent, sliderPips, sliderPrimitive, sliderShift, sliderShowsTooltip, sliderSnap, sliderState, sliderToPrimitive, sliderValueAt, sliderValues, slotAlignmentClass, slotDataMatches, slotItems, smallMarkConfig, splitClasses, splitPath, spreadsheetAnnouncement, spreadsheetAria, spreadsheetCellClass, spreadsheetCellId, spreadsheetCellKey, spreadsheetCellKind, spreadsheetColumns, spreadsheetRows, spreadsheetSelectionSize, stackClasses, stackedCellClasses, stackedImageStyle, standaloneDirection, standalonePageSchema, standalonePanelSchema, standaloneWidgetCount, startAnalytics, startDownload, startPwa, startSliderRangeDrag, startTableReordering, startUndoCountdown, starterKitBreadcrumbsFromProps, starterKitCopilot, starterKitDashboardWidgets, starterKitNavigation, starterKitNavigations, starterKitPanelLocale, starterKitWidgets, starterKitWidgetsPage, starterKitWidgetsPanel, stickyCollisionPadding, stopTableReordering, submitFormById, subscribeToNotifications, subscribeToPush, subscriptMarkConfig, superscriptMarkConfig, switchLocale, syncStarterKitPage, syncToolbarTabStops, t, tabFromQuery, tabKeyTarget, tabQueryValue, tabToReveal, tableColumnAlignmentClass, tableColumnCells, tableLoadingStore, tableQueryKey, tableTotalsFailed, tableTotalsStore, tableViewError, tableViewFollowUp, tableViewUrl, takeRequestedStarterKitCopilot, takeRequestedStarterKitLanguages, templateForIndex, tenantNameText, textAlignExtensionConfig, textColorMarkConfig, timeInputStep, toAsciiDigits, toEditorDocument, toStarterKitBreadcrumbs, toStarterKitNavGroups, toStarterKitUserMenuItems, toTsv, toggleButtonsNext, toggleButtonsSelected, toggleCollapsedGroup, toggleModalTableKey, togglePushNotifications, toggleVisibleColumn, toolCommand, toolbarButtonLabel, toolbarCommands, toolbarItems, toolbarPanel, trackAnalyticsEvent, transformImage, translatableLocaleField, translatableLocalesWithErrors, translationCellValue, translator, treeParentKeys, treeSubtreeHeight, triggerButtonView, undoShortcuts, uniqueId, unsubscribeFromPush, updateGroup, updateRule, updateTableCell, uploadPageMethodFiles, uploadTemporaryFile, uploadWithProgress, uploadedFileLinks, urlBase64ToUint8Array, usesDefaultImageStack, usesStarterKitHostLayout, virtualizeOptions, visibleColumns, visiblePresenceMembers, visibleTreeRows, visitTable, visitTableView, wallClockNow, watchPageProps, whenIdle, whenVisible, widgetPollTarget, widgetRegistryKeys, withAlpha, withColorAlpha, withDeferredTabBadges, withEcho, withItemActionState, withTableTotals, withoutDefaultActionQuery, withoutRequired, wizardProgressStore, wizardRequestedStepIndex, wizardStepFieldPaths, wizardStepQueryKey, wizardStepToReveal, writePersisted };
|