@cahyo-dimas/freeday 3.9.2 → 3.9.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/CHANGELOG.md CHANGED
@@ -9,6 +9,66 @@ benar. Perubahan seperti itu ditulis di bawah `### Changed: BREAKING (types)`
9
9
  lama → tipe baru, dan cara menyempitkannya — bukan di bawah `### Added`, betapapun aditifnya dari
10
10
  sisi kit.
11
11
 
12
+ ## [3.9.4] - 2026-10-26
13
+
14
+ **Sembilan dari lima puluh enam, dan empat puluh delapan sisanya ranjau.** Tiga rilis berturut-turut
15
+ menambal transisi yang tersangkut di bawah Reduce Motion satu per satu: scrim drawer di 3.9.2, yang
16
+ spesifisitasnya salah dan diperbaiki di 3.9.3, lalu centang checkbox yang dilaporkan dari perangkat
17
+ yang sama. Yang ketiga itu lolos dari penjaga 3.9.3 karena penjaga itu hanya memeriksa transisi yang
18
+ menyentuh `pointer-events`, dan centang checkbox tidak menyentuhnya: ia cuma `transform: scale(0)`
19
+ menjadi `scale(1)`. Inputnya benar-benar tercentang selama ini; centangnya yang tidak pernah
20
+ digambar.
21
+
22
+ Hitungannya yang menghentikan pola menambal: kit mentransisikan sesuatu di 56 selektor dan
23
+ menetralkan 9.
24
+
25
+ ### Fixed
26
+ - **Setiap transisi dinetralkan di bawah `prefers-reduced-motion`** (`#090`), satu aturan di
27
+ `src/base.css` alih-alih daftar yang dipelihara tangan. WebKit menjepit durasi transisi ke
28
+ 0.000001s ketika setelan itu menyala, dan pada durasi itu transisinya tidak pernah berjalan:
29
+ propertinya tersangkut di nilai awal. Akibatnya bukan "kurang halus" melainkan keadaan yang salah
30
+ di layar.
31
+ - **`transition:none`, bukan durasi mungil.** Reset aksesibilitas yang beredar luas memakai
32
+ `transition-duration: 0.01ms` supaya `transitionend` tetap menyala, dan durasi mungil itu persis
33
+ bentuk yang menyangkut di WebKit; reset itu akan memperburuk cacat ini. Satu-satunya yang pernah
34
+ menunggu `transitionend` di kit ini adalah toast, dan ia sudah punya cadangan
35
+ `setTimeout(finish, 400)`.
36
+ - **Animasi sengaja tidak disentuh.** Kit memasangnya lewat `prefers-reduced-motion: no-preference`,
37
+ jadi ia opt-in dan sudah mati di sana, sementara `.fdy-spinner` dan `.fdy-progress` punya
38
+ perlakuan bernuansa sendiri yang memang harus bertahan.
39
+ - **Penjaganya menuntut aturan menyeluruhnya ada**, dan menolak bentuk durasi-mungil. Dua penjaga
40
+ sebelumnya hijau untuk kit yang masih punya ranjau; yang ini tidak bisa, sebab ia tidak
41
+ mendaftar selektor.
42
+
43
+ ## [3.9.3] - 2026-10-26
44
+
45
+ **Perbaikan 3.9.2 tidak pernah bisa bekerja, dan penjaganya hijau untuknya.** Penetralan
46
+ `prefers-reduced-motion` yang dikirim kemarin memakai `.fdy-app__backdrop`, spesifisitas `(0,1,0)`,
47
+ sementara keadaan terbukanya `.fdy-app--nav-open .fdy-app__backdrop` adalah `(0,2,0)` dan juga
48
+ mendeklarasikan transisi. Jadi penetralannya menang saat drawer tertutup dan kalah saat drawer
49
+ terbuka, yaitu satu-satunya saat ia penting. Yang menanam bomnya 3.9.1 sendiri: ia yang menambahkan
50
+ `transition` ke aturan keadaan terbuka.
51
+
52
+ Diukur dengan reduced motion diemulasi, bukan disimpulkan: tertutup melaporkan `none`, terbuka
53
+ melaporkan `opacity 1e-06s cubic-bezier(0.2, 0, 0, 1), visibility 1e-06s linear`.
54
+
55
+ ### Fixed
56
+ - **Keempat selektor yang mendeklarasikan transisi backdrop dinetralkan, bukan yang paling lemah**
57
+ (`#089`). `.fdy-app__backdrop`, keadaan terbukanya, dan kedua padanannya di mode overlay.
58
+ - **Penjaganya menuntut selektor yang SAMA PERSIS**, bukan nama elemennya. Versi pertama hanya
59
+ memeriksa apakah nama itu muncul di suatu tempat di dalam blok reduced-motion, dan itulah
60
+ sebabnya ia hijau untuk perbaikan yang mati. Sekarang spesifisitasnya terjaga oleh konstruksi,
61
+ dan merahnya dibuktikan dengan mengembalikan bentuk 3.9.2: ia menyebut ketiga selektor yang
62
+ hilang dengan nama.
63
+
64
+ ### Catatan: kelas bug ini dapat direproduksi di laptop
65
+ Sepanjang penyelidikan ini dicatat bahwa hanya perangkat sungguhan yang dapat menemukannya. Untuk
66
+ yang satu ini itu tidak benar. Chrome ikut menjepit durasi transisi ke `1e-06s` di bawah
67
+ `emulateMedia({ reducedMotion: 'reduce' })`, jadi cacat spesifisitasnya terukur di mesin mana pun.
68
+ Yang tetap tidak dapat direproduksi di Chromium adalah akibatnya, yakni properti yang tersangkut di
69
+ nilai awal; tetapi kontrak yang mencegahnya, `transition` wajib `none` di kedua keadaan, dapat
70
+ diperiksa di mana saja.
71
+
12
72
  ## [3.9.2] - 2026-10-26
