UNPKG

@atlaskit/adf-schema

Version:

Shared package that contains the ADF-schema (json) and ProseMirror node/mark specs

88 lines (85 loc) 2.34 kB
import { layoutColumn as layoutColumnFactory } from '../../next-schema/generated/nodeTypes'; import { uuid } from '../../utils/uuid'; import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments'; import { parseValign } from './types/valign'; const setColumnAttributes = (node, { withLocalId = false } = {}) => { const attrs = { 'data-layout-column': 'true' }; const { width, valign, localId } = node.attrs; if (width) { const baseStyle = `flex-basis: ${width}%`; const columnWidthVar = editorExperiment('platform_editor_layout_column_resize_handle', true) ? `; --column-width: ${width}%` : ''; attrs['style'] = baseStyle + columnWidthVar; attrs['data-column-width'] = `${width}`; } if (valign) { attrs['data-valign'] = valign; } if (withLocalId && localId) { attrs['data-local-id'] = localId; } return attrs; }; const getColumnAttrs = ({ withLocalId = false } = {}) => domNode => { // eslint-disable-next-line @atlaskit/editor/no-as-casting const dom = domNode; const base = { width: Number(dom.getAttribute('data-column-width')) || undefined, ...(withLocalId && { localId: uuid.generate() }) }; const valign = parseValign(dom.getAttribute('data-valign')); return valign ? { ...base, valign } : base; }; // We need to apply an attribute to the innermost child to help ProseMirror // identify its boundaries better. const LAYOUT_CONTENT_ATTRS = { 'data-layout-content': 'true' }; /** * @name layoutColumn_node */ export const layoutColumn = layoutColumnFactory({ parseDOM: [{ context: 'layoutColumn//', tag: 'div[data-layout-column]', skip: true }, { tag: 'div[data-layout-column]', getAttrs: getColumnAttrs() }], toDOM(node) { return ['div', setColumnAttributes(node), ['div', LAYOUT_CONTENT_ATTRS, 0]]; } }); export const layoutColumnWithLocalId = layoutColumnFactory({ parseDOM: [{ context: 'layoutColumn//', tag: 'div[data-layout-column]', skip: true }, { tag: 'div[data-layout-column]', getAttrs: getColumnAttrs({ withLocalId: true }) }], toDOM(node) { return ['div', setColumnAttributes(node, { withLocalId: true }), ['div', LAYOUT_CONTENT_ATTRS, 0]]; } }); export const layoutColumnStage0 = layoutColumnWithLocalId;