UNPKG

tailwind-bootstrap-grid

Version:

Tailwind CSS plugin to generate Bootstrap flexbox grid system.

199 lines 8.34 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const plugin_1 = __importDefault(require("tailwindcss/plugin")); const zod_1 = require("zod"); module.exports = plugin_1.default.withOptions((pluginOptions) => (options) => { const { config, addBase, addComponents } = options; const screens = config('theme.screens'); const screenKeys = Object.keys(screens).filter((key) => key !== '__CSS_VALUES__'); const pluginOptionsSchema = zod_1.z .object({ debug: zod_1.z.coerce.boolean().default(false), grid_columns: zod_1.z.coerce.number().int().min(3).default(12), grid_gutter_width: zod_1.z.coerce.string().default('1.5rem'), grid_gutters: zod_1.z .array(zod_1.z.coerce.string()) .default(['0', '0']) .refine((value) => value.length % 2 === 0, { message: 'grid_gutters array length must be an even number', }) .transform((value) => { const result = {}; for (let i = 0; i < value.length; i += 2) { result[value[i]] = value[i + 1]; } return result; }), generate_container: zod_1.z.coerce.boolean().default(true), container_max_widths: zod_1.z .array(zod_1.z.coerce.string()) .default([]) .refine((value) => value.length % 2 === 0, { message: 'container_max_widths array length must be an even number', }) .transform((value) => { const result = {}; for (let i = 0; i < value.length; i += 2) { result[value[i]] = value[i + 1]; } return result; }), rtl: zod_1.z.coerce.boolean().default(false), }) .default({}); const parsedPluginOptions = pluginOptionsSchema.safeParse(pluginOptions); if (!parsedPluginOptions.success) { throw new Error(`tailwind-bootstrap-grid options are invalid: ${parsedPluginOptions.error.message}`); } const { debug: _debug, grid_columns, grid_gutter_width, grid_gutters, generate_container, container_max_widths, rtl, } = parsedPluginOptions.data; if (_debug) { console.group('tailwind-bootstrap-grid options'); console.debug('raw input', pluginOptions); console.debug('final output', parsedPluginOptions.data); console.groupEnd(); } const columns = Array.from(Array(grid_columns), (_, index) => index + 1); const rowColsSteps = columns.slice(0, Math.floor(grid_columns / 2)); { // ============================================================================================= // Container // ============================================================================================= if (generate_container) { addBase({ ':root': Object.fromEntries(screenKeys.map((name) => [ `@media (min-width: ${screens[name]})`, { '--container-max-width': container_max_widths[name] || screens[name], }, ])), }); addComponents({ '.container, .container-fluid': { maxWidth: 'var(--container-max-width)', width: '100%', marginRight: 'auto', marginLeft: 'auto', paddingRight: `var(--bs-gutter-x, calc(${grid_gutter_width} / 2))`, paddingLeft: `var(--bs-gutter-x, calc(${grid_gutter_width} / 2))`, }, }); } } { // ============================================================================================= // Row // ============================================================================================= addComponents({ '.row': { '--bs-gutter-x': grid_gutter_width, '--bs-gutter-y': '0', display: 'flex', flexWrap: 'wrap', marginTop: 'calc(var(--bs-gutter-y) * -1)', marginRight: 'calc(var(--bs-gutter-x) / -2)', marginLeft: 'calc(var(--bs-gutter-x) / -2)', '> *': { boxSizing: 'border-box', flexShrink: '0', width: '100%', maxWidth: '100%', paddingRight: 'calc(var(--bs-gutter-x) / 2)', paddingLeft: 'calc(var(--bs-gutter-x) / 2)', marginTop: 'var(--bs-gutter-y)', }, }, }); } { // ============================================================================================= // Columns // ============================================================================================= addComponents([ { '.col': { flex: '1 0 0%', width: 'initial', // "hack" to enforce specific css import order, https://github.com/tailwindlabs/tailwindcss/issues/15045#issuecomment-2488114451 display: 'initial', // "hack" to enforce specific css import order }, '.row-cols-auto': { '> *': { flex: '0 0 auto', width: 'auto', }, }, }, ...rowColsSteps.map((rowCol) => ({ [`.row-cols-${rowCol}`]: { '> *': { flex: '0 0 auto', width: `${100 / rowCol}%`, display: 'initial', // "hack" to enforce specific css import order }, }, })), { '.col-auto': { flex: '0 0 auto', width: 'auto', }, }, ...columns.map((size) => ({ [`.col-${size}`]: { flex: '0 0 auto', width: `${(100 / grid_columns) * size}%`, }, })), ]); } { // ============================================================================================= // Offsets // ============================================================================================= addComponents([ ...[0, ...columns.slice(0, -1)].map((size) => { const margin = `${(100 / grid_columns) * size}%`; return rtl ? { [`[dir="ltr"] .offset-${size}`]: { marginLeft: margin }, [`[dir="rtl"] .offset-${size}`]: { marginRight: margin }, } : { [`.offset-${size}`]: { marginLeft: margin }, }; }), ]); } { // ============================================================================================= // Gutters // ============================================================================================= if (Object.keys(grid_gutters).length) { addComponents(Object.entries(grid_gutters).map(([key, value]) => ({ [`.g-${key}, .gx-${key}`]: { '--bs-gutter-x': value, }, [`.g-${key}, .gy-${key}`]: { '--bs-gutter-y': value, }, }))); } } { // ============================================================================================= // Ordering // ============================================================================================= addComponents([ { '.order-first': { order: '-1' }, '.order-last': { order: `${grid_columns + 1}` }, }, ...[0, ...columns].map((size) => ({ [`.order-${size}`]: { order: `${size}` }, })), ]); } }); //# sourceMappingURL=index.js.map