structural-codes-viewer 0.1.0-alpha.1 → 0.1.0-alpha.3

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 (63) hide show
  1. package/LICENSE +501 -0
  2. package/NOTICE +16 -0
  3. package/README.md +57 -68
  4. package/package-dist/CorpusContent.d.ts +44 -9
  5. package/package-dist/CorpusContent.js +452 -26
  6. package/package-dist/CorpusContent.js.map +1 -1
  7. package/package-dist/NormativeViewer.d.ts +23 -2
  8. package/package-dist/NormativeViewer.js +1699 -234
  9. package/package-dist/NormativeViewer.js.map +1 -1
  10. package/package-dist/ReferenceTools.d.ts +49 -0
  11. package/package-dist/ReferenceTools.js +14 -0
  12. package/package-dist/ReferenceTools.js.map +1 -0
  13. package/package-dist/annotations/AnnotationUi.d.ts +57 -0
  14. package/package-dist/annotations/AnnotationUi.js +114 -0
  15. package/package-dist/annotations/AnnotationUi.js.map +1 -0
  16. package/package-dist/annotations/annotationTargets.d.ts +39 -0
  17. package/package-dist/annotations/annotationTargets.js +94 -0
  18. package/package-dist/annotations/annotationTargets.js.map +1 -0
  19. package/package-dist/annotations/exportImport.d.ts +6 -0
  20. package/package-dist/annotations/exportImport.js +30 -0
  21. package/package-dist/annotations/exportImport.js.map +1 -0
  22. package/package-dist/annotations/index.d.ts +4 -0
  23. package/package-dist/annotations/index.js +5 -0
  24. package/package-dist/annotations/index.js.map +1 -0
  25. package/package-dist/annotations/indexedDb.d.ts +21 -0
  26. package/package-dist/annotations/indexedDb.js +210 -0
  27. package/package-dist/annotations/indexedDb.js.map +1 -0
  28. package/package-dist/annotations/schema.d.ts +8 -0
  29. package/package-dist/annotations/schema.js +102 -0
  30. package/package-dist/annotations/schema.js.map +1 -0
  31. package/package-dist/annotations/types.d.ts +52 -0
  32. package/package-dist/annotations/types.js +18 -0
  33. package/package-dist/annotations/types.js.map +1 -0
  34. package/package-dist/chunkNavigation.d.ts +12 -0
  35. package/package-dist/chunkNavigation.js +44 -0
  36. package/package-dist/chunkNavigation.js.map +1 -0
  37. package/package-dist/corpusData.d.ts +176 -33
  38. package/package-dist/corpusData.js +52 -0
  39. package/package-dist/corpusData.js.map +1 -1
  40. package/package-dist/crossReferences.d.ts +46 -0
  41. package/package-dist/crossReferences.js +198 -0
  42. package/package-dist/crossReferences.js.map +1 -0
  43. package/package-dist/generate-artifacts.mjs +47 -12
  44. package/package-dist/globalScrubber.d.ts +10 -0
  45. package/package-dist/globalScrubber.js +85 -0
  46. package/package-dist/globalScrubber.js.map +1 -0
  47. package/package-dist/permalinks.d.ts +22 -0
  48. package/package-dist/permalinks.js +36 -0
  49. package/package-dist/permalinks.js.map +1 -0
  50. package/package-dist/searchClient.d.ts +22 -0
  51. package/package-dist/searchClient.js +133 -0
  52. package/package-dist/searchClient.js.map +1 -0
  53. package/package-dist/searchEngine.d.ts +68 -0
  54. package/package-dist/searchEngine.js +558 -0
  55. package/package-dist/searchEngine.js.map +1 -0
  56. package/package-dist/searchWorker.d.ts +1 -0
  57. package/package-dist/searchWorker.js +32 -0
  58. package/package-dist/searchWorker.js.map +1 -0
  59. package/package-dist/styles.css +762 -182
  60. package/package-dist/tableCaptions.d.mts +3 -0
  61. package/package-dist/tableCaptions.mjs +35 -0
  62. package/package-dist/tableCaptions.mjs.map +1 -0
  63. package/package.json +18 -14
