postcss-sort-media-queries 4.2.1 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,219 +1,259 @@
1
- # PostCSS Sort Media Queries
2
-
3
- [PostCSS]: https://github.com/postcss/postcss
4
- [ci-img]: https://travis-ci.org/solversgroup/postcss-sort-media-queries.svg
5
- [ci]: https://travis-ci.org/solversgroup/postcss-sort-media-queries
6
- [MIT]: https://github.com/solversgroup/postcss-sort-media-queries/blob/master/LICENSE
7
- [official docs]: https://github.com/postcss/postcss#usage
8
- [Releases history]: https://github.com/solversgroup/postcss-sort-media-queries/blob/master/CHANGELOG.md
9
-
10
- [![npm](https://img.shields.io/npm/v/postcss-sort-media-queries.svg)](https://www.npmjs.com/package/postcss-sort-media-queries) [![Build Status][ci-img]][ci]
11
- [![npm](https://img.shields.io/npm/dt/postcss-sort-media-queries.svg)](https://www.npmjs.com/package/postcss-sort-media-queries)
12
-
13
- [PostCSS] plugin for combine and sort CSS media queries with **mobile first** or **desktop first** methods.
14
-
15
- > **Combine** same media queries into one - is a unexpected side effect for this plugin 🧬
16
-
17
- ## Online demo
18
-
19
- And here is the [online demo](https://postcss-sort-media-queries.github.io)
20
-
21
- ## Examples
22
-
23
- ### Mobile first sorting
24
-
25
- ```css
26
- /* before */
27
- @media screen and (max-width: 640px) {
28
- .head { color: #cfcfcf }
29
- }
30
- @media screen and (max-width: 768px) {
31
- .footer { color: #cfcfcf }
32
- }
33
- @media screen and (max-width: 640px) {
34
- .main { color: #cfcfcf }
35
- }
36
- @media screen and (min-width: 1280px) {
37
- .mobile-first { color: #cfcfcf }
38
- }
39
- @media screen and (min-width: 640px) {
40
- .mobile-first { color: #cfcfcf }
41
- }
42
- @media screen and (max-width: 640px) {
43
- .footer { color: #cfcfcf }
44
- }
45
-
46
- /* after */
47
- @media screen and (min-width: 640px) {
48
- .mobile-first { color: #cfcfcf }
49
- }
50
- @media screen and (min-width: 1280px) {
51
- .mobile-first { color: #cfcfcf }
52
- }
53
- @media screen and (max-width: 768px) {
54
- .footer { color: #cfcfcf }
55
- }
56
- @media screen and (max-width: 640px) {
57
- .head { color: #cfcfcf }
58
- .main { color: #cfcfcf }
59
- .footer { color: #cfcfcf }
60
- }
61
- ```
62
-
63
- ### Desktop first sorting
64
-
65
- ```css
66
- /* before */
67
- @media screen and (max-width: 640px) {
68
- .header { color: #cdcdcd }
69
- }
70
- @media screen and (min-width: 760px) {
71
- .desktop-first { color: #cdcdcd }
72
- }
73
- @media screen and (max-width: 640px) {
74
- .main { color: #cdcdcd }
75
- }
76
- @media screen and (min-width: 1280px) {
77
- .desktop-first { color: #cdcdcd }
78
- }
79
- @media screen and (max-width: 760px) {
80
- .footer { color: #cdcdcd }
81
- }
82
- @media screen and (max-width: 640px) {
83
- .footer { color: #cdcdcd }
84
- }
85
-
86
- /* after */
87
- @media screen and (max-width: 760px) {
88
- .footer { color: #cdcdcd }
89
- }
90
- @media screen and (max-width: 640px) {
91
- .header { color: #cdcdcd }
92
- .main { color: #cdcdcd }
93
- .footer { color: #cdcdcd }
94
- }
95
- @media screen and (min-width: 760px) {
96
- .desktop-first { color: #cdcdcd }
97
- }
98
- @media screen and (min-width: 1280px) {
99
- .desktop-first { color: #cdcdcd }
100
- }
101
- ```
102
-
103
- ## Getting Started
104
-
105
- First thing's, install the module:
106
-
107
- ```
108
- npm install postcss postcss-sort-media-queries --save-dev
109
- ```
110
-
111
- ## 🍳 Usage
112
-
113
- Check you project for existed PostCSS config: `postcss.config.js`
114
- in the project root, `"postcss"` section in `package.json`
115
- or `postcss` in bundle config.
116
-
117
- If you already use PostCSS, add the plugin to plugins list:
118
-
119
- ```diff
120
- module.exports = {
121
- plugins: [
122
- + require('postcss-sort-media-queries')({
123
- + // sort: 'mobile-first' default value
124
- + sort: function(a, b) {
125
- + // custom sorting function
126
- + }
127
- + }),
128
- require('autoprefixer')
129
- ]
130
- }
131
- ```
132
-
133
- If you do not use PostCSS, add it according to [official docs]
134
- and set this plugin in settings.
135
-
136
- ## 🍰 Options
137
-
138
- > Sorting works based on [dutchenkoOleg/sort-css-media-queries](https://github.com/dutchenkoOleg/sort-css-media-queries) function.
139
-
140
- ### sort
141
-
142
- This option support **string** or **function** values.
143
-
144
- - `{string}` `'mobile-first'` - (default) mobile first sorting
145
- - `{string}` `'desktop-first'` - desktop first sorting
146
- - `{function}` your own sorting function
147
-
148
- #### `'mobile-first'`
149
-
150
- ```js
151
- postcss([
152
- sortMediaQueries({
153
- sort: 'mobile-first' // default
154
- })
155
- ]).process(css);
156
- ```
157
-
158
- #### `'desktop-first'`
159
-
160
- ```js
161
- postcss([
162
- sortMediaQueries({
163
- sort: 'desktop-first'
164
- })
165
- ]).process(css);
166
- ```
167
-
168
- #### Custom sort function
169
- ```js
170
- postcss([
171
- sortMediaQueries({
172
- function(a, b) {
173
- return a.localeCompare(b);
174
- }
175
- })
176
- ]).process(css);
177
- ```
178
-
179
- In this example, all your media queries will sort by A-Z order.
180
-
181
- This sorting function is directly passed to Array#sort() method of an array of all your media queries.
182
-
183
- ### Sort configuration
184
-
185
- By this configuration you can control sorting behaviour.
186
-
187
- ```js
188
- postcss([
189
- sortMediaQueries({
190
- configuration: {
191
- unitlessMqAlwaysFirst: true, // or false
192
- }
193
- })
194
- ]).process(css);
195
- ```
196
-
197
- Or alternatively create a `sort-css-mq.config.json` file in the root of your project. Or add property `sortCssMQ: {}` in your `package.json`.
198
-
199
- ---
200
-
201
- ## Changelog
202
-
203
- See [Releases history]
204
-
205
- ## License
206
-
207
- [MIT]
208
-
209
- ## Other PostCSS plugins
210
-
211
- - [`postcss-momentum-scrolling`](https://github.com/solversgroup/postcss-momentum-scrolling) - plugin for adding **momentum** style scrolling behavior (`-webkit-overflow-scrolling:touch`) for elements with overflow (scroll, auto) on iOS
212
-
213
- ## Thanks 💪
214
-
215
- - Andrey Sitnik [@ai](https://github.com/ai)
216
- - Jakub Caban [@Lustmored](https://github.com/Lustmored)
217
- - Dmytro Symonov [@Kassaila](https://github.com/Kassaila)
218
- - Kai Falkowski [@SassNinja](https://github.com/SassNinja)
219
- - Олег Дутченко [@dutchenkoOleg](https://github.com/dutchenkoOleg)
1
+ # PostCSS Sort Media Queries
2
+
3
+ [PostCSS]: https://github.com/postcss/postcss
4
+ [MIT]: https://github.com/yunusga/postcss-sort-media-queries/blob/master/LICENSE
5
+ [official docs]: https://github.com/postcss/postcss#usage
6
+ [Releases history]: https://github.com/yunusga/postcss-sort-media-queries/blob/master/CHANGELOG.md
7
+
8
+ [![npm](https://img.shields.io/npm/v/postcss-sort-media-queries.svg)](https://www.npmjs.com/package/postcss-sort-media-queries) [![Node.js CI](https://github.com/yunusga/postcss-sort-media-queries/actions/workflows/test.yml/badge.svg?branch=main&event=status)](https://github.com/yunusga/postcss-sort-media-queries/actions/workflows/test.yml)
9
+ [![npm](https://img.shields.io/npm/dt/postcss-sort-media-queries.svg)](https://www.npmjs.com/package/postcss-sort-media-queries)
10
+
11
+ <img src="logo.svg?sanitize=true" align="right" title="PostCSS sort media queries logotype" width="100" height="100">
12
+
13
+ 🌏 **English** [**O'zbek**](README-UZ.md)
14
+
15
+ [PostCSS] plugin for sorting and combining CSS media queries with **mobile first** / **desktop first** methodologies.
16
+
17
+ > From 5.0.0 plugin support [Media Feature Types: “range”](https://www.w3.org/TR/mediaqueries-4/#mq-ranges)
18
+
19
+ ## Table of Contents
20
+
21
+ - [Online demo](#online-demo)
22
+ - [Examples](#examples)
23
+ - [Mobile first sorting](#mobile-first-sorting)
24
+ - [Desktop first sorting](#desktop-first-sorting)
25
+ - [Install](#install)
26
+ - [Usage](#usage)
27
+ - [Options](#options)
28
+ - [sort](#sort)
29
+ - [Custom sort function](#custom-sort-function)
30
+ - [Sort configuration](#sort-configuration)
31
+ - [Changelog](#changelog)
32
+ - [License](#license)
33
+ - [Other PostCSS plugins](#other-postcss-plugins)
34
+ - [Thanks 💪](#thanks)
35
+
36
+ ## Online demo
37
+
38
+ And here is the [online demo](https://postcss-sort-media-queries.github.io)
39
+
40
+ ## Examples
41
+
42
+ ### Mobile first sorting
43
+
44
+ **before**
45
+
46
+ ```css
47
+ @media screen and (max-width: 640px) {
48
+ .head { color: #cfcfcf }
49
+ }
50
+ @media screen and (max-width: 768px) {
51
+ .footer { color: #cfcfcf }
52
+ }
53
+ @media screen and (max-width: 640px) {
54
+ .main { color: #cfcfcf }
55
+ }
56
+ @media screen and (min-width: 1280px) {
57
+ .mobile-first { color: #cfcfcf }
58
+ }
59
+ @media screen and (min-width: 640px) {
60
+ .mobile-first { color: #cfcfcf }
61
+ }
62
+ @media screen and (max-width: 640px) {
63
+ .footer { color: #cfcfcf }
64
+ }
65
+ ```
66
+
67
+ **after**
68
+
69
+ ```css
70
+ @media screen and (min-width: 640px) {
71
+ .mobile-first { color: #cfcfcf }
72
+ }
73
+ @media screen and (min-width: 1280px) {
74
+ .mobile-first { color: #cfcfcf }
75
+ }
76
+ @media screen and (max-width: 768px) {
77
+ .footer { color: #cfcfcf }
78
+ }
79
+ @media screen and (max-width: 640px) {
80
+ /* combined */
81
+ .head { color: #cfcfcf }
82
+ .main { color: #cfcfcf }
83
+ .footer { color: #cfcfcf }
84
+ }
85
+ ```
86
+
87
+ ### Desktop first sorting
88
+
89
+ **before**
90
+ ```css
91
+ @media screen and (max-width: 640px) {
92
+ .header { color: #cdcdcd }
93
+ }
94
+ @media screen and (min-width: 760px) {
95
+ .desktop-first { color: #cdcdcd }
96
+ }
97
+ @media screen and (max-width: 640px) {
98
+ .main { color: #cdcdcd }
99
+ }
100
+ @media screen and (min-width: 1280px) {
101
+ .desktop-first { color: #cdcdcd }
102
+ }
103
+ @media screen and (max-width: 760px) {
104
+ .footer { color: #cdcdcd }
105
+ }
106
+ @media screen and (max-width: 640px) {
107
+ .footer { color: #cdcdcd }
108
+ }
109
+ ```
110
+
111
+ **after**
112
+
113
+ ```css
114
+ @media screen and (max-width: 760px) {
115
+ .footer { color: #cdcdcd }
116
+ }
117
+ @media screen and (max-width: 640px) {
118
+ /* combined */
119
+ .header { color: #cdcdcd }
120
+ .main { color: #cdcdcd }
121
+ .footer { color: #cdcdcd }
122
+ }
123
+ @media screen and (min-width: 760px) {
124
+ .desktop-first { color: #cdcdcd }
125
+ }
126
+ @media screen and (min-width: 1280px) {
127
+ .desktop-first { color: #cdcdcd }
128
+ }
129
+ ```
130
+
131
+ ## Install
132
+
133
+ First thing's, install the module:
134
+
135
+ ```
136
+ npm install postcss postcss-sort-media-queries --save-dev
137
+ ```
138
+
139
+ ## Usage
140
+
141
+ Check you project for existed PostCSS config: `postcss.config.js`
142
+ in the project root, `"postcss"` section in `package.json`
143
+ or `postcss` in bundle config.
144
+
145
+ If you already use PostCSS, add the plugin to plugins list:
146
+
147
+ ```diff
148
+ module.exports = {
149
+ plugins: [
150
+ + require('postcss-sort-media-queries')({
151
+ + sort: 'mobile-first', // default value
152
+ + }),
153
+ require('autoprefixer')
154
+ ]
155
+ }
156
+ ```
157
+
158
+ or with custom sort function
159
+ ```diff
160
+ module.exports = {
161
+ plugins: [
162
+ + require('postcss-sort-media-queries')({
163
+ + sort: function(a, b) {
164
+ + // custom sorting function
165
+ + }
166
+ + }),
167
+ require('autoprefixer')
168
+ ]
169
+ }
170
+ ```
171
+
172
+ If you do not use PostCSS, add it according to [official docs]
173
+ and set this plugin in settings.
174
+
175
+ ## Options
176
+
177
+ > Sorting works based on [dutchenkoOleg/sort-css-media-queries](https://github.com/dutchenkoOleg/sort-css-media-queries) function.
178
+
179
+ ### sort
180
+
181
+ This option support **string** or **function** values.
182
+
183
+ - `{string}` `'mobile-first'` - (default) mobile first sorting
184
+ - `{string}` `'desktop-first'` - desktop first sorting
185
+ - `{function}` your own sorting function
186
+
187
+ #### `'mobile-first'`
188
+
189
+ ```js
190
+ postcss([
191
+ sortMediaQueries({
192
+ sort: 'mobile-first' // default
193
+ })
194
+ ]).process(css);
195
+ ```
196
+
197
+ #### `'desktop-first'`
198
+
199
+ ```js
200
+ postcss([
201
+ sortMediaQueries({
202
+ sort: 'desktop-first'
203
+ })
204
+ ]).process(css);
205
+ ```
206
+
207
+ ### Custom sort function
208
+ ```js
209
+ postcss([
210
+ sortMediaQueries({
211
+ function(a, b) {
212
+ return a.localeCompare(b);
213
+ }
214
+ })
215
+ ]).process(css);
216
+ ```
217
+
218
+ In this example, all your media queries will sort by A-Z order.
219
+
220
+ This sorting function is directly passed to Array#sort() method of an array of all your media queries.
221
+
222
+ ### Sort configuration
223
+
224
+ By this configuration you can control sorting behaviour.
225
+
226
+ ```js
227
+ postcss([
228
+ sortMediaQueries({
229
+ configuration: {
230
+ unitlessMqAlwaysFirst: true, // or false
231
+ }
232
+ })
233
+ ]).process(css);
234
+ ```
235
+
236
+ Or alternatively create a `sort-css-mq.config.json` file in the root of your project. Or add property `sortCssMQ: {}` in your `package.json`.
237
+
238
+ ---
239
+
240
+ ## Changelog
241
+
242
+ See [Releases history]
243
+
244
+ ## License
245
+
246
+ [MIT]
247
+
248
+ ## Other PostCSS plugins
249
+
250
+ - [`postcss-momentum-scrolling`](https://github.com/solversgroup/postcss-momentum-scrolling) - plugin for adding **momentum** style scrolling behavior (`-webkit-overflow-scrolling:touch`) for elements with overflow (scroll, auto) on iOS
251
+
252
+ ## Thanks
253
+
254
+ - Andrey Sitnik [@ai](https://github.com/ai)
255
+ - Oleh Dutchenko [@dutchenkoOleg](https://github.com/dutchenkoOleg)
256
+ - Jakub Caban [@Lustmored](https://github.com/Lustmored)
257
+ - Dmytro Symonov [@Kassaila](https://github.com/Kassaila)
258
+ - Kai Falkowski [@SassNinja](https://github.com/SassNinja)
259
+ - Khayot Razzakov [@SassNinja](https://github.com/Khayotbek1)
package/browser.js CHANGED
@@ -1,54 +1,54 @@
1
- function sortAtRules(queries, sort, sortCSSmq) {
2
- if (typeof sort !== 'function') {
3
- sort = sort === 'desktop-first' ? sortCSSmq.desktopFirst : sortCSSmq
4
- }
5
-
6
- return queries.sort(sort)
7
- }
8
-
9
- module.exports = (opts = {}) => {
10
-
11
- opts = Object.assign(
12
- {
13
- sort: 'mobile-first',
14
- configuration: {
15
- unitlessMqAlwaysFirst: false,
16
- },
17
- },
18
- opts
19
- )
20
-
21
- const createSort = require('sort-css-media-queries/lib/create-sort');
22
- const sortCSSmq = createSort(opts.configuration);
23
-
24
- return {
25
- postcssPlugin: 'postcss-sort-media-queries',
26
- OnceExit(root, { AtRule }) {
27
-
28
- let atRules = [];
29
-
30
- root.walkAtRules('media', atRule => {
31
- let query = atRule.params
32
-
33
- if (!atRules[query]) {
34
- atRules[query] = new AtRule({
35
- name: atRule.name,
36
- params: atRule.params,
37
- source: atRule.source
38
- })
39
- }
40
-
41
- atRule.nodes.forEach(node => {
42
- atRules[query].append(node.clone())
43
- })
44
-
45
- atRule.remove()
46
- })
47
-
48
- sortAtRules(Object.keys(atRules), opts.sort, sortCSSmq).forEach(query => {
49
- root.append(atRules[query])
50
- })
51
- }
52
- }
53
- }
54
- module.exports.postcss = true
1
+ function sortAtRules(queries, sort, sortCSSmq) {
2
+ if (typeof sort !== 'function') {
3
+ sort = sort === 'desktop-first' ? sortCSSmq.desktopFirst : sortCSSmq
4
+ }
5
+
6
+ return queries.sort(sort)
7
+ }
8
+
9
+ module.exports = (opts = {}) => {
10
+
11
+ opts = Object.assign(
12
+ {
13
+ sort: 'mobile-first',
14
+ configuration: {
15
+ unitlessMqAlwaysFirst: false,
16
+ },
17
+ },
18
+ opts
19
+ )
20
+
21
+ const createSort = require('sort-css-media-queries/lib/create-sort');
22
+ const sortCSSmq = createSort(opts.configuration);
23
+
24
+ return {
25
+ postcssPlugin: 'postcss-sort-media-queries',
26
+ OnceExit(root, { AtRule }) {
27
+
28
+ let atRules = [];
29
+
30
+ root.walkAtRules('media', atRule => {
31
+ let query = atRule.params
32
+
33
+ if (!atRules[query]) {
34
+ atRules[query] = new AtRule({
35
+ name: atRule.name,
36
+ params: atRule.params,
37
+ source: atRule.source
38
+ })
39
+ }
40
+
41
+ atRule.nodes.forEach(node => {
42
+ atRules[query].append(node.clone())
43
+ })
44
+
45
+ atRule.remove()
46
+ })
47
+
48
+ sortAtRules(Object.keys(atRules), opts.sort, sortCSSmq).forEach(query => {
49
+ root.append(atRules[query])
50
+ })
51
+ }
52
+ }
53
+ }
54
+ module.exports.postcss = true