uikit 3.11.2-dev.f2970ffaa → 3.11.2-dev.f3ade19c4

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 (225) hide show
  1. package/.eslintrc.json +4 -49
  2. package/.prettierignore +14 -0
  3. package/.prettierrc.json +13 -0
  4. package/.webstorm.js +3 -3
  5. package/CHANGELOG.md +54 -18
  6. package/build/.eslintrc.json +1 -3
  7. package/build/build.js +26 -28
  8. package/build/icons.js +7 -11
  9. package/build/less.js +48 -36
  10. package/build/package.json +2 -2
  11. package/build/prefix.js +21 -18
  12. package/build/publishDev.js +6 -8
  13. package/build/release.js +20 -17
  14. package/build/scope.js +21 -11
  15. package/build/scss.js +72 -39
  16. package/build/util.js +71 -62
  17. package/build/wrapper/icons.js +0 -2
  18. package/dist/css/uikit-core-rtl.css +133 -201
  19. package/dist/css/uikit-core-rtl.min.css +1 -1
  20. package/dist/css/uikit-core.css +133 -201
  21. package/dist/css/uikit-core.min.css +1 -1
  22. package/dist/css/uikit-rtl.css +135 -207
  23. package/dist/css/uikit-rtl.min.css +1 -1
  24. package/dist/css/uikit.css +135 -207
  25. package/dist/css/uikit.min.css +1 -1
  26. package/dist/js/components/countdown.js +88 -133
  27. package/dist/js/components/countdown.min.js +1 -1
  28. package/dist/js/components/filter.js +408 -439
  29. package/dist/js/components/filter.min.js +1 -1
  30. package/dist/js/components/lightbox-panel.js +1091 -1319
  31. package/dist/js/components/lightbox-panel.min.js +1 -1
  32. package/dist/js/components/lightbox.js +1137 -1396
  33. package/dist/js/components/lightbox.min.js +1 -1
  34. package/dist/js/components/notification.js +94 -114
  35. package/dist/js/components/notification.min.js +1 -1
  36. package/dist/js/components/parallax.js +347 -372
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +345 -360
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +749 -843
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +345 -360
  43. package/dist/js/components/slideshow-parallax.min.js +1 -1
  44. package/dist/js/components/slideshow.js +628 -798
  45. package/dist/js/components/slideshow.min.js +1 -1
  46. package/dist/js/components/sortable.js +587 -620
  47. package/dist/js/components/sortable.min.js +1 -1
  48. package/dist/js/components/tooltip.js +324 -356
  49. package/dist/js/components/tooltip.min.js +1 -1
  50. package/dist/js/components/upload.js +155 -167
  51. package/dist/js/components/upload.min.js +1 -1
  52. package/dist/js/uikit-core.js +5326 -6526
  53. package/dist/js/uikit-core.min.js +1 -1
  54. package/dist/js/uikit-icons.js +7 -9
  55. package/dist/js/uikit-icons.min.js +1 -1
  56. package/dist/js/uikit.js +8031 -9659
  57. package/dist/js/uikit.min.js +1 -1
  58. package/jsconfig.json +1 -1
  59. package/package.json +64 -60
  60. package/src/js/api/boot.js +25 -32
  61. package/src/js/api/component.js +15 -28
  62. package/src/js/api/global.js +6 -12
  63. package/src/js/api/hooks.js +14 -33
  64. package/src/js/api/instance.js +7 -15
  65. package/src/js/api/state.js +199 -187
  66. package/src/js/components/countdown.js +26 -52
  67. package/src/js/components/filter.js +70 -66
  68. package/src/js/components/index.js +13 -13
  69. package/src/js/components/internal/lightbox-animations.js +14 -25
  70. package/src/js/components/internal/slider-preload.js +9 -0
  71. package/src/js/components/internal/slider-transitioner.js +66 -45
  72. package/src/js/components/internal/slideshow-animations.js +46 -64
  73. package/src/js/components/lightbox-panel.js +107 -105
  74. package/src/js/components/lightbox.js +17 -39
  75. package/src/js/components/notification.js +49 -43
  76. package/src/js/components/parallax.js +21 -46
  77. package/src/js/components/slider-parallax.js +13 -23
  78. package/src/js/components/slider.js +117 -89
  79. package/src/js/components/slideshow-parallax.js +1 -1
  80. package/src/js/components/slideshow.js +15 -13
  81. package/src/js/components/sortable.js +125 -106
  82. package/src/js/components/tooltip.js +41 -31
  83. package/src/js/components/upload.js +52 -63
  84. package/src/js/core/accordion.js +58 -48
  85. package/src/js/core/alert.js +9 -17
  86. package/src/js/core/core.js +17 -69
  87. package/src/js/core/cover.js +15 -15
  88. package/src/js/core/drop.js +110 -94
  89. package/src/js/core/form-custom.js +22 -27
  90. package/src/js/core/gif.js +3 -7
  91. package/src/js/core/grid.js +57 -58
  92. package/src/js/core/height-match.js +16 -29
  93. package/src/js/core/height-viewport.js +30 -34
  94. package/src/js/core/icon.js +47 -52
  95. package/src/js/core/img.js +153 -143
  96. package/src/js/core/index.js +39 -39
  97. package/src/js/core/leader.js +9 -18
  98. package/src/js/core/margin.js +21 -37
  99. package/src/js/core/modal.js +49 -36
  100. package/src/js/core/nav.js +2 -4
  101. package/src/js/core/navbar.js +113 -85
  102. package/src/js/core/offcanvas.js +51 -54
  103. package/src/js/core/overflow-auto.js +13 -17
  104. package/src/js/core/responsive.js +14 -12
  105. package/src/js/core/scroll.js +10 -20
  106. package/src/js/core/scrollspy-nav.js +34 -31
  107. package/src/js/core/scrollspy.js +37 -54
  108. package/src/js/core/sticky.js +175 -123
  109. package/src/js/core/svg.js +68 -83
  110. package/src/js/core/switcher.js +56 -47
  111. package/src/js/core/tab.js +7 -10
  112. package/src/js/core/toggle.js +69 -68
  113. package/src/js/core/video.js +22 -21
  114. package/src/js/mixin/animate.js +19 -20
  115. package/src/js/mixin/class.js +2 -4
  116. package/src/js/mixin/container.js +7 -11
  117. package/src/js/mixin/internal/animate-fade.js +73 -30
  118. package/src/js/mixin/internal/animate-slide.js +58 -41
  119. package/src/js/mixin/internal/slideshow-animations.js +7 -14
  120. package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
  121. package/src/js/mixin/lazyload.js +20 -0
  122. package/src/js/mixin/media.js +5 -10
  123. package/src/js/mixin/modal.js +89 -66
  124. package/src/js/mixin/parallax.js +149 -107
  125. package/src/js/mixin/position.js +26 -20
  126. package/src/js/mixin/slider-autoplay.js +12 -21
  127. package/src/js/mixin/slider-drag.js +64 -65
  128. package/src/js/mixin/slider-nav.js +26 -35
  129. package/src/js/mixin/slider-reactive.js +2 -8
  130. package/src/js/mixin/slider.js +47 -60
  131. package/src/js/mixin/slideshow.js +12 -22
  132. package/src/js/mixin/swipe.js +72 -0
  133. package/src/js/mixin/togglable.js +89 -63
  134. package/src/js/uikit-core.js +2 -4
  135. package/src/js/uikit.js +2 -4
  136. package/src/js/util/ajax.js +25 -40
  137. package/src/js/util/animation.js +77 -75
  138. package/src/js/util/attr.js +17 -21
  139. package/src/js/util/class.js +14 -52
  140. package/src/js/util/dimensions.js +78 -49
  141. package/src/js/util/dom.js +39 -66
  142. package/src/js/util/env.js +7 -12
  143. package/src/js/util/event.js +60 -59
  144. package/src/js/util/fastdom.js +1 -6
  145. package/src/js/util/filter.js +17 -34
  146. package/src/js/util/index.js +1 -1
  147. package/src/js/util/lang.js +82 -121
  148. package/src/js/util/mouse.js +19 -17
  149. package/src/js/util/observer.js +36 -0
  150. package/src/js/util/options.js +35 -49
  151. package/src/js/util/player.js +41 -36
  152. package/src/js/util/position.js +54 -46
  153. package/src/js/util/selector.js +43 -58
  154. package/src/js/util/style.js +39 -49
  155. package/src/js/util/viewport.js +75 -64
  156. package/src/less/components/base.less +10 -33
  157. package/src/less/components/flex.less +0 -9
  158. package/src/less/components/form-range.less +48 -95
  159. package/src/less/components/form.less +0 -1
  160. package/src/less/components/height.less +3 -0
  161. package/src/less/components/leader.less +0 -1
  162. package/src/less/components/lightbox.less +0 -1
  163. package/src/less/components/modal.less +3 -7
  164. package/src/less/components/navbar.less +0 -7
  165. package/src/less/components/progress.less +14 -36
  166. package/src/less/components/slider.less +0 -3
  167. package/src/less/components/slideshow.less +0 -3
  168. package/src/less/components/text.less +16 -32
  169. package/src/less/components/utility.less +25 -0
  170. package/src/scss/components/base.scss +10 -33
  171. package/src/scss/components/flex.scss +0 -9
  172. package/src/scss/components/form-range.scss +48 -95
  173. package/src/scss/components/form.scss +3 -4
  174. package/src/scss/components/height.scss +3 -0
  175. package/src/scss/components/icon.scss +2 -2
  176. package/src/scss/components/leader.scss +0 -1
  177. package/src/scss/components/lightbox.scss +0 -1
  178. package/src/scss/components/modal.scss +3 -7
  179. package/src/scss/components/navbar.scss +0 -7
  180. package/src/scss/components/progress.scss +14 -36
  181. package/src/scss/components/search.scss +1 -1
  182. package/src/scss/components/slider.scss +0 -3
  183. package/src/scss/components/slideshow.scss +0 -3
  184. package/src/scss/components/text.scss +16 -32
  185. package/src/scss/components/utility.scss +25 -0
  186. package/src/scss/mixins-theme.scss +1 -1
  187. package/src/scss/mixins.scss +1 -1
  188. package/src/scss/variables-theme.scss +9 -9
  189. package/src/scss/variables.scss +9 -9
  190. package/tests/align.html +10 -10
  191. package/tests/animation.html +2 -2
  192. package/tests/article.html +2 -2
  193. package/tests/base.html +3 -3
  194. package/tests/card.html +10 -10
  195. package/tests/column.html +3 -3
  196. package/tests/comment.html +9 -9
  197. package/tests/dotnav.html +3 -3
  198. package/tests/image.html +296 -64
  199. package/tests/images/image-type.avif +0 -0
  200. package/tests/images/image-type.jpeg +0 -0
  201. package/tests/images/image-type.webp +0 -0
  202. package/tests/index.html +8 -8
  203. package/tests/js/index.js +114 -85
  204. package/tests/lightbox.html +10 -10
  205. package/tests/marker.html +2 -2
  206. package/tests/modal.html +8 -9
  207. package/tests/navbar.html +2 -2
  208. package/tests/overlay.html +7 -7
  209. package/tests/parallax.html +16 -7
  210. package/tests/position.html +12 -12
  211. package/tests/slidenav.html +12 -12
  212. package/tests/slider.html +20 -20
  213. package/tests/sortable.html +1 -1
  214. package/tests/sticky-parallax.html +87 -99
  215. package/tests/sticky.html +56 -24
  216. package/tests/svg.html +6 -6
  217. package/tests/table.html +11 -11
  218. package/tests/thumbnav.html +12 -12
  219. package/tests/transition.html +30 -30
  220. package/tests/utility.html +50 -33
  221. package/tests/video.html +1 -1
  222. package/tests/width.html +1 -1
  223. package/src/js/mixin/flex-bug.js +0 -56
  224. package/src/js/util/promise.js +0 -191
  225. package/tests/images/animated.gif +0 -0
