create-jant 0.1.13 → 0.1.14

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.
Files changed (163) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
  3. package/template/node_modules/@jant/core/CHANGELOG.md +6 -0
  4. package/template/node_modules/@jant/core/package.json +1 -5
  5. package/template/node_modules/@jant/core/src/preset.css +3 -1
  6. package/template/node_modules/@tailwindcss/{postcss → vite}/README.md +11 -61
  7. package/template/node_modules/@tailwindcss/vite/dist/index.d.mts +13 -0
  8. package/template/node_modules/@tailwindcss/vite/dist/index.mjs +1 -0
  9. package/template/node_modules/@tailwindcss/vite/node_modules/.bin/vite +21 -0
  10. package/template/node_modules/@tailwindcss/vite/package.json +42 -0
  11. package/template/package.json +1 -3
  12. package/template/src/style.css +0 -3
  13. package/template/vite.config.ts +2 -8
  14. package/template/node_modules/.bin/autoprefixer +0 -21
  15. package/template/node_modules/@jant/core/src/tailwind.ts +0 -20
  16. package/template/node_modules/@tailwindcss/postcss/dist/index.d.mts +0 -25
  17. package/template/node_modules/@tailwindcss/postcss/dist/index.d.ts +0 -25
  18. package/template/node_modules/@tailwindcss/postcss/dist/index.js +0 -10
  19. package/template/node_modules/@tailwindcss/postcss/dist/index.mjs +0 -10
  20. package/template/node_modules/@tailwindcss/postcss/package.json +0 -46
  21. package/template/node_modules/autoprefixer/LICENSE +0 -20
  22. package/template/node_modules/autoprefixer/README.md +0 -57
  23. package/template/node_modules/autoprefixer/bin/autoprefixer +0 -22
  24. package/template/node_modules/autoprefixer/data/prefixes.js +0 -1139
  25. package/template/node_modules/autoprefixer/lib/at-rule.js +0 -35
  26. package/template/node_modules/autoprefixer/lib/autoprefixer.d.ts +0 -95
  27. package/template/node_modules/autoprefixer/lib/autoprefixer.js +0 -164
  28. package/template/node_modules/autoprefixer/lib/brackets.js +0 -51
  29. package/template/node_modules/autoprefixer/lib/browsers.js +0 -79
  30. package/template/node_modules/autoprefixer/lib/declaration.js +0 -187
  31. package/template/node_modules/autoprefixer/lib/hacks/align-content.js +0 -49
  32. package/template/node_modules/autoprefixer/lib/hacks/align-items.js +0 -46
  33. package/template/node_modules/autoprefixer/lib/hacks/align-self.js +0 -56
  34. package/template/node_modules/autoprefixer/lib/hacks/animation.js +0 -17
  35. package/template/node_modules/autoprefixer/lib/hacks/appearance.js +0 -23
  36. package/template/node_modules/autoprefixer/lib/hacks/autofill.js +0 -26
  37. package/template/node_modules/autoprefixer/lib/hacks/backdrop-filter.js +0 -20
  38. package/template/node_modules/autoprefixer/lib/hacks/background-clip.js +0 -24
  39. package/template/node_modules/autoprefixer/lib/hacks/background-size.js +0 -23
  40. package/template/node_modules/autoprefixer/lib/hacks/block-logical.js +0 -40
  41. package/template/node_modules/autoprefixer/lib/hacks/border-image.js +0 -15
  42. package/template/node_modules/autoprefixer/lib/hacks/border-radius.js +0 -40
  43. package/template/node_modules/autoprefixer/lib/hacks/break-props.js +0 -63
  44. package/template/node_modules/autoprefixer/lib/hacks/cross-fade.js +0 -35
  45. package/template/node_modules/autoprefixer/lib/hacks/display-flex.js +0 -65
  46. package/template/node_modules/autoprefixer/lib/hacks/display-grid.js +0 -21
  47. package/template/node_modules/autoprefixer/lib/hacks/file-selector-button.js +0 -26
  48. package/template/node_modules/autoprefixer/lib/hacks/filter-value.js +0 -14
  49. package/template/node_modules/autoprefixer/lib/hacks/filter.js +0 -19
  50. package/template/node_modules/autoprefixer/lib/hacks/flex-basis.js +0 -39
  51. package/template/node_modules/autoprefixer/lib/hacks/flex-direction.js +0 -72
  52. package/template/node_modules/autoprefixer/lib/hacks/flex-flow.js +0 -53
  53. package/template/node_modules/autoprefixer/lib/hacks/flex-grow.js +0 -30
  54. package/template/node_modules/autoprefixer/lib/hacks/flex-shrink.js +0 -39
  55. package/template/node_modules/autoprefixer/lib/hacks/flex-spec.js +0 -19
  56. package/template/node_modules/autoprefixer/lib/hacks/flex-wrap.js +0 -19
  57. package/template/node_modules/autoprefixer/lib/hacks/flex.js +0 -54
  58. package/template/node_modules/autoprefixer/lib/hacks/fullscreen.js +0 -20
  59. package/template/node_modules/autoprefixer/lib/hacks/gradient.js +0 -447
  60. package/template/node_modules/autoprefixer/lib/hacks/grid-area.js +0 -34
  61. package/template/node_modules/autoprefixer/lib/hacks/grid-column-align.js +0 -28
  62. package/template/node_modules/autoprefixer/lib/hacks/grid-end.js +0 -52
  63. package/template/node_modules/autoprefixer/lib/hacks/grid-row-align.js +0 -28
  64. package/template/node_modules/autoprefixer/lib/hacks/grid-row-column.js +0 -33
  65. package/template/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js +0 -125
  66. package/template/node_modules/autoprefixer/lib/hacks/grid-start.js +0 -33
  67. package/template/node_modules/autoprefixer/lib/hacks/grid-template-areas.js +0 -84
  68. package/template/node_modules/autoprefixer/lib/hacks/grid-template.js +0 -69
  69. package/template/node_modules/autoprefixer/lib/hacks/grid-utils.js +0 -1117
  70. package/template/node_modules/autoprefixer/lib/hacks/image-rendering.js +0 -48
  71. package/template/node_modules/autoprefixer/lib/hacks/image-set.js +0 -18
  72. package/template/node_modules/autoprefixer/lib/hacks/inline-logical.js +0 -34
  73. package/template/node_modules/autoprefixer/lib/hacks/intrinsic.js +0 -61
  74. package/template/node_modules/autoprefixer/lib/hacks/justify-content.js +0 -54
  75. package/template/node_modules/autoprefixer/lib/hacks/mask-border.js +0 -38
  76. package/template/node_modules/autoprefixer/lib/hacks/mask-composite.js +0 -88
  77. package/template/node_modules/autoprefixer/lib/hacks/order.js +0 -42
  78. package/template/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js +0 -33
  79. package/template/node_modules/autoprefixer/lib/hacks/pixelated.js +0 -34
  80. package/template/node_modules/autoprefixer/lib/hacks/place-self.js +0 -32
  81. package/template/node_modules/autoprefixer/lib/hacks/placeholder-shown.js +0 -19
  82. package/template/node_modules/autoprefixer/lib/hacks/placeholder.js +0 -33
  83. package/template/node_modules/autoprefixer/lib/hacks/print-color-adjust.js +0 -25
  84. package/template/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js +0 -23
  85. package/template/node_modules/autoprefixer/lib/hacks/text-decoration.js +0 -25
  86. package/template/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js +0 -14
  87. package/template/node_modules/autoprefixer/lib/hacks/transform-decl.js +0 -79
  88. package/template/node_modules/autoprefixer/lib/hacks/user-select.js +0 -33
  89. package/template/node_modules/autoprefixer/lib/hacks/writing-mode.js +0 -42
  90. package/template/node_modules/autoprefixer/lib/info.js +0 -123
  91. package/template/node_modules/autoprefixer/lib/old-selector.js +0 -67
  92. package/template/node_modules/autoprefixer/lib/old-value.js +0 -22
  93. package/template/node_modules/autoprefixer/lib/prefixer.js +0 -144
  94. package/template/node_modules/autoprefixer/lib/prefixes.js +0 -428
  95. package/template/node_modules/autoprefixer/lib/processor.js +0 -709
  96. package/template/node_modules/autoprefixer/lib/resolution.js +0 -97
  97. package/template/node_modules/autoprefixer/lib/selector.js +0 -150
  98. package/template/node_modules/autoprefixer/lib/supports.js +0 -302
  99. package/template/node_modules/autoprefixer/lib/transition.js +0 -329
  100. package/template/node_modules/autoprefixer/lib/utils.js +0 -93
  101. package/template/node_modules/autoprefixer/lib/value.js +0 -125
  102. package/template/node_modules/autoprefixer/lib/vendor.js +0 -14
  103. package/template/node_modules/autoprefixer/node_modules/.bin/autoprefixer +0 -21
  104. package/template/node_modules/autoprefixer/node_modules/.bin/browserslist +0 -21
  105. package/template/node_modules/autoprefixer/package.json +0 -48
  106. package/template/node_modules/postcss/LICENSE +0 -20
  107. package/template/node_modules/postcss/README.md +0 -29
  108. package/template/node_modules/postcss/lib/at-rule.d.ts +0 -140
  109. package/template/node_modules/postcss/lib/at-rule.js +0 -25
  110. package/template/node_modules/postcss/lib/comment.d.ts +0 -68
  111. package/template/node_modules/postcss/lib/comment.js +0 -13
  112. package/template/node_modules/postcss/lib/container.d.ts +0 -483
  113. package/template/node_modules/postcss/lib/container.js +0 -447
  114. package/template/node_modules/postcss/lib/css-syntax-error.d.ts +0 -248
  115. package/template/node_modules/postcss/lib/css-syntax-error.js +0 -133
  116. package/template/node_modules/postcss/lib/declaration.d.ts +0 -151
  117. package/template/node_modules/postcss/lib/declaration.js +0 -24
  118. package/template/node_modules/postcss/lib/document.d.ts +0 -69
  119. package/template/node_modules/postcss/lib/document.js +0 -33
  120. package/template/node_modules/postcss/lib/fromJSON.d.ts +0 -9
  121. package/template/node_modules/postcss/lib/fromJSON.js +0 -54
  122. package/template/node_modules/postcss/lib/input.d.ts +0 -227
  123. package/template/node_modules/postcss/lib/input.js +0 -265
  124. package/template/node_modules/postcss/lib/lazy-result.d.ts +0 -190
  125. package/template/node_modules/postcss/lib/lazy-result.js +0 -550
  126. package/template/node_modules/postcss/lib/list.d.ts +0 -60
  127. package/template/node_modules/postcss/lib/list.js +0 -58
  128. package/template/node_modules/postcss/lib/map-generator.js +0 -368
  129. package/template/node_modules/postcss/lib/no-work-result.d.ts +0 -46
  130. package/template/node_modules/postcss/lib/no-work-result.js +0 -138
  131. package/template/node_modules/postcss/lib/node.d.ts +0 -556
  132. package/template/node_modules/postcss/lib/node.js +0 -449
  133. package/template/node_modules/postcss/lib/parse.d.ts +0 -9
  134. package/template/node_modules/postcss/lib/parse.js +0 -42
  135. package/template/node_modules/postcss/lib/parser.js +0 -611
  136. package/template/node_modules/postcss/lib/postcss.d.mts +0 -69
  137. package/template/node_modules/postcss/lib/postcss.d.ts +0 -458
  138. package/template/node_modules/postcss/lib/postcss.js +0 -101
  139. package/template/node_modules/postcss/lib/postcss.mjs +0 -30
  140. package/template/node_modules/postcss/lib/previous-map.d.ts +0 -81
  141. package/template/node_modules/postcss/lib/previous-map.js +0 -144
  142. package/template/node_modules/postcss/lib/processor.d.ts +0 -115
  143. package/template/node_modules/postcss/lib/processor.js +0 -67
  144. package/template/node_modules/postcss/lib/result.d.ts +0 -205
  145. package/template/node_modules/postcss/lib/result.js +0 -42
  146. package/template/node_modules/postcss/lib/root.d.ts +0 -87
  147. package/template/node_modules/postcss/lib/root.js +0 -61
  148. package/template/node_modules/postcss/lib/rule.d.ts +0 -126
  149. package/template/node_modules/postcss/lib/rule.js +0 -27
  150. package/template/node_modules/postcss/lib/stringifier.d.ts +0 -46
  151. package/template/node_modules/postcss/lib/stringifier.js +0 -353
  152. package/template/node_modules/postcss/lib/stringify.d.ts +0 -9
  153. package/template/node_modules/postcss/lib/stringify.js +0 -11
  154. package/template/node_modules/postcss/lib/symbols.js +0 -5
  155. package/template/node_modules/postcss/lib/terminal-highlight.js +0 -70
  156. package/template/node_modules/postcss/lib/tokenize.js +0 -266
  157. package/template/node_modules/postcss/lib/warn-once.js +0 -13
  158. package/template/node_modules/postcss/lib/warning.d.ts +0 -147
  159. package/template/node_modules/postcss/lib/warning.js +0 -37
  160. package/template/node_modules/postcss/node_modules/.bin/nanoid +0 -21
  161. package/template/node_modules/postcss/package.json +0 -88
  162. package/template/tailwind.config.ts +0 -13
  163. /package/template/node_modules/@tailwindcss/{postcss → vite}/LICENSE +0 -0