package/README.md CHANGED
@@ -1,102 +1,91 @@
1
1
  # structural-codes-viewer
2
2
 
3
- `structural-codes-viewer` è la reference UI React per consultare il corpus
4
- `structural-codes`. Il sottoprogetto contiene anche il consumer standalone
5
- locale usato per la revisione editoriale.
3
+ `structural-codes-viewer` è il package React per consultare il corpus
4
+ `structural-codes`. La stessa directory contiene l'applicazione standalone.
6
5
 
7
- - `structural-codes` contiene corpus, schema, provenance e relazioni canoniche;
8
- - `structural-codes-viewer` contiene UI React, client lazy degli artefatti e
9
- generatore deterministico;
10
- - il viewer standalone Vinext/Vite è un consumer locale della stessa UI e può
11
- aggiungere il PDF ufficiale tramite `OfficialPdfPanel`;
12
- - un futuro `ocfem-website` consumerà la stessa UI senza Vinext, Cloudflare o
13
- PDF.js.
6
+ ## Boundary
14
7
 
15
- ## Uso React
8
+ - `structural-codes`: corpus, schema, provenance e helper non React;
9
+ - `structural-codes-viewer`: viewer React, ricerca, navigazione, annotazioni,
10
+ client lazy e generatore di artefatti;
11
+ - `viewer/app/`: composizione standalone non pubblicata nel package.
12
+
13
+ React e ReactDOM sono peer dependency. Il package non dipende a runtime da
14
+ Next/Vinext o `pdfjs-dist`.
15
+
16
+ ## Viewer React
16
17
 
17
18
  ```tsx
18
- import { NormativeViewer } from "structural-codes-viewer";
19
+ import { NormativeViewer, type AuxiliaryPanelContext } from "structural-codes-viewer";
19
20
  import "structural-codes-viewer/styles.css";
20
21
 
22
+ function Panel({ context }: { context: AuxiliaryPanelContext }) {
23
+ return <aside><button onClick={context.close}>Chiudi</button></aside>;
24
+ }
25
+
21
26
  export function Normativa() {
22
- return <NormativeViewer defaultMode="combined" dataBaseUrl="/data/codes" />;
27
+ return <NormativeViewer
28
+ defaultMode="combined"
29
+ dataBaseUrl="/data/codes"
30
+ auxiliaryPanel={(context) => <Panel context={context} />}
31
+ auxiliaryPanelModes={["ntc", "circ", "combined"]}
32
+ />;
23
33
  }
24
34
  ```
25
35
 
26
- La modalità predefinita è `combined`: la NTC resta la struttura principale e
27
- la Circolare viene inserita soltanto tramite relazioni esplicite del corpus.
28
- Le relazioni `proposed` restano tracciate nei dati senza aggiungere etichette
29
- testuali alla lettura. Il client verifica `formatVersion`, schema e manifest; non usa
30
- la uguaglianza delle versioni SemVer per interpretare i dati.
31
-
32
- API intenzionale:
33
-
34
- - `defaultMode`: `combined`, `ntc` o `circ`;
35
- - `dataBaseUrl`: directory degli artefatti lazy, default `/data/codes`;
36
- - `assetsBaseUrl`: directory delle figure, default `/assets`;
37
- - `auxiliaryPanel`: pannello opzionale o render prop locale;
38
- - `auxiliaryPanelDefaultVisible`: visibilità iniziale del pannello opzionale.
39
-
40
- La ricerca è sempre visibile ma carica `search-index.json` soltanto con almeno
41
- due caratteri. Manifest, indice documento, chunk e relazioni restano separati.
42
- Le figure sono lazy e il package shared non importa `pdfjs-dist`, non conosce
43
- `/api/source-pdf` e non dipende da Vinext o Cloudflare. React e ReactDOM sono
44
- peer dependencies React 19. Nell’indice della consultazione comparata ogni
45
- colonna segue la selezione corrente: capitolo → paragrafi → sottoparagrafi →
46
- dettagli. I capitoli entro la soglia di caricamento sono continui; quelli più
47
- grandi caricano il testo in continuità quando si seleziona il singolo paragrafo.
36
+ `NormativeViewer` espone `dataBaseUrl`, `assetsBaseUrl`, `auxiliaryPanel`,
37
+ `AuxiliaryPanelContext`, controlli di visibilità del pannello e `annotationStore`.
38
+ Il pannello generico consente ai consumer di montare i propri componenti.
39
+ Navigazione, ricerca, annotazioni, note e segnalibri sono indipendenti dalla
40
+ composizione standalone. Sono pubblici anche `./annotations`, `./corpus-data`,
41
+ `./generate-artifacts` e `./styles.css`.
48
42
 
