postcss-enumerates-in-line 0.1.1 → 0.3.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.
Binary file
package/README.md CHANGED
@@ -5,9 +5,24 @@
5
5
  |[<img width="24" height="24" align="left" src="README.img/1f1ef-1f1f5.png" alt="🇯🇵"> 日本語](README.md)|[<img width="24" height="24" align="left" src="README.img/1f1fa-1f1f8.png" alt="🇺🇸"> English](README_EN.md)|
6
6
 
7
7
 
8
- ## 更新点: v0.1.0
8
+ ## 更新点: v0.3.0
9
+
10
+ - 以下の条件付きCSSプロパティを追加
11
+ + `hover!`
12
+ + `dark!`
13
+ + `mq(<mediaQueries>)!`
14
+ + `data(<customDataElements>)`
15
+ + `aria(<ariaAttributes>)`
16
+ - デフォルトカラーを[Flexoki]に変更
17
+ - `_color.scss`を同梱
18
+ - 作成例の`test/gulp/`と`test/postcss/`を更新
19
+
20
+
21
+ ## 実装予定
22
+
23
+ - ユーザー定義ショートハンド機能
24
+ - `[[...]]`構文の改良と、デフォルトカラーにアルファチャンネルを設定できる`color-alpha[[...]]`構文の追加
9
25
 
