@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.
Files changed (138) hide show
  1. package/dist/components/BarreDeFiltres.d.ts +20 -0
  2. package/dist/components/BarreDeFiltres.d.ts.map +1 -0
  3. package/dist/components/BarreDeFiltres.js +28 -0
  4. package/dist/components/ColorSwatch.d.ts +10 -0
  5. package/dist/components/ColorSwatch.d.ts.map +1 -0
  6. package/dist/components/ColorSwatch.js +37 -0
  7. package/dist/components/DocFooter.d.ts.map +1 -1
  8. package/dist/components/DocFooter.js +1 -1
  9. package/dist/components/EcranDeCatalogue.d.ts +18 -0
  10. package/dist/components/EcranDeCatalogue.d.ts.map +1 -0
  11. package/dist/components/EcranDeCatalogue.js +16 -0
  12. package/dist/components/EnTeteDeFiche.d.ts +10 -0
  13. package/dist/components/EnTeteDeFiche.d.ts.map +1 -0
  14. package/dist/components/EnTeteDeFiche.js +13 -0
  15. package/dist/components/ExampleBlock.d.ts +12 -0
  16. package/dist/components/ExampleBlock.d.ts.map +1 -0
  17. package/dist/components/ExampleBlock.js +69 -0
  18. package/dist/components/ExemplesDeLaStory.d.ts +10 -0
  19. package/dist/components/ExemplesDeLaStory.d.ts.map +1 -0
  20. package/dist/components/ExemplesDeLaStory.js +27 -0
  21. package/dist/components/FiltreDeroulant.d.ts +22 -0
  22. package/dist/components/FiltreDeroulant.d.ts.map +1 -0
  23. package/dist/components/FiltreDeroulant.js +10 -0
  24. package/dist/components/GrilleDeFiches.d.ts +15 -0
  25. package/dist/components/GrilleDeFiches.d.ts.map +1 -0
  26. package/dist/components/GrilleDeFiches.js +14 -0
  27. package/dist/components/MenuCard.d.ts +9 -0
  28. package/dist/components/MenuCard.d.ts.map +1 -0
  29. package/dist/components/MenuCard.js +8 -0
  30. package/dist/components/PageTitle.d.ts +19 -0
  31. package/dist/components/PageTitle.d.ts.map +1 -0
  32. package/dist/components/PageTitle.js +16 -0
  33. package/dist/components/ScreenZone.d.ts +19 -0
  34. package/dist/components/ScreenZone.d.ts.map +1 -0
  35. package/dist/components/ScreenZone.js +35 -0
  36. package/dist/components/StoryCard.d.ts.map +1 -1
  37. package/dist/components/StoryCard.js +3 -1
  38. package/dist/components/StoryLayout.d.ts +14 -0
  39. package/dist/components/StoryLayout.d.ts.map +1 -0
  40. package/dist/components/StoryLayout.js +21 -0
  41. package/dist/components/StorySummary.d.ts +7 -0
  42. package/dist/components/StorySummary.d.ts.map +1 -0
  43. package/dist/components/StorySummary.js +8 -0
  44. package/dist/components/UIKitColumn.d.ts +25 -0
  45. package/dist/components/UIKitColumn.d.ts.map +1 -0
  46. package/dist/components/UIKitColumn.js +24 -0
  47. package/dist/components/UIKitTopBar.d.ts +11 -2
  48. package/dist/components/UIKitTopBar.d.ts.map +1 -1
  49. package/dist/components/UIKitTopBar.js +84 -27
  50. package/dist/components/choixDuFiltre.d.ts +14 -0
  51. package/dist/components/choixDuFiltre.d.ts.map +1 -0
  52. package/dist/components/choixDuFiltre.js +10 -0
  53. package/dist/components/hauteurDeCarte.d.ts +6 -0
  54. package/dist/components/hauteurDeCarte.d.ts.map +1 -0
  55. package/dist/components/hauteurDeCarte.js +5 -0
  56. package/dist/index.d.ts +3 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +3 -0
  59. package/dist/navigation.d.ts +6 -0
  60. package/dist/navigation.d.ts.map +1 -0
  61. package/dist/navigation.js +3 -0
  62. package/dist/pages/InstallationPage.d.ts +8 -0
  63. package/dist/pages/InstallationPage.d.ts.map +1 -0
  64. package/dist/pages/InstallationPage.js +13 -0
  65. package/dist/pages/PhilosophyPage.d.ts +2 -1
  66. package/dist/pages/PhilosophyPage.d.ts.map +1 -1
  67. package/dist/pages/PhilosophyPage.js +7 -7
  68. package/dist/pages/UIKitHomePage.d.ts.map +1 -1
  69. package/dist/pages/UIKitHomePage.js +3 -7
  70. package/dist/pages/UIKitPage.d.ts +3 -4
  71. package/dist/pages/UIKitPage.d.ts.map +1 -1
  72. package/dist/pages/UIKitPage.js +59 -36
  73. package/dist/pages/UIKitThemePage.d.ts +6 -1
  74. package/dist/pages/UIKitThemePage.d.ts.map +1 -1
  75. package/dist/pages/UIKitThemePage.js +4 -8
  76. package/dist/pages/ecransDuKit.d.ts +18 -0
  77. package/dist/pages/ecransDuKit.d.ts.map +1 -0
  78. package/dist/pages/ecransDuKit.js +11 -0
  79. package/dist/pages/installation.d.ts +18 -0
  80. package/dist/pages/installation.d.ts.map +1 -0
  81. package/dist/pages/installation.js +218 -0
  82. package/dist/pages/installationOutillage.d.ts +7 -0
  83. package/dist/pages/installationOutillage.d.ts.map +1 -0
  84. package/dist/pages/installationOutillage.js +152 -0
  85. package/dist/pages/philosophie.d.ts +10 -0
  86. package/dist/pages/philosophie.d.ts.map +1 -0
  87. package/dist/pages/philosophie.js +46 -0
  88. package/dist/pressePapiers.d.ts +10 -0
  89. package/dist/pressePapiers.d.ts.map +1 -0
  90. package/dist/pressePapiers.js +14 -0
  91. package/dist/screens/StoriesScreen.d.ts +2 -1
  92. package/dist/screens/StoriesScreen.d.ts.map +1 -1
  93. package/dist/screens/StoriesScreen.js +18 -35
  94. package/dist/screens/StoryDetailScreen.d.ts +2 -1
  95. package/dist/screens/StoryDetailScreen.d.ts.map +1 -1
  96. package/dist/screens/StoryDetailScreen.js +24 -74
  97. package/dist/screens/ThemeCSSVariablesScreen.d.ts +2 -1
  98. package/dist/screens/ThemeCSSVariablesScreen.d.ts.map +1 -1
  99. package/dist/screens/ThemeCSSVariablesScreen.js +7 -97
  100. package/dist/screens/ThemeConstantDetailScreen.d.ts +2 -1
  101. package/dist/screens/ThemeConstantDetailScreen.d.ts.map +1 -1
  102. package/dist/screens/ThemeConstantDetailScreen.js +4 -4
  103. package/dist/screens/ThemeConstantsScreen.d.ts +2 -1
  104. package/dist/screens/ThemeConstantsScreen.d.ts.map +1 -1
  105. package/dist/screens/ThemeConstantsScreen.js +7 -8
  106. package/dist/screens/ThemePaletteScreen.d.ts +2 -1
  107. package/dist/screens/ThemePaletteScreen.d.ts.map +1 -1
  108. package/dist/screens/ThemePaletteScreen.js +11 -92
  109. package/dist/screens/ThemeTypographyScreen.d.ts +2 -1
  110. package/dist/screens/ThemeTypographyScreen.d.ts.map +1 -1
  111. package/dist/screens/ThemeTypographyScreen.js +6 -6
  112. package/dist/screens/colonnesDeFiches.d.ts +6 -0
  113. package/dist/screens/colonnesDeFiches.d.ts.map +1 -0
  114. package/dist/screens/colonnesDeFiches.js +20 -0
  115. package/dist/screens/paletteSections.d.ts +30 -0
  116. package/dist/screens/paletteSections.d.ts.map +1 -0
  117. package/dist/screens/paletteSections.js +76 -0
  118. package/dist/screens/sourcesDExemples.d.ts +17 -0
  119. package/dist/screens/sourcesDExemples.d.ts.map +1 -0
  120. package/dist/screens/sourcesDExemples.js +27 -0
  121. package/dist/screens/variablesCSSDuTheme.d.ts +12 -0
  122. package/dist/screens/variablesCSSDuTheme.d.ts.map +1 -0
  123. package/dist/screens/variablesCSSDuTheme.js +77 -0
  124. package/dist/screens/variablesDeTypographie.d.ts +8 -0
  125. package/dist/screens/variablesDeTypographie.d.ts.map +1 -0
  126. package/dist/screens/variablesDeTypographie.js +23 -0
  127. package/dist/storySource.d.ts +7 -0
  128. package/dist/storySource.d.ts.map +1 -0
  129. package/dist/storySource.js +7 -0
  130. package/dist/types.d.ts +2 -1
  131. package/dist/types.d.ts.map +1 -1
  132. package/dist/utils.d.ts +11 -3
  133. package/dist/utils.d.ts.map +1 -1
  134. package/dist/utils.js +20 -4
  135. package/package.json +19 -9
  136. package/dist/styles.d.ts +0 -7
  137. package/dist/styles.d.ts.map +0 -1
  138. package/dist/styles.js +0 -6
