@cahyo-dimas/freeday 1.7.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.
Files changed (130) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/LICENSE +21 -0
  3. package/README.md +205 -0
  4. package/adapters/blazor/freeday-blazor.js +79 -0
  5. package/adapters/react/components/FdyAutocomplete.tsx +159 -0
  6. package/adapters/react/components/FdyCascade.tsx +230 -0
  7. package/adapters/react/components/FdyCfl.tsx +362 -0
  8. package/adapters/react/components/FdyChart.tsx +69 -0
  9. package/adapters/react/components/FdyCombo.tsx +166 -0
  10. package/adapters/react/components/FdyDateRange.tsx +66 -0
  11. package/adapters/react/components/FdyDatepicker.tsx +354 -0
  12. package/adapters/react/index.d.ts +37 -0
  13. package/adapters/react/index.js +9 -0
  14. package/adapters/react/tsconfig.json +14 -0
  15. package/adapters/react/useFreeday.js +44 -0
  16. package/adapters/react/usePopover.ts +64 -0
  17. package/adapters/vue/components/FdyAutocomplete.vue +174 -0
  18. package/adapters/vue/components/FdyCascade.vue +241 -0
  19. package/adapters/vue/components/FdyCfl.vue +354 -0
  20. package/adapters/vue/components/FdyChart.vue +89 -0
  21. package/adapters/vue/components/FdyCombo.vue +232 -0
  22. package/adapters/vue/components/FdyDateRange.vue +78 -0
  23. package/adapters/vue/components/FdyDatepicker.vue +333 -0
  24. package/adapters/vue/index.d.ts +44 -0
  25. package/adapters/vue/index.js +8 -0
  26. package/adapters/vue/useFreeday.js +44 -0
  27. package/adapters/vue/usePopover.ts +78 -0
  28. package/dist/freeday-autocomplete.js +135 -0
  29. package/dist/freeday-breakpoint.js +51 -0
  30. package/dist/freeday-carousel.js +111 -0
  31. package/dist/freeday-cascade.js +256 -0
  32. package/dist/freeday-cfl.js +213 -0
  33. package/dist/freeday-chart.js +403 -0
  34. package/dist/freeday-chip.js +83 -0
  35. package/dist/freeday-datepicker.js +321 -0
  36. package/dist/freeday-datetime.js +59 -0
  37. package/dist/freeday-drawer.js +43 -0
  38. package/dist/freeday-form.js +181 -0
  39. package/dist/freeday-mask.js +114 -0
  40. package/dist/freeday-menu.js +93 -0
  41. package/dist/freeday-popover.js +69 -0
  42. package/dist/freeday-rating.js +50 -0
  43. package/dist/freeday-select.js +194 -0
  44. package/dist/freeday-slider.js +34 -0
  45. package/dist/freeday-stepper.js +90 -0
  46. package/dist/freeday-table.js +475 -0
  47. package/dist/freeday-tabs.js +68 -0
  48. package/dist/freeday-timepicker.js +180 -0
  49. package/dist/freeday-toast.js +84 -0
  50. package/dist/freeday-tree.js +94 -0
  51. package/dist/freeday-upload.js +206 -0
  52. package/dist/freeday.bundle.css +1352 -0
  53. package/dist/freeday.css +1007 -0
  54. package/dist/freeday.js +3632 -0
  55. package/dist/freeday.tokens.css +343 -0
  56. package/package.json +72 -0
  57. package/src/base.css +20 -0
  58. package/src/components/.gitkeep +0 -0
  59. package/src/components/accordion.css +13 -0
  60. package/src/components/alert.css +18 -0
  61. package/src/components/app-shell.css +88 -0
  62. package/src/components/appbar.css +15 -0
  63. package/src/components/autocomplete.css +12 -0
  64. package/src/components/avatar.css +8 -0
  65. package/src/components/badge.css +27 -0
  66. package/src/components/breadcrumb.css +9 -0
  67. package/src/components/breakpoints.css +15 -0
  68. package/src/components/button.css +58 -0
  69. package/src/components/card.css +9 -0
  70. package/src/components/carousel.css +17 -0
  71. package/src/components/cascade.css +36 -0
  72. package/src/components/cfl.css +28 -0
  73. package/src/components/chart.css +55 -0
  74. package/src/components/chip.css +18 -0
  75. package/src/components/combo.css +27 -0
  76. package/src/components/datepicker.css +44 -0
  77. package/src/components/datetimepicker.css +8 -0
  78. package/src/components/description-list.css +6 -0
  79. package/src/components/divider.css +3 -0
  80. package/src/components/drawer.css +25 -0
  81. package/src/components/file-upload.css +34 -0
  82. package/src/components/filterbar.css +25 -0
  83. package/src/components/form-grid.css +8 -0
  84. package/src/components/input-group.css +22 -0
  85. package/src/components/input.css +13 -0
  86. package/src/components/kbd.css +2 -0
  87. package/src/components/menu.css +28 -0
  88. package/src/components/modal.css +22 -0
  89. package/src/components/pagination.css +8 -0
  90. package/src/components/progress.css +7 -0
  91. package/src/components/rating.css +10 -0
  92. package/src/components/selection.css +25 -0
  93. package/src/components/skeleton.css +7 -0
  94. package/src/components/slider.css +12 -0
  95. package/src/components/spinner.css +6 -0
  96. package/src/components/states.css +8 -0
  97. package/src/components/stepper.css +21 -0
  98. package/src/components/table.css +55 -0
  99. package/src/components/tabs.css +10 -0
  100. package/src/components/timeline.css +12 -0
  101. package/src/components/timepicker.css +22 -0
  102. package/src/components/toast.css +17 -0
  103. package/src/components/tooltip.css +6 -0
  104. package/src/components/tree.css +21 -0
  105. package/src/freeday-autocomplete.js +135 -0
  106. package/src/freeday-breakpoint.js +51 -0
  107. package/src/freeday-carousel.js +111 -0
  108. package/src/freeday-cascade.js +256 -0
  109. package/src/freeday-cfl.js +213 -0
  110. package/src/freeday-chart.js +403 -0
  111. package/src/freeday-chip.js +83 -0
  112. package/src/freeday-datepicker.js +321 -0
  113. package/src/freeday-datetime.js +59 -0
  114. package/src/freeday-drawer.js +43 -0
  115. package/src/freeday-form.js +181 -0
  116. package/src/freeday-mask.js +114 -0
  117. package/src/freeday-menu.js +93 -0
  118. package/src/freeday-popover.js +69 -0
  119. package/src/freeday-rating.js +50 -0
  120. package/src/freeday-select.js +194 -0
  121. package/src/freeday-slider.js +34 -0
  122. package/src/freeday-stepper.js +90 -0
  123. package/src/freeday-table.js +475 -0
  124. package/src/freeday-tabs.js +68 -0
  125. package/src/freeday-timepicker.js +180 -0
  126. package/src/freeday-toast.js +84 -0
  127. package/src/freeday-tree.js +94 -0
  128. package/src/freeday-upload.js +206 -0
  129. package/tokens/breakpoints.mjs +4 -0
  130. package/tokens/tokens.json +123 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,447 @@
