fold-ng 0.23.0 → 0.25.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
@@ -8,6 +8,71 @@ All notable changes to **fold-ng** are documented here. The format follows
8
8
 
9
9
  _Nothing yet._
10
10
 
11
+ ## [0.25.0] - 2026-09-05
12
+
13
+ ### Added
14
+
15
+ - **`fold-search` devient un contrôle, et non plus un capteur.** Sa `value` est
16
+ un `model()` : la boîte se pilote donc de l'extérieur. C'est ce qui manquait
17
+ pour qu'elle remplace une recherche écrite à la main — choisir un filtre
18
+ ailleurs doit pouvoir VIDER le champ, et une recherche en écriture seule
19
+ continuait d'afficher un terme que les résultats n'honoraient plus.
20
+
21
+ Deux façons de s'en servir, et elles répondent à deux questions : `[(value)]`
22
+ donne le terme comme **état**, à chaque frappe — c'est ce que veut un filtrage
23
+ d'un tableau déjà en mémoire, où l'anti-rebond n'ajoute que de la latence ;
24
+ `(searchChange)` le donne comme **événement**, une fois posé — c'est ce que
25
+ veut une requête au serveur. Les deux se composent. Écrire `value` de
26
+ l'extérieur n'émet jamais : celui qui écrit sait déjà.
27
+
28
+ - **`fold-search` porte enfin sa loupe, sa croix et son compte.** Les trois
29
+ étaient recopiés dans chaque écran, avec le même oubli à chaque fois : le
30
+ compte de résultats change sous une recherche, donc il doit être **annoncé**.
31
+ Il porte `role="status"` et `aria-live="polite"`, et un utilisateur qui ne
32
+ voit pas la grille apprend enfin que quatre cents lignes sont devenues trois.
33
+
34
+ `resultCount` (rien tant qu'il vaut `null`), `resultLabel` (le mot après le
35
+ nombre — « pièces », "rows") et `placement` : `top`, `end` ou `bottom`.
36
+ `end` et non `right` — la bibliothèque se pose en propriétés **logiques**, et
37
+ le compte doit suivre le sens de lecture plutôt qu'un côté de l'écran.
38
+
39
+ - **`fold-input` gagne deux affixes**, et c'est de là que `fold-search` tire les
40
+ siens : `leadingIcon` dessine un glyphe DANS la boîte, avant le texte (le
41
+ champ réserve la place lui-même, et le glyphe ne prend pas le clic) ;
42
+ `clearable` + `clearLabel` posent un `×` de fin tant qu'il y a quelque chose à
43
+ effacer, qui vide la valeur **et rend le focus** — sans quoi il faut un second
44
+ clic pour reprendre la saisie.
45
+
46
+ Les deux sont à `false` par défaut : un champ de formulaire qui s'efface tout
47
+ seul invite l'accident qu'il ne sait pas défaire. Le `×` ne paraît ni en
48
+ lecture seule ni désactivé — il promettrait un geste que le contrôle refuse —
49
+ et un mot de passe `revealable` garde la place de fin : perdre son œil casse
50
+ la saisie, perdre la croix la rend seulement moins commode.
51
+
52
+ ## [0.24.0] - 2026-08-29
53
+
54
+ ### Added
55
+
56
+ - **`FoldTableColumn.numeric`** — la colonne tient des NOMBRES, et deux choses
57
+ suivent : chiffres tabulaires et alignement à droite. C'est la même chose dite
58
+ deux fois, d'où un drapeau et non deux propriétés — des chiffres
59
+ proportionnels alignés à droite ne s'alignent toujours pas sous eux-mêmes, et
60
+ des chiffres tabulaires en drapeau à gauche perdent leur raison d'être.
61
+
62
+ Une colonne de montants en chiffres proportionnels oblige l'œil à lire chaque
63
+ ligne au lieu de balayer la colonne — ce qui est la seule raison de mettre des
64
+ nombres dans un tableau. L'en-tête suit sans qu'on le lui dise ; un `align`
65
+ écrit à la main gagne toujours.
66
+
67
+ ### Docs
68
+
69
+ - **`FoldTableColumn.cellClass` dit enfin où sa classe atterrit** : sur le
70
+ `<td>` de la table, qui porte l'encapsulation de la TABLE. Les styles de
71
+ composant du consommateur ne l'atteignent donc jamais — seule une classe
72
+ globale y fait quelque chose. Pour habiller une cellule depuis sa propre
73
+ feuille de style, il faut projeter un `<ng-template foldCell>` : ce qu'il rend
74
+ appartient au consommateur, attribut compris.
75
+
11
76
  ## [0.23.0] - 2026-08-29
