|
|
let Declaration = require('../declaration') let { getGridGap, inheritGridGap, parseGridAreas, prefixTrackProp, prefixTrackValue, warnGridGap, warnMissedAreas } = require('./grid-utils')
function getGridRows(tpl) { return tpl .trim() .slice(1, -1) .split(/["']\s*["']?/g) }
class GridTemplateAreas extends Declaration { /** * Translate grid-template-areas to separate -ms- prefixed properties */ insert(decl, prefix, prefixes, result) { if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)
let hasColumns = false let hasRows = false let parent = decl.parent let gap = getGridGap(decl) gap = inheritGridGap(decl, gap) || gap
// remove already prefixed rows
// to prevent doubling prefixes
parent.walkDecls(/-ms-grid-rows/, i => i.remove())
// add empty tracks to rows
parent.walkDecls(/grid-template-(rows|columns)/, trackDecl => { if (trackDecl.prop === 'grid-template-rows') { hasRows = true let { prop, value } = trackDecl trackDecl.cloneBefore({ prop: prefixTrackProp({ prefix, prop }), value: prefixTrackValue({ gap: gap.row, value }) }) } else { hasColumns = true } })
let gridRows = getGridRows(decl.value)
if (hasColumns && !hasRows && gap.row && gridRows.length > 1) { decl.cloneBefore({ prop: '-ms-grid-rows', raws: {}, value: prefixTrackValue({ gap: gap.row, value: `repeat(${gridRows.length}, auto)` }) }) }
// warnings
warnGridGap({ decl, gap, hasColumns, result })
let areas = parseGridAreas({ gap, rows: gridRows })
warnMissedAreas(areas, decl, result)
return decl } }
GridTemplateAreas.names = ['grid-template-areas']
module.exports = GridTemplateAreas
|