export const TEXT_CONFIGURATION = { properties: { '_ww-text_text': { label: 'Text', type: 'Info', category: 'text', options: { text: 'Click text to edit' }, bindable: true, multiLang: true, defaultValue: 'New text', hidden: (content, sidePanelContent, boundProps, wwProps) => !!(wwProps && wwProps.text), }, '_ww-text_sanitize': { label: 'Sanitize', type: 'OnOff', bindable: true, category: 'text', bindingValidation: { type: 'boolean', markdown: 'sanitize', }, }, '_ww-text_font': { label: 'Typography', type: 'Typography', category: 'text', options: (content, sidepanelContent, boundProperties) => ({ initialValue: { fontSize: content['_ww-text_fontSize'], fontFamily: content['_ww-text_fontFamily'], fontWeight: content['_ww-text_fontWeight'], fontStyle: content['_ww-text_fontStyle'], lineHeight: content['_ww-text_lineHeight'], }, creationDisabled: boundProperties['_ww-text_fontSize'] || boundProperties['_ww-text_fontFamily'] || boundProperties['_ww-text_fontWeight'] || boundProperties['_ww-text_fontStyle'] || boundProperties['_ww-text_lineHeight'], creationDisabledMessage: 'Cannot create typography from bound properties', }), bindable: true, responsive: true, states: true, classes: true, isStyle: true, }, '_ww-text_fontSize': { label: 'Size', type: 'Length', category: 'text', options: { unitChoices: [ { value: 'px', label: 'px', min: 1, max: 100, default: true }, { value: 'em', label: 'em', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: 0, max: 10, digits: 3, step: 0.1 }, ], noRange: true, }, responsive: true, states: true, classes: true, bindable: true, hidden: (content, _, boundProps) => content['_ww-text_font'] || boundProps['_ww-text_font'], bindingValidation: { markdown: 'font-size', type: 'string', cssSupports: 'font-size' }, isStyle: true, }, '_ww-text_fontFamily': { label: 'Font family', type: 'FontFamily', category: 'text', responsive: true, states: true, classes: true, bindable: true, hidden: (content, _, boundProps) => content['_ww-text_font'] || boundProps['_ww-text_font'], bindingValidation: { markdown: 'font-family', type: 'string', cssSupports: 'font-family' }, isStyle: true, }, '_ww-text_fontWeight': { label: 'Font weight', type: 'TextSelect', category: 'text', options: { options: [ { value: null, label: 'Default', default: true }, { value: 100, label: '100 - Thin' }, { value: 200, label: '200 - Extra Light' }, { value: 300, label: '300 - Light' }, { value: 400, label: '400 - Normal' }, { value: 500, label: '500 - Medium' }, { value: 600, label: '600 - Semi Bold' }, { value: 700, label: '700 - Bold' }, { value: 800, label: '800 - Extra Bold' }, { value: 900, label: '900 - Black' }, ], }, responsive: true, states: true, classes: true, bindable: true, hidden: (content, _, boundProps) => content['_ww-text_font'] || boundProps['_ww-text_font'], bindingValidation: { markdown: 'font-weight', type: 'string', cssSupports: 'font-weight' }, isStyle: true, }, '_ww-text_fontStyle': { label: 'Font Style', type: 'TextRadioGroup', category: 'text', options: { choices: [ { value: null, title: 'Default', icon: 'typo-default', default: true }, { value: 'italic', title: 'Italic', icon: 'typo-italic' }, ], }, responsive: true, states: true, bindable: true, classes: true, hidden: (content, _, boundProps) => content['_ww-text_font'] || boundProps['_ww-text_font'], bindingValidation: { markdown: 'font-style', type: 'string', cssSupports: 'font-style' }, isStyle: true, }, '_ww-text_lineHeight': { label: 'Line height', type: 'Length', category: 'text', options: { unitChoices: [ { value: 'normal', label: 'auto', default: true }, { value: 'px', label: 'px', min: 0, max: 100 }, { value: '%', label: '%', min: 0, max: 100 }, { value: 'em', label: 'em', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'unset', label: 'none' }, ], noRange: true, }, responsive: true, states: true, classes: true, bindable: true, hidden: (content, _, boundProps) => content['_ww-text_font'] || boundProps['_ww-text_font'], bindingValidation: { markdown: 'line-height', type: 'string', cssSupports: 'line-height' }, isStyle: true, }, '_ww-text_textAlign': { label: 'Alignment', type: 'TextRadioGroup', category: 'text', options: { choices: [ { value: 'left', default: true, title: 'Left', icon: 'menu-alt-2' }, { value: 'center', title: 'Center', icon: 'text-middle' }, { value: 'right', title: 'Right', icon: 'menu-alt-3' }, { value: 'justify', title: 'Justify', icon: 'menu' }, ], }, responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'text-align', type: 'string', cssSupports: 'text-align' }, isStyle: true, }, '_ww-text_color': { label: 'Text color', type: 'Color', category: 'text', options: { nullable: true }, bindable: true, bindingValidation: { markdown: 'color', type: 'string', cssSupports: 'color' }, responsive: true, states: true, classes: true, isStyle: true, }, '_ww-text_textDecoration': { label: 'Decoration', type: 'TextRadioGroup', category: 'text', options: { choices: [ { value: 'none', title: 'None', icon: 'x', default: true }, { value: 'underline', title: 'Underline', icon: 'typo-underline' }, { value: 'overline', title: 'Overline', icon: 'typo-overline' }, { value: 'line-through', title: 'Line-through', icon: 'typo-strikethrough' }, ], }, bindable: true, responsive: true, states: true, classes: true, bindingValidation: { markdown: 'text-decoration', type: 'string', cssSupports: 'text-decoration' }, isStyle: true, }, '_ww-text_textDecorationStyle': { label: 'Decoration style', type: 'TextSelect', category: 'text', options: { options: [ { value: 'solid', label: 'Solid', default: true }, { value: 'double', label: 'Double' }, { value: 'dotted', label: 'Dotted' }, { value: 'dashed', label: 'Dashed' }, { value: 'wavy', label: 'Wavy' }, ], }, responsive: true, bindable: true, states: true, classes: true, hidden: content => content['_ww-text_textDecoration'] === 'none' || !content['_ww-text_textDecoration'], bindingValidation: { markdown: 'text-decoration-style', type: 'string', cssSupports: 'text-decoration-style', }, isStyle: true, }, '_ww-text_textDecorationColor': { label: 'Decoration color', type: 'Color', category: 'text', options: { nullable: true }, responsive: true, bindable: true, bindingValidation: { markdown: 'color', type: 'string', cssSupports: 'color' }, states: true, classes: true, hidden: content => content['_ww-text_textDecoration'] === 'none' || !content['_ww-text_textDecoration'], isStyle: true, }, '_ww-text_nowrap': { label: 'No-wrap', type: 'OnOff', category: 'text', responsive: true, bindable: true, states: true, classes: true, bindingValidation: { type: 'boolean', markdown: 'no-wrap' }, isStyle: true, }, '_ww-text_ellipsis': { hidden: content => !content['_ww-text_nowrap'], label: 'Ellipsis', type: 'OnOff', category: 'text', responsive: true, bindable: true, states: true, classes: true, bindingValidation: { type: 'boolean', markdown: 'ellipsis' }, isStyle: true, }, '_ww-text_textTransform': { label: 'Character case', type: 'TextSelect', category: 'text', options: { options: [ { value: null, label: 'None', default: true }, { value: 'capitalize', label: 'Capitalize' }, { value: 'uppercase', label: 'UPPERCASE' }, { value: 'lowercase', label: 'lowercase' }, ], }, responsive: true, bindable: true, bindingValidation: { markdown: 'text-transform', type: 'string', cssSupports: 'text-transform' }, states: true, classes: true, isStyle: true, }, '_ww-text_textShadow': { label: 'Text Shadows', type: 'Shadows', category: 'text', options: { isText: true }, responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'text-shadow', type: 'string', cssSupports: 'text-shadow' }, isStyle: true, }, '_ww-text_letterSpacing': { label: 'Letter spacing', type: 'Length', category: 'text', options: { unitChoices: [ { value: 'px', label: 'px', min: -100, max: 100 }, { value: 'em', label: 'em', min: -10, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: -10, max: 10, digits: 3, step: 0.1 }, ], noRange: true, }, responsive: true, states: true, classes: true, bindable: true, bindingValidation: { markdown: 'letter-spacing', type: 'string', cssSupports: 'letter-spacing' }, isStyle: true, }, '_ww-text_wordSpacing': { label: 'Word spacing', type: 'Length', category: 'text', options: { unitChoices: [{ value: 'px', label: 'px', min: 0, max: 100 }], noRange: true, }, responsive: true, states: true, classes: true, bindable: true, bindingValidation: { markdown: 'word-spacing', type: 'string', cssSupports: 'word-spacing' }, isStyle: true, }, '_ww-text_links': { hidden: true, }, }, }; export const LAYOUT_CONFIGURATION = { properties: { '_ww-layout_flexDirection': { label: 'Direction', type: 'TextRadioGroup', category: 'layout', options: { choices: [ { title: 'Vertical', value: 'column', label: 'Vertical' }, { title: 'Horizontal', value: 'row', label: 'Horizontal', default: true }, ], }, bindable: true, bindingValidation: { markdown: 'flex-direction', type: 'string', cssSupports: 'flex-direction', }, responsive: true, classes: true, }, '_ww-layout_rowGap': { label: 'Row gap', type: 'Length', category: 'layout', options: { unitChoices: [ { value: 'px', label: 'px', min: 0, max: 100 }, { value: '%', label: '%', min: 0, max: 100, digits: 2, step: 1 }, { value: 'em', label: 'em', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: 0, max: 10, digits: 3, step: 0.1 }, ], useVar: true, noRange: true, }, bindable: true, bindingValidation: { markdown: 'row-gap', type: 'string', cssSupports: 'row-gap', }, states: true, classes: true, responsive: true, }, '_ww-layout_columnGap': { label: 'Column gap', type: 'Length', category: 'layout', options: { unitChoices: [ { value: 'px', label: 'px', min: 0, max: 100 }, { value: '%', label: '%', min: 0, max: 100, digits: 2, step: 1 }, { value: 'em', label: 'em', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: 0, max: 10, digits: 3, step: 0.1 }, ], useVar: true, noRange: true, }, bindable: true, bindingValidation: { markdown: 'column-gap', type: 'string', cssSupports: 'column-gap', }, states: true, responsive: true, classes: true, }, '_ww-layout_justifyContent': { label: 'Justify', type: 'TextRadioGroup', category: 'layout', options: content => { if (content['_ww-layout_flexDirection'] === 'column') { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'align-x-start-vertical', default: true }, { value: 'center', title: 'Center', icon: 'align-x-center-vertical' }, { value: 'flex-end', title: 'End', icon: 'align-x-end-vertical' }, { value: 'space-around', title: 'Space around', icon: 'align-x-space-around-vertical' }, { value: 'space-between', title: 'Space between', icon: 'align-x-space-between-vertical' }, ], compact: true, }; } else { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'align-x-start', default: true }, { value: 'center', title: 'Center', icon: 'align-x-center' }, { value: 'flex-end', title: 'End', icon: 'align-x-end' }, { value: 'space-around', title: 'Space around', icon: 'align-x-space-around' }, { value: 'space-between', title: 'Space between', icon: 'align-x-space-between' }, ], compact: true, }; } }, responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'justify-content', type: 'string', cssSupports: 'justify-content' }, }, '_ww-layout_alignItems': { label: 'Alignment', type: 'TextRadioGroup', category: 'layout', options: content => { if (content['_ww-layout_flexDirection'] === 'column') { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'align-x-start' }, { value: 'center', title: 'Center', icon: 'align-x-center' }, { value: 'flex-end', title: 'End', icon: 'align-x-end' }, { value: 'stretch', title: 'Stretch', icon: 'align-x-stretch', default: true }, ], compact: true, }; } else { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'align-y-start' }, { value: 'center', title: 'Center', icon: 'align-y-center' }, { value: 'flex-end', title: 'End', icon: 'align-y-end' }, { value: 'stretch', title: 'Stretch', icon: 'align-y-stretch', default: true }, { value: 'baseline', title: 'Baseline', icon: 'align-y-baseline' }, ], compact: true, }; } }, responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'align-items', type: 'string', cssSupports: 'align-items' }, }, '_ww-layout_flexWrap': { label: 'Wrap elements', type: 'OnOff', category: 'layout', hidden: content => content['_ww-layout_flexDirection'] === 'column', responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'flex-wrap', type: 'boolean' }, }, '_ww-layout_alignContent': { label: 'Content Alignment', type: 'TextRadioGroup', category: 'layout', options: content => { if (content['_ww-layout_flexDirection'] === 'column') { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'y-align-content-start' }, { value: 'center', title: 'Center', icon: 'y-align-content-center' }, { value: 'flex-end', title: 'End', icon: 'y-align-content-end' }, { value: 'stretch', title: 'Stretch', icon: 'y-align-content-stretch', default: true }, { value: 'space-between', title: 'Space between', icon: 'y-align-content-space-between' }, { value: 'space-around', title: 'Space around', icon: 'y-align-content-space-around' }, ], compact: true, }; } else { return { choices: [ { value: 'flex-start', title: 'Start', icon: 'x-align-content-start' }, { value: 'center', title: 'Center', icon: 'x-align-content-center' }, { value: 'flex-end', title: 'End', icon: 'x-align-content-end' }, { value: 'stretch', title: 'Stretch', icon: 'x-align-content-stretch', default: true }, { value: 'space-between', title: 'Space between', icon: 'x-align-content-space-between' }, { value: 'space-around', title: 'Space around', icon: 'x-align-content-space-around' }, ], compact: true, }; } }, hidden: content => !content['_ww-layout_flexWrap'], responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'align-content', type: 'string', cssSupports: 'align-content' }, }, '_ww-layout_reverse': { label: 'Reverse', type: 'OnOff', category: 'layout', responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'layout-reverse', type: 'boolean' }, }, '_ww-layout_pushLast': { label: 'Last to the end', type: 'OnOff', category: 'layout', responsive: true, classes: true, bindable: true, bindingValidation: { markdown: 'layout-push-last', type: 'boolean' }, }, }, }; export const GRID_CONFIGURATION = { properties: { '_ww-grid_flowDirection': { label: 'Direction', type: 'TextRadioGroup', category: 'grid', options: { choices: [ { title: 'Row', value: 'row', label: 'Row', default: true }, { title: 'Column', value: 'column', label: 'Column' }, ], }, bindable: true, responsive: true, classes: true, bindingValidation: { markdown: 'grid-flow-direction', type: 'string' }, }, '_ww-grid_columns': { label: 'Columns', type: 'ArrayCompact', options: { item: { label: specific__array => `Column ${specific__array.index + 1}`, type: 'Length', options: unitPickerOptions('fr', 'px', '%', 'auto'), defaultValue: '1fr', bindable: true, responsive: true, }, placeholder: { icon: 'columns', text: 'Columns auto-generated' }, }, defaultValue: undefined, category: 'grid', bindable: true, responsive: true, classes: true, bindingValidation: { markdown: 'grid-columns', type: 'array' }, }, '_ww-grid_rows': { label: 'Rows', type: 'ArrayCompact', options: { item: { label: specific__array => `Row ${specific__array.index + 1}`, type: 'Length', options: unitPickerOptions('fr', 'px', '%', 'auto'), defaultValue: '1fr', bindable: true, responsive: true, }, placeholder: { icon: 'rows', text: 'Rows auto-generated' }, }, defaultValue: undefined, category: 'grid', bindable: true, responsive: true, classes: true, bindingValidation: { markdown: 'grid-rows', type: 'array' }, }, '_ww-grid_columnGap': { ...LAYOUT_CONFIGURATION.properties['_ww-layout_columnGap'], category: 'grid' }, '_ww-grid_rowGap': { ...LAYOUT_CONFIGURATION.properties['_ww-layout_rowGap'], category: 'grid' }, }, }; export const BACKGROUND_VIDEO_CONFIGURATION = { properties: { '_ww-backgroundVideo': { label: 'Video', type: 'Video', options: { nullable: true, }, responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'background.video', type: 'string', }, }, '_ww-backgroundVideoPoster': { label: 'Poster', type: 'Image', options: { nullable: true, }, responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'background.video.poster', type: 'string', }, }, '_ww-backgroundVideoSize': { label: 'Size', type: 'TextSelect', options: { options: [ { value: 'cover', default: true, label: { en: 'Cover', fr: 'Couvrir' } }, { value: 'contain', label: { en: 'Contain', fr: 'Contenir' } }, ], }, responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'background.video.size', type: 'string', }, }, '_ww-backgroundVideoLoop': { label: 'Loop', type: 'OnOff', responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'background.video.loop', type: 'boolean', }, }, '_ww-backgroundVideoPreload': { label: 'Preload', type: 'OnOff', responsive: true, bindable: true, states: true, classes: true, bindingValidation: { markdown: 'background.video.preload', type: 'boolean', }, }, }, }; function unitPickerOptions(...units) { const unitChoices = [ { value: 'auto', label: 'auto', default: true }, { value: 'px', label: 'px', min: 0, max: 100 }, { value: 'fr', label: 'fr', min: 0, max: 100, digits: 2, step: 1 }, { value: '%', label: '%', min: 0, max: 100, digits: 2, step: 1 }, { value: 'em', label: 'em', min: 0, max: 10, digits: 3, step: 0.1 }, { value: 'rem', label: 'rem', min: 0, max: 10, digits: 3, step: 0.1 }, ].filter(unit => !units || units.includes(unit.value)); return { unitChoices, useVar: true, noRange: true, }; } export const GRID_CHILD_HELP = { columnSpan: { tooltip: 'Specifies how many columns an element should span across in the grid layout. This determines the element\'s width relative to the total number of grid columns. Set the value of the property grid-column to `span value`. [MDN Doc]', bindingValidation: { markdown: 'column-span', type: 'string', cssSupports: 'column-span' }, }, rowSpan: { tooltip: 'Defines the number of rows an element will span over. This affects the element\'s height by extending it across multiple grid rows. Set the value of the property row-column to `span value`. [MDN Doc]', bindingValidation: { markdown: 'row-span', type: 'string', cssSupports: 'row-span' }, }, gridColumn: { tooltip: 'Sets the element\'s starting and ending positions along the grid\'s column axis. It determines where the element is placed horizontally within the grid. Set the value of the property grid-column to `value`. Overwrite the column span property. [MDN Doc]', bindingValidation: { markdown: 'grid-column', type: 'string', cssSupports: 'grid-column' }, }, gridRow: { tooltip: 'Indicates the element\'s starting and ending positions along the grid\'s row axis. This property controls the vertical placement of the element within the grid layout. Set the value of the property row-column to `value`. Overwrite the row span property. [MDN Doc]', bindingValidation: { markdown: 'grid-row', type: 'string', cssSupports: 'grid-row' }, }, };