@cahyo-dimas/freeday 3.9.0 → 3.9.2

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,57 @@ 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.2] - 2026-10-26
13
+
14
+ **Satu setelan aksesibilitas, dan sebuah scrim yang tak terlihat tetapi tetap menangkap tap.**
15
+ Pemilik app ronda melaporkan dua gejala di iPhone 7 yang tampak terpisah: layar tinggal redup
16
+ sesudah drawer ditutup, dan setiap navigasi butuh dua ketukan. Keduanya satu sebab, dan yang
17
+ memecahkannya dua foto dari perangkat yang sama, identik kecuali Reduce Motion.
18
+
19
+ Dengan setelan itu menyala, transisi terhitung melaporkan `opacity 0.000001s` dan backdrop diam di
20
+ `opacity 0` serta `visibility hidden` selama tiga detik, dengan kelas `--nav-open` hadir di setiap
21
+ sampel. Dengan setelan itu mati, deret yang sama berjalan 0.87 lalu 1.00. WebKit memaksa durasi
22
+ transisi ke satu mikrodetik di bawah Reduce Motion, dan pada durasi itu transisinya tidak pernah
23
+ berjalan: propertinya tersangkut di nilai awal. Bukan lambat, tidak pernah mulai.
24
+
25
+ ### Fixed
26
+ - **`.fdy-app__backdrop` dinetralkan di bawah `prefers-reduced-motion`** (`#088`). Aturan yang sama
27
+ mengatur `pointer-events` bersama `opacity`, jadi yang tersangkut bukan sekadar tampilan: foto
28
+ perangkat merekam `pointer-events: auto` berdampingan dengan `visibility: hidden`, yaitu scrim
29
+ tak terlihat yang tetap menangkap tap. Ketukan pertama pengguna hilang di sana dan ketukan kedua
30
+ yang bekerja. Sidebar sudah dinetralkan sejak lama; backdrop terlewat, dan backdrop yang
31
+ menggerbangi interaksi.
32
+ - **`.fdy-chart__tip` ikut dinetralkan.** Bentuk cacat yang sama persis, ditemukan oleh audit yang
33
+ sama: transisi yang juga mengatur `pointer-events`, tanpa pagar reduced-motion. `.fdy-tooltip`
34
+ sudah aman sejak lama.
35
+ - **Penjaga yang mengunci pelajarannya, bukan kasusnya.** Setiap aturan yang mentransisikan
36
+ properti sambil mengatur `pointer-events` wajib punya pasangannya di dalam blok
37
+ `prefers-reduced-motion: reduce`. Statis, seperti penjaga `visibility` di 3.9.1, dan karena
38
+ alasan yang sama: mesin yang bisa melihat cacat ini bukan mesin yang menjalankan uji kit, dan di
39
+ sini bahkan bukan mesin mana pun tanpa setelan aksesibilitas itu menyala.
40
+
41
+ ## [3.9.1] - 2026-10-26
42
+
43
+ **Satu properti yang tidak boleh ditransisikan, dan sebuah HP yang membuktikannya.** Sesudah drawer
44
+ ditutup di iPhone 7, scrim-nya tinggal tercat di atas halaman sampai halaman dimuat ulang. Yang
45
+ membuat ini terbaca bukan tebakan melainkan halaman diagnostik yang mencetak gaya terhitung di
46
+ perangkat itu sendiri: `--nav-open` sudah lepas, sidebar sudah kembali ke luar layar,
47
+ `pointer-events` sudah `none`, dan backdrop tetap melaporkan `opacity=1 visibility=visible`. Empat
48
+ dari lima nilai berubah dengan benar, dan yang tertinggal hanya dua.
49
+
50
+ ### Fixed
51
+ - **`visibility` dijeda, tidak ditransisikan, di `.fdy-app__backdrop`** (`#087`). Mentransisikannya
52
+ sebagai properti beranimasi berdampingan dengan `opacity` membuat Safari kadang tidak pernah
53
+ menjalankan fade yang menyertainya pada arah visible ke hidden, dan elemennya tinggal tercat.
54
+ Tidak selalu, dan ketidakkonsistenan itu yang menunjuk transisi alih-alih keadaan yang salah.
55
+ Polanya kini `visibility 0s linear <durasi>`, yang mengganti nilainya secara diskret: seketika
56
+ saat membuka, sesudah fade selesai saat menutup. Empat aturan, dua di jalur mobile dan dua di
57
+ mode overlay lebar.
58
+ - **Penjaga yang menolak `visibility` berdurasi di mana pun di CSS yang dikirim.** Statis dan bukan
59
+ uji peramban, sebab mesin yang bisa melihat cacat ini bukan mesin yang menjalankan uji kit.
60
+ Chromium menjalankan transisi itu dengan benar, jadi keduaratus enam uji peramban kit tidak akan
61
+ pernah menangkapnya. Bentuk cacat yang sama dengan `#057`, dan ia masuk lewat pintu yang sama.
62
+
12
63
  ## [3.9.0] - 2026-10-23
