68 lines
2.0 KiB
JavaScript
68 lines
2.0 KiB
JavaScript
import { isString } from '@unocss/core';
|
|
import { resolveBreakpoints } from '@unocss/preset-mini/utils';
|
|
|
|
const queryMatcher = /@media \(min-width: (.+)\)/;
|
|
const container = [
|
|
[
|
|
/^__container$/,
|
|
(m, context) => {
|
|
const { theme, variantHandlers } = context;
|
|
const themePadding = theme.container?.padding;
|
|
let padding;
|
|
if (isString(themePadding))
|
|
padding = themePadding;
|
|
else
|
|
padding = themePadding?.DEFAULT;
|
|
const themeMaxWidth = theme.container?.maxWidth;
|
|
let maxWidth;
|
|
for (const v of variantHandlers) {
|
|
const query = v.handle?.({}, (x) => x)?.parent;
|
|
if (isString(query)) {
|
|
const match = query.match(queryMatcher)?.[1];
|
|
if (match) {
|
|
const bp = resolveBreakpoints(context) ?? [];
|
|
const matchBp = bp.find((i) => i.size === match)?.point;
|
|
if (!themeMaxWidth)
|
|
maxWidth = match;
|
|
else if (matchBp)
|
|
maxWidth = themeMaxWidth?.[matchBp];
|
|
if (matchBp && !isString(themePadding))
|
|
padding = themePadding?.[matchBp] ?? padding;
|
|
}
|
|
}
|
|
}
|
|
const css = {
|
|
"max-width": maxWidth
|
|
};
|
|
if (!variantHandlers.length)
|
|
css.width = "100%";
|
|
if (theme.container?.center) {
|
|
css["margin-left"] = "auto";
|
|
css["margin-right"] = "auto";
|
|
}
|
|
if (themePadding) {
|
|
css["padding-left"] = padding;
|
|
css["padding-right"] = padding;
|
|
}
|
|
return css;
|
|
},
|
|
{ internal: true }
|
|
]
|
|
];
|
|
const containerShortcuts = [
|
|
[/^(?:(\w+)[:-])?container$/, ([, bp], context) => {
|
|
let points = (resolveBreakpoints(context) ?? []).map((i) => i.point);
|
|
if (bp) {
|
|
if (!points.includes(bp))
|
|
return;
|
|
points = points.slice(points.indexOf(bp));
|
|
}
|
|
const shortcuts = points.map((p) => `${p}:__container`);
|
|
if (!bp)
|
|
shortcuts.unshift("__container");
|
|
return shortcuts;
|
|
}]
|
|
];
|
|
|
|
export { containerShortcuts as a, container as c };
|