@unocss/core 0.22.0 → 0.22.4

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/dist/index.cjs CHANGED
@@ -388,7 +388,7 @@ function resolveConfig(userConfig = {}, defaults = {}) {
388
388
  };
389
389
  }
390
390
 
391
- const version = "0.22.0";
391
+ const version = "0.22.4";
392
392
 
393
393
  class UnoGenerator {
394
394
  constructor(userConfig = {}, defaults = {}) {
@@ -513,14 +513,14 @@ class UnoGenerator {
513
513
  return layerCache[layer];
514
514
  let css = Array.from(sheet).sort((a, b) => (this.parentOrders.get(a[0]) ?? 0) - (this.parentOrders.get(b[0]) ?? 0) || a[0]?.localeCompare(b[0] || "") || 0).map(([parent, items]) => {
515
515
  const size = items.length;
516
- const sorted = items.filter((i) => (i[4]?.layer || "default") === layer).sort((a, b) => a[0] - b[0] || a[1]?.localeCompare(b[1] || "") || 0).map((a) => [a[1] ? applyScope(a[1], scope) : a[1], a[2]]).map((a) => [a[0] == null ? a[0] : [a[0]], a[1]]);
516
+ const sorted = items.filter((i) => (i[4]?.layer || "default") === layer).sort((a, b) => a[0] - b[0] || a[1]?.localeCompare(b[1] || "") || 0).map((a) => [a[1] ? applyScope(a[1], scope) : a[1], a[2], !!a[4]?.noMerge]).map((a) => [a[0] == null ? a[0] : [a[0]], a[1], a[2]]);
517
517
  if (!sorted.length)
518
518
  return void 0;
519
- const rules = sorted.reverse().map(([selector, body], idx) => {
520
- if (selector && this.config.mergeSelectors) {
519
+ const rules = sorted.reverse().map(([selector, body, noMerge], idx) => {
520
+ if (!noMerge && selector && this.config.mergeSelectors) {
521
521
  for (let i = idx + 1; i < size; i++) {
522
522
  const current = sorted[i];
523
- if (current && current[0] && current[1] === body) {
523
+ if (current && !current[2] && current[0] && current[1] === body) {
524
524
  current[0].push(...selector);
525
525
  return null;
526
526
  }
@@ -690,18 +690,25 @@ class UnoGenerator {
690
690
  continue;
691
691
  const { selector, entries, parent: parent2 } = this.applyVariants(item, [...item[4], ...parentVariants], raw);
692
692
  const mapItem = selectorMap.getFallback(selector, parent2, [[], item[0]]);
693
- mapItem[0].push(entries);
693
+ mapItem[0].push([entries, !!item[3]?.noMerge]);
694
694
  }
695
695
  return selectorMap.map(([e2, index], selector, mediaQuery) => {
696
- const split = e2.filter((entries) => entries.some((entry) => entry[0] === CONTROL_SHORTCUT_NO_MERGE));
697
- const rest = e2.filter((entries) => entries.every((entry) => entry[0] !== CONTROL_SHORTCUT_NO_MERGE));
698
- return [...split, rest.flat(1)].map((entries) => {
696
+ const stringify = (noMerge) => (entries) => {
699
697
  const body = entriesToCss(entries);
700
698
  if (body)
701
- return [index, selector, body, mediaQuery, meta];
699
+ return [index, selector, body, mediaQuery, { ...meta, noMerge }];
702
700
  return void 0;
701
+ };
702
+ const merges = [
703
+ [e2.filter(([, noMerge]) => noMerge).map(([entries]) => entries), true],
704
+ [e2.filter(([, noMerge]) => !noMerge).map(([entries]) => entries), false]
705
+ ];
706
+ return merges.map(([e3, noMerge]) => {
707
+ const splits = e3.filter((entries) => entries.some((entry) => entry[0] === CONTROL_SHORTCUT_NO_MERGE));
708
+ const rests = e3.filter((entries) => entries.every((entry) => entry[0] !== CONTROL_SHORTCUT_NO_MERGE));
709
+ return [...splits.map(stringify(noMerge)), ...[rests.flat(1)].map(stringify(noMerge))];
703
710
  });
704
- }).flat(1).filter(Boolean);
711
+ }).flat(2).filter(Boolean);
705
712
  }
706
713
  isBlocked(raw) {
707
714
  return !raw || this.config.blocklist.some((e2) => typeof e2 === "string" ? e2 === raw : e2.test(raw));
@@ -718,11 +725,11 @@ function applyScope(css, scope) {
718
725
  else
719
726
  return scope ? `${scope} ${css}` : css;
720
727
  }
728
+ const attributifyRe = /^\[(.+?)(~?=)"(.*)"\]$/;
721
729
  function toEscapedSelector(raw) {
722
- if (raw.startsWith("["))
723
- return raw.replace(/^\[(.+?)(~?=)"(.*)"\]$/, (_, n, s, i) => `[${e(n)}${s}"${e(i)}"]`);
724
- else
725
- return `.${e(raw)}`;
730
+ if (attributifyRe.test(raw))
731
+ return raw.replace(attributifyRe, (_, n, s, i) => `[${e(n)}${s}"${e(i)}"]`);
732
+ return `.${e(raw)}`;
726
733
  }
727
734
 
728
735
  exports.BetterMap = BetterMap;
package/dist/index.d.ts CHANGED
@@ -123,6 +123,11 @@ interface RuleMeta {
123
123
  * @default 'default'
124
124
  */
125
125
  layer?: string;
126
+ /**
127
+ * Option to not merge this selector even if the body are the same.
128
+ * @default false
129
+ */
130
+ noMerge?: boolean;
126
131
  /**
127
132
  * Internal rules will only be matched for shortcuts but not the user code.
128
133
  * @default false
package/dist/index.mjs CHANGED
@@ -384,7 +384,7 @@ function resolveConfig(userConfig = {}, defaults = {}) {
384
384
  };
385
385
  }
386
386
 
387
- const version = "0.22.0";
387
+ const version = "0.22.4";
388
388
 
389
389
  class UnoGenerator {
390
390
  constructor(userConfig = {}, defaults = {}) {
@@ -509,14 +509,14 @@ class UnoGenerator {
509
509
  return layerCache[layer];
510
510
  let css = Array.from(sheet).sort((a, b) => (this.parentOrders.get(a[0]) ?? 0) - (this.parentOrders.get(b[0]) ?? 0) || a[0]?.localeCompare(b[0] || "") || 0).map(([parent, items]) => {
511
511
  const size = items.length;
512
- const sorted = items.filter((i) => (i[4]?.layer || "default") === layer).sort((a, b) => a[0] - b[0] || a[1]?.localeCompare(b[1] || "") || 0).map((a) => [a[1] ? applyScope(a[1], scope) : a[1], a[2]]).map((a) => [a[0] == null ? a[0] : [a[0]], a[1]]);
512
+ const sorted = items.filter((i) => (i[4]?.layer || "default") === layer).sort((a, b) => a[0] - b[0] || a[1]?.localeCompare(b[1] || "") || 0).map((a) => [a[1] ? applyScope(a[1], scope) : a[1], a[2], !!a[4]?.noMerge]).map((a) => [a[0] == null ? a[0] : [a[0]], a[1], a[2]]);
513
513
  if (!sorted.length)
514
514
  return void 0;
515
- const rules = sorted.reverse().map(([selector, body], idx) => {
516
- if (selector && this.config.mergeSelectors) {
515
+ const rules = sorted.reverse().map(([selector, body, noMerge], idx) => {
516
+ if (!noMerge && selector && this.config.mergeSelectors) {
517
517
  for (let i = idx + 1; i < size; i++) {
518
518
  const current = sorted[i];
519
- if (current && current[0] && current[1] === body) {
519
+ if (current && !current[2] && current[0] && current[1] === body) {
520
520
  current[0].push(...selector);
521
521
  return null;
522
522
  }
@@ -686,18 +686,25 @@ class UnoGenerator {
686
686
  continue;
687
687
  const { selector, entries, parent: parent2 } = this.applyVariants(item, [...item[4], ...parentVariants], raw);
688
688
  const mapItem = selectorMap.getFallback(selector, parent2, [[], item[0]]);
689
- mapItem[0].push(entries);
689
+ mapItem[0].push([entries, !!item[3]?.noMerge]);
690
690
  }
691
691
  return selectorMap.map(([e2, index], selector, mediaQuery) => {
692
- const split = e2.filter((entries) => entries.some((entry) => entry[0] === CONTROL_SHORTCUT_NO_MERGE));
693
- const rest = e2.filter((entries) => entries.every((entry) => entry[0] !== CONTROL_SHORTCUT_NO_MERGE));
694
- return [...split, rest.flat(1)].map((entries) => {
692
+ const stringify = (noMerge) => (entries) => {
695
693
  const body = entriesToCss(entries);
696
694
  if (body)
697
- return [index, selector, body, mediaQuery, meta];
695
+ return [index, selector, body, mediaQuery, { ...meta, noMerge }];
698
696
  return void 0;
697
+ };
698
+ const merges = [
699
+ [e2.filter(([, noMerge]) => noMerge).map(([entries]) => entries), true],
700
+ [e2.filter(([, noMerge]) => !noMerge).map(([entries]) => entries), false]
701
+ ];
702
+ return merges.map(([e3, noMerge]) => {
703
+ const splits = e3.filter((entries) => entries.some((entry) => entry[0] === CONTROL_SHORTCUT_NO_MERGE));
704
+ const rests = e3.filter((entries) => entries.every((entry) => entry[0] !== CONTROL_SHORTCUT_NO_MERGE));
705
+ return [...splits.map(stringify(noMerge)), ...[rests.flat(1)].map(stringify(noMerge))];
699
706
  });
700
- }).flat(1).filter(Boolean);
707
+ }).flat(2).filter(Boolean);
701
708
  }
702
709
  isBlocked(raw) {
703
710
  return !raw || this.config.blocklist.some((e2) => typeof e2 === "string" ? e2 === raw : e2.test(raw));
@@ -714,11 +721,11 @@ function applyScope(css, scope) {
714
721
  else
715
722
  return scope ? `${scope} ${css}` : css;
716
723
  }
724
+ const attributifyRe = /^\[(.+?)(~?=)"(.*)"\]$/;
717
725
  function toEscapedSelector(raw) {
718
- if (raw.startsWith("["))
719
- return raw.replace(/^\[(.+?)(~?=)"(.*)"\]$/, (_, n, s, i) => `[${e(n)}${s}"${e(i)}"]`);
720
- else
721
- return `.${e(raw)}`;
726
+ if (attributifyRe.test(raw))
727
+ return raw.replace(attributifyRe, (_, n, s, i) => `[${e(n)}${s}"${e(i)}"]`);
728
+ return `.${e(raw)}`;
722
729
  }
723
730
 
724
731
  export { BetterMap, CONTROL_SHORTCUT_NO_MERGE, TwoKeyMap, UnoGenerator, attributifyRE, clearIdenticalEntries, clone, createGenerator, createValueHandler, e, entriesToCss, escapeRegExp, escapeSelector, expandVariantGroup, extractorSplit, extractorSvelte, hasScopePlaceholder, hex2rgba, isAttributifySelector, isObject, isRawUtil, isStaticRule, isStaticShortcut, isValidSelector, mergeDeep, mergeSet, normalizeCSSEntries, normalizeCSSValues, normalizeVariant, notNull, regexClassGroup, toArray, uniq, validateFilterRE, warnOnce, withLayer };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unocss/core",
3
- "version": "0.22.0",
3
+ "version": "0.22.4",
4
4
  "description": "The instant on-demand Atomic CSS engine.",
5
5
  "keywords": [
6
6
  "unocss",