@alveole/storybook 1.9.0 → 2.0.0-alpha
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/dist/components/BarreDeFiltres.d.ts +20 -0
- package/dist/components/BarreDeFiltres.d.ts.map +1 -0
- package/dist/components/BarreDeFiltres.js +28 -0
- package/dist/components/ColorSwatch.d.ts +10 -0
- package/dist/components/ColorSwatch.d.ts.map +1 -0
- package/dist/components/ColorSwatch.js +37 -0
- package/dist/components/DocFooter.d.ts.map +1 -1
- package/dist/components/DocFooter.js +1 -1
- package/dist/components/EcranDeCatalogue.d.ts +18 -0
- package/dist/components/EcranDeCatalogue.d.ts.map +1 -0
- package/dist/components/EcranDeCatalogue.js +16 -0
- package/dist/components/EnTeteDeFiche.d.ts +10 -0
- package/dist/components/EnTeteDeFiche.d.ts.map +1 -0
- package/dist/components/EnTeteDeFiche.js +13 -0
- package/dist/components/ExampleBlock.d.ts +12 -0
- package/dist/components/ExampleBlock.d.ts.map +1 -0
- package/dist/components/ExampleBlock.js +69 -0
- package/dist/components/ExemplesDeLaStory.d.ts +10 -0
- package/dist/components/ExemplesDeLaStory.d.ts.map +1 -0
- package/dist/components/ExemplesDeLaStory.js +27 -0
- package/dist/components/FiltreDeroulant.d.ts +22 -0
- package/dist/components/FiltreDeroulant.d.ts.map +1 -0
- package/dist/components/FiltreDeroulant.js +10 -0
- package/dist/components/GrilleDeFiches.d.ts +15 -0
- package/dist/components/GrilleDeFiches.d.ts.map +1 -0
- package/dist/components/GrilleDeFiches.js +14 -0
- package/dist/components/MenuCard.d.ts +9 -0
- package/dist/components/MenuCard.d.ts.map +1 -0
- package/dist/components/MenuCard.js +8 -0
- package/dist/components/PageTitle.d.ts +19 -0
- package/dist/components/PageTitle.d.ts.map +1 -0
- package/dist/components/PageTitle.js +16 -0
- package/dist/components/ScreenZone.d.ts +19 -0
- package/dist/components/ScreenZone.d.ts.map +1 -0
- package/dist/components/ScreenZone.js +35 -0
- package/dist/components/StoryCard.d.ts.map +1 -1
- package/dist/components/StoryCard.js +3 -1
- package/dist/components/StoryLayout.d.ts +14 -0
- package/dist/components/StoryLayout.d.ts.map +1 -0
- package/dist/components/StoryLayout.js +21 -0
- package/dist/components/StorySummary.d.ts +7 -0
- package/dist/components/StorySummary.d.ts.map +1 -0
- package/dist/components/StorySummary.js +8 -0
- package/dist/components/UIKitColumn.d.ts +25 -0
- package/dist/components/UIKitColumn.d.ts.map +1 -0
- package/dist/components/UIKitColumn.js +24 -0
- package/dist/components/UIKitTopBar.d.ts +11 -2
- package/dist/components/UIKitTopBar.d.ts.map +1 -1
- package/dist/components/UIKitTopBar.js +84 -27
- package/dist/components/choixDuFiltre.d.ts +14 -0
- package/dist/components/choixDuFiltre.d.ts.map +1 -0
- package/dist/components/choixDuFiltre.js +10 -0
- package/dist/components/hauteurDeCarte.d.ts +6 -0
- package/dist/components/hauteurDeCarte.d.ts.map +1 -0
- package/dist/components/hauteurDeCarte.js +5 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/navigation.d.ts +6 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +3 -0
- package/dist/pages/InstallationPage.d.ts +8 -0
- package/dist/pages/InstallationPage.d.ts.map +1 -0
- package/dist/pages/InstallationPage.js +13 -0
- package/dist/pages/PhilosophyPage.d.ts +2 -1
- package/dist/pages/PhilosophyPage.d.ts.map +1 -1
- package/dist/pages/PhilosophyPage.js +7 -7
- package/dist/pages/UIKitHomePage.d.ts.map +1 -1
- package/dist/pages/UIKitHomePage.js +3 -7
- package/dist/pages/UIKitPage.d.ts +3 -4
- package/dist/pages/UIKitPage.d.ts.map +1 -1
- package/dist/pages/UIKitPage.js +59 -36
- package/dist/pages/UIKitThemePage.d.ts +6 -1
- package/dist/pages/UIKitThemePage.d.ts.map +1 -1
- package/dist/pages/UIKitThemePage.js +4 -8
- package/dist/pages/ecransDuKit.d.ts +18 -0
- package/dist/pages/ecransDuKit.d.ts.map +1 -0
- package/dist/pages/ecransDuKit.js +11 -0
- package/dist/pages/installation.d.ts +18 -0
- package/dist/pages/installation.d.ts.map +1 -0
- package/dist/pages/installation.js +218 -0
- package/dist/pages/installationOutillage.d.ts +7 -0
- package/dist/pages/installationOutillage.d.ts.map +1 -0
- package/dist/pages/installationOutillage.js +152 -0
- package/dist/pages/philosophie.d.ts +10 -0
- package/dist/pages/philosophie.d.ts.map +1 -0
- package/dist/pages/philosophie.js +46 -0
- package/dist/pressePapiers.d.ts +10 -0
- package/dist/pressePapiers.d.ts.map +1 -0
- package/dist/pressePapiers.js +14 -0
- package/dist/screens/StoriesScreen.d.ts +2 -1
- package/dist/screens/StoriesScreen.d.ts.map +1 -1
- package/dist/screens/StoriesScreen.js +18 -35
- package/dist/screens/StoryDetailScreen.d.ts +2 -1
- package/dist/screens/StoryDetailScreen.d.ts.map +1 -1
- package/dist/screens/StoryDetailScreen.js +24 -74
- package/dist/screens/ThemeCSSVariablesScreen.d.ts +2 -1
- package/dist/screens/ThemeCSSVariablesScreen.d.ts.map +1 -1
- package/dist/screens/ThemeCSSVariablesScreen.js +7 -97
- package/dist/screens/ThemeConstantDetailScreen.d.ts +2 -1
- package/dist/screens/ThemeConstantDetailScreen.d.ts.map +1 -1
- package/dist/screens/ThemeConstantDetailScreen.js +4 -4
- package/dist/screens/ThemeConstantsScreen.d.ts +2 -1
- package/dist/screens/ThemeConstantsScreen.d.ts.map +1 -1
- package/dist/screens/ThemeConstantsScreen.js +7 -8
- package/dist/screens/ThemePaletteScreen.d.ts +2 -1
- package/dist/screens/ThemePaletteScreen.d.ts.map +1 -1
- package/dist/screens/ThemePaletteScreen.js +11 -92
- package/dist/screens/ThemeTypographyScreen.d.ts +2 -1
- package/dist/screens/ThemeTypographyScreen.d.ts.map +1 -1
- package/dist/screens/ThemeTypographyScreen.js +6 -6
- package/dist/screens/colonnesDeFiches.d.ts +6 -0
- package/dist/screens/colonnesDeFiches.d.ts.map +1 -0
- package/dist/screens/colonnesDeFiches.js +20 -0
- package/dist/screens/paletteSections.d.ts +30 -0
- package/dist/screens/paletteSections.d.ts.map +1 -0
- package/dist/screens/paletteSections.js +76 -0
- package/dist/screens/sourcesDExemples.d.ts +17 -0
- package/dist/screens/sourcesDExemples.d.ts.map +1 -0
- package/dist/screens/sourcesDExemples.js +27 -0
- package/dist/screens/variablesCSSDuTheme.d.ts +12 -0
- package/dist/screens/variablesCSSDuTheme.d.ts.map +1 -0
- package/dist/screens/variablesCSSDuTheme.js +77 -0
- package/dist/screens/variablesDeTypographie.d.ts +8 -0
- package/dist/screens/variablesDeTypographie.d.ts.map +1 -0
- package/dist/screens/variablesDeTypographie.js +23 -0
- package/dist/storySource.d.ts +7 -0
- package/dist/storySource.d.ts.map +1 -0
- package/dist/storySource.js +7 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +11 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -4
- package/package.json +19 -9
- package/dist/styles.d.ts +0 -7
- package/dist/styles.d.ts.map +0 -1
- package/dist/styles.js +0 -6
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StorybookFlag } from '../types';
|
|
3
|
+
export type BarreDeFiltresProps = {
|
|
4
|
+
recherche: string;
|
|
5
|
+
onRecherche: (recherche: string) => void;
|
|
6
|
+
tags: string[];
|
|
7
|
+
tagChoisi: string | null;
|
|
8
|
+
onTag: (tag: string | null) => void;
|
|
9
|
+
indicateurChoisi: StorybookFlag['key'] | null;
|
|
10
|
+
onIndicateur: (indicateur: StorybookFlag['key'] | null) => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* La rangee qui reduit la liste : une recherche et deux filtres. Elle defile horizontalement
|
|
14
|
+
* plutot que de passer a la ligne, pour garder la liste en vue sur un ecran etroit.
|
|
15
|
+
*
|
|
16
|
+
* Un seul menu se deroule a la fois, et cet etat ne sort pas d'ici : aucun autre morceau de
|
|
17
|
+
* l'ecran n'a besoin de savoir quel menu est ouvert.
|
|
18
|
+
*/
|
|
19
|
+
export declare const BarreDeFiltres: ({ recherche, onRecherche, tags, tagChoisi, onTag, indicateurChoisi, onIndicateur, }: BarreDeFiltresProps) => React.JSX.Element;
|
|
20
|
+
//# sourceMappingURL=BarreDeFiltres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BarreDeFiltres.d.ts","sourceRoot":"","sources":["../../src/components/BarreDeFiltres.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKzC,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpC,gBAAgB,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC9C,YAAY,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,qFAQ5B,mBAAmB,sBA2CrB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box } from '@alveole/components';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Platform, ScrollView } from 'react-native';
|
|
5
|
+
import { ALL_STORY_FLAGS } from '../utils';
|
|
6
|
+
import { FiltreDeroulant } from './FiltreDeroulant';
|
|
7
|
+
import { SearchField } from './SearchField';
|
|
8
|
+
/**
|
|
9
|
+
* La rangee qui reduit la liste : une recherche et deux filtres. Elle defile horizontalement
|
|
10
|
+
* plutot que de passer a la ligne, pour garder la liste en vue sur un ecran etroit.
|
|
11
|
+
*
|
|
12
|
+
* Un seul menu se deroule a la fois, et cet etat ne sort pas d'ici : aucun autre morceau de
|
|
13
|
+
* l'ecran n'a besoin de savoir quel menu est ouvert.
|
|
14
|
+
*/
|
|
15
|
+
export const BarreDeFiltres = ({ recherche, onRecherche, tags, tagChoisi, onTag, indicateurChoisi, onIndicateur, }) => {
|
|
16
|
+
const [menuOuvert, setMenuOuvert] = React.useState(null);
|
|
17
|
+
const deroule = (menu) => ({
|
|
18
|
+
ouvert: menuOuvert === menu,
|
|
19
|
+
onOuvrir: (ouvert) => setMenuOuvert(ouvert ? menu : null),
|
|
20
|
+
});
|
|
21
|
+
return (_jsxs(ScrollView, { horizontal: true, nestedScrollEnabled: true, directionalLockEnabled: Platform.OS === 'ios', showsHorizontalScrollIndicator: false, contentContainerStyle: { flexDirection: 'row', gap: 8, alignItems: 'center' }, children: [_jsx(Box, { style: { minWidth: 200 }, children: _jsx(SearchField, { placeholder: "Button, Tabs, Card...", value: recherche, onChangeText: onRecherche, size: "sm" }) }), _jsx(FiltreDeroulant, { libelle: "Tags", options: tags.map(tag => ({ key: tag, label: tag })), choisi: tagChoisi, onChoisir: tag => {
|
|
22
|
+
onTag(tag);
|
|
23
|
+
setMenuOuvert(null);
|
|
24
|
+
}, ...deroule('tags') }), _jsx(FiltreDeroulant, { libelle: "Indicateurs", options: ALL_STORY_FLAGS, choisi: indicateurChoisi, onChoisir: indicateur => {
|
|
25
|
+
onIndicateur(indicateur);
|
|
26
|
+
setMenuOuvert(null);
|
|
27
|
+
}, ...deroule('indicateurs') })] }));
|
|
28
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColorEntry } from '../screens/paletteSections';
|
|
2
|
+
/**
|
|
3
|
+
* Une couleur de la palette, cliquable pour copier sa valeur. Le nom affiche est la derniere
|
|
4
|
+
* marche du chemin : le chemin entier tient rarement sur la largeur d'une pastille, et c'est la
|
|
5
|
+
* feuille qui identifie le jeton.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ColorSwatch: ({ entry }: {
|
|
8
|
+
entry: ColorEntry;
|
|
9
|
+
}) => import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ColorSwatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorSwatch.d.ts","sourceRoot":"","sources":["../../src/components/ColorSwatch.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,gCAsD3D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Typography, useToast } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import { Pressable } from 'react-native';
|
|
5
|
+
import { copier } from '../pressePapiers';
|
|
6
|
+
/**
|
|
7
|
+
* Une couleur de la palette, cliquable pour copier sa valeur. Le nom affiche est la derniere
|
|
8
|
+
* marche du chemin : le chemin entier tient rarement sur la largeur d'une pastille, et c'est la
|
|
9
|
+
* feuille qui identifie le jeton.
|
|
10
|
+
*/
|
|
11
|
+
export const ColorSwatch = ({ entry }) => {
|
|
12
|
+
const toast = useToast();
|
|
13
|
+
const { color, radius } = useTheme();
|
|
14
|
+
// Le repli sur le chemin entier ne sert qu'au typage : `split` rend toujours au moins un
|
|
15
|
+
// element, donc `pop` ne rend jamais `undefined` ici.
|
|
16
|
+
const tokenName = entry.path.split('.').pop() ?? entry.path;
|
|
17
|
+
const handleCopy = () => {
|
|
18
|
+
copier(entry.value, () => toast.present('Copié !', entry.value, { variant: 'success', duration: 1500 }));
|
|
19
|
+
};
|
|
20
|
+
return (_jsx(Pressable, { accessibilityRole: "button", onPress: handleCopy, style: { width: 120, marginBottom: 8 }, children: ({ pressed }) => (_jsxs(Box, { style: {
|
|
21
|
+
borderRadius: radius('md'),
|
|
22
|
+
overflow: 'hidden',
|
|
23
|
+
opacity: pressed ? 0.8 : 1,
|
|
24
|
+
borderWidth: 1,
|
|
25
|
+
borderColor: color.light.border['default-grey'],
|
|
26
|
+
}, children: [_jsx(Box, { style: { height: 56, backgroundColor: entry.value } }), _jsxs(Box, { style: {
|
|
27
|
+
paddingHorizontal: 8,
|
|
28
|
+
paddingVertical: 6,
|
|
29
|
+
backgroundColor: color.light.background['default-grey'],
|
|
30
|
+
}, children: [_jsx(Typography, { style: { fontSize: 11, fontWeight: '600', color: color.light.text['title-grey'], lineHeight: 14 }, numberOfLines: 1, children: tokenName }), _jsx(Typography, { style: {
|
|
31
|
+
fontSize: 10,
|
|
32
|
+
color: color.light.text['mention-grey'],
|
|
33
|
+
fontFamily: 'monospace',
|
|
34
|
+
lineHeight: 14,
|
|
35
|
+
marginTop: 2,
|
|
36
|
+
}, numberOfLines: 1, children: entry.value })] })] })) }));
|
|
37
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocFooter.d.ts","sourceRoot":"","sources":["../../src/components/DocFooter.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"DocFooter.d.ts","sourceRoot":"","sources":["../../src/components/DocFooter.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,mCAuBrB,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { ALVEOLE_COMPONENTS_VERSION, Box, Typography } from '@alveole/components
|
|
|
3
3
|
import { useTheme } from '@alveole/theme';
|
|
4
4
|
export const DocFooter = () => {
|
|
5
5
|
const { color, text } = useTheme();
|
|
6
|
-
return (_jsx(Box, { style: {
|
|
6
|
+
return (_jsx(Box, { tag: "footer", style: {
|
|
7
7
|
borderTopWidth: 1,
|
|
8
8
|
borderTopColor: color.light.border['default-grey'],
|
|
9
9
|
paddingTop: 12,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PageTitleProps } from './PageTitle';
|
|
3
|
+
export type EcranDeCatalogueProps = {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
sidebar?: React.ReactNode;
|
|
7
|
+
beforeContent?: React.ReactNode;
|
|
8
|
+
footerContent?: React.ReactNode;
|
|
9
|
+
breadcrumbsProps?: PageTitleProps['breadcrumbsProps'];
|
|
10
|
+
/** Les titres des sections de la page : fournis, l'ecran prend la mise en page d'une fiche, sommaire a droite. */
|
|
11
|
+
sommaire?: string[];
|
|
12
|
+
children: React.ReactNode;
|
|
13
|
+
};
|
|
14
|
+
/** La section `theme` n'a pas d'ecran a elle : son segment du fil d'Ariane ne mene nulle part. */
|
|
15
|
+
export declare const filDuTheme: PageTitleProps['breadcrumbsProps'];
|
|
16
|
+
/** L'echafaudage d'un ecran du catalogue : la page, sa zone sur toute la grille, puis son titre. */
|
|
17
|
+
export declare const EcranDeCatalogue: ({ title, description, sidebar, beforeContent, footerContent, breadcrumbsProps, sommaire, children, }: EcranDeCatalogueProps) => React.JSX.Element;
|
|
18
|
+
//# sourceMappingURL=EcranDeCatalogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EcranDeCatalogue.d.ts","sourceRoot":"","sources":["../../src/components/EcranDeCatalogue.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAKxD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,gBAAgB,CAAC,EAAE,cAAc,CAAC,kBAAkB,CAAC,CAAC;IACtD,kHAAkH;IAClH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,kBAAkB,CAEzD,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,GAAI,sGAS9B,qBAAqB,sBA4BvB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Page } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import { PageTitle } from './PageTitle';
|
|
5
|
+
import { ScreenZone } from './ScreenZone';
|
|
6
|
+
import { StoryLayout } from './StoryLayout';
|
|
7
|
+
import { StorySummary } from './StorySummary';
|
|
8
|
+
/** La section `theme` n'a pas d'ecran a elle : son segment du fil d'Ariane ne mene nulle part. */
|
|
9
|
+
export const filDuTheme = {
|
|
10
|
+
getHref: (segment, _index, path) => (segment === 'theme' ? null : path),
|
|
11
|
+
};
|
|
12
|
+
/** L'echafaudage d'un ecran du catalogue : la page, sa zone sur toute la grille, puis son titre. */
|
|
13
|
+
export const EcranDeCatalogue = ({ title, description, sidebar, beforeContent, footerContent, breadcrumbsProps, sommaire, children, }) => {
|
|
14
|
+
const { grilles, spacingValue } = useTheme();
|
|
15
|
+
return (_jsx(Page, { scrollable: true, title: title, description: description, sidebar: sidebar, beforeContent: beforeContent, footerContent: footerContent, children: sommaire ? (_jsx(StoryLayout, { sommaire: _jsx(StorySummary, { entrees: sommaire }), children: _jsxs(Box, { display: "flex", gap: spacingValue('6W'), children: [_jsx(PageTitle, { title: title, breadcrumbsProps: breadcrumbsProps }), children] }) })) : (_jsxs(ScreenZone, { largeur: grilles['12 colonnes'], children: [_jsx(PageTitle, { title: title, breadcrumbsProps: breadcrumbsProps }), children] })) }));
|
|
16
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { StorybookMeta } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Ce que la fiche annonce : son titre et sa description. Les tags, les indicateurs et le lien
|
|
4
|
+
* Figma documentent l'onglet qu'on regarde, pas la fiche en general : ils vivent sous la barre
|
|
5
|
+
* d'onglets, dans `ExemplesDeLaStory`, comme chez Primer.
|
|
6
|
+
*/
|
|
7
|
+
export declare const EnTeteDeFiche: ({ meta }: {
|
|
8
|
+
meta: StorybookMeta;
|
|
9
|
+
}) => import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=EnTeteDeFiche.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnTeteDeFiche.d.ts","sourceRoot":"","sources":["../../src/components/EnTeteDeFiche.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,UAAU;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,gCAW9D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, MarkdownDescription } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import { PageTitle } from './PageTitle';
|
|
5
|
+
/**
|
|
6
|
+
* Ce que la fiche annonce : son titre et sa description. Les tags, les indicateurs et le lien
|
|
7
|
+
* Figma documentent l'onglet qu'on regarde, pas la fiche en general : ils vivent sous la barre
|
|
8
|
+
* d'onglets, dans `ExemplesDeLaStory`, comme chez Primer.
|
|
9
|
+
*/
|
|
10
|
+
export const EnTeteDeFiche = ({ meta }) => {
|
|
11
|
+
const { color } = useTheme();
|
|
12
|
+
return (_jsxs(Box, { display: "flex", gap: 16, children: [_jsx(PageTitle, { title: meta.title }), _jsx(MarkdownDescription, { taille: "LG", color: color.light.text['mention-grey'], children: meta.description })] }));
|
|
13
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type ExampleBlockProps = {
|
|
3
|
+
/** La démonstration : le composant rendu tel qu'une application cliente l'obtiendrait. */
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/** Le code de l'exemple, entier. Ce qui est replié reste copiable en totalité. */
|
|
6
|
+
source?: string | null;
|
|
7
|
+
/** Les gabarits sont des écrans entiers : ils réclament de la hauteur, pas un centrage. */
|
|
8
|
+
pleinEcran?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/** Le bloc d'exemple : une démonstration et sa source, dans un seul cadre. */
|
|
11
|
+
export declare const ExampleBlock: ({ children, source, pleinEcran }: ExampleBlockProps) => React.JSX.Element;
|
|
12
|
+
//# sourceMappingURL=ExampleBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExampleBlock.d.ts","sourceRoot":"","sources":["../../src/components/ExampleBlock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AA6F1B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,0FAA0F;IAC1F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,YAAY,GAAI,kCAA0C,iBAAiB,sBAkCvF,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Button, Highlight, Typography } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { decouperSource } from '../storySource';
|
|
6
|
+
/** Au delà, la source prend plus de place que ce qu'elle documente. */
|
|
7
|
+
const LIGNES_VISIBLES = 12;
|
|
8
|
+
/** L'écart entre deux points de la trame : assez lâche pour rester un fond, pas une texture. */
|
|
9
|
+
const PAS_DE_LA_TRAME = 16;
|
|
10
|
+
/**
|
|
11
|
+
* La scène de la démonstration : le composant y est posé comme dans une application.
|
|
12
|
+
*
|
|
13
|
+
* Son fond reste celui de la page : le gris appartient au bloc de code juste en dessous, et
|
|
14
|
+
* le reprendre ici effacerait la frontière entre ce qu'on montre et la façon de l'écrire. La
|
|
15
|
+
* trame dit « surface de démonstration » sans dépenser une seconde valeur de fond.
|
|
16
|
+
*/
|
|
17
|
+
const Scene = ({ children, pleinEcran }) => {
|
|
18
|
+
const { color } = useTheme();
|
|
19
|
+
return (_jsx(Box, { p: '150', style: {
|
|
20
|
+
backgroundColor: color.light.background['default-grey'],
|
|
21
|
+
backgroundImage: `radial-gradient(circle, ${color.light.border['default-grey']} 1px, transparent 1px)`,
|
|
22
|
+
backgroundSize: `${PAS_DE_LA_TRAME}px ${PAS_DE_LA_TRAME}px`,
|
|
23
|
+
alignItems: pleinEcran ? undefined : 'center',
|
|
24
|
+
justifyContent: 'center',
|
|
25
|
+
minHeight: pleinEcran ? 420 : 160,
|
|
26
|
+
}, children: children }));
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* La barre qui sépare la démonstration de sa source : elle dit où finit ce qu'on montre et
|
|
30
|
+
* où commence la façon de l'écrire, ce qu'une ligne seule ne dirait pas.
|
|
31
|
+
*/
|
|
32
|
+
const BarreDeSource = ({ onCopier }) => {
|
|
33
|
+
const { color, spacingValue, text } = useTheme();
|
|
34
|
+
return (_jsxs(Box, { borderColor: color.light.border['default-grey'], style: {
|
|
35
|
+
alignItems: 'center',
|
|
36
|
+
backgroundColor: color.light.background['alt-grey'],
|
|
37
|
+
borderTopWidth: 1,
|
|
38
|
+
borderBottomWidth: 1,
|
|
39
|
+
flexDirection: 'row',
|
|
40
|
+
justifyContent: 'space-between',
|
|
41
|
+
// Les côtés s'alignent sur la colonne du code, qui est le contenu principal du bas
|
|
42
|
+
// du bloc ; la hauteur reste au plus juste de ce que la barre porte.
|
|
43
|
+
paddingLeft: spacingValue('2W'),
|
|
44
|
+
paddingRight: spacingValue('2W'),
|
|
45
|
+
paddingTop: spacingValue('1W'),
|
|
46
|
+
paddingBottom: spacingValue('1W'),
|
|
47
|
+
}, children: [_jsx(Typography, { style: { ...text['Corps de texte'].XS.CapsBold, color: color.light.text['mention-grey'] }, children: "tsx" }), _jsx(Button, { title: "Copier", size: "sm", variant: "tertiary", leading: "Copy", onPress: onCopier })] }));
|
|
48
|
+
};
|
|
49
|
+
const CommandeDeRepli = ({ deplie, onBascule }) => {
|
|
50
|
+
const { color } = useTheme();
|
|
51
|
+
return (_jsx(Box, { borderColor: color.light.border['default-grey'], style: {
|
|
52
|
+
alignItems: 'center',
|
|
53
|
+
backgroundColor: color.light.background['alt-grey'],
|
|
54
|
+
borderTopWidth: 1,
|
|
55
|
+
}, children: _jsx(Button, { title: deplie ? 'Replier' : 'Afficher tout', size: "sm", variant: "tertiary", trailing: deplie ? 'ChevronUp' : 'ChevronDown', onPress: onBascule }) }));
|
|
56
|
+
};
|
|
57
|
+
/** Le bloc d'exemple : une démonstration et sa source, dans un seul cadre. */
|
|
58
|
+
export const ExampleBlock = ({ children, source, pleinEcran = false }) => {
|
|
59
|
+
const { color, radius } = useTheme();
|
|
60
|
+
const [deplie, setDeplie] = React.useState(false);
|
|
61
|
+
const { visible, tronque } = decouperSource(source ?? '', LIGNES_VISIBLES);
|
|
62
|
+
// La source entière, repliée ou non : copier un extrait tronqué donnerait du code qui ne
|
|
63
|
+
// compile pas, ce qui est pire que pas de bouton.
|
|
64
|
+
const copier = () => {
|
|
65
|
+
if (source && typeof navigator !== 'undefined')
|
|
66
|
+
navigator.clipboard?.writeText(source);
|
|
67
|
+
};
|
|
68
|
+
return (_jsxs(Box, { borderColor: color.light.border['default-grey'], borderRadius: radius('md'), borderWidth: 1, style: { overflow: 'hidden' }, children: [_jsx(Scene, { pleinEcran: pleinEcran, children: children }), source ? (_jsxs(_Fragment, { children: [_jsx(BarreDeSource, { onCopier: copier }), _jsx(Highlight, { language: "tsx", variant: "embedded", children: deplie ? source : visible }), tronque ? _jsx(CommandeDeRepli, { deplie: deplie, onBascule: () => setDeplie(!deplie) }) : null] })) : null] }));
|
|
69
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Exemple, StorybookModule } from '../types';
|
|
2
|
+
export type ExemplesDeLaStoryProps = {
|
|
3
|
+
story: StorybookModule;
|
|
4
|
+
exemples: Exemple[];
|
|
5
|
+
/** Un gabarit se montre seul, en pleine page : ni titre ni description au-dessus du cadre. */
|
|
6
|
+
gabarit: boolean;
|
|
7
|
+
};
|
|
8
|
+
/** Les demonstrations d'une fiche, les unes sous les autres, sous le statut de la fiche. */
|
|
9
|
+
export declare const ExemplesDeLaStory: ({ story, exemples, gabarit }: ExemplesDeLaStoryProps) => import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ExemplesDeLaStory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExemplesDeLaStory.d.ts","sourceRoot":"","sources":["../../src/components/ExemplesDeLaStory.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAiB,eAAe,EAAE,MAAM,UAAU,CAAC;AAuEnE,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,8FAA8F;IAC9F,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,GAAI,8BAA8B,sBAAsB,gCAUrF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AnchorHeading, Box, MarkdownDescription, Tag, Typography } from '@alveole/components';
|
|
3
|
+
import { FOCUS_ATTRIBUTE, useTheme } from '@alveole/theme';
|
|
4
|
+
import { descriptionDeLExemple, sourceDeLExemple } from '../screens/sourcesDExemples';
|
|
5
|
+
import { getStoryFlags } from '../utils';
|
|
6
|
+
import { ExampleBlock } from './ExampleBlock';
|
|
7
|
+
/**
|
|
8
|
+
* Une demonstration. Le titre et la description appartiennent au document : ils restent dans le
|
|
9
|
+
* flux de la page, hors de tout cadre, pour pouvoir etre ancres et repris dans un sommaire. Le
|
|
10
|
+
* cadre n'entoure que ce qui est montre.
|
|
11
|
+
*/
|
|
12
|
+
const UnExemple = ({ story, nom, Rendu, gabarit }) => {
|
|
13
|
+
const { text } = useTheme();
|
|
14
|
+
const description = descriptionDeLExemple(story, nom);
|
|
15
|
+
return (_jsxs(Box, { display: "flex", gap: 12, children: [!gabarit ? (_jsxs(Box, { display: "flex", gap: 6, children: [_jsx(AnchorHeading, { style: text.Titres['H5 - XS'], children: nom }), description ? _jsx(MarkdownDescription, { children: description }) : null] })) : null, _jsx(ExampleBlock, { source: sourceDeLExemple(story, nom), pleinEcran: gabarit, children: _jsx(Rendu, {}) })] }));
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Les tags et le lien Figma : ils documentent l'onglet Examples qu'on regarde, pas la fiche en
|
|
19
|
+
* general, et vivent sous la barre d'onglets comme chez Primer plutot qu'au-dessus, dans un
|
|
20
|
+
* en-tete commun a tous les onglets.
|
|
21
|
+
*/
|
|
22
|
+
const StatutDeLaFiche = ({ meta }) => {
|
|
23
|
+
const { color, text } = useTheme();
|
|
24
|
+
return (_jsxs(Box, { display: "flex", flexDirection: "row", style: { alignItems: 'center', justifyContent: 'space-between' }, children: [_jsxs(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 8, children: [meta.tags.map(tag => (_jsx(Tag, { size: "md", children: tag }, tag))), getStoryFlags(meta).map(flag => (_jsx(Tag, { size: "md", children: flag.label }, flag.key)))] }), meta.figmaURL ? (_jsx("a", { href: meta.figmaURL, rel: "noreferrer", style: { textDecoration: 'none' }, target: "_blank", [FOCUS_ATTRIBUTE]: 'ring', children: _jsx(Typography, { style: { ...text['Corps de texte'].SM.Bold, color: color.light.text['action-high-primary'] }, children: "Ouvrir Figma" }) })) : null] }));
|
|
25
|
+
};
|
|
26
|
+
/** Les demonstrations d'une fiche, les unes sous les autres, sous le statut de la fiche. */
|
|
27
|
+
export const ExemplesDeLaStory = ({ story, exemples, gabarit }) => (_jsxs(Box, { display: "flex", gap: 40, mt: '5W', children: [_jsx(StatutDeLaFiche, { meta: story.default }), exemples.map(([nom, Rendu]) => (_jsx(UnExemple, { story: story, nom: nom, Rendu: Rendu, gabarit: gabarit }, nom)))] }));
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type OptionDeFiltre<Cle extends string = string> = {
|
|
2
|
+
key: Cle;
|
|
3
|
+
label: string;
|
|
4
|
+
};
|
|
5
|
+
export type FiltreDeroulantProps<Cle extends string> = {
|
|
6
|
+
/** Ce que le bouton annonce tant qu'aucune option n'est choisie. */
|
|
7
|
+
libelle: string;
|
|
8
|
+
options: readonly OptionDeFiltre<Cle>[];
|
|
9
|
+
choisi: Cle | null;
|
|
10
|
+
/** Rend la cle choisie, ou `null` quand l'option reprise annule le filtre. */
|
|
11
|
+
onChoisir: (choisi: Cle | null) => void;
|
|
12
|
+
ouvert: boolean;
|
|
13
|
+
onOuvrir: (ouvert: boolean) => void;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Un filtre a choix unique, presente comme un bouton qui deroule ses options. Le bouton porte
|
|
17
|
+
* l'option choisie plutot que son libelle generique : une fois le menu referme, c'est la seule
|
|
18
|
+
* trace du filtre actif. Reprendre l'option deja choisie l'annule, sans quoi on ne pourrait
|
|
19
|
+
* plus revenir a la liste entiere.
|
|
20
|
+
*/
|
|
21
|
+
export declare const FiltreDeroulant: <Cle extends string>({ libelle, options, choisi, onChoisir, ouvert, onOuvrir, }: FiltreDeroulantProps<Cle>) => import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=FiltreDeroulant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiltreDeroulant.d.ts","sourceRoot":"","sources":["../../src/components/FiltreDeroulant.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,oBAAoB,CAAC,GAAG,SAAS,MAAM,IAAI;IACrD,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IACnB,8EAA8E;IAC9E,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,GAAG,SAAS,MAAM,EAAE,4DAOjD,oBAAoB,CAAC,GAAG,CAAC,gCA0B3B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ActionMenu, Button } from '@alveole/components';
|
|
3
|
+
import { choixApres, libelleDuFiltre } from './choixDuFiltre';
|
|
4
|
+
/**
|
|
5
|
+
* Un filtre a choix unique, presente comme un bouton qui deroule ses options. Le bouton porte
|
|
6
|
+
* l'option choisie plutot que son libelle generique : une fois le menu referme, c'est la seule
|
|
7
|
+
* trace du filtre actif. Reprendre l'option deja choisie l'annule, sans quoi on ne pourrait
|
|
8
|
+
* plus revenir a la liste entiere.
|
|
9
|
+
*/
|
|
10
|
+
export const FiltreDeroulant = ({ libelle, options, choisi, onChoisir, ouvert, onOuvrir, }) => (_jsx(ActionMenu, { placement: "bottom-start", scrollable: false, open: ouvert, setOpen: onOuvrir, renderTrigger: () => (_jsx(Button, { variant: "secondary", title: libelleDuFiltre({ libelle, options, choisi }), trailing: "ChevronDown", size: "sm", selected: choisi !== null, active: ouvert })), children: options.map(option => (_jsx(ActionMenu.Item, { title: option.label, selected: choisi === option.key, onPress: () => onChoisir(choixApres(choisi, option.key)) }, option.key))) }));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { StorybookModule } from '../types';
|
|
2
|
+
export type GroupeDeFiches = readonly [tag: string, fiches: StorybookModule[]];
|
|
3
|
+
export type GrilleDeFichesProps = {
|
|
4
|
+
groupes: readonly GroupeDeFiches[];
|
|
5
|
+
/** La largeur d'une carte, calculee une fois pour toute la grille. */
|
|
6
|
+
largeurDeFiche: string;
|
|
7
|
+
getStoryHref: (story: StorybookModule) => string;
|
|
8
|
+
messageVide: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Les fiches, rangees sous le tag qui les groupe. Une carte s'etire sur la hauteur de sa
|
|
12
|
+
* rangee pour que les bas de cartes s'alignent malgre des descriptions inegales.
|
|
13
|
+
*/
|
|
14
|
+
export declare const GrilleDeFiches: ({ groupes, largeurDeFiche, getStoryHref, messageVide }: GrilleDeFichesProps) => import("react").JSX.Element | import("react").JSX.Element[];
|
|
15
|
+
//# sourceMappingURL=GrilleDeFiches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrilleDeFiches.d.ts","sourceRoot":"","sources":["../../src/components/GrilleDeFiches.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,wDAAwD,mBAAmB,gEAiBzG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Typography } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import { StoryCard } from './StoryCard';
|
|
5
|
+
/**
|
|
6
|
+
* Les fiches, rangees sous le tag qui les groupe. Une carte s'etire sur la hauteur de sa
|
|
7
|
+
* rangee pour que les bas de cartes s'alignent malgre des descriptions inegales.
|
|
8
|
+
*/
|
|
9
|
+
export const GrilleDeFiches = ({ groupes, largeurDeFiche, getStoryHref, messageVide }) => {
|
|
10
|
+
const { text } = useTheme();
|
|
11
|
+
if (groupes.length === 0)
|
|
12
|
+
return _jsx(Typography, { style: text['Corps de texte'].MD.Regular, children: messageVide });
|
|
13
|
+
return groupes.map(([tag, fiches]) => (_jsxs(Box, { display: "flex", gap: 16, children: [_jsx(Typography, { style: text.Titres['H4 - SM'], children: tag }), _jsx(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 16, children: fiches.map(fiche => (_jsx(Box, { style: { alignSelf: 'stretch', width: largeurDeFiche }, children: _jsx(StoryCard, { story: fiche, href: getStoryHref(fiche) }) }, fiche.default.title))) })] }, tag)));
|
|
14
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type MenuCardProps = {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
onPress: () => void;
|
|
5
|
+
};
|
|
6
|
+
/** Une entree de menu du kit : un titre, ce qu'on trouve derriere, et le moyen d'y aller. */
|
|
7
|
+
export declare const MenuCard: ({ title, description, onPress }: MenuCardProps) => import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=MenuCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuCard.d.ts","sourceRoot":"","sources":["../../src/components/MenuCard.tsx"],"names":[],"mappings":"AAGA,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,6FAA6F;AAC7F,eAAO,MAAM,QAAQ,GAAI,iCAAiC,aAAa,gCAWtE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Card, Typography } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
/** Une entree de menu du kit : un titre, ce qu'on trouve derriere, et le moyen d'y aller. */
|
|
5
|
+
export const MenuCard = ({ title, description, onPress }) => {
|
|
6
|
+
const { text } = useTheme();
|
|
7
|
+
return (_jsx(Card, { onPress: onPress, children: _jsxs(Box, { display: "flex", gap: 8, p: '150', children: [_jsx(Typography, { style: text.Titres['H4 - SM'], children: title }), _jsx(Typography, { style: text['Corps de texte'].SM.Regular, children: description })] }) }));
|
|
8
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Breadcrumbs } from '@alveole/components';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export type PageTitleProps = {
|
|
4
|
+
/** Titre de la page du catalogue. */
|
|
5
|
+
title: string;
|
|
6
|
+
/** Props passées au Breadcrumbs (rootLabel, getLabel, getHref). */
|
|
7
|
+
breadcrumbsProps?: React.ComponentProps<typeof Breadcrumbs>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Le titre d'une page du catalogue, fil d'Ariane compris.
|
|
11
|
+
*
|
|
12
|
+
* Le catalogue est un site de documentation : il ne titre pas ses pages avec `PageHeader`, qui
|
|
13
|
+
* est l'en-tête des écrans d'une application cliente et se lit dans le registre applicatif.
|
|
14
|
+
* Primer sert sa documentation avec un paquet à part, Atlassian avec un style hors de son
|
|
15
|
+
* échelle, Uber avec son échelle mais sans passer par un en-tête d'application. Ici le titre
|
|
16
|
+
* prend le cran le plus haut de notre échelle, celui que les deux premiers emploient : 40.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PageTitle: ({ title, breadcrumbsProps }: PageTitleProps) => React.JSX.Element;
|
|
19
|
+
//# sourceMappingURL=PageTitle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageTitle.d.ts","sourceRoot":"","sources":["../../src/components/PageTitle.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG;IAC3B,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC;CAC7D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,GAAI,6BAA6B,cAAc,sBAWpE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Breadcrumbs, Typography } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
/**
|
|
5
|
+
* Le titre d'une page du catalogue, fil d'Ariane compris.
|
|
6
|
+
*
|
|
7
|
+
* Le catalogue est un site de documentation : il ne titre pas ses pages avec `PageHeader`, qui
|
|
8
|
+
* est l'en-tête des écrans d'une application cliente et se lit dans le registre applicatif.
|
|
9
|
+
* Primer sert sa documentation avec un paquet à part, Atlassian avec un style hors de son
|
|
10
|
+
* échelle, Uber avec son échelle mais sans passer par un en-tête d'application. Ici le titre
|
|
11
|
+
* prend le cran le plus haut de notre échelle, celui que les deux premiers emploient : 40.
|
|
12
|
+
*/
|
|
13
|
+
export const PageTitle = ({ title, breadcrumbsProps }) => {
|
|
14
|
+
const { spacingValue, text, color } = useTheme();
|
|
15
|
+
return (_jsxs(Box, { display: "flex", gap: spacingValue('4W'), children: [_jsx(Breadcrumbs, { ...breadcrumbsProps }), _jsx(Typography, { tag: "h1", style: { ...text.Titres['H1 - XL'], color: color.light.text['title-grey'] }, children: title })] }));
|
|
16
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type ScreenZoneProps = {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
/**
|
|
5
|
+
* La largeur de la zone, prise dans la grille. Elle dépend de ce que la page contient :
|
|
6
|
+
* une largeur de lecture pour du texte, la grille entière pour une liste de cartes.
|
|
7
|
+
*/
|
|
8
|
+
largeur: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Le repère principal d'un écran du catalogue : l'enveloppe porte les marges de la page,
|
|
12
|
+
* la zone porte sa largeur et se centre dans ce qui reste. C'est la construction du `main`
|
|
13
|
+
* de Primer, padding puis maxWidth puis marges automatiques.
|
|
14
|
+
*
|
|
15
|
+
* `tag` n'a pas d'effet sur natif. Sans ce repère, un lecteur d'écran ne peut pas sauter
|
|
16
|
+
* directement au contenu ; une <section> sans nom accessible n'en est pas un, d'où <main>.
|
|
17
|
+
*/
|
|
18
|
+
export declare const ScreenZone: ({ children, largeur }: ScreenZoneProps) => React.JSX.Element;
|
|
19
|
+
//# sourceMappingURL=ScreenZone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenZone.d.ts","sourceRoot":"","sources":["../../src/components/ScreenZone.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,uBAAuB,eAAe,sBAoChE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
/**
|
|
5
|
+
* Le repère principal d'un écran du catalogue : l'enveloppe porte les marges de la page,
|
|
6
|
+
* la zone porte sa largeur et se centre dans ce qui reste. C'est la construction du `main`
|
|
7
|
+
* de Primer, padding puis maxWidth puis marges automatiques.
|
|
8
|
+
*
|
|
9
|
+
* `tag` n'a pas d'effet sur natif. Sans ce repère, un lecteur d'écran ne peut pas sauter
|
|
10
|
+
* directement au contenu ; une <section> sans nom accessible n'en est pas un, d'où <main>.
|
|
11
|
+
*/
|
|
12
|
+
export const ScreenZone = ({ children, largeur }) => {
|
|
13
|
+
const { isVariant, spacingValue } = useTheme();
|
|
14
|
+
// Les marges d'une page de documentation valent le double du padding qu'`externalPadding`
|
|
15
|
+
// pose dans une application cliente : la page n'a que du texte à porter. Sur un téléphone
|
|
16
|
+
// il n'y a plus de vide à répartir, et la même bascule que le thème rend la largeur à la
|
|
17
|
+
// lecture plutôt qu'aux côtés.
|
|
18
|
+
const marge = isVariant('mobile')
|
|
19
|
+
? { cote: spacingValue('3W'), haut: spacingValue('6W') }
|
|
20
|
+
: { cote: spacingValue('6W'), haut: spacingValue('12W') };
|
|
21
|
+
return (_jsx(Box, { tag: "main", style: {
|
|
22
|
+
display: 'flex',
|
|
23
|
+
paddingBottom: spacingValue('3W'),
|
|
24
|
+
paddingLeft: marge.cote,
|
|
25
|
+
paddingRight: marge.cote,
|
|
26
|
+
paddingTop: marge.haut,
|
|
27
|
+
}, children: _jsx(Box, { style: {
|
|
28
|
+
display: 'flex',
|
|
29
|
+
gap: spacingValue('3W'),
|
|
30
|
+
marginLeft: 'auto',
|
|
31
|
+
marginRight: 'auto',
|
|
32
|
+
maxWidth: largeur,
|
|
33
|
+
width: '100%',
|
|
34
|
+
}, children: children }) }));
|
|
35
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoryCard.d.ts","sourceRoot":"","sources":["../../src/components/StoryCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"StoryCard.d.ts","sourceRoot":"","sources":["../../src/components/StoryCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI3C,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,iBAAiB,cAAc,gCA8BxD,CAAC"}
|
|
@@ -2,10 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { A, Badge, Box, Card, Typography } from '@alveole/components';
|
|
3
3
|
import { useTheme } from '@alveole/theme';
|
|
4
4
|
import { getStoryFlags, stripMarkdown } from '../utils';
|
|
5
|
+
import { hauteurDeCarte } from './hauteurDeCarte';
|
|
5
6
|
export const StoryCard = ({ story, href }) => {
|
|
6
7
|
const { text, isVariant } = useTheme();
|
|
7
8
|
const meta = story.default;
|
|
8
9
|
const flags = getStoryFlags(meta);
|
|
10
|
+
const height = hauteurDeCarte(isVariant('mobile'));
|
|
9
11
|
const description = meta.shortDescription ?? stripMarkdown(meta.description);
|
|
10
|
-
return (_jsx(A, { href: href, style: { height
|
|
12
|
+
return (_jsx(A, { href: href, style: { height }, children: _jsx(Card, { height: height, children: _jsxs(Box, { display: "flex", gap: 12, p: '100', style: { height }, children: [_jsxs(Box, { display: "flex", flexDirection: "row", flexWrap: "wrap", gap: 8, children: [meta.tags.map(tag => (_jsx(Badge, { variant: "info", size: "sm", style: { marginRight: 0 }, children: tag }, tag))), flags.map(flag => (_jsx(Badge, { variant: "default", size: "sm", style: { marginRight: 0 }, children: flag.label }, flag.key)))] }), _jsx(Typography, { style: text.Titres['H5 - XS'], children: meta.title }), _jsx(Typography, { style: text['Corps de texte'].SM.Regular, children: description })] }) }) }));
|
|
11
13
|
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type StoryLayoutProps = {
|
|
3
|
+
/** Le corps de la fiche : sa largeur est ce que la zone laisse, jamais un nombre choisi. */
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/** La table des matières de la page, servie avant le corps. */
|
|
6
|
+
sommaire?: React.ReactNode;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* La mise en page d'une fiche : neuf colonnes de zone, dont deux pour le sommaire et une
|
|
10
|
+
* gouttière, le reste revenant à la lecture. Le sommaire est déclaré avant le corps et rendu
|
|
11
|
+
* à droite, comme le fait le thème de documentation de Primer.
|
|
12
|
+
*/
|
|
13
|
+
export declare const StoryLayout: ({ children, sommaire }: StoryLayoutProps) => React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=StoryLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoryLayout.d.ts","sourceRoot":"","sources":["../../src/components/StoryLayout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,4FAA4F;IAC5F,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,wBAAwB,gBAAgB,sBA0BnE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box } from '@alveole/components';
|
|
3
|
+
import { useTheme } from '@alveole/theme';
|
|
4
|
+
import { Platform } from 'react-native';
|
|
5
|
+
import { ScreenZone } from './ScreenZone';
|
|
6
|
+
/**
|
|
7
|
+
* La mise en page d'une fiche : neuf colonnes de zone, dont deux pour le sommaire et une
|
|
8
|
+
* gouttière, le reste revenant à la lecture. Le sommaire est déclaré avant le corps et rendu
|
|
9
|
+
* à droite, comme le fait le thème de documentation de Primer.
|
|
10
|
+
*/
|
|
11
|
+
export const StoryLayout = ({ children, sommaire }) => {
|
|
12
|
+
const { grilles, isVariant, spacingValue } = useTheme();
|
|
13
|
+
// Le sommaire ne cède pas ses deux colonnes : sous la largeur bureau il ne resterait pas
|
|
14
|
+
// assez pour ce que la fiche documente, des blocs de code. Primer retire sa table des
|
|
15
|
+
// matières plutôt que de la comprimer, et rend la largeur à la lecture.
|
|
16
|
+
const voletVisible = sommaire != null && isVariant('desktop');
|
|
17
|
+
// `position: sticky` n'existe pas nativement (RN n'accepte que absolute/relative) : sans le
|
|
18
|
+
// garde-fou web, la valeur traverserait telle quelle jusqu'à iOS/Android.
|
|
19
|
+
const collant = Platform.OS === 'web' ? { position: 'sticky', top: spacingValue('3W') } : {};
|
|
20
|
+
return (_jsx(ScreenZone, { largeur: grilles['9 colonnes'], children: _jsxs(Box, { style: { flexDirection: 'row-reverse', gap: spacingValue('3W') }, children: [voletVisible ? (_jsx(Box, { style: { flexShrink: 0, width: grilles['2 colonnes'] }, children: _jsx(Box, { style: collant, children: sommaire }) })) : null, _jsx(Box, { style: { flexGrow: 1, flexShrink: 1, minWidth: 0 }, children: children })] }) }));
|
|
21
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type StorySummaryProps = {
|
|
2
|
+
/** Les titres des sections de la page, dans l'ordre où elle les présente. */
|
|
3
|
+
entrees: string[];
|
|
4
|
+
};
|
|
5
|
+
/** Le sommaire d'une page : une entrée par section, vers l'ancre que pose son titre. */
|
|
6
|
+
export declare const StorySummary: ({ entrees }: StorySummaryProps) => import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=StorySummary.d.ts.map
|