@cahyo-dimas/freeday 1.37.0 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,33 @@
3
3
  Semua perubahan penting dicatat di sini. Format longgar mengikuti
4
4
  [Keep a Changelog](https://keepachangelog.com/); tiap versi = git tag.
5
5
 
6
+ ## [1.38.0] — 2026-08-19
7
+ One note from the back-office app (IDU_EMATE_APPL_WEB, #015).
8
+ ### Fixed
9
+ - **`FdyCfl`'s trigger said `"Buka pencarian"`** (Vue · React) — the accessible name of the button
10
+ that opens the picker, and so the first thing a screen-reader user meets on every
11
+ choose-from-list. #009 replaced twelve strings around it and missed this one. It takes an
12
+ `openLabel` prop defaulting to `'Open search'` now. Blazor was not Indonesian but was using
13
+ `SearchPlaceholder` as that button's `aria-label` — a placeholder doing a label's job — and now
14
+ takes the same `OpenLabel`, so all four stacks name the control identically.
15
+ - **`FdyCascade`'s up-one-level button said `"Kembali satu tingkat"`** (Vue · React) — new
16
+ `backLabel`, default `'Back one level'`.
17
+ ### Changed
18
+ - **The language guard now lists derived forms, not just roots.** `\bcari\b` cannot match
19
+ *pen·cari·an*, and `kembali` was never listed — Indonesian derives by affix, so a whole-word list
20
+ misses most of the UI vocabulary. Widening it is what surfaced the `FdyCascade` string nobody had
21
+ reported.
22
+
23
+ ### Fixed — the test suite
24
+ - **`rules()` read only the last line of a selector**, so a rule written across several lines was
25
+ reported under a fragment of its own name and every guard in `test/css.test.mjs` was blind to it
26
+ (#014). A guard that matches nothing PASSES, which is the worst way for a test to fail — it
27
+ surfaced only because the first draft of the filter-bar rule happened to be wrapped. The helper
28
+ now strips comments from the whole source first (a comment quoting CSS carries braces, and those
29
+ would split a rule in half) and reads the selector whole. Asserted directly rather than left to
30
+ the CSS staying one-rule-per-line: that is a convention, and this is the thing that would quietly
31
+ stop enforcing it. Mutation-tested — restoring the last-line read fails the new test by name.
32
+
6
33
  ## [1.37.0] — 2026-08-19
7
34
  One note from the back-office app (IDU_EMATE_APPL_WEB, #014).
8
35
  ### Added
@@ -21,7 +21,7 @@
21
21
  </button>
22
22
  }
23
23
  <button class="fdy-input-group__btn" type="button" @onclick="OpenAsync"
24
- disabled="@(Disabled || Readonly)" aria-label="@SearchPlaceholder">
24
+ disabled="@(Disabled || Readonly)" aria-label="@OpenLabel">
25
25
  <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor"
26
26
  stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
27
27
  <circle cx="11" cy="11" r="7"></circle><path d="m21 21-4.3-4.3"></path>
@@ -32,6 +32,9 @@ public partial class FdyCfl<TRow>
32
32
  [Parameter] public string MoreText { get; set; } = "Load more";
33
33
  [Parameter] public string CloseLabel { get; set; } = "Close";
34
34
 
35
+ /// <summary>aria-label for the button that opens the picker.</summary>
36
+ [Parameter] public string OpenLabel { get; set; } = "Open search";
37
+
35
38
  [Parameter] public bool Disabled { get; set; }
36
39
 
37
40
  /// <summary>Locked/view mode: shows the value but the search dialog can't be opened.</summary>
@@ -23,6 +23,8 @@ export interface FdyCascadeProps {
23
23
  options: ReadonlyArray<CascadeNode>;
24
24
  /** Path separator in the display, default " / " (matches the enhancer). */
25
25
  separator?: string;
26
+ /** aria-label for the button that goes up one level. Default 'Back one level'. */
27
+ backLabel?: string;
26
28
  placeholder?: string;
27
29
  /** Accessible name for the trigger + listbox (the enhancer's data-label). */
28
30
  label?: string;
@@ -191,7 +193,7 @@ export function FdyCascade(props: FdyCascadeProps): JSX.Element {
191
193
  <button
192
194
  type="button"
193
195
  className="fdy-cascade__back"
194
- aria-label="Kembali satu tingkat"
196
+ aria-label={props.backLabel ?? 'Back one level'}
195
197
  hidden={stack.length === 0}
196
198
  onClick={(): void => { ascend(); listRef.current?.focus(); }}
197
199
  >
@@ -43,6 +43,8 @@ export interface FdyCflProps<Row extends Record<string, unknown>> {
43
43
  moreText?: string;
44
44
  /** aria-label for the dialog's close button. Default 'Close'. */
45
45
  closeLabel?: string;
46
+ /** aria-label for the button that opens the picker. Default 'Open search'. */
47
+ openLabel?: string;
46
48
  placeholder?: string;
47
49
  disabled?: boolean;
48
50
  /** Locked/view mode: shows the picked value (focusable, copyable), but the search dialog can't be opened. Unlike `disabled`, it keeps tab order and isn't greyed. */
@@ -300,7 +302,7 @@ export function FdyCfl<Row extends Record<string, unknown>>(props: FdyCflProps<R
300
302
  className="fdy-input-group__btn"
301
303
  aria-haspopup="dialog"
302
304
  aria-labelledby={props.ariaLabelledby}
303
- aria-label={props.ariaLabelledby ? undefined : 'Buka pencarian'}
305
+ aria-label={props.ariaLabelledby ? undefined : (props.openLabel ?? 'Open search')}
304
306
  disabled={isDisabled || isReadonly}
305
307
  onClick={openDialog}
306
308
  >
@@ -36,6 +36,8 @@ const props = defineProps<{
36
36
  options: ReadonlyArray<CascadeNode>;
37
37
  /** Path separator in the display, default " / " (matches the enhancer). */
38
38
  separator?: string;
39
+ /** aria-label for the button that goes up one level. Default 'Back one level'. */
40
+ backLabel?: string;
39
41
  placeholder?: string;
40
42
  /** Accessible name for the trigger + listbox (the enhancer's data-label). */
41
43
  label?: string;
@@ -207,7 +209,7 @@ onBeforeUnmount((): void => {
207
209
  <button
208
210
  type="button"
209
211
  class="fdy-cascade__back"
210
- aria-label="Kembali satu tingkat"
212
+ :aria-label="backLabel ?? 'Back one level'"
211
213
  :hidden="stack.length === 0"
212
214
  @click="ascend(); listEl?.focus()"
213
215
  >
@@ -44,6 +44,8 @@ const props = defineProps<{
44
44
  moreText?: string;
45
45
  /** aria-label for the dialog's close button. Default 'Close'. */
46
46
  closeLabel?: string;
47
+ /** aria-label for the button that opens the picker. Default 'Open search'. */
48
+ openLabel?: string;
47
49
  placeholder?: string;
48
50
  disabled?: boolean;
49
51
  /** Locked/view mode: shows the picked value (focusable, copyable), but the search dialog can't be opened. Unlike `disabled`, it keeps tab order and isn't greyed. */
@@ -306,7 +308,7 @@ onBeforeUnmount((): void => {
306
308
  class="fdy-input-group__btn"
307
309
  aria-haspopup="dialog"
308
310
  :aria-labelledby="ariaLabelledby"
309
- :aria-label="ariaLabelledby ? undefined : 'Buka pencarian'"
311
+ :aria-label="ariaLabelledby ? undefined : (openLabel ?? 'Open search')"
310
312
  :disabled="isDisabled || isReadonly"
311
313
  @click="openDialog"
312
314
  >
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cahyo-dimas/freeday",
3
- "version": "1.37.0",
3
+ "version": "1.38.0",
4
4
  "description": "Freeday — token-driven, framework-agnostic UI KIT (design source-of-truth).",
5
5
  "type": "module",
6
6
  "license": "MIT",