@@ -0,0 +1,30 @@
1
+ export type ColorEntry = {
2
+ path: string;
3
+ value: string;
4
+ };
5
+ export type ColorSection = {
6
+ title: string;
7
+ entries: ColorEntry[];
8
+ deprecated?: boolean;
9
+ };
10
+ /**
11
+ * Les couleurs d'un groupe, aplaties en chemins pointes. La palette imbrique ses familles a
12
+ * des profondeurs variables, et seule la feuille porte une valeur : tout ce qui n'est ni une
13
+ * chaine ni un objet n'a rien a montrer et disparait.
14
+ */
15
+ export declare function flattenColors(obj: object, prefix?: string): ColorEntry[];
16
+ /**
17
+ * Les sections affichees : une par famille du mode clair, puis les cles historiques. Seul le
18
+ * mode clair est montre - le catalogue ne rend pas encore le mode sombre, et l'afficher
19
+ * laisserait croire qu'il est disponible. Une famille vide n'a pas de section : un accordeon
20
+ * qu'on deplie sur rien se lit comme une erreur.
21
+ */
22
+ export declare function buildSections(palette: Record<string, unknown>): ColorSection[];
23
+ /** Le nombre de jetons d'une section, tel que son en-tete l'annonce. */
24
+ export declare function compteDeJetons({ entries: { length } }: ColorSection): string;
25
+ /**
26
+ * Les sections depliees a l'ouverture de l'ecran : les familles, et non l'historique, qui est
27
+ * ce qui reste a migrer, pas ce qu'on vient consulter.
28
+ */
29
+ export declare function sectionsOuvertesAuDepart(sections: ColorSection[]): string[];
30
+ //# sourceMappingURL=paletteSections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paletteSections.d.ts","sourceRoot":"","sources":["../../src/screens/paletteSections.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzD,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,UAAU,EAAE,CAWpE;AA8BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,CAc9E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,GAAG,MAAM,CAE5E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAE3E"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Les couleurs d'un groupe, aplaties en chemins pointes. La palette imbrique ses familles a
3
+ * des profondeurs variables, et seule la feuille porte une valeur : tout ce qui n'est ni une
4
+ * chaine ni un objet n'a rien a montrer et disparait.
5
+ */
6
+ export function flattenColors(obj, prefix = '') {
7
+ const entries = [];
8
+ for (const [key, val] of Object.entries(obj)) {
9
+ const path = prefix ? `${prefix}.${key}` : key;
10
+ if (typeof val === 'string') {
11
+ entries.push({ path, value: val });
12
+ }
13
+ else if (val && typeof val === 'object') {
14
+ entries.push(...flattenColors(val, path));
15
+ }
16
+ }
17
+ return entries;
18
+ }
19
+ /**
20
+ * Les cles de premier niveau qui precedent le rangement par mode. Elles ne sont plus alimentees,
21
+ * mais restent lues par du code existant : la palette les garde, et l'ecran les montre a part.
22
+ */
23
+ const DEPRECATED_KEYS = [
24
+ 'primary',
25
+ 'transparent',
26
+ 'danger',
27
+ 'info',
28
+ 'success',
29
+ 'warning',
30
+ 'link',
31
+ 'text',
32
+ 'border',
33
+ 'background',
34
+ 'system',
35
+ ];
36
+ /** Les cles historiques encore presentes, rassemblees en une seule liste. */
37
+ function deprecatedEntries(palette) {
38
+ return DEPRECATED_KEYS.flatMap(key => {
39
+ const val = palette[key];
40
+ if (typeof val === 'string')
41
+ return [{ path: key, value: val }];
42
+ if (val && typeof val === 'object')
43
+ return flattenColors(val, key);
44
+ return [];
45
+ });
46
+ }
47
+ /**
48
+ * Les sections affichees : une par famille du mode clair, puis les cles historiques. Seul le
49
+ * mode clair est montre - le catalogue ne rend pas encore le mode sombre, et l'afficher
50
+ * laisserait croire qu'il est disponible. Une famille vide n'a pas de section : un accordeon
51
+ * qu'on deplie sur rien se lit comme une erreur.
52
+ */
53
+ export function buildSections(palette) {
54
+ const clair = typeof palette.light === 'object' && palette.light !== null ? palette.light : {};
55
+ const familles = Object.entries(clair)
56
+ .map(([groupKey, groupVal]) => ({
57
+ title: `light / ${groupKey}`,
58
+ entries: flattenColors({ [groupKey]: groupVal }, 'light'),
59
+ }))
60
+ .filter(section => section.entries.length > 0);
61
+ const historiques = deprecatedEntries(palette);
62
+ if (historiques.length === 0)
63
+ return familles;
64
+ return [...familles, { title: 'Deprecated', entries: historiques, deprecated: true }];
65
+ }
66
+ /** Le nombre de jetons d'une section, tel que son en-tete l'annonce. */
67
+ export function compteDeJetons({ entries: { length } }) {
68
+ return `${length} token${length > 1 ? 's' : ''}`;
69
+ }
70
+ /**
71
+ * Les sections depliees a l'ouverture de l'ecran : les familles, et non l'historique, qui est
72
+ * ce qui reste a migrer, pas ce qu'on vient consulter.
73
+ */
74
+ export function sectionsOuvertesAuDepart(sections) {
75
+ return sections.filter(section => !section.deprecated).map(section => section.title);
76
+ }
@@ -0,0 +1,17 @@
1
+ import { StorybookMeta, StorybookModule } from '../types';
2
+ /**
3
+ * Le code d'un exemple, ou `null` quand la fiche ne le publie pas : la demonstration se montre
4
+ * alors sans son code. Les premieres fiches posaient leurs sources a la racine du bloc, les
5
+ * suivantes les rangent sous `storySources` ; les deux se lisent. Une source publiee en
6
+ * fonction n'est construite qu'ici, a la demande.
7
+ */
8
+ export declare const sourceDeLExemple: (story: StorybookModule, nomDeLExemple: string) => string | null;
9
+ /** Le texte qui accompagne un exemple, ou `null` quand la fiche n'en donne pas. */
10
+ export declare const descriptionDeLExemple: (story: StorybookModule, nomDeLExemple: string) => string | null;
11
+ /**
12
+ * Ce que la fiche annonce hors de l'ecran : la balise `description` de la page, lue par les
13
+ * moteurs et les apercus de lien. Le resume court prime quand la fiche en donne un ; sinon la
14
+ * description longue sert, debarrassee de son balisage, qu'une balise `meta` afficherait tel quel.
15
+ */
16
+ export declare const resumeDeLaFiche: (meta: StorybookMeta) => string;
17
+ //# sourceMappingURL=sourcesDExemples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcesDExemples.d.ts","sourceRoot":"","sources":["../../src/screens/sourcesDExemples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG1D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,EAAE,eAAe,MAAM,KAAG,MAAM,GAAG,IAQzF,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,GAAI,OAAO,eAAe,EAAE,eAAe,MAAM,KAAG,MAAM,GAAG,IAI9F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,aAAa,KAAG,MACI,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { stripMarkdown } from '../utils';
2
+ /**
3
+ * Le code d'un exemple, ou `null` quand la fiche ne le publie pas : la demonstration se montre
4
+ * alors sans son code. Les premieres fiches posaient leurs sources a la racine du bloc, les
5
+ * suivantes les rangent sous `storySources` ; les deux se lisent. Une source publiee en
6
+ * fonction n'est construite qu'ici, a la demande.
7
+ */
8
+ export const sourceDeLExemple = (story, nomDeLExemple) => {
9
+ const sources = story.Sources;
10
+ const source = sources?.storySources?.[nomDeLExemple] ?? sources?.[nomDeLExemple];
11
+ if (typeof source === 'string')
12
+ return source;
13
+ if (typeof source === 'function')
14
+ return source();
15
+ return null;
16
+ };
17
+ /** Le texte qui accompagne un exemple, ou `null` quand la fiche n'en donne pas. */
18
+ export const descriptionDeLExemple = (story, nomDeLExemple) => {
19
+ const description = story.Sources?.storyDescriptions?.[nomDeLExemple];
20
+ return typeof description === 'string' ? description : null;
21
+ };
22
+ /**
23
+ * Ce que la fiche annonce hors de l'ecran : la balise `description` de la page, lue par les
24
+ * moteurs et les apercus de lien. Le resume court prime quand la fiche en donne un ; sinon la
25
+ * description longue sert, debarrassee de son balisage, qu'une balise `meta` afficherait tel quel.
26
+ */
27
+ export const resumeDeLaFiche = (meta) => meta.shortDescription ?? stripMarkdown(meta.description);
@@ -0,0 +1,12 @@
1
+ export type PreviewKind = 'color' | 'spacing' | 'elevation' | 'radius' | 'none';
2
+ export type CSSVarEntry = {
3
+ name: string;
4
+ rawValue: string;
5
+ preview: PreviewKind;
6
+ };
7
+ export type CSSVarGroup = {
8
+ title: string;
9
+ vars: CSSVarEntry[];
10
+ };
11
+ export declare function buildGroups(): CSSVarGroup[];
12
+ //# sourceMappingURL=variablesCSSDuTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variablesCSSDuTheme.d.ts","sourceRoot":"","sources":["../../src/screens/variablesCSSDuTheme.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB,CAAC;AA+EF,wBAAgB,WAAW,IAAI,WAAW,EAAE,CAgB3C"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Le catalogue des variables CSS que le theme publie, groupe par famille. Construire ce catalogue
3
+ * est une responsabilite a part : l'ecran qui le montre n'a pas a savoir d'ou sort chaque famille.
4
+ */
5
+ import { Colors, CustomPalette, CustomTypography, Elevations, FontWeightMap, RadiusList, Spacings, sanitizeCSSKey, } from '@alveole/theme';
6
+ import { variablesDeTypographie } from './variablesDeTypographie';
7
+ /** Les nuances brutes de la palette, une variable par cran. */
8
+ function groupeDesCouleurs() {
9
+ const vars = Object.entries(Colors).flatMap(([name, shades]) => Object.entries(shades).map(([variant, value]) => ({
10
+ name: `--color-${name}-${variant}`,
11
+ rawValue: value,
12
+ preview: 'color',
13
+ })));
14
+ return { title: 'Couleurs palette', vars };
15
+ }
16
+ /**
17
+ * Les jetons semantiques du theme clair, une categorie par groupe. Une categorie vide ne
18
+ * donne pas de groupe : un accordeon sans contenu n'apprend rien.
19
+ */
20
+ const CATEGORIES_SEMANTIQUES = ['background', 'text', 'border', 'artwork', 'system'];
21
+ function groupesSemantiques() {
22
+ return CATEGORIES_SEMANTIQUES.map(category => {
23
+ const tokens = CustomPalette.light[category] ?? {};
24
+ const vars = Object.entries(tokens).flatMap(([token, value]) => typeof value === 'string' ? [{ name: `--${category}-${token}`, rawValue: value, preview: 'color' }] : []);
25
+ return { title: `Tokens — ${category}`, vars };
26
+ }).filter(groupe => groupe.vars.length > 0);
27
+ }
28
+ function groupeChiffre({ title, valeurs, prefixe, preview, nomDeCle = key => key }) {
29
+ return {
30
+ title,
31
+ vars: Object.entries(valeurs).map(([key, value]) => ({
32
+ name: `--${prefixe}-${nomDeCle(key)}`,
33
+ rawValue: `${value}px`,
34
+ preview,
35
+ })),
36
+ };
37
+ }
38
+ function groupeDesElevations() {
39
+ return {
40
+ title: 'Elevations',
41
+ vars: Object.entries(Elevations).map(([key, value]) => ({
42
+ name: `--elevation-${key}`,
43
+ rawValue: value.web,
44
+ preview: 'elevation',
45
+ })),
46
+ };
47
+ }
48
+ /** Chaque graisse publie sa famille et son poids : deux variables pour une entree. */
49
+ function groupeDesFontes() {
50
+ return {
51
+ title: 'Fonts',
52
+ vars: Object.entries(FontWeightMap).flatMap(([key, { familyWithFallback, weight }]) => [
53
+ { name: `--font-${key}-family`, rawValue: familyWithFallback, preview: 'none' },
54
+ { name: `--font-${key}-weight`, rawValue: String(weight), preview: 'none' },
55
+ ]),
56
+ };
57
+ }
58
+ function groupeDesTypographies() {
59
+ return { title: 'Typographies', vars: variablesDeTypographie(CustomTypography, sanitizeCSSKey) };
60
+ }
61
+ export function buildGroups() {
62
+ return [
63
+ groupeDesCouleurs(),
64
+ ...groupesSemantiques(),
65
+ groupeChiffre({
66
+ title: 'Spacing',
67
+ valeurs: Spacings,
68
+ prefixe: 'spacing',
69
+ preview: 'spacing',
70
+ nomDeCle: sanitizeCSSKey,
71
+ }),
72
+ groupeChiffre({ title: 'Radius', valeurs: RadiusList, prefixe: 'radius', preview: 'radius' }),
73
+ groupeDesElevations(),
74
+ groupeDesFontes(),
75
+ groupeDesTypographies(),
76
+ ];
77
+ }
@@ -0,0 +1,8 @@
1
+ import type { CSSVarEntry } from './variablesCSSDuTheme';
2
+ /**
3
+ * Les variables CSS d'un arbre de typographies : une feuille est reconnue a sa taille, et son
4
+ * chemin dans l'arbre donne le nom de ses variables. L'assainisseur de cle est injecte : il vient
5
+ * du theme, et cette collecte n'a pas a le charger pour etre testee.
6
+ */
7
+ export declare function variablesDeTypographie(arbre: object, nommer: (cle: string) => string, chemin?: string[]): CSSVarEntry[];
8
+ //# sourceMappingURL=variablesDeTypographie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variablesDeTypographie.d.ts","sourceRoot":"","sources":["../../src/screens/variablesDeTypographie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAC/B,MAAM,GAAE,MAAM,EAAO,GACpB,WAAW,EAAE,CAkBf"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Les variables CSS d'un arbre de typographies : une feuille est reconnue a sa taille, et son
3
+ * chemin dans l'arbre donne le nom de ses variables. L'assainisseur de cle est injecte : il vient
4
+ * du theme, et cette collecte n'a pas a le charger pour etre testee.
5
+ */
6
+ export function variablesDeTypographie(arbre, nommer, chemin = []) {
7
+ const { fontSize, lineHeight, fontFamily, fontWeight } = Object.fromEntries(Object.entries(arbre));
8
+ if (typeof fontSize === 'number') {
9
+ const prefixe = `--typography-${chemin.map(nommer).join('-')}`;
10
+ const variable = (suffixe, rawValue) => ({
11
+ name: `${prefixe}-${suffixe}`,
12
+ rawValue,
13
+ preview: 'none',
14
+ });
15
+ const variables = [variable('font-size', `${fontSize}px`), variable('line-height', `${lineHeight}px`)];
16
+ if (typeof fontFamily === 'string')
17
+ variables.push(variable('font-family', fontFamily));
18
+ if (typeof fontWeight === 'string')
19
+ variables.push(variable('font-weight', fontWeight));
20
+ return variables;
21
+ }
22
+ return Object.entries(arbre).flatMap(([cle, valeur]) => typeof valeur === 'object' && valeur !== null ? variablesDeTypographie(valeur, nommer, [...chemin, cle]) : []);
23
+ }
@@ -0,0 +1,7 @@
1
+ export type SourceDecoupee = {
2
+ /** Ce qui est affiché tant que la source est repliée. */
3
+ visible: string;
4
+ tronque: boolean;
5
+ };
6
+ export declare const decouperSource: (source: string, lignes: number) => SourceDecoupee;
7
+ //# sourceMappingURL=storySource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storySource.d.ts","sourceRoot":"","sources":["../src/storySource.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KAAG,cAO/D,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const decouperSource = (source, lignes) => {
2
+ const toutes = source.split('\n');
3
+ return {
4
+ visible: toutes.slice(0, lignes).join('\n'),
5
+ tronque: toutes.length > lignes,
6
+ };
7
+ };
package/dist/types.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import type { Story, StoryModule, StoryTag } from '@alveole/components';
1
+ import type { Story, StoryExample, StoryModule, StoryTag } from '@alveole/components';
2
2
  export type StorybookTag = StoryTag;