12
77
 
13
78
  ### Added
@@ -2390,7 +2455,9 @@ design-token stylesheet.
2390
2455
  `currentColor`; `prefers-reduced-motion` + `forced-colors` are respected;
2391
2456
  strings localise via inputs / providers (`provideFoldPanelLabels`).
2392
2457
 
2393
- [unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.23.0...HEAD
2458
+ [unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.25.0...HEAD
2459
+ [0.25.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.25.0
2460
+ [0.24.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.24.0
2394
2461
  [0.23.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.23.0
2395
2462
  [0.22.1]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.22.1
2396
2463
  [0.22.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.22.0
package/README.md CHANGED
@@ -353,7 +353,7 @@ ships it.
353
353
  | `FoldFieldsetComponent` | `fold-fieldset` | Named group of controls — a real `<fieldset>`/`<legend>` with the browser's margin/padding/3D border undone and the rhythm on tokens. `disabled` disables every control inside (the element's unique power); `hint` wired through `aria-describedby` (`hintPosition` `under`/`inline`); `legend` (empty renders none) or `ariaLabel`; `optional` marks the whole group (not each member); `legendVariant` (`eyebrow`/`heading` — the same two registers as a page-section's title), `direction` (`vertical`/`horizontal`), `appearance` (`plain`/`border`); `--fold-fieldset-gap`. |
354
354
  | `FoldPasswordFieldComponent` | `fold-password-field` | Password input + a live requirements checklist (a dot/tick per rule). Rules injected via `FoldPasswordRule` (`{ label, test }` — regex/zod/anything); `revealable` eye (a `fold-input` capability); `marker` dot/check; `[rules]` slot to redesign the list; `validChange`; Signal Forms. |
355
355
  | `FoldViewToggleComponent` | `fold-view-toggle` | Segmented single-select (Cards/Table, density, chart-mode…). Generic `options` (`{ value, icon?, label?, ariaLabel?, disabled? }`) + `[(value)]`; a real `role="radiogroup"` — roving tabindex, arrow keys, Home/End, disabled-skip; `size`, `iconOnly`, `activeStyle` (raised / accent). |
356
- | `FoldSearchComponent` | `fold-search` | Debounced search box — an `fold-input` that emits `searchChange` once typing settles (`delayMs`), trimmed + de-duplicated. |
356
+ | `FoldSearchComponent` | `fold-search` | Search box — magnifier, clear `×`, optional announced result count (`resultCount` / `resultLabel` / `placement`). `[(value)]` is the term as state (every keystroke); `searchChange` emits it once typing settles (`delayMs`), trimmed + de-duplicated. |
357
357
  | `FoldListboxComponent` / `FoldOptionComponent` | `fold-listbox` / `fold-option` | Styleable single-select — the richer sibling of `fold-select` (native `<select>`) for options that need custom rows (icon, second line, status). On `fold-popover`; `role="listbox"` + `aria-activedescendant`, full keyboard (↑/↓, `Home`/`End`, type-ahead, `Enter`). Signal Forms (`FormValueControl<string>`, `[formField]`/`[(value)]`); shares `fold-input`'s box chrome. |
358
358
  | `FoldMultiselectComponent` | `fold-multiselect` | Multi-select sibling of `fold-listbox` (same popover + `fold-option` rows). Value is a set (`readonly string[]`); activating a row toggles it and the panel stays open. Separate component — not a `multiple` flag — so the Signal-Forms value type stays honest. `role="listbox"` + `aria-multiselectable`; the trigger summarises the picks. |
359
359
  | `FoldOptgroupComponent` | `fold-optgroup` | Labelled group of `<fold-option>`s inside a `fold-listbox` / `fold-multiselect` — the styleable `<optgroup>`. Presentational: `role="group"` + `aria-labelledby` header (no `role="option"`, so keyboard nav skips it); the owner discovers grouped options in document order, so roving crosses groups seamlessly. |