13
64
 
14
65
  **Rilis ini dimulai sebagai tiga penambahan dan berakhir dengan lima cacat, dan yang menemukan
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.0-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.0)
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)
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.0-0078d4?style=flat-square)](https://github.com/cahyo-dimas/freeday-ui-kit/tree/v3.9.0)
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)
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`.
@@ -1359,8 +1359,8 @@ a { color: var(--color-primary-strong); }
1359
1359
  @media (min-width:721px){
1360
1360
  .fdy-app--nav-overlay .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);box-shadow:var(--shadow-4);transition:transform var(--dur-base) var(--ease-standard);}
1361
1361
  .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
1362
- .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
1363
- .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
1362
+ .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
1363
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
1364
1364
  /* In overlay mode the sidebar is out of flow, so the collapse-to-zero-width rule above must not
1365
1365
  also apply — it would fight the transform for the same panel. */
1366
1366
  .fdy-app--nav-overlay.fdy-app--nav-collapsed .fdy-app__sidebar{width:16rem;border-right-width:var(--bw);}
@@ -1389,18 +1389,34 @@ a { color: var(--color-primary-strong); }
1389
1389
  * out is reloading the page. Reported from a real iPhone X; not reproducible in Chromium
1390
1390
  * with either mouse click or `touchscreen.tap()`, which is why no test in this kit or in
1391
1391
  * the consuming app had ever caught it. */
1392
+ /* `visibility` DITUNDA, tidak ditransisikan. Mentransisikannya sebagai properti beranimasi membuat
1393
+ * Safari kadang tidak pernah menjalankan fade `opacity` yang menyertainya saat visible -> hidden:
1394
+ * kelas sudah lepas, `pointer-events` sudah `none`, sidebar sudah kembali ke luar layar, dan scrim
1395
+ * itu TINGGAL TERCAT di atas halaman sampai halaman dimuat ulang. Diukur di iPhone 7 lewat halaman
1396
+ * diagnostik yang mencetak gaya terhitungnya: `opacity=1 visibility=visible pointer-events=none`
1397
+ * dengan `--nav-open` sudah false. Chromium menjalankannya dengan benar, jadi tak ada uji peramban
1398
+ * di kit ini yang bisa melihatnya; yang menjaganya penjaga bentuk CSS di test/css.test.mjs.
1399
+ * Dengan jeda, `visibility` berganti diskret: seketika saat membuka, sesudah fade saat menutup. */
1392
1400
  .fdy-app__backdrop{display:none;cursor:pointer;}
1393
1401
  @media (max-width:720px){
1394
1402
  .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);transition:transform var(--dur-base) var(--ease-standard);box-shadow:var(--shadow-4);}
1395
1403
  .fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
1396
1404
  /* --color-scrim, not a literal: this was the last raw colour left in a component stylesheet, and
1397
1405
  it also means the drawer behind the nav dims exactly like every other overlay in the kit. */
1398
- .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
1399
- .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
1406
+ .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
1407
+ .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
1400
1408
  .fdy-app__main{padding:var(--space-5);}
1401
1409
  .fdy-app__topbar{padding:0 var(--space-4);}
1402
1410
  }
1403
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}}
1411
+ /* Backdrop ikut dinetralkan, dan ini BUKAN soal selera gerak. WebKit memaksa durasi transisi ke
1412
+ * 0.000001s saat Reduce Motion menyala, dan pada durasi itu transisinya tidak pernah berjalan:
1413
+ * propertinya tersangkut di nilai AWAL selamanya. Diukur di iPhone 7 dengan setelan itu menyala,
1414
+ * tiga detik sesudah drawer terbuka, dengan kelas `--nav-open` SUDAH terpasang di setiap sampel:
1415
+ * `opacity` diam di 0 dan `visibility` diam di `hidden`, sementara `pointer-events` sudah `auto`.
1416
+ * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
1417
+ * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
1418
+ * 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;}}
1404
1420
 
1405
1421
  /* Freeday. App bar (standalone top bar: brand · actions · spacer).
1406
1422
  * Distinct from .fdy-app__topbar (which is bound to the shell grid). Use anywhere;
@@ -2027,6 +2043,12 @@ a { color: var(--color-primary-strong); }
2027
2043
  .fdy-chart-xy__bar{transition:opacity var(--dur-fast) var(--ease-standard);}
2028
2044
  .fdy-chart-xy__band{fill:transparent;cursor:pointer;}
2029
2045
 
2046
+ /* Sama sebabnya dengan `.fdy-app__backdrop`: transisi yang juga menggerbangi `pointer-events` dapat
2047
+ * tersangkut di nilai awal ketika WebKit memaksa durasinya ke nol di bawah Reduce Motion, dan yang
2048
+ * tersisa adalah elemen tak terlihat yang tetap menangkap tap. Tooltip sudah dinetralkan sejak lama
2049
+ * untuk alasan yang sama; tip chart terlewat. */
2050
+ @media (prefers-reduced-motion:reduce){.fdy-chart__tip{transition:none;}}
2051
+
2030
2052
  /* Freeday. Chip (tag / removable filter) */
2031
2053
  .fdy-chip{display:inline-flex;align-items:center;gap:var(--space-2);height:1.75rem;padding:0 var(--space-3);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:var(--weight-medium);color:var(--color-text);background:var(--color-surface-3);border:var(--bw) solid var(--color-border);}
2032
2054
  .fdy-chip--primary{color:var(--color-primary-strong);background:var(--color-primary-soft);border-color:rgba(var(--color-primary-rgb),.22);}
package/dist/freeday.css CHANGED
@@ -182,8 +182,8 @@ a { color: var(--color-primary-strong); }
182
182
  @media (min-width:721px){
183
183
  .fdy-app--nav-overlay .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);box-shadow:var(--shadow-4);transition:transform var(--dur-base) var(--ease-standard);}
184
184
  .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
185
- .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
186
- .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
185
+ .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
186
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
187
187
  /* In overlay mode the sidebar is out of flow, so the collapse-to-zero-width rule above must not
188
188
  also apply — it would fight the transform for the same panel. */
189
189
  .fdy-app--nav-overlay.fdy-app--nav-collapsed .fdy-app__sidebar{width:16rem;border-right-width:var(--bw);}
@@ -212,18 +212,34 @@ a { color: var(--color-primary-strong); }
212
212
  * out is reloading the page. Reported from a real iPhone X; not reproducible in Chromium
213
213
  * with either mouse click or `touchscreen.tap()`, which is why no test in this kit or in
214
214
  * the consuming app had ever caught it. */
215
+ /* `visibility` DITUNDA, tidak ditransisikan. Mentransisikannya sebagai properti beranimasi membuat
216
+ * Safari kadang tidak pernah menjalankan fade `opacity` yang menyertainya saat visible -> hidden:
217
+ * kelas sudah lepas, `pointer-events` sudah `none`, sidebar sudah kembali ke luar layar, dan scrim
218
+ * itu TINGGAL TERCAT di atas halaman sampai halaman dimuat ulang. Diukur di iPhone 7 lewat halaman
219
+ * diagnostik yang mencetak gaya terhitungnya: `opacity=1 visibility=visible pointer-events=none`
220
+ * dengan `--nav-open` sudah false. Chromium menjalankannya dengan benar, jadi tak ada uji peramban
221
+ * di kit ini yang bisa melihatnya; yang menjaganya penjaga bentuk CSS di test/css.test.mjs.
222
+ * Dengan jeda, `visibility` berganti diskret: seketika saat membuka, sesudah fade saat menutup. */
215
223
  .fdy-app__backdrop{display:none;cursor:pointer;}
216
224
  @media (max-width:720px){
217
225
  .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);transition:transform var(--dur-base) var(--ease-standard);box-shadow:var(--shadow-4);}
218
226
  .fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
219
227
  /* --color-scrim, not a literal: this was the last raw colour left in a component stylesheet, and
220
228
  it also means the drawer behind the nav dims exactly like every other overlay in the kit. */
221
- .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
222
- .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
229
+ .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
230
+ .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
223
231
  .fdy-app__main{padding:var(--space-5);}
224
232
  .fdy-app__topbar{padding:0 var(--space-4);}
225
233
  }
226
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}}
234
+ /* Backdrop ikut dinetralkan, dan ini BUKAN soal selera gerak. WebKit memaksa durasi transisi ke
235
+ * 0.000001s saat Reduce Motion menyala, dan pada durasi itu transisinya tidak pernah berjalan:
236
+ * propertinya tersangkut di nilai AWAL selamanya. Diukur di iPhone 7 dengan setelan itu menyala,
237
+ * tiga detik sesudah drawer terbuka, dengan kelas `--nav-open` SUDAH terpasang di setiap sampel:
238
+ * `opacity` diam di 0 dan `visibility` diam di `hidden`, sementara `pointer-events` sudah `auto`.
239
+ * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
240
+ * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
241
+ * 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;}}
227
243
 
228
244
  /* Freeday. App bar (standalone top bar: brand · actions · spacer).
229
245
  * Distinct from .fdy-app__topbar (which is bound to the shell grid). Use anywhere;
@@ -850,6 +866,12 @@ a { color: var(--color-primary-strong); }
850
866
  .fdy-chart-xy__bar{transition:opacity var(--dur-fast) var(--ease-standard);}
851
867
  .fdy-chart-xy__band{fill:transparent;cursor:pointer;}
852
868
 
869
+ /* Sama sebabnya dengan `.fdy-app__backdrop`: transisi yang juga menggerbangi `pointer-events` dapat
870
+ * tersangkut di nilai awal ketika WebKit memaksa durasinya ke nol di bawah Reduce Motion, dan yang
871
+ * tersisa adalah elemen tak terlihat yang tetap menangkap tap. Tooltip sudah dinetralkan sejak lama
872
+ * untuk alasan yang sama; tip chart terlewat. */
873
+ @media (prefers-reduced-motion:reduce){.fdy-chart__tip{transition:none;}}
874
+
853
875
  /* Freeday. Chip (tag / removable filter) */
854
876
  .fdy-chip{display:inline-flex;align-items:center;gap:var(--space-2);height:1.75rem;padding:0 var(--space-3);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:var(--weight-medium);color:var(--color-text);background:var(--color-surface-3);border:var(--bw) solid var(--color-border);}
855
877
  .fdy-chip--primary{color:var(--color-primary-strong);background:var(--color-primary-soft);border-color:rgba(var(--color-primary-rgb),.22);}
@@ -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.0"` (public npm package). `dist/` is
194
+ Lands in `package.json` as `"@cahyo-dimas/freeday": "^3.9.2"` (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.0",
3
+ "version": "3.9.2",
4
4
  "description": "Freeday: token-driven, framework-agnostic UI KIT (design source-of-truth).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -103,8 +103,8 @@
103
103
  @media (min-width:721px){
104
104
  .fdy-app--nav-overlay .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);box-shadow:var(--shadow-4);transition:transform var(--dur-base) var(--ease-standard);}
