origam 2.19.0 → 2.21.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 (184) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +0 -16
  4. package/dist/src/assets/css/tokens/light.css +0 -8
  5. package/dist/src/assets/scss/tokens/_dark.scss +0 -16
  6. package/dist/src/assets/scss/tokens/_light.scss +0 -8
  7. package/dist/src/components/Alert/OrigamAlert.vue +20 -0
  8. package/dist/src/components/App/OrigamAppBar.vue +20 -0
  9. package/dist/src/components/Audio/OrigamAudio.vue +20 -0
  10. package/dist/src/components/Avatar/OrigamAvatar.vue +20 -0
  11. package/dist/src/components/Avatar/OrigamAvatarGroup.vue +20 -0
  12. package/dist/src/components/Badge/OrigamBadge.vue +12 -0
  13. package/dist/src/components/Blockquote/OrigamBlockquote.vue +35 -65
  14. package/dist/src/components/BottomNav/OrigamBottomNav.vue +20 -0
  15. package/dist/src/components/Bracket/OrigamBracket.vue +12 -0
  16. package/dist/src/components/Bracket/OrigamBracketCompetitor.vue +20 -0
  17. package/dist/src/components/Bracket/OrigamBracketMatch.vue +33 -5
  18. package/dist/src/components/Breadcrumb/OrigamBreadcrumb.vue +20 -0
  19. package/dist/src/components/Breadcrumb/OrigamBreadcrumbDivider.vue +8 -0
  20. package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +20 -0
  21. package/dist/src/components/Btn/OrigamBtn.vue +20 -0
  22. package/dist/src/components/Btn/OrigamBtnGroup.vue +20 -0
  23. package/dist/src/components/Btn/OrigamBtnToggle.vue +20 -0
  24. package/dist/src/components/Calendar/OrigamCalendar.vue +21 -1
  25. package/dist/src/components/Card/OrigamCard.vue +20 -0
  26. package/dist/src/components/Card/OrigamCardHeader.vue +20 -0
  27. package/dist/src/components/Card/OrigamCardText.vue +20 -0
  28. package/dist/src/components/Carousel/OrigamCarousel.vue +20 -0
  29. package/dist/src/components/Carousel/OrigamCarouselItem.vue +20 -0
  30. package/dist/src/components/Chart/OrigamChart.vue +25 -1
  31. package/dist/src/components/Chart/OrigamChartBoxPlot.vue +12 -0
  32. package/dist/src/components/Chart/OrigamChartBullet.vue +12 -0
  33. package/dist/src/components/Chart/OrigamChartCandlestick.vue +12 -0
  34. package/dist/src/components/Chart/OrigamChartCartesian.vue +12 -0
  35. package/dist/src/components/Chart/OrigamChartGauge.vue +12 -0
  36. package/dist/src/components/Chart/OrigamChartHeatmap.vue +12 -0
  37. package/dist/src/components/Chart/OrigamChartHoneycomb.vue +12 -0
  38. package/dist/src/components/Chart/OrigamChartMap.vue +12 -0
  39. package/dist/src/components/Chart/OrigamChartPareto.vue +12 -0
  40. package/dist/src/components/Chart/OrigamChartPictorial.vue +12 -0
  41. package/dist/src/components/Chart/OrigamChartPolar.vue +12 -0
  42. package/dist/src/components/Chart/OrigamChartPolarBar.vue +12 -0
  43. package/dist/src/components/Chart/OrigamChartPyramid.vue +12 -0
  44. package/dist/src/components/Chart/OrigamChartRadar.vue +12 -0
  45. package/dist/src/components/Chart/OrigamChartSankey.vue +12 -0
  46. package/dist/src/components/Chart/OrigamChartSparkline.vue +12 -0
  47. package/dist/src/components/Chart/OrigamChartStreamgraph.vue +12 -0
  48. package/dist/src/components/Chart/OrigamChartSunburst.vue +12 -0
  49. package/dist/src/components/Chart/OrigamChartTreemap.vue +12 -0
  50. package/dist/src/components/Chart/OrigamChartVariwide.vue +12 -0
  51. package/dist/src/components/Chart/OrigamChartWordCloud.vue +12 -0
  52. package/dist/src/components/Checkbox/OrigamCheckbox.vue +20 -0
  53. package/dist/src/components/Checkbox/OrigamCheckboxBtn.vue +12 -0
  54. package/dist/src/components/Checkbox/OrigamCheckboxGroup.vue +20 -0
  55. package/dist/src/components/Chip/OrigamChip.vue +20 -0
  56. package/dist/src/components/Chip/OrigamChipGroup.vue +20 -0
  57. package/dist/src/components/Clipboard/OrigamClipboard.vue +20 -0
  58. package/dist/src/components/Code/OrigamCode.vue +20 -0
  59. package/dist/src/components/ColorPicker/OrigamColorPicker.vue +20 -0
  60. package/dist/src/components/ColorPickerField/OrigamColorPickerField.vue +20 -0
  61. package/dist/src/components/ConfirmWrapper/OrigamConfirmWrapper.vue +4 -0
  62. package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +20 -0
  63. package/dist/src/components/Counter/OrigamCounter.vue +20 -0
  64. package/dist/src/components/DataList/OrigamDataList.vue +20 -0
  65. package/dist/src/components/DataList/OrigamDataText.vue +8 -0
  66. package/dist/src/components/DataList/OrigamDataTitle.vue +8 -0
  67. package/dist/src/components/DataTable/OrigamDataTable.vue +20 -0
  68. package/dist/src/components/DataTable/OrigamDataTableColumnCell.vue +5 -1
  69. package/dist/src/components/DataTable/OrigamDataTableFooter.vue +4 -0
  70. package/dist/src/components/DatePicker/OrigamDatePicker.vue +20 -0
  71. package/dist/src/components/DatePickerField/OrigamDatePickerField.vue +20 -0
  72. package/dist/src/components/Dialog/OrigamDialog.vue +20 -0
  73. package/dist/src/components/Dialog/OrigamDialogConfirmation.vue +20 -0
  74. package/dist/src/components/Divider/OrigamDivider.vue +4 -0
  75. package/dist/src/components/Drawer/OrigamDrawer.vue +20 -0
  76. package/dist/src/components/ExpansionPanel/OrigamExpansionPanel.vue +20 -0
  77. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelContent.vue +20 -0
  78. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelHeader.vue +20 -0
  79. package/dist/src/components/ExpansionPanel/OrigamExpansionPanels.vue +20 -0
  80. package/dist/src/components/Field/OrigamField.vue +20 -0
  81. package/dist/src/components/FileField/OrigamFileField.vue +20 -0
  82. package/dist/src/components/Grid/OrigamGrid.vue +21 -1
  83. package/dist/src/components/Grids/OrigamCol.vue +16 -0
  84. package/dist/src/components/Grids/OrigamContainer.vue +17 -1
  85. package/dist/src/components/Grids/OrigamRow.vue +16 -0
  86. package/dist/src/components/Icon/OrigamClassIcon.vue +21 -1
  87. package/dist/src/components/Icon/OrigamComponentIcon.vue +21 -1
  88. package/dist/src/components/Icon/OrigamIcon.vue +21 -1
  89. package/dist/src/components/Icon/OrigamLigatureIcon.vue +21 -1
  90. package/dist/src/components/Icon/OrigamSvgIcon.vue +21 -1
  91. package/dist/src/components/Img/OrigamImg.vue +20 -0
  92. package/dist/src/components/Input/OrigamInput.vue +20 -0
  93. package/dist/src/components/Kbd/OrigamKbd.vue +12 -0
  94. package/dist/src/components/Label/OrigamLabel.vue +20 -0
  95. package/dist/src/components/Layout/OrigamLayout.vue +21 -1
  96. package/dist/src/components/List/OrigamList.vue +21 -1
  97. package/dist/src/components/List/OrigamListGroup.vue +20 -0
  98. package/dist/src/components/List/OrigamListItem.vue +20 -0
  99. package/dist/src/components/List/OrigamListSubheader.vue +20 -0
  100. package/dist/src/components/Main/OrigamMain.vue +20 -0
  101. package/dist/src/components/Masonry/OrigamMasonry.vue +21 -1
  102. package/dist/src/components/Media/OrigamMediaScrubber.vue +5 -1
  103. package/dist/src/components/Media/OrigamMediaVolumeControl.vue +4 -0
  104. package/dist/src/components/Menu/OrigamMenu.vue +20 -0
  105. package/dist/src/components/Messages/OrigamMessages.vue +20 -0
  106. package/dist/src/components/NumberField/OrigamNumberField.vue +20 -0
  107. package/dist/src/components/OtpInputField/OrigamOtpInputField.vue +20 -0
  108. package/dist/src/components/Pagination/OrigamPagination.vue +16 -0
  109. package/dist/src/components/Parallax/OrigamParallax.vue +20 -0
  110. package/dist/src/components/Parallax/OrigamParallaxElement.vue +20 -0
  111. package/dist/src/components/PasswordField/OrigamPasswordField.vue +20 -0
  112. package/dist/src/components/Picker/OrigamPicker.vue +20 -0
  113. package/dist/src/components/Progress/OrigamProgress.vue +12 -0
  114. package/dist/src/components/Progress/OrigamProgressCircular.vue +8 -0
  115. package/dist/src/components/Progress/OrigamProgressLinear.vue +12 -0
  116. package/dist/src/components/QrCode/OrigamQrCode.vue +21 -1
  117. package/dist/src/components/Radio/OrigamRadio.vue +20 -0
  118. package/dist/src/components/Radio/OrigamRadioBtn.vue +12 -0
  119. package/dist/src/components/Radio/OrigamRadioGroup.vue +20 -0
  120. package/dist/src/components/RatingField/OrigamRatingField.vue +20 -0
  121. package/dist/src/components/RatingField/OrigamRatingFieldItem.vue +20 -0
  122. package/dist/src/components/Responsive/OrigamResponsive.vue +21 -1
  123. package/dist/src/components/Select/OrigamSelect.vue +20 -0
  124. package/dist/src/components/SelectionControl/OrigamSelectionControl.vue +12 -0
  125. package/dist/src/components/Sheet/OrigamSheet.vue +20 -0
  126. package/dist/src/components/Skeleton/OrigamSkeleton.vue +5 -1
  127. package/dist/src/components/Slide/OrigamSlideGroup.vue +20 -0
  128. package/dist/src/components/SliderField/OrigamSliderField.vue +20 -0
  129. package/dist/src/components/SliderField/OrigamSliderFieldTrack.vue +5 -1
  130. package/dist/src/components/Snackbar/OrigamSnackbar.vue +20 -0
  131. package/dist/src/components/Stepper/OrigamStepper.vue +21 -1
  132. package/dist/src/components/Switch/OrigamSwitch.vue +20 -0
  133. package/dist/src/components/Switch/OrigamSwitchTrack.vue +12 -0
  134. package/dist/src/components/SystemBar/OrigamSystemBar.vue +12 -0
  135. package/dist/src/components/Table/OrigamTable.vue +20 -0
  136. package/dist/src/components/Tabs/OrigamTabs.vue +4 -0
  137. package/dist/src/components/TextField/OrigamTextField.vue +20 -0
  138. package/dist/src/components/TextareaField/OrigamTextareaField.vue +20 -0
  139. package/dist/src/components/Title/OrigamTitle.vue +16 -0
  140. package/dist/src/components/Toolbar/OrigamToolbar.vue +20 -0
  141. package/dist/src/components/Video/OrigamVideo.vue +20 -0
  142. package/dist/src/components/Window/OrigamWindow.vue +20 -0
  143. package/dist/src/composables/Commons/border.composable.cjs +24 -16
  144. package/dist/src/composables/Commons/border.composable.d.ts +31 -10
  145. package/dist/src/composables/Commons/border.composable.js +21 -17
  146. package/dist/src/composables/Commons/margin.composable.cjs +7 -0
  147. package/dist/src/composables/Commons/margin.composable.d.ts +7 -1
  148. package/dist/src/composables/Commons/margin.composable.js +5 -1
  149. package/dist/src/composables/Commons/padding.composable.cjs +7 -0
  150. package/dist/src/composables/Commons/padding.composable.d.ts +15 -1
  151. package/dist/src/composables/Commons/padding.composable.js +5 -1
  152. package/dist/src/composables/Commons/rounded.composable.cjs +7 -0
  153. package/dist/src/composables/Commons/rounded.composable.d.ts +14 -1
  154. package/dist/src/composables/Commons/rounded.composable.js +5 -1
  155. package/dist/src/composables/Commons/stateEffect.composable.cjs +60 -0
  156. package/dist/src/composables/Commons/stateEffect.composable.js +60 -0
  157. package/dist/src/consts/Blockquote/blockquote.const.cjs +38 -1
  158. package/dist/src/consts/Blockquote/blockquote.const.d.ts +113 -0
  159. package/dist/src/consts/Blockquote/blockquote.const.js +37 -0
  160. package/dist/src/consts/Commons/border.const.cjs +19 -2
  161. package/dist/src/consts/Commons/border.const.d.ts +65 -4
  162. package/dist/src/consts/Commons/border.const.js +16 -2
  163. package/dist/src/consts/Commons/spacing.const.cjs +40 -1
  164. package/dist/src/consts/Commons/spacing.const.d.ts +68 -1
  165. package/dist/src/consts/Commons/spacing.const.js +19 -1
  166. package/dist/src/consts/Commons/variant-preset.const.cjs +2 -0
  167. package/dist/src/consts/Commons/variant-preset.const.d.ts +19 -8
  168. package/dist/src/consts/Commons/variant-preset.const.js +2 -0
  169. package/dist/src/interfaces/Blockquote/blockquote.interface.d.ts +59 -4
  170. package/dist/src/interfaces/Bracket/bracket-match-component.interface.d.ts +2 -2
  171. package/dist/src/interfaces/Bracket/bracket-surface.interface.d.ts +39 -0
  172. package/dist/src/interfaces/Bracket/bracket.interface.d.ts +25 -4
  173. package/dist/src/interfaces/Commons/border.interface.d.ts +123 -0
  174. package/dist/src/interfaces/Commons/margin.interface.d.ts +35 -1
  175. package/dist/src/interfaces/Commons/padding.interface.d.ts +41 -1
  176. package/dist/src/interfaces/Commons/rounded.interface.d.ts +47 -4
  177. package/dist/src/types/Bracket/bracket.type.d.ts +82 -0
  178. package/dist/src/types/Commons/anchor.type.d.ts +48 -0
  179. package/dist/src/types/Commons/variant-preset.type.d.ts +22 -4
  180. package/dist/src/types/tokens.type.d.ts +1 -1
  181. package/dist/src/utils/Bracket/bracket-surface.util.cjs +19 -0
  182. package/dist/src/utils/Bracket/bracket-surface.util.js +10 -0
  183. package/dist/src/utils/Commons/border.util.d.ts +16 -8
  184. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -18,6 +18,124 @@ This project follows [Semantic Versioning](https://semver.org).
18
18
 
19
19
  ## [Unreleased]
20
20
 
21
+ ## [2.21.0] - 2026-10-01
22
+
23
+ ### Changed — ⚠️ `OrigamBlockquote` : le `variant` est un preset de props, plus un bloc SCSS
24
+
25
+ Deuxième composant converti après le pilote `OrigamKbd`, et premier de la **famille A** au sens de
26
+ la décision D5. Les cinq valeurs — `default`, `elegant`, `quoted`, `minimal`, `pull` — ne sont plus
27
+ cinq règles CSS : ce sont cinq `Partial<IBlockquoteProps>` dans
28
+ `consts/Blockquote/blockquote.const.ts`, résolus au rang **preset** du resolveur de props.
29
+
30
+ La garde `no-variant-css` passe de **32 à 27** entrées, sans aucune `Blockquote` restante.
31
+
32
+ **Ce que ça change pour un consommateur** : une prop écrite au site d'appel **bat désormais le
33
+ variant**. Avant, `<origam-blockquote variant="elegant" font-size="sm">` rendait 18px — la taille
34
+ du variant — et la prop était **inerte**. Elle peint maintenant.
35
+
36
+ ⚠️ **La classe `--variant-{valeur}` est conservée** et reste émise : c'est un crochet d'override
37
+ pour le consommateur. Mais le DS ne livre plus **aucune** règle qui la cible (décision D3), donc une
38
+ feuille applicative qui comptait sur la cascade du DS pour la styler ne trouve plus rien à battre.
39
+
40
+ ⚠️ **Deux effets quittent le variant pour une prop comportementale**, parce qu'ils n'étaient pas du
41
+ style : le marqueur de citation de `quoted` (il *monte un élément*) et l'alignement par défaut de
42
+ `pull`. L'exemption est désormais documentée **sur la prop**, au lieu d'être implicite dans une
43
+ règle CSS.
44
+
45
+ ### Removed — ⚠️ 8 tokens typographiques de variant
46
+
47
+ `--origam-blockquote__{elegant,minimal,pull}---{font-family,font-size,font-weight,line-height}`
48
+ sont retirés des 4 feuilles et de `TTokenName`. Ils n'avaient **plus aucun lecteur** une fois les
49
+ règles supprimées, et **aucun thème ne les lisait** : chaque échelon visé par le preset est
50
+ byte-pour-byte l'alias que la feuille portait déjà. Le canal de personnalisation n'est pas perdu,
51
+ il a changé de nature — il passe par `theme.variants['origam-blockquote']`, ce que D4 prévoit.
52
+
53
+ ⛔ **Le canal de thème des filets d'accent est préservé, et c'était la contrainte dure du lot.**
54
+ Vérifié en navigateur sur les 8 identités × 2 modes : le thème `editorial`, qui pose
55
+ `--origam-blockquote__accent---width: 3px`, rend **3px avant comme après**, les sept autres
56
+ identités rendant 4px — **zéro écart** sur les variants nus. Le preset porte la chaîne
57
+ `var(--origam-blockquote__accent---width, 4px)` et non une largeur en dur, précisément pour ça.
58
+
59
+ ### Fixed — une non-régression qui affirmait le contraire de ce qu'elle garantissait
60
+
61
+ `utility-cascade-padding-margin-950.spec.ts` échangeait la **classe** de variant et attendait que
62
+ le style suive — l'inverse de la décision D3, qui veut que cette classe ne porte aucun style du DS.
63
+ Réécrit sur le canal **inline**, avec le contrôle d'actuation qu'il n'avait jamais eu : la garantie
64
+ de #950 tient désormais par un mécanisme plus fort que la spécificité.
65
+
66
+ ## [2.20.0] - 2026-10-01
67
+
68
+ ### Added — la grille de props LOGIQUES PAR CÔTÉ, les 20 qui manquaient
69
+
70
+ Trois grilles de props directionnelles coexistent dans ce DS. Deux étaient complètes — la
71
+ **physique par côté** (`borderLeft`, `paddingLeft`, `marginLeft`, `roundedTopLeft`) et la
72
+ **logique par axe** (`borderInline`, `borderBlock`, `paddingInline`, `paddingBlock`,
73
+ `marginInline`, `marginBlock`). La troisième, **logique par côté**, était vide : **0 occurrence
74
+ sur 20**, mesurée.
75
+
76
+ C'était le dernier endroit où le dépôt faisait « moitié », ce que la directive conservée dans
77
+ `adr-007-directional-props.md` interdit : *« si un format existe, il existe partout »*.
78
+
79
+ | interface | props ajoutées | n |
80
+ |---|---|---|
81
+ | `IBorderProps` | `borderInlineStart/End`, `borderBlockStart/End` + leurs 4 `*Color` | 8 |
82
+ | `IPaddingProps` | `paddingInlineStart/End`, `paddingBlockStart/End` | 4 |
83
+ | `IMarginProps` | `marginInlineStart/End`, `marginBlockStart/End` | 4 |
84
+ | `IRoundedProps` | `roundedStartStart/StartEnd/EndStart/EndEnd` | 4 |
85
+
86
+ Câblage par **extension de table** : les cinq maps existantes (`BORDER_POSITION_MAP`,
87
+ `BORDER_LOGICAL_AXIS_MAP`, `PADDING_POSITION_MAP`, `MARGIN_POSITION_MAP`, `ROUNDED_CORNER_MAP`)
88
+ sont uniformément façonnées et leur corps de boucle fonctionne verbatim avec un côté logique.
89
+ Aucune grammaire nouvelle. Le vocabulaire partagé (`TLogicalSide`, `TLogicalCorner`) dérive des
90
+ enums existants `START_END` et `BORDER_LOGICAL_AXIS` — aucun enum créé.
91
+
92
+ **Précédence** : une arête physique et son équivalent logique sont deux orthographes de la même
93
+ arête, donc à spécificité identique. Les composables accumulent des déclarations rendues en style
94
+ **inline**, donc l'ordre de `push` *est* la précédence — le physique passe en dernier et gagne,
95
+ reproduisant le seul précédent déjà écrit dans le dépôt (`spacing.const.ts:85-88`).
96
+
97
+ ### Changed — ⚠️ `OrigamBracket` n'expose plus les props logiques qu'il n'honore pas
98
+
99
+ Rupture assumée, et elle ne retire rien qui peignait quoi que ce soit.
100
+
101
+ `OrigamBracket` ne peint pas sa propre racine : il route sa surface vers la carte de match par une
102
+ cascade de custom properties **entièrement physique, sans gestion RTL**. Le fait bloquant :
103
+ **aucune chaîne `var()` ne peut exprimer « le physique bat le logique »**, parce que la
104
+ substitution `var()` est aveugle au mode d'écriture alors que le mapping de la propriété ne l'est
105
+ pas. Les quatre combinaisons ont été dépliées ; chacune casse soit une prop physique existante,
106
+ soit le RTL.
107
+
108
+ Les interfaces à **zéro appel réel** sont donc restreintes par `Omit<>` — plutôt que de déclarer
109
+ une prop que la couche laisse tomber en silence, ce que le dépôt interdit nommément.
110
+
111
+ ⛔ **Restreindre par famille de composant aurait retiré des props qui fonctionnent** :
112
+ `OrigamBracketCompetitor` appelle réellement `useStateEffect`, et `OrigamBracketMatch` /
113
+ `OrigamBracketCompetitor` appellent `useRounded` côté rayon. Seules les interfaces sans aucun
114
+ appel sont touchées ; les autres gardent la surface complète.
115
+
116
+ **L'axe bloc est câblé, pas retiré.** `block-start` / `block-end` valent invariablement `top` /
117
+ `bottom` en `horizontal-tb`, Bracket ne déclare jamais `writing-mode`, et sa feuille faisait déjà
118
+ cette hypothèse pour `borderBlock` : les 4 props d'axe bloc sont donc **honorées**, pas omises.
119
+
120
+ La complétude de Bracket — convertir sa cascade en longhands logiques avec une vraie gestion RTL
121
+ — est suivie séparément. Un commentaire dans l'interface indique que *retirer l'`Omit<>` suffira*.
122
+
123
+ ### Documentation — le pattern `variant` = preset de props est figé
124
+
125
+ L'ADR-005 exigeait, après validation du pilote `OrigamKbd`, de *« freeze the pattern in
126
+ `CLAUDE.md` »*. Cette seconde moitié n'avait jamais été faite. Elle l'est, dérivée du pilote
127
+ réellement mergé et non de l'intention de l'ADR, avec la convention d'emplacement tranchée : une
128
+ table de preset vit dans le **fichier de consts existant** du composant.
129
+
130
+ ⚠️ **Quatre clauses de D7 étaient fausses** et sont corrigées, l'ancien état conservé en toutes
131
+ lettres. La principale : l'ADR pose un harnais de régression visuelle en « hard prerequisite »
132
+ pour `OrigamBtn` et affirme qu'il n'existe pas. **Il existe depuis le commit `876d675d9` du
133
+ 2026-08-12** et couvre les 7 valeurs de `variant` de Btn avec leurs baselines committées — soit
134
+ quatre mois avant la rédaction de la clause qui le déclare absent.
135
+
136
+ Les chiffres dérivés sont remesurés : **262** specs e2e (et non 175), **14** specs assertant sur
137
+ une classe `--variant-*` (et non 8), **7** baselines PNG committées (et non zéro).
138
+
21
139
  ## [2.19.0] - 2026-09-30
22
140
 
23
141
  ### Changed — ADR-005 lot 2 : `OrigamKbd` converti, ⚠️ deux ruptures