10
- - サンプルのパッケージ読み込みを[npmjs.com](https://www.npmjs.com/)経由に変更
11
26
 
12
27
  ---
13
28
 
@@ -39,12 +54,22 @@
39
54
  >
40
55
  > `:`記号の前がプロパティ名、後ろがプロパティ値になっています。
41
56
  > ホワイトスペースはプロパティの区切り文字であるため、プロパティ値に半角スペース記号を使いたい場合は`^`で代用します。
42
- >
43
- > 詳しい書式は目次の次へお進みください。
44
57
 
45
- プロパティの列挙を目的としているため、hoverのような状態遷移・メディアクエリ・ダークモードなどへの対応はしません。
58
+ ~~プロパティの列挙を目的としているため、hoverのような状態遷移・メディアクエリ・ダークモードなどへの対応はしません。~~
46
59
 
47
- > [Tailwind CSS]における`hover:`・`md:`・`dark:`などに対応する機能は備えていないという意味です。
60
+ ~~> [Tailwind CSS]における`hover:`・`md:`・`dark:`などに対応する機能は備えていないという意味です。~~
61
+
62
+ ☑️version 0.3.0以上
63
+
64
+ またCSSプロパティ名の先頭に以下の書式を加筆することで、条件付きCSSプロパティに対応することができます。
65
+
66
+ - `hover!`: :hover
67
+ - `dark!`: :root.dark
68
+ - `mq(<mediaQueries>)!`: @media screen and &lt;mediaQueries&gt;
69
+ - `data(<customDataElements>)!`: [data-&lt;customDataElement&gt;]
70
+ - `aria(<ariaAttributes>)!`: [aria-&lt;ariaAttributes&gt;]
71
+
72
+ > 詳しい書式は目次の次へお進みください。
48
73
 
49
74
  基本的には[gulp]および[gulp-postcss]での動作を想定していますが、JS-APIによるPostCSS単体でも動作します。
50
75
 
@@ -53,6 +78,7 @@
53
78
  [SCSS]: https://sass-lang.com/
54
79
  [gulp]: https://gulpjs.com/
55
80
  [gulp-postcss]: https://github.com/postcss/gulp-postcss
81
+ [Flexoki]: https://stephango.com/flexoki
56
82
 
57
83
  <div class="x--hr"></div>
58
84
 
@@ -60,14 +86,22 @@
60
86
  ## 目次
61
87
 
62
88
  - [PostCSS Enumerates in Line](#postcss-enumerates-in-line)
63
- - [更新点: v0.1.0](#更新点-v010)
89
+ - [更新点: v0.3.0](#更新点-v030)
90
+ - [実装予定](#実装予定)
64
91
  - [目次](#目次)
65
92
  - [CSSでの記述方法](#cssでの記述方法)
93
+ - [条件付き書式](#条件付き書式)
94
+ - [ダークモード](#ダークモード)
95
+ - [マウスオーバー](#マウスオーバー)
96
+ - [メディアクエリ](#メディアクエリ)
97
+ - [カスタムデータ属性](#カスタムデータ属性)
98
+ - [ARIA属性](#aria属性)
66
99
  - [特殊な記号](#特殊な記号)
67
100
  - [コロン記号](#コロン記号)
68
101
  - [エクスクラメーション記号](#エクスクラメーション記号)
69
102
  - [サーカムフレックス記号](#サーカムフレックス記号)
70
103
  - [二重角括弧記号](#二重角括弧記号)
104
+ - [デフォルトカラー](#デフォルトカラー)
71
105
  - [プロパティ名のショートハンド](#プロパティ名のショートハンド)
72
106
  - [プラグインを使用する方法](#プラグインを使用する方法)
73
107
  - [gulpでの使い方](#gulpでの使い方)
@@ -100,7 +134,7 @@ html {
100
134
  @enums background-color:#000 color:#fff;
101
135
 
102
136
  h1 {
103
- @enums font-size:100%;
137
+ @enums font-size:100% hover!color:red;
104
138
  }
105
139
  }
106
140
  ```
@@ -116,6 +150,303 @@ CSSスタイル宣言についても単純で、「`プロパティ名`・`半
116
150
  プロパティ値は任意の値を取ることができるため、`border:1px^#888^solid`など自由な指示をすることができるでしょう。
117
151
 
118
152
 
153
+ ### 条件付き書式
154
+
155
+ ```scss
156
+ h1 {
157
+ @emums data(visible="hidden")!display:none
158
+ ct:blue hover!ct:red
159
+ cb:white dark!cb:black
160
+ mq(width:1000px-)!mx:auto;
161
+ }
162
+ ```
163
+
164
+ 上記のように`条件付き書式!CSSプロパティ名:CSSプロパティ値`と記法を拡張することができます。
165
+
166
+ `hover!`, `dark!`, `mq(...)!`, `data(...)!`, `aria(...)!`はそれぞれ重ね掛けが可能です。
167
+
168
+ ```scss
169
+ h1 {
170
+ @enums dark!hover!ct:red;
171
+ }
172
+ ```
173
+
174
+ ただしこれら条件付き書式は1つのCSSプロパティにつき1種しか設定できないため、`mq(...)!`・`data(...)!`・`aria(...)!`を連続して記述できません。
175
+
176
+ 列挙する場合は`(`・`)`の中で、`,`を使ってください。
177
+
178
+ 同種の条件付き書式を重複させた場合、最初のものだけが適用され、残りの指定内容は無視されます。
179
+
180
+ ```scss
181
+ /* ❌️NG */
182
+ h1 {
183
+ @enums mq(width:-640px)!mq(orientation:portrait)!m2:auto
184
+ data(state="succeed")!data(target-href^="https://")!text-indent:1rem;
185
+ }
186
+
187
+ /* ⭕️OK */
188
+ h1 {
189
+ @enums mq(width:-640px,orientation:portrait)!m2:auto
190
+ data(state="succeed",target-href^="https://")!text-indent:1rem;
191
+ }
192
+
193
+ /* 🙂Unzip */
194
+ @media screen and (max-width: 640px) and (orientation: portrait) {
195
+ h1 {
196
+ margin-bottom: auto;
197
+ }
198
+ }
199
+ h1[data-state="succeed"][data-target-href^="https://"] {
200
+ text-indent: 1rem;
201
+ }
202
+ ```
203
+
204
+
205
+ #### ダークモード
206
+
207
+ 条件付き書式`dark!`を使うと、`root:`(html要素)に`dark`クラスが存在するかどうかで判定できるようになります。
208
+
209
+ ```scss
210
+ /* 🚧Before */
211
+ h1 {
212
+ @emums cb:white dark!cb:black;
213
+ }
214
+
215
+ /* 🚀After */
216
+ h1 {
217
+ background-color: white;
218
+ }
219
+ :root.dark h1 {
220
+ background-color: black;
221
+ }
222
+ ```
223
+
224
+
225
+ #### マウスオーバー
226
+
227
+ 条件付き書式`hover!`を使うと、`:hover`(マウスオーバー状態)擬似クラスを追加できます。
228
+
229
+ ```scss
230
+ /* 🚧Before */
231
+ h1 {
232
+ @emums ct:blue hover!ct:red;
233
+ }
234
+
235
+ /* 🚀After */
236
+ h1 {
237
+ color: blue;
238
+ }
239
+ h1:hover {
240
+ color: red;
241
+ }
242
+ ```
243
+
244
+
245
+ #### メディアクエリ
246
+
247
+ 条件付き書式`mq(<mediaQueries>)!`を使うと、`@media`ルールの中に入れることができます。
248
+
249
+ 複数のメディアクエリを組み合わせる場合は、`,`で区切ります。
250
+
251
+ ```scss
252
+ /* 🚧Before */
253
+ h1 {
254
+ @emums mq(width:1000px-)!m2:auto
255
+ mq(height:-1000px,aspect-ratio:1-)!p:1.5rem;
256
+ }
257
+
258
+ /* 🚀After */
259
+ @media screen and (min-width: 1000px) {
260
+ h1 {
261
+ margin-bottom: auto;
262
+ }
263
+ }
264
+ @media screen and (max-height: 1000px) and (min-aspect-ratio: 1) {
265
+ h1 {
266
+ padding: 1.5rem;
267
+ }
268
+ }
269
+ ```
270
+
271
+ `mq(...)`関数の引数となるメディアクエリは、`メディア特性`・`:`・`条件値`の組み合わせになっています。
272
+
273
+ 利用可能なメディア特性は次の通りですが、条件値によって出力される実際のメディア特性が変化します。
274
+
275
+ - `orientation`: orientation
276
+ - `width`: width, min-width, max-width
277
+ - `height`: height, min-height, max-height
278
+ - `aspect-ratio`: aspect-ratio, min-aspect-ratio, max-aspect-ratio
279
+
280
+ > `orientation`に指定可能な条件値は、`portrait`(縦長または正方形)と`landscape`(横長)のいずれかのみです。
281
+
282
+ ```scss
283
+ body {
284
+ @enums
285
+ mq(orientation:portrait)!m2:1rem
286
+ mq(orientation:landscape)!m8:1rem
287
+ ;
288
+ }
289
+ ```
290
+
291
+ > `width`に指定可能な条件値は、`-<length>`・`<length>-<length>`・`<length>-`の3種類です。
292
+ >
293
+ > `<length>`に指定可能なのは`px`・`rem`・`vw`など長さに関わる値です。
294
+ >
295
+ > + 1つのみある`<length>`の前に`-`を付けた場合、`<length>`以下のメディアクエリを意味します(適用されるメディア特性は`max-width`)
296
+ > + 2つの`<length>`を`-`で接続した場合、その区間以内であるメディアクエリを意味します(適用されるメディア特性は`min-width`と`max-width`)
297
+ > + 1つのみある`<length>`の後ろに`-`を付けた場合、`<length>`以上のメディアクエリを意味します(適用されるメディア特性は`min-width`)
298
+
299
+ ```scss
300
+ body {
301
+ @enums
302
+ mq(width:-480px)!m2:1rem
303
+ mq(width:640px-1024px)!mx:1rem
304
+ mq(width:1280px)!m8:1rem
305
+ ;
306
+ }
307
+ ```
308
+
309
+ > `height`に指定可能な条件値、および動作は`width`と同じです。
310
+ >
311
+ > ただし適用されるメディア特性は、`height`・`min-height`・`max-height`に変化します。
312
+
313
+ ```scss
314
+ body {
315
+ @enums
316
+ mq(height:-480px)!m2:1rem
317
+ mq(height:640px-1024px)!mx:1rem
318
+ mq(height:1280px)!m8:1rem
319
+ ;
320
+ }
321
+ ```
322
+
323
+ > `aspect-ratio`に指定可能な条件値は、`整数値`(1など)または`小数値`(0.85など)です。
324
+ >
325
+ > `@media (aspect-ratio: 16/9)`のような除算記号(`/`)を使った表記はできません。
326
+ >
327
+ > `width`・`height`に似た表記が可能で、`-<number>`・`<number>-<number>`・`<number>-`の3種類と`<number>`が実際に指定可能な条件値です。
328
+ >
329
+ > + 1つのみある`<number>`の前に`-`を付けた場合、`<number>`以下のメディアクエリを意味します(適用されるメディア特性は`max-aspect-ratio`)
330
+ > + 2つの`<number>`を`-`で接続した場合、その区間以内であるメディアクエリを意味します(適用されるメディア特性は`min-aspect-ratio`と`max-aspect-ratio`)
331
+ > + 1つのみある`<number>`の後ろに`-`を付けた場合、`<number>`以上のメディアクエリを意味します(適用されるメディア特性は`min-aspect-ratio`)
332
+ > + `<number>`が1つのみあって`-`がない場合、アスペクト比が`<number>`とまったく等しい状態を意味します(適用されるメディア特性は`aspect-ratio`)
333
+
334
+ ```scss
335
+ body {
336
+ @enums
337
+ mq(aspect-ratio:-0.5)!m2:1rem
338
+ mq(aspect-ratio:0.55-0.95)!mx:1rem
339
+ mq(aspect-ratio:1.25-)!m8:1rem
340
+ mq(aspect-ratio:1)!p:1rem
341
+ ;
342
+ }
343
+ ```
344
+
345
+
346
+ #### カスタムデータ属性
347
+
348
+ 条件付き書式`data(<customDataElements>)!`を使うと、`[data-foo="bar"]`のようなカスタムデータによる属性セレクターを追加できます。
349
+
350
+ 複数の属性セレクターを組み合わせる場合は、`,`で区切ります。
351
+
352
+ ```scss
353
+ /* 🚧Before */
354
+ h1 {
355
+ @emums data(visible="hidden")!display:none;
356
+ }
357
+
358
+ /* 🚀After */
359
+ h1[data-visible="hidden"] {
360
+ display: none;
361
+ }
362
+ ```
363
+
364
+ 属性セレクターは`属性名`、または`属性名`・`条件演算子`・`属性データ`の組み合わせになっています。
365
+
366
+ 属性名が存在することだけを条件にする場合は、`条件演算子`と`属性データ`を必要としません。
367
+
368
+ ```scss
369
+ /* 🚧Before */
370
+ h1 {
371
+ @enums data(loading)!display:none
372
+ data(is-empty="false")!m8:1rem;
373
+ }
374
+
375
+ /* 🚀After */
376
+ h1[data-loading] {
377
+ display: none;
378
+ }
379
+ h1[data-is-empty="false"] {
380
+ margin-top: 1rem;
381
+ }
382
+ ```
383
+
384
+ > 属性名には`data-`に続く文字列を指定します。
385
+ >
386
+ > 具体的には`/[A-Za-z\d_\-]/`の文字が使用可能ですが、属性名の始端または終端を`-`の文字列とすることはできません。
387
+
388
+ > 条件演算子には次の種類を使用することができます。
389
+ > + `=`: 属性データと一致する場合(`[data-foo="bar"]`)
390
+ > + `~=`: 属性データが空白記号区切りリストであり、その中の1つと一致する場合(`[data-tags~="ipsum"]`, `<span data-tags="lorem ipsum dolor sit amet"></span>`)
391
+ > + `^=`: 属性データの文字列で始まる場合(`[data-href^="https://"]`)
392
+ > + `$=`: 属性データの文字列で終わる場合(`[data-href$=".webp"]`)
393
+ > + `*=`: 属性データの文字列を含む場合(`[data-alphabet*="bcdef"]`)
394
+ > + `|=`: 属性データと一致する文字列で始まり、かつその後ろに半角ハイフン記号を伴う場合(`[data-lang|="en"]`)
395
+ >
396
+ > > 言語タグとして`en-US`や`en-GB`など、ISO 639 + ISO 3166による表現を行う場合に利用されることの多い表現です。
397
+
398
+ > 属性データは、`"`または`'`で囲まれている必要があります。
399
+ >
400
+ > このため引用符を使う場合は注意してください。
401
+ >
402
+ > またパッケージの内部処理により、以下の文字が属性データに含まれる場合はパーセントエンコーディングを行います。
403
+ > + `%`: %25
404
+ > + `"`: %22
405
+ > + `'`: %27
406
+ > + ```: %60
407
+ > + `\`: %5D
408
+
409
+
410
+ #### ARIA属性
411
+
412
+ 条件付き書式`aria(<ariaAttributes>)!`を使うと、`[aria-label="heading"]`のようなARIA属性によるセレクターを追加できます。
413
+
414
+ 複数の属性セレクターを組み合わせる場合は、`,`で区切ります。
415
+
416
+ ```scss
417
+ /* 🚧Before */
418
+ h1 {
419
+ @emums aria(label="heading")!fs:1.5rem;
420
+ }
421
+
422
+ /* 🚀After */
423
+ h1[aria-label="heading"] {
424
+ font-size: 1.5rem;
425
+ }
426
+ ```
427
+
428
+ 属性セレクターは`属性名`・`=`・`属性データ`の組み合わせになっています。
429
+
430
+ > 属性名には`aria-`に続く文字列を指定します。
431
+ >
432
+ > `/[a-z]/`の文字しか使うことはできません。
433
+
434
+ > 条件演算子は現在`=`のみを有効にしています。
435
+ >
436
+ > 必要になれば`data(...)!`と同等の条件にまで拡張するかもしれません。
437
+
438
+ > 属性データは、`"`または`'`で囲まれている必要があります。
439
+ >
440
+ > このため引用符を使う場合は注意してください。
441
+ >
442
+ > またパッケージの内部処理により、以下の文字が属性データに含まれる場合はパーセントエンコーディングを行います。
443
+ > + `%`: %25
444
+ > + `"`: %22
445
+ > + `'`: %27
446
+ > + ```: %60
447
+ > + `\`: %5D
448
+
449
+
119
450
  ### 特殊な記号
120
451
 
121
452
  特殊な振る舞いを起こす文字は、`:`・`^`・`!`・`[[`・`]]`の5種類です。
@@ -134,6 +465,8 @@ CSSスタイル宣言についても単純で、「`プロパティ名`・`半
134
465
 
135
466
  `padding-top:1rem!`などのようにして、`!`記号をプロパティ値の末尾に付けると`!important`宣言をしたことになります。
136
467
 
468
+ > 条件付き書式の`!`とは働きが異なるためご注意ください。
469
+
137
470
 
138
471
  #### サーカムフレックス記号
139
472
 
@@ -173,7 +506,7 @@ CSSスタイル宣言についても単純で、「`プロパティ名`・`半
173
506
  `width:calc(100vw^-^(100%^+^2rem)^*^2^+^1rem)`のような記述は視覚的ではないため、`[[`と`]]`に囲んだ中であれば`width:calc[[100vw-(100%+2rem)*(2)+1rem]]`としてサーカムフレックス記号を省くことができます。
174
507
 
175
508
  > `var`関数など算術関数でないものに`[[`・`]]`記号は使わないでください。
176
- >
509
+ >
177
510
  > 例えば`var(--foo-bar)`が誤変換されて、`var(--foo - bar)`のようにして意味のないCSSへと破壊されてしまうためです。
178
511
 
179
512
  しかし変換書式を改善中であるため、意図したように演算子の両端へ正常に空白記号が挿入されない可能性があります。
@@ -181,6 +514,46 @@ CSSスタイル宣言についても単純で、「`プロパティ名`・`半
181
514
  こうした場合でも`^`記号を補えば正常な算術関数へと修正できるのですが、より確実な手段としては`[[`・`]]`記号を使わず人力で`^`記号を補う方が間違いは少ないでしょう。
182
515
 
183
516
 
517
+
518
+ ### デフォルトカラー
519
+
520
+ デフォルトカラーは[Flexoki] v2.0からのフォークです。
521
+
522
+ CSSの`var()`関数を使い、CSS変数から呼び出して使用します。
523
+
524
+ ```scss
525
+ body {
526
+ @enums ct:var(--color-red-400);
527
+ }
528
+ ```
529
+
530
+ [<img src="README.img/default_color.png" alt="Default color">](README.img/default_color.png)
531
+
532
+ しかし現状では`#RRGGBBAA`書式のアルファチャンネル付き色設定ができないため、`_color.scss`を同梱しています。
533
+
534
+ ```scss
535
+ @use '../node_modules/postcss-enumerates-in-line/_color.scss' as c;
536
+
537
+ html {
538
+ color: #{c.$color-red-400}99; // D14D4199
539
+ }
540
+ ```
541
+
542
+ > 将来的には`color-alpha[[<color-theme>,<color-depth>,<alpha>,<optional:output-style>]]`関数の実装を予定しています。
543
+
544
+ ```scss
545
+ /* 🚧Before */
546
+ html {
547
+ color: color-alpha[[red,400,60%,oklch]];
548
+ }
549
+
550
+ /* 🚀After */
551
+ html {
552
+ color: oklch(0.597 0.1692 28.38 / 60%);
553
+ }
554
+ ```
555
+
556
+
184
557
  ### プロパティ名のショートハンド
185
558
 
186
559
  いくつかのプロパティ名にはショートハンド定義がしてあります。
@@ -496,7 +869,7 @@ PostCSS処理の配列の中に、`enumSpreader({})`関数を差し込みます
496
869
 
497
870
  ```css
498
871
  :root {
499
- --enums-color-gray-100: hsl(210 5% 10%);
872
+ --color-red-400: hsl(5 61% 53.7%);
500
873
  }
501
874
  ```
502
875
 
@@ -506,7 +879,7 @@ PostCSS処理の配列の中に、`enumSpreader({})`関数を差し込みます
506
879
 
507
880
  ```css
508
881
  :root {
509
- --enums-color-gray-100: #181a1b;
882
+ --color-red-400: #D14D41;
510
883
  }
511
884
  ```
512
885
 
@@ -514,7 +887,7 @@ PostCSS処理の配列の中に、`enumSpreader({})`関数を差し込みます
514
887
 
515
888
  ```css
516
889
  :root {
517
- --enums-color-gray-100: oklch(0.21 0.01 210);
890
+ --color-red-400: oklch(0.597 0.1692 28.38);
518
891
  }
519
892
  ```
520
893