49
43
  ## Artefatti
50
44
 
51
- `npm run sync:corpus` mantiene il consumer locale aggiornato sotto
52
- `public/data/codes/`:
53
-
54
- ```text
55
- manifest.json
56
- relations.json
57
- relation-diagnostics.json
58
- search-index.json
59
- ntc2018/index.json
60
- ntc2018/chunks/*.json
61
- circ2019/index.json
62
- circ2019/chunks/*.json
45
+ ```bash
46
+ npm run sync:corpus
63
47
  ```
64
48
 
65
- Il generatore condiviso legge soltanto i file pubblici del package
66
- `structural-codes`, è deterministico e non richiede un checkout sibling. La
67
- CLI inclusa nel package può materializzare gli stessi artefatti in un consumer:
49
+ Il comando genera sotto `viewer/public/data/codes/` manifest, indici documento,
50
+ chunk, relazioni, riferimenti e indice di ricerca. `viewer/public/` è ignorato
51
+ da Git e rigenerabile dal corpus canonico.
52
+
53
+ Un consumer può usare la CLI inclusa:
68
54
 
69
55
  ```bash
70
56
  npx structural-codes-viewer --source structural-codes \
71
57
  --output public/data/codes --assets public/assets
72
58
  ```
73
59
 
74
- Il comando non copia il corpus completo nel package viewer: usa il package
75
- `structural-codes` installato dal consumer come sorgente.
60
+ Il package viewer non include il corpus completo: il generatore legge il
61
+ package `structural-codes` installato nel consumer.
76
62
 
77
- ## Viewer standalone
63
+ ## Standalone
78
64
 
79
65
  ```bash
66
+ npm ci
80
67
  npm run dev
81
- npm run build
82
- npm test
83
68
  ```
84
69
 
85
- La route `/consultazione` usa `NormativeViewer` e compone il pannello PDF
86
- locale opzionale. PDF.js e il file PDF vengono caricati solo dopo l’azione
87
- esplicita “Apri PDF ufficiale”; il PDF non entra nel package shared.
88
-
89
- ## Package
70
+ Il PDF ufficiale è un ausilio locale di debug e non entra nel build pubblico o
71
+ nel package.
90
72
 
91
- La prerelease non viene pubblicata da questo repository. Per una futura
92
- pubblicazione, dopo review:
73
+ ## Sviluppo e verifica
93
74
 
94
75
  ```bash