@@ -1,1117 +0,0 @@
1
- let parser = require('postcss-value-parser')
2
- let list = require('postcss').list
3
-
4
- let uniq = require('../utils').uniq
5
- let escapeRegexp = require('../utils').escapeRegexp
6
- let splitSelector = require('../utils').splitSelector
7
-
8
- function convert(value) {
9
- if (
10
- value &&
11
- value.length === 2 &&
12
- value[0] === 'span' &&
13
- parseInt(value[1], 10) > 0
14
- ) {
15
- return [false, parseInt(value[1], 10)]
16
- }
17
-
18
- if (value && value.length === 1 && parseInt(value[0], 10) > 0) {
19
- return [parseInt(value[0], 10), false]
20
- }
21
-
22
- return [false, false]
23
- }
24
-
25
- exports.translate = translate
26
-
27
- function translate(values, startIndex, endIndex) {
28
- let startValue = values[startIndex]
29
- let endValue = values[endIndex]
30
-
31
- if (!startValue) {
32
- return [false, false]
33
- }
34
-
35
- let [start, spanStart] = convert(startValue)
36
- let [end, spanEnd] = convert(endValue)
37
-
38
- if (start && !endValue) {
39
- return [start, false]
40
- }
41
-
42
- if (spanStart && end) {
43
- return [end - spanStart, spanStart]
44
- }
45
-
46
- if (start && spanEnd) {
47
- return [start, spanEnd]
48
- }
49
-
50
- if (start && end) {
51
- return [start, end - start]
52
- }
53
-
54
- return [false, false]
55
- }
56
-
57
- exports.parse = parse
58
-
59
- function parse(decl) {
60
- let node = parser(decl.value)
61
-
62
- let values = []
63
- let current = 0
64
- values[current] = []
65
-
66
- for (let i of node.nodes) {
67
- if (i.type === 'div') {
68
- current += 1
69
- values[current] = []
70
- } else if (i.type === 'word') {
71
- values[current].push(i.value)
72
- }
73
- }
74
-
75
- return values
76
- }
77
-
78
- exports.insertDecl = insertDecl
79
-
80
- function insertDecl(decl, prop, value) {
81
- if (value && !decl.parent.some(i => i.prop === `-ms-${prop}`)) {
82
- decl.cloneBefore({
83
- prop: `-ms-${prop}`,
84
- value: value.toString()
85
- })
86
- }
87
- }
88
-
89
- // Track transforms
90
-
91
- exports.prefixTrackProp = prefixTrackProp
92
-
93
- function prefixTrackProp({ prefix, prop }) {
94
- return prefix + prop.replace('template-', '')
95
- }
96
-
97
- function transformRepeat({ nodes }, { gap }) {
98
- let { count, size } = nodes.reduce(
99
- (result, node) => {
100
- if (node.type === 'div' && node.value === ',') {
101
- result.key = 'size'
102
- } else {
103
- result[result.key].push(parser.stringify(node))
104
- }
105
- return result
106
- },
107
- {
108
- count: [],
109
- key: 'count',
110
- size: []
111
- }
112
- )
113
-
114
- // insert gap values
115
- if (gap) {
116
- size = size.filter(i => i.trim())
117
- let val = []
118
- for (let i = 1; i <= count; i++) {
119
- size.forEach((item, index) => {
120
- if (index > 0 || i > 1) {
121
- val.push(gap)
122
- }
123
- val.push(item)
124
- })
125
- }
126
-
127
- return val.join(' ')
128
- }
129
-
130
- return `(${size.join('')})[${count.join('')}]`
131
- }
132
-
133
- exports.prefixTrackValue = prefixTrackValue
134
-
135
- function prefixTrackValue({ gap, value }) {
136
- let result = parser(value).nodes.reduce((nodes, node) => {
137
- if (node.type === 'function' && node.value === 'repeat') {
138
- nodes.push({
139
- type: 'word',
140
- value: transformRepeat(node, { gap })
141
- })
142
- return nodes
143
- }
144
- if (gap && node.type === 'space') {
145
- nodes.push(
146
- {
147
- type: 'space',
148
- value: ' '
149
- },
150
- {
151
- type: 'word',
152
- value: gap
153
- },
154
- node
155
- )
156
- return nodes
157
- }
158
- nodes.push(node)
159
- return nodes
160
- }, [])
161
-
162
- return parser.stringify(result)
163
- }
164
-
165
- // Parse grid-template-areas
166
-
167
- let DOTS = /^\.+$/
168
-
169
- function track(start, end) {
170
- return { end, span: end - start, start }
171
- }
172
-
173
- function getColumns(line) {
174
- return line.trim().split(/\s+/g)
175
- }
176
-
177
- exports.parseGridAreas = parseGridAreas
178
-
179
- function parseGridAreas({ gap, rows }) {
180
- return rows.reduce((areas, line, rowIndex) => {
181
- if (gap.row) rowIndex *= 2
182
-
183
- if (line.trim() === '') return areas
184
-
185
- getColumns(line).forEach((area, columnIndex) => {
186
- if (DOTS.test(area)) return
187
-
188
- if (gap.column) columnIndex *= 2
189
-
190
- if (typeof areas[area] === 'undefined') {
191
- areas[area] = {
192
- column: track(columnIndex + 1, columnIndex + 2),
193
- row: track(rowIndex + 1, rowIndex + 2)
194
- }
195
- } else {
196
- let { column, row } = areas[area]
197
-
198
- column.start = Math.min(column.start, columnIndex + 1)
199
- column.end = Math.max(column.end, columnIndex + 2)
200
- column.span = column.end - column.start
201
-
202
- row.start = Math.min(row.start, rowIndex + 1)
203
- row.end = Math.max(row.end, rowIndex + 2)
204
- row.span = row.end - row.start
205
- }
206
- })
207
-
208
- return areas
209
- }, {})
210
- }
211
-
212
- // Parse grid-template
213
-
214
- function testTrack(node) {
215
- return node.type === 'word' && /^\[.+]$/.test(node.value)
216
- }
217
-
218
- function verifyRowSize(result) {
219
- if (result.areas.length > result.rows.length) {
220
- result.rows.push('auto')
221
- }
222
- return result
223
- }
224
-
225
- exports.parseTemplate = parseTemplate
226
-
227
- function parseTemplate({ decl, gap }) {
228
- let gridTemplate = parser(decl.value).nodes.reduce(
229
- (result, node) => {
230
- let { type, value } = node
231
-
232
- if (testTrack(node) || type === 'space') return result
233
-
234
- // area
235
- if (type === 'string') {
236
- result = verifyRowSize(result)
237
- result.areas.push(value)
238
- }
239
-
240
- // values and function
241
- if (type === 'word' || type === 'function') {
242
- result[result.key].push(parser.stringify(node))
243
- }
244
-
245
- // divider(/)
246
- if (type === 'div' && value === '/') {
247
- result.key = 'columns'
248
- result = verifyRowSize(result)
249
- }
250
-
251
- return result
252
- },
253
- {
254
- areas: [],
255
- columns: [],
256
- key: 'rows',
257
- rows: []
258
- }
259
- )
260
-
261
- return {
262
- areas: parseGridAreas({
263
- gap,
264
- rows: gridTemplate.areas
265
- }),
266
- columns: prefixTrackValue({
267
- gap: gap.column,
268
- value: gridTemplate.columns.join(' ')
269
- }),
270
- rows: prefixTrackValue({
271
- gap: gap.row,
272
- value: gridTemplate.rows.join(' ')
273
- })
274
- }
275
- }
276
-
277
- // Insert parsed grid areas
278
-
279
- /**
280
- * Get an array of -ms- prefixed props and values
281
- * @param {Object} [area] area object with column and row data
282
- * @param {Boolean} [addRowSpan] should we add grid-column-row value?
283
- * @param {Boolean} [addColumnSpan] should we add grid-column-span value?
284
- * @return {Array<Object>}
285
- */
286
- function getMSDecls(area, addRowSpan = false, addColumnSpan = false) {
287
- let result = [
288
- {
289
- prop: '-ms-grid-row',
290
- value: String(area.row.start)
291
- }
292
- ]
293
- if (area.row.span > 1 || addRowSpan) {
294
- result.push({
295
- prop: '-ms-grid-row-span',
296
- value: String(area.row.span)
297
- })
298
- }
299
- result.push({
300
- prop: '-ms-grid-column',
301
- value: String(area.column.start)
302
- })
303
- if (area.column.span > 1 || addColumnSpan) {
304
- result.push({
305
- prop: '-ms-grid-column-span',
306
- value: String(area.column.span)
307
- })
308
- }
309
- return result
310
- }
311
-
312
- function getParentMedia(parent) {
313
- if (parent.type === 'atrule' && parent.name === 'media') {
314
- return parent
315
- }
316
- if (!parent.parent) {
317
- return false
318
- }
319
- return getParentMedia(parent.parent)
320
- }
321
-
322
- /**
323
- * change selectors for rules with duplicate grid-areas.
324
- * @param {Array<Rule>} rules
325
- * @param {Array<String>} templateSelectors
326
- * @return {Array<Rule>} rules with changed selectors
327
- */
328
- function changeDuplicateAreaSelectors(ruleSelectors, templateSelectors) {
329
- ruleSelectors = ruleSelectors.map(selector => {
330
- let selectorBySpace = list.space(selector)
331
- let selectorByComma = list.comma(selector)
332
-
333
- if (selectorBySpace.length > selectorByComma.length) {
334
- selector = selectorBySpace.slice(-1).join('')
335
- }
336
- return selector
337
- })
338
-
339
- return ruleSelectors.map(ruleSelector => {
340
- let newSelector = templateSelectors.map((tplSelector, index) => {
341
- let space = index === 0 ? '' : ' '
342
- return `${space}${tplSelector} > ${ruleSelector}`
343
- })
344
-
345
- return newSelector
346
- })
347
- }
348
-
349
- /**
350
- * check if selector of rules are equal
351
- * @param {Rule} ruleA
352
- * @param {Rule} ruleB
353
- * @return {Boolean}
354
- */
355
- function selectorsEqual(ruleA, ruleB) {
356
- return ruleA.selectors.some(sel => {
357
- return ruleB.selectors.includes(sel)
358
- })
359
- }
360
-
361
- /**
362
- * Parse data from all grid-template(-areas) declarations
363
- * @param {Root} css css root
364
- * @return {Object} parsed data
365
- */
366
- function parseGridTemplatesData(css) {
367
- let parsed = []
368
-
369
- // we walk through every grid-template(-areas) declaration and store
370
- // data with the same area names inside the item
371
- css.walkDecls(/grid-template(-areas)?$/, d => {
372
- let rule = d.parent
373
- let media = getParentMedia(rule)
374
- let gap = getGridGap(d)
375
- let inheritedGap = inheritGridGap(d, gap)
376
- let { areas } = parseTemplate({ decl: d, gap: inheritedGap || gap })
377
- let areaNames = Object.keys(areas)
378
-
379
- // skip node if it doesn't have areas
380
- if (areaNames.length === 0) {
381
- return true
382
- }
383
-
384
- // check parsed array for item that include the same area names
385
- // return index of that item
386
- let index = parsed.reduce((acc, { allAreas }, idx) => {
387
- let hasAreas = allAreas && areaNames.some(area => allAreas.includes(area))
388
- return hasAreas ? idx : acc
389
- }, null)
390
-
391
- if (index !== null) {
392
- // index is found, add the grid-template data to that item
393
- let { allAreas, rules } = parsed[index]
394
-
395
- // check if rule has no duplicate area names
396
- let hasNoDuplicates = rules.some(r => {
397
- return r.hasDuplicates === false && selectorsEqual(r, rule)
398
- })
399
-
400
- let duplicatesFound = false
401
-
402
- // check need to gather all duplicate area names
403
- let duplicateAreaNames = rules.reduce((acc, r) => {
404
- if (!r.params && selectorsEqual(r, rule)) {
405
- duplicatesFound = true
406
- return r.duplicateAreaNames
407
- }
408
- if (!duplicatesFound) {
409
- areaNames.forEach(name => {
410
- if (r.areas[name]) {
411
- acc.push(name)
412
- }
413
- })
414
- }
415
- return uniq(acc)
416
- }, [])
417
-
418
- // update grid-row/column-span values for areas with duplicate
419
- // area names. @see #1084 and #1146
420
- rules.forEach(r => {
421
- areaNames.forEach(name => {
422
- let area = r.areas[name]
423
- if (area && area.row.span !== areas[name].row.span) {
424
- areas[name].row.updateSpan = true
425
- }
426
-
427
- if (area && area.column.span !== areas[name].column.span) {
428
- areas[name].column.updateSpan = true
429
- }
430
- })
431
- })
432
-
433
- parsed[index].allAreas = uniq([...allAreas, ...areaNames])
434
- parsed[index].rules.push({
435
- areas,
436
- duplicateAreaNames,
437
- hasDuplicates: !hasNoDuplicates,
438
- node: rule,
439
- params: media.params,
440
- selectors: rule.selectors
441
- })
442
- } else {
443
- // index is NOT found, push the new item to the parsed array
444
- parsed.push({
445
- allAreas: areaNames,
446
- areasCount: 0,
447
- rules: [
448
- {
449
- areas,
450
- duplicateAreaNames: [],
451
- duplicateRules: [],
452
- hasDuplicates: false,
453
- node: rule,
454
- params: media.params,
455
- selectors: rule.selectors
456
- }
457
- ]
458
- })
459
- }
460
-
461
- return undefined
462
- })
463
-
464
- return parsed
465
- }
466
-
467
- /**
468
- * insert prefixed grid-area declarations
469
- * @param {Root} css css root
470
- * @param {Function} isDisabled check if the rule is disabled
471
- * @return {void}
472
- */
473
- exports.insertAreas = insertAreas
474
-
475
- function insertAreas(css, isDisabled) {
476
- // parse grid-template declarations
477
- let gridTemplatesData = parseGridTemplatesData(css)
478
-
479
- // return undefined if no declarations found
480
- if (gridTemplatesData.length === 0) {
481
- return undefined
482
- }
483
-
484
- // we need to store the rules that we will insert later
485
- let rulesToInsert = {}
486
-
487
- css.walkDecls('grid-area', gridArea => {
488
- let gridAreaRule = gridArea.parent
489
- let hasPrefixedRow = gridAreaRule.first.prop === '-ms-grid-row'
490
- let gridAreaMedia = getParentMedia(gridAreaRule)
491
-
492
- if (isDisabled(gridArea)) {
493
- return undefined
494
- }
495
-
496
- let gridAreaRuleIndex = css.index(gridAreaMedia || gridAreaRule)
497
-
498
- let value = gridArea.value
499
- // found the data that matches grid-area identifier
500
- let data = gridTemplatesData.filter(d => d.allAreas.includes(value))[0]
501
-
502
- if (!data) {
503
- return true
504
- }
505
-
506
- let lastArea = data.allAreas[data.allAreas.length - 1]
507
- let selectorBySpace = list.space(gridAreaRule.selector)
508
- let selectorByComma = list.comma(gridAreaRule.selector)
509
- let selectorIsComplex =
510
- selectorBySpace.length > 1 &&
511
- selectorBySpace.length > selectorByComma.length
512
-
513
- // prevent doubling of prefixes
514
- if (hasPrefixedRow) {
515
- return false
516
- }
517
-
518
- // create the empty object with the key as the last area name
519
- // e.g if we have templates with "a b c" values, "c" will be the last area
520
- if (!rulesToInsert[lastArea]) {
521
- rulesToInsert[lastArea] = {}
522
- }
523
-
524
- let lastRuleIsSet = false
525
-
526
- // walk through every grid-template rule data
527
- for (let rule of data.rules) {
528
- let area = rule.areas[value]
529
- let hasDuplicateName = rule.duplicateAreaNames.includes(value)
530
-
531
- // if we can't find the area name, update lastRule and continue
532
- if (!area) {
533
- let lastRule = rulesToInsert[lastArea].lastRule
534
- let lastRuleIndex
535
- if (lastRule) {
536
- lastRuleIndex = css.index(lastRule)
537
- } else {
538
- /* c8 ignore next 2 */
539
- lastRuleIndex = -1
540
- }
541
-
542
- if (gridAreaRuleIndex > lastRuleIndex) {
543
- rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule
544
- }
545
- continue
546
- }
547
-
548
- // for grid-templates inside media rule we need to create empty
549
- // array to push prefixed grid-area rules later
550
- if (rule.params && !rulesToInsert[lastArea][rule.params]) {
551
- rulesToInsert[lastArea][rule.params] = []
552
- }
553
-
554
- if ((!rule.hasDuplicates || !hasDuplicateName) && !rule.params) {
555
- // grid-template has no duplicates and not inside media rule
556
-
557
- getMSDecls(area, false, false)
558
- .reverse()
559
- .forEach(i =>
560
- gridAreaRule.prepend(
561
- Object.assign(i, {
562
- raws: {
563
- between: gridArea.raws.between
564
- }
565
- })
566
- )
567
- )
568
-
569
- rulesToInsert[lastArea].lastRule = gridAreaRule
570
- lastRuleIsSet = true
571
- } else if (rule.hasDuplicates && !rule.params && !selectorIsComplex) {
572
- // grid-template has duplicates and not inside media rule
573
- let cloned = gridAreaRule.clone()
574
- cloned.removeAll()
575
-
576
- getMSDecls(area, area.row.updateSpan, area.column.updateSpan)
577
- .reverse()
578
- .forEach(i =>
579
- cloned.prepend(
580
- Object.assign(i, {
581
- raws: {
582
- between: gridArea.raws.between
583
- }
584
- })
585
- )
586
- )
587
-
588
- cloned.selectors = changeDuplicateAreaSelectors(
589
- cloned.selectors,
590
- rule.selectors
591
- )
592
-
593
- if (rulesToInsert[lastArea].lastRule) {
594
- rulesToInsert[lastArea].lastRule.after(cloned)
595
- }
596
- rulesToInsert[lastArea].lastRule = cloned
597
- lastRuleIsSet = true
598
- } else if (
599
- rule.hasDuplicates &&
600
- !rule.params &&
601
- selectorIsComplex &&
602
- gridAreaRule.selector.includes(rule.selectors[0])
603
- ) {
604
- // grid-template has duplicates and not inside media rule
605
- // and the selector is complex
606
- gridAreaRule.walkDecls(/-ms-grid-(row|column)/, d => d.remove())
607
- getMSDecls(area, area.row.updateSpan, area.column.updateSpan)
608
- .reverse()
609
- .forEach(i =>
610
- gridAreaRule.prepend(
611
- Object.assign(i, {
612
- raws: {
613
- between: gridArea.raws.between
614
- }
615
- })
616
- )
617
- )
618
- } else if (rule.params) {
619
- // grid-template is inside media rule
620
- // if we're inside media rule, we need to store prefixed rules
621
- // inside rulesToInsert object to be able to preserve the order of media
622
- // rules and merge them easily
623
- let cloned = gridAreaRule.clone()
624
- cloned.removeAll()
625
-
626
- getMSDecls(area, area.row.updateSpan, area.column.updateSpan)
627
- .reverse()
628
- .forEach(i =>
629
- cloned.prepend(
630
- Object.assign(i, {
631
- raws: {
632
- between: gridArea.raws.between
633
- }
634
- })
635
- )
636
- )
637
-
638
- if (rule.hasDuplicates && hasDuplicateName) {
639
- cloned.selectors = changeDuplicateAreaSelectors(
640
- cloned.selectors,
641
- rule.selectors
642
- )
643
- }
644
-
645
- cloned.raws = rule.node.raws
646
-
647
- if (css.index(rule.node.parent) > gridAreaRuleIndex) {
648
- // append the prefixed rules right inside media rule
649
- // with grid-template
650
- rule.node.parent.append(cloned)
651
- } else {
652
- // store the rule to insert later
653
- rulesToInsert[lastArea][rule.params].push(cloned)
654
- }
655
-
656
- // set new rule as last rule ONLY if we didn't set lastRule for
657
- // this grid-area before
658
- if (!lastRuleIsSet) {
659
- rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule
660
- }
661
- }
662
- }
663
-
664
- return undefined
665
- })
666
-
667
- // append stored rules inside the media rules
668
- Object.keys(rulesToInsert).forEach(area => {
669
- let data = rulesToInsert[area]
670
- let lastRule = data.lastRule
671
- Object.keys(data)
672
- .reverse()
673
- .filter(p => p !== 'lastRule')
674
- .forEach(params => {
675
- if (data[params].length > 0 && lastRule) {
676
- lastRule.after({ name: 'media', params })
677
- lastRule.next().append(data[params])
678
- }
679
- })
680
- })
681
-
682
- return undefined
683
- }
684
-
685
- /**
686
- * Warn user if grid area identifiers are not found
687
- * @param {Object} areas
688
- * @param {Declaration} decl
689
- * @param {Result} result
690
- * @return {void}
691
- */
692
- exports.warnMissedAreas = warnMissedAreas
693
-
694
- function warnMissedAreas(areas, decl, result) {
695
- let missed = Object.keys(areas)
696
-
697
- decl.root().walkDecls('grid-area', gridArea => {
698
- missed = missed.filter(e => e !== gridArea.value)
699
- })
700
-
701
- if (missed.length > 0) {
702
- decl.warn(result, 'Can not find grid areas: ' + missed.join(', '))
703
- }
704
-
705
- return undefined
706
- }
707
-
708
- /**
709
- * compare selectors with grid-area rule and grid-template rule
710
- * show warning if grid-template selector is not found
711
- * (this function used for grid-area rule)
712
- * @param {Declaration} decl
713
- * @param {Result} result
714
- * @return {void}
715
- */
716
- exports.warnTemplateSelectorNotFound = warnTemplateSelectorNotFound
717
-
718
- function warnTemplateSelectorNotFound(decl, result) {
719
- let rule = decl.parent
720
- let root = decl.root()
721
- let duplicatesFound = false
722
-
723
- // slice selector array. Remove the last part (for comparison)
724
- let slicedSelectorArr = list
725
- .space(rule.selector)
726
- .filter(str => str !== '>')
727
- .slice(0, -1)
728
-
729
- // we need to compare only if selector is complex.
730
- // e.g '.grid-cell' is simple, but '.parent > .grid-cell' is complex
731
- if (slicedSelectorArr.length > 0) {
732
- let gridTemplateFound = false
733
- let foundAreaSelector = null
734
-
735
- root.walkDecls(/grid-template(-areas)?$/, d => {
736
- let parent = d.parent
737
- let templateSelectors = parent.selectors
738
-
739
- let { areas } = parseTemplate({ decl: d, gap: getGridGap(d) })
740
- let hasArea = areas[decl.value]
741
-
742
- // find the the matching selectors
743
- for (let tplSelector of templateSelectors) {
744
- if (gridTemplateFound) {
745
- break
746
- }
747
- let tplSelectorArr = list.space(tplSelector).filter(str => str !== '>')
748
-
749
- gridTemplateFound = tplSelectorArr.every(
750
- (item, idx) => item === slicedSelectorArr[idx]
751
- )
752
- }
753
-
754
- if (gridTemplateFound || !hasArea) {
755
- return true
756
- }
757
-
758
- if (!foundAreaSelector) {
759
- foundAreaSelector = parent.selector
760
- }
761
-
762
- // if we found the duplicate area with different selector
763
- if (foundAreaSelector && foundAreaSelector !== parent.selector) {
764
- duplicatesFound = true
765
- }
766
-
767
- return undefined
768
- })
769
-
770
- // warn user if we didn't find template
771
- if (!gridTemplateFound && duplicatesFound) {
772
- decl.warn(
773
- result,
774
- 'Autoprefixer cannot find a grid-template ' +
775
- `containing the duplicate grid-area "${decl.value}" ` +
776
- `with full selector matching: ${slicedSelectorArr.join(' ')}`
777
- )
778
- }
779
- }
780
- }
781
-
782
- /**
783
- * warn user if both grid-area and grid-(row|column)
784
- * declarations are present in the same rule
785
- * @param {Declaration} decl
786
- * @param {Result} result
787
- * @return {void}
788
- */
789
- exports.warnIfGridRowColumnExists = warnIfGridRowColumnExists
790
-
791
- function warnIfGridRowColumnExists(decl, result) {
792
- let rule = decl.parent
793
- let decls = []
794
- rule.walkDecls(/^grid-(row|column)/, d => {
795
- if (
796
- !d.prop.endsWith('-end') &&
797
- !d.value.startsWith('span') &&
798
- !d.prop.endsWith('-gap')
799
- ) {
800
- decls.push(d)
801
- }
802
- })
803
- if (decls.length > 0) {
804
- decls.forEach(d => {
805
- d.warn(
806
- result,
807
- 'You already have a grid-area declaration present in the rule. ' +
808
- `You should use either grid-area or ${d.prop}, not both`
809
- )
810
- })
811
- }
812
-
813
- return undefined
814
- }
815
-
816
- // Gap utils
817
-
818
- exports.getGridGap = getGridGap
819
-
820
- function getGridGap(decl) {
821
- let gap = {}
822
-
823
- // try to find gap
824
- let testGap = /^(grid-)?((row|column)-)?gap$/
825
- decl.parent.walkDecls(testGap, ({ prop, value }) => {
826
- if (/^(grid-)?gap$/.test(prop)) {
827
- let [row, , column] = parser(value).nodes
828
-
829
- gap.row = row && parser.stringify(row)
830
- gap.column = column ? parser.stringify(column) : gap.row
831
- }
832
- if (/^(grid-)?row-gap$/.test(prop)) gap.row = value
833
- if (/^(grid-)?column-gap$/.test(prop)) gap.column = value
834
- })
835
-
836
- return gap
837
- }
838
-
839
- /**
840
- * parse media parameters (for example 'min-width: 500px')
841
- * @param {String} params parameter to parse
842
- * @return {}
843
- */
844
- function parseMediaParams(params) {
845
- if (!params) {
846
- return []
847
- }
848
- let parsed = parser(params)
849
- let prop
850
- let value
851
-
852
- parsed.walk(node => {
853
- if (node.type === 'word' && /min|max/g.test(node.value)) {
854
- prop = node.value
855
- } else if (node.value.includes('px')) {
856
- value = parseInt(node.value.replace(/\D/g, ''))
857
- }
858
- })
859
-
860
- return [prop, value]
861
- }
862
-
863
- /**
864
- * Compare the selectors and decide if we
865
- * need to inherit gap from compared selector or not.
866
- * @type {String} selA
867
- * @type {String} selB
868
- * @return {Boolean}
869
- */
870
- function shouldInheritGap(selA, selB) {
871
- let result
872
-
873
- // get arrays of selector split in 3-deep array
874
- let splitSelectorArrA = splitSelector(selA)
875
- let splitSelectorArrB = splitSelector(selB)
876
-
877
- if (splitSelectorArrA[0].length < splitSelectorArrB[0].length) {
878
- // abort if selectorA has lower descendant specificity then selectorB
879
- // (e.g '.grid' and '.hello .world .grid')
880
- return false
881
- } else if (splitSelectorArrA[0].length > splitSelectorArrB[0].length) {
882
- // if selectorA has higher descendant specificity then selectorB
883
- // (e.g '.foo .bar .grid' and '.grid')
884
-
885
- let idx = splitSelectorArrA[0].reduce((res, [item], index) => {
886
- let firstSelectorPart = splitSelectorArrB[0][0][0]
887
- if (item === firstSelectorPart) {
888
- return index
889
- }
890
- return false
891
- }, false)
892
-
893
- if (idx) {
894
- result = splitSelectorArrB[0].every((arr, index) => {
895
- return arr.every(
896
- (part, innerIndex) =>
897
- // because selectorA has more space elements, we need to slice
898
- // selectorA array by 'idx' number to compare them
899
- splitSelectorArrA[0].slice(idx)[index][innerIndex] === part
900
- )
901
- })
902
- }
903
- } else {
904
- // if selectorA has the same descendant specificity as selectorB
905
- // this condition covers cases such as: '.grid.foo.bar' and '.grid'
906
- result = splitSelectorArrB.some(byCommaArr => {
907
- return byCommaArr.every((bySpaceArr, index) => {
908
- return bySpaceArr.every(
909
- (part, innerIndex) => splitSelectorArrA[0][index][innerIndex] === part
910
- )
911
- })
912
- })
913
- }
914
-
915
- return result
916
- }
917
- /**
918
- * inherit grid gap values from the closest rule above
919
- * with the same selector
920
- * @param {Declaration} decl
921
- * @param {Object} gap gap values
922
- * @return {Object | Boolean} return gap values or false (if not found)
923
- */
924
- exports.inheritGridGap = inheritGridGap
925
-
926
- function inheritGridGap(decl, gap) {
927
- let rule = decl.parent
928
- let mediaRule = getParentMedia(rule)
929
- let root = rule.root()
930
-
931
- // get an array of selector split in 3-deep array
932
- let splitSelectorArr = splitSelector(rule.selector)
933
-
934
- // abort if the rule already has gaps
935
- if (Object.keys(gap).length > 0) {
936
- return false
937
- }
938
-
939
- // e.g ['min-width']
940
- let [prop] = parseMediaParams(mediaRule.params)
941
-
942
- let lastBySpace = splitSelectorArr[0]
943
-
944
- // get escaped value from the selector
945
- // if we have '.grid-2.foo.bar' selector, will be '\.grid\-2'
946
- let escaped = escapeRegexp(lastBySpace[lastBySpace.length - 1][0])
947
-
948
- let regexp = new RegExp(`(${escaped}$)|(${escaped}[,.])`)
949
-
950
- // find the closest rule with the same selector
951
- let closestRuleGap
952
- root.walkRules(regexp, r => {
953
- let gridGap
954
-
955
- // abort if are checking the same rule
956
- if (rule.toString() === r.toString()) {
957
- return false
958
- }
959
-
960
- // find grid-gap values
961
- r.walkDecls('grid-gap', d => (gridGap = getGridGap(d)))
962
-
963
- // skip rule without gaps
964
- if (!gridGap || Object.keys(gridGap).length === 0) {
965
- return true
966
- }
967
-
968
- // skip rules that should not be inherited from
969
- if (!shouldInheritGap(rule.selector, r.selector)) {
970
- return true
971
- }
972
-
973
- let media = getParentMedia(r)
974
- if (media) {
975
- // if we are inside media, we need to check that media props match
976
- // e.g ('min-width' === 'min-width')
977
- let propToCompare = parseMediaParams(media.params)[0]
978
- if (propToCompare === prop) {
979
- closestRuleGap = gridGap
980
- return true
981
- }
982
- } else {
983
- closestRuleGap = gridGap
984
- return true
985
- }
986
-
987
- return undefined
988
- })
989
-
990
- // if we find the closest gap object
991
- if (closestRuleGap && Object.keys(closestRuleGap).length > 0) {
992
- return closestRuleGap
993
- }
994
- return false
995
- }
996
-
997
- exports.warnGridGap = warnGridGap
998
-
999
- function warnGridGap({ decl, gap, hasColumns, result }) {
1000
- let hasBothGaps = gap.row && gap.column
1001
- if (!hasColumns && (hasBothGaps || (gap.column && !gap.row))) {
1002
- delete gap.column
1003
- decl.warn(
1004
- result,
1005
- 'Can not implement grid-gap without grid-template-columns'
1006
- )
1007
- }
1008
- }
1009
-
1010
- /**
1011
- * normalize the grid-template-rows/columns values
1012
- * @param {String} str grid-template-rows/columns value
1013
- * @return {Array} normalized array with values
1014
- * @example
1015
- * let normalized = normalizeRowColumn('1fr repeat(2, 20px 50px) 1fr')
1016
- * normalized // <= ['1fr', '20px', '50px', '20px', '50px', '1fr']
1017
- */
1018
- function normalizeRowColumn(str) {
1019
- let normalized = parser(str).nodes.reduce((result, node) => {
1020
- if (node.type === 'function' && node.value === 'repeat') {
1021
- let key = 'count'
1022
-
1023
- let [count, value] = node.nodes.reduce(
1024
- (acc, n) => {
1025
- if (n.type === 'word' && key === 'count') {
1026
- acc[0] = Math.abs(parseInt(n.value))
1027
- return acc
1028
- }
1029
- if (n.type === 'div' && n.value === ',') {
1030
- key = 'value'
1031
- return acc
1032
- }
1033
- if (key === 'value') {
1034
- acc[1] += parser.stringify(n)
1035
- }
1036
- return acc
1037
- },
1038
- [0, '']
1039
- )
1040
-
1041
- if (count) {
1042
- for (let i = 0; i < count; i++) {
1043
- result.push(value)
1044
- }
1045
- }
1046
-
1047
- return result
1048
- }
1049
- if (node.type === 'space') {
1050
- return result
1051
- }
1052
- result.push(parser.stringify(node))
1053
- return result
1054
- }, [])
1055
-
1056
- return normalized
1057
- }
1058
-
1059
- exports.autoplaceGridItems = autoplaceGridItems
1060
-
1061
- /**
1062
- * Autoplace grid items
1063
- * @param {Declaration} decl
1064
- * @param {Result} result
1065
- * @param {Object} gap gap values
1066
- * @param {String} autoflowValue grid-auto-flow value
1067
- * @return {void}
1068
- * @see https://github.com/postcss/autoprefixer/issues/1148
1069
- */
1070
- function autoplaceGridItems(decl, result, gap, autoflowValue = 'row') {
1071
- let { parent } = decl
1072
-
1073
- let rowDecl = parent.nodes.find(i => i.prop === 'grid-template-rows')
1074
- let rows = normalizeRowColumn(rowDecl.value)
1075
- let columns = normalizeRowColumn(decl.value)
1076
-
1077
- // Build array of area names with dummy values. If we have 3 columns and
1078
- // 2 rows, filledRows will be equal to ['1 2 3', '4 5 6']
1079
- let filledRows = rows.map((_, rowIndex) => {
1080
- return Array.from(
1081
- { length: columns.length },
1082
- (v, k) => k + rowIndex * columns.length + 1
1083
- ).join(' ')
1084
- })
1085
-
1086
- let areas = parseGridAreas({ gap, rows: filledRows })
1087
- let keys = Object.keys(areas)
1088
- let items = keys.map(i => areas[i])
1089
-
1090
- // Change the order of cells if grid-auto-flow value is 'column'
1091
- if (autoflowValue.includes('column')) {
1092
- items = items.sort((a, b) => a.column.start - b.column.start)
1093
- }
1094
-
1095
- // Insert new rules
1096
- items.reverse().forEach((item, index) => {
1097
- let { column, row } = item
1098
- let nodeSelector = parent.selectors
1099
- .map(sel => sel + ` > *:nth-child(${keys.length - index})`)
1100
- .join(', ')
1101
-
1102
- // create new rule
1103
- let node = parent.clone().removeAll()
1104
-
1105
- // change rule selector
1106
- node.selector = nodeSelector
1107
-
1108
- // insert prefixed row/column values
1109
- node.append({ prop: '-ms-grid-row', value: row.start })
1110
- node.append({ prop: '-ms-grid-column', value: column.start })
1111
-
1112
- // insert rule
1113
- parent.after(node)
1114
- })
1115
-
1116
- return undefined
1117
- }