@unsass/selector 1.1.0 → 1.2.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
4
4
 
5
+ ## [1.2.0](https://github.com/unsass/selector/compare/v1.1.0...v1.2.0) (2023-03-20)
6
+
7
+
8
+ ### Features
9
+
10
+ * allow `&` nesting selector ([20d12a2](https://github.com/unsass/selector/commit/20d12a2302e8a8c31a60e19094bbeb2aa16af1b1))
11
+
12
+
13
+ ### Code Refactoring
14
+
15
+ * add better error messages ([6ae5295](https://github.com/unsass/selector/commit/6ae529558dc230a0cdf7677b7fa226e2270e5436))
16
+ * removed unneeded sass import ([b817859](https://github.com/unsass/selector/commit/b817859233c967a78f0fba7752cbaedda112abff))
17
+
5
18
  ## [1.1.0](https://github.com/unsass/selector/compare/v1.0.0...v1.1.0) (2023-03-20)
6
19
 
7
20
 
package/README.md CHANGED
@@ -19,7 +19,7 @@ npm install @unsass/selector
19
19
  ```scss
20
20
  @use "@unsass/selector";
21
21
 
22
- @include selector.create("foo") {
22
+ @include selector.create("foo", "md") {
23
23
  color: darkcyan;
24
24
  }
25
25
  ```
@@ -27,15 +27,117 @@ npm install @unsass/selector
27
27
  ### Result
28
28
 
29
29
  ```css
30
- .foo {
30
+ .md\:foo {
31
31
  color: darkcyan;
32
32
  }
33
33
  ```
34
34
 
35
35
  ## API
36
36
 
37
- ### Sass mixins
37
+ | Mixin | Description |
38
+ |-----------------------------------------------------------------------------------------|------------------------------------------------------------|
39
+ | `create($selector, $scope, $separator, $suffix, $pseudo-class, $pseudo-element, $root)` | Sets new CSS selector with class scope and pseudo options. |
40
+
41
+ ### `$separator`
42
+
43
+ Define your own scope separator character.
44
+
45
+ ```scss
46
+ @use "@unsass/selector";
47
+
48
+ @include selector.create("foo", "md", "@") {
49
+ color: darkcyan;
50
+ }
51
+ ```
52
+
53
+ ### Result
54
+
55
+ ```css
56
+ .md\@foo {
57
+ color: darkcyan;
58
+ }
59
+ ```
60
+
61
+ ### `$suffix`
62
+
63
+ Define the scope value has a prefix on selector.
64
+
65
+ ```scss
66
+ @use "@unsass/selector";
67
+
68
+ @include selector.create("foo", "md", $suffix: true) {
69
+ color: darkcyan;
70
+ }
71
+ ```
72
+
73
+ ### Result
74
+
75
+ ```css
76
+ .foo\:md {
77
+ color: darkcyan;
78
+ }
79
+ ```
80
+
81
+ ### `$pseudo-class`
82
+
83
+ Define the pseudo class suffix.
84
+
85
+ ```scss
86
+ @use "@unsass/selector";
87
+
88
+ @include selector.create("foo", "hover", $pseudo-class: "hover") {
89
+ color: darkcyan;
90
+ }
91
+ ```
92
+
93
+ ### Result
94
+
95
+ ```css
96
+ .hover\:foo:hover {
97
+ color: darkcyan;
98
+ }
99
+ ```
100
+
101
+ ### `$pseudo-element`
102
+
103
+ Define the pseudo element suffix.
104
+
105
+ ```scss
106
+ @use "@unsass/selector";
107
+
108
+ @include selector.create("foo", "before", $pseudo-element: "before") {
109
+ color: darkcyan;
110
+ }
111
+ ```
112
+
113
+ ### Result
114
+
115
+ ```css
116
+ .before\:foo::before {
117
+ color: darkcyan;
118
+ }
119
+ ```
120
+
121
+ ### `$root`
122
+
123
+ Wrap the selector with `@at-root` rule before code output.
124
+
125
+ ```scss
126
+ @use "@unsass/selector";
127
+
128
+ .foo {
129
+ .bar {
130
+ @include selector.create(&, "md", $root: true) {
131
+ color: darkcyan;
132
+ }
133
+ }
134
+ }
135
+ ```
136
+
137
+ ### Result
38
138
 
39
- | Mixin | Description |
40
- |----------------------------------------------------------------------------------|------------------------------------------------------------|
41
- | `create($selector, $scope, $separator, $suffix, $pseudo-class, $pseudo-element)` | Sets new CSS selector with class scope and pseudo options. |
139
+ ```css
140
+ .md\:foo .bar {
141
+ color: darkcyan;
142
+ }
143
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unsass/selector",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Sass functions and mixins to manage CSS selectors.",
5
5
  "scripts": {
6
6
  "lint:css": "stylelint --fix \"**/*.scss\"",
package/src/_mixins.scss CHANGED
@@ -2,7 +2,7 @@
2
2
  // MIXINS //
3
3
  // ============================================================================================= //
4
4
 
5
- @use "sass:meta";
5
+ @use "sass:list";
6
6
  @use "sass:selector";
7
7
  @use "@unsass/string";
8
8
  @use "@unsass/types" as type;
@@ -61,11 +61,14 @@
61
61
  ///
62
62
  /// @access public
63
63
  ///
64
- @mixin create($selector, $scope: null, $separator: ":", $suffix: false, $pseudo-class: null, $pseudo-element: null) {
65
- @if ($pseudo-class and $suffix) or ($pseudo-element and $suffix) {
66
- @error "You cannot add a suffix with a selector that already has a pseudo-class or a pseudo-element."
64
+ @mixin create($selector, $scope: null, $separator: ":", $suffix: false, $pseudo-class: null, $pseudo-element: null, $root: false) {
65
+ @if $pseudo-class and $suffix {
66
+ @error "You cannot add a suffix with a selector that already has a pseudo-class."
67
+ } @else if $pseudo-element and $suffix {
68
+ @error "You cannot add a suffix with a selector that already has a pseudo-element."
67
69
  }
68
70
 
71
+ $selector: if(type.is-list($selector), "#{list.nth($selector, 1)}", $selector);
69
72
  $class-selector: string.slice($selector, 1, 1) == ".";
70
73
 
71
74
  @if $class-selector {
@@ -78,9 +81,7 @@
78
81
 
79
82
  @if $pseudo-class {
80
83
  $selector: functions.pseudo-class($selector, $pseudo-class);
81
- }
82
-
83
- @if $pseudo-element {
84
+ } @else if $pseudo-element {
84
85
  $selector: functions.pseudo-element($selector, $pseudo-element);
85
86
  }
86
87
 
@@ -104,8 +105,16 @@
104
105
  /// Set selector.
105
106
  ///
106
107
 
107
- #{functions.to-class($selector)} {
108
- @content;
108
+ $selector: functions.to-class($selector);
109
+
110
+ @if $root {
111
+ @at-root #{$selector} {
112
+ @content;
113
+ }
114
+ } @else {
115
+ #{$selector} {
116
+ @content;
117
+ }
109
118
  }
110
119
  }
111
120