@zevra/ui 0.3.2 → 0.5.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 (143) hide show
  1. package/DECISIONS.md +25 -0
  2. package/README.md +83 -11
  3. package/dist/actions.d.ts +41 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +24 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/catalogue.d.ts +30 -0
  8. package/dist/catalogue.d.ts.map +1 -0
  9. package/dist/catalogue.js +830 -0
  10. package/dist/catalogue.js.map +1 -0
  11. package/dist/content.d.ts +135 -0
  12. package/dist/content.d.ts.map +1 -0
  13. package/dist/content.js +85 -0
  14. package/dist/content.js.map +1 -0
  15. package/dist/css-inline.d.ts +11 -0
  16. package/dist/css-inline.d.ts.map +1 -0
  17. package/dist/css-inline.js +13 -0
  18. package/dist/css-inline.js.map +1 -0
  19. package/dist/cx.d.ts +16 -0
  20. package/dist/cx.d.ts.map +1 -0
  21. package/dist/cx.js +20 -0
  22. package/dist/cx.js.map +1 -0
  23. package/dist/data.d.ts +136 -0
  24. package/dist/data.d.ts.map +1 -0
  25. package/dist/data.js +98 -0
  26. package/dist/data.js.map +1 -0
  27. package/dist/feedback.d.ts +88 -0
  28. package/dist/feedback.d.ts.map +1 -0
  29. package/dist/feedback.js +38 -0
  30. package/dist/feedback.js.map +1 -0
  31. package/dist/forms.d.ts +120 -0
  32. package/dist/forms.d.ts.map +1 -0
  33. package/dist/forms.js +60 -0
  34. package/dist/forms.js.map +1 -0
  35. package/dist/icon-data.d.ts +6 -0
  36. package/dist/icon-data.d.ts.map +1 -0
  37. package/dist/icon-data.js +77 -0
  38. package/dist/icon-data.js.map +1 -0
  39. package/dist/icon.d.ts +33 -0
  40. package/dist/icon.d.ts.map +1 -0
  41. package/dist/icon.js +13 -0
  42. package/dist/icon.js.map +1 -0
  43. package/dist/index.d.ts +13 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +41 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/layout.d.ts +166 -0
  48. package/dist/layout.d.ts.map +1 -0
  49. package/dist/layout.js +120 -0
  50. package/dist/layout.js.map +1 -0
  51. package/dist/navigation.d.ts +150 -0
  52. package/dist/navigation.d.ts.map +1 -0
  53. package/dist/navigation.js +104 -0
  54. package/dist/navigation.js.map +1 -0
  55. package/dist/overlays.d.ts +68 -0
  56. package/dist/overlays.d.ts.map +1 -0
  57. package/dist/overlays.js +114 -0
  58. package/dist/overlays.js.map +1 -0
  59. package/dist/surfaces.d.ts +61 -0
  60. package/dist/surfaces.d.ts.map +1 -0
  61. package/dist/surfaces.js +54 -0
  62. package/dist/surfaces.js.map +1 -0
  63. package/dist/typography.d.ts +89 -0
  64. package/dist/typography.d.ts.map +1 -0
  65. package/dist/typography.js +76 -0
  66. package/dist/typography.js.map +1 -0
  67. package/logos/index.json +10 -500
  68. package/package.json +36 -4
  69. package/react/actions.tsx +138 -0
  70. package/react/catalogue.tsx +1644 -0
  71. package/react/content.tsx +313 -0
  72. package/react/css-inline.ts +14 -0
  73. package/react/cx.ts +20 -0
  74. package/react/data.tsx +300 -0
  75. package/react/feedback.tsx +229 -0
  76. package/react/forms.tsx +383 -0
  77. package/react/icon-data.ts +114 -0
  78. package/react/icon.tsx +84 -0
  79. package/react/index.ts +42 -0
  80. package/react/layout.tsx +347 -0
  81. package/react/navigation.tsx +329 -0
  82. package/react/overlays.tsx +237 -0
  83. package/react/surfaces.tsx +161 -0
  84. package/react/typography.tsx +220 -0
  85. package/logos/png/campus-glyph-ink.png +0 -0
  86. package/logos/png/campus-glyph-white.png +0 -0
  87. package/logos/png/campus-lockup.png +0 -0
  88. package/logos/png/lexform-glyph-ink.png +0 -0
  89. package/logos/png/lexform-glyph-white.png +0 -0
  90. package/logos/png/lexform-lockup.png +0 -0
  91. package/logos/png/mcp-glyph-ink.png +0 -0
  92. package/logos/png/mcp-glyph-white.png +0 -0
  93. package/logos/png/mcp-lockup.png +0 -0
  94. package/logos/png/memoire-dark.png +0 -0
  95. package/logos/png/memoire-glyph-ink.png +0 -0
  96. package/logos/png/memoire-glyph-white.png +0 -0
  97. package/logos/png/memoire-lockup.png +0 -0
  98. package/logos/png/zevra-lockup-ink.png +0 -0
  99. package/logos/png/zevra-lockup-white.png +0 -0
  100. package/logos/png/zevra-lockup.png +0 -0
  101. package/logos/png/zevra-mark-ink.png +0 -0
  102. package/logos/png/zevra-mark-white.png +0 -0
  103. package/logos/png/zevra-mark.png +0 -0
  104. package/logos/svg/campus-glyph-ink.svg +0 -1
  105. package/logos/svg/campus-glyph-navy.svg +0 -1
  106. package/logos/svg/campus-glyph-orig.svg +0 -1
  107. package/logos/svg/campus-glyph-white.svg +0 -1
  108. package/logos/svg/campus-lockup-ink.svg +0 -1
  109. package/logos/svg/campus-lockup-navy.svg +0 -1
  110. package/logos/svg/campus-lockup-orig.svg +0 -1
  111. package/logos/svg/campus-lockup-white.svg +0 -1
  112. package/logos/svg/lexform-glyph-ink.svg +0 -1
  113. package/logos/svg/lexform-glyph-navy.svg +0 -1
  114. package/logos/svg/lexform-glyph-orig.svg +0 -1
  115. package/logos/svg/lexform-glyph-white.svg +0 -1
  116. package/logos/svg/lexform-lockup-ink.svg +0 -1
  117. package/logos/svg/lexform-lockup-navy.svg +0 -1
  118. package/logos/svg/lexform-lockup-orig.svg +0 -1
  119. package/logos/svg/lexform-lockup-white.svg +0 -1
  120. package/logos/svg/mcp-glyph-ink.svg +0 -1
  121. package/logos/svg/mcp-glyph-navy.svg +0 -1
  122. package/logos/svg/mcp-glyph-orig.svg +0 -1
  123. package/logos/svg/mcp-glyph-white.svg +0 -1
  124. package/logos/svg/mcp-lockup-ink.svg +0 -1
  125. package/logos/svg/mcp-lockup-navy.svg +0 -1
  126. package/logos/svg/mcp-lockup-orig.svg +0 -1
  127. package/logos/svg/mcp-lockup-white.svg +0 -1
  128. package/logos/svg/memoire-glyph-ink.svg +0 -1
  129. package/logos/svg/memoire-glyph-navy.svg +0 -1
  130. package/logos/svg/memoire-glyph-orig.svg +0 -1
  131. package/logos/svg/memoire-glyph-white.svg +0 -1
  132. package/logos/svg/memoire-lockup-ink.svg +0 -1
  133. package/logos/svg/memoire-lockup-navy.svg +0 -1
  134. package/logos/svg/memoire-lockup-orig.svg +0 -1
  135. package/logos/svg/memoire-lockup-white.svg +0 -1
  136. package/logos/svg/zevra-lockup-ink.svg +0 -1
  137. package/logos/svg/zevra-lockup-navy.svg +0 -1
  138. package/logos/svg/zevra-lockup-orig.svg +0 -1
  139. package/logos/svg/zevra-lockup-white.svg +0 -1
  140. package/logos/svg/zevra-mark-ink.svg +0 -1
  141. package/logos/svg/zevra-mark-navy.svg +0 -1
  142. package/logos/svg/zevra-mark-orig.svg +0 -1
  143. package/logos/svg/zevra-mark-white.svg +0 -1
@@ -0,0 +1,138 @@
1
+ // Actions — boutons et liens.
2
+ //
3
+ // AUCUN « use client » : ce ne sont que des <button> et des <a> habillés. Le
4
+ // déclarer en ferait des composants client chez tous les consommateurs Next,
5
+ // et leurs pages perdraient le rendu serveur pour rien.
6
+
7
+ import type {
8
+ AnchorHTMLAttributes,
9
+ ButtonHTMLAttributes,
10
+ HTMLAttributes,
11
+ ReactNode,
12
+ } from 'react'
13
+ import { cx } from './cx.js'
14
+
15
+ /** Variantes de bouton. Une seule pleine par écran — c'est la règle de charte. */
16
+ export type BoutonVariante = 'plein' | 'fantome' | 'encre'
17
+
18
+ const VARIANTE_BOUTON: Record<BoutonVariante, string> = {
19
+ plein: 'zv-btn',
20
+ fantome: 'zv-btn--ghost',
21
+ encre: 'zv-btn--ink',
22
+ }
23
+
24
+ export interface ButtonProps
25
+ extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className'> {
26
+ variante?: BoutonVariante
27
+ /** Hauteur réduite, pour une barre de navigation. */
28
+ compact?: boolean
29
+ /** Pleine largeur — l'appel à l'action d'un écran mobile. */
30
+ bloc?: boolean
31
+ /** Échappatoire assumée. À employer pour un ajustement de position, jamais
32
+ * pour redéfinir une couleur ou une taille : c'est par là que les apps
33
+ * recommencent à écrire leur propre charte. */
34
+ className?: string
35
+ children?: ReactNode
36
+ }
37
+
38
+ export function Button({
39
+ variante = 'plein',
40
+ compact,
41
+ bloc,
42
+ className,
43
+ type = 'button',
44
+ ...reste
45
+ }: ButtonProps) {
46
+ return (
47
+ <button
48
+ type={type}
49
+ className={cx(
50
+ VARIANTE_BOUTON[variante],
51
+ compact && 'zv-btn--sm',
52
+ bloc && 'zv-btn--block',
53
+ className,
54
+ )}
55
+ {...reste}
56
+ />
57
+ )
58
+ }
59
+
60
+ export interface ButtonLinkProps
61
+ extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className'> {
62
+ variante?: BoutonVariante
63
+ compact?: boolean
64
+ bloc?: boolean
65
+ className?: string
66
+ }
67
+
68
+ /** Le même bouton, mais qui navigue. Un <a> et un <button> ne s'échangent pas :
69
+ * l'un ouvre dans un onglet, se copie et s'indexe, l'autre non. */
70
+ export function ButtonLink({
71
+ variante = 'plein',
72
+ compact,
73
+ bloc,
74
+ className,
75
+ ...reste
76
+ }: ButtonLinkProps) {
77
+ return (
78
+ <a
79
+ className={cx(
80
+ VARIANTE_BOUTON[variante],
81
+ compact && 'zv-btn--sm',
82
+ bloc && 'zv-btn--block',
83
+ className,
84
+ )}
85
+ {...reste}
86
+ />
87
+ )
88
+ }
89
+
90
+ export interface ButtonRowProps
91
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {
92
+ /** Empile les boutons et les étire — la disposition mobile. */
93
+ empile?: boolean
94
+ className?: string
95
+ }
96
+
97
+ export function ButtonRow({ empile, className, ...reste }: ButtonRowProps) {
98
+ return (
99
+ <div
100
+ className={cx('zv-btn-row', empile && 'zv-btn-row--stack', className)}
101
+ {...reste}
102
+ />
103
+ )
104
+ }
105
+
106
+ export interface LinkArrowProps
107
+ extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className'> {
108
+ /** Sur la bande manifeste, où le lien passe en blanc. */
109
+ surSombre?: boolean
110
+ className?: string
111
+ children?: ReactNode
112
+ }
113
+
114
+ /** Lien fléché. La flèche est fournie : elle fait partie du composant, pas du
115
+ * contenu — la recopier à la main a produit trois tracés différents. */
116
+ export function LinkArrow({
117
+ surSombre,
118
+ className,
119
+ children,
120
+ ...reste
121
+ }: LinkArrowProps) {
122
+ return (
123
+ <a
124
+ className={cx(
125
+ 'zv-link-arrow',
126
+ surSombre && 'zv-link-arrow--on-dark',
127
+ className,
128
+ )}
129
+ {...reste}
130
+ >
131
+ {children}
132
+ <svg viewBox="0 0 24 24" aria-hidden="true">
133
+ <path d="M5 12h14" />
134
+ <path d="M13 6l6 6-6 6" />
135
+ </svg>
136
+ </a>
137
+ )
138
+ }