fold-ng 0.24.0 → 0.26.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 +88 -1
- package/README.md +2 -2
- package/fesm2022/fold-ng.mjs +215 -34
- package/fesm2022/fold-ng.mjs.map +1 -1
- package/package.json +1 -1
- package/tmp-esm2022/tsconfig.lib.tsbuildinfo +1 -1
- package/types/fold-ng.d.ts +187 -11
- package/types/fold-ng.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,91 @@ All notable changes to **fold-ng** are documented here. The format follows
|
|
|
8
8
|
|
|
9
9
|
_Nothing yet._
|
|
10
10
|
|
|
11
|
+
## [0.26.0] - 2026-09-11
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **`foldRowNote` — une ligne sous une ligne, et qui ne se replie pas.**
|
|
16
|
+
`fold-data-table` n'avait qu'une surface sous une rangée : le tiroir
|
|
17
|
+
`foldRowDetail`. Or projeter ce gabarit fait pousser une colonne de chevrons,
|
|
18
|
+
parce qu'un tiroir cache quelque chose et qu'il faut de quoi le demander. Un
|
|
19
|
+
avertissement qui doit se lire EN MÊME TEMPS que sa ligne ne cache rien : le
|
|
20
|
+
chevron n'y ouvre pas, il obstrue.
|
|
21
|
+
|
|
22
|
+
La note est donc un concept à part, pas une option du tiroir. Aucun état,
|
|
23
|
+
aucune bascule, aucun `aria-expanded` — il n'y a rien à révéler. Elle se rend
|
|
24
|
+
en pleine largeur sous sa rangée en vue large, et sous les champs de la carte
|
|
25
|
+
en vue étroite : même promesse des deux côtés.
|
|
26
|
+
|
|
27
|
+
Elle demande **deux moitiés**, et la seconde n'est pas de la cérémonie : le
|
|
28
|
+
gabarit dit à quoi une note ressemble, le prédicat `rowNote` dit **quelles**
|
|
29
|
+
lignes en portent une. Sans lui, chaque rangée émettrait un `<tr>` vide — et
|
|
30
|
+
une rangée vide n'est pas invisible : un lecteur d'écran y entre et annonce
|
|
31
|
+
une ligne blanche par enregistrement. Les deux moitiés doivent être là ; l'une
|
|
32
|
+
sans l'autre ne rend rien, ce qui est le silence qu'on attend d'un câblage à
|
|
33
|
+
moitié fait.
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<fold-data-table [rowNote]="isLate" …>
|
|
37
|
+
<ng-template foldRowNote let-row>
|
|
38
|
+
<fold-callout variant="warning">…</fold-callout>
|
|
39
|
+
</ng-template>
|
|
40
|
+
</fold-data-table>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Nouveau : `FoldDataTableRowNoteDirective`, le type `FoldTableRowNote<T>`,
|
|
44
|
+
l'entrée `rowNote`, et le jeton `--fold-data-table-note-padding`.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- **La zébrure se recomptait à chaque rangée intercalée.** `:nth-child(even)`
|
|
49
|
+
compte TOUS les frères : un tiroir ouvert décalait la parité et retournait les
|
|
50
|
+
stries sous lui. Le sélecteur compte désormais les seules lignes de données
|
|
51
|
+
(`:nth-child(even of .folddt-row)`), ce qui est ce que la strie a toujours
|
|
52
|
+
voulu dire — et sans quoi une note, qui ne se referme jamais, aurait fait
|
|
53
|
+
tomber toutes les lignes en rang impair : plus une seule strie.
|
|
54
|
+
|
|
55
|
+
## [0.25.0] - 2026-09-05
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- **`fold-search` devient un contrôle, et non plus un capteur.** Sa `value` est
|
|
60
|
+
un `model()` : la boîte se pilote donc de l'extérieur. C'est ce qui manquait
|
|
61
|
+
pour qu'elle remplace une recherche écrite à la main — choisir un filtre
|
|
62
|
+
ailleurs doit pouvoir VIDER le champ, et une recherche en écriture seule
|
|
63
|
+
continuait d'afficher un terme que les résultats n'honoraient plus.
|
|
64
|
+
|
|
65
|
+
Deux façons de s'en servir, et elles répondent à deux questions : `[(value)]`
|
|
66
|
+
donne le terme comme **état**, à chaque frappe — c'est ce que veut un filtrage
|
|
67
|
+
d'un tableau déjà en mémoire, où l'anti-rebond n'ajoute que de la latence ;
|
|
68
|
+
`(searchChange)` le donne comme **événement**, une fois posé — c'est ce que
|
|
69
|
+
veut une requête au serveur. Les deux se composent. Écrire `value` de
|
|
70
|
+
l'extérieur n'émet jamais : celui qui écrit sait déjà.
|
|
71
|
+
|
|
72
|
+
- **`fold-search` porte enfin sa loupe, sa croix et son compte.** Les trois
|
|
73
|
+
étaient recopiés dans chaque écran, avec le même oubli à chaque fois : le
|
|
74
|
+
compte de résultats change sous une recherche, donc il doit être **annoncé**.
|
|
75
|
+
Il porte `role="status"` et `aria-live="polite"`, et un utilisateur qui ne
|
|
76
|
+
voit pas la grille apprend enfin que quatre cents lignes sont devenues trois.
|
|
77
|
+
|
|
78
|
+
`resultCount` (rien tant qu'il vaut `null`), `resultLabel` (le mot après le
|
|
79
|
+
nombre — « pièces », "rows") et `placement` : `top`, `end` ou `bottom`.
|
|
80
|
+
`end` et non `right` — la bibliothèque se pose en propriétés **logiques**, et
|
|
81
|
+
le compte doit suivre le sens de lecture plutôt qu'un côté de l'écran.
|
|
82
|
+
|
|
83
|
+
- **`fold-input` gagne deux affixes**, et c'est de là que `fold-search` tire les
|
|
84
|
+
siens : `leadingIcon` dessine un glyphe DANS la boîte, avant le texte (le
|
|
85
|
+
champ réserve la place lui-même, et le glyphe ne prend pas le clic) ;
|
|
86
|
+
`clearable` + `clearLabel` posent un `×` de fin tant qu'il y a quelque chose à
|
|
87
|
+
effacer, qui vide la valeur **et rend le focus** — sans quoi il faut un second
|
|
88
|
+
clic pour reprendre la saisie.
|
|
89
|
+
|
|
90
|
+
Les deux sont à `false` par défaut : un champ de formulaire qui s'efface tout
|
|
91
|
+
seul invite l'accident qu'il ne sait pas défaire. Le `×` ne paraît ni en
|
|
92
|
+
lecture seule ni désactivé — il promettrait un geste que le contrôle refuse —
|
|
93
|
+
et un mot de passe `revealable` garde la place de fin : perdre son œil casse
|
|
94
|
+
la saisie, perdre la croix la rend seulement moins commode.
|
|
95
|
+
|
|
11
96
|
## [0.24.0] - 2026-08-29
|
|
12
97
|
|
|
13
98
|
### Added
|
|
@@ -2414,7 +2499,9 @@ design-token stylesheet.
|
|
|
2414
2499
|
`currentColor`; `prefers-reduced-motion` + `forced-colors` are respected;
|
|
2415
2500
|
strings localise via inputs / providers (`provideFoldPanelLabels`).
|
|
2416
2501
|
|
|
2417
|
-
[unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.
|
|
2502
|
+
[unreleased]: https://github.com/hugoheynard/fold-ng/compare/v0.26.0...HEAD
|
|
2503
|
+
[0.26.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.26.0
|
|
2504
|
+
[0.25.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.25.0
|
|
2418
2505
|
[0.24.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.24.0
|
|
2419
2506
|
[0.23.0]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.23.0
|
|
2420
2507
|
[0.22.1]: https://github.com/hugoheynard/fold-ng/releases/tag/v0.22.1
|
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` |
|
|
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. |
|
|
@@ -366,7 +366,7 @@ ships it.
|
|
|
366
366
|
| `FoldToggleIconComponent` | `fold-toggle-icon` | Icon-only **toggle** — the same surface as `fold-button-icon`, plus `[(active)]` + `aria-pressed` (true/false) and a pressed state. Emits `toggled`. |
|
|
367
367
|
| `FoldInlineConfirmComponent` | `fold-inline-confirm` | In-place “are you sure?” guard — the projected trigger swaps to a confirm/cancel row (no modal). Simple (`confirmed` emits `""`), type-to-confirm (`[match]`), or secret (`password`, masked, emits the value). `confirmIcon` + a chosen `cancelIcon`; `Escape` cancels; `message` announced via `aria-describedby`; focus in-then-back; controlled `[(open)]` + `keepOpenOnConfirm` for async pending; i18n via `provideFoldInlineConfirmLabels`. |
|
|
368
368
|
| `FoldDangerZoneComponent` | `fold-danger-zone` | Framed destructive-action block for “delete X” settings. `appearance="filled"` (alert-tinted) or `"section"` (a danger section: alert border + normal-background body for ordinary content). The confirm **reveals on click** — an `actionLabel` button opens an in-place `fold-inline-confirm` (plain “are you sure?”, or type-to-confirm when `confirmPhrase` is set); `(confirmed)` emits the typed text. Omit `actionLabel` for a section with no action. `role="group"` + `aria-labelledby`. |
|
|
369
|
-
| `FoldDataTableComponent` | `fold-data-table` | Controlled roster table — sortable sticky header, tone rows, controlled selection (checkbox column), roving-keyboard nav, `mobileLayout` (scroll / auto-cards / custom `foldRowCard`), an optional `foldToolbar` bar, sticky-first, density.
|
|
369
|
+
| `FoldDataTableComponent` | `fold-data-table` | Controlled roster table — sortable sticky header, tone rows, controlled selection (checkbox column), roving-keyboard nav, `mobileLayout` (scroll / auto-cards / custom `foldRowCard`), an optional `foldToolbar` bar, sticky-first, density. Two under-row surfaces: a `foldRowDetail` drawer (toggled, grows a chevron column) and an always-visible `foldRowNote` line (`rowNote` predicate, no toggle). |
|
|
370
370
|
| `FoldPaginatorComponent` | `fold-paginator` | Server-side paginator (size selector + range + page nav). |
|
|
371
371
|
| `FoldTimelineComponent` | `fold-timeline` | Connected rail of nodes (dot + optional date + label) — `vertical` navigable history or `horizontal` step progress; nodes optionally clickable. |
|
|
372
372
|
| `FoldBadgeComponent` | `fold-badge` | Status / count pill (accent/info/warning/alert/success). |
|