@@ -1,11 +1,10 @@
1
1
  import semver from 'semver';
2
- import {args, getVersion, run} from './util.js';
2
+ import { args, getVersion, run } from './util.js';
3
3
 
4
- const {inc} = semver;
4
+ const { inc } = semver;
5
5
 
6
6
  // default exec options
7
- if (args.f || args.force || await isDevCommit()) {
8
-
7
+ if (args.f || args.force || (await isDevCommit())) {
9
8
  // increase version patch number
10
9
  const version = inc(await getVersion(), 'patch');
11
10
 
@@ -20,17 +19,16 @@ if (args.f || args.force || await isDevCommit()) {
20
19
 
21
20
  // publish to dev tag
22
21
  await run('npm publish --tag dev');
23
-
24
22
  }
25
23
 
26
24
  async function isDevCommit() {
27
-
28
25
  // check for changes to publish (%B: raw body (unwrapped subject and body)
29
26
  const message = await run('git log -1 --pretty=%B');
30
27
 
31
28
  // https://www.conventionalcommits.org/en/v1.0.0/
32
- const type = message.match(/^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/);
29
+ const type = message.match(
30
+ /^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50}/
31
+ );
33
32
 
34
33
  return type && ['feat', 'fix', 'refactor', 'perf'].includes(type[2]);
35
-
36
34
  }
package/build/release.js CHANGED
@@ -1,23 +1,26 @@
1
1
  import archiver from 'archiver';
2
2
  import inquirer from 'inquirer';
3
3
  import dateFormat from 'dateformat/lib/dateformat.js';
4
- import {createWriteStream} from 'fs';
4
+ import { createWriteStream } from 'fs';
5
5
  import semver from 'semver';
6
- import {args, getVersion, glob, logFile, replaceInFile, run} from './util.js';
6
+ import { args, getVersion, glob, logFile, replaceInFile, run } from './util.js';
7
7
 
8
- const {coerce, inc, prerelease, valid} = semver;
8
+ const { coerce, inc, prerelease, valid } = semver;
9
9
 
10
10
  const prevVersion = await getVersion();
11
11
  const version = await inquireVersion(args.v || args.version);
12
12
 
13
13
  await Promise.all([
14
14
  run(`npm version ${version} --git-tag-version false`),
15
- replaceInFile('CHANGELOG.md', data =>
16
- data.replace(/^##\s*WIP/m, `## ${versionFormat(version)} (${dateFormat(Date.now(), 'mmmm d, yyyy')})`)
15
+ replaceInFile('CHANGELOG.md', (data) =>
16
+ data.replace(
17
+ /^##\s*WIP/m,
18
+ `## ${versionFormat(version)} (${dateFormat(Date.now(), 'mmmm d, yyyy')})`
19
+ )
17
20
  ),
18
- replaceInFile('.github/ISSUE_TEMPLATE/bug-report.md', data =>
21
+ replaceInFile('.github/ISSUE_TEMPLATE/bug-report.md', (data) =>
19
22
  data.replace(prevVersion, version)
20
- )
23
+ ),
21
24
  ]);
22
25
 
23
26
  await run('yarn compile');
@@ -27,20 +30,20 @@ await run('yarn build-scss');
27
30
  await createPackage(version);
28
31
 
29
32
  async function inquireVersion(v) {
30
-
31
33
  if (valid(v)) {
32
34
  return v;
33
35
  }
34
36
 
35
37
  const prompt = inquirer.createPromptModule();
36
38
 
37
- return (await prompt({
38
- name: 'version',
39
- message: 'Enter a version',
40
- default: () => inc(prevVersion, prerelease(prevVersion) ? 'prerelease' : 'patch'),
41
- validate: val => !!val.length || 'Invalid version'
42
- })).version;
43
-
39
+ return (
40
+ await prompt({
41
+ name: 'version',
42
+ message: 'Enter a version',
43
+ default: () => inc(prevVersion, prerelease(prevVersion) ? 'prerelease' : 'patch'),
44
+ validate: (val) => !!val.length || 'Invalid version',
45
+ })
46
+ ).version;
44
47
  }
45
48
 
46
49
  async function createPackage(version) {
@@ -49,8 +52,8 @@ async function createPackage(version) {
49
52
 
50
53
  archive.pipe(createWriteStream(file));
51
54
 
52
- (await glob('dist/{js,css}/uikit?(-icons|-rtl)?(.min).{js,css}')).forEach(file =>
53
- archive.file(file, {name: file.substring(5)})
55
+ (await glob('dist/{js,css}/uikit?(-icons|-rtl)?(.min).{js,css}')).forEach((file) =>
56
+ archive.file(file, { name: file.substring(5) })
54
57
  );
55
58
 
56
59
  await archive.finalize();
package/build/scope.js CHANGED
@@ -1,4 +1,4 @@
1
- import {args, glob, minify, read, renderLess, replaceInFile, validClassName} from './util.js';
1
+ import { args, glob, minify, read, renderLess, replaceInFile, validClassName } from './util.js';
2
2
 
3
3
  if (args.h || args.help) {
4
4
  console.log(`
@@ -33,7 +33,6 @@ if (args.cleanup && prevScope) {
33
33
 
34
34
  await cleanup(files, prevScope);
35
35
  await scope(files, newScope);
36
-
37
36
  } else {
38
37
  await scope(files, getNewScope());
39
38
  }
@@ -41,7 +40,7 @@ if (args.cleanup && prevScope) {
41
40
  async function getScope(files) {
42
41
  for (const file of files) {
43
42
  const data = await read(file);
44
- const [, scope] = (data.match(currentScopeRe) || data.match(currentScopeLegacyRe) || []);
43
+ const [, scope] = data.match(currentScopeRe) || data.match(currentScopeLegacyRe) || [];
45
44
  if (scope) {
46
45
  return scope;
47
46
  }
@@ -50,7 +49,6 @@ async function getScope(files) {
50
49
  }
51
50
 
52
51
  function getNewScope() {
53
-
54
52
  const scopeFromInput = args.scope || args.s || 'uk-scope';
55
53
 
56
54
  if (validClassName.test(scopeFromInput)) {
@@ -62,10 +60,16 @@ function getNewScope() {
62
60
 
63
61
  async function scope(files, scope) {
64
62
  for (const file of files) {
65
- await replaceInFile(file, async data => {
63
+ await replaceInFile(file, async (data) => {
66
64
  const output = await renderLess(`.${scope} {\n${stripComments(data)}\n}`);
67
65
  return `/* scoped: ${scope} */\n${
68
- output.replace(new RegExp(`.${scope}\\s((\\.(uk-(drag|modal-page|offcanvas-page|offcanvas-flip)))|html|:root)`, 'g'), '$1') // unescape
66
+ output.replace(
67
+ new RegExp(
68
+ `.${scope}\\s((\\.(uk-(drag|modal-page|offcanvas-page|offcanvas-flip)))|html|:root)`,
69
+ 'g'
70
+ ),
71
+ '$1'
72
+ ) // unescape
69
73
  }`;
70
74
  });
71
75
  await minify(file);
@@ -73,11 +77,17 @@ async function scope(files, scope) {
73
77
  }
74
78
 
75
79
  async function cleanup(files, scope) {
76
- const string = scope.split(' ').map(scope => `.${scope}`).join(' ');
80
+ const string = scope
81
+ .split(' ')
82
+ .map((scope) => `.${scope}`)
83
+ .join(' ');
77
84
  for (const file of files) {
78
- await replaceInFile(file, data => data
79
- .replace(currentScopeRe, '') // remove scope comment
80
- .replace(new RegExp(` *${string} ({[\\s\\S]*?})?`, 'g'), '') // replace classes
85
+ await replaceInFile(
86
+ file,
87
+ (data) =>
88
+ data
89
+ .replace(currentScopeRe, '') // remove scope comment
90
+ .replace(new RegExp(` *${string} ({[\\s\\S]*?})?`, 'g'), '') // replace classes
81
91
  );
82
92
  }
83
93
  }
@@ -86,6 +96,6 @@ function stripComments(input) {
86
96
  return input
87
97
  .replace(/\/\*(.|\n)*?\*\//gm, '')
88
98
  .split('\n')
89
- .filter(line => line.trim().substr(0, 2) !== '//')
99
+ .filter((line) => line.trim().substr(0, 2) !== '//')
90
100
  .join('\n');
91
101
  }
package/build/scss.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import NP from 'number-precision';
2
- import {glob, read, write} from './util.js';
2
+ import { glob, read, write } from './util.js';
3
3
 
4
4
  NP.enableBoundaryChecking(false);
5
5
 
@@ -74,14 +74,17 @@ const inverseTemplate = ` @include hook-inverse-component-base();
74
74
 
75
75
  /* First Step: Go through all files */
76
76
  for (const file of await glob('src/less/**/*.less')) {
77
-
78
77
  const data = await read(file);
79
78
 
80
79
  /* replace all Less stuff with SCSS */
81
- let scssData = data.replace(/\/less\//g, '/scss/') // change less/ dir to scss/ on imports
80
+ let scssData = data
81
+ .replace(/\/less\//g, '/scss/') // change less/ dir to scss/ on imports
82
82
  .replace(/\.less/g, '.scss') // change .less extensions to .scss on imports
83
83
  .replace(/@/g, '$') // convert variables
84
- .replace(/(:[^'"]*?\([^'"]+?)\s*\/\s*([0-9.-]+)\)/g, (exp, m1, m2) => `${m1} * ${NP.round(1 / parseFloat(m2), 5)})`)
84
+ .replace(
85
+ /(:[^'"]*?\([^'"]+?)\s*\/\s*([0-9.-]+)\)/g,
86
+ (exp, m1, m2) => `${m1} * ${NP.round(1 / parseFloat(m2), 5)})`
87
+ )
85
88
  .replace(/--uk-[^\s]+: (\$[^\s]+);/g, (exp, name) => exp.replace(name, `#{${name}}`))
86
89
  .replace(/\\\$/g, '\\@') // revert classes using the @ symbol
87
90
  .replace(/ e\(/g, ' unquote(') // convert escape function
@@ -89,14 +92,30 @@ for (const file of await glob('src/less/**/*.less')) {
89
92
  .replace(/(\$[\w-]*)\s*:(.*);/g, '$1: $2 !default;') // make variables optional
90
93
  .replace(/@mixin ([\w-]*)\s*\((.*)\)\s*{\s*}/g, '// @mixin $1($2){}') // comment empty mixins
91
94
  .replace(/\.(hook[a-zA-Z\-\d]+)(\(\))?;/g, '@if(mixin-exists($1)) {@include $1();}') // hook calls surrounded by a mixin-exists
92
- .replace(/\$(import|supports|media|font-face|page|-ms-viewport|keyframes|-webkit-keyframes|-moz-document)/g, '@$1') // replace valid '@' statements
95
+ .replace(
96
+ /\$(import|supports|media|font-face|page|-ms-viewport|keyframes|-webkit-keyframes|-moz-document)/g,
97
+ '@$1'
98
+ ) // replace valid '@' statements
93
99
  .replace(/tint\((\$[\w-]+),\s([^)]*)\)/g, 'mix(white, $1, $2)') // replace Less function tint with mix
94
- .replace(/fade\((\$[\w-]*), ([0-9]+)%\)/g, (match, p1, p2) => { return `rgba(${p1}, ${p2 / 100})`;}) // replace Less function fade with rgba
95
- .replace(/fadeout\((\$[\w-]*), ([0-9]+)%\)/g, (match, p1, p2) => { return `fade-out(${p1}, ${p2 / 100})`;}) // replace Less function fadeout with fade-out
100
+ .replace(/fade\((\$[\w-]*), ([0-9]+)%\)/g, (match, p1, p2) => {
101
+ return `rgba(${p1}, ${p2 / 100})`;
102
+ }) // replace Less function fade with rgba
103
+ .replace(/fade(in|out)\((\$[\w-]*), ([0-9]+)%\)/g, (match, p1, p2, p3) => {
104
+ return `fade-${p1}(${p2}, ${p3 / 100})`;
105
+ }) // replace Less function fadeout with fade-out
96
106
  .replace(/\.svg-fill/g, '@include svg-fill') // include svg-fill mixin
97
- .replace(/(.*):extend\((\.[\w-\\@]*) all\) when \((\$[\w-]*) = ([\w]+)\) {}/g, '@if ( $3 == $4 ) { $1 { @extend $2 !optional;} }') // update conditional extend and add !optional to ignore warnings
98
- .replace(/(\.[\w-\\@]+)\s*when\s*\((\$[\w-]*)\s*=\s*(\w+)\)\s*{\s*@if\(mixin-exists\(([\w-]*)\)\) {@include\s([\w-]*)\(\);\s*}\s*}/g, '@if ($2 == $3) { $1 { @if (mixin-exists($4)) {@include $4();}}}') // update conditional hook
99
- .replace(/(\.[\w-\\@]+)\s*when\s*\((\$[\w-]*)\s*=\s*(\w+)\)\s*({\s*.*?\s*})/gs, '@if ($2 == $3) {\n$1 $4\n}') // replace conditionals
107
+ .replace(
108
+ /(.*):extend\((\.[\w-\\@]*) all\) when \((\$[\w-]*) = ([\w]+)\) {}/g,
109
+ '@if ( $3 == $4 ) { $1 { @extend $2 !optional;} }'
110
+ ) // update conditional extend and add !optional to ignore warnings
111
+ .replace(
112
+ /(\.[\w-\\@]+)\s*when\s*\((\$[\w-]*)\s*=\s*(\w+)\)\s*{\s*@if\(mixin-exists\(([\w-]*)\)\) {@include\s([\w-]*)\(\);\s*}\s*}/g,
113
+ '@if ($2 == $3) { $1 { @if (mixin-exists($4)) {@include $4();}}}'
114
+ ) // update conditional hook
115
+ .replace(
116
+ /(\.[\w-\\@]+)\s*when\s*\((\$[\w-]*)\s*=\s*(\w+)\)\s*({\s*.*?\s*})/gs,
117
+ '@if ($2 == $3) {\n$1 $4\n}'
118
+ ) // replace conditionals
100
119
  .replace(/\${/g, '#{$') // string literals: from: /~"(.*)"/g, to: '#{"$1"}'
101
120
  .replace(/[^(](-\$[\w-]*)/g, ' ($1)') // surround negative variables with brackets
102
121
  .replace(/(--[\w-]+:\s*)~'([^']+)'/g, '$1$2') // string literals in custom properties
@@ -124,7 +143,10 @@ for (const file of await glob('src/less/**/*.less')) {
124
143
  /* remove the theme import first place */
125
144
  scssData = scssData.replace(/\/\/\n\/\/ Theme\n\/\/\n\n@import "theme\/_import.scss";/, '');
126
145
  /* add uikit-mixins and uikit-variables include to the uikit.scss file and change order, to load theme files first */
127
- scssData = scssData.replace(/\/\/ Core\n\/\//g, '// Theme\n//\n\n@import "theme/_import.scss";');
146
+ scssData = scssData.replace(
147
+ /\/\/ Core\n\/\//g,
148
+ '// Theme\n//\n\n@import "theme/_import.scss";'
149
+ );
128
150
  }
129
151
 
130
152
  /* mixin.less needs to be fully replaced by the new mixin file*/
@@ -133,27 +155,34 @@ for (const file of await glob('src/less/**/*.less')) {
133
155
  }
134
156
 
135
157
  await write(file.replace(/less/g, 'scss').replace('.theme.', '-theme.'), scssData);
136
-
137
158
  }
138
159
 
139
160
  /* Second Step write all new needed files for SASS */
140
161
 
141
162
  /* write mixins into new file */
142
- const mixins_theme = Object.keys(themeMixins).map(function (key) { return themeMixins[key]; });
163
+ const mixins_theme = Object.keys(themeMixins).map(function (key) {
164
+ return themeMixins[key];
165
+ });
143
166
  await write('src/scss/mixins-theme.scss', mixins_theme.join('\n'));
144
167
 
145
- const mixins_core = Object.keys(coreMixins).map(function (key) { return coreMixins[key]; });
168
+ const mixins_core = Object.keys(coreMixins).map(function (key) {
169
+ return coreMixins[key];
170
+ });
146
171
  await write('src/scss/mixins.scss', mixins_core.join('\n'));
147
172
 
148
173
  /* write core variables */
149
174
  const compactCoreVar = new Set();
150
- Object.keys(coreVar).map(key => getAllDependencies(coreVar, key).forEach(dependency => compactCoreVar.add(dependency)));
175
+ Object.keys(coreVar).map((key) =>
176
+ getAllDependencies(coreVar, key).forEach((dependency) => compactCoreVar.add(dependency))
177
+ );
151
178
 
152
179
  await write('src/scss/variables.scss', Array.from(compactCoreVar).join('\n'));
153
180
 
154
181
  /* write theme variables */
155
182
  const compactThemeVar = new Set();
156
- Object.keys(themeVar).map(key => getAllDependencies(themeVar, key).forEach(dependency => compactThemeVar.add(dependency)));
183
+ Object.keys(themeVar).map((key) =>
184
+ getAllDependencies(themeVar, key).forEach((dependency) => compactThemeVar.add(dependency))
185
+ );
157
186
 
158
187
  await write('src/scss/variables-theme.scss', Array.from(compactThemeVar).join('\n'));
159
188
 
@@ -162,15 +191,14 @@ await write('src/scss/variables-theme.scss', Array.from(compactThemeVar).join('\
162
191
  * @return Set with all the dependencies.
163
192
  */
164
193
  function getAllDependencies(allVariables, currentKey, dependencies = new Set()) {
165
-
166
194
  if (!allVariables[currentKey].dependencies.length) {
167
-
168
195
  dependencies.add(`${currentKey}: ${allVariables[currentKey].value}`);
169
196
  return Array.from(dependencies);
170
197
  } else {
171
-
172
- allVariables[currentKey].dependencies.forEach(dependecy => {
173
- getAllDependencies(allVariables, dependecy, dependencies).forEach(newDependency => dependencies.add(newDependency));
198
+ allVariables[currentKey].dependencies.forEach((dependecy) => {
199
+ getAllDependencies(allVariables, dependecy, dependencies).forEach((newDependency) =>
200
+ dependencies.add(newDependency)
201
+ );
174
202
  });
175
203
 
176
204
  dependencies.add(`${currentKey}: ${allVariables[currentKey].value}`);
@@ -183,14 +211,17 @@ function getAllDependencies(allVariables, currentKey, dependencies = new Set())
183
211
  * @return an updated data where the mixins have been removed.
184
212
  */
185
213
  function getMixinsFromFile(file, data) {
186
-
187
214
  /* Step 1: get all includes and insert them, so that at least empty mixins exist. */
188
215
  let regex = /@include ([a-z0-9-]+)/g;
189
216
  let match = regex.exec(data);
190
217
 
191
218
  while (match) {
192
- if (!(match[1] in themeMixins)) { themeMixins[match[1]] = `@mixin ${match[1]}(){}`; }
193
- if (!(match[1] in coreMixins)) { coreMixins[match[1]] = `@mixin ${match[1]}(){}`; }
219
+ if (!(match[1] in themeMixins)) {
220
+ themeMixins[match[1]] = `@mixin ${match[1]}(){}`;
221
+ }
222
+ if (!(match[1] in coreMixins)) {
223
+ coreMixins[match[1]] = `@mixin ${match[1]}(){}`;
224
+ }
194
225
 
195
226
  match = regex.exec(data);
196
227
  }
@@ -201,7 +232,7 @@ function getMixinsFromFile(file, data) {
201
232
 
202
233
  while (match) {
203
234
  [themeMixins[match[1]]] = match;
204
- if (file.indexOf('theme/') < 0) {
235
+ if (!file.includes('theme/')) {
205
236
  [coreMixins[match[1]]] = match;
206
237
  }
207
238
  match = regex.exec(data);
@@ -213,7 +244,7 @@ function getMixinsFromFile(file, data) {
213
244
 
214
245
  while (match) {
215
246
  [themeMixins[match[1]]] = match;
216
- if (file.indexOf('theme/') < 0) {
247
+ if (!file.includes('theme/')) {
217
248
  [coreMixins[match[1]]] = match;
218
249
  }
219
250
 
@@ -235,15 +266,15 @@ async function getVariablesFromFile(file, data) {
235
266
  let match = regex.exec(data);
236
267
 
237
268
  while (match) {
238
-
239
269
  /* check if variable is a background icon, if so replace it directly by the SVG */
240
- if (match[0].indexOf('../../images/backgrounds') >= 0) {
241
-
242
- const iconregex = /(\$[\w-]+)\s*:\s*"\.\.\/\.\.\/images\/backgrounds\/([\w./-]+)" !default;/g;
270
+ if (match[0].includes('../../images/backgrounds')) {
271
+ const iconregex =
272
+ /(\$[\w-]+)\s*:\s*"\.\.\/\.\.\/images\/backgrounds\/([\w./-]+)" !default;/g;
243
273
  const iconmatch = iconregex.exec(match[0]);
244
274
  let svg = (await read(`src/images/backgrounds/${iconmatch[2]}`)).toString();
245
- svg = `"${svg.replace(/\r?\n|\r/g, '%0A')
246
- .replace(/"/g, '\'')
275
+ svg = `"${svg
276
+ .replace(/\r?\n|\r/g, '%0A')
277
+ .replace(/"/g, "'")
247
278
  .replace(/\s/g, '%20')
248
279
  .replace(/</g, '%3C')
249
280
  .replace(/=/g, '%3D')
@@ -254,11 +285,11 @@ async function getVariablesFromFile(file, data) {
254
285
  .replace(/%3Csvg/, 'data:image/svg+xml;charset=UTF-8,%3Csvg')}"`;
255
286
 
256
287
  /* add SVG to the coreVar and themeVar only if it is a theme file and make it optional */
257
- if (file.indexOf('theme/') < 0) {
258
- coreVar[iconmatch[1]] = {value: `${svg} !default;`, dependencies: []};
288
+ if (!file.includes('theme/')) {
289
+ coreVar[iconmatch[1]] = { value: `${svg} !default;`, dependencies: [] };
259
290
  }
260
291
 
261
- themeVar[iconmatch[1]] = {value: `${svg} !default;`, dependencies: []};
292
+ themeVar[iconmatch[1]] = { value: `${svg} !default;`, dependencies: [] };
262
293
 
263
294
  /* add SVG to the variable within the file itself as well */
264
295
  const inlineSVG = `${iconmatch[1]}: ${svg} !default;`;
@@ -266,7 +297,6 @@ async function getVariablesFromFile(file, data) {
266
297
 
267
298
  /* when it is not an SVG add the variable and search for its dependencies */
268
299
  } else {
269
-
270
300
  const variablesRegex = /(\$[\w-]+)/g;
271
301
  let variablesMatch = variablesRegex.exec(match[2]);
272
302
  const dependencies = [];
@@ -277,11 +307,14 @@ async function getVariablesFromFile(file, data) {
277
307
  }
278
308
 
279
309
  /* add variables only to the core Variables if it is not a theme file */
280
- if (file.indexOf('theme/') < 0) {
281
- coreVar[match[1]] = {value: `${match[2]};`, dependencies: Array.from(dependencies)};
310
+ if (!file.includes('theme/')) {
311
+ coreVar[match[1]] = {
312
+ value: `${match[2]};`,
313
+ dependencies: Array.from(dependencies),
314
+ };
282
315
  }
283
316
 
284
- themeVar[match[1]] = {value: `${match[2]};`, dependencies: Array.from(dependencies)};
317
+ themeVar[match[1]] = { value: `${match[2]};`, dependencies: Array.from(dependencies) };
285
318
  }
286
319
 
287
320
  match = regex.exec(data);