105
105
  .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
106
- .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
107
- .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
106
+ .fdy-app--nav-overlay .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
107
+ .fdy-app--nav-overlay.fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
108
108
  /* In overlay mode the sidebar is out of flow, so the collapse-to-zero-width rule above must not
109
109
  also apply — it would fight the transform for the same panel. */
110
110
  .fdy-app--nav-overlay.fdy-app--nav-collapsed .fdy-app__sidebar{width:16rem;border-right-width:var(--bw);}
@@ -133,15 +133,31 @@
133
133
  * out is reloading the page. Reported from a real iPhone X; not reproducible in Chromium
134
134
  * with either mouse click or `touchscreen.tap()`, which is why no test in this kit or in
135
135
  * the consuming app had ever caught it. */
136
+ /* `visibility` DITUNDA, tidak ditransisikan. Mentransisikannya sebagai properti beranimasi membuat
137
+ * Safari kadang tidak pernah menjalankan fade `opacity` yang menyertainya saat visible -> hidden:
138
+ * kelas sudah lepas, `pointer-events` sudah `none`, sidebar sudah kembali ke luar layar, dan scrim
139
+ * itu TINGGAL TERCAT di atas halaman sampai halaman dimuat ulang. Diukur di iPhone 7 lewat halaman
140
+ * diagnostik yang mencetak gaya terhitungnya: `opacity=1 visibility=visible pointer-events=none`
141
+ * dengan `--nav-open` sudah false. Chromium menjalankannya dengan benar, jadi tak ada uji peramban
142
+ * di kit ini yang bisa melihatnya; yang menjaganya penjaga bentuk CSS di test/css.test.mjs.
143
+ * Dengan jeda, `visibility` berganti diskret: seketika saat membuka, sesudah fade saat menutup. */
136
144
  .fdy-app__backdrop{display:none;cursor:pointer;}
