123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /**
- * @typedef {object} ScreenValue
- * @property {number|undefined} min
- * @property {number|undefined} max
- * @property {string|undefined} raw
- */ /**
- * @typedef {object} Screen
- * @property {string} name
- * @property {boolean} not
- * @property {ScreenValue[]} values
- */ /**
- * A function that normalizes the various forms that the screens object can be
- * provided in.
- *
- * Input(s):
- * - ['100px', '200px'] // Raw strings
- * - { sm: '100px', md: '200px' } // Object with string values
- * - { sm: { min: '100px' }, md: { max: '100px' } } // Object with object values
- * - { sm: [{ min: '100px' }, { max: '200px' }] } // Object with object array (multiple values)
- *
- * Output(s):
- * - [{ name: 'sm', values: [{ min: '100px', max: '200px' }] }] // List of objects, that contains multiple values
- *
- * @returns {Screen[]}
- */ "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- function _export(target, all) {
- for(var name in all)Object.defineProperty(target, name, {
- enumerable: true,
- get: all[name]
- });
- }
- _export(exports, {
- normalizeScreens: function() {
- return normalizeScreens;
- },
- isScreenSortable: function() {
- return isScreenSortable;
- },
- compareScreens: function() {
- return compareScreens;
- },
- toScreen: function() {
- return toScreen;
- }
- });
- function normalizeScreens(screens, root = true) {
- if (Array.isArray(screens)) {
- return screens.map((screen)=>{
- if (root && Array.isArray(screen)) {
- throw new Error("The tuple syntax is not supported for `screens`.");
- }
- if (typeof screen === "string") {
- return {
- name: screen.toString(),
- not: false,
- values: [
- {
- min: screen,
- max: undefined
- }
- ]
- };
- }
- let [name, options] = screen;
- name = name.toString();
- if (typeof options === "string") {
- return {
- name,
- not: false,
- values: [
- {
- min: options,
- max: undefined
- }
- ]
- };
- }
- if (Array.isArray(options)) {
- return {
- name,
- not: false,
- values: options.map((option)=>resolveValue(option))
- };
- }
- return {
- name,
- not: false,
- values: [
- resolveValue(options)
- ]
- };
- });
- }
- return normalizeScreens(Object.entries(screens !== null && screens !== void 0 ? screens : {}), false);
- }
- function isScreenSortable(screen) {
- if (screen.values.length !== 1) {
- return {
- result: false,
- reason: "multiple-values"
- };
- } else if (screen.values[0].raw !== undefined) {
- return {
- result: false,
- reason: "raw-values"
- };
- } else if (screen.values[0].min !== undefined && screen.values[0].max !== undefined) {
- return {
- result: false,
- reason: "min-and-max"
- };
- }
- return {
- result: true,
- reason: null
- };
- }
- function compareScreens(type, a, z) {
- let aScreen = toScreen(a, type);
- let zScreen = toScreen(z, type);
- let aSorting = isScreenSortable(aScreen);
- let bSorting = isScreenSortable(zScreen);
- // These cases should never happen and indicate a bug in Tailwind CSS itself
- if (aSorting.reason === "multiple-values" || bSorting.reason === "multiple-values") {
- throw new Error("Attempted to sort a screen with multiple values. This should never happen. Please open a bug report.");
- } else if (aSorting.reason === "raw-values" || bSorting.reason === "raw-values") {
- throw new Error("Attempted to sort a screen with raw values. This should never happen. Please open a bug report.");
- } else if (aSorting.reason === "min-and-max" || bSorting.reason === "min-and-max") {
- throw new Error("Attempted to sort a screen with both min and max values. This should never happen. Please open a bug report.");
- }
- // Let the sorting begin
- let { min: aMin , max: aMax } = aScreen.values[0];
- let { min: zMin , max: zMax } = zScreen.values[0];
- // Negating screens flip their behavior. Basically `not min-width` is `max-width`
- if (a.not) [aMin, aMax] = [
- aMax,
- aMin
- ];
- if (z.not) [zMin, zMax] = [
- zMax,
- zMin
- ];
- aMin = aMin === undefined ? aMin : parseFloat(aMin);
- aMax = aMax === undefined ? aMax : parseFloat(aMax);
- zMin = zMin === undefined ? zMin : parseFloat(zMin);
- zMax = zMax === undefined ? zMax : parseFloat(zMax);
- let [aValue, zValue] = type === "min" ? [
- aMin,
- zMin
- ] : [
- zMax,
- aMax
- ];
- return aValue - zValue;
- }
- function toScreen(value, type) {
- if (typeof value === "object") {
- return value;
- }
- return {
- name: "arbitrary-screen",
- values: [
- {
- [type]: value
- }
- ]
- };
- }
- function resolveValue({ "min-width": _minWidth , min =_minWidth , max , raw } = {}) {
- return {
- min,
- max,
- raw
- };
- }
|