95
- npm run build:library
96
- npm pack
97
- npm publish --access public
76
+ npm run typecheck
77
+ npm run lint
78
+ npm test
79
+ npm run check
80
+ npm run pack:verify
81
+ npm run test:consumer
98
82
  ```
99
83
 
100
- Il tarball contiene soltanto `package-dist/`, CSS, README e metadati del
101
- package; non contiene app standalone, worker Cloudflare, test, cache, corpus
102
- completo o `pdfjs-dist`.
84
+ `check` costruisce app e libreria ed esegue i test del viewer e del boundary.
85
+ `pack:verify` mostra il contenuto del tarball. `test:consumer` crea tarball
86
+ reali dei due package, li installa in una nuova app Next e verifica l'API
87
+ pubblica del viewer, inclusa l'integrazione tramite `auxiliaryPanel`.
88
+
89
+ Il tarball contiene soltanto `package-dist/`, README, licenza, notice e
90
+ manifest. Restano fuori `app/`, test, PDF, corpus completo, `.env` e output
91
+ standalone.
@@ -1,16 +1,51 @@
1
- import type { AssetBundle, CorpusBlock, CorpusUnit } from "./corpusData";
1
+ import type { AssetBundle, CorpusBlock, DocumentId, InlineSegment, CorpusUnit } from "./corpusData";
2
+ export declare function leadingMathLabelEnd(inline: InlineSegment[]): number;
3
+ export declare function hasOfficialListMarker(block: CorpusBlock): boolean;
4
+ export declare function hasAlphaRatioListLayout(block: CorpusBlock, sourceUnitId?: string): boolean;
5
+ export declare function hasInferredAlphaRatioListMarker(block: CorpusBlock, sourceUnitId?: string): boolean;
6
+ export declare function hasAlphabeticListMarker(block: CorpusBlock): boolean;
7
+ export declare function hasSimpleDashMarker(block: CorpusBlock): boolean;
8
+ export declare function hasNoListMarker(block: CorpusBlock): boolean;
9
+ export declare function listMarkerClass(block: CorpusBlock): "" | "list-item-with-bullet";
10
+ export declare function listLevelClass(block: CorpusBlock): string;
11
+ export declare function indentLevelClass(block: CorpusBlock): string;
12
+ export declare function hasLeadingMath(block: CorpusBlock): boolean;
13
+ export declare function hasAlignedListContinuation(block: CorpusBlock): boolean;
14
+ export declare function hasLeadingEmphasisLabel(block: CorpusBlock): boolean;
15
+ export declare function leadingLabelKind(block: CorpusBlock): "math" | "emphasis" | null;
16
+ export type CorpusBlockGroup = {
17
+ kind: "label-list";
18
+ blocks: CorpusBlock[];
19
+ } | {
20
+ kind: "block";
21
+ block: CorpusBlock;
22
+ index: number;
23
+ };
24
+ export declare function groupAlignedLabelBlocks(blocks: CorpusBlock[]): CorpusBlockGroup[];
25
+ export declare function hasTrailingStrong(block: CorpusBlock): boolean;
26
+ export declare function hasTrailingMath(block: CorpusBlock): boolean;
2
27
  export interface BlockContentProps {
3
28
  block: CorpusBlock;
4
29
  assets: AssetBundle | null;
5
- showRaw?: boolean;
6
30
  assetsBaseUrl?: string;
31
+ aligned?: boolean;
32
+ sourceUnitId?: string;
33
+ sourceDocument?: DocumentId;
7
34
  }
8
- export declare function BlockContent({ block, assets, showRaw, assetsBaseUrl }: BlockContentProps): import("react/jsx-runtime").JSX.Element;
9
- export declare function isRepeatedUnitTitle(unit: CorpusUnit, block: CorpusUnit["blocks"][number]): boolean;
10
- export declare function UnitBlocks({ unit, assets, showRaw, compact, assetsBaseUrl }: {
11
- unit: CorpusUnit;
12
- assets: AssetBundle;
13
- showRaw?: boolean;
14
- compact?: boolean;
35
+ type InlineSegments = InlineSegment[];
36
+ interface ReferenceContext {
37
+ sourceUnitId: string;
38
+ sourceDocument: DocumentId;
39
+ }
40
+ export declare function renderInlineSegments(inline: InlineSegments, context?: ReferenceContext | null): import("react").ReactNode[];
41
+ export declare function BlockContent({ block, assets, assetsBaseUrl, aligned, sourceUnitId, sourceDocument }: BlockContentProps): import("react/jsx-runtime").JSX.Element;
42
+ export declare function AlignedLabelList({ blocks, assets, assetsBaseUrl, sourceUnitId, sourceDocument, renderAccessory }: {
43
+ blocks: CorpusBlock[];
44
+ assets: AssetBundle | null;
15
45
  assetsBaseUrl?: string;
46
+ sourceUnitId?: string;
47
+ sourceDocument?: DocumentId;
48
+ renderAccessory?: (block: CorpusBlock) => React.ReactNode;
16
49
  }): import("react/jsx-runtime").JSX.Element;
50
+ export declare function isRepeatedUnitTitle(unit: CorpusUnit, block: CorpusUnit["blocks"][number]): boolean;
51
+ export {};