@abyss-project/commons-front-core 11.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +15 -0
  2. package/catalog/catalog-entries.ts +2 -0
  3. package/catalog/pages/MarkdownEditor.tsx +48 -0
  4. package/catalog/pages/PdfEditor.tsx +153 -0
  5. package/catalog/pages/index.ts +4 -0
  6. package/catalog/specs/responsive.spec.ts +5 -1
  7. package/dist/AbyssCloud-IuD91X6C.js +2949 -0
  8. package/dist/{AbyssCookieConsentProvider-C3NZfWxR.js → AbyssCookieConsentProvider-PchfQjs2.js} +2038 -1407
  9. package/dist/{CookieConsentSettings.component-Dvbp3MIX.js → CookieConsentSettings.component-D8G0H6Wl.js} +1 -1
  10. package/dist/Tabs-CZQ1JYlW.js +2315 -0
  11. package/dist/_commonjsHelpers-DaMA6jEr.js +8 -0
  12. package/dist/components/editors/MarkdownEditor/MarkdownEditor.d.ts +19 -0
  13. package/dist/components/editors/MarkdownEditor/crepe-labels.d.ts +17 -0
  14. package/dist/components/editors/MarkdownEditor/index.d.ts +2 -0
  15. package/dist/components/editors/MarkdownEditor/markdown-theme.d.ts +7 -0
  16. package/dist/components/editors/PdfEditor/PdfEditor.d.ts +9 -0
  17. package/dist/components/editors/PdfEditor/engine/open-pdf-document.d.ts +8 -0
  18. package/dist/components/editors/PdfEditor/engine/operations/reducer.spec.d.ts +1 -0
  19. package/dist/components/editors/PdfEditor/engine/operations/rotate-coords.spec.d.ts +1 -0
  20. package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/types.d.ts +1 -2
  21. package/dist/components/editors/PdfEditor/index.d.ts +3 -0
  22. package/dist/components/editors/PdfEditor/pdf-colors.d.ts +26 -0
  23. package/dist/components/editors/PdfEditor/pdf-colors.spec.d.ts +1 -0
  24. package/dist/components/editors/PdfEditor/signature/SignatureDrawPad.d.ts +15 -0
  25. package/dist/components/editors/PdfEditor/signature/SignaturePicker.d.ts +31 -0
  26. package/dist/components/editors/PdfEditor/signature/SignaturePicker.spec.d.ts +1 -0
  27. package/dist/components/editors/PdfEditor/signature/SignatureSaveButton.d.ts +14 -0
  28. package/dist/components/editors/PdfEditor/signature/SignatureSavedList.d.ts +19 -0
  29. package/dist/components/editors/PdfEditor/signature/SignatureUploadPanel.d.ts +14 -0
  30. package/dist/components/editors/PdfEditor/signature/resolve-asset.d.ts +19 -0
  31. package/dist/components/editors/PdfEditor/signature/resolve-asset.spec.d.ts +1 -0
  32. package/dist/components/editors/PdfEditor/signature/test-support/pdf-editor-test-harness.d.ts +28 -0
  33. package/dist/components/editors/PdfEditor/toolbar/EraserIcon.d.ts +3 -0
  34. package/dist/components/editors/PdfEditor/toolbar/GroupPanel.d.ts +17 -0
  35. package/dist/components/editors/PdfEditor/toolbar/PanelRow.d.ts +14 -0
  36. package/dist/components/editors/PdfEditor/toolbar/PdfToolbar.d.ts +67 -0
  37. package/dist/components/editors/PdfEditor/toolbar/PdfToolbar.spec.d.ts +1 -0
  38. package/dist/components/editors/PdfEditor/toolbar/SavedAssets.d.ts +24 -0
  39. package/dist/components/editors/PdfEditor/toolbar/ToolGroupButton.d.ts +20 -0
  40. package/dist/components/editors/PdfEditor/toolbar/tool-groups.d.ts +34 -0
  41. package/dist/components/editors/PdfEditor/toolbar/tool-options/DrawOptions.d.ts +6 -0
  42. package/dist/components/editors/PdfEditor/toolbar/tool-options/FillFieldsOptions.d.ts +13 -0
  43. package/dist/components/editors/PdfEditor/toolbar/tool-options/HighlightOptions.d.ts +6 -0
  44. package/dist/components/editors/PdfEditor/toolbar/tool-options/RedactOptions.d.ts +6 -0
  45. package/dist/components/editors/PdfEditor/toolbar/tool-options/ShapeOptions.d.ts +6 -0
  46. package/dist/components/editors/PdfEditor/toolbar/tool-options/SignatureOptions.d.ts +5 -0
  47. package/dist/components/editors/PdfEditor/toolbar/tool-options/TextOptions.d.ts +6 -0
  48. package/dist/components/editors/PdfEditor/toolbar/tool-options/ToolOptions.d.ts +14 -0
  49. package/dist/components/editors/PdfEditor/toolbar/tool-options/swatches.d.ts +2 -0
  50. package/dist/components/editors/PdfEditor/toolbar/tool-settings.d.ts +14 -0
  51. package/dist/components/editors/PdfEditor/viewer/InsertPagesButton.d.ts +14 -0
  52. package/dist/components/editors/PdfEditor/viewer/InsertPagesButton.spec.d.ts +1 -0
  53. package/dist/components/editors/PdfEditor/viewer/InsertPagesDialog.d.ts +28 -0
  54. package/dist/components/editors/PdfEditor/viewer/PageOverlay.d.ts +37 -0
  55. package/dist/components/editors/PdfEditor/viewer/PageOverlay.spec.d.ts +1 -0
  56. package/dist/components/editors/PdfEditor/viewer/PageSidebar.d.ts +16 -0
  57. package/dist/components/editors/PdfEditor/viewer/PageSidebar.spec.d.ts +1 -0
  58. package/dist/components/editors/PdfEditor/viewer/PageThumbnail.d.ts +16 -0
  59. package/dist/components/editors/PdfEditor/viewer/PdfCanvas.d.ts +26 -0
  60. package/dist/components/editors/PdfEditor/viewer/PdfCanvas.spec.d.ts +1 -0
  61. package/dist/components/editors/PdfEditor/viewer/ViewerControls.d.ts +21 -0
  62. package/dist/components/editors/PdfEditor/viewer/ViewerControls.spec.d.ts +1 -0
  63. package/dist/components/editors/PdfEditor/viewer/test-support/viewer-test-harness.d.ts +30 -0
  64. package/dist/components/editors/editors-guard.spec.d.ts +1 -0
  65. package/dist/components/editors/index.d.ts +2 -0
  66. package/dist/cookie-consent.js +2 -2
  67. package/dist/{design-theme-sPEoMB7j.js → design-theme-DPp0aQVa.js} +9302 -12244
  68. package/dist/editors.d.ts +1 -0
  69. package/dist/editors.js +5239 -0
  70. package/dist/hooks/use-rich-intl.hook.d.ts +636 -0
  71. package/dist/{index-Cb-uMz_V.js → index-B2ZxOr31.js} +3 -3
  72. package/dist/{index-CCaW-38I.js → index-Bo9YtyKq.js} +2 -2
  73. package/dist/{index-DEqCdX0Q.js → index-Bv63SeVQ.js} +2 -2
  74. package/dist/{index-C2KrTHAO.js → index-ByTOd2ak.js} +2 -2
  75. package/dist/{index-DD25yrsQ.js → index-C2CPAKkL.js} +4 -4
  76. package/dist/{index-CB-jdY_E.js → index-C7XhFFZA.js} +2 -2
  77. package/dist/{index-DIpJhT2r.js → index-CBIn4IuA.js} +2 -2
  78. package/dist/{index-CNcmCFNN.js → index-CE5F7UaD.js} +1 -1
  79. package/dist/{index-CKCWWoQb.js → index-CS0JFqYy.js} +3 -3
  80. package/dist/{index-CXwwKVPn.js → index-CVp3TsdG.js} +3 -3
  81. package/dist/{index-C9FzqvHz.js → index-CaWs53z9.js} +2 -2
  82. package/dist/{index-CrWjgIMV.js → index-CjAqdRJ0.js} +4 -4
  83. package/dist/{index-D9s128sK.js → index-DNhK2v38.js} +4 -4
  84. package/dist/{index-Ut9uJwau.js → index-DVg7Zewe.js} +2 -2
  85. package/dist/{index-QNJIP2m4.js → index-DWi7OlB1.js} +2 -2
  86. package/dist/{index-DtHUaGVU.js → index-DY51R82n.js} +3 -3
  87. package/dist/{index-aYivWEyJ.js → index-DzXd6CTA.js} +2 -2
  88. package/dist/{index-whpnjq54.js → index-RIO2UT1x.js} +2 -2
  89. package/dist/{index-lE9lxmTc.js → index-ZXDv7i0D.js} +2 -2
  90. package/dist/{index-BVGdsnC4.js → index-yAKnJ5ME.js} +2 -2
  91. package/dist/{index-Di1amUHq.js → index-z9-0V3EC.js} +2 -2
  92. package/dist/index.js +5676 -7907
  93. package/dist/legacy/components/PdfEditor/PdfEditor.d.ts +1 -1
  94. package/dist/legacy/components/PdfEditor/index.d.ts +2 -2
  95. package/dist/legacy/components/PdfEditor/signature/SignatureDrawCanvas.d.ts +1 -1
  96. package/dist/legacy/components/PdfEditor/signature/SignaturePicker.d.ts +1 -1
  97. package/dist/legacy/components/PdfEditor/signature/SignatureSaveButton.d.ts +1 -1
  98. package/dist/legacy/components/PdfEditor/signature/SignatureSavedList.d.ts +1 -1
  99. package/dist/legacy/components/PdfEditor/signature/SignatureUploadDropzone.d.ts +1 -1
  100. package/dist/legacy/components/PdfEditor/signature/resolve-asset.d.ts +1 -1
  101. package/dist/legacy/components/PdfEditor/tools/FillFieldsTool.d.ts +1 -1
  102. package/dist/legacy/components/PdfEditor/tools/ShapeTool.d.ts +1 -1
  103. package/dist/legacy/components/PdfEditor/tools/SignatureTool.d.ts +1 -1
  104. package/dist/legacy/components/PdfEditor/tools/TextTool.d.ts +1 -1
  105. package/dist/legacy/components/PdfEditor/tools/Toolbar.d.ts +1 -1
  106. package/dist/legacy/components/PdfEditor/viewer/InsertPagesButton.d.ts +1 -1
  107. package/dist/legacy/components/PdfEditor/viewer/PageOverlay.d.ts +1 -1
  108. package/dist/legacy/components/PdfEditor/viewer/PageSidebar.d.ts +2 -2
  109. package/dist/legacy/components/PdfEditor/viewer/PageThumbnail.d.ts +2 -2
  110. package/dist/legacy/components/PdfEditor/viewer/PdfCanvas.d.ts +1 -1
  111. package/dist/legacy.js +26800 -209
  112. package/dist/sortable.esm-BYVnqZQ-.js +69330 -0
  113. package/dist/translations/editors-i18n.spec.d.ts +1 -0
  114. package/dist/translations/en.d.ts +318 -0
  115. package/dist/translations/fr.d.ts +318 -0
  116. package/package.json +13 -6
  117. package/vite.config.ts +4 -0
  118. package/dist/index-DPi7aKci.js +0 -95942
  119. /package/dist/{legacy/components/PdfEditor/operations/apply.spec.d.ts → components/editors/MarkdownEditor/MarkdownEditor.spec.d.ts} +0 -0
  120. /package/dist/{legacy/components/PdfEditor/operations/compute-page-order.spec.d.ts → components/editors/PdfEditor/PdfEditor.spec.d.ts} +0 -0
  121. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-acro-form-fields.d.ts +0 -0
  122. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-export.d.ts +0 -0
  123. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-page-order.d.ts +0 -0
  124. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-pdf-document.d.ts +0 -0
  125. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-undo-redo.d.ts +0 -0
  126. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/hooks/use-uploaded-docs.d.ts +0 -0
  127. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/actions.d.ts +0 -0
  128. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/apply.d.ts +0 -0
  129. /package/dist/{legacy/components/PdfEditor/operations/extract.spec.d.ts → components/editors/PdfEditor/engine/operations/apply.spec.d.ts} +0 -0
  130. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/compute-page-order.d.ts +0 -0
  131. /package/dist/{legacy/components/PdfEditor/operations/redact.spec.d.ts → components/editors/PdfEditor/engine/operations/compute-page-order.spec.d.ts} +0 -0
  132. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/extract.d.ts +0 -0
  133. /package/dist/{legacy/components/PdfEditor/operations/reducer.spec.d.ts → components/editors/PdfEditor/engine/operations/extract.spec.d.ts} +0 -0
  134. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/pdf-data-url.d.ts +0 -0
  135. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/rasterize.d.ts +0 -0
  136. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/redact.d.ts +0 -0
  137. /package/dist/{legacy/components/PdfEditor/operations/rotate-coords.spec.d.ts → components/editors/PdfEditor/engine/operations/redact.spec.d.ts} +0 -0
  138. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/reducer.d.ts +0 -0
  139. /package/dist/{legacy/components/PdfEditor → components/editors/PdfEditor/engine}/operations/rotate-coords.d.ts +0 -0