13
73
 
14
74
  **Satu setelan aksesibilitas, dan sebuah scrim yang tak terlihat tetapi tetap menangkap tap.**
package/README.id.md CHANGED
@@ -5,7 +5,7 @@
5
5
  > **Lebih banyak _free day_ buat dev. UI kit-nya sudah siap pakai.**
6
6
 
7
7
  [![Live docs](https://img.shields.io/badge/docs-live-2050d8?style=flat-square)](https://cahyo-dimas.github.io/freeday-ui-kit/)
8
- [![Release](https://img.shields.io/badge/release-v3.9.2-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.2)
8
+ [![Release](https://img.shields.io/badge/release-v3.9.4-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.4)
9
9
 
10
10
  UI KIT yang token-driven & framework-agnostic. Satu sumber kebenaran untuk warna, tipografi,
11
11
  spasi, dan komponen. Blueprint: `docs/superpowers/specs/2026-07-21-freeday-ui-kit-design.md`.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  > **More free days for devs. The UI kit is ready to use.**
6
6
 
7
7
  [![Live docs](https://img.shields.io/badge/docs-live-2050d8?style=flat-square)](https://cahyo-dimas.github.io/freeday-ui-kit/)
8
- [![Release](https://img.shields.io/badge/release-v3.9.2-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.2)
8
+ [![Release](https://img.shields.io/badge/release-v3.9.4-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.4)
9
9
 
10
10
  A token-driven, framework-agnostic UI kit. One source of truth for color, typography,
11
11
  spacing, and components. Blueprint: `docs/superpowers/specs/2026-07-21-freeday-ui-kit-design.md`.
@@ -1217,6 +1217,32 @@ a { color: var(--color-primary-strong); }
1217
1217
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
1218
1218
  }
1219
1219
 
1220
+ /* ===========================================================================
1221
+ * Reduce Motion: SETIAP transisi dinetralkan, bukan daftar yang dipelihara tangan.
1222
+ *
1223
+ * WebKit menjepit durasi transisi ke 0.000001s ketika setelan itu menyala, dan pada durasi itu
1224
+ * transisinya tidak pernah berjalan: propertinya tersangkut di nilai AWAL, selamanya. Akibatnya
1225
+ * bukan "kurang halus" melainkan keadaan yang salah di layar. Terukur di iPhone 7 tiga kali:
1226
+ * scrim drawer yang tinggal gelap sambil tetap menangkap tap, dan centang checkbox yang tak
1227
+ * pernah digambar padahal inputnya benar-benar tercentang.
1228
+ *
1229
+ * Sebelum aturan ini, kit menetralkan sembilan selektor dari lima puluh enam yang mentransisikan
1230
+ * sesuatu. Empat puluh delapan sisanya ranjau yang menunggu, dan tiga sudah meledak di tangan satu
1231
+ * pemilik app. Menambal yang keempat adalah cara kita sampai di sini.
1232
+ *
1233
+ * `transition: none`, BUKAN `transition-duration: 0.01ms` yang biasa beredar sebagai reset
1234
+ * aksesibilitas: durasi mungil itu persis bentuk yang menyangkut di WebKit. Satu-satunya yang
1235
+ * pernah menunggu `transitionend` di kit ini adalah toast, dan ia sudah punya cadangan
1236
+ * `setTimeout(finish, 400)` untuk kasus event itu tak pernah datang.
1237
+ *
1238
+ * ANIMASI sengaja tidak disentuh: kit memasangnya lewat `prefers-reduced-motion: no-preference`,
1239
+ * jadi ia opt-in dan sudah mati di sini, sementara `--spinner` dan `--progress` punya perlakuan
1240
+ * bernuansa sendiri yang memang harus bertahan.
1241
+ * ======================================================================== */
1242
+ @media (prefers-reduced-motion:reduce){
1243
+ *,*::before,*::after{transition:none !important;}
1244
+ }
1245
+
1220
1246
  /* Freeday. Accordion (native <details>/<summary>, zero-JS) */
1221
1247
  /* position:relative, containing block for out-of-flow panel content (see base.css). NOT redundant
1222
1248
  with the panel's reveal animation: that animation gives the panel a transform (which happens to
@@ -1416,7 +1442,19 @@ a { color: var(--color-primary-strong); }
1416
1442
  * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
1417
1443
  * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
1418
1444
  * Sidebar sudah dinetralkan sejak lama; backdrop terlewat, dan ia yang menggerbangi interaksi. */
1419
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}.fdy-app__backdrop{transition:none;}}
1445
+ @media (prefers-reduced-motion:reduce){
1446
+ .fdy-app__sidebar{transition:none;}
1447
+ /* KEEMPAT selektor yang mendeklarasikan transisi backdrop, bukan hanya yang paling lemah.
1448
+ `.fdy-app__backdrop` sendirian berspesifisitas (0,1,0) dan kalah dari keadaan terbukanya,
1449
+ `.fdy-app--nav-open .fdy-app__backdrop` (0,2,0), sehingga penetralan ini diam-diam tidak
1450
+ berlaku justru pada saat drawer terbuka, yaitu satu-satunya saat ia penting. Diukur dengan
1451
+ reduced motion diemulasi: tertutup melaporkan `none`, terbuka melaporkan
1452
+ `opacity 1e-06s, visibility 1e-06s`. */
1453
+ .fdy-app__backdrop,
1454
+ .fdy-app--nav-open .fdy-app__backdrop,
1455
+ .fdy-app--nav-overlay .fdy-app__backdrop,
1456
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{transition:none;}
1457
+ }
1420
1458
 
1421
1459
  /* Freeday. App bar (standalone top bar: brand · actions · spacer).
1422
1460
  * Distinct from .fdy-app__topbar (which is bound to the shell grid). Use anywhere;
package/dist/freeday.css CHANGED
@@ -40,6 +40,32 @@ a { color: var(--color-primary-strong); }
40
40
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
41
41
  }
42
42
 
43
+ /* ===========================================================================
44
+ * Reduce Motion: SETIAP transisi dinetralkan, bukan daftar yang dipelihara tangan.
45
+ *
46
+ * WebKit menjepit durasi transisi ke 0.000001s ketika setelan itu menyala, dan pada durasi itu
47
+ * transisinya tidak pernah berjalan: propertinya tersangkut di nilai AWAL, selamanya. Akibatnya
48
+ * bukan "kurang halus" melainkan keadaan yang salah di layar. Terukur di iPhone 7 tiga kali:
49
+ * scrim drawer yang tinggal gelap sambil tetap menangkap tap, dan centang checkbox yang tak
50
+ * pernah digambar padahal inputnya benar-benar tercentang.
51
+ *
52
+ * Sebelum aturan ini, kit menetralkan sembilan selektor dari lima puluh enam yang mentransisikan
53
+ * sesuatu. Empat puluh delapan sisanya ranjau yang menunggu, dan tiga sudah meledak di tangan satu
54
+ * pemilik app. Menambal yang keempat adalah cara kita sampai di sini.
55
+ *
56
+ * `transition: none`, BUKAN `transition-duration: 0.01ms` yang biasa beredar sebagai reset
57
+ * aksesibilitas: durasi mungil itu persis bentuk yang menyangkut di WebKit. Satu-satunya yang
58
+ * pernah menunggu `transitionend` di kit ini adalah toast, dan ia sudah punya cadangan
59
+ * `setTimeout(finish, 400)` untuk kasus event itu tak pernah datang.
60
+ *
61
+ * ANIMASI sengaja tidak disentuh: kit memasangnya lewat `prefers-reduced-motion: no-preference`,
62
+ * jadi ia opt-in dan sudah mati di sini, sementara `--spinner` dan `--progress` punya perlakuan
63
+ * bernuansa sendiri yang memang harus bertahan.
64
+ * ======================================================================== */
65
+ @media (prefers-reduced-motion:reduce){
66
+ *,*::before,*::after{transition:none !important;}
67
+ }
68
+
43
69
  /* Freeday. Accordion (native <details>/<summary>, zero-JS) */
44
70
  /* position:relative, containing block for out-of-flow panel content (see base.css). NOT redundant
45
71
  with the panel's reveal animation: that animation gives the panel a transform (which happens to
@@ -239,7 +265,19 @@ a { color: var(--color-primary-strong); }
239
265
  * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
240
266
  * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
241
267
  * Sidebar sudah dinetralkan sejak lama; backdrop terlewat, dan ia yang menggerbangi interaksi. */
242
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}.fdy-app__backdrop{transition:none;}}
268
+ @media (prefers-reduced-motion:reduce){
269
+ .fdy-app__sidebar{transition:none;}
270
+ /* KEEMPAT selektor yang mendeklarasikan transisi backdrop, bukan hanya yang paling lemah.
271
+ `.fdy-app__backdrop` sendirian berspesifisitas (0,1,0) dan kalah dari keadaan terbukanya,
272
+ `.fdy-app--nav-open .fdy-app__backdrop` (0,2,0), sehingga penetralan ini diam-diam tidak
273
+ berlaku justru pada saat drawer terbuka, yaitu satu-satunya saat ia penting. Diukur dengan
274
+ reduced motion diemulasi: tertutup melaporkan `none`, terbuka melaporkan
275
+ `opacity 1e-06s, visibility 1e-06s`. */
276
+ .fdy-app__backdrop,
277
+ .fdy-app--nav-open .fdy-app__backdrop,
278
+ .fdy-app--nav-overlay .fdy-app__backdrop,
279
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{transition:none;}
280
+ }
243
281
 
244
282
  /* Freeday. App bar (standalone top bar: brand · actions · spacer).
245
283
  * Distinct from .fdy-app__topbar (which is bound to the shell grid). Use anywhere;
@@ -191,7 +191,7 @@ live docs also have a copy button per component.
191
191
  ```bash
192
192
  npm i @cahyo-dimas/freeday
193
193
  ```
194
- Lands in `package.json` as `"@cahyo-dimas/freeday": "^3.9.2"` (public npm package). `dist/` is
194
+ Lands in `package.json` as `"@cahyo-dimas/freeday": "^3.9.4"` (public npm package). `dist/` is
195
195
  committed and published → no build step; `npm ci` runs without auth.
196
196
 
197
197
  ### 2. Import the CSS + enhancers **once** in your entry (`src/main.ts`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cahyo-dimas/freeday",
3
- "version": "3.9.2",
3
+ "version": "3.9.4",
4
4
  "description": "Freeday: token-driven, framework-agnostic UI KIT (design source-of-truth).",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/base.css CHANGED
@@ -38,3 +38,29 @@ a { color: var(--color-primary-strong); }
38
38
  @media (prefers-reduced-motion: reduce) {
39
39
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
40
40
  }
41
+
42
+ /* ===========================================================================
43
+ * Reduce Motion: SETIAP transisi dinetralkan, bukan daftar yang dipelihara tangan.
44
+ *
45
+ * WebKit menjepit durasi transisi ke 0.000001s ketika setelan itu menyala, dan pada durasi itu
46
+ * transisinya tidak pernah berjalan: propertinya tersangkut di nilai AWAL, selamanya. Akibatnya
47
+ * bukan "kurang halus" melainkan keadaan yang salah di layar. Terukur di iPhone 7 tiga kali:
48
+ * scrim drawer yang tinggal gelap sambil tetap menangkap tap, dan centang checkbox yang tak
49
+ * pernah digambar padahal inputnya benar-benar tercentang.
50
+ *
51
+ * Sebelum aturan ini, kit menetralkan sembilan selektor dari lima puluh enam yang mentransisikan
52
+ * sesuatu. Empat puluh delapan sisanya ranjau yang menunggu, dan tiga sudah meledak di tangan satu
53
+ * pemilik app. Menambal yang keempat adalah cara kita sampai di sini.
54
+ *
55
+ * `transition: none`, BUKAN `transition-duration: 0.01ms` yang biasa beredar sebagai reset
56
+ * aksesibilitas: durasi mungil itu persis bentuk yang menyangkut di WebKit. Satu-satunya yang
57
+ * pernah menunggu `transitionend` di kit ini adalah toast, dan ia sudah punya cadangan
58
+ * `setTimeout(finish, 400)` untuk kasus event itu tak pernah datang.
59
+ *
60
+ * ANIMASI sengaja tidak disentuh: kit memasangnya lewat `prefers-reduced-motion: no-preference`,
61
+ * jadi ia opt-in dan sudah mati di sini, sementara `--spinner` dan `--progress` punya perlakuan
62
+ * bernuansa sendiri yang memang harus bertahan.
63
+ * ======================================================================== */
64
+ @media (prefers-reduced-motion:reduce){
65
+ *,*::before,*::after{transition:none !important;}
66
+ }
@@ -160,4 +160,16 @@
160
160
  * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
161
161
  * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
162
162
  * Sidebar sudah dinetralkan sejak lama; backdrop terlewat, dan ia yang menggerbangi interaksi. */
163
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}.fdy-app__backdrop{transition:none;}}
163
+ @media (prefers-reduced-motion:reduce){
164
+ .fdy-app__sidebar{transition:none;}
165
+ /* KEEMPAT selektor yang mendeklarasikan transisi backdrop, bukan hanya yang paling lemah.
166
+ `.fdy-app__backdrop` sendirian berspesifisitas (0,1,0) dan kalah dari keadaan terbukanya,
167
+ `.fdy-app--nav-open .fdy-app__backdrop` (0,2,0), sehingga penetralan ini diam-diam tidak
168
+ berlaku justru pada saat drawer terbuka, yaitu satu-satunya saat ia penting. Diukur dengan
169
+ reduced motion diemulasi: tertutup melaporkan `none`, terbuka melaporkan
170
+ `opacity 1e-06s, visibility 1e-06s`. */
171
+ .fdy-app__backdrop,
172
+ .fdy-app--nav-open .fdy-app__backdrop,
173
+ .fdy-app--nav-overlay .fdy-app__backdrop,
174
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{transition:none;}
175
+ }