@zevra/ui 0.20.0 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,si9PAAsi9P,CAAA;AAEzk9P;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,03BAA03B,CAAA"}
1
+ {"version":3,"file":"css-inline.js","sourceRoot":"","sources":["../react/css-inline.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAE1E;;;iEAGiE;AACjE,MAAM,CAAC,MAAM,WAAW,GAAW,osiQAAosiQ,CAAA;AAEvuiQ;;;yBAGyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAW,03BAA03B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zevra/ui",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "description": "Design system Zevra « Encre & Papier » — tokens, CSS des composants et logos officiels.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
package/react/content.tsx CHANGED
@@ -247,21 +247,61 @@ export function Faq({ className, ...reste }: Div & { className?: string }) {
247
247
  return <div className={cx('zv-faq', className)} {...reste} />
248
248
  }
249
249
 
250
- export interface FaqItemProps extends Div {
250
+ export interface FaqItemProps
251
+ extends Omit<HTMLAttributes<HTMLDetailsElement>, 'className' | 'title'> {
251
252
  question: ReactNode
253
+ /** Dépliée au chargement. Une par page au plus : si toutes le sont, le
254
+ * repli ne sert plus à rien et la page redevient un mur. */
255
+ ouvert?: boolean
252
256
  className?: string
253
257
  children?: ReactNode
254
258
  }
255
259
 
256
- /** Rendu ouvert, sans repli : la réponse est le contenu, la cacher derrière
257
- * un clic n'ajoute rien à cinq questions. Pour un vrai accordéon, c'est un
258
- * `<details>` — et il n'existe pas de style pour lui dans le paquet. */
259
- export function FaqItem({ question, className, children, ...reste }: FaqItemProps) {
260
+ /** Une question qui se replie. `<details>`, donc AUCUN JavaScript : elle
261
+ * s'ouvre au clic, à Entrée et à Espace, elle est annoncée comme repliable,
262
+ * et la recherche du navigateur (⌘F) l'ouvre toute seule pour montrer ce
263
+ * qu'elle a trouvé.
264
+ *
265
+ * ⚠️ La réponse reste DANS LE DOM quand la question est fermée — `details`
266
+ * la masque, il ne la retire pas. C'est ce qui permet à une page de porter
267
+ * un balisage `FAQPage` honnête : ce que le moteur lit est bien ce que le
268
+ * visiteur peut ouvrir. Un accordéon qui démonte son contenu annoncerait
269
+ * des réponses absentes.
270
+ *
271
+ * Le chevron fait partie du composant, comme celui de `Fold` et la flèche
272
+ * de `LinkArrow` : recopié à la main, il finit par diverger.
273
+ *
274
+ * `question` accepte un TITRE (`<h3>Ma question</h3>`) : une FAQ de vitrine
275
+ * veut ses questions dans le plan du document — c'est ce que lisent les
276
+ * moteurs, et ce que parcourt un lecteur d'écran qui saute de titre en
277
+ * titre. Le CSS lui retire ce que le navigateur lui met : le niveau reste
278
+ * au balisage, l'apparence au système. */
279
+ export function FaqItem({
280
+ question,
281
+ ouvert,
282
+ className,
283
+ children,
284
+ ...reste
285
+ }: FaqItemProps) {
260
286
  return (
261
- <div className={className} {...reste}>
262
- <p className="zv-faq__q">{question}</p>
287
+ <details className={cx('zv-faq__item', className)} open={ouvert} {...reste}>
288
+ <summary className="zv-faq__q">
289
+ {question}
290
+ <svg
291
+ className="zv-faq__chevron"
292
+ viewBox="0 0 24 24"
293
+ fill="none"
294
+ stroke="currentColor"
295
+ strokeWidth="2"
296
+ strokeLinecap="square"
297
+ strokeLinejoin="miter"
298
+ aria-hidden="true"
299
+ >
300
+ <path d="M6.67 9.33 L12 14.67 L17.33 9.33" />
301
+ </svg>
302
+ </summary>
263
303
  <p className="zv-faq__a">{children}</p>
264
- </div>
304
+ </details>
265
305
  )
266
306
  }
267
307