package/README.md CHANGED
@@ -94,6 +94,21 @@ export const buildRumOptions = () =>
94
94
 
95
95
  ## Changements visibles
96
96
 
97
+ ### 10.1.0
98
+
99
+ Zone 4c-1 de la refonte du design system (carte #286) : les éditeurs Markdown et PDF sur le design system.
100
+
101
+ - **Nouvelle entrée `@abyss-project/commons-front-core/editors`** : `MarkdownEditor`, `PdfEditor`, `PdfOperationType`
102
+ et les types du PDF. Ils ne sont pas sur l'entrée racine, pour que pdf.js, pdf-lib et Crepe ne pèsent pas sur les
103
+ applications qui ne les utilisent pas (ADR-0215). Le worker de pdf.js se charge à la première ouverture d'un PDF.
104
+ - **`MarkdownEditor`** : mêmes props qu'`AbyssMarkdownEditor`, moteur Crepe gardé, couleurs et polices des jetons,
105
+ libellés de Crepe traduits, poignée de 44 px au toucher. Les classes `.milkdown` et `.ProseMirror` ne changent pas.
106
+ - **`PdfEditor`** : mêmes props que l'éditeur legacy ; barre regroupée en six groupes, page blanche dans les deux
107
+ thèmes, couleurs d'annotation fixes (`pdf-colors`). Les opérations déjà enregistrées se rejouent à l'identique.
108
+ - **Legacy** : `AbyssMarkdownEditor` et `PdfEditor` restent sous `/legacy` jusqu'à la zone 4c-2 ; le moteur du PDF
109
+ legacy est désormais celui de `/editors` (comportement inchangé).
110
+ - **Épinglage de `@abyss-project/main`** : inchangé par rapport à la 10.0.0.
111
+
97
112
  ### 9.6.0
98
113
 
99
114
  Correctifs de la zone 4b (carte #286), relevés par son e2e responsive.
@@ -116,6 +116,8 @@ export const CATALOG_ENTRIES: CatalogEntry[] = [
116
116
  entry('ContextSelector', 'inputs', 'context-selector', RESPONSIVE),
117
117
  entry('DropZone', 'inputs', 'drop-zone', RESPONSIVE),
118
118
  entry('ImportButton', 'inputs', 'import-button'),
119
+ entry('MarkdownEditor', 'inputs', 'markdown-editor', RESPONSIVE),
120
+ entry('PdfEditor', 'inputs', 'pdf-editor', RESPONSIVE),
119
121
  entry('ExpressionSearch', 'inputs', 'expression-search', {
120
122
  mobileCapture: true,
121
123
  }),
@@ -0,0 +1,48 @@
1
+ import { MarkdownEditor } from '../../src/components/editors/MarkdownEditor/MarkdownEditor';
2
+ import { Example, LastEvent, Showcase, useEventLog } from '../frame';
3
+
4
+ const NOTE = `# Compte rendu de la revue
5
+
6
+ Les points à **retenir** : le budget reste *stable*, et le lien vers le [tableau de bord](https://abyss.example) est à jour.
7
+
8
+ - Valider le périmètre
9
+ - Relire les \`conditions\`
10
+ - Envoyer le résumé
11
+
12
+ > La prochaine revue a lieu jeudi.
13
+
14
+ \`\`\`ts
15
+ const total = lignes.reduce((somme, ligne) => somme + ligne.montant, 0);
16
+ \`\`\`
17
+
18
+ | Poste | Montant |
19
+ | --- | --- |
20
+ | Hébergement | 1 200 |
21
+ | Licences | 840 |
22
+ `;
23
+
24
+ export const MarkdownEditorPage = () => {
25
+ const { log } = useEventLog();
26
+
27
+ return (
28
+ <Showcase
29
+ family="Saisie"
30
+ name="MarkdownEditor"
31
+ description="Éditeur Markdown de l'écosystème : Crepe, aux couleurs et aux polices du design system, libellés traduits. Un « / » ouvre le menu des blocs ; la poignée à gauche d'un bloc l'ajoute ou le déplace. Sur un écran tactile, la poignée et les boutons font 44 px."
32
+ >
33
+ <Example title="Édition d'une note" maxWidth={880}>
34
+ <MarkdownEditor
35
+ defaultValue={NOTE}
36
+ onChange={(markdown) => log(`${markdown.length} caractères`)}
37
+ />
38
+ </Example>
39
+ <Example title="Document vide" maxWidth={880}>
40
+ <MarkdownEditor />
41
+ </Example>
42
+ <Example title="Lecture seule" maxWidth={880}>
43
+ <MarkdownEditor defaultValue={NOTE} readOnly />
44
+ </Example>
45
+ <LastEvent />
46
+ </Showcase>
47
+ );
48
+ };
@@ -0,0 +1,153 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { AssetKind } from '@abyss-project/main';
3
+ import { PDFDocument, StandardFonts } from 'pdf-lib';
4
+ import { styled } from '@mui/material/styles';
5
+ import { PdfEditor } from '../../src/components/editors/PdfEditor/PdfEditor';
6
+ import { hairline, px } from '../../src/theme/components/shared';
7
+ import type {
8
+ AssetPalette,
9
+ ExportRequest,
10
+ OperationsAdapter,
11
+ PdfSource,
12
+ } from '../../src/components/editors/PdfEditor/engine/types';
13
+ import { Example, LastEvent, Showcase, useEventLog } from '../frame';
14
+
15
+ const FILE_NAME = 'contrat-de-prestation.pdf';
16
+
17
+ const PARAGRAPHS = [
18
+ 'Article 1 : objet du contrat',
19
+ 'Le prestataire réalise la refonte du portail client.',
20
+ 'Article 2 : durée',
21
+ 'Le contrat prend effet à la signature, pour douze mois.',
22
+ 'Article 3 : prix',
23
+ 'Le prix est payé en trois échéances égales.',
24
+ ];
25
+
26
+ /** A three-page A4 contract, built in the browser so the catalog needs no fixture file. */
27
+ const buildContract = async (): Promise<ArrayBuffer> => {
28
+ const doc = await PDFDocument.create();
29
+ const font = await doc.embedFont(StandardFonts.Helvetica);
30
+ const bold = await doc.embedFont(StandardFonts.HelveticaBold);
31
+ for (let index = 0; index < 3; index += 1) {
32
+ const page = doc.addPage([595.28, 841.89]);
33
+ page.drawText(`Contrat de prestation, page ${index + 1}`, {
34
+ x: 56,
35
+ y: 780,
36
+ size: 18,
37
+ font: bold,
38
+ });
39
+ PARAGRAPHS.forEach((line, row) => {
40
+ page.drawText(line, { x: 56, y: 720 - row * 28, size: 12, font });
41
+ });
42
+ }
43
+ const bytes = await doc.save();
44
+ return bytes.slice().buffer;
45
+ };
46
+
47
+ /** A drawn signature, as the saved assets of a signed-in user would carry one. */
48
+ const SIGNATURE_SVG = `data:image/svg+xml;utf8,${encodeURIComponent(
49
+ "<svg xmlns='http://www.w3.org/2000/svg' width='240' height='80'><path d='M10 60 C 40 10, 60 10, 80 50 S 130 80, 150 30 S 200 20, 230 55' fill='none' stroke='navy' stroke-width='3'/></svg>",
50
+ )}`;
51
+
52
+ const PALETTE: AssetPalette = {
53
+ personal: [
54
+ {
55
+ id: 'signature',
56
+ kind: AssetKind.SIGNATURE,
57
+ name: 'Signature',
58
+ downloadUrl: SIGNATURE_SVG,
59
+ },
60
+ {
61
+ id: 'mention',
62
+ kind: AssetKind.TEXT_BLOCK,
63
+ name: 'Mention',
64
+ downloadUrl: null,
65
+ textContent: 'Lu et approuvé',
66
+ },
67
+ ],
68
+ organizations: [{ id: 'acme', name: 'Acme', items: [] }],
69
+ };
70
+
71
+ const Frame = styled('div')(({ theme }) => ({
72
+ height: 720,
73
+ border: hairline(theme.design.tokens['border.subtle']),
74
+ borderRadius: px(theme.design.radii.md),
75
+ overflow: 'hidden',
76
+ }));
77
+
78
+ export const PdfEditorPage = () => {
79
+ const { log } = useEventLog();
80
+ const [source, setSource] = useState<PdfSource | null>(null);
81
+
82
+ useEffect(() => {
83
+ let cancelled = false;
84
+ void buildContract().then((data) => {
85
+ if (!cancelled) {
86
+ setSource({ kind: 'BLOB', data, fileName: FILE_NAME });
87
+ }
88
+ });
89
+ return () => {
90
+ cancelled = true;
91
+ };
92
+ }, []);
93
+
94
+ const onExport = useCallback(
95
+ async (request: ExportRequest) => log(`export ${request.kind}`),
96
+ [log],
97
+ );
98
+ const operationsAdapter = useCallback<OperationsAdapter>(
99
+ async ({ operations }) => log(`${operations.length} opérations`),
100
+ [log],
101
+ );
102
+
103
+ return (
104
+ <Showcase
105
+ family="Saisie"
106
+ name="PdfEditor"
107
+ description="Éditeur PDF de l'écosystème : barre en groupes (Annoter, Signer et remplir, Pages, Sécurité, Fichier), pages et vignettes blanches dans les deux thèmes, signatures dessinées, importées ou enregistrées. Sous 768 px, un groupe s'ouvre en feuille du bas et les pages passent en tiroir."
108
+ >
109
+ {source !== null && (
110
+ <>
111
+ <Example title="Session connectée, éléments enregistrés et AbyssCloud">
112
+ <Frame>
113
+ <PdfEditor
114
+ source={source}
115
+ mode="session-cloud-bridge"
116
+ exportOptions={['DOWNLOAD', 'CLOUD_NEW_FILE']}
117
+ onExport={onExport}
118
+ operationsAdapter={operationsAdapter}
119
+ assetPalette={PALETTE}
120
+ onSaveSignature={async ({ name }) =>
121
+ log(`signature enregistrée : ${name}`)
122
+ }
123
+ manageAssetsUrl="https://abyss.example/account/assets"
124
+ />
125
+ </Frame>
126
+ </Example>
127
+ <Example title="Page publique, sans compte">
128
+ <Frame>
129
+ <PdfEditor
130
+ source={source}
131
+ mode="anonymous-client"
132
+ exportOptions={['DOWNLOAD']}
133
+ onExport={onExport}
134
+ />
135
+ </Frame>
136
+ </Example>
137
+ <Example title="Lecture seule">
138
+ <Frame>
139
+ <PdfEditor
140
+ source={source}
141
+ mode="anonymous-shared"
142
+ exportOptions={['DOWNLOAD']}
143
+ onExport={onExport}
144
+ readOnly
145
+ />
146
+ </Frame>
147
+ </Example>
148
+ </>
149
+ )}
150
+ <LastEvent />
151
+ </Showcase>
152
+ );
153
+ };
@@ -36,6 +36,7 @@ import { ImportButtonPage } from './ImportButton';
36
36
  import { ImportFromCloudModalPage } from './ImportFromCloudModal';
37
37
  import { InfectedDownloadModalPage } from './InfectedDownloadModal';
38
38
  import { KeyValueListPage } from './KeyValueList';
39
+ import { MarkdownEditorPage } from './MarkdownEditor';
39
40
  import { MenuPage } from './Menu';
40
41
  import { MethodBadgePage } from './MethodBadge';
41
42
  import { MobileShellPage } from './MobileShell';
@@ -43,6 +44,7 @@ import { ModalPage } from './Modal';
43
44
  import { NotificationsMenuPage } from './NotificationsMenu';
44
45
  import { NumberFieldPage } from './NumberField';
45
46
  import { PageHeaderPage } from './PageHeader';
47
+ import { PdfEditorPage } from './PdfEditor';
46
48
  import { PageStatePage } from './PageState';
47
49
  import { PreviewDrawerPage } from './PreviewDrawer';
48
50
  import { ProductTourPage } from './ProductTour';
@@ -108,6 +110,7 @@ export const CATALOG_PAGES: Record<string, ComponentType> = {
108
110
  ImportFromCloudModal: ImportFromCloudModalPage,
109
111
  InfectedDownloadModal: InfectedDownloadModalPage,
110
112
  KeyValueList: KeyValueListPage,
113
+ MarkdownEditor: MarkdownEditorPage,
111
114
  Menu: MenuPage,
112
115
  MethodBadge: MethodBadgePage,
113
116
  MobileShell: MobileShellPage,
@@ -115,6 +118,7 @@ export const CATALOG_PAGES: Record<string, ComponentType> = {
115
118
  NotificationsMenu: NotificationsMenuPage,
116
119
  NumberField: NumberFieldPage,
117
120
  PageHeader: PageHeaderPage,
121
+ PdfEditor: PdfEditorPage,
118
122
  PageState: PageStatePage,
119
123
  PreviewDrawer: PreviewDrawerPage,
120
124
  ProductTour: ProductTourPage,
@@ -69,6 +69,10 @@ const smallTargets = (page: Page): Promise<Offender[]> =>
69
69
  const hidden = (element: Element): boolean =>
70
70
  element.closest('[aria-hidden="true"], [inert]') !== null ||
71
71
  getComputedStyle(element).visibility === 'hidden';
72
+ // WCAG 2.5.8 exempts an inline target, one set in a sentence: a link written in the text
73
+ // of the editor's document. Nothing else is exempt.
74
+ const inline = (element: Element): boolean =>
75
+ element.matches('.ProseMirror a');
72
76
  const describe = (element: Element): string => {
73
77
  const name =
74
78
  element.getAttribute('aria-label') ??
@@ -80,7 +84,7 @@ const smallTargets = (page: Page): Promise<Offender[]> =>
80
84
  }> "${name}"`;
81
85
  };
82
86
  return Array.from(document.querySelectorAll(selector))
83
- .filter((element) => !hidden(element))
87
+ .filter((element) => !hidden(element) && !inline(element))
84
88
  .map((element) => ({ element, box: element.getBoundingClientRect() }))
85
89
  .filter(({ box }) => box.width > 0 && box.height > 0)
86
90
  .filter(({ box }) => box.width < minimum || box.height < minimum)