@unlayer/react-elements 0.1.22 → 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/README.md +43 -2
- package/dist/index.cjs +1367 -478
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +48 -9
- package/dist/index.d.ts +48 -9
- package/dist/index.js +1341 -471
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
package/dist/index.d.cts
CHANGED
|
@@ -142,6 +142,24 @@ interface DesignJSON {
|
|
|
142
142
|
body: DesignBody;
|
|
143
143
|
schemaVersion: number;
|
|
144
144
|
}
|
|
145
|
+
/** Phone settings use the same flat CSS inputs as desktop props. */
|
|
146
|
+
interface MobileProps {
|
|
147
|
+
padding?: number | string;
|
|
148
|
+
containerPadding?: number | string;
|
|
149
|
+
fontSize?: number | string;
|
|
150
|
+
lineHeight?: number | string;
|
|
151
|
+
textAlign?: TextAlign;
|
|
152
|
+
width?: number | string;
|
|
153
|
+
maxWidth?: number | string;
|
|
154
|
+
autoWidth?: boolean;
|
|
155
|
+
/** Column border on this device (per side, as the desktop `border`). */
|
|
156
|
+
border?: Partial<Record<`border${"Top" | "Right" | "Bottom" | "Left"}${"Width" | "Style" | "Color"}`, number | string>>;
|
|
157
|
+
}
|
|
158
|
+
interface DeviceProps {
|
|
159
|
+
mobile?: MobileProps;
|
|
160
|
+
hideOnMobile?: boolean;
|
|
161
|
+
hideOnDesktop?: boolean;
|
|
162
|
+
}
|
|
145
163
|
|
|
146
164
|
interface HeadConfig {
|
|
147
165
|
hasFeature?: (featureName: string) => boolean;
|
|
@@ -224,6 +242,7 @@ declare function htmlToTextJson(html: string): string;
|
|
|
224
242
|
* - Users can pass: { color: "red", backgroundColor: "blue" } OR { buttonColors: { color: "red" } }
|
|
225
243
|
* - TypeScript provides autocomplete for ALL properties (flat and nested)
|
|
226
244
|
*/
|
|
245
|
+
|
|
227
246
|
/**
|
|
228
247
|
* Type utility: Extracts all properties from nested objects
|
|
229
248
|
* This provides TypeScript autocomplete for flat props!
|
|
@@ -237,7 +256,7 @@ type FlattenObjectProps<T> = T extends object ? {
|
|
|
237
256
|
* Semantic props type for any component.
|
|
238
257
|
* Generic TChildren parameter allows each framework to supply its own child type.
|
|
239
258
|
*/
|
|
240
|
-
type SemanticProps$1<T, TChildren = any> = FlattenObjectProps<T> & {
|
|
259
|
+
type SemanticProps$1<T, TChildren = any> = Omit<FlattenObjectProps<T>, keyof DeviceProps> & DeviceProps & {
|
|
241
260
|
children?: TChildren;
|
|
242
261
|
values?: T;
|
|
243
262
|
/** HTML string with inline formatting for Paragraph (e.g. `'Hello <b>bold</b>'`) */
|
|
@@ -307,7 +326,7 @@ type ImageSrcInput = string | {
|
|
|
307
326
|
/**
|
|
308
327
|
* Base props that all item components support
|
|
309
328
|
*/
|
|
310
|
-
interface BaseItemComponentProps {
|
|
329
|
+
interface BaseItemComponentProps extends DeviceProps {
|
|
311
330
|
children?: React__default.ReactNode;
|
|
312
331
|
className?: string;
|
|
313
332
|
style?: React__default.CSSProperties;
|
|
@@ -332,7 +351,7 @@ interface BaseItemComponentProps {
|
|
|
332
351
|
/**
|
|
333
352
|
* Props type that combines base props with semantic props
|
|
334
353
|
*/
|
|
335
|
-
type ItemComponentProps<TSemanticProps> = BaseItemComponentProps & TSemanticProps
|
|
354
|
+
type ItemComponentProps<TSemanticProps> = BaseItemComponentProps & Omit<TSemanticProps, keyof DeviceProps>;
|
|
336
355
|
|
|
337
356
|
/**
|
|
338
357
|
* React Semantic Props
|
|
@@ -705,7 +724,7 @@ interface VideoProps extends ItemComponentProps<SemanticProps<VideoValues>> {
|
|
|
705
724
|
*/
|
|
706
725
|
declare const Video: React$1.FC<ItemComponentProps<VideoSemanticProps>>;
|
|
707
726
|
|
|
708
|
-
type RowProps = Omit<SemanticProps<RowValues>, "padding"> & {
|
|
727
|
+
type RowProps = Omit<SemanticProps<RowValues>, "padding" | keyof DeviceProps> & DeviceProps & {
|
|
709
728
|
children?: React__default.ReactNode;
|
|
710
729
|
layout?: ColumnLayout;
|
|
711
730
|
cells?: number[];
|
|
@@ -722,7 +741,7 @@ type RowProps = Omit<SemanticProps<RowValues>, "padding"> & {
|
|
|
722
741
|
};
|
|
723
742
|
declare const Row: React__default.FC<RowProps>;
|
|
724
743
|
|
|
725
|
-
type ColumnProps = Omit<SemanticProps<ColumnValues>, "padding" | "border" | "borderRadius"> & {
|
|
744
|
+
type ColumnProps = Omit<SemanticProps<ColumnValues>, "padding" | "border" | "borderRadius" | keyof DeviceProps> & Omit<DeviceProps, "hideOnMobile" | "hideOnDesktop"> & {
|
|
726
745
|
children?: React__default.ReactNode;
|
|
727
746
|
index?: number;
|
|
728
747
|
cells?: number[];
|
|
@@ -753,6 +772,17 @@ type BodyProps = Omit<SemanticProps<BodyValues>, "padding" | "borderRadius"> & {
|
|
|
753
772
|
config?: Partial<UnlayerConfig>;
|
|
754
773
|
/** Preview text shown in email client inboxes (email mode only) */
|
|
755
774
|
previewText?: string;
|
|
775
|
+
/** Document text direction, also kept in the design JSON. Renderer options can override it. */
|
|
776
|
+
textDirection?: string;
|
|
777
|
+
/** Language of the rendered document (for example, "ar"). */
|
|
778
|
+
lang?: string;
|
|
779
|
+
/**
|
|
780
|
+
* Web font stylesheets the content uses (e.g. a Google Fonts CSS URL).
|
|
781
|
+
* renderToHtml links them in the document head, with any `fonts` option.
|
|
782
|
+
*/
|
|
783
|
+
fonts?: Array<{
|
|
784
|
+
url: string;
|
|
785
|
+
}>;
|
|
756
786
|
/** Padding — a CSS string ("0 48px", "20px") or a number (px). */
|
|
757
787
|
padding?: SizeInput;
|
|
758
788
|
/** Corner radius — a number (→ px) or CSS string ("8px"). */
|
|
@@ -856,6 +886,8 @@ declare function useUnlayerConfig(): UnlayerConfig;
|
|
|
856
886
|
* Options for renderToHtml — config overrides plus document-level extras.
|
|
857
887
|
*/
|
|
858
888
|
interface RenderToHtmlOptions extends Partial<UnlayerConfig> {
|
|
889
|
+
/** Document language; overrides the root's `lang` prop. */
|
|
890
|
+
lang?: string;
|
|
859
891
|
/** Document `<title>` */
|
|
860
892
|
title?: string;
|
|
861
893
|
/**
|
|
@@ -880,7 +912,11 @@ interface RenderToHtmlOptions extends Partial<UnlayerConfig> {
|
|
|
880
912
|
* Use {@link renderToHtmlParts} instead when your app owns the document
|
|
881
913
|
* shell and only needs the head/body chunks.
|
|
882
914
|
*
|
|
883
|
-
* @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`)
|
|
915
|
+
* @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`), or a
|
|
916
|
+
* template component that returns one (`<Welcome name="Ada" />`, also `memo`/`forwardRef`).
|
|
917
|
+
* A template is called in a render of its own to reach its root (its hooks work); a class
|
|
918
|
+
* component, or one that doesn't return an element, renders without its root's settings,
|
|
919
|
+
* with a warning.
|
|
884
920
|
* @param options - Config overrides (mode, cdnBaseUrl, etc.) plus `title` and `fonts`
|
|
885
921
|
* @returns Complete HTML document string
|
|
886
922
|
* @throws {Error} If rendering fails, with a helpful message
|
|
@@ -1116,8 +1152,11 @@ interface ElementsToolConfig {
|
|
|
1116
1152
|
/** Editor-only fields (label, icon, options, validator, ...) — ignored */
|
|
1117
1153
|
[editorOnly: string]: unknown;
|
|
1118
1154
|
}
|
|
1119
|
-
/**
|
|
1120
|
-
|
|
1155
|
+
/**
|
|
1156
|
+
* Props: the tool's values as flat props, plus a `values` escape hatch. Every prop is the tool's own, as in 0.1.22:
|
|
1157
|
+
* a `mobile` or `hideOnMobile` value isn't a device setting (`values._override` sets those).
|
|
1158
|
+
*/
|
|
1159
|
+
type ElementsToolProps = Omit<BaseItemComponentProps, keyof DeviceProps> & Record<string, any> & {
|
|
1121
1160
|
values?: Record<string, any>;
|
|
1122
1161
|
};
|
|
1123
1162
|
/**
|
|
@@ -1147,4 +1186,4 @@ declare function registerTool(tool: ElementsToolConfig): React__default.FC<Eleme
|
|
|
1147
1186
|
/** Alias of {@link registerTool}. */
|
|
1148
1187
|
declare const registerElementsTool: typeof registerTool;
|
|
1149
1188
|
|
|
1150
|
-
export { Body, type BorderInput, Button, type ButtonProps, Column, type ColumnLayout, ColumnLayouts, DEFAULT_CONFIG, type DesignBody, type DesignColumn, type DesignContent, type DesignJSON, type DesignRow, Divider, type DividerProps, Document, type DocumentOrientation, type DocumentPageSize, type DocumentProps, type ElementsToolConfig, type ElementsToolProps, Email, type EmailProps, type FontFamilyInput, type FontWeightInput, Heading, type HeadingLevel, type HeadingProps, type Href, Html, type HtmlParts, type HtmlProps, type Icons, Image, type ImageProps, type ImageSrcInput, type LinkStyle, Menu, type MenuItem, type MenuProps, Page, PageBreak, type PageBreakProps, type PageProps, Paragraph, type ParagraphProps, type RenderToHtmlOptions, Row, type RowProps, type SizeInput, Social, type SocialIcon, type SocialProps, Table, type TableProps, type TextAlign, type TextStyleProps, type ToolExporter, type UnlayerConfig, UnlayerProvider, type UnlayerProviderProps, type ValidColumnLayout, Video, type VideoProps, type VideoSource, htmlToTextJson, registerElementsTool, registerTool, renderRowToJson, renderToHtml, renderToHtmlParts, renderToJson, renderToPlainText, useUnlayerConfig, validateColumnLayout };
|
|
1189
|
+
export { Body, type BorderInput, Button, type ButtonProps, Column, type ColumnLayout, ColumnLayouts, DEFAULT_CONFIG, type DesignBody, type DesignColumn, type DesignContent, type DesignJSON, type DesignRow, type DeviceProps, Divider, type DividerProps, Document, type DocumentOrientation, type DocumentPageSize, type DocumentProps, type ElementsToolConfig, type ElementsToolProps, Email, type EmailProps, type FontFamilyInput, type FontWeightInput, Heading, type HeadingLevel, type HeadingProps, type Href, Html, type HtmlParts, type HtmlProps, type Icons, Image, type ImageProps, type ImageSrcInput, type LinkStyle, Menu, type MenuItem, type MenuProps, type MobileProps, Page, PageBreak, type PageBreakProps, type PageProps, Paragraph, type ParagraphProps, type RenderToHtmlOptions, Row, type RowProps, type SizeInput, Social, type SocialIcon, type SocialProps, Table, type TableProps, type TextAlign, type TextStyleProps, type ToolExporter, type UnlayerConfig, UnlayerProvider, type UnlayerProviderProps, type ValidColumnLayout, Video, type VideoProps, type VideoSource, htmlToTextJson, registerElementsTool, registerTool, renderRowToJson, renderToHtml, renderToHtmlParts, renderToJson, renderToPlainText, useUnlayerConfig, validateColumnLayout };
|
package/dist/index.d.ts
CHANGED
|
@@ -142,6 +142,24 @@ interface DesignJSON {
|
|
|
142
142
|
body: DesignBody;
|
|
143
143
|
schemaVersion: number;
|
|
144
144
|
}
|
|
145
|
+
/** Phone settings use the same flat CSS inputs as desktop props. */
|
|
146
|
+
interface MobileProps {
|
|
147
|
+
padding?: number | string;
|
|
148
|
+
containerPadding?: number | string;
|
|
149
|
+
fontSize?: number | string;
|
|
150
|
+
lineHeight?: number | string;
|
|
151
|
+
textAlign?: TextAlign;
|
|
152
|
+
width?: number | string;
|
|
153
|
+
maxWidth?: number | string;
|
|
154
|
+
autoWidth?: boolean;
|
|
155
|
+
/** Column border on this device (per side, as the desktop `border`). */
|
|
156
|
+
border?: Partial<Record<`border${"Top" | "Right" | "Bottom" | "Left"}${"Width" | "Style" | "Color"}`, number | string>>;
|
|
157
|
+
}
|
|
158
|
+
interface DeviceProps {
|
|
159
|
+
mobile?: MobileProps;
|
|
160
|
+
hideOnMobile?: boolean;
|
|
161
|
+
hideOnDesktop?: boolean;
|
|
162
|
+
}
|
|
145
163
|
|
|
146
164
|
interface HeadConfig {
|
|
147
165
|
hasFeature?: (featureName: string) => boolean;
|
|
@@ -224,6 +242,7 @@ declare function htmlToTextJson(html: string): string;
|
|
|
224
242
|
* - Users can pass: { color: "red", backgroundColor: "blue" } OR { buttonColors: { color: "red" } }
|
|
225
243
|
* - TypeScript provides autocomplete for ALL properties (flat and nested)
|
|
226
244
|
*/
|
|
245
|
+
|
|
227
246
|
/**
|
|
228
247
|
* Type utility: Extracts all properties from nested objects
|
|
229
248
|
* This provides TypeScript autocomplete for flat props!
|
|
@@ -237,7 +256,7 @@ type FlattenObjectProps<T> = T extends object ? {
|
|
|
237
256
|
* Semantic props type for any component.
|
|
238
257
|
* Generic TChildren parameter allows each framework to supply its own child type.
|
|
239
258
|
*/
|
|
240
|
-
type SemanticProps$1<T, TChildren = any> = FlattenObjectProps<T> & {
|
|
259
|
+
type SemanticProps$1<T, TChildren = any> = Omit<FlattenObjectProps<T>, keyof DeviceProps> & DeviceProps & {
|
|
241
260
|
children?: TChildren;
|
|
242
261
|
values?: T;
|
|
243
262
|
/** HTML string with inline formatting for Paragraph (e.g. `'Hello <b>bold</b>'`) */
|
|
@@ -307,7 +326,7 @@ type ImageSrcInput = string | {
|
|
|
307
326
|
/**
|
|
308
327
|
* Base props that all item components support
|
|
309
328
|
*/
|
|
310
|
-
interface BaseItemComponentProps {
|
|
329
|
+
interface BaseItemComponentProps extends DeviceProps {
|
|
311
330
|
children?: React__default.ReactNode;
|
|
312
331
|
className?: string;
|
|
313
332
|
style?: React__default.CSSProperties;
|
|
@@ -332,7 +351,7 @@ interface BaseItemComponentProps {
|
|
|
332
351
|
/**
|
|
333
352
|
* Props type that combines base props with semantic props
|
|
334
353
|
*/
|
|
335
|
-
type ItemComponentProps<TSemanticProps> = BaseItemComponentProps & TSemanticProps
|
|
354
|
+
type ItemComponentProps<TSemanticProps> = BaseItemComponentProps & Omit<TSemanticProps, keyof DeviceProps>;
|
|
336
355
|
|
|
337
356
|
/**
|
|
338
357
|
* React Semantic Props
|
|
@@ -705,7 +724,7 @@ interface VideoProps extends ItemComponentProps<SemanticProps<VideoValues>> {
|
|
|
705
724
|
*/
|
|
706
725
|
declare const Video: React$1.FC<ItemComponentProps<VideoSemanticProps>>;
|
|
707
726
|
|
|
708
|
-
type RowProps = Omit<SemanticProps<RowValues>, "padding"> & {
|
|
727
|
+
type RowProps = Omit<SemanticProps<RowValues>, "padding" | keyof DeviceProps> & DeviceProps & {
|
|
709
728
|
children?: React__default.ReactNode;
|
|
710
729
|
layout?: ColumnLayout;
|
|
711
730
|
cells?: number[];
|
|
@@ -722,7 +741,7 @@ type RowProps = Omit<SemanticProps<RowValues>, "padding"> & {
|
|
|
722
741
|
};
|
|
723
742
|
declare const Row: React__default.FC<RowProps>;
|
|
724
743
|
|
|
725
|
-
type ColumnProps = Omit<SemanticProps<ColumnValues>, "padding" | "border" | "borderRadius"> & {
|
|
744
|
+
type ColumnProps = Omit<SemanticProps<ColumnValues>, "padding" | "border" | "borderRadius" | keyof DeviceProps> & Omit<DeviceProps, "hideOnMobile" | "hideOnDesktop"> & {
|
|
726
745
|
children?: React__default.ReactNode;
|
|
727
746
|
index?: number;
|
|
728
747
|
cells?: number[];
|
|
@@ -753,6 +772,17 @@ type BodyProps = Omit<SemanticProps<BodyValues>, "padding" | "borderRadius"> & {
|
|
|
753
772
|
config?: Partial<UnlayerConfig>;
|
|
754
773
|
/** Preview text shown in email client inboxes (email mode only) */
|
|
755
774
|
previewText?: string;
|
|
775
|
+
/** Document text direction, also kept in the design JSON. Renderer options can override it. */
|
|
776
|
+
textDirection?: string;
|
|
777
|
+
/** Language of the rendered document (for example, "ar"). */
|
|
778
|
+
lang?: string;
|
|
779
|
+
/**
|
|
780
|
+
* Web font stylesheets the content uses (e.g. a Google Fonts CSS URL).
|
|
781
|
+
* renderToHtml links them in the document head, with any `fonts` option.
|
|
782
|
+
*/
|
|
783
|
+
fonts?: Array<{
|
|
784
|
+
url: string;
|
|
785
|
+
}>;
|
|
756
786
|
/** Padding — a CSS string ("0 48px", "20px") or a number (px). */
|
|
757
787
|
padding?: SizeInput;
|
|
758
788
|
/** Corner radius — a number (→ px) or CSS string ("8px"). */
|
|
@@ -856,6 +886,8 @@ declare function useUnlayerConfig(): UnlayerConfig;
|
|
|
856
886
|
* Options for renderToHtml — config overrides plus document-level extras.
|
|
857
887
|
*/
|
|
858
888
|
interface RenderToHtmlOptions extends Partial<UnlayerConfig> {
|
|
889
|
+
/** Document language; overrides the root's `lang` prop. */
|
|
890
|
+
lang?: string;
|
|
859
891
|
/** Document `<title>` */
|
|
860
892
|
title?: string;
|
|
861
893
|
/**
|
|
@@ -880,7 +912,11 @@ interface RenderToHtmlOptions extends Partial<UnlayerConfig> {
|
|
|
880
912
|
* Use {@link renderToHtmlParts} instead when your app owns the document
|
|
881
913
|
* shell and only needs the head/body chunks.
|
|
882
914
|
*
|
|
883
|
-
* @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`)
|
|
915
|
+
* @param element - A React element tree (e.g. `<Email><Row>...</Row></Email>`), or a
|
|
916
|
+
* template component that returns one (`<Welcome name="Ada" />`, also `memo`/`forwardRef`).
|
|
917
|
+
* A template is called in a render of its own to reach its root (its hooks work); a class
|
|
918
|
+
* component, or one that doesn't return an element, renders without its root's settings,
|
|
919
|
+
* with a warning.
|
|
884
920
|
* @param options - Config overrides (mode, cdnBaseUrl, etc.) plus `title` and `fonts`
|
|
885
921
|
* @returns Complete HTML document string
|
|
886
922
|
* @throws {Error} If rendering fails, with a helpful message
|
|
@@ -1116,8 +1152,11 @@ interface ElementsToolConfig {
|
|
|
1116
1152
|
/** Editor-only fields (label, icon, options, validator, ...) — ignored */
|
|
1117
1153
|
[editorOnly: string]: unknown;
|
|
1118
1154
|
}
|
|
1119
|
-
/**
|
|
1120
|
-
|
|
1155
|
+
/**
|
|
1156
|
+
* Props: the tool's values as flat props, plus a `values` escape hatch. Every prop is the tool's own, as in 0.1.22:
|
|
1157
|
+
* a `mobile` or `hideOnMobile` value isn't a device setting (`values._override` sets those).
|
|
1158
|
+
*/
|
|
1159
|
+
type ElementsToolProps = Omit<BaseItemComponentProps, keyof DeviceProps> & Record<string, any> & {
|
|
1121
1160
|
values?: Record<string, any>;
|
|
1122
1161
|
};
|
|
1123
1162
|
/**
|
|
@@ -1147,4 +1186,4 @@ declare function registerTool(tool: ElementsToolConfig): React__default.FC<Eleme
|
|
|
1147
1186
|
/** Alias of {@link registerTool}. */
|
|
1148
1187
|
declare const registerElementsTool: typeof registerTool;
|
|
1149
1188
|
|
|
1150
|
-
export { Body, type BorderInput, Button, type ButtonProps, Column, type ColumnLayout, ColumnLayouts, DEFAULT_CONFIG, type DesignBody, type DesignColumn, type DesignContent, type DesignJSON, type DesignRow, Divider, type DividerProps, Document, type DocumentOrientation, type DocumentPageSize, type DocumentProps, type ElementsToolConfig, type ElementsToolProps, Email, type EmailProps, type FontFamilyInput, type FontWeightInput, Heading, type HeadingLevel, type HeadingProps, type Href, Html, type HtmlParts, type HtmlProps, type Icons, Image, type ImageProps, type ImageSrcInput, type LinkStyle, Menu, type MenuItem, type MenuProps, Page, PageBreak, type PageBreakProps, type PageProps, Paragraph, type ParagraphProps, type RenderToHtmlOptions, Row, type RowProps, type SizeInput, Social, type SocialIcon, type SocialProps, Table, type TableProps, type TextAlign, type TextStyleProps, type ToolExporter, type UnlayerConfig, UnlayerProvider, type UnlayerProviderProps, type ValidColumnLayout, Video, type VideoProps, type VideoSource, htmlToTextJson, registerElementsTool, registerTool, renderRowToJson, renderToHtml, renderToHtmlParts, renderToJson, renderToPlainText, useUnlayerConfig, validateColumnLayout };
|
|
1189
|
+
export { Body, type BorderInput, Button, type ButtonProps, Column, type ColumnLayout, ColumnLayouts, DEFAULT_CONFIG, type DesignBody, type DesignColumn, type DesignContent, type DesignJSON, type DesignRow, type DeviceProps, Divider, type DividerProps, Document, type DocumentOrientation, type DocumentPageSize, type DocumentProps, type ElementsToolConfig, type ElementsToolProps, Email, type EmailProps, type FontFamilyInput, type FontWeightInput, Heading, type HeadingLevel, type HeadingProps, type Href, Html, type HtmlParts, type HtmlProps, type Icons, Image, type ImageProps, type ImageSrcInput, type LinkStyle, Menu, type MenuItem, type MenuProps, type MobileProps, Page, PageBreak, type PageBreakProps, type PageProps, Paragraph, type ParagraphProps, type RenderToHtmlOptions, Row, type RowProps, type SizeInput, Social, type SocialIcon, type SocialProps, Table, type TableProps, type TextAlign, type TextStyleProps, type ToolExporter, type UnlayerConfig, UnlayerProvider, type UnlayerProviderProps, type ValidColumnLayout, Video, type VideoProps, type VideoSource, htmlToTextJson, registerElementsTool, registerTool, renderRowToJson, renderToHtml, renderToHtmlParts, renderToJson, renderToPlainText, useUnlayerConfig, validateColumnLayout };
|