wishthis/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js

126 lines
3 KiB
JavaScript
Raw Normal View History

2023-08-17 09:47:40 +00:00
let Declaration = require('../declaration')
let {
autoplaceGridItems,
getGridGap,
inheritGridGap,
prefixTrackProp,
prefixTrackValue
} = require('./grid-utils')
let Processor = require('../processor')
class GridRowsColumns extends Declaration {
insert(decl, prefix, prefixes, result) {
if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)
let { parent, prop, value } = decl
let isRowProp = prop.includes('rows')
let isColumnProp = prop.includes('columns')
let hasGridTemplate = parent.some(
i => i.prop === 'grid-template' || i.prop === 'grid-template-areas'
)
2022-01-21 08:28:41 +00:00
/**
* Not to prefix rows declaration if grid-template(-areas) is present
*/
if (hasGridTemplate && isRowProp) {
2023-08-17 09:47:40 +00:00
return false
2022-01-21 08:28:41 +00:00
}
2023-08-17 09:47:40 +00:00
let processor = new Processor({ options: {} })
let status = processor.gridStatus(parent, result)
let gap = getGridGap(decl)
gap = inheritGridGap(decl, gap) || gap
let gapValue = isRowProp ? gap.row : gap.column
2022-01-21 08:28:41 +00:00
if ((status === 'no-autoplace' || status === true) && !hasGridTemplate) {
2023-08-17 09:47:40 +00:00
gapValue = null
2022-01-21 08:28:41 +00:00
}
2023-08-17 09:47:40 +00:00
let prefixValue = prefixTrackValue({
gap: gapValue,
value
})
2022-01-21 08:28:41 +00:00
/**
* Insert prefixes
*/
decl.cloneBefore({
2023-08-17 09:47:40 +00:00
prop: prefixTrackProp({ prefix, prop }),
2022-01-21 08:28:41 +00:00
value: prefixValue
2023-08-17 09:47:40 +00:00
})
let autoflow = parent.nodes.find(i => i.prop === 'grid-auto-flow')
let autoflowValue = 'row'
2022-01-21 08:28:41 +00:00
if (autoflow && !processor.disabled(autoflow, result)) {
2023-08-17 09:47:40 +00:00
autoflowValue = autoflow.value.trim()
2022-01-21 08:28:41 +00:00
}
if (status === 'autoplace') {
/**
* Show warning if grid-template-rows decl is not found
*/
2023-08-17 09:47:40 +00:00
let rowDecl = parent.nodes.find(i => i.prop === 'grid-template-rows')
2022-01-21 08:28:41 +00:00
if (!rowDecl && hasGridTemplate) {
2023-08-17 09:47:40 +00:00
return undefined
2022-01-21 08:28:41 +00:00
} else if (!rowDecl && !hasGridTemplate) {
2023-08-17 09:47:40 +00:00
decl.warn(
result,
'Autoplacement does not work without grid-template-rows property'
)
return undefined
2022-01-21 08:28:41 +00:00
}
2023-08-17 09:47:40 +00:00
2022-01-21 08:28:41 +00:00
/**
* Show warning if grid-template-columns decl is not found
*/
2023-08-17 09:47:40 +00:00
let columnDecl = parent.nodes.find(i => {
return i.prop === 'grid-template-columns'
})
2022-01-21 08:28:41 +00:00
if (!columnDecl && !hasGridTemplate) {
2023-08-17 09:47:40 +00:00
decl.warn(
result,
'Autoplacement does not work without grid-template-columns property'
)
2022-01-21 08:28:41 +00:00
}
2023-08-17 09:47:40 +00:00
2022-01-21 08:28:41 +00:00
/**
* Autoplace grid items
*/
if (isColumnProp && !hasGridTemplate) {
2023-08-17 09:47:40 +00:00
autoplaceGridItems(decl, result, gap, autoflowValue)
2022-01-21 08:28:41 +00:00
}
}
2023-08-17 09:47:40 +00:00
return undefined
}
/**
* Change IE property back
*/
normalize(prop) {
return prop.replace(/^grid-(rows|columns)/, 'grid-template-$1')
}
2022-01-21 08:28:41 +00:00
2023-08-17 09:47:40 +00:00
/**
* Change property name for IE
*/
prefixed(prop, prefix) {
if (prefix === '-ms-') {
return prefixTrackProp({ prefix, prop })
}
return super.prefixed(prop, prefix)
}
}
2022-01-21 08:28:41 +00:00
2023-08-17 09:47:40 +00:00
GridRowsColumns.names = [
'grid-template-rows',
'grid-template-columns',
'grid-rows',
'grid-columns'
]
2022-01-21 08:28:41 +00:00
2023-08-17 09:47:40 +00:00
module.exports = GridRowsColumns