@situaction/traquiste-docs-kit 0.0.0-stage → 1.0.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 +18 -0
- package/README.md +252 -2
- package/client.d.ts +7 -0
- package/dist/app/ColorModeContext.d.ts +15 -0
- package/dist/app/ColorModeContext.d.ts.map +1 -0
- package/dist/app/ColorModeContext.js +58 -0
- package/dist/app/config.d.ts +69 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/config.js +35 -0
- package/dist/app/createDocsApp.d.ts +9 -0
- package/dist/app/createDocsApp.d.ts.map +1 -0
- package/dist/app/createDocsApp.js +53 -0
- package/dist/components/Callout.d.ts +11 -0
- package/dist/components/Callout.d.ts.map +1 -0
- package/dist/components/Callout.js +28 -0
- package/dist/components/CodeBlock.d.ts +12 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +60 -0
- package/dist/components/DeviceFrame.d.ts +17 -0
- package/dist/components/DeviceFrame.d.ts.map +1 -0
- package/dist/components/DeviceFrame.js +74 -0
- package/dist/components/LiveEditor.d.ts +10 -0
- package/dist/components/LiveEditor.d.ts.map +1 -0
- package/dist/components/LiveEditor.js +231 -0
- package/dist/components/PropsTable.d.ts +16 -0
- package/dist/components/PropsTable.d.ts.map +1 -0
- package/dist/components/PropsTable.js +60 -0
- package/dist/components/layout/ComponentSearch.d.ts +2 -0
- package/dist/components/layout/ComponentSearch.d.ts.map +1 -0
- package/dist/components/layout/ComponentSearch.js +156 -0
- package/dist/components/layout/Layout.d.ts +8 -0
- package/dist/components/layout/Layout.d.ts.map +1 -0
- package/dist/components/layout/Layout.js +109 -0
- package/dist/components/layout/NotFound.d.ts +2 -0
- package/dist/components/layout/NotFound.d.ts.map +1 -0
- package/dist/components/layout/NotFound.js +36 -0
- package/dist/components/layout/Sidebar.d.ts +2 -0
- package/dist/components/layout/Sidebar.d.ts.map +1 -0
- package/dist/components/layout/Sidebar.js +88 -0
- package/dist/components/layout/TableOfContents.d.ts +10 -0
- package/dist/components/layout/TableOfContents.d.ts.map +1 -0
- package/dist/components/layout/TableOfContents.js +48 -0
- package/dist/hooks/useCopy.d.ts +5 -0
- package/dist/hooks/useCopy.d.ts.map +1 -0
- package/dist/hooks/useCopy.js +19 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/pages/DocPage.d.ts +26 -0
- package/dist/pages/DocPage.d.ts.map +1 -0
- package/dist/pages/DocPage.js +23 -0
- package/dist/pages/createComponentPage.d.ts +32 -0
- package/dist/pages/createComponentPage.d.ts.map +1 -0
- package/dist/pages/createComponentPage.js +149 -0
- package/dist/pages/createScreenPage.d.ts +33 -0
- package/dist/pages/createScreenPage.d.ts.map +1 -0
- package/dist/pages/createScreenPage.js +124 -0
- package/dist/styles/docs.css +177 -0
- package/dist/styles/pageStyles.d.ts +45 -0
- package/dist/styles/pageStyles.d.ts.map +1 -0
- package/dist/styles/pageStyles.js +46 -0
- package/dist/vite/extractProps.d.ts +8 -0
- package/dist/vite/extractProps.d.ts.map +1 -0
- package/dist/vite/extractProps.js +79 -0
- package/dist/vite/index.d.ts +18 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +73 -0
- package/package.json +111 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# 1.0.0 (2026-10-20)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* empêcher un contenu large de faire déborder la page ([9a2039e](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/9a2039e9deeeddea8e52f26e2bd7f5161c1ebfce))
|
|
7
|
+
* protéger la doc des styles globaux d'une lib ([82c871a](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/82c871a0e29c6670d17c3b85f1e628c2240a8e29))
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* extraire le moteur de doc de traquiste-mobile ([f9d2316](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/f9d23168b00cb59574ce2d43240b7637dad3d69e))
|
|
13
|
+
* générer les tableaux de props depuis le code (plugin Vite docgen) ([fe0f21c](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/fe0f21cbd10525a580e89095acfdaf7a0af77dba))
|
|
14
|
+
* logo, version en bas de la sidebar et liens dans la barre du haut ([f9b5337](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/f9b5337d431a1ed76c340602f4fbf6f13dd4eccf))
|
|
15
|
+
* mémoriser le mode sombre et suivre la préférence système ([eda9e09](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/eda9e0998f5e7c85681b1bd8270ea0019cd8b67d))
|
|
16
|
+
* navigation — retour en haut, ancres, page 404 et titre d'onglet ([0572519](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/057251978c08baf4face7156f59dd32b4bb8bf9e)), closes [components/button#props](https://bitbucket.org/components/button/issue/props)
|
|
17
|
+
* pages d'écrans complets — createScreenPage et DeviceFrame ([fdb6eb4](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/fdb6eb4ec5526141d766142d14cede48c1130a15))
|
|
18
|
+
* pages de guide — DocPage, DocSection, CodeBlock, Callout et Link ([6c5174a](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/commits/6c5174abf80c2fe9decfad91e7c34a334f7320f2)), closes [#etats](https://bitbucket.org/winoc/traq-ui-ste-docs-kit/issue/etats)
|
package/README.md
CHANGED
|
@@ -1,3 +1,253 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @situaction/traquiste-docs-kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Moteur de documentation partagé par les libs UI Traquiste :
|
|
4
|
+
- [`traq-ui-ste`](https://bitbucket.org/winoc/traq-ui-ste) (web) ;
|
|
5
|
+
- [`traq-ui-ste-mobile`](https://bitbucket.org/winoc/traq-ui-ste-mobile) (React Native, rendu via react-native-web).
|
|
6
|
+
|
|
7
|
+
Chaque lib garde sa propre doc (pages, config, déploiement). Le kit fournit l'outil :
|
|
8
|
+
- la mise en page : sidebar, barre du haut, recherche ⌘K, bascule light/dark, table des matières ;
|
|
9
|
+
- `createComponentPage` : titre, statut, lien Figma, ligne d'import, démos par section, tableau des props ;
|
|
10
|
+
- les tableaux de props générés depuis le code TypeScript des composants (plugin Vite `docgen`) ;
|
|
11
|
+
- les pages de guide (Prise en main, Theming…) : `DocPage`, `DocSection`, `CodeBlock`, `Callout` ;
|
|
12
|
+
- les pages d'écrans complets (flux de connexion, back-office…) dans un téléphone ou une fenêtre de navigateur : `createScreenPage`, `DeviceFrame` ;
|
|
13
|
+
- l'éditeur live (Monaco + Babel) avec copier/reset, redimensionnement et cadre téléphone ;
|
|
14
|
+
- les routes, la sidebar et la recherche, générées depuis la liste de pages ;
|
|
15
|
+
- la navigation : titre d'onglet par page, retour en haut au changement de page, liens directs vers une ancre (`/components/button#props`), page 404 ;
|
|
16
|
+
- le mode sombre : il suit la préférence système et mémorise le choix du visiteur.
|
|
17
|
+
|
|
18
|
+
## Utilisation dans une lib
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -D @situaction/traquiste-docs-kit
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`docs/docs.config.tsx` :
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { defineDocsConfig } from '@situaction/traquiste-docs-kit'
|
|
28
|
+
import { ThemeProvider } from '@situaction/traquiste-mobile'
|
|
29
|
+
import ButtonPage from './src/pages/components/button'
|
|
30
|
+
import pkg from '../package.json'
|
|
31
|
+
import componentProps from 'virtual:traquiste-docs/props'
|
|
32
|
+
|
|
33
|
+
export default defineDocsConfig({
|
|
34
|
+
brand: { name: 'traquiste-mobile', subtitle: 'by Situaction', version: pkg.version },
|
|
35
|
+
links: [
|
|
36
|
+
{ label: 'Doc web', href: 'https://…' },
|
|
37
|
+
{ label: 'Figma', href: 'https://www.figma.com/…' },
|
|
38
|
+
],
|
|
39
|
+
packageName: '@situaction/traquiste-mobile',
|
|
40
|
+
componentProps,
|
|
41
|
+
// Enveloppe chaque démo live
|
|
42
|
+
wrapper: ({ mode, children }) => <ThemeProvider colorScheme={mode}>{children}</ThemeProvider>,
|
|
43
|
+
pages: [
|
|
44
|
+
{ group: 'Composants', label: 'Button', path: '/components/button', component: ButtonPage },
|
|
45
|
+
],
|
|
46
|
+
})
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`docs/src/main.tsx` :
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { createDocsApp } from '@situaction/traquiste-docs-kit'
|
|
53
|
+
import config from '../docs.config'
|
|
54
|
+
|
|
55
|
+
createDocsApp(config, document.getElementById('root')!)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Une page composant :
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { createComponentPage } from '@situaction/traquiste-docs-kit'
|
|
62
|
+
import { Button } from '@situaction/traquiste-mobile'
|
|
63
|
+
|
|
64
|
+
export default createComponentPage({
|
|
65
|
+
title: 'Button',
|
|
66
|
+
description: "Bouton d'action.",
|
|
67
|
+
scope: { Button },
|
|
68
|
+
demos: [{ section: 'Variantes', title: 'Primary', code: `<Button label="Valider" />` }],
|
|
69
|
+
// Lu dans l'interface TypeScript du composant et ses JSDoc (plugin docgen)
|
|
70
|
+
props: 'auto',
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Pages de guide
|
|
75
|
+
|
|
76
|
+
Pour les pages de texte (Prise en main, Theming, Changelog…), avec le même rendu que les pages composant :
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import { Callout, CodeBlock, DocPage, DocSection, Link } from '@situaction/traquiste-docs-kit'
|
|
80
|
+
|
|
81
|
+
export default function GettingStarted() {
|
|
82
|
+
return (
|
|
83
|
+
<DocPage title="Prise en main" description="Installer et configurer la lib.">
|
|
84
|
+
<DocSection title="Installation">
|
|
85
|
+
<p>Installe le package :</p>
|
|
86
|
+
<CodeBlock language="bash">npm install @situaction/traquiste-mobile</CodeBlock>
|
|
87
|
+
<Callout type="warning">Ajoute aussi les peer dependencies.</Callout>
|
|
88
|
+
</DocSection>
|
|
89
|
+
<DocSection title="Theming">
|
|
90
|
+
<p>Voir aussi la page <Link to="/components/button">Button</Link>.</p>
|
|
91
|
+
</DocSection>
|
|
92
|
+
</DocPage>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- `DocPage` : titre, description et **table des matières générée** à partir des `DocSection` (même imbriquées dans d'autres composants).
|
|
98
|
+
- `DocSection` : titre H2 et ancre (`États` → `#etats`), avec `id` pour la choisir et `description` pour un chapeau.
|
|
99
|
+
- Le texte écrit en JSX simple (`p`, `h3`, `ul`/`ol`, `a`, `strong`, `code`) est mis en forme automatiquement. Les démos `LiveEditor` insérées dans un guide gardent leur propre rendu.
|
|
100
|
+
- `CodeBlock` : code statique avec un bouton copier, sans coloration syntaxique. L'indentation commune est retirée, ce qui permet d'écrire le code dans un template literal indenté. `language` ou `title` (par ex. un nom de fichier) s'affiche dans l'en-tête.
|
|
101
|
+
- `Callout` : encadré `info` (défaut), `tip`, `warning` ou `danger`, avec `title` facultatif. Ses couleurs suivent le thème clair / sombre.
|
|
102
|
+
- `Link` : lien interne sans rechargement de la page. C'est le `Link` de react-router, réexporté pour utiliser le même routeur que la doc.
|
|
103
|
+
|
|
104
|
+
Le playground contient des exemples : `playground/pages/guides/` (Prise en main, Theming avec une démo live) et `playground/pages/Examples.tsx` (page libre avec plusieurs démos).
|
|
105
|
+
|
|
106
|
+
### Écrans complets
|
|
107
|
+
|
|
108
|
+
Pour montrer des écrans entiers construits avec la lib (flux de connexion, liste, formulaire…), un onglet par écran :
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
import { createScreenPage } from '@situaction/traquiste-docs-kit'
|
|
112
|
+
|
|
113
|
+
export default createScreenPage({
|
|
114
|
+
title: 'Flux de connexion',
|
|
115
|
+
description: "Reconstruction du flux d'authentification.",
|
|
116
|
+
device: 'phone', // 'browser' pour la lib web
|
|
117
|
+
screens: [
|
|
118
|
+
{
|
|
119
|
+
label: 'Email',
|
|
120
|
+
description: "Saisie de l'identifiant.",
|
|
121
|
+
components: ['Input', 'Checkbox', 'Button'],
|
|
122
|
+
notes: 'Toute la ligne « Se rappeler de moi » est pressable.',
|
|
123
|
+
component: ScreenEmail,
|
|
124
|
+
},
|
|
125
|
+
// …
|
|
126
|
+
],
|
|
127
|
+
})
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- `device` : `'phone'` (390 × 760 par défaut) ou `'browser'` (1024 × 640, avec `url` affichée dans la barre d'adresse, aussi réglable écran par écran). `width` et `height` changent la taille.
|
|
131
|
+
- Chaque écran est rendu dans le `wrapper` de la config : il suit le thème de la lib et le mode clair / sombre. Un écran dont la racine a `flex: 1` remplit toute la hauteur de l'appareil ; au-delà, il défile à l'intérieur, comme sur un vrai appareil.
|
|
132
|
+
- L'écran affiché est dans l'URL (`?screen=mot-de-passe`) : on peut donner un lien direct vers un écran.
|
|
133
|
+
- Onglets, flèches du clavier, boutons Précédent / Suivant, et panneau « Écran 2 / 4 » avec description, notes et composants utilisés. Un composant qui a une page dans la doc devient un lien vers elle.
|
|
134
|
+
- `DeviceFrame` est exporté pour les pages libres : `<DeviceFrame device="browser" url="app.fr" height={600}>…</DeviceFrame>`. C'est aussi le cadre des démos `phoneFrame: true`.
|
|
135
|
+
|
|
136
|
+
Exemples dans le playground : `playground/pages/screens/Login.tsx` (téléphone) et `Backoffice.tsx` (navigateur).
|
|
137
|
+
|
|
138
|
+
### Props générées (plugin `docgen`)
|
|
139
|
+
|
|
140
|
+
`docs/vite.config.ts` :
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
import { docgen } from '@situaction/traquiste-docs-kit/vite'
|
|
144
|
+
|
|
145
|
+
export default defineConfig({
|
|
146
|
+
plugins: [
|
|
147
|
+
react(),
|
|
148
|
+
// Chemins relatifs au dossier docs/
|
|
149
|
+
docgen({ include: ['../src/components/**/*.tsx'], tsconfig: '../tsconfig.json' }),
|
|
150
|
+
],
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Pour typer le module généré, dans le `tsconfig` de la doc : `"types": ["@situaction/traquiste-docs-kit/client"]`.
|
|
155
|
+
|
|
156
|
+
- `props: 'auto'` lit les props du composant qui porte le nom de la page (`title`). Si le nom diffère, ajouter `propsOf: 'NomDuComposant'`.
|
|
157
|
+
- Les écrire à la main reste possible : `props: [{ name, type, required, default?, description }]`.
|
|
158
|
+
- Ce qui est lu : nom, type (unions de littéraux développées : `'primary' | 'ghost'`), obligatoire ou non, valeur par défaut (déstructuration `variant = 'primary'`), description JSDoc `/** … */`.
|
|
159
|
+
- Les props héritées des types React / React Native (`ButtonHTMLAttributes`, `ViewProps`, `PressableProps`…) sont masquées : seule l'API propre au composant apparaît. Pour montrer une prop héritée (par ex. `onPress`), la redéclarer dans l'interface du composant avec son JSDoc.
|
|
160
|
+
- Les stories et les tests sont ignorés ; les exports qui ne sont pas des composants (`MARKER_HEIGHT`, `getBearingSector`) aussi.
|
|
161
|
+
- En dev, modifier un composant met son tableau à jour (rechargement de la page).
|
|
162
|
+
- Si les props d'un composant sont introuvables, la page l'indique avec les points à vérifier au lieu d'afficher un tableau vide.
|
|
163
|
+
|
|
164
|
+
Le CSS de la doc résiste aux styles globaux qu'une lib peut injecter (`:root, body { width: 100vw }`, règles `h1`–`h6`). Le playground en charge un exemple (`playground/lib-globals.css`).
|
|
165
|
+
|
|
166
|
+
Le `vite.config.ts` reste propre à chaque lib : alias react-native-web et stubs côté mobile, `sass` côté web. Le chargement des polices se fait dans le `index.html` de la lib. La police de la doc peut être changée avec la variable CSS `--docs-font-family`.
|
|
167
|
+
|
|
168
|
+
### Options de `defineDocsConfig`
|
|
169
|
+
|
|
170
|
+
| Option | Requis | Description |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| `brand` | oui | `{ name, showName?, subtitle?, logo?, version? }`. En-tête de la sidebar : `logo` (URL d'image, par ex. `/logo-situaction.svg` dans le `public/` de la doc), `name` et `subtitle`, tous deux facultatifs à l'affichage. `name` reste obligatoire dans la config : il sert au titre des onglets et de texte alternatif au logo. `showName: false` le masque quand le logo contient déjà le nom (sans logo, le nom est toujours affiché). `version` s'affiche en bas de la sidebar : en général celle du `package.json` de la lib (import JSON avec `resolveJsonModule`) |
|
|
173
|
+
| `links` | non | `{ label, href }[]` dans la barre du haut. Les URL `https://…` s'ouvrent dans un nouvel onglet, les chemins (`/examples`) restent dans le site |
|
|
174
|
+
| `packageName` | oui | Package utilisé dans la ligne `import { X } from '…'` des pages composants |
|
|
175
|
+
| `wrapper` | non | Enveloppe chaque démo live, en général le `ThemeProvider` de la lib. Reçoit `mode: 'light' \| 'dark'` |
|
|
176
|
+
| `appWrapper` | non | Enveloppe tout le site, pour les pages qui utilisent le thème de la lib hors démos |
|
|
177
|
+
| `componentProps` | non | Props générées : `import componentProps from 'virtual:traquiste-docs/props'` (plugin `docgen`), pour `props: 'auto'` |
|
|
178
|
+
| `home` | non | Page affichée sur `/`. Par défaut : redirection vers la première page |
|
|
179
|
+
| `pages` | oui | `{ group, label, path, component }[]`, dans l'ordre de la sidebar |
|
|
180
|
+
|
|
181
|
+
### API exportée
|
|
182
|
+
- `createDocsApp(config, container)` et `DocsApp`
|
|
183
|
+
- `defineDocsConfig`, `useDocsConfig` (types `DocsConfig`, `DocsPage`, `DocsLink`, `DocsWrapper`)
|
|
184
|
+
- `createComponentPage` (types `ComponentPageConfig`, `Demo`, `PropDef`, `ComponentProps`, `ComponentStatus`)
|
|
185
|
+
- `@situaction/traquiste-docs-kit/vite` : `docgen(options)` (plugin Vite) et `findComponentFiles`
|
|
186
|
+
- `LiveEditor`, pour des pages libres comme une page Exemples
|
|
187
|
+
- `DocPage`, `DocSection`, `CodeBlock`, `Callout`, `Link` pour les pages de guide
|
|
188
|
+
- `createScreenPage` (types `ScreenPageConfig`, `ScreenConfig`) et `DeviceFrame` (types `DeviceFrameProps`, `DeviceType`) pour les écrans complets
|
|
189
|
+
- `useColorMode` → `{ mode, setMode, toggle }`
|
|
190
|
+
|
|
191
|
+
## Compatibilité
|
|
192
|
+
- `react` / `react-dom` : `^18 || ^19`, en `peerDependencies`. La lib web est en 18, la doc mobile en 19.
|
|
193
|
+
- `typescript` (≥ 5) et `vite` (6 à 8) : `peerDependencies` facultatives, utilisées seulement par le plugin `docgen` — ce sont celles de la doc qui l'utilise.
|
|
194
|
+
- Le playground tourne en React 19, mais le kit est typé avec `@types/react` 18 : TypeScript refuse donc les API réservées à React 19. La CI lance aussi les tests en React 18.
|
|
195
|
+
- Les consommateurs doivent utiliser Vite : le kit est publié en ESM et importe son CSS.
|
|
196
|
+
|
|
197
|
+
## Développer le kit
|
|
198
|
+
|
|
199
|
+
### Arborescence
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
src/ code publié (dist/)
|
|
203
|
+
index.ts API publique : tout ce qui est importable passe par ici
|
|
204
|
+
app/ montage du site : createDocsApp, config (DocsConfig), mode clair / sombre
|
|
205
|
+
pages/ modèles de pages : createComponentPage, createScreenPage, DocPage
|
|
206
|
+
components/ briques des pages : LiveEditor, PropsTable, DeviceFrame, CodeBlock, Callout
|
|
207
|
+
layout/ cadre du site : Layout, Sidebar, recherche, table des matières, 404
|
|
208
|
+
hooks/ hooks partagés (useCopy)
|
|
209
|
+
styles/ docs.css (variables --docs-*) et styles des pages
|
|
210
|
+
vite/ plugin docgen (code Node, non chargé dans le navigateur)
|
|
211
|
+
tests/ tests vitest, même arborescence que src/
|
|
212
|
+
helpers/ config et rendu de test (renderDocs)
|
|
213
|
+
fixtures/ composants d'exemple pour le plugin docgen
|
|
214
|
+
playground/ mini doc pour développer le kit (non publiée)
|
|
215
|
+
native/ composants React Native de démo
|
|
216
|
+
pages/ pages d'exemple : composants, guides, écrans
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
npm install
|
|
221
|
+
npm run dev # playground sur http://localhost:5173 et http://<ip-de-la-machine>:5173
|
|
222
|
+
npm run typecheck
|
|
223
|
+
npm run lint
|
|
224
|
+
npm test # vitest : monte le site avec une config de test (tests/helpers/renderDocs.tsx)
|
|
225
|
+
npm run build # dist/ (JS + .d.ts + CSS)
|
|
226
|
+
npm run preview # playground buildé (après npm run build:playground), aussi accessible par l'IP
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Le playground a aussi des **composants React Native**, rendus par `react-native-web` comme dans la doc mobile (alias `react-native` → `react-native-web` dans `vite.config.ts`) :
|
|
230
|
+
- `playground/native/DemoChip.tsx` : composant RN (`Pressable`, `StyleSheet`, props d'accessibilité) dont le thème vient d'un contexte (`useDemoTheme`), comme le `useTheme` de la lib mobile ;
|
|
231
|
+
- page **Chip** : démos RN (dont une avec état et une dans un téléphone), props lues par `docgen` depuis les types RN ;
|
|
232
|
+
- page **Réglages (React Native)** : écrans complets en `View` / `Text` / `ScrollView`, dont une liste qui défile dans le téléphone.
|
|
233
|
+
|
|
234
|
+
`react-native` est installé en dépendance de dev pour ses types (le plugin `docgen` en a besoin). Ses types sont forcés sur les types React 18 du kit (`overrides` dans `package.json`).
|
|
235
|
+
|
|
236
|
+
Le serveur écoute sur toutes les interfaces réseau : Vite affiche l'adresse `Network` à ouvrir depuis un autre appareil (téléphone, autre poste) sur le même réseau. Le port se change avec la variable `PORT` (`PORT=5180 npm run dev`).
|
|
237
|
+
|
|
238
|
+
Le dossier `playground/` est un mini site de doc qui sert à développer le kit sans dépendre d'une lib. Il n'est pas publié.
|
|
239
|
+
|
|
240
|
+
Pour tester le kit dans la doc d'une lib sans publier, deux possibilités dans le `vite.config.ts` de la lib :
|
|
241
|
+
- un alias `'@situaction/traquiste-docs-kit'` → `'../../traq-ui-ste-docs-kit/src/index.ts'` ;
|
|
242
|
+
- ou `npm link`.
|
|
243
|
+
|
|
244
|
+
## Publication
|
|
245
|
+
semantic-release, déclenché manuellement dans Bitbucket Pipelines :
|
|
246
|
+
- `master` → version `latest` ;
|
|
247
|
+
- `develop` → prerelease `next`.
|
|
248
|
+
|
|
249
|
+
Chaque version met à jour `CHANGELOG.md` (publié avec le package) : c'est là que les libs voient ce qui change, en particulier les changements incompatibles.
|
|
250
|
+
|
|
251
|
+
La CI lance les tests en React 19 puis en React 18.
|
|
252
|
+
|
|
253
|
+
Variables du repo : `NPM_TOKEN` (publication) et `BITBUCKET_TOKEN` (push du commit de release).
|
package/client.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Types for the module generated by the docgen Vite plugin — reference it from the docs' tsconfig or a .d.ts:
|
|
2
|
+
* /// <reference types="@situaction/traquiste-docs-kit/client" />
|
|
3
|
+
*/
|
|
4
|
+
declare module 'virtual:traquiste-docs/props' {
|
|
5
|
+
const componentProps: import('@situaction/traquiste-docs-kit').ComponentProps
|
|
6
|
+
export default componentProps
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ColorMode } from './config';
|
|
3
|
+
interface ColorModeContextValue {
|
|
4
|
+
mode: ColorMode;
|
|
5
|
+
toggle: () => void;
|
|
6
|
+
setMode: (mode: ColorMode) => void;
|
|
7
|
+
}
|
|
8
|
+
/** Mode shown on first paint: the visitor's last choice, else the system preference */
|
|
9
|
+
export declare function getInitialColorMode(): ColorMode;
|
|
10
|
+
export declare function ColorModeProvider({ children }: {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
export declare function useColorMode(): ColorModeContextValue;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=ColorModeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorModeContext.d.ts","sourceRoot":"","sources":["../../src/app/ColorModeContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,UAAU,qBAAqB;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;CACnC;AAyBD,uFAAuF;AACvF,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C;AAED,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAiCtE;AAED,wBAAgB,YAAY,IAAI,qBAAqB,CAEpD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/** Docs-level global color mode state — syncs with data-theme on <html> */
|
|
3
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
4
|
+
const STORAGE_KEY = 'docs-color-mode';
|
|
5
|
+
const DARK_QUERY = '(prefers-color-scheme: dark)';
|
|
6
|
+
const ColorModeContext = createContext({
|
|
7
|
+
mode: 'light',
|
|
8
|
+
toggle: () => { },
|
|
9
|
+
setMode: () => { },
|
|
10
|
+
});
|
|
11
|
+
// Storage can throw (private mode, blocked site data): fall back to the system preference
|
|
12
|
+
function readStoredMode() {
|
|
13
|
+
try {
|
|
14
|
+
const value = localStorage.getItem(STORAGE_KEY);
|
|
15
|
+
return value === 'light' || value === 'dark' ? value : null;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function readSystemMode() {
|
|
22
|
+
return typeof window !== 'undefined' && window.matchMedia?.(DARK_QUERY).matches ? 'dark' : 'light';
|
|
23
|
+
}
|
|
24
|
+
/** Mode shown on first paint: the visitor's last choice, else the system preference */
|
|
25
|
+
export function getInitialColorMode() {
|
|
26
|
+
return readStoredMode() ?? readSystemMode();
|
|
27
|
+
}
|
|
28
|
+
export function ColorModeProvider({ children }) {
|
|
29
|
+
const [storedMode, setStoredMode] = useState(readStoredMode);
|
|
30
|
+
const [systemMode, setSystemMode] = useState(readSystemMode);
|
|
31
|
+
// An explicit choice wins; otherwise follow the OS live
|
|
32
|
+
const mode = storedMode ?? systemMode;
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const query = window.matchMedia?.(DARK_QUERY);
|
|
35
|
+
if (!query)
|
|
36
|
+
return;
|
|
37
|
+
const onChange = (e) => setSystemMode(e.matches ? 'dark' : 'light');
|
|
38
|
+
query.addEventListener('change', onChange);
|
|
39
|
+
return () => query.removeEventListener('change', onChange);
|
|
40
|
+
}, []);
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
document.documentElement.setAttribute('data-theme', mode);
|
|
43
|
+
}, [mode]);
|
|
44
|
+
const setMode = useCallback((next) => {
|
|
45
|
+
setStoredMode(next);
|
|
46
|
+
try {
|
|
47
|
+
localStorage.setItem(STORAGE_KEY, next);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Not persisted — the choice still applies for this visit
|
|
51
|
+
}
|
|
52
|
+
}, []);
|
|
53
|
+
const value = useMemo(() => ({ mode, setMode, toggle: () => setMode(mode === 'light' ? 'dark' : 'light') }), [mode, setMode]);
|
|
54
|
+
return _jsx(ColorModeContext.Provider, { value: value, children: children });
|
|
55
|
+
}
|
|
56
|
+
export function useColorMode() {
|
|
57
|
+
return useContext(ColorModeContext);
|
|
58
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ComponentType, ReactNode } from 'react';
|
|
2
|
+
import type { ComponentProps } from '../components/PropsTable';
|
|
3
|
+
export type ColorMode = 'light' | 'dark';
|
|
4
|
+
export interface NavItem {
|
|
5
|
+
label: string;
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NavGroup {
|
|
9
|
+
group: string;
|
|
10
|
+
items: NavItem[];
|
|
11
|
+
}
|
|
12
|
+
/** A docs page: shown in the sidebar under `group`, routed at `path` */
|
|
13
|
+
export interface DocsPage extends NavItem {
|
|
14
|
+
group: string;
|
|
15
|
+
component: ComponentType;
|
|
16
|
+
}
|
|
17
|
+
/** External or internal link shown in the top bar */
|
|
18
|
+
export interface DocsLink {
|
|
19
|
+
label: string;
|
|
20
|
+
/** Absolute URL (opens in a new tab) or in-site path */
|
|
21
|
+
href: string;
|
|
22
|
+
}
|
|
23
|
+
/** Wraps content with the documented library's theme for the current color mode */
|
|
24
|
+
export type DocsWrapper = ComponentType<{
|
|
25
|
+
mode: ColorMode;
|
|
26
|
+
children: ReactNode;
|
|
27
|
+
}>;
|
|
28
|
+
export interface DocsConfig {
|
|
29
|
+
/** Sidebar header */
|
|
30
|
+
brand: {
|
|
31
|
+
/** Library name, e.g. 'traquiste-mobile' — also used in tab titles and as the logo's alt text */
|
|
32
|
+
name: string;
|
|
33
|
+
/** Show the name next to the logo — set false when the logo already contains it (default true) */
|
|
34
|
+
showName?: boolean;
|
|
35
|
+
/** Line under the name, e.g. 'by Situaction' */
|
|
36
|
+
subtitle?: string;
|
|
37
|
+
/** Image URL shown left of the name, e.g. '/logo-situaction.svg' from the docs' public/ folder */
|
|
38
|
+
logo?: string;
|
|
39
|
+
/** Documented version, e.g. the library's package.json version */
|
|
40
|
+
version?: string;
|
|
41
|
+
};
|
|
42
|
+
/** Links in the top bar — the other library's docs, Figma, repository, npm… */
|
|
43
|
+
links?: DocsLink[];
|
|
44
|
+
/** Package used in the generated import snippet of each component page */
|
|
45
|
+
packageName: string;
|
|
46
|
+
/** Wraps every live demo — typically the library's ThemeProvider */
|
|
47
|
+
wrapper?: DocsWrapper;
|
|
48
|
+
/** Wraps the whole site — for pages that use the library's theme outside live demos */
|
|
49
|
+
appWrapper?: DocsWrapper;
|
|
50
|
+
/** Generated props tables: `import componentProps from 'virtual:traquiste-docs/props'` (docgen Vite plugin) */
|
|
51
|
+
componentProps?: ComponentProps;
|
|
52
|
+
/** Page rendered at `/` — defaults to a redirect to the first page */
|
|
53
|
+
home?: ComponentType;
|
|
54
|
+
/** Pages in sidebar order; groups appear in order of first occurrence */
|
|
55
|
+
pages: DocsPage[];
|
|
56
|
+
}
|
|
57
|
+
/** Resolved config: optional wrappers replaced by a pass-through */
|
|
58
|
+
export type ResolvedDocsConfig = DocsConfig & {
|
|
59
|
+
wrapper: DocsWrapper;
|
|
60
|
+
appWrapper: DocsWrapper;
|
|
61
|
+
};
|
|
62
|
+
/** Identity helper — gives type checking and autocompletion in `docs.config.tsx` */
|
|
63
|
+
export declare function defineDocsConfig(config: DocsConfig): DocsConfig;
|
|
64
|
+
export declare function resolveDocsConfig(config: DocsConfig): ResolvedDocsConfig;
|
|
65
|
+
export declare const DocsConfigContext: import("react").Context<ResolvedDocsConfig | null>;
|
|
66
|
+
export declare function useDocsConfig(): ResolvedDocsConfig;
|
|
67
|
+
/** Sidebar / search tree derived from the page list */
|
|
68
|
+
export declare function useNav(): NavGroup[];
|
|
69
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/app/config.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AAExC,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,QAAS,SAAQ,OAAO;IACvC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,aAAa,CAAA;CACzB;AAED,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,CAAC,CAAA;AAEjF,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,KAAK,EAAE;QACL,iGAAiG;QACjG,IAAI,EAAE,MAAM,CAAA;QACZ,kGAAkG;QAClG,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,gDAAgD;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,kGAAkG;QAClG,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,kEAAkE;QAClE,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,+EAA+E;IAC/E,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,uFAAuF;IACvF,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,+GAA+G;IAC/G,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,sEAAsE;IACtE,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,yEAAyE;IACzE,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,WAAW,CAAA;CAAE,CAAA;AAI/F,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE/D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAMxE;AAED,eAAO,MAAM,iBAAiB,oDAAiD,CAAA;AAE/E,wBAAgB,aAAa,IAAI,kBAAkB,CAIlD;AAED,uDAAuD;AACvD,wBAAgB,MAAM,IAAI,QAAQ,EAAE,CAUnC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/** Docs configuration — everything that differs from one library's docs to another */
|
|
3
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
4
|
+
const PassThrough = ({ children }) => _jsx(_Fragment, { children: children });
|
|
5
|
+
/** Identity helper — gives type checking and autocompletion in `docs.config.tsx` */
|
|
6
|
+
export function defineDocsConfig(config) {
|
|
7
|
+
return config;
|
|
8
|
+
}
|
|
9
|
+
export function resolveDocsConfig(config) {
|
|
10
|
+
return {
|
|
11
|
+
...config,
|
|
12
|
+
wrapper: config.wrapper ?? PassThrough,
|
|
13
|
+
appWrapper: config.appWrapper ?? PassThrough,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export const DocsConfigContext = createContext(null);
|
|
17
|
+
export function useDocsConfig() {
|
|
18
|
+
const config = useContext(DocsConfigContext);
|
|
19
|
+
if (!config)
|
|
20
|
+
throw new Error('useDocsConfig must be used inside createDocsApp()');
|
|
21
|
+
return config;
|
|
22
|
+
}
|
|
23
|
+
/** Sidebar / search tree derived from the page list */
|
|
24
|
+
export function useNav() {
|
|
25
|
+
const { pages } = useDocsConfig();
|
|
26
|
+
return useMemo(() => {
|
|
27
|
+
const groups = new Map();
|
|
28
|
+
for (const { group, label, path } of pages) {
|
|
29
|
+
if (!groups.has(group))
|
|
30
|
+
groups.set(group, []);
|
|
31
|
+
groups.get(group).push({ label, path });
|
|
32
|
+
}
|
|
33
|
+
return [...groups].map(([group, items]) => ({ group, items }));
|
|
34
|
+
}, [pages]);
|
|
35
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DocsConfig } from './config';
|
|
2
|
+
import '../styles/docs.css';
|
|
3
|
+
/** Full docs site — use it when you need to mount it yourself (tests, custom router setup) */
|
|
4
|
+
export declare function DocsApp({ config }: {
|
|
5
|
+
config: DocsConfig;
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
/** Mounts the docs site into `container` */
|
|
8
|
+
export declare function createDocsApp(config: DocsConfig, container: HTMLElement): void;
|
|
9
|
+
//# sourceMappingURL=createDocsApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDocsApp.d.ts","sourceRoot":"","sources":["../../src/app/createDocsApp.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,oBAAoB,CAAA;AAsE3B,8FAA8F;AAC9F,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,+BAczD;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,QAUvE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** Docs app entry: providers, layout and routes generated from the config */
|
|
3
|
+
import { StrictMode, useEffect, useMemo } from 'react';
|
|
4
|
+
import { createRoot } from 'react-dom/client';
|
|
5
|
+
import { BrowserRouter, Navigate, Route, Routes, useLocation } from 'react-router-dom';
|
|
6
|
+
import Layout from '../components/layout/Layout';
|
|
7
|
+
import NotFound from '../components/layout/NotFound';
|
|
8
|
+
import { ColorModeProvider, getInitialColorMode, useColorMode } from './ColorModeContext';
|
|
9
|
+
import { DocsConfigContext, resolveDocsConfig, useDocsConfig } from './config';
|
|
10
|
+
import '../styles/docs.css';
|
|
11
|
+
function AppWrapper({ children }) {
|
|
12
|
+
const { appWrapper: Wrapper } = useDocsConfig();
|
|
13
|
+
const { mode } = useColorMode();
|
|
14
|
+
return _jsx(Wrapper, { mode: mode, children: children });
|
|
15
|
+
}
|
|
16
|
+
/** Sets the browser tab title while the page is shown */
|
|
17
|
+
function Titled({ title, children }) {
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
document.title = title;
|
|
20
|
+
}, [title]);
|
|
21
|
+
return _jsx(_Fragment, { children: children });
|
|
22
|
+
}
|
|
23
|
+
/** New page → back to the top, or to the anchor of a deep link (/components/button#props) */
|
|
24
|
+
function ScrollRestoration() {
|
|
25
|
+
const { pathname, hash } = useLocation();
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const target = hash && document.getElementById(decodeURIComponent(hash.slice(1)));
|
|
28
|
+
// 'instant' bypasses the smooth scroll-behavior set on <html> for in-page anchors:
|
|
29
|
+
// arriving on a page should jump, not animate
|
|
30
|
+
if (target)
|
|
31
|
+
target.scrollIntoView({ behavior: 'instant' });
|
|
32
|
+
else
|
|
33
|
+
window.scrollTo({ top: 0, behavior: 'instant' });
|
|
34
|
+
// Only on page change: in-page anchor clicks are handled natively by the browser
|
|
35
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
+
}, [pathname]);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
function DocsRoutes() {
|
|
40
|
+
const { pages, home: Home, brand } = useDocsConfig();
|
|
41
|
+
return (_jsxs(Routes, { children: [_jsx(Route, { path: "/", element: Home ? (_jsx(Titled, { title: brand.name, children: _jsx(Home, {}) })) : (_jsx(Navigate, { to: pages[0]?.path ?? '/', replace: true })) }), pages.map(({ path, label, component: Page }) => (_jsx(Route, { path: path, element: _jsx(Titled, { title: `${label} — ${brand.name}`, children: _jsx(Page, {}) }) }, path))), _jsx(Route, { path: "*", element: _jsx(Titled, { title: `Page introuvable — ${brand.name}`, children: _jsx(NotFound, {}) }) })] }));
|
|
42
|
+
}
|
|
43
|
+
/** Full docs site — use it when you need to mount it yourself (tests, custom router setup) */
|
|
44
|
+
export function DocsApp({ config }) {
|
|
45
|
+
const resolved = useMemo(() => resolveDocsConfig(config), [config]);
|
|
46
|
+
return (_jsx(DocsConfigContext.Provider, { value: resolved, children: _jsx(ColorModeProvider, { children: _jsxs(AppWrapper, { children: [_jsx(ScrollRestoration, {}), _jsx(Layout, { children: _jsx(DocsRoutes, {}) })] }) }) }));
|
|
47
|
+
}
|
|
48
|
+
/** Mounts the docs site into `container` */
|
|
49
|
+
export function createDocsApp(config, container) {
|
|
50
|
+
// Apply the theme before React renders, so a dark-mode visitor never sees a light flash
|
|
51
|
+
document.documentElement.setAttribute('data-theme', getInitialColorMode());
|
|
52
|
+
createRoot(container).render(_jsx(StrictMode, { children: _jsx(BrowserRouter, { children: _jsx(DocsApp, { config: config }) }) }));
|
|
53
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type CalloutType = 'info' | 'tip' | 'warning' | 'danger';
|
|
3
|
+
export interface CalloutProps {
|
|
4
|
+
/** Tone of the note (default 'info') */
|
|
5
|
+
type?: CalloutType;
|
|
6
|
+
/** Heading — defaults to the type label (Info, Conseil, Attention, Danger) */
|
|
7
|
+
title?: string;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Callout({ type, title, children }: CalloutProps): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=Callout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Callout.d.ts","sourceRoot":"","sources":["../../src/components/Callout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE/D,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,SAAS,CAAA;CACpB;AASD,wBAAgB,OAAO,CAAC,EAAE,IAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAgCvE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** Highlighted note in a guide page: info, tip, warning or danger */
|
|
3
|
+
import { Info, Lightbulb, Warning, WarningOctagon } from '@phosphor-icons/react';
|
|
4
|
+
const TYPES = {
|
|
5
|
+
info: { label: 'Info', Icon: Info },
|
|
6
|
+
tip: { label: 'Conseil', Icon: Lightbulb },
|
|
7
|
+
warning: { label: 'Attention', Icon: Warning },
|
|
8
|
+
danger: { label: 'Danger', Icon: WarningOctagon },
|
|
9
|
+
};
|
|
10
|
+
export function Callout({ type = 'info', title, children }) {
|
|
11
|
+
const { label, Icon } = TYPES[type];
|
|
12
|
+
// Colors come from --docs-callout-<type>-* so they follow the light / dark theme
|
|
13
|
+
const color = (part) => `var(--docs-callout-${type}-${part})`;
|
|
14
|
+
const heading = title ?? label;
|
|
15
|
+
return (_jsxs("div", { role: "note", "aria-label": heading, className: "docs-callout", style: {
|
|
16
|
+
display: 'flex',
|
|
17
|
+
gap: 12,
|
|
18
|
+
padding: '12px 16px',
|
|
19
|
+
margin: '0 0 20px',
|
|
20
|
+
backgroundColor: color('bg'),
|
|
21
|
+
border: `1px solid ${color('border')}`,
|
|
22
|
+
borderLeft: `4px solid ${color('accent')}`,
|
|
23
|
+
borderRadius: 8,
|
|
24
|
+
fontSize: 14,
|
|
25
|
+
lineHeight: 1.6,
|
|
26
|
+
color: 'var(--docs-text-primary)',
|
|
27
|
+
}, children: [_jsx(Icon, { size: 18, weight: "fill", color: color('accent'), style: { flexShrink: 0, marginTop: 2 }, "aria-hidden": true }), _jsxs("div", { style: { minWidth: 0 }, children: [_jsx("strong", { style: { display: 'block', fontWeight: 600, marginBottom: 2 }, children: heading }), _jsx("div", { className: "docs-callout-body", children: children })] })] }));
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CodeBlockProps {
|
|
2
|
+
/** Code to show — indentation common to all lines is removed */
|
|
3
|
+
children: string;
|
|
4
|
+
/** Language label shown in the header, e.g. 'bash', 'tsx' */
|
|
5
|
+
language?: string;
|
|
6
|
+
/** Header label, e.g. a file name — wins over `language` */
|
|
7
|
+
title?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Removes surrounding blank lines and the indentation shared by all lines (template literals in JSX) */
|
|
10
|
+
export declare function dedent(code: string): string;
|
|
11
|
+
export declare function CodeBlock({ children, language, title }: CodeBlockProps): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=CodeBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../src/components/CodeBlock.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA+CD,yGAAyG;AACzG,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,+BAkBtE"}
|