3
3
  export type StorybookMeta = Story;
4
4
  export type StorybookModule<TMeta extends StorybookMeta = StorybookMeta> = StoryModule<TMeta>;
5
+ export type Exemple = readonly [nom: string, Rendu: StoryExample];
5
6
  export type StorybookFlagKey = 'figma' | 'experimental' | 'props' | 'webOnly' | 'mobileOnly';
6
7
  export type StorybookFlag = {
7
8
  key: StorybookFlagKey;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAE9F,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7F,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,gBAAgB,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEtF,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC;AAElC,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAE9F,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7F,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,gBAAgB,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
package/dist/utils.d.ts CHANGED
@@ -1,5 +1,11 @@
1
- import { StorybookFlag, StorybookMeta, StorybookModule } from './types';
1
+ import { Exemple, StorybookFlag, StorybookMeta, StorybookModule } from './types';
2
2
  export declare const normalizeText: (value: string) => string;
3
+ /**
4
+ * Tous les indicateurs qu'une fiche peut porter, dans l'ordre ou le catalogue les propose.
5
+ * Ils se deduisent des definitions plutot que d'etre recopies : un indicateur ajoute ici
6
+ * devient filtrable sans autre geste.
7
+ */
8
+ export declare const ALL_STORY_FLAGS: StorybookFlag[];
3
9
  export declare const getStoryFlags: (meta: StorybookMeta) => StorybookFlag[];
4
10
  export declare const getAllStoryTags: (stories: StorybookModule[]) => string[];
5
11
  export declare const filterStories: (params: {
@@ -10,9 +16,11 @@ export declare const filterStories: (params: {
10
16
  }) => StorybookModule[];
11
17
  export declare const sortStoriesByTitle: (stories: StorybookModule[]) => StorybookModule[];
12
18
  export declare const groupStoriesByTag: (stories: StorybookModule[], tags: string[]) => (readonly [string, StorybookModule[]])[];
13
- export declare const getStoryExamples: (story: StorybookModule) => [string, Exclude<StorybookModule[keyof StorybookModule], StorybookMeta>][];
14
- export declare const toStoryModules: (stories: Record<string, unknown>) => StorybookModule[];
19
+ export declare const getStoryExamples: (story: StorybookModule) => Exemple[];
20
+ export declare const toStoryModules: (stories: Record<string, StorybookModule>) => StorybookModule[];
15
21
  export declare const findStoryByTitle: (stories: StorybookModule[], title: string | undefined | null) => StorybookModule | null;
22
+ export declare const getConstantEntries: (constants: Record<string, unknown>) => [string, unknown][];
16
23
  export declare const findConstantByName: (constants: Record<string, unknown>, name: string | undefined | null) => [string, unknown] | null;
17
24
  export declare const stripMarkdown: (markdown: string) => string;
25
+ export declare const groupTitleForTag: (tag: string) => string;
18
26
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAUxE,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAIP,CAAC;AAErC,eAAO,MAAM,aAAa,GAAI,MAAM,aAAa,KAAG,aAAa,EAC+B,CAAC;AAEjG,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,EAAE,KAAG,MAAM,EAOlE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C,sBAoBA,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,eAAe,EAAE,sBAC8B,CAAC;AAE5F,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,EAAE,EAAE,MAAM,MAAM,EAAE,6CAGd,CAAC;AAE/D,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,KAC+C,CAClG,MAAM,EACN,OAAO,CAAC,eAAe,CAAC,MAAM,eAAe,CAAC,EAAE,aAAa,CAAC,CAC/D,EAAE,CAAC;AAEN,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAA+B,eAAe,EAAE,CAAC;AAEhH,eAAO,MAAM,gBAAgB,GAAI,SAAS,eAAe,EAAE,EAAE,OAAO,MAAM,GAAG,SAAS,GAAG,IAAI,2BAC/B,CAAC;AAE/D,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,6BACrC,CAAC;AAElE,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,MAWtC,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAUjF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAIP,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,EAA+D,CAAC;AAE3G,eAAO,MAAM,aAAa,GAAI,MAAM,aAAa,KAAG,aAAa,EAC+B,CAAC;AAEjG,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,EAAE,KAAG,MAAM,EAOlE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3C,sBAoBA,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,eAAe,EAAE,sBAC8B,CAAC;AAE5F,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,EAAE,EAAE,MAAM,MAAM,EAAE,6CAGd,CAAC;AAE/D,eAAO,MAAM,gBAAgB,GAAI,OAAO,eAAe,KAAG,OAAO,EAG9D,CAAC;AAEJ,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,sBAA2B,CAAC;AAEnG,eAAO,MAAM,gBAAgB,GAAI,SAAS,eAAe,EAAE,EAAE,OAAO,MAAM,GAAG,SAAS,GAAG,IAAI,2BAC/B,CAAC;AAI/D,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,wBAGV,CAAC;AAE5D,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,6BACrC,CAAC;AAElE,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,MAWtC,CAAC;AAOZ,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,WAC6B,CAAC"}
package/dist/utils.js CHANGED
@@ -9,6 +9,12 @@ export const normalizeText = (value) => value
9
9
  .toLowerCase()
10
10
  .normalize('NFD')
11
11
  .replace(/[\u0300-\u036f]/g, '');
12
+ /**
13
+ * Tous les indicateurs qu'une fiche peut porter, dans l'ordre ou le catalogue les propose.
14
+ * Ils se deduisent des definitions plutot que d'etre recopies : un indicateur ajoute ici
15
+ * devient filtrable sans autre geste.
16
+ */
17
+ export const ALL_STORY_FLAGS = FLAG_DEFINITIONS.map(({ key, label }) => ({ key, label }));
12
18
  export const getStoryFlags = (meta) => FLAG_DEFINITIONS.filter(flag => flag.isActive(meta)).map(({ key, label }) => ({ key, label }));
13
19
  export const getAllStoryTags = (stories) => {
14
20
  const tags = new Set();
@@ -23,9 +29,9 @@ export const filterStories = (params) => {
23
29
  const normalizedQuery = normalizeText(query.trim());
24
30
  return stories.filter(story => {
25
31
  const meta = story.default;
26
- const matchesQuery = normalizedQuery.length === 0 ||
27
- normalizeText(meta.title).includes(normalizedQuery) ||
28
- normalizeText(meta.description).includes(normalizedQuery);
32
+ // Une recherche vide n'a pas besoin d'etre traitee a part : toute chaine contient la
33
+ // chaine vide, donc le titre suffit a laisser passer la fiche.
34
+ const matchesQuery = normalizeText(meta.title).includes(normalizedQuery) || normalizeText(meta.description).includes(normalizedQuery);
29
35
  if (!matchesQuery)
30
36
  return false;
31
37
  if (selectedTag && !meta.tags.includes(selectedTag))
@@ -42,9 +48,14 @@ export const sortStoriesByTitle = (stories) => [...stories].sort((left, right) =
42
48
  export const groupStoriesByTag = (stories, tags) => tags
43
49
  .map(tag => [tag, stories.filter(story => story.default.tags.includes(tag))])
44
50
  .filter(([, groupedStories]) => groupedStories.length > 0);
45
- export const getStoryExamples = (story) => Object.entries(story).filter(([key, value]) => key !== 'default' && typeof value === 'function');
51
+ export const getStoryExamples = (story) => Object.entries(story).flatMap(([nom, valeur]) => nom !== 'default' && typeof valeur === 'function' ? [[nom, valeur]] : []);
46
52
  export const toStoryModules = (stories) => Object.values(stories);
47
53
  export const findStoryByTitle = (stories, title) => stories.find(story => story.default.title === title) ?? null;
54
+ // Une constante du thème n'est présentée que si elle est structurée : les scalaires exportés
55
+ // par `@alveole/theme` (numéro de version, drapeaux) ne sont pas des jetons à parcourir.
56
+ export const getConstantEntries = (constants) => Object.entries(constants)
57
+ .filter(([, value]) => typeof value === 'object' && value != null)
58
+ .sort((left, right) => left[0].localeCompare(right[0]));
48
59
  export const findConstantByName = (constants, name) => Object.entries(constants).find(([key]) => key === name) ?? null;
49
60
  export const stripMarkdown = (markdown) => markdown
50
61
  .replace(/#{1,6}\s*/g, '')
@@ -57,3 +68,8 @@ export const stripMarkdown = (markdown) => markdown
57
68
  .replace(/^\s*\d+\.\s+/gm, '')
58
69
  .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
59
70
  .trim();
71
+ // Les tags de fiches sont écrits comme les répertoires du dépôt (`core`, `ui`), mais servent de
72
+ // titre de groupe dans la colonne, où ils doivent se lire comme des mots. Un sigle n'obéit pas
73
+ // à la règle générale : `ui` donne `UI` et non `Ui`, d'où la table d'exceptions.
74
+ const ACRONYM_GROUP_TITLES = { ui: 'UI' };
75
+ export const groupTitleForTag = (tag) => ACRONYM_GROUP_TITLES[tag] ?? tag.charAt(0).toUpperCase() + tag.slice(1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alveole/storybook",
3
- "version": "1.9.0",
3
+ "version": "2.0.0-alpha",
4
4
  "description": "Catalog screens and helpers for Alveole stories and theme tokens.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,19 +13,23 @@
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
+ "!dist/.tsbuildinfo",
16
17
  "README.md"
17
18
  ],
18
19
  "sideEffects": false,
19
- "scripts": {
20
- "build": "tsc -p tsconfig.build.json",
21
- "lint": "eslint .",
22
- "typecheck": "tsc -p tsconfig.typecheck.json --noEmit"
23
- },
24
20
  "devDependencies": {
25
21
  "@alveole/eslint-config": "file:../eslint-config",
26
- "eslint": "9.39.5",
22
+ "@testing-library/react": "16.3.3",
23
+ "babel-preset-expo": "57.0.13",
24
+ "eslint": "10.10.0",
25
+ "jest": "29.7.0",
26
+ "jest-environment-jsdom": "30.5.2",
27
+ "jest-expo": "57.0.5",
27
28
  "react": "19.2.3",
28
- "react-native": "0.86.3"
29
+ "react-dom": "19.2.3",
30
+ "react-native": "0.86.3",
31
+ "react-native-web": "0.21.3",
32
+ "tamagui": "1.144.4"
29
33
  },
30
34
  "peerDependencies": {
31
35
  "@alveole/components": "*",
@@ -33,5 +37,11 @@
33
37
  "@alveole/theme": "*",
34
38
  "react": "*",
35
39
  "react-native": "*"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "lint": "eslint . --cache --cache-strategy content",
44
+ "typecheck": "tsc -p tsconfig.typecheck.json --noEmit",
45
+ "test:unit": "npx jest --coverage --maxWorkers=$(node ../../scripts/print-allocated-cpus.mjs) --ci"
36
46
  }
37
- }
47
+ }
package/dist/styles.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export declare const screenContent: {
2
- readonly display: "flex";
3
- readonly gap: 24;
4
- readonly pt: "150";
5
- readonly pb: "150";
6
- };
7
- //# sourceMappingURL=styles.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC"}
package/dist/styles.js DELETED
@@ -1,6 +0,0 @@
1
- export const screenContent = {
2
- display: 'flex',
3
- gap: 24,
4
- pt: '150',
5
- pb: '150',
6
- };