@aster-editor/core 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -92
- package/dist/api/commands.d.ts +8 -1
- package/dist/api/commands.d.ts.map +1 -1
- package/dist/api/commands.js +3 -0
- package/dist/api/commands.js.map +1 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout.d.ts +181 -0
- package/dist/api/layout.d.ts.map +1 -0
- package/dist/api/layout.js +28 -0
- package/dist/api/layout.js.map +1 -0
- package/dist/api/options.d.ts +6 -0
- package/dist/api/options.d.ts.map +1 -1
- package/dist/commands/layout.d.ts +40 -0
- package/dist/commands/layout.d.ts.map +1 -0
- package/dist/commands/layout.js +262 -0
- package/dist/commands/layout.js.map +1 -0
- package/dist/commands/standard.d.ts +4 -3
- package/dist/commands/standard.d.ts.map +1 -1
- package/dist/commands/standard.js +7 -3
- package/dist/commands/standard.js.map +1 -1
- package/dist/editor/aster-editor.d.ts +16 -1
- package/dist/editor/aster-editor.d.ts.map +1 -1
- package/dist/editor/aster-editor.js +41 -1
- package/dist/editor/aster-editor.js.map +1 -1
- package/dist/extensions/aster-extensions.d.ts +3 -0
- package/dist/extensions/aster-extensions.d.ts.map +1 -1
- package/dist/extensions/aster-extensions.js +24 -5
- package/dist/extensions/aster-extensions.js.map +1 -1
- package/dist/extensions/header-footer-sanitize.d.ts +22 -0
- package/dist/extensions/header-footer-sanitize.d.ts.map +1 -0
- package/dist/extensions/header-footer-sanitize.js +226 -0
- package/dist/extensions/header-footer-sanitize.js.map +1 -0
- package/dist/extensions/layout-css.d.ts +88 -0
- package/dist/extensions/layout-css.d.ts.map +1 -0
- package/dist/extensions/layout-css.js +297 -0
- package/dist/extensions/layout-css.js.map +1 -0
- package/dist/extensions/list-layout.d.ts +23 -0
- package/dist/extensions/list-layout.d.ts.map +1 -0
- package/dist/extensions/list-layout.js +65 -0
- package/dist/extensions/list-layout.js.map +1 -0
- package/dist/extensions/page-break.d.ts +8 -0
- package/dist/extensions/page-break.d.ts.map +1 -0
- package/dist/extensions/page-break.js +20 -0
- package/dist/extensions/page-break.js.map +1 -0
- package/dist/extensions/page-view.d.ts +68 -0
- package/dist/extensions/page-view.d.ts.map +1 -0
- package/dist/extensions/page-view.js +189 -0
- package/dist/extensions/page-view.js.map +1 -0
- package/dist/extensions/pagination-controller.d.ts +110 -0
- package/dist/extensions/pagination-controller.d.ts.map +1 -0
- package/dist/extensions/pagination-controller.js +295 -0
- package/dist/extensions/pagination-controller.js.map +1 -0
- package/dist/extensions/pagination-layout.d.ts +54 -0
- package/dist/extensions/pagination-layout.d.ts.map +1 -0
- package/dist/extensions/pagination-layout.js +109 -0
- package/dist/extensions/pagination-layout.js.map +1 -0
- package/dist/extensions/pagination-measure.d.ts +42 -0
- package/dist/extensions/pagination-measure.d.ts.map +1 -0
- package/dist/extensions/pagination-measure.js +108 -0
- package/dist/extensions/pagination-measure.js.map +1 -0
- package/dist/extensions/pagination.d.ts +36 -0
- package/dist/extensions/pagination.d.ts.map +1 -0
- package/dist/extensions/pagination.js +69 -0
- package/dist/extensions/pagination.js.map +1 -0
- package/dist/extensions/paragraph-layout.d.ts +62 -0
- package/dist/extensions/paragraph-layout.d.ts.map +1 -0
- package/dist/extensions/paragraph-layout.js +227 -0
- package/dist/extensions/paragraph-layout.js.map +1 -0
- package/dist/extensions/run-layout.d.ts +79 -0
- package/dist/extensions/run-layout.d.ts.map +1 -0
- package/dist/extensions/run-layout.js +302 -0
- package/dist/extensions/run-layout.js.map +1 -0
- package/dist/extensions/table-layout.d.ts +85 -0
- package/dist/extensions/table-layout.d.ts.map +1 -0
- package/dist/extensions/table-layout.js +314 -0
- package/dist/extensions/table-layout.js.map +1 -0
- package/dist/html/serialize-html.d.ts +42 -0
- package/dist/html/serialize-html.d.ts.map +1 -0
- package/dist/html/serialize-html.js +159 -0
- package/dist/html/serialize-html.js.map +1 -0
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +8 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.d.ts.map +1 -1
- package/dist/i18n/fr.js +8 -0
- package/dist/i18n/fr.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-css.d.ts","sourceRoot":"","sources":["../../src/extensions/layout-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEnE;;;;;GAKG;AAEH,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,6CAA8C,CAAC;AAE5E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAmC9D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAkBvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB5F;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvF;AASD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAyB9E;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAKhE;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAWlE;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,GAAG,IAAI,CAWpE;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,WAAW,GAAG,IAAI,CAyCpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,EAAE,CAWjF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAe5E;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,GAAG,IAAI,CAQjF;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAE/E"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers de sérialisation CSS partagés par les extensions de mise en page (paragraphe,
|
|
3
|
+
* run, tableau). Le contrat (`api/layout.ts`) fige la forme des valeurs : points avec au
|
|
4
|
+
* plus deux décimales, couleurs en `#rrggbb` minuscules, bordures `1pt solid #000000`.
|
|
5
|
+
* Tout passe par ici pour que `setHTML(getHTML())` relise exactement ce qu'il a écrit.
|
|
6
|
+
*/
|
|
7
|
+
/** Côtés de bordure portés par un `style` inline, dans l'ordre de sérialisation. */
|
|
8
|
+
export const CSS_BORDER_SIDES = ['top', 'right', 'bottom', 'left'];
|
|
9
|
+
/** Styles de trait de bordure reconnus (ceux du contrat). */
|
|
10
|
+
const BORDER_STYLES = ['solid', 'dashed', 'dotted', 'double'];
|
|
11
|
+
/** Facteur de conversion CSS : 1 px = 0,75 pt. */
|
|
12
|
+
const PT_PER_PX = 0.75;
|
|
13
|
+
/**
|
|
14
|
+
* Mots-clés de couleur acceptés tels quels (Word n'en produit jamais, mais un HTML collé
|
|
15
|
+
* peut en contenir). Les 16 couleurs de base, le gris dans ses deux graphies, `orange`
|
|
16
|
+
* et `transparent`. Tout autre mot n'est pas une couleur.
|
|
17
|
+
*/
|
|
18
|
+
const COLOR_KEYWORDS = new Set([
|
|
19
|
+
'aqua',
|
|
20
|
+
'black',
|
|
21
|
+
'blue',
|
|
22
|
+
'fuchsia',
|
|
23
|
+
'gray',
|
|
24
|
+
'grey',
|
|
25
|
+
'green',
|
|
26
|
+
'lime',
|
|
27
|
+
'maroon',
|
|
28
|
+
'navy',
|
|
29
|
+
'olive',
|
|
30
|
+
'orange',
|
|
31
|
+
'purple',
|
|
32
|
+
'red',
|
|
33
|
+
'silver',
|
|
34
|
+
'teal',
|
|
35
|
+
'transparent',
|
|
36
|
+
'white',
|
|
37
|
+
'yellow',
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Borne absolue des nombres de mise en page (points, multiples d'interligne) : ±100 000.
|
|
41
|
+
* Word plafonne bien plus bas (retraits ≤ 1 584 pt, espacements ≤ 1 584 pt), une valeur
|
|
42
|
+
* au-delà vient d'une erreur ou d'une attaque ; surtout, `value * 100` déborde vers
|
|
43
|
+
* `Infinity` dès 1e307 et finirait sérialisé en `Infinitypt` que personne ne relit.
|
|
44
|
+
*/
|
|
45
|
+
export const LAYOUT_NUMBER_LIMIT = 100_000;
|
|
46
|
+
/**
|
|
47
|
+
* Arrondit à deux décimales au plus, sans zéro superflu (`6` → `6`, `6.5` → `6.5`), en
|
|
48
|
+
* bornant d'abord à ±`LAYOUT_NUMBER_LIMIT` : jamais `Infinity` en sortie. Un `NaN` ressort
|
|
49
|
+
* `NaN` — c'est aux appelants de garder `isLayoutNumber` en amont.
|
|
50
|
+
*/
|
|
51
|
+
export function roundLayoutNumber(value) {
|
|
52
|
+
const clamped = Math.max(-LAYOUT_NUMBER_LIMIT, Math.min(LAYOUT_NUMBER_LIMIT, value));
|
|
53
|
+
return Math.round(clamped * 100) / 100;
|
|
54
|
+
}
|
|
55
|
+
/** Formate une longueur en points : `6pt`, `6.5pt`, jamais plus de deux décimales. */
|
|
56
|
+
export function formatPt(value) {
|
|
57
|
+
return `${roundLayoutNumber(value)}pt`;
|
|
58
|
+
}
|
|
59
|
+
/** Formate un nombre sans unité (interligne multiple) avec au plus deux décimales. */
|
|
60
|
+
export function formatNumber(value) {
|
|
61
|
+
return String(roundLayoutNumber(value));
|
|
62
|
+
}
|
|
63
|
+
/** Vrai pour un nombre fini, seule valeur acceptée dans les attributs numériques. */
|
|
64
|
+
export function isFiniteNumber(value) {
|
|
65
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Vrai pour un nombre de mise en page acceptable : fini et dans ±`LAYOUT_NUMBER_LIMIT`.
|
|
69
|
+
* C'est la garde à poser avant tout `roundLayoutNumber` / `formatPt` sur une valeur qui
|
|
70
|
+
* vient de l'extérieur (arguments de commande, attributs posés par `setJSON`, HTML).
|
|
71
|
+
*/
|
|
72
|
+
export function isLayoutNumber(value) {
|
|
73
|
+
return isFiniteNumber(value) && Math.abs(value) <= LAYOUT_NUMBER_LIMIT;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Lit une longueur CSS en points. Accepte `pt`, `px` (converti), `0` sans unité ; refuse
|
|
77
|
+
* tout le reste (`em`, `%`, `auto`) : on ne sait pas les convertir sans contexte. Une
|
|
78
|
+
* longueur hors de ±`LAYOUT_NUMBER_LIMIT` est refusée comme une valeur illisible.
|
|
79
|
+
*/
|
|
80
|
+
export function parsePt(value) {
|
|
81
|
+
if (!value) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const match = /^(-?\d+(?:\.\d+)?)(pt|px)?$/i.exec(value.trim());
|
|
85
|
+
if (!match || match[1] === undefined) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const number = Number.parseFloat(match[1]);
|
|
89
|
+
const unit = (match[2] ?? '').toLowerCase();
|
|
90
|
+
const pt = unit === 'px' ? number * PT_PER_PX : number;
|
|
91
|
+
if (!isLayoutNumber(pt)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (unit === '' && number !== 0) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return roundLayoutNumber(pt);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Découpe un attribut `style` en déclarations ordonnées, propriété en minuscules. Une
|
|
101
|
+
* propriété répétée garde sa dernière valeur. Les `;` dans une valeur ne sont pas gérés
|
|
102
|
+
* (jamais produits par le core, hors `url()`, que la mise en page n'utilise pas).
|
|
103
|
+
*/
|
|
104
|
+
export function parseStyleDeclarations(style) {
|
|
105
|
+
const declarations = new Map();
|
|
106
|
+
if (!style) {
|
|
107
|
+
return declarations;
|
|
108
|
+
}
|
|
109
|
+
for (const chunk of style.split(';')) {
|
|
110
|
+
const colon = chunk.indexOf(':');
|
|
111
|
+
if (colon < 0) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const property = chunk.slice(0, colon).trim().toLowerCase();
|
|
115
|
+
const value = chunk.slice(colon + 1).trim();
|
|
116
|
+
if (property !== '' && value !== '') {
|
|
117
|
+
declarations.set(property, value);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return declarations;
|
|
121
|
+
}
|
|
122
|
+
/** Lit une propriété du `style` inline d'un élément, `null` si absente. */
|
|
123
|
+
export function readStyleProperty(element, property) {
|
|
124
|
+
return parseStyleDeclarations(element.getAttribute('style')).get(property) ?? null;
|
|
125
|
+
}
|
|
126
|
+
/** Deux chiffres hexadécimaux pour une composante 0-255. */
|
|
127
|
+
function hex2(component) {
|
|
128
|
+
return Math.max(0, Math.min(255, Math.round(component)))
|
|
129
|
+
.toString(16)
|
|
130
|
+
.padStart(2, '0');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Normalise une couleur CSS en `#rrggbb` minuscules : `#RGB`, `#RRGGBB`, `rgb()` et
|
|
134
|
+
* `rgba()` (alpha ignoré). Un mot-clé connu (`red`, `transparent`) est gardé tel quel en
|
|
135
|
+
* minuscules ; une valeur vide, `none` ou un mot inconnu donne `null`.
|
|
136
|
+
*/
|
|
137
|
+
export function normalizeColor(value) {
|
|
138
|
+
if (!value) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const trimmed = value.trim().toLowerCase();
|
|
142
|
+
if (trimmed === '' || trimmed === 'none' || trimmed === 'initial' || trimmed === 'inherit') {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
const short = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(trimmed);
|
|
146
|
+
if (short) {
|
|
147
|
+
return `#${short[1]}${short[1]}${short[2]}${short[2]}${short[3]}${short[3]}`;
|
|
148
|
+
}
|
|
149
|
+
if (/^#[0-9a-f]{6}$/.test(trimmed)) {
|
|
150
|
+
return trimmed;
|
|
151
|
+
}
|
|
152
|
+
if (/^#[0-9a-f]{8}$/.test(trimmed)) {
|
|
153
|
+
return trimmed.slice(0, 7);
|
|
154
|
+
}
|
|
155
|
+
const rgb = /^rgba?\(\s*(\d+(?:\.\d+)?)\s*[, ]\s*(\d+(?:\.\d+)?)\s*[, ]\s*(\d+(?:\.\d+)?)/.exec(trimmed);
|
|
156
|
+
if (rgb && rgb[1] !== undefined && rgb[2] !== undefined && rgb[3] !== undefined) {
|
|
157
|
+
return `#${hex2(Number(rgb[1]))}${hex2(Number(rgb[2]))}${hex2(Number(rgb[3]))}`;
|
|
158
|
+
}
|
|
159
|
+
return COLOR_KEYWORDS.has(trimmed) ? trimmed : null;
|
|
160
|
+
}
|
|
161
|
+
/** Vrai si la valeur est un style de bordure du contrat. */
|
|
162
|
+
export function isBorderStyle(value) {
|
|
163
|
+
return typeof value === 'string' && BORDER_STYLES.includes(value);
|
|
164
|
+
}
|
|
165
|
+
/** Vrai si la valeur est un côté de bordure du contrat (`between` compris). */
|
|
166
|
+
export function isBorderSide(value) {
|
|
167
|
+
return (typeof value === 'string' &&
|
|
168
|
+
(CSS_BORDER_SIDES.includes(value) || value === 'between'));
|
|
169
|
+
}
|
|
170
|
+
/** Vrai si l'objet est une `BlockBorder` complète et valide. */
|
|
171
|
+
export function isBlockBorder(value) {
|
|
172
|
+
if (typeof value !== 'object' || value === null) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
const candidate = value;
|
|
176
|
+
return (isBorderSide(candidate['side']) &&
|
|
177
|
+
isBorderStyle(candidate['style']) &&
|
|
178
|
+
isLayoutNumber(candidate['widthPt']) &&
|
|
179
|
+
typeof candidate['color'] === 'string');
|
|
180
|
+
}
|
|
181
|
+
/** Ne garde que les bordures valides d'une valeur d'attribut, `null` s'il n'en reste aucune. */
|
|
182
|
+
export function sanitizeBorders(value) {
|
|
183
|
+
if (!Array.isArray(value)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const borders = value.filter(isBlockBorder).map((border) => ({
|
|
187
|
+
side: border.side,
|
|
188
|
+
style: border.style,
|
|
189
|
+
widthPt: roundLayoutNumber(border.widthPt),
|
|
190
|
+
color: normalizeColor(border.color) ?? '#000000',
|
|
191
|
+
}));
|
|
192
|
+
return borders.length > 0 ? borders : null;
|
|
193
|
+
}
|
|
194
|
+
/** Valeur CSS d'une bordure : `1pt solid #000000`. */
|
|
195
|
+
export function formatBorderValue(border) {
|
|
196
|
+
return `${formatPt(border.widthPt)} ${border.style} ${normalizeColor(border.color) ?? '#000000'}`;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Lit une valeur de bordure CSS (`1pt solid #000000`, `solid 1px red`, ordre libre).
|
|
200
|
+
* `none` ou `hidden` donnent `null`. Épaisseur par défaut 1pt, style `solid`, couleur noire,
|
|
201
|
+
* pour accepter un `border-bottom: solid` minimaliste.
|
|
202
|
+
*/
|
|
203
|
+
export function parseBorderValue(side, value) {
|
|
204
|
+
if (!value) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
// Jetons séparés par des blancs, sauf à l'intérieur de parenthèses (`rgb(255, 0, 0)`).
|
|
208
|
+
const tokens = value.trim().match(/[a-z-]+\([^)]*\)|\S+/gi) ?? [];
|
|
209
|
+
if (tokens.some((token) => token === 'none' || token === 'hidden')) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
let widthPt = null;
|
|
213
|
+
let style = null;
|
|
214
|
+
let color = null;
|
|
215
|
+
for (const token of tokens) {
|
|
216
|
+
const lower = token.toLowerCase();
|
|
217
|
+
if (isBorderStyle(lower)) {
|
|
218
|
+
style = lower;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const pt = parsePt(lower);
|
|
222
|
+
if (pt !== null) {
|
|
223
|
+
widthPt = pt;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (lower === 'thin') {
|
|
227
|
+
widthPt = 0.75;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (lower === 'medium') {
|
|
231
|
+
widthPt = 2.25;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (lower === 'thick') {
|
|
235
|
+
widthPt = 3.75;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
color = normalizeColor(lower) ?? color;
|
|
239
|
+
}
|
|
240
|
+
if (widthPt === null && style === null && color === null) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
return { side, style: style ?? 'solid', widthPt: widthPt ?? 1, color: color ?? '#000000' };
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Lit les bordures d'un élément depuis son `style` : `border` (raccourci, quatre côtés)
|
|
247
|
+
* puis `border-<côté>` qui l'emporte côté par côté. Ordre de sortie : top, right, bottom,
|
|
248
|
+
* left. `null` sans bordure.
|
|
249
|
+
*/
|
|
250
|
+
export function parseSideBorders(declarations) {
|
|
251
|
+
const borders = [];
|
|
252
|
+
const shorthand = declarations.get('border') ?? null;
|
|
253
|
+
for (const side of CSS_BORDER_SIDES) {
|
|
254
|
+
const own = declarations.get(`border-${side}`);
|
|
255
|
+
const border = parseBorderValue(side, own ?? shorthand);
|
|
256
|
+
if (border) {
|
|
257
|
+
borders.push(border);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return borders;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Déclarations `border-<côté>` d'une liste de bordures, dans l'ordre top, right, bottom,
|
|
264
|
+
* left ; la dernière bordure d'un même côté l'emporte. `between` est ignoré ici (il n'a
|
|
265
|
+
* pas d'équivalent CSS, le paragraphe le porte en `data-border-between`).
|
|
266
|
+
*/
|
|
267
|
+
export function borderDeclarations(borders) {
|
|
268
|
+
const bySide = new Map();
|
|
269
|
+
for (const border of borders) {
|
|
270
|
+
if (border.side !== 'between') {
|
|
271
|
+
bySide.set(border.side, border);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const declarations = [];
|
|
275
|
+
for (const side of CSS_BORDER_SIDES) {
|
|
276
|
+
const border = bySide.get(side);
|
|
277
|
+
if (border) {
|
|
278
|
+
declarations.push(`border-${side}: ${formatBorderValue(border)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return declarations;
|
|
282
|
+
}
|
|
283
|
+
/** Bordure `between` d'une liste, la dernière s'il y en a plusieurs, sinon `null`. */
|
|
284
|
+
export function betweenBorder(borders) {
|
|
285
|
+
let found = null;
|
|
286
|
+
for (const border of borders) {
|
|
287
|
+
if (border.side === 'between') {
|
|
288
|
+
found = border;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return found;
|
|
292
|
+
}
|
|
293
|
+
/** Assemble des déclarations en un attribut `style` (`a: 1; b: 2`), `null` si aucune. */
|
|
294
|
+
export function joinDeclarations(declarations) {
|
|
295
|
+
return declarations.length > 0 ? declarations.join('; ') : null;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=layout-css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-css.js","sourceRoot":"","sources":["../../src/extensions/layout-css.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
/** Nom de l'extension qui porte les attributs de liste de mise en page. */
|
|
3
|
+
export declare const LIST_LAYOUT_EXTENSION_NAME = "listLayout";
|
|
4
|
+
/** Attribut HTML qui relie une liste à la définition de numérotation du gabarit Word. */
|
|
5
|
+
export declare const DOCX_NUM_ID_ATTRIBUTE = "data-docx-num-id";
|
|
6
|
+
/** Attribut HTML du caractère de puce d'une liste à puces. */
|
|
7
|
+
export declare const BULLET_ATTRIBUTE = "data-bullet";
|
|
8
|
+
/**
|
|
9
|
+
* Attribut HTML booléen posé par l'import Word sur le paragraphe d'un item dont le retrait
|
|
10
|
+
* (`margin-left`, `text-indent`) vient du niveau de numérotation et non du paragraphe :
|
|
11
|
+
* l'export Word le relit pour ne pas réécrire ce retrait en propriété directe.
|
|
12
|
+
*/
|
|
13
|
+
export declare const DOCX_NUM_INDENT_ATTRIBUTE = "data-docx-num-indent";
|
|
14
|
+
/**
|
|
15
|
+
* Extension `ListLayout` : attributs de `ListLayoutAttrs` que Tiptap ne porte pas déjà.
|
|
16
|
+
* `orderedList` a `type` et `start` nativement (`<ol type="a" start="3">`) ; on y ajoute
|
|
17
|
+
* `docxNumId`. `bulletList` reçoit `bullet` (`data-bullet`) et `docxNumId`. Les paragraphes
|
|
18
|
+
* et titres portent `docxNumIndent` (`data-docx-num-indent`, hors contrat `api/`), que
|
|
19
|
+
* l'import Word pose sur les items. Aucun n'est interprété par l'éditeur : ils servent à
|
|
20
|
+
* l'export dans le gabarit Word, et doivent survivre à `setHTML(getHTML())`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const ListLayout: Extension<any, any>;
|
|
23
|
+
//# sourceMappingURL=list-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-layout.d.ts","sourceRoot":"","sources":["../../src/extensions/list-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,cAAc,CAAC;AAEzD,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,eAAe,CAAC;AAEvD,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AACxD,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAuBhE;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,qBAwBrB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
/** Nom de l'extension qui porte les attributs de liste de mise en page. */
|
|
3
|
+
export const LIST_LAYOUT_EXTENSION_NAME = 'listLayout';
|
|
4
|
+
/** Attribut HTML qui relie une liste à la définition de numérotation du gabarit Word. */
|
|
5
|
+
export const DOCX_NUM_ID_ATTRIBUTE = 'data-docx-num-id';
|
|
6
|
+
/** Attribut HTML du caractère de puce d'une liste à puces. */
|
|
7
|
+
export const BULLET_ATTRIBUTE = 'data-bullet';
|
|
8
|
+
/**
|
|
9
|
+
* Attribut HTML booléen posé par l'import Word sur le paragraphe d'un item dont le retrait
|
|
10
|
+
* (`margin-left`, `text-indent`) vient du niveau de numérotation et non du paragraphe :
|
|
11
|
+
* l'export Word le relit pour ne pas réécrire ce retrait en propriété directe.
|
|
12
|
+
*/
|
|
13
|
+
export const DOCX_NUM_INDENT_ATTRIBUTE = 'data-docx-num-indent';
|
|
14
|
+
/** Attribut booléen : présent → `true`, rendu en `data-…=""`, absent → `null`. */
|
|
15
|
+
function booleanDataAttribute(name, htmlAttribute) {
|
|
16
|
+
return {
|
|
17
|
+
default: null,
|
|
18
|
+
parseHTML: (element) => (element.hasAttribute(htmlAttribute) ? true : null),
|
|
19
|
+
renderHTML: (attributes) => (attributes[name] === true ? { [htmlAttribute]: '' } : {}),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Attribut texte simple : lu et écrit tel quel, `null` si vide. */
|
|
23
|
+
function dataAttribute(name, htmlAttribute) {
|
|
24
|
+
return {
|
|
25
|
+
default: null,
|
|
26
|
+
parseHTML: (element) => element.getAttribute(htmlAttribute) || null,
|
|
27
|
+
renderHTML: (attributes) => {
|
|
28
|
+
const value = attributes[name];
|
|
29
|
+
return typeof value === 'string' && value !== '' ? { [htmlAttribute]: value } : {};
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extension `ListLayout` : attributs de `ListLayoutAttrs` que Tiptap ne porte pas déjà.
|
|
35
|
+
* `orderedList` a `type` et `start` nativement (`<ol type="a" start="3">`) ; on y ajoute
|
|
36
|
+
* `docxNumId`. `bulletList` reçoit `bullet` (`data-bullet`) et `docxNumId`. Les paragraphes
|
|
37
|
+
* et titres portent `docxNumIndent` (`data-docx-num-indent`, hors contrat `api/`), que
|
|
38
|
+
* l'import Word pose sur les items. Aucun n'est interprété par l'éditeur : ils servent à
|
|
39
|
+
* l'export dans le gabarit Word, et doivent survivre à `setHTML(getHTML())`.
|
|
40
|
+
*/
|
|
41
|
+
export const ListLayout = Extension.create({
|
|
42
|
+
name: LIST_LAYOUT_EXTENSION_NAME,
|
|
43
|
+
addGlobalAttributes() {
|
|
44
|
+
return [
|
|
45
|
+
{
|
|
46
|
+
types: ['orderedList'],
|
|
47
|
+
attributes: { docxNumId: dataAttribute('docxNumId', DOCX_NUM_ID_ATTRIBUTE) },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
types: ['bulletList'],
|
|
51
|
+
attributes: {
|
|
52
|
+
bullet: dataAttribute('bullet', BULLET_ATTRIBUTE),
|
|
53
|
+
docxNumId: dataAttribute('docxNumId', DOCX_NUM_ID_ATTRIBUTE),
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
types: ['paragraph', 'heading'],
|
|
58
|
+
attributes: {
|
|
59
|
+
docxNumIndent: booleanDataAttribute('docxNumIndent', DOCX_NUM_INDENT_ATTRIBUTE),
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=list-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-layout.js","sourceRoot":"","sources":["../../src/extensions/list-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,cAAc,CAAC;AAEzD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AAEvD,yFAAyF;AACzF,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AACxD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEhE,kFAAkF;AAClF,SAAS,oBAAoB,CAAC,IAAY,EAAE,aAAqB;IAC/D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,SAAS,aAAa,CAAC,IAAY,EAAE,aAAqB;IACxD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,IAAI;QACnE,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;YACzB,MAAM,KAAK,GAAY,UAAU,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,0BAA0B;IAEhC,mBAAmB;QACjB,OAAO;YACL;gBACE,KAAK,EAAE,CAAC,aAAa,CAAC;gBACtB,UAAU,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE;aAC7E;YACD;gBACE,KAAK,EAAE,CAAC,YAAY,CAAC;gBACrB,UAAU,EAAE;oBACV,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC;oBACjD,SAAS,EAAE,aAAa,CAAC,WAAW,EAAE,qBAAqB,CAAC;iBAC7D;aACF;YACD;gBACE,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;gBAC/B,UAAU,EAAE;oBACV,aAAa,EAAE,oBAAoB,CAAC,eAAe,EAAE,yBAAyB,CAAC;iBAChF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Séparateur horizontal qui sait aussi être un saut de page : `<hr data-page-break>`.
|
|
3
|
+
* L'import Word produit cette forme pour `w:br w:type="page"`, l'export Word la relit
|
|
4
|
+
* en saut de page, la vue page la rend comme une coupure de feuille. Sans cet attribut,
|
|
5
|
+
* le `HorizontalRule` de Tiptap le perdait à `setHTML(getHTML())`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const AsterHorizontalRule: import("@tiptap/core").Node<import("@tiptap/extension-horizontal-rule").HorizontalRuleOptions, any>;
|
|
8
|
+
//# sourceMappingURL=page-break.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-break.d.ts","sourceRoot":"","sources":["../../src/extensions/page-break.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qGAY9B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HorizontalRule } from '@tiptap/extension-horizontal-rule';
|
|
2
|
+
/**
|
|
3
|
+
* Séparateur horizontal qui sait aussi être un saut de page : `<hr data-page-break>`.
|
|
4
|
+
* L'import Word produit cette forme pour `w:br w:type="page"`, l'export Word la relit
|
|
5
|
+
* en saut de page, la vue page la rend comme une coupure de feuille. Sans cet attribut,
|
|
6
|
+
* le `HorizontalRule` de Tiptap le perdait à `setHTML(getHTML())`.
|
|
7
|
+
*/
|
|
8
|
+
export const AsterHorizontalRule = HorizontalRule.extend({
|
|
9
|
+
addAttributes() {
|
|
10
|
+
return {
|
|
11
|
+
...this.parent?.(),
|
|
12
|
+
pageBreak: {
|
|
13
|
+
default: false,
|
|
14
|
+
parseHTML: (element) => element.hasAttribute('data-page-break'),
|
|
15
|
+
renderHTML: (attributes) => attributes['pageBreak'] === true ? { 'data-page-break': '' } : {},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=page-break.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-break.js","sourceRoot":"","sources":["../../src/extensions/page-break.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC;IACvD,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,SAAS,EAAE;gBACT,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBAC5E,UAAU,EAAE,CAAC,UAAmC,EAAE,EAAE,CAClD,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;aACpE;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DocumentLayout, PageDimensions, PageSizeName, PageViewOptions } from '../api';
|
|
2
|
+
export { MAX_SANITIZE_DEPTH, sanitizeHeaderFooterHtml } from './header-footer-sanitize';
|
|
3
|
+
/** Classe posée sur l'hôte de l'éditeur quand la vue page est active. */
|
|
4
|
+
export declare const PAGE_VIEW_CLASS = "aster--page-view";
|
|
5
|
+
/** Classe du conteneur d'en-tête rendu avant le corps. */
|
|
6
|
+
export declare const PAGE_HEADER_CLASS = "aster-page-header";
|
|
7
|
+
/** Classe du conteneur de pied rendu après le corps. */
|
|
8
|
+
export declare const PAGE_FOOTER_CLASS = "aster-page-footer";
|
|
9
|
+
/** Marge par défaut d'un document Word : 1 pouce. */
|
|
10
|
+
export declare const DEFAULT_PAGE_MARGIN_MM = 25.4;
|
|
11
|
+
/** Distance par défaut du bord à l'en-tête / au pied dans Word : un demi-pouce. */
|
|
12
|
+
export declare const DEFAULT_HEADER_FOOTER_MARGIN_MM = 12.7;
|
|
13
|
+
/**
|
|
14
|
+
* Borne haute de toute dimension ou marge de page, en millimètres (R23-05). Au-delà (ou
|
|
15
|
+
* pour `1e308`, dont `value * 100` déborde en `Infinity` au formatage), la valeur tombe sur
|
|
16
|
+
* le défaut : aucune variable CSS ne vaut jamais `Infinitymm`.
|
|
17
|
+
*/
|
|
18
|
+
export declare const MAX_PAGE_MM = 10000;
|
|
19
|
+
/** Dimensions des formats nommés, en portrait, en millimètres. */
|
|
20
|
+
export declare const PAGE_SIZES_MM: Readonly<Record<PageSizeName, PageDimensions>>;
|
|
21
|
+
/** Variables CSS posées sur l'hôte, dans l'ordre. */
|
|
22
|
+
export declare const PAGE_VIEW_CSS_VARIABLES: readonly ["--aster-page-width", "--aster-page-height", "--aster-page-margin-top", "--aster-page-margin-right", "--aster-page-margin-bottom", "--aster-page-margin-left", "--aster-page-margin-header", "--aster-page-margin-footer"];
|
|
23
|
+
/** Dimensions et marges résolues d'une page, en millimètres. */
|
|
24
|
+
export interface PageMetrics {
|
|
25
|
+
readonly widthMm: number;
|
|
26
|
+
readonly heightMm: number;
|
|
27
|
+
readonly marginTopMm: number;
|
|
28
|
+
readonly marginRightMm: number;
|
|
29
|
+
readonly marginBottomMm: number;
|
|
30
|
+
readonly marginLeftMm: number;
|
|
31
|
+
/** Distance du bord haut à l'en-tête (`PageMargins.headerMm`, 12,7 mm par défaut). */
|
|
32
|
+
readonly marginHeaderMm: number;
|
|
33
|
+
/** Distance du bord bas au pied (`PageMargins.footerMm`, 12,7 mm par défaut). */
|
|
34
|
+
readonly marginFooterMm: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Résout les dimensions et marges d'une page depuis `layout.page` : format nommé ou libre
|
|
38
|
+
* (A4 par défaut), orientation paysage qui inverse largeur et hauteur, marges à 25,4 mm
|
|
39
|
+
* par défaut, en-tête et pied à 12,7 mm du bord. Les valeurs absurdes (négatives, `NaN`,
|
|
40
|
+
* infinies, au-delà de `MAX_PAGE_MM`) tombent sur les défauts.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolvePageMetrics(layout: DocumentLayout | undefined | null): PageMetrics;
|
|
43
|
+
/** Valeurs des variables CSS, dans l'ordre de `PAGE_VIEW_CSS_VARIABLES`. */
|
|
44
|
+
export declare function pageViewCssValues(metrics: PageMetrics): readonly string[];
|
|
45
|
+
/**
|
|
46
|
+
* Événement DOM (sans bulle) émis sur `contentElement` quand la vue page est activée ou
|
|
47
|
+
* retirée. Le plugin de pagination (L30) l'écoute sur `view.dom` et relit
|
|
48
|
+
* `getActivePageView` : aucune dépendance de `page-view` vers le plugin.
|
|
49
|
+
*/
|
|
50
|
+
export declare const PAGE_VIEW_CHANGE_EVENT = "aster:page-view-change";
|
|
51
|
+
/** Options de la vue page active sur ce conteneur de contenu, `null` si elle est inactive. */
|
|
52
|
+
export declare function getActivePageView(contentElement: HTMLElement): PageViewOptions | null;
|
|
53
|
+
/** Vue page montée : conteneurs et retrait. */
|
|
54
|
+
export interface PageViewHandle {
|
|
55
|
+
readonly layout: DocumentLayout;
|
|
56
|
+
readonly header: HTMLElement | null;
|
|
57
|
+
readonly footer: HTMLElement | null;
|
|
58
|
+
/** Retire classe, variables et conteneurs. Idempotent. */
|
|
59
|
+
remove(): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Active la vue page : classe `aster--page-view` et variables `--aster-page-*` sur
|
|
63
|
+
* l'hôte, conteneurs `div.aster-page-header` / `div.aster-page-footer` (contenu assaini)
|
|
64
|
+
* juste avant et juste après `contentElement`. La feuille de style est dans `ui` ; le
|
|
65
|
+
* core ne pose que classes, variables et conteneurs.
|
|
66
|
+
*/
|
|
67
|
+
export declare function applyPageView(host: HTMLElement, contentElement: HTMLElement, options: PageViewOptions): PageViewHandle;
|
|
68
|
+
//# sourceMappingURL=page-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-view.d.ts","sourceRoot":"","sources":["../../src/extensions/page-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAK5F,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAExF,yEAAyE;AACzE,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAClD,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC,kEAAkE;AAClE,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAMxE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,sOAS1B,CAAC;AAEX,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AA2BD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,CAwBzF;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,MAAM,EAAE,CAWzE;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAK/D,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAErF;AAOD,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,0DAA0D;IAC1D,MAAM,IAAI,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,WAAW,EAC3B,OAAO,EAAE,eAAe,GACvB,cAAc,CAgEhB"}
|