137
145
  @media (max-width:720px){
138
146
  .fdy-app__sidebar{position:fixed;top:0;left:0;bottom:0;height:100dvh;width:16rem;z-index:60;transform:translateX(-100%);transition:transform var(--dur-base) var(--ease-standard);box-shadow:var(--shadow-4);}
139
147
  .fdy-app--nav-open .fdy-app__sidebar{transform:translateX(0);}
140
148
  /* --color-scrim, not a literal: this was the last raw colour left in a component stylesheet, and
141
149
  it also means the drawer behind the nav dims exactly like every other overlay in the kit. */
142
- .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility var(--dur-base) var(--ease-standard);}
143
- .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;}
150
+ .fdy-app__backdrop{display:block;position:fixed;inset:0;z-index:55;background:var(--color-scrim);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear var(--dur-base);}
151
+ .fdy-app--nav-open .fdy-app__backdrop{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dur-base) var(--ease-standard),visibility 0s linear 0s;}
144
152
  .fdy-app__main{padding:var(--space-5);}
145
153
  .fdy-app__topbar{padding:0 var(--space-4);}
146
154
  }
147
- @media (prefers-reduced-motion:reduce){.fdy-app__sidebar{transition:none;}}
155
+ /* Backdrop ikut dinetralkan, dan ini BUKAN soal selera gerak. WebKit memaksa durasi transisi ke
156
+ * 0.000001s saat Reduce Motion menyala, dan pada durasi itu transisinya tidak pernah berjalan:
157
+ * propertinya tersangkut di nilai AWAL selamanya. Diukur di iPhone 7 dengan setelan itu menyala,
158
+ * tiga detik sesudah drawer terbuka, dengan kelas `--nav-open` SUDAH terpasang di setiap sampel:
159
+ * `opacity` diam di 0 dan `visibility` diam di `hidden`, sementara `pointer-events` sudah `auto`.
160
+ * Scrim yang tak terlihat tetapi menangkap tap, jadi ketukan pertama pengguna hilang dan ketukan
161
+ * kedua yang bekerja. Setelan yang sama dimatikan, deret yang sama berjalan 0.87 lalu 1.00.
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;}}
@@ -53,3 +53,9 @@
53
53
  .fdy-chart-xy__dot{stroke:var(--color-surface);stroke-width:1;}
54
54
  .fdy-chart-xy__bar{transition:opacity var(--dur-fast) var(--ease-standard);}
55
55
  .fdy-chart-xy__band{fill:transparent;cursor:pointer;}
56
+
57
+ /* Sama sebabnya dengan `.fdy-app__backdrop`: transisi yang juga menggerbangi `pointer-events` dapat
58
+ * tersangkut di nilai awal ketika WebKit memaksa durasinya ke nol di bawah Reduce Motion, dan yang
59
+ * tersisa adalah elemen tak terlihat yang tetap menangkap tap. Tooltip sudah dinetralkan sejak lama
60
+ * untuk alasan yang sama; tip chart terlewat. */
61
+ @media (prefers-reduced-motion:reduce){.fdy-chart__tip{transition:none;}}