1
+ # Changelog
2
+
3
+ Semua perubahan penting dicatat di sini. Format longgar mengikuti
4
+ [Keep a Changelog](https://keepachangelog.com/); tiap versi = git tag.
5
+
6
+ ## [1.7.0] — 2026-07-24
7
+ Rilis **1.7 — tree checkbox, form-grid, & tiga section docs full-width**. Non-breaking, aditif.
8
+
9
+ ### Added
10
+ - **Tree checkbox (cascading) — `freeday-tree.js` + `.fdy-tree--checkbox`.** Varian tree yang
11
+ bisa dipilih: centang cabang → semua anak ikut; sebagian anak → cabang jadi native
12
+ `:indeterminate`. Checkbox = `<input class="fdy-checkbox">` native (Space toggle, nama lewat
13
+ `aria-label`); klik checkbox `stopPropagation` sehingga memilih **tak pernah** membuka/menutup
14
+ cabang, sedangkan teks summary tetap toggle `<details>`. Opt-in via `data-fdy-tree`; init
15
+ post-order menghitung state cabang dari leaf yang sudah tercentang saat load. Zero-dependency,
16
+ `window.FreedayTree`. Tree dasar tetap tanpa JS.
17
+ - **`.fdy-form-grid` — layout header/dokumen.** Pelengkap dua-dimensi dari stack `.fdy-field`
18
+ satu kolom dan baris `.fdy-filterbar`: field tersusun di kolom yang rapi (`auto-fit`, reflow ke
19
+ satu kolom di layar sempit); `.fdy-field--full` membentang penuh (mis. alamat). Zero JS — murni
20
+ layout di atas `.fdy-field`.
21
+ - **File upload — layout melebar.** Modifier `.fdy-dropzone--row` (ikon di samping teks, bukan
22
+ bertumpuk) dan `.fdy-filelist--grid` (baris file berdampingan di layar lebar).
23
+
24
+ ### Changed
25
+ - **Docs — tiga section jadi full-width & selaras.** Tree (kini menampilkan varian dasar +
26
+ checkbox berdampingan), Form (validasi inline + contoh **header + detail**: `.fdy-form-grid` +
27
+ tabel item), dan File upload semuanya melebar mengisi kolom konten agar lebar semua section rata.
28
+ Terverifikasi lewat gestur mouse asli (headless CDP `Input.dispatchMouseEvent`): cascade
29
+ centang/indeterminate, checkbox tak melipat cabang, teks summary tetap toggle.
30
+
31
+ ## [1.6.2] — 2026-07-24
32
+ Rilis **patch — lisensi**. Tak ada perubahan kode.
33
+
34
+ ### Changed
35
+ - **Lisensi jadi [MIT](LICENSE)** (`Copyright (c) 2026 Cahyo D. Kurnianto`). Sebelumnya
36
+ `"license": "UNLICENSED"` tanpa file `LICENSE` — di repo publik itu berarti *all rights
37
+ reserved*, jadi tak ada yang boleh memakainya secara legal. Sekarang bebas dipakai/ubah/
38
+ distribusi asal menyertakan copyright. `package.json`/`package-lock.json` → `"MIT"`, tambah
39
+ file `LICENSE`, catat di README + footer docs. `"private": true` dipertahankan (pengaman
40
+ anti-`npm publish`, tak terkait lisensi).
41
+
42
+ ## [1.6.1] — 2026-07-24
43
+ Rilis **patch — perbaikan bug pemilihan combo dengan mouse**. Non-breaking.
44
+
45
+ ### Fixed
46
+ - **`freeday-select.js` (combo/select vanilla) — memilih opsi dengan mouse tidak berfungsi.**
47
+ Menekan (mousedown) sebuah opsi mem-blur tombol combo; handler `focusout` lalu memanggil
48
+ `close()` yang menyembunyikan listbox **sebelum** event `click` opsi sempat menjalankan
49
+ `choose()` — sehingga pilihan hilang dan nilai tak berubah (hanya terlihat dengan mouse asli;
50
+ navigasi keyboard tak terpengaruh). Perbaikan: `preventDefault` pada `mousedown` listbox agar
51
+ tombol tetap fokus, jadi `click` mendarat normal. Terverifikasi lewat gestur mouse asli
52
+ (headless CDP `Input.dispatchMouseEvent`) pada playground docs dan section Select. Memengaruhi
53
+ konsumen vanilla `freeday/js`; adapter Vue/React punya implementasi sendiri dan tak terdampak.
54
+
55
+ ## [1.6.0] — 2026-07-24
56
+ Rilis **1.6 — wrapper input ekstra (Vue + React) + filter-bar**. Non-breaking, aditif.
57
+
58
+ ### Added
59
+ - **`FdyDateRange` (Vue + React)** — rentang tanggal terkontrol `{start, end}` yang menyusun dua
60
+ `FdyDatepicker` di atas layout `.fdy-daterange` yang sudah ada (akhir tak bisa mendahului awal,
61
+ lewat min/max saling terkait). `v-model` di Vue, `value`/`onChange` di React. Tanpa CSS baru.
62
+ - **`FdyAutocomplete` (Vue + React)** — editable combobox WAI-ARIA APG terkontrol, port dari
63
+ enhancer `freeday-autocomplete.js` di atas CSS `.fdy-autocomplete` yang sama: filter saat
64
+ mengetik (substring case-insensitive pada query ter-trim), ↑/↓ dengan wrap, Enter commit,
65
+ Esc/Tab/klik-luar menutup, `aria-activedescendant` + empty state, dropdown top-layer via
66
+ Popover API. `onSelect`/`select` hanya saat commit — terpisah dari perubahan ketikan, jadi
67
+ options yang sudah difilter server bisa dilempar masuk apa adanya.
68
+ - **`FdyCascade` (Vue + React)** — picker hierarkis drill-down terkontrol, port dari enhancer
69
+ `freeday-cascade.js` di atas CSS `.fdy-cascade` yang sama: satu level sekaligus, branch masuk,
70
+ kontrol back naik, leaf memilih (value = value leaf, tampilan = path penuh), buka ulang di level
71
+ terpilih. Keyboard: Up/Down/Home/End, ArrowRight/Enter/Space aktifkan, ArrowLeft/Backspace naik,
72
+ Esc tutup; `aria-activedescendant` + crumb live. Model data = **pohon `CascadeNode` bertipe**,
73
+ menggantikan `<ul>` bersarang tersembunyi milik enhancer.
74
+ - **`.fdy-filterbar`** — layout primitive untuk baris filter yang konsisten, di atas `.fdy-field`:
75
+ ritme lebar kolom (`--w-sm` / default / `--w-lg` / `--w-xl`), satu field `--w-grow` menyerap sisa
76
+ ruang, `__actions` menempel di ujung sejajar kontrol, wrap rapi di layar sempit. Nol JS.
77
+ Menutup gap "filter row ragged" dari adoption backlog #11.
78
+
79
+ ### Changed
80
+ - Contoh `react-faktur` kini menggerakkan **Kategori** lewat `FdyCascade` — menghapus jembatan
81
+ event `fdy-cascade-change` manual; ditambah field Periode (`FdyDateRange`) & Kota (`FdyAutocomplete`).
82
+ - Contoh `vue-faktur` mendapat demo Vue-native untuk ketiga komponen baru.
83
+
84
+ Dengan rilis ini adapter **Vue dan React simetris penuh** — tujuh komponen controlled typed yang
85
+ sama di kedua sisi: `FdyCombo` · `FdyDatepicker` · `FdyDateRange` · `FdyAutocomplete` ·
86
+ `FdyCascade` · `FdyCfl` · `FdyChart`.
87
+
88
+ ## [1.5.0] — 2026-07-24
89
+ Rilis **1.5 — React adapter parity**. Non-breaking, aditif.
90
+ ### Added
91
+ - **React adapter parity** — komponen controlled typed `FdyCombo` / `FdyDatepicker` / `FdyCfl` /
92
+ `FdyChart` + `usePopover`, di atas CSS kit yang sama (aksesibilitas WAI-ARIA APG, dropdown
93
+ top-layer lewat Popover API). Aplikasi React tak lagi butuh fallback `<select>`/`<input
94
+ type="date">` native. Dikonsumsi lewat `freeday/react`; Vite men-transpile source component
95
+ langsung tanpa config tambahan, konsumen Next.js mungkin butuh
96
+ `transpilePackages: ['freeday']`.
97
+
98
+ ## [1.4.1] — 2026-07-23
99
+ Rilis **1.4.1 — patch**. Dropdown tak lagi ter-clip di dalam card / scroll container.
100
+ ### Fixed
101
+ - **Dropdown lepas dari clipping ancestor** (`.fdy-card{overflow:hidden}`, scroll container, atau
102
+ ancestor ber-`transform`). Semua dropdown `position:absolute` — **combo/select, datepicker,
103
+ cascade, autocomplete, timepicker, menu** — kini di-render di **top layer** lewat native
104
+ **Popover API** (`popover="manual"`) dan diposisikan `fixed` ke trigger (flip ke atas bila
105
+ sempit di bawah, lebar mengikuti trigger, reposisi saat scroll/resize). Panel tetap DOM child
106
+ komponennya, jadi focus, outside-click, dan ARIA tak berubah. Berlaku untuk enhancer vanilla
107
+ **dan** komponen Vue `FdyCombo`/`FdyDatepicker`. `FdyCfl` sudah aman (berbasis `<dialog>`).
108
+ Degradasi mulus ke perilaku lama pada browser tanpa Popover API. Non-breaking, tanpa perubahan API.
109
+ ### Internal
110
+ - Helper baru `src/freeday-popover.js` (`window.FreedayPopover`) + composable `usePopover` di
111
+ `freeday/vue` (internal, tak diekspor). Panel dropdown kini set `color:var(--color-text)` eksplisit
112
+ (UA `[popover]` default-nya `CanvasText`).
113
+
114
+ ## [1.4.0] — 2026-07-23
115
+ Rilis **1.4 — motion & native charts**. Dua fitur besar (gerak enter/exit lintas komponen +
116
+ chart native yang cukup untuk mem-pensiun-kan Chart.js) plus satu fix layout. Non-breaking.
117
+
118
+ ### Added
119
+ - **Chart native — parity untuk drop Chart.js.** Tipe baru **`line`** & **`area`** dan **`bar`
120
+ multi-seri + `data-fdy-stacked`**, semuanya dengan **sumbu ber-tema** (y-gridline + tick,
121
+ x-label autoskip, baseline nol) dari `--chart-grid`/`--chart-tick`. Data multi-seri lewat
122
+ **`data-series`** (JSON `[{label,values}]`); `data-values` tetap jadi shortcut seri-tunggal.
123
+ **`data-fdy-format="number|percent|currency"`** memformat tick + tooltip; **legenda otomatis**
124
+ untuk ≥2 seri (`data-fdy-legend="auto|always|none"`); hover band per-kategori. Warna dari token
125
+ → **chart re-warna otomatis saat `data-theme` berubah** (tak perlu observer/re-paint kanvas).
126
+ - **`FreedayChart.update(el)`** — render ulang idempoten saat data berubah (auto-init tetap sekali).
127
+ - **`freeday/vue` → `<FdyChart>`** — wrapper reaktif & typed di atas renderer (re-render on prop
128
+ change): `type` · `series`/`values` · `labels` · `format` · `stacked` · `legend` · `colors`/`color`
129
+ · `center`; `aria-label` fallthrough. Tipe `FdyChartSeries` diekspor. Diverifikasi `vue-tsc` + `vite build`.
130
+
131
+ ### Changed
132
+ - **Motion pass — gerak yang bermakna, semua hormati `prefers-reduced-motion`.**
133
+ - **Drawer & Modal** kini beranimasi **masuk _dan_ keluar** (slide / fade-scale + backdrop blur)
134
+ via `@starting-style` + `allow-discrete` pada `<dialog>` native — sebelumnya hanya masuk.
135
+ - **Sidebar app-shell** collapse/expand desktop kini **meluncur** (animasi `width`) — sebelumnya
136
+ `display:none` (snap). Mobile (off-canvas) tak berubah.
137
+ - **Accordion** & **Tabs** me-reveal konten (fade + rise) saat dibuka/diganti.
138
+ - **Baris tabel** transisi `background` halus saat hover.
139
+ - **`.fdy-daterange` responsif** — dua picker kini boleh menyusut (`min-width:0`) & wrap, jadi tak
140
+ lagi overflow di row/HP < ~23rem; di lebar cukup tetap hug ~23rem seperti sebelumnya.
141
+
142
+ ### Migrasi konsumen (opsional, aman)
143
+ 1. Bump pin: `npm i github:cahyo-dimas/freeday-ui-kit#v1.4.0`, lalu rebuild.
144
+ 2. **Motion & daterange:** otomatis, tanpa perubahan kode.
145
+ 3. **Drop Chart.js (opsional):** ganti wrapper chart lokal dengan `<FdyChart type="line" :series>`
146
+ (atau bentuk `data-fdy-chart`), hapus folder wrapper chart lokal, dan buang `chart.js` dari
147
+ `package.json`. Machinery tema chart (probe warna + observer) tak lagi perlu — token yang urus.
148
+
149
+ ## [1.3.1] — 2026-07-23
150
+ Rilis **1.3.1 — patch**. Buang rail aksen "eyebrow" di state aktif/terpilih.
151
+ ### Removed
152
+ - **Rail aksen 3px pada state aktif/terpilih** (`box-shadow:inset 3px 0 0 var(--color-primary)`)
153
+ dihapus dari nav app-shell (`[aria-current="page"]`), opsi cascade & autocomplete
154
+ (`[aria-selected="true"]`), dan baris tabel terpilih. State terpilih tetap jelas & aksesibel
155
+ lewat background `--color-primary-soft` + teks `--color-primary-strong` + semibold (tabel:
156
+ soft-bg satu baris penuh). Murni visual, non-breaking; kontras tetap **9/9**.
157
+ ### Kept
158
+ - Indikator fungsional yang **beda motif** sengaja dipertahankan: rail fokus keyboard CFL
159
+ (`:focus-visible`, wajib a11y — pembeda fokus vs terpilih), underline tab aktif, checkmark
160
+ combo, ring highlight combo.
161
+
162
+ ## [1.3.0] — 2026-07-23
163
+ Rilis **1.3 — accent Azure**. Warna sekunder/aksen berubah dari **teal → biru Microsoft Azure**.
164
+ ### Changed
165
+ - **Accent: teal → sky / Azure blue** — `--color-accent` kini `#0078d4` (light) / `#47a1e6` (dark),
166
+ menggantikan teal `#0d9488`. Ramp primitif `teal` diganti `sky` (biru Azure muda);
167
+ `--color-accent-hover` & `--color-on-accent` ikut disesuaikan (on-accent dark `#06233f` agar
168
+ kontras di atas accent biru-muda dark). Semua konsumen `--color-accent` ikut otomatis: varian
169
+ opt-in `.fdy-fab--accent`/`.fdy-slider--accent`/`.fdy-badge-ov--accent`, chrome docs, swatch
170
+ identitas. Identitas kit kini **Azure** (primary biru-deep + accent biru-muda) — teal dibuang.
171
+ Kontras WCAG tetap **9/9** (accent/surface + on-accent/accent lolos light & dark). Non-breaking
172
+ (nilai token berubah; nama token/kelas/API tetap).
173
+
174
+ ## [1.2.2] — 2026-07-23
175
+ Rilis **1.2.2 — patch**. Polish app-shell + koreksi warna indikator aktif/terpilih.
176
+ ### Fixed
177
+ - **Brand link-safe (#17)** — `.fdy-app__brand` kini set `text-decoration:none`; saat brand
178
+ dijadikan link "logo → home", judul/subjudul tak lagi ber-underline default browser.
179
+ - **Indikator aktif/terpilih: teal → primary (#18 + extend)** — bar/underline/check pada state
180
+ aktif/terpilih sebelumnya pakai `--color-accent` (teal), yang **clash** dengan bg
181
+ `--color-primary-soft` + teks `--color-primary-strong` pada palet re-theme (accent ≠ primary).
182
+ Kini semua cue "you-are-here / terpilih" seragam di keluarga **primary**: item nav, underline
183
+ tab, rail baris tabel, opsi combo/cascade/autocomplete. Varian aksen opt-in
184
+ (`.fdy-fab--accent`, `.fdy-badge-ov--accent`, `.fdy-slider--accent`) tak berubah. Membalik
185
+ bagian "teal sebagai aksen fungsional" dari v1.1.0. Murni CSS, backward-compatible.
186
+
187
+ ## [1.2.1] — 2026-07-23
188
+ Rilis **1.2.1 — patch**. Perbaikan CSS ikon depan `.fdy-input-group`.
189
+ ### Fixed
190
+ - **Ikon depan input-group tak ke-center + gap** — `.fdy-input-group__addon--icon` dipakai
191
+ standalone tapi tak set `display`/`align-items`, jadi `<svg>`-nya nempel ke atas kotak flex
192
+ yang ter-stretch (ikon melayang tinggi); dan padding-kiri ikon menumpuk dengan padding-kiri
193
+ `.fdy-input` → gap lebar. Kini `--icon` self-contained (`inline-flex` + center, meniru
194
+ `.fdy-input-group__btn`) dan `.fdy-input` setelah ikon memangkas padding-kirinya. Murni CSS,
195
+ backward-compatible. Kena semua field search/find (topbar search, filter tabel, dialog CFL, dst).
196
+
197
+ ## [1.2.0] — 2026-07-23
198
+ Rilis **1.2 — Vue input wrappers (native reimpl)**. Komponen Vue idiomatik dengan `v-model`
199
+ nyata di atas class CSS kit, supaya form Vue tak perlu fallback ke `<select>`/`<input type=date>`
200
+ native. **Non-breaking**: murni tambahan (file `.vue` + export baru); enhancer, `useFreeday`,
201
+ dan semua class/token lama tak berubah. `vue` tetap peerDependency opsional.
202
+ ### Added
203
+ - **`FdyCombo`** (`import { FdyCombo } from 'freeday/vue'`) — combobox select-only WAI-ARIA APG
204
+ dengan `v-model` (generic `T extends string`), keyboard penuh (↑↓/Home/End/Enter/Esc/typeahead)
205
+ + outside-click; props `options`/`placeholder`/`disabled`/`invalid`/`describedby`/`ariaLabelledby`.
206
+ - **`FdyDatepicker`** — kalender native di atas `datepicker.css`; `v-model` string ISO
207
+ `YYYY-MM-DD`, `min`/`max`, `locale` (Intl), keyboard grid penuh, `invalid`/`ariaLabelledby`.
208
+ - **`FdyCfl`** — choose-from-list **controlled + async**: `v-model:Row|null` +
209
+ `fetchPage(query,page) => Promise<{rows,hasMore}>`, `columns`/`display`/`rowKey`. `<dialog>`
210
+ native, search debounced, state loading/empty/error(+retry), pagination append, cache opsional,
211
+ guard respons out-of-order. Ini kontrak integrasi field lookup (map nilai → master data server).
212
+ - **Error-state kit** — varian `--error`/`[aria-invalid]` ditambah ke `combo`/`cascade`/
213
+ `datepicker`/`timepicker`, dan `input-group :has()` diperluas menangkap error kontrol — jadi
214
+ validasi vanilla (`freeday-form`) **dan** prop `invalid` wrapper Vue sama-sama ber-styling.
215
+ (Field CFL = `.fdy-input`+input-group, jadi error-nya via `aria-invalid` pada input, bukan
216
+ kelas `.fdy-cfl--error`.)
217
+ ### Notes
218
+ - Komponen Vue di-ship sebagai `.vue` mentah (bundler konsumen yang meng-compile); type-check
219
+ butuh `vue-tsc`/Volar, bukan `tsc` polos. Install: `npm i github:cahyo-dimas/freeday-ui-kit#v1.2.0`.
220
+ - QA interaksi runtime (klik/keyboard di browser) = tanggung jawab konsumen; komponen
221
+ terverifikasi type-check + build (`vue-tsc --noEmit` + `vite build`) + review kode.
222
+ - Follow-up diketahui (warisan datepicker, non-blocking): grid `role="grid"` datar tanpa `row`;
223
+ hari fokus-awal yang ter-`min`/`max`-disable bisa bikin grid tak ter-fokus keyboard di config tepi.
224
+
225
+ ## [1.1.0] — 2026-07-23
226
+ Rilis **1.1 — "Precision" visual polish + pengerasan adopsi**. Dua bagian: **(1) penyegaran
227
+ visual** token-driven — radius lebih tajam, elevation overlay lebih tegas, hierarki tipografi
228
+ heading lebih jelas, teal (`--color-accent`) sebagai indikator fungsional non-teks untuk state
229
+ aktif/terpilih; **(2) pengerasan adopsi** dari pemakaian project nyata — palet chart tervalidasi,
230
+ ukuran modal, nav statis, brand shell, export breakpoint, drawer `initAll`, dan tokenisasi kontrol.
231
+ **Non-breaking**: tak ada rename kelas/token/API (`fdy-` prefix, `--color-*`,
232
+ `window.Freeday*` tetap stabil). **AA-gated**: `npm test` tetap hijau (9/9), termasuk 6
233
+ assertion kontras baru yang menjaga teal-on-surface ≥3:1 di light & dark.
234
+ ### Changed
235
+ - **Radius ramp lebih tajam** — skala dirapatkan ke `3/4/6/10/14/999px` (dari nilai lama yang
236
+ lebih membulat), kesan lebih presisi di semua kontrol & container.
237
+ - **Motion lebih responsif** — durasi dasar `--dur-base` 200ms→180ms, `--dur-slow` 320ms→280ms.
238
+ - **Elevation overlay dijatah ulang** — bayangan `--shadow-3` (menu/dropdown/popover) dan
239
+ `--shadow-4` (modal) kini lebih tajam & lebih hadir secara visual; bayangan resting
240
+ (kartu, tombol) tidak berubah.
241
+ - **Hierarki heading "Precision"** — `h1`–`h4` kini memakai `--font-display` (Sora) / 700 /
242
+ `--tracking-tighter` (token baru, -0.03em) / `--leading-snug`; ukuran font tidak berubah.
243
+ - **State interaksi disatukan** — hover/active/disabled/focus-visible dirapikan lintas
244
+ input/combo/cascade/chip/pagination/selection; memperbaiki bug nyata di mana
245
+ `.fdy-chip--filter` tidak punya focus ring sama sekali.
246
+ - **`.fdy-table-scroll` scroll tanpa syarat** — tak lagi hanya berlaku di dalam `.fdy-datatable`
247
+ (`.fdy-table-wrap` untuk shell berbingkai, `.fdy-table-scroll` untuk scroll polos standalone).
248
+ - **`selection.css` di-tokenkan** — nilai mentah (`#fff` thumb switch, inset `rgba`, dimensi
249
+ `1.15`/`2.4`/`1.35rem`) → token (`--color-switch-thumb`, `--color-shadow-inset`, `--control-box`,
250
+ `--control-switch-w/-h`). Nol perubahan visual.
251
+ - **Default warna seri donut** — saat `data-fdy-colors` lebih pendek dari jumlah seri, celah kini
252
+ diisi `--chart-N` fixed-order (bukan cycle palet semantik lama). Non-breaking.
253
+ ### Added
254
+ - **Teal sebagai aksen fungsional** — `--color-accent` dipakai sebagai indikator non-teks
255
+ untuk state aktif/terpilih: item nav aktif, underline tab aktif, baris tabel terpilih,
256
+ opsi combo/cascade/autocomplete terpilih. Bukan dekorasi — murni penanda status.
257
+ - **Token baru** `--tracking-tighter` (-0.03em) untuk heading Sora.
258
+ - **6 assertion kontras WCAG (`AA_UI`, 3:1)** baru di `test/contrast.test.mjs` yang menjaga
259
+ teal-on-surface di light & dark tetap lolos ambang kontrol non-teks.
260
+ - **Palet chart kategorikal** — token `--chart-1..8` (+ `--chart-grid`/`--chart-tick`), 8 warna
261
+ colorblind-safe **tervalidasi** (validator dataviz, light & dark di surface Freeday: dark
262
+ all-pass, light lolos + relief rule). Donut menggambar seri **fixed-order** (tanpa cycle).
263
+ Token chart sengaja di luar `contrast.test.mjs` (a11y via validator palet + legend/label).
264
+ - **Modal size** — `.fdy-modal--sm/--md/--lg/--wide` (24/32/48/60rem, responsif, anti-overflow).
265
+ - **`.fdy-nav--flat`** — varian nav grup statis (tanpa caret / garis antar-grup / affordance
266
+ collapse) + dukung markup non-`<details>` yang benar-benar tak bisa dilipat.
267
+ - **Brand shell berstruktur** — `.fdy-app__brand-mark`/`-title`/`-subtitle` (ikon + 2 baris di
268
+ header shell); pemakaian teks satu-baris tetap jalan.
269
+ - **`FreedayDrawer.initAll`** — drawer kini ter-hydrate `useFreeday` di subtree Vue/React.
270
+ - **Export skala breakpoint** — `freeday/breakpoints` (`{ sm:600, md:960, lg:1280, xl:1920 }`)
271
+ untuk `matchMedia` / menyelaraskan `@media` app ke skala kit.
272
+ - **Docs** — contoh **product-appbar** siap-copas (breadcrumb + input-group search + menu);
273
+ install `git+https` untuk CI (repo privat tanpa SSH key); klarifikasi `.fdy-btn` = primary,
274
+ `.fdy-table-wrap`, dan density `--control-h` untuk komponen custom.
275
+
276
+ ## [1.0.0] — 2026-07-22
277
+ Rilis **1.0 — project-ready**, sekaligus **rebrand ke Freeday**. Definisi v1.0 terpenuhi:
278
+ kontras WCAG AA lolos audit otomatis · installable via git · integrasi Vue/React/Blazor
279
+ terbukti di contoh faktur yang jalan · docs adopsi lengkap.
280
+ ### Changed
281
+ - **Rebrand Foundry → Freeday.** Nama paket `freeday`; export
282
+ `freeday/css | /vue | /react | /blazor | /tokens | /enhancers/*`; API JS
283
+ `window.Freeday*` / `Freeday.toast()` / hook `useFreeday`; artefak dist `freeday.*` + `freeday-*.js`.
284
+ Prefix kelas/token **`fdy-` dipertahankan** (backronym FreeDaY) sehingga markup konsumen
285
+ **tidak** breaking. Repo: `github:cahyo-dimas/freeday-ui-kit`. Filosofi: *"lebih banyak free day
286
+ buat dev karena UI kit-nya sudah siap pakai"*.
287
+ - Install: `npm i github:cahyo-dimas/freeday-ui-kit#v1.0.0`.
288
+ ### Docs
289
+ - Root redirect `index.html` → `docs/` untuk GitHub Pages (URL bersih `/freeday-ui-kit/`).
290
+
291
+ ## [0.9.6] — 2026-07-22
292
+ ### Docs
293
+ - **Whole-app language toggle (ID ⇄ EN)** — the topbar toggle now switches the entire docs,
294
+ not just the landing: topbar, sidebar labels + group headers, every section heading, and
295
+ every description. Keyed by section id / nav href, round-trips cleanly. (In-demo sample
296
+ labels stay as illustrative content.)
297
+ - **Proper state icons** — the empty / error state cards use duotone SVG icons instead of
298
+ emoji (🗂️/⚠️).
299
+ - Hero CTA spacing loosened (removed a stale `.doc-hero p` rule that zeroed the gap).
300
+ ### Changed
301
+ - **Icons stay single-tone** — reverted the date/time picker glyphs to minimalist single-tone
302
+ (duotone is reserved for the larger illustrative icons — states — and the theme toggle).
303
+
304
+ ## [0.9.5] — 2026-07-22
305
+ ### Added
306
+ - **Two-tone (duotone) control icons** — the date/time picker triggers (and the datetime
307
+ composer that reuses them) now render with a low-opacity fill behind the stroke, matching the
308
+ sun/moon theme toggle. A coherent duotone treatment for the control-glyph family.
309
+ ### Docs
310
+ - **Landing language toggle (ID ⇄ EN)** — a topbar button swaps the landing copy (hero, stats,
311
+ framework-integration, footer) between Indonesian and English via `[data-i18n]`; inline
312
+ markup (bold/code) is preserved. Version references synced to v0.9.5.
313
+
314
+ ## [0.9.4] — 2026-07-22
315
+ ### Added
316
+ - **Sidebar-menu component** — `.fdy-nav` (App shell) now supports per-node `.fdy-nav__icon`
317
+ and `.fdy-nav__badge` (count), collapsible sections `.fdy-nav__group`/`.fdy-nav__grouplabel`,
318
+ and nested items `.fdy-nav__tree` + `.fdy-nav__sub` (native `<details>`, zero-JS). Any node
319
+ can be icon+text, text-only, or badged. New "Sidebar menu" docs section.
320
+ - **Responsive App shell** — on mobile (≤720px) the sidebar becomes an **off-canvas drawer**
321
+ opened by the topbar toggle, with a `.fdy-app__backdrop`; on desktop the toggle collapses it.
322
+ ### Changed
323
+ - **Brand ↔ topbar aligned** — `.fdy-app__brand` is now the same height as the topbar
324
+ (`--space-16`) so the logo and page title sit on the same line. `.fdy-app__title` truncates
325
+ instead of forcing overflow.
326
+ ### Fixed
327
+ - **Awkward Indonesian copy** — dropzone “Jatuhkan …” → “Seret berkas ke sini …”.
328
+ ### Docs
329
+ - Theme toggle is now a two-tone **sun/moon icon** button. Clearer **notification badge** demo
330
+ (bell + count) explaining the overlay badge works on any element. Responsive fixes so nothing
331
+ overflows down to 320px.
332
+
333
+ ## [0.9.3] — 2026-07-22
334
+ ### Added
335
+ - **Chart hover (Chart.js-style)** — bar & donut charts now show an interactive tooltip that
336
+ follows the cursor (`label: value`, donut adds `(%)`). Bars dim while one is hovered (the
337
+ hovered bar stays lit); donut gains a transparent SVG sector per slice that pops on hover.
338
+ ### Changed
339
+ - **App shell**: the brand is now a fixed header (only the nav scrolls, so the logo never
340
+ scrolls away). New `.fdy-app__navtoggle` (hamburger) + `.fdy-app--nav-collapsed` to
341
+ collapse/hide the sidebar. Roomier `--space-8` main padding.
342
+ ### Fixed
343
+ - **Anchor buttons underlined** — `.fdy-btn` now sets `text-decoration:none`, so links styled
344
+ as buttons (e.g. hero CTAs) no longer show an underline.
345
+ ### Docs
346
+ - Nav categories are collapsible `<details>` groups with chevrons (PrimeVue-style); more
347
+ section whitespace; topbar hamburger to collapse the sidebar.
348
+
349
+ ## [0.9.2] — 2026-07-22
350
+ ### Fixed
351
+ - **Hover kontrol form tak terlihat** — sejak border resting jadi `--color-control-border`
352
+ (slate-500) untuk a11y, hover yang menuju `--color-text-subtle` (juga slate-500) tak berubah.
353
+ Semua kontrol (input, textarea, combo, cascade, time/date picker, input-group, dropzone) kini
354
+ hover ke `--color-text-muted` (slate-600) → menggelap terlihat.
355
+ - **Split button rusak saat hover** — `translateY(-1px)` per-tombol mengangkat satu paruh saja
356
+ sehingga jahitan tak sejajar. Kini `.fdy-btn-split` menjadi satu unit: tiap paruh tak
357
+ mengangkat/berbayang sendiri; split terangkat & berbayang sebagai satu kesatuan, plus garis
358
+ pemisah tipis antar paruh.
359
+
360
+ ## [0.9.1] — 2026-07-22
361
+ ### Added
362
+ - **Adapter React** (`freeday/react`) — hook `useFreeday(rootRef?)` yang meng-*hydrate* enhancer
363
+ di subtree pada mount + tiap commit (idempotent). Tipe `event.detail` di
364
+ `adapters/react/index.d.ts`. Contoh jalan `examples/react-faktur/` (Vite + React 19 + TS).
365
+ - **Interop Blazor** (`freeday/blazor`, `adapters/blazor/freeday-blazor.js`) — script klasik yang
366
+ mendaftarkan `window.FreedayBlazor` dengan `initAll` / `on` / `off` / `toast` / `toggleTheme`.
367
+ `on(el, event, dotNetRef, method)` meneruskan detail (JSON-safe) ke method `[JSInvokable]` C#.
368
+ Contoh jalan `examples/blazor-faktur/` (Blazor WASM, .NET 10, code-behind `.razor` + `.razor.cs`).
369
+ - Ketiga adapter (Vue/React/Blazor) diverifikasi headless dengan layar faktur yang sama:
370
+ hydrate markup framework, validasi men-gate submit, event → state framework, tema light/dark.
371
+ ### Changed
372
+ - `package.json`: export `./react` + `./blazor`, `react` peerDependency opsional (`>=18`).
373
+ `version` 0.9.0 → 0.9.1.
374
+
375
+ ## [0.9.0] — 2026-07-22
376
+ ### Added
377
+ - **Adapter Vue 3** (`freeday/vue`) — composable `useFreeday(rootRef?)` yang meng-*hydrate*
378
+ semua enhancer di subtree komponen saat mount + tiap update (idempotent). Tipis: enhancer
379
+ tetap sumber kebenaran, event `fdy-*` mengalir lewat `v-on` native. Tipe `event.detail`
380
+ disertakan (`FdyCascadeChangeDetail`, dst) di `adapters/vue/index.d.ts`.
381
+ - **Contoh jalan** `examples/vue-faktur/` — layar faktur nyata (Vite + Vue 3 + TS) yang memakai
382
+ form validation + mask + cascade + datepicker + combo + table via adapter. `npm install &&
383
+ npm run dev`. Membuktikan kontrak integrasi end-to-end (diverifikasi headless: hydrate,
384
+ validasi men-gate submit, event → state Vue, tema light/dark).
385
+ ### Changed
386
+ - `package.json`: export `./vue`, `adapters/` masuk `files`, `vue` sebagai peerDependency
387
+ opsional (`^3.4.0`). `version` 0.8.1 → 0.9.0.
388
+
389
+ ## [0.8.1] — 2026-07-22
390
+ ### Added
391
+ - **Form validation** (`freeday-form.js`, `[data-fdy-validate]`) — Constraint Validation
392
+ API di-wire ke error inline aksesibel: `aria-invalid` + pesan ter-`aria-describedby`,
393
+ fokus ke field invalid pertama saat submit, re-validasi live tiap blur/input. Pesan
394
+ custom `data-fdy-msg-*`, cocok antar-field `data-fdy-match`. Event `fdy-form-invalid`/
395
+ `fdy-form-valid`, `window.FreedayForm`.
396
+ - **Password reveal + input mask** (`freeday-mask.js`) — `[data-fdy-password]` tambah
397
+ toggle tampil/sembunyi (memakai ulang chrome tombol input-group); `[data-fdy-mask]`
398
+ format saat mengetik (`#` digit, `A` huruf, `*` alnum, sisanya literal), raw value di
399
+ `dataset.fdyRaw` + event `fdy-mask`. `window.FreedayMask`.
400
+ - **Cascade select** (`cascade.css` + `freeday-cascade.js`, `[data-fdy-cascade]`) —
401
+ pemilih hierarki drill-down dari `<ul>` bersarang; cabang membuka level berikut, daun
402
+ memilih (nilai = jalur lengkap), back/crumb + keyboard penuh. Event `fdy-cascade-change`,
403
+ `window.FreedayCascade`.
404
+ - **Chip choice/filter** (`chip.css` + `freeday-chip.js`) — chip interaktif
405
+ (`fdy-chip--choice` / `fdy-chip--filter`, `<button aria-pressed>`) dalam grup
406
+ `[data-fdy-chips]` (`data-single` = pilih-satu), plus wiring hapus untuk
407
+ `.fdy-chip__remove`. Event `fdy-chip-change` / `fdy-chip-remove`, `window.FreedayChip`.
408
+ ### Changed
409
+ - `.fdy-input`/`.fdy-textarea` kini juga menampilkan border error lewat
410
+ `aria-invalid="true"` (bukan cuma kelas `--error`), jadi enhancer cukup toggle satu
411
+ atribut aksesibel.
412
+
413
+ ## [0.8.0] — 2026-07-22
414
+ ### Added
415
+ - **Installable sebagai paket GitHub.** `npm i github:cahyo-dimas/freeday-ui-kit#v0.8.0`.
416
+ `package.json` kini punya `exports`, `files`, `sideEffects`. Jalur import:
417
+ `freeday/css` (token+komponen), `freeday` (semua enhancer), `freeday/tokens`,
418
+ `freeday/css/components`, `freeday/enhancers/<nama>`.
419
+ - `dist/freeday.bundle.css` — token + komponen dalam satu file (satu import, anti-footgun
420
+ "lupa token").
421
+ - Skrip rilis: lifecycle `version` build-ulang + `git add dist`; `prepack` build-ulang.
422
+ ### Changed
423
+ - `version` 0.1.0 → 0.8.0 (mulai semver bersih; komponen baru berikutnya = rilis minor 0.8.x).
424
+
425
+ ## [0.7.0] — 2026-07-22
426
+ ### Added
427
+ - **Time picker** (`freeday-timepicker.js`, `[data-fdy-timepicker]`) — trigger + popup daftar
428
+ waktu (listbox WAI-ARIA), 24 jam, `data-step`/`data-min`/`data-max`, keyboard penuh.
429
+ - **Datetime picker** (`freeday-datetime.js`, `[data-fdy-datetimepicker]`) — komposisi date +
430
+ time, satu event `fdy-datetime-change` (`YYYY-MM-DDTHH:MM`).
431
+ - **Konvensi varian ikon**: `data-fdy-no-icon` / `<template data-fdy-icon>` di date/time/datetime
432
+ picker; `fdy-combo--no-icon` + `.fdy-combo__icon` di select; contoh ikon depan di input-group.
433
+ - Test regresi kontras WCAG (`test/contrast.test.mjs`) — audit graf token (light + dark),
434
+ composite fill `-soft`, tegakkan 4.5:1 teks / 3:1 batas kontrol.
435
+ ### Fixed
436
+ - **A11y (WCAG 1.4.11 & AA):** border kontrol form 1.55:1 → token `--color-control-border`
437
+ (≥3:1); badge danger/info gelap di surface-3 → ramp baru red-300/blue-300; `text-subtle`
438
+ sebagai teks nyata (header hari kalender, timestamp) → `text-muted`.
439
+ - **App-shell scroll:** header sticky via natural-scroll (sidebar + topbar `position:sticky`),
440
+ mengganti pendekatan `--fill` yang menyisakan area putih saat scroll ke bawah.
441
+ - **Cross-browser:** `-webkit-backdrop-filter` untuk Safari; floor browser didokumentasikan
442
+ (`color-mix()` → Chrome 111 / Safari 16.4 / Firefox 113).
443
+
444
+ ## [0.6.0] dan sebelumnya
445
+ Lihat git tag `v0.2`…`v0.6`. Ringkas: pipeline token (`tokens.json` → CSS) + theming 3-sumbu,
446
+ app-shell/table/modal, 40+ komponen (form, feedback, navigasi, data, chart), enhancer JS
447
+ 0-dependency, docs demo-site.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cahyo D. Kurnianto
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.