uikit 3.25.15 → 3.25.16-dev.03f5a77

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 (56) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/build.js +1 -1
  3. package/build/less.js +7 -7
  4. package/build/prefix.js +3 -3
  5. package/build/release.js +13 -9
  6. package/build/scss.js +13 -7
  7. package/build/util.js +17 -19
  8. package/build/watch.js +21 -0
  9. package/dist/css/uikit-core-rtl.css +1 -1
  10. package/dist/css/uikit-core-rtl.min.css +1 -1
  11. package/dist/css/uikit-core.css +1 -1
  12. package/dist/css/uikit-core.min.css +1 -1
  13. package/dist/css/uikit-rtl.css +1 -1
  14. package/dist/css/uikit-rtl.min.css +1 -1
  15. package/dist/css/uikit.css +1 -1
  16. package/dist/css/uikit.min.css +1 -1
  17. package/dist/js/components/countdown.js +7 -1
  18. package/dist/js/components/countdown.min.js +1 -1
  19. package/dist/js/components/filter.js +7 -4
  20. package/dist/js/components/filter.min.js +1 -1
  21. package/dist/js/components/lightbox-panel.js +39 -31
  22. package/dist/js/components/lightbox-panel.min.js +1 -1
  23. package/dist/js/components/lightbox.js +39 -31
  24. package/dist/js/components/lightbox.min.js +1 -1
  25. package/dist/js/components/notification.js +1 -1
  26. package/dist/js/components/notification.min.js +1 -1
  27. package/dist/js/components/parallax.js +1 -1
  28. package/dist/js/components/parallax.min.js +1 -1
  29. package/dist/js/components/slider-parallax.js +1 -1
  30. package/dist/js/components/slider-parallax.min.js +1 -1
  31. package/dist/js/components/slider.js +7 -1
  32. package/dist/js/components/slider.min.js +1 -1
  33. package/dist/js/components/slideshow-parallax.js +1 -1
  34. package/dist/js/components/slideshow-parallax.min.js +1 -1
  35. package/dist/js/components/slideshow.js +7 -1
  36. package/dist/js/components/slideshow.min.js +1 -1
  37. package/dist/js/components/sortable.js +7 -1
  38. package/dist/js/components/sortable.min.js +1 -1
  39. package/dist/js/components/tooltip.js +25 -29
  40. package/dist/js/components/tooltip.min.js +1 -1
  41. package/dist/js/components/upload.js +1 -1
  42. package/dist/js/components/upload.min.js +1 -1
  43. package/dist/js/uikit-core.js +47 -39
  44. package/dist/js/uikit-core.min.js +1 -1
  45. package/dist/js/uikit-icons.js +1 -1
  46. package/dist/js/uikit-icons.min.js +1 -1
  47. package/dist/js/uikit.js +53 -42
  48. package/dist/js/uikit.min.js +1 -1
  49. package/package.json +3 -8
  50. package/src/js/components/filter.js +10 -5
  51. package/src/js/core/drop.js +7 -6
  52. package/src/js/mixin/class.js +8 -1
  53. package/src/js/mixin/modal.js +12 -2
  54. package/src/js/mixin/togglable.js +7 -8
  55. package/src/js/util/viewport.js +1 -1
  56. package/tests/upload.html +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## WIP
4
+
5
+ ### Fixed
6
+
7
+ - Fix negative numbers sorted incorrectly in Filter component
8
+ - Fix Modal component stealing focus from overlays rendered outside the modal
9
+ - Fix component root class not removed after disconnect
10
+
3
11
  ## 3.25.15 (April 9, 2026)
4
12
 
5
13
  ### Fixed
package/build/build.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import camelize from 'camelcase';
2
2
  import { glob } from 'glob';
3
+ import path from 'node:path';
3
4
  import pLimit from 'p-limit';
4
- import path from 'path';
5
5
  import { args, compile, icons } from './util.js';
6
6
 
7
7
  const limit = pLimit(Number(process.env.cpus || 2));
package/build/less.js CHANGED
@@ -1,6 +1,6 @@
1
- import fs from 'fs-extra';
2
- import { glob } from 'glob';
3
- import path from 'path';
1
+ import fs from 'node:fs';
2
+ import { glob } from 'node:fs/promises';
3
+ import path from 'node:path';
4
4
  import rtlcss from 'rtlcss';
5
5
  import { args, banner, minify, read, renderLess, write } from './util.js';
6
6
 
@@ -11,15 +11,15 @@ const sources = [
11
11
  { src: 'src/less/uikit.theme.less', dist: `dist/css/uikit${rtl ? '-rtl' : ''}.css` },
12
12
  ];
13
13
 
14
- const themes = (await fs.pathExists('themes.json')) ? await fs.readJson('themes.json') : {};
14
+ const themes = fs.existsSync('themes.json') ? JSON.parse(await read('themes.json')) : {};
15
15
 
16
- for (const src of await glob('custom/*.less')) {
16
+ for await (const src of glob('custom/*.less')) {
17
17
  const theme = path.basename(src, '.less');
18
18
  const dist = `dist/css/uikit.${theme}${rtl ? '-rtl' : ''}.css`;
19
19
 
20
20
  themes[theme] = { css: `../${dist}` };
21
21
 
22
- if (await fs.pathExists(`dist/js/uikit-icons-${theme}.js`)) {
22
+ if (fs.existsSync(`dist/js/uikit-icons-${theme}.js`)) {
23
23
  themes[theme].icons = `../dist/js/uikit-icons-${theme}.js`;
24
24
  }
25
25
 
@@ -28,7 +28,7 @@ for (const src of await glob('custom/*.less')) {
28
28
 
29
29
  await Promise.all(sources.map(({ src, dist }) => compile(src, dist, develop, rtl)));
30
30
 
31
- if (!rtl && (Object.keys(themes).length || !(await fs.pathExists('themes.json')))) {
31
+ if (!rtl && (Object.keys(themes).length || !fs.existsSync('themes.json'))) {
32
32
  await write('themes.json', JSON.stringify(themes));
33
33
  }
34
34
 
package/build/prefix.js CHANGED
@@ -1,5 +1,5 @@
1
- import { glob } from 'glob';
2
1
  import inquirer from 'inquirer';
2
+ import { glob } from 'node:fs/promises';
3
3
  import { args, read, replaceInFile } from './util.js';
4
4
 
5
5
  if (args.h || args.help) {
@@ -60,13 +60,13 @@ function isValidPrefix(prefix) {
60
60
  }
61
61
 
62
62
  async function replacePrefix(from, to) {
63
- for (const file of await glob(`${path}/**/*.css`)) {
63
+ for await (const file of glob(`${path}/**/*.css`)) {
64
64
  await replaceInFile(file, (data) =>
65
65
  data.replace(new RegExp(`${from}-([a-z\\d-]+)`, 'g'), `${to}-$1`),
66
66
  );
67
67
  }
68
68
 
69
- for (const file of await glob(`${path}/**/*.js`)) {
69
+ for await (const file of glob(`${path}/**/*.js`)) {
70
70
  await replaceInFile(file, (data) =>
71
71
  data
72
72
  .replace(new RegExp(`${from}-`, 'g'), `${to}-`)
package/build/release.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import archiver from 'archiver';
2
- import * as date from 'date-fns';
3
2
  import { $ } from 'execa';
4
- import fs from 'fs';
5
- import { glob } from 'glob';
6
3
  import inquirer from 'inquirer';
4
+ import fs from 'node:fs';
5
+ import { glob } from 'node:fs/promises';
7
6
  import semver from 'semver';
8
7
  import { args, getVersion, logFile, read, replaceInFile } from './util.js';
9
8
 
@@ -53,10 +52,7 @@ function raiseVersion(version) {
53
52
  return Promise.all([
54
53
  $$`npm version ${version} --git-tag-version false`,
55
54
  replaceInFile('CHANGELOG.md', (data) =>
56
- data.replace(
57
- /^##\s*WIP.*$/m,
58
- `## ${versionFormat(version)} (${date.format(new Date(), 'MMMM d, yyyy')})`,
59
- ),
55
+ data.replace(/^##\s*WIP.*$/m, `## ${versionFormat(version)} (${dateFormat()})`),
60
56
  ),
61
57
  replaceInFile('.github/ISSUE_TEMPLATE/bug-report.md', (data) =>
62
58
  data.replace(prevVersion, version),
@@ -76,7 +72,7 @@ async function createPackage(version) {
76
72
 
77
73
  archive.pipe(output);
78
74
 
79
- for (const file of await glob('dist/{js,css}/uikit?(-icons|-rtl)?(.min).{js,css}')) {
75
+ for await (const file of glob('dist/{js,css}/uikit?(-icons|-rtl)?(.min).{js,css}')) {
80
76
  archive.file(file, { name: file.slice(5) });
81
77
  }
82
78
 
@@ -105,7 +101,7 @@ async function deploy(version) {
105
101
  const branch = `release/v${version}`;
106
102
 
107
103
  await $$`git checkout -b ${branch}`;
108
- await $$`git stage --all`;
104
+ await $$`git add --all`;
109
105
  await $$`git commit -am v${version}`;
110
106
 
111
107
  await $$`git checkout main`;
@@ -126,3 +122,11 @@ async function deploy(version) {
126
122
 
127
123
  await $$`git push origin develop`;
128
124
  }
125
+
126
+ function dateFormat() {
127
+ return new Intl.DateTimeFormat('en-US', {
128
+ month: 'long',
129
+ day: 'numeric',
130
+ year: 'numeric',
131
+ }).format(new Date());
132
+ }
package/build/scss.js CHANGED
@@ -1,18 +1,15 @@
1
- import { emptyDir } from 'fs-extra';
2
1
  import { glob } from 'glob';
3
- import NP from 'number-precision';
4
- import path from 'path';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
5
4
  import { read, write } from './util.js';
6
5
 
7
- NP.enableBoundaryChecking(false);
8
-
9
6
  const coreMixins = {};
10
7
  const themeMixins = {};
11
8
  const coreVariables = {};
12
9
  const themeVariables = {};
13
10
  const inverseComponentMixins = [];
14
11
 
15
- await emptyDir('src/scss/');
12
+ await emptyDir('src/scss');
16
13
 
17
14
  for (const file of (await glob('src/less/**/*.less'))
18
15
  .sort()
@@ -24,7 +21,7 @@ for (const file of (await glob('src/less/**/*.less'))
24
21
  .replace(/@(?!property)/g, '$') // convert variables
25
22
  .replace(
26
23
  /(:[^'"]*?\([^'"]+?)\s*\/\s*([0-9.-]+)\)/g,
27
- (exp, m1, m2) => `${m1} * ${NP.round(1 / parseFloat(m2), 5)})`,
24
+ (exp, m1, m2) => `${m1} * ${round(1 / parseFloat(m2), 5)})`,
28
25
  )
29
26
  .replace(/--uk-\S+: (\$\S+);/g, (exp, name) => exp.replace(name, `#{${name}}`))
30
27
  .replace(/\\\$/g, '\\@') // revert classes using the @ symbol
@@ -248,3 +245,12 @@ async function getVariablesFromFile(file, source) {
248
245
  // Remove variables from source
249
246
  return source.replace(/(\$[\w-]*)\s*:(.*);\r?\n/g, '');
250
247
  }
248
+
249
+ async function emptyDir(dir) {
250
+ await fs.rm(dir, { recursive: true, force: true });
251
+ await fs.mkdir(dir, { recursive: true });
252
+ }
253
+
254
+ function round(num, precision) {
255
+ return Math.round(num * 10 ** precision) / 10 ** precision;
256
+ }
package/build/util.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import alias from '@rollup/plugin-alias';
2
2
  import CleanCSS from 'clean-css';
3
- import fs from 'fs-extra';
4
- import { glob } from 'glob';
5
3
  import less from 'less';
6
- import minimist from 'minimist';
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import { parseArgs, styleText } from 'node:util';
7
7
  import pLimit from 'p-limit';
8
- import path from 'path';
9
8
  import { rollup, watch as rollupWatch } from 'rollup';
10
9
  import { default as esbuild, minify as esbuildMinify } from 'rollup-plugin-esbuild';
11
10
  import { optimize } from 'svgo';
@@ -14,21 +13,24 @@ const limit = pLimit(Number(process.env.cpus || 2));
14
13
 
15
14
  export const banner = `/*! UIkit ${await getVersion()} | https://www.getuikit.com | (c) 2014 - ${new Date().getFullYear()} YOOtheme | MIT License */\n`;
16
15
 
17
- const argv = minimist(process.argv.slice(2));
18
-
19
- argv._.forEach((arg) => {
20
- const tokens = arg.split('=');
21
- argv[tokens[0]] = tokens[1] || true;
16
+ const { positionals, values } = parseArgs({
17
+ args: process.argv.slice(2),
18
+ allowPositionals: true,
19
+ strict: false,
22
20
  });
23
21
 
24
- export const args = argv;
22
+ export const args = positionals.reduce((args, arg) => {
23
+ const tokens = arg.split('=');
24
+ args[tokens[0]] = tokens[1] || true;
25
+ return args;
26
+ }, values);
25
27
 
26
28
  export function read(file) {
27
29
  return fs.readFile(file, 'utf8');
28
30
  }
29
31
 
30
32
  export async function write(dest, data) {
31
- fs.ensureDir(path.dirname(dest));
33
+ await fs.mkdir(path.dirname(dest), { recursive: true });
32
34
 
33
35
  await fs.writeFile(dest, data);
34
36
  await logFile(dest);
@@ -38,7 +40,7 @@ export async function write(dest, data) {
38
40
 
39
41
  export async function logFile(file) {
40
42
  const { size } = await fs.stat(file);
41
- console.log(`${cyan(file)} ${formatSize(size)}`);
43
+ console.log(`${styleText(['cyan', 'bold'], file)} ${formatSize(size)}`);
42
44
  }
43
45
 
44
46
  export async function minify(file) {
@@ -174,7 +176,7 @@ export async function compile(
174
176
  export async function icons(...src) {
175
177
  let files = {};
176
178
  for (const pattern of src) {
177
- for (const file of await glob(pattern)) {
179
+ for await (const file of fs.glob(pattern)) {
178
180
  files[path.basename(file, '.svg')] ??= limit(
179
181
  async () => await optimizeSvg(await read(file)),
180
182
  );
@@ -189,22 +191,18 @@ export async function icons(...src) {
189
191
  return JSON.stringify(sorted, null, ' ');
190
192
  }
191
193
 
192
- export function ucfirst(str) {
194
+ function ucfirst(str) {
193
195
  return str.length ? str.charAt(0).toUpperCase() + str.slice(1) : '';
194
196
  }
195
197
 
196
198
  export async function getVersion() {
197
- return (await fs.readJson('package.json')).version;
199
+ return JSON.parse(await fs.readFile('package.json', 'utf8')).version;
198
200
  }
199
201
 
200
202
  export async function replaceInFile(file, fn) {
201
203
  await write(file, await fn(await read(file)));
202
204
  }
203
205
 
204
- function cyan(str) {
205
- return `\x1b[1m\x1b[36m${str}\x1b[39m\x1b[22m`;
206
- }
207
-
208
206
  function formatSize(bytes) {
209
207
  return `${(bytes / 1024).toFixed(2)}kb`;
210
208
  }
package/build/watch.js ADDED
@@ -0,0 +1,21 @@
1
+ import { execSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+
4
+ watch('src/less', '.less', 'node build/less');
5
+
6
+ function watch(path, pattern, cmd) {
7
+ let debounceTimer;
8
+
9
+ execute();
10
+
11
+ fs.watch(path, { recursive: true }, (event, filename) => {
12
+ if (filename?.endsWith(pattern)) {
13
+ clearTimeout(debounceTimer);
14
+ debounceTimer = setTimeout(execute, 100);
15
+ }
16
+ });
17
+
18
+ function execute() {
19
+ execSync(cmd, { stdio: 'inherit' });
20
+ }
21
+ }
@@ -1,4 +1,4 @@
1
- /*! UIkit 3.25.15 | https://www.getuikit.com | (c) 2014 - 2026 YOOtheme | MIT License */
1
+ /*! UIkit 3.25.16-dev.03f5a77 | https://www.getuikit.com | (c) 2014 - 2026 YOOtheme | MIT License */
2
2
  /* ========================================================================
3
3
  Component: Base
4
4
  ========================================================================== */