@udixio/mcp 0.3.2
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/README.md +127 -0
- package/dist/bundled/components-index.json +369 -0
- package/dist/bundled/doc-src/components/Code.astro +14 -0
- package/dist/bundled/doc-src/components/ComponentPreview.astro +218 -0
- package/dist/bundled/doc-src/data/components/button.overview.mdx +152 -0
- package/dist/bundled/doc-src/data/components/card.overview.mdx +91 -0
- package/dist/bundled/doc-src/data/components/carousel.overview.mdx +108 -0
- package/dist/bundled/doc-src/data/components/checkbox.overview.mdx +172 -0
- package/dist/bundled/doc-src/data/components/chip.overview.mdx +216 -0
- package/dist/bundled/doc-src/data/components/date-picker.overview.mdx +102 -0
- package/dist/bundled/doc-src/data/components/divider.overview.mdx +54 -0
- package/dist/bundled/doc-src/data/components/fab-menu.overview.mdx +69 -0
- package/dist/bundled/doc-src/data/components/fab.overview.mdx +80 -0
- package/dist/bundled/doc-src/data/components/icon-button.overview.mdx +155 -0
- package/dist/bundled/doc-src/data/components/navigation-rail.overview.mdx +142 -0
- package/dist/bundled/doc-src/data/components/progress-indicator.overview.mdx +49 -0
- package/dist/bundled/doc-src/data/components/slider.overview.mdx +64 -0
- package/dist/bundled/doc-src/data/components/snackbar.overview.mdx +37 -0
- package/dist/bundled/doc-src/data/components/switch.overview.mdx +41 -0
- package/dist/bundled/doc-src/data/components/tabs.overview.mdx +171 -0
- package/dist/bundled/doc-src/data/components/temp.md +506 -0
- package/dist/bundled/doc-src/data/components/text-field.overview.mdx +90 -0
- package/dist/bundled/doc-src/data/components/tooltip.overview.mdx +159 -0
- package/dist/bundled/doc-src/data/pages/mcp.mdx +92 -0
- package/dist/bundled/doc-src/layouts/components.astro +87 -0
- package/dist/bundled/doc-src/layouts/layout.astro +55 -0
- package/dist/bundled/doc-src/pages/404.astro +18 -0
- package/dist/bundled/doc-src/pages/[...url].astro +34 -0
- package/dist/bundled/doc-src/pages/animations.astro +322 -0
- package/dist/bundled/doc-src/pages/components/[component]/api.astro +89 -0
- package/dist/bundled/doc-src/pages/components/[component]/index.astro +5 -0
- package/dist/bundled/doc-src/pages/components/[component]/overview.astro +37 -0
- package/dist/bundled/doc-src/pages/components/index.astro +130 -0
- package/dist/bundled/doc-src/pages/index.astro +5 -0
- package/dist/bundled/doc-src/pages/search.astro +12 -0
- package/dist/bundled/doc-src/pages/themes.astro +86 -0
- package/dist/bundled/theme.json +359 -0
- package/dist/cli.mjs +450 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +5 -0
- package/dist/lib/cli.d.ts +3 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/loaders/components.d.ts +6 -0
- package/dist/lib/loaders/components.d.ts.map +1 -0
- package/dist/lib/loaders/docs.d.ts +11 -0
- package/dist/lib/loaders/docs.d.ts.map +1 -0
- package/dist/lib/loaders/theme.d.ts +37 -0
- package/dist/lib/loaders/theme.d.ts.map +1 -0
- package/dist/lib/main.d.ts +3 -0
- package/dist/lib/main.d.ts.map +1 -0
- package/dist/lib/mcp.d.ts +3 -0
- package/dist/lib/mcp.d.ts.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '../layouts/layout.astro';
|
|
3
|
+
import { Button, Card, Divider } from '@udixio/ui-react';
|
|
4
|
+
import ClassNamePreview from '../components/ClassNamePreview';
|
|
5
|
+
---
|
|
6
|
+
<Layout>
|
|
7
|
+
<section class="relative overflow-hidden">
|
|
8
|
+
<div class="container mx-auto px-6 py-16 lg:py-24">
|
|
9
|
+
<h1 class="anim-fade anim-slide-from-top anim-duration-700 text-4xl md:text-6xl font-extrabold tracking-tight text-on-surface">
|
|
10
|
+
Animate on Scroll — Démo
|
|
11
|
+
</h1>
|
|
12
|
+
<p class="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-200 mt-4 max-w-2xl text-lg/8 text-on-surface-variant">
|
|
13
|
+
Cette page présente deux façons de déclencher les animations : via <strong>anim-in/anim-out</strong> (JS)
|
|
14
|
+
ou via <strong>anim-view</strong> (Scroll‑Driven CSS). Choisissez l’un <em>ou</em> l’autre : les entrées <code>anim-in</code>
|
|
15
|
+
ne sont pas compatibles avec <code>anim-view</code>. Avec <code>anim-view</code>, les paramètres <code>duration</code>
|
|
16
|
+
et <code>delay</code> n’ont pas d’effet car la progression est entièrement synchronisée au pourcentage de scroll.
|
|
17
|
+
</p>
|
|
18
|
+
<div class="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-300 mt-8 flex items-center gap-3">
|
|
19
|
+
<Button variant="filled">Commencer</Button>
|
|
20
|
+
<Button variant="outlined">Documentation</Button>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</section>
|
|
24
|
+
|
|
25
|
+
<Divider className="my-10" />
|
|
26
|
+
|
|
27
|
+
<section class="container mx-auto px-6">
|
|
28
|
+
<h2 class="text-2xl font-bold">Déclencheurs et effets disponibles</h2>
|
|
29
|
+
<p class="mt-2 text-on-surface-variant">
|
|
30
|
+
Il existe 3 déclencheurs: <strong>in</strong> (entrée), <strong>out</strong> (sortie), et <strong>scroll</strong> (anim-view).
|
|
31
|
+
Chaque déclencheur peut utiliser les effets suivants: <code>fade</code>, <code>scale</code>, <code>slide</code>.
|
|
32
|
+
Vous pouvez combiner plusieurs effets, par exemple <code>anim-fade</code> + <code>anim-slide-from-bottom</code> + <code>anim-scale</code>.
|
|
33
|
+
</p>
|
|
34
|
+
<div class="mt-6 grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
35
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-500">
|
|
36
|
+
<h3 class="text-title-large font-semibold">Trigger: in</h3>
|
|
37
|
+
<p class="mt-2 text-on-surface-variant">Démarre à l'entrée dans le viewport.</p>
|
|
38
|
+
</ClassNamePreview>
|
|
39
|
+
<ClassNamePreview className="anim-fade-out anim-slide-out-from-top anim-duration-500">
|
|
40
|
+
<h3 class="text-title-large font-semibold">Trigger: out</h3>
|
|
41
|
+
<p class="mt-2 text-on-surface-variant">Se joue à la sortie du viewport.</p>
|
|
42
|
+
</ClassNamePreview>
|
|
43
|
+
<ClassNamePreview className="anim-fade-scroll anim-slide-scroll-from-bottom anim-scroll">
|
|
44
|
+
<h3 class="text-title-large font-semibold">Trigger: scroll (anim-view)</h3>
|
|
45
|
+
<p class="mt-2 text-on-surface-variant">Synchronisé au défilement, sans duration ni delay.</p>
|
|
46
|
+
</ClassNamePreview>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="mt-6 text-on-surface-variant text-sm">
|
|
49
|
+
<p>Effets disponibles:</p>
|
|
50
|
+
<ul class="list-disc pl-6">
|
|
51
|
+
<li><code>fade</code> — transparence via <code>anim-fade</code> (+ option <code>anim-fade-50</code>...).</li>
|
|
52
|
+
<li><code>scale</code> — zoom via <code>anim-scale</code>, ou axes <code>anim-scale-x-*</code>/<code>anim-scale-y-*</code>.</li>
|
|
53
|
+
<li><code>slide</code> — déplacement via <code>anim-slide-from-*</code> avec distances (<code>anim-slide-8</code>, <code>anim-slide-full</code>...).</li>
|
|
54
|
+
</ul>
|
|
55
|
+
</div>
|
|
56
|
+
</section>
|
|
57
|
+
|
|
58
|
+
<Divider className="my-16" />
|
|
59
|
+
|
|
60
|
+
<section class="container mx-auto px-6">
|
|
61
|
+
<h2 class="text-2xl font-bold">Exemples basiques (JS — anim-in)</h2>
|
|
62
|
+
<p class="mt-2 text-on-surface-variant">
|
|
63
|
+
Variantes de base côté JS : fade-in, anim-slide-from-top/bottom/left/right, scale-in et scale-out.
|
|
64
|
+
</p>
|
|
65
|
+
|
|
66
|
+
<div class="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
67
|
+
<ClassNamePreview className="anim-fade-in anim-fade anim-fade-50">
|
|
68
|
+
<h3 class="text-title-large font-semibold">Fade</h3>
|
|
69
|
+
<p class="mt-2 text-on-surface-variant">Apparition progressive.</p>
|
|
70
|
+
</ClassNamePreview>
|
|
71
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 ">
|
|
72
|
+
<h3 class="text-title-large font-semibold">Fade Up</h3>
|
|
73
|
+
<p class="mt-2 text-on-surface-variant">Glisse vers le haut.</p>
|
|
74
|
+
</ClassNamePreview>
|
|
75
|
+
<ClassNamePreview className="anim-fade anim-slide-left anim-slide-full anim-duration-700 ">
|
|
76
|
+
<h3 class="text-title-large font-semibold">Fade Down</h3>
|
|
77
|
+
<p class="mt-2 text-on-surface-variant">Glisse vers le bas.</p>
|
|
78
|
+
</ClassNamePreview>
|
|
79
|
+
<ClassNamePreview className="anim-in-fade anim-slide-from-left anim-duration-700 ">
|
|
80
|
+
<h3 class="text-title-large font-semibold">Fade Left</h3>
|
|
81
|
+
<p class="mt-2 text-on-surface-variant">Glisse depuis la gauche.</p>
|
|
82
|
+
</ClassNamePreview>
|
|
83
|
+
<ClassNamePreview className="anim-fade anim-slide-from-right anim-duration-700 ">
|
|
84
|
+
<h3 class="text-title-large font-semibold">Fade Right</h3>
|
|
85
|
+
<p class="mt-2 text-on-surface-variant">Glisse depuis la droite.</p>
|
|
86
|
+
</ClassNamePreview>
|
|
87
|
+
<ClassNamePreview className="anim-scale-in anim-duration-700 ">
|
|
88
|
+
<h3 class="text-title-large font-semibold">scale In</h3>
|
|
89
|
+
<p class="mt-2 text-on-surface-variant">scale avant léger.</p>
|
|
90
|
+
</ClassNamePreview>
|
|
91
|
+
<ClassNamePreview className="anim-scale-out anim-duration-700 sm:col-span-2 lg:col-span-1">
|
|
92
|
+
<h3 class="text-title-large font-semibold">scale Out</h3>
|
|
93
|
+
<p class="mt-2 text-on-surface-variant">scale arrière léger.</p>
|
|
94
|
+
</ClassNamePreview>
|
|
95
|
+
</div>
|
|
96
|
+
</section>
|
|
97
|
+
|
|
98
|
+
<Divider className="my-16" />
|
|
99
|
+
|
|
100
|
+
<section class="container mx-auto px-6">
|
|
101
|
+
<h2 class="text-2xl font-bold">Scroll‑Driven (anim-view)</h2>
|
|
102
|
+
<p class="mt-2 text-on-surface-variant">
|
|
103
|
+
Ces éléments utilisent <code>anim-view</code> et une timeline CSS scroll‑driven. Ils sont synchronisés au scroll :
|
|
104
|
+
<strong>pas de duration ni de delay</strong> (ces valeurs sont ignorées).
|
|
105
|
+
</p>
|
|
106
|
+
<div class="mt-8 h-screen relative flex items-end ">
|
|
107
|
+
<ClassNamePreview className="anim-slide-scroll-from-bottom-right anim-scale-scroll anim-scale-150 anim-fade anim-duration-[2s] anim-slide-full anim-scroll w-fit sticky bottom-0 anim-scroll-end-cover-3/4">
|
|
108
|
+
<h3 class="text-title-large font-semibold">Scroll — Fade</h3>
|
|
109
|
+
<p class="mt-2 text-on-surface-variant">Progression liée au scroll.</p>
|
|
110
|
+
</ClassNamePreview>
|
|
111
|
+
</div>
|
|
112
|
+
</section>
|
|
113
|
+
|
|
114
|
+
<Divider className="my-16" />
|
|
115
|
+
|
|
116
|
+
<section class="container mx-auto px-6">
|
|
117
|
+
<h2 class="text-2xl font-bold">Durées & Easing (JS — anim-in)</h2>
|
|
118
|
+
<p class="mt-2 text-on-surface-variant">
|
|
119
|
+
Contrôlez la vitesse et l’interpolation avec les utilitaires : anim-duration-*, anim-ease-*, anim-delay-*.
|
|
120
|
+
</p>
|
|
121
|
+
|
|
122
|
+
<div class="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
123
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-300 anim-ease-linear ">
|
|
124
|
+
<h3 class="text-title-large font-semibold">Rapide (300ms, linear)</h3>
|
|
125
|
+
<p class="mt-2 text-on-surface-variant">Idéal pour des micro-transitions.</p>
|
|
126
|
+
</ClassNamePreview>
|
|
127
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-ease-out ">
|
|
128
|
+
<h3 class="text-title-large font-semibold">Standard (700ms, ease-out)</h3>
|
|
129
|
+
<p class="mt-2 text-on-surface-variant">Courbe douce vers la fin.</p>
|
|
130
|
+
</ClassNamePreview>
|
|
131
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-[1200ms] anim-ease-out ">
|
|
132
|
+
<h3 class="text-title-large font-semibold">Lent (1200ms)</h3>
|
|
133
|
+
<p class="mt-2 text-on-surface-variant">Accentue la sensation de fluidité.</p>
|
|
134
|
+
</ClassNamePreview>
|
|
135
|
+
<ClassNamePreview className="anim-fade anim-slide-from-right anim-duration-700 anim-delay-150 ">
|
|
136
|
+
<h3 class="text-title-large font-semibold">Delay 150ms</h3>
|
|
137
|
+
<p class="mt-2 text-on-surface-variant">Différer l’entrée pour rythmer.</p>
|
|
138
|
+
</ClassNamePreview>
|
|
139
|
+
<ClassNamePreview className="anim-fade anim-slide-from-right anim-duration-700 anim-delay-300 ">
|
|
140
|
+
<h3 class="text-title-large font-semibold">Delay 300ms</h3>
|
|
141
|
+
<p class="mt-2 text-on-surface-variant">Utilisez des décalages en série.</p>
|
|
142
|
+
</ClassNamePreview>
|
|
143
|
+
<ClassNamePreview className="anim-fade anim-slide-from-right anim-duration-700 anim-delay-500 ">
|
|
144
|
+
<h3 class="text-title-large font-semibold">Delay 500ms</h3>
|
|
145
|
+
<p class="mt-2 text-on-surface-variant">Pour une chorégraphie plus marquée.</p>
|
|
146
|
+
</ClassNamePreview>
|
|
147
|
+
</div>
|
|
148
|
+
</section>
|
|
149
|
+
|
|
150
|
+
<Divider className="my-16" />
|
|
151
|
+
|
|
152
|
+
<section class="container mx-auto px-6">
|
|
153
|
+
<h2 class="text-2xl font-bold">Listes en cascade (JS — anim-in)</h2>
|
|
154
|
+
<p class="mt-2 text-on-surface-variant">
|
|
155
|
+
Appliquez des délais croissants pour simuler un effet de cascade.
|
|
156
|
+
</p>
|
|
157
|
+
|
|
158
|
+
<div class="mt-8 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
159
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700">
|
|
160
|
+
<h3 class="font-semibold">Élément 1</h3>
|
|
161
|
+
<p class="text-on-surface-variant">anim-delay-0</p>
|
|
162
|
+
</ClassNamePreview>
|
|
163
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-150">
|
|
164
|
+
<h3 class="font-semibold">Élément 2</h3>
|
|
165
|
+
<p class="text-on-surface-variant">anim-delay-150</p>
|
|
166
|
+
</ClassNamePreview>
|
|
167
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-300">
|
|
168
|
+
<h3 class="font-semibold">Élément 3</h3>
|
|
169
|
+
<p class="text-on-surface-variant">anim-delay-300</p>
|
|
170
|
+
</ClassNamePreview>
|
|
171
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-500">
|
|
172
|
+
<h3 class="font-semibold">Élément 4</h3>
|
|
173
|
+
<p class="text-on-surface-variant">anim-delay-500</p>
|
|
174
|
+
</ClassNamePreview>
|
|
175
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-[700ms]">
|
|
176
|
+
<h3 class="font-semibold">Élément 5</h3>
|
|
177
|
+
<p class="text-on-surface-variant">anim-delay-700ms</p>
|
|
178
|
+
</ClassNamePreview>
|
|
179
|
+
<ClassNamePreview className="anim-fade anim-slide-from-bottom anim-duration-700 anim-delay-[900ms]">
|
|
180
|
+
<h3 class="font-semibold">Élément 6</h3>
|
|
181
|
+
<p class="text-on-surface-variant">anim-delay-900ms</p>
|
|
182
|
+
</ClassNamePreview>
|
|
183
|
+
</div>
|
|
184
|
+
</section>
|
|
185
|
+
|
|
186
|
+
<Divider className="my-16" />
|
|
187
|
+
|
|
188
|
+
<section class="container mx-auto px-6 pb-24">
|
|
189
|
+
<h2 class="text-2xl font-bold">Paramètres visuels — exemples</h2>
|
|
190
|
+
<p class="mt-2 text-on-surface-variant">
|
|
191
|
+
Chaque effet accepte des paramètres. Voici des aperçus concrets pour les régler visuellement.
|
|
192
|
+
</p>
|
|
193
|
+
<div class="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
194
|
+
<ClassNamePreview className="anim-scale anim-scale-125 anim-duration-700">
|
|
195
|
+
<h3 class="text-title-large font-semibold">Scale 125%</h3>
|
|
196
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-scale-125</code></p>
|
|
197
|
+
</ClassNamePreview>
|
|
198
|
+
<ClassNamePreview className="anim-scale anim-scale-x-150 anim-duration-700">
|
|
199
|
+
<h3 class="text-title-large font-semibold">Scale X 150%</h3>
|
|
200
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-scale-x-150</code></p>
|
|
201
|
+
</ClassNamePreview>
|
|
202
|
+
<ClassNamePreview className="anim-scale anim-scale-y-90 anim-duration-700">
|
|
203
|
+
<h3 class="text-title-large font-semibold">Scale Y 90%</h3>
|
|
204
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-scale-y-90</code></p>
|
|
205
|
+
</ClassNamePreview>
|
|
206
|
+
<ClassNamePreview className="anim-fade anim-fade-50 anim-duration-700">
|
|
207
|
+
<h3 class="text-title-large font-semibold">Fade 50%</h3>
|
|
208
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-fade-50</code></p>
|
|
209
|
+
</ClassNamePreview>
|
|
210
|
+
<ClassNamePreview className="anim-slide-from-left anim-slide-8 anim-duration-700">
|
|
211
|
+
<h3 class="text-title-large font-semibold">Slide 2rem</h3>
|
|
212
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-slide-from-left anim-slide-8</code></p>
|
|
213
|
+
</ClassNamePreview>
|
|
214
|
+
<ClassNamePreview className="anim-slide-from-right anim-slide-full anim-duration-700">
|
|
215
|
+
<h3 class="text-title-large font-semibold">Slide full</h3>
|
|
216
|
+
<p class="mt-2 text-on-surface-variant"><code>anim-slide-from-right anim-slide-full</code></p>
|
|
217
|
+
</ClassNamePreview>
|
|
218
|
+
</div>
|
|
219
|
+
<div class="mt-6 text-sm text-on-surface-variant">
|
|
220
|
+
<p>Astuce: combinez plusieurs effets. Exemple: <code>anim-fade</code> + <code>anim-slide-from-bottom</code> + <code>anim-scale-105</code>.</p>
|
|
221
|
+
</div>
|
|
222
|
+
</section>
|
|
223
|
+
|
|
224
|
+
<Divider className="my-16" />
|
|
225
|
+
|
|
226
|
+
<section class="container mx-auto px-6 pb-24">
|
|
227
|
+
<h2 class="text-2xl font-bold">Combinaisons (JS — anim-in)</h2>
|
|
228
|
+
<p class="mt-2 text-on-surface-variant">
|
|
229
|
+
Combinez les variantes pour des mises en scène plus riches.
|
|
230
|
+
</p>
|
|
231
|
+
|
|
232
|
+
<div class="mt-8 grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
233
|
+
<Card className="p-6">
|
|
234
|
+
<div class="anim-fade anim-slide-from-top anim-duration-700">
|
|
235
|
+
<h3 class="text-title-large font-semibold">Bloc A</h3>
|
|
236
|
+
<p class="mt-1 text-on-surface-variant">Titre en fade-down</p>
|
|
237
|
+
</div>
|
|
238
|
+
<div class="anim-fade anim-slide-from-bottom anim-duration-[1000ms] anim-delay-200 mt-4">
|
|
239
|
+
<p>
|
|
240
|
+
Contenu en fade-up plus lent, avec un léger délai. Idéal pour raconter une histoire lors du défilement.
|
|
241
|
+
</p>
|
|
242
|
+
</div>
|
|
243
|
+
<div class="anim-scale-in anim-duration-700 anim-delay-400 mt-6">
|
|
244
|
+
<Button variant="filled">Action principale</Button>
|
|
245
|
+
</div>
|
|
246
|
+
</Card>
|
|
247
|
+
|
|
248
|
+
<Card className="p-6">
|
|
249
|
+
<div class="grid grid-cols-2 gap-4">
|
|
250
|
+
<div class="anim-fade anim-slide-from-left anim-duration-700">
|
|
251
|
+
<div class="h-24 rounded-lg bg-surface-container"></div>
|
|
252
|
+
<p class="mt-2 text-on-surface-variant">fade-left</p>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="anim-fade anim-slide-from-right anim-duration-700">
|
|
255
|
+
<div class="h-24 rounded-lg bg-surface-container"></div>
|
|
256
|
+
<p class="mt-2 text-on-surface-variant">fade-right</p>
|
|
257
|
+
</div>
|
|
258
|
+
<div class="anim-scale-out anim-duration-700 anim-delay-200">
|
|
259
|
+
<div class="h-24 rounded-lg bg-surface-container"></div>
|
|
260
|
+
<p class="mt-2 text-on-surface-variant">scale-out</p>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="anim-scale-in anim-duration-700 anim-delay-300">
|
|
263
|
+
<div class="h-24 rounded-lg bg-surface-container"></div>
|
|
264
|
+
<p class="mt-2 text-on-surface-variant">scale-in</p>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
</Card>
|
|
268
|
+
</div>
|
|
269
|
+
</section>
|
|
270
|
+
|
|
271
|
+
<Divider className="my-16" />
|
|
272
|
+
|
|
273
|
+
<section class="container mx-auto px-6">
|
|
274
|
+
<h2 class="text-2xl font-bold">Entrées JS (sans anim-view)</h2>
|
|
275
|
+
<p class="mt-2 text-on-surface-variant">
|
|
276
|
+
Ces éléments n’utilisent <strong>pas</strong> anim-view. Ils sont déclenchés en JavaScript via IntersectionObserver
|
|
277
|
+
par le composant <code>AnimateOnScroll</code> et démarrent quand ils entrent dans le viewport.
|
|
278
|
+
</p>
|
|
279
|
+
|
|
280
|
+
<div class="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
281
|
+
<ClassNamePreview className="anim-fade-50 anim-slide-from-bottom anim-duration-700 p-6">
|
|
282
|
+
<h3 class="text-title-large font-semibold">JS — Fade Up</h3>
|
|
283
|
+
<p class="mt-2 text-on-surface-variant">Sans anim-view, déclenché à l’entrée.</p>
|
|
284
|
+
</ClassNamePreview>
|
|
285
|
+
<ClassNamePreview className="anim-fade anim-slide-from-left anim-duration-700 p-6">
|
|
286
|
+
<h3 class="text-title-large font-semibold">JS — Fade Left</h3>
|
|
287
|
+
<p class="mt-2 text-on-surface-variant">Purement via observer JS.</p>
|
|
288
|
+
</ClassNamePreview>
|
|
289
|
+
<ClassNamePreview className="anim-scale-in anim-duration-700 p-6">
|
|
290
|
+
<h3 class="text-title-large font-semibold">JS — scale In</h3>
|
|
291
|
+
<p class="mt-2 text-on-surface-variant">Aucune timeline CSS; déclencheur JS.</p>
|
|
292
|
+
</ClassNamePreview>
|
|
293
|
+
</div>
|
|
294
|
+
</section>
|
|
295
|
+
|
|
296
|
+
<Divider className="my-16" />
|
|
297
|
+
|
|
298
|
+
<section class="container mx-auto px-6 pb-32">
|
|
299
|
+
<h2 class="text-2xl font-bold">Sorties JS (anim-out)</h2>
|
|
300
|
+
<p class="mt-2 text-on-surface-variant">
|
|
301
|
+
Ces éléments emploient <code>anim-out</code>. Ils jouent leur animation lorsque vous <em>quittez</em> leur zone
|
|
302
|
+
de vue (en les faisant sortir du viewport). Faites défiler doucement pour voir l’effet.
|
|
303
|
+
</p>
|
|
304
|
+
|
|
305
|
+
<div class="mt-8 space-y-8">
|
|
306
|
+
<Card className="anim-fade-out anim-slide-out-from-bottom anim-duration-700 p-6">
|
|
307
|
+
<h3 class="text-title-large font-semibold">JS — Exit vers le bas</h3>
|
|
308
|
+
<p class="mt-2 text-on-surface-variant">Se joue lorsque la carte sort de l’écran.</p>
|
|
309
|
+
</Card>
|
|
310
|
+
<div class="h-32"></div>
|
|
311
|
+
<Card className="anim-fade-out anim-slide-out-from-top anim-duration-700 p-6">
|
|
312
|
+
<h3 class="text-title-large font-semibold">JS — Exit vers le haut</h3>
|
|
313
|
+
<p class="mt-2 text-on-surface-variant">Se joue en remontant, quand la carte quitte le viewport.</p>
|
|
314
|
+
</Card>
|
|
315
|
+
<div class="h-32"></div>
|
|
316
|
+
<Card className="anim-scale-out anim-scale-90 anim-duration-700 p-6">
|
|
317
|
+
<h3 class="text-title-large font-semibold">JS — Scale Out</h3>
|
|
318
|
+
<p class="mt-2 text-on-surface-variant">Effet de sortie en scale arrière.</p>
|
|
319
|
+
</Card>
|
|
320
|
+
</div>
|
|
321
|
+
</section>
|
|
322
|
+
</Layout>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { getCollection, render } from 'astro:content';
|
|
3
|
+
import Layout from '@/layouts/layout.astro';
|
|
4
|
+
import Code from '@/components/Code.astro';
|
|
5
|
+
import { Button, Card } from '@udixio/ui-react';
|
|
6
|
+
import { noCase, sentenceCase } from 'change-case';
|
|
7
|
+
import Components from '@/layouts/components.astro';
|
|
8
|
+
import { ComponentSidebar } from '@/components/ComponentSidebar.tsx';
|
|
9
|
+
|
|
10
|
+
export async function getStaticPaths() {
|
|
11
|
+
const overviews = await getCollection('api');
|
|
12
|
+
return overviews.map(overview => ({
|
|
13
|
+
params: { component: overview.id },
|
|
14
|
+
props: { overview }
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { overview } = Astro.props;
|
|
19
|
+
const { component } = Astro.params;
|
|
20
|
+
const { Content, headings } = await render(overview);
|
|
21
|
+
|
|
22
|
+
const apis = await getCollection('api');
|
|
23
|
+
const componentApi = apis.find(api => api.id === component);
|
|
24
|
+
|
|
25
|
+
function extractCondition(desc) {
|
|
26
|
+
if (!desc) return null;
|
|
27
|
+
// Heuristic: pull sentence mentioning "Only applies" or "S'applique uniquement"
|
|
28
|
+
const match = desc.match(/([^.!?]*\bOnly applies\b[^.!?]*[.!?])|([^.!?]*S'applique uniquement[^.!?]*[.!?])/i);
|
|
29
|
+
return match ? match[0] : null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function formatDefault(def) {
|
|
33
|
+
if (!def || typeof def.value === 'undefined' || def.value === null) return '—';
|
|
34
|
+
const v = def.value;
|
|
35
|
+
if (typeof v === 'string') return v; // values like medium, filled come already as string
|
|
36
|
+
return String(v);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!componentApi) {
|
|
40
|
+
return Astro.redirect('/404', 404);
|
|
41
|
+
}
|
|
42
|
+
---
|
|
43
|
+
<Components>
|
|
44
|
+
<Fragment slot="header"> <!-- pass table header -->
|
|
45
|
+
<h1 class="text-display-large ">{sentenceCase(noCase(componentApi.id))}</h1>
|
|
46
|
+
<p class="text-headline-small mt-8">{componentApi.data.description}</p>
|
|
47
|
+
</Fragment>
|
|
48
|
+
<Card variant='filled' className="mt-10 overflow-x-auto bg-surface-container">
|
|
49
|
+
<table class="w-full min-w-[800px] text-start border-collapse border-spacing-y-2 divide-y divide-outline-variant ">
|
|
50
|
+
<caption class="sr-only">Tableau des propriétés et de l'API du composant</caption>
|
|
51
|
+
<thead>
|
|
52
|
+
<tr class="text-title-small text-on-surface-variant divide-x divide-outline-variant ">
|
|
53
|
+
<th class="py-2 pe-4">Propriété</th>
|
|
54
|
+
<th class="py-2 pe-4">Type</th>
|
|
55
|
+
<th class="py-2 pe-4">Obligatoire</th>
|
|
56
|
+
<th class="py-2 pe-4">Valeur par défaut</th>
|
|
57
|
+
<th class="py-2 pe-4">Description</th>
|
|
58
|
+
<th class="py-2">Condition</th>
|
|
59
|
+
</tr>
|
|
60
|
+
</thead>
|
|
61
|
+
<tbody class="divide-y divide-x divide-outline-variant">
|
|
62
|
+
{Object.values(componentApi.data.props).map((prop) => {
|
|
63
|
+
const condition = extractCondition(prop.description);
|
|
64
|
+
return (
|
|
65
|
+
<tr class="align-top text-center divide-x divide-outline-variant ">
|
|
66
|
+
<td class="py-3 pe-4 whitespace-nowrap">
|
|
67
|
+
<code class="inline-block px-1.5 py-0.5 rounded bg-black/5">{prop.name}</code>
|
|
68
|
+
</td>
|
|
69
|
+
<td class="py-3 pe-4">
|
|
70
|
+
<code class="inline-block px-1.5 py-0.5 rounded bg-black/5">{prop.type?.name ?? '—'}</code>
|
|
71
|
+
</td>
|
|
72
|
+
<td class="py-3 pe-4">
|
|
73
|
+
<span class="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-black/5">{prop.required ? 'Oui' : 'Non'}</span>
|
|
74
|
+
</td>
|
|
75
|
+
<td class="py-3 pe-4">
|
|
76
|
+
<code class="inline-block px-1.5 py-0.5 rounded bg-black/5">{formatDefault(prop.defaultValue)}</code>
|
|
77
|
+
</td>
|
|
78
|
+
<td class="py-3 pe-4 max-w-[36rem] text-sm leading-relaxed">
|
|
79
|
+
{prop.description || '—'}
|
|
80
|
+
</td>
|
|
81
|
+
<td class="py-3 text-sm italic text-on-surface-variant">{condition ?? '—'}</td>
|
|
82
|
+
</tr>
|
|
83
|
+
);
|
|
84
|
+
})}
|
|
85
|
+
</tbody>
|
|
86
|
+
</table>
|
|
87
|
+
</Card>
|
|
88
|
+
</>
|
|
89
|
+
</Components>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { getCollection, render } from 'astro:content';
|
|
3
|
+
import Layout from '@/layouts/layout.astro';
|
|
4
|
+
import Code from '@/components/Code.astro';
|
|
5
|
+
import { noCase, sentenceCase } from 'change-case';
|
|
6
|
+
import Components from '@/layouts/components.astro';
|
|
7
|
+
|
|
8
|
+
export async function getStaticPaths() {
|
|
9
|
+
const overviews = await getCollection('overviews');
|
|
10
|
+
return overviews.map(overview =>
|
|
11
|
+
({
|
|
12
|
+
params: { component: overview.id.replace('overview', '') },
|
|
13
|
+
props: { overview }
|
|
14
|
+
})
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { overview } = Astro.props;
|
|
19
|
+
const { component } = Astro.params;
|
|
20
|
+
const { Content, headings } = await render(overview);
|
|
21
|
+
|
|
22
|
+
const apis = await getCollection('api');
|
|
23
|
+
const componentApi = apis.find(api => api.id == component)
|
|
24
|
+
|
|
25
|
+
if (!componentApi) {
|
|
26
|
+
return Astro.redirect('/404', 404);
|
|
27
|
+
}
|
|
28
|
+
---
|
|
29
|
+
<Components>
|
|
30
|
+
<Fragment slot="header"> <!-- pass table header -->
|
|
31
|
+
<h1 class="text-display-large ">{sentenceCase(noCase(componentApi.id))}</h1>
|
|
32
|
+
<p class="text-headline-small mt-8">{componentApi.data.description}</p>
|
|
33
|
+
</Fragment>
|
|
34
|
+
<div class="prose-markdown max-w-none">
|
|
35
|
+
<Content components={{ pre: Code }} />
|
|
36
|
+
</div>
|
|
37
|
+
</Components>
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Layout from '@/layouts/layout.astro';
|
|
3
|
+
import { getCollection } from 'astro:content';
|
|
4
|
+
import { sentenceCase } from 'change-case';
|
|
5
|
+
import { Card } from '@udixio/ui-react';
|
|
6
|
+
|
|
7
|
+
import { ComponentSidebar } from '@/components/ComponentSidebar';
|
|
8
|
+
import { renderMarkdown } from '@/lib/markdown';
|
|
9
|
+
import ComponentPreview from '@/components/ComponentPreview.astro';
|
|
10
|
+
|
|
11
|
+
export const prerender = false;
|
|
12
|
+
|
|
13
|
+
const overviews = await getCollection('overviews');
|
|
14
|
+
const apis = await getCollection('api');
|
|
15
|
+
|
|
16
|
+
const overviewIds = new Set(
|
|
17
|
+
overviews.map((overview) => overview.id.replaceAll('overview', '')),
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const components = apis
|
|
21
|
+
.filter((api) => !api.data.tags?.parent)
|
|
22
|
+
.filter((api) => overviewIds.has(api.id))
|
|
23
|
+
.map((api) => {
|
|
24
|
+
const tags = api.data.tags ?? {};
|
|
25
|
+
const toHtml = (value?: string) =>
|
|
26
|
+
typeof value === 'string' && value.trim().length > 0
|
|
27
|
+
? renderMarkdown(value, {
|
|
28
|
+
classes: {
|
|
29
|
+
li: 'text-sm text-on-surface-variant',
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
: '';
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
id: api.id,
|
|
36
|
+
displayName: api.data.displayName ?? sentenceCase(api.id),
|
|
37
|
+
description: api.data.description ?? '',
|
|
38
|
+
status: tags.status ?? 'beta',
|
|
39
|
+
category: tags.category ?? 'Other',
|
|
40
|
+
hasDevx: !!tags.devx,
|
|
41
|
+
hasA11y: !!tags.a11y,
|
|
42
|
+
hasLimitations: !!tags.limitations,
|
|
43
|
+
devxHtml: toHtml(tags.devx),
|
|
44
|
+
limitationsHtml: toHtml(tags.limitations),
|
|
45
|
+
a11yHtml: toHtml(tags.a11y),
|
|
46
|
+
};
|
|
47
|
+
})
|
|
48
|
+
.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
49
|
+
|
|
50
|
+
console.log('Filtered and sorted components:', overviewIds);
|
|
51
|
+
|
|
52
|
+
const componentsByCategory = components.reduce(
|
|
53
|
+
(acc, component) => {
|
|
54
|
+
const group = acc[component.category] ?? [];
|
|
55
|
+
group.push(component);
|
|
56
|
+
acc[component.category] = group;
|
|
57
|
+
return acc;
|
|
58
|
+
},
|
|
59
|
+
{} as Record<string, typeof components>,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const categories = Object.keys(componentsByCategory).sort((a, b) =>
|
|
63
|
+
a.localeCompare(b),
|
|
64
|
+
);
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
<Layout docSidebar>
|
|
68
|
+
<Fragment slot="sidebar">
|
|
69
|
+
<ComponentSidebar
|
|
70
|
+
client:load
|
|
71
|
+
transition:name="component-sidebar"
|
|
72
|
+
transition:persist
|
|
73
|
+
current={null}
|
|
74
|
+
components={components.map((component) => ({ slug: component.id }))}
|
|
75
|
+
/>
|
|
76
|
+
</Fragment>
|
|
77
|
+
|
|
78
|
+
<div class="max-w-screen-xl mx-auto px-6 py-10">
|
|
79
|
+
<div class="mb-10">
|
|
80
|
+
<h1 class="text-display-large">Components</h1>
|
|
81
|
+
<p class="text-headline-small mt-4 text-on-surface-variant">
|
|
82
|
+
Browse all documented components and their essential dev notes.
|
|
83
|
+
</p>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
{
|
|
87
|
+
categories.map((category) => (
|
|
88
|
+
<section class="mb-12">
|
|
89
|
+
<div class="flex items-center justify-between mb-5">
|
|
90
|
+
<h2 class="text-title-large">{category}</h2>
|
|
91
|
+
<span class="text-label-large text-on-surface-variant">
|
|
92
|
+
{componentsByCategory[category].length} components
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div class="grid grid-cols-1 gap-6 md:grid-cols-2 xl:grid-cols-3">
|
|
97
|
+
{componentsByCategory[category].map((component) => (
|
|
98
|
+
<a
|
|
99
|
+
href={`/components/${component.id}/overview`}
|
|
100
|
+
class="group block no-underline"
|
|
101
|
+
>
|
|
102
|
+
<Card
|
|
103
|
+
client:visible
|
|
104
|
+
isInteractive
|
|
105
|
+
variant="filled"
|
|
106
|
+
className="flex h-full rounded-3xl flex-col overflow-hidden p-0 transition-all duration-200 y"
|
|
107
|
+
>
|
|
108
|
+
<div class="relative rounded-3xl flex min-h-[200px] flex-1 items-center justify-center overflow-hidden bg-surface-container-high p-4">
|
|
109
|
+
<div class="pointer-events-none scale-100">
|
|
110
|
+
<ComponentPreview id={component.id} />
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="flex flex-col gap-1 p-4 ">
|
|
115
|
+
<h3 class="text-title-large">
|
|
116
|
+
{component.displayName}
|
|
117
|
+
</h3>
|
|
118
|
+
<p class="text-body-medium text-on-surface-variant">
|
|
119
|
+
{component.description}
|
|
120
|
+
</p>
|
|
121
|
+
</div>
|
|
122
|
+
</Card>
|
|
123
|
+
</a>
|
|
124
|
+
))}
|
|
125
|
+
</div>
|
|
126
|
+
</section>
|
|
127
|
+
))
|
|
128
|
+
}
|
|
129
|
+
</div>
|
|
130
|
+
</Layout>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
import Search from "astro-pagefind/components/Search";
|
|
3
|
+
import Layout from '@/layouts/layout.astro'
|
|
4
|
+
import { Card } from "@udixio/ui-react";
|
|
5
|
+
---
|
|
6
|
+
<Layout>
|
|
7
|
+
<div class="flex items-center justify-center size-full px-8">
|
|
8
|
+
<Card variant="filled" className="p-8 max-w-screen-xl mx-auto min-h-[90vh] w-full bg-surface-container">
|
|
9
|
+
<Search id="search" className="pagefind-ui" uiOptions={{ showImages: false }} />
|
|
10
|
+
</Card>
|
|
11
|
+
</div>
|
|
12
|
+
</Layout>
|