@json-to-office/core-docx 1.5.0 → 1.6.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.
@@ -49,6 +49,36 @@ export interface DocxFrameTextFact extends QualityFact {
49
49
  pageBottomTwips: number;
50
50
  /** The longest whitespace-delimited token — the one with nowhere to wrap. */
51
51
  longestWord: string;
52
+ /**
53
+ * Resolved anchor when the frame is pinned by numeric offsets; an unstated
54
+ * axis pins at 0, exactly as the compiler resolves it. Absent for
55
+ * alignment-positioned frames and for percentage offsets, which this static
56
+ * pass does not resolve.
57
+ */
58
+ absoluteOffsetTwips?: {
59
+ x: number;
60
+ y: number;
61
+ };
62
+ /**
63
+ * What each axis's offset is measured from — `page` unless authored.
64
+ * Offsets are only comparable between frames sharing both references.
65
+ */
66
+ anchorHorizontal: string;
67
+ anchorVertical: string;
68
+ /**
69
+ * Shared by consecutive paragraphs whose frame properties are identical.
70
+ * OOXML merges those into one flowing frame (§17.3.1.11 — the stock stat
71
+ * cards stack number, caption and body this way), so their texts stack
72
+ * inside the box rather than painting over each other. Any rule comparing
73
+ * frame rects must treat a chain as a single frame.
74
+ */
75
+ frameChainId: string;
76
+ /**
77
+ * Top-level flow this frame renders in. Every top-level `section` starts a
78
+ * new page, so frames in different flows never share one; top-level content
79
+ * outside any section shares the flow it lands in.
80
+ */
81
+ flowIndex: number;
52
82
  }
53
83
  /**
54
84
  * A `<text>` element inside an inline SVG, with the canvas it has to sit in.
@@ -1 +1 @@
1
- {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../src/quality/facts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,WAAW,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAuB,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,IAAI,EAAE,kBAAkB,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,eAAe,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkPD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,yBAAyB,EACnC,OAAO,GAAE,yBAA8B,GACtC,gBAAgB,CAAC,gBAAgB,EAAE,eAAe,CAAC,CA+ErD"}
1
+ {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../src/quality/facts.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { DocxQualityFact, DocxQualityModel } from './facts';
3
3
  export declare const docxTableWidthRule: QualityRule<DocxQualityModel, DocxQualityFact>;
4
4
  export declare const docxHeadingHierarchyRule: QualityRule<DocxQualityModel, DocxQualityFact>;
5
5
  export declare const docxTextFitRule: QualityRule<DocxQualityModel, DocxQualityFact>;
6
+ export declare const docxFrameCollisionRule: QualityRule<DocxQualityModel, DocxQualityFact>;
6
7
  export declare const docxSvgTextBoundsRule: QualityRule<DocxQualityModel, DocxQualityFact>;
7
8
  export declare const DOCX_QUALITY_RULES: QualityRulePack<DocxQualityModel, DocxQualityFact>;
8
9
  export declare const DOCX_QUALITY_PROFILES: {
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/quality/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAGV,eAAe,EACf,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAejB,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAC1C,gBAAgB,EAChB,eAAe,CA6DhB,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAChD,gBAAgB,EAChB,eAAe,CAuChB,CAAC;AAsBF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,gBAAgB,EAAE,eAAe,CAwF1E,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAC7C,gBAAgB,EAChB,eAAe,CAqChB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,gBAAgB,EAChB,eAAe,CAShB,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAmBiB,CAAC;AAEpD,eAAO,MAAM,4BAA4B,EAAE,cACA,CAAC;AAK5C;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,cAAc,GAAG,SAAS,GACpC,cAAc,GAAG,SAAS,CAK5B;AAED,eAAO,MAAM,iBAAiB,kDAA8C,CAAC"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/quality/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAGV,eAAe,EACf,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAejB,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAC1C,gBAAgB,EAChB,eAAe,CA6DhB,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAChD,gBAAgB,EAChB,eAAe,CAuChB,CAAC;AAsBF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,gBAAgB,EAAE,eAAe,CAwF1E,CAAC;AA+BF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAC9C,gBAAgB,EAChB,eAAe,CA6HhB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAC7C,gBAAgB,EAChB,eAAe,CAqChB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,gBAAgB,EAChB,eAAe,CAUhB,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAmBiB,CAAC;AAEpD,eAAO,MAAM,4BAA4B,EAAE,cACA,CAAC;AAK5C;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,cAAc,GAAG,SAAS,GACpC,cAAc,GAAG,SAAS,CAK5B;AAED,eAAO,MAAM,iBAAiB,kDAA8C,CAAC"}
@@ -6,77 +6,305 @@
6
6
  "author": "Apex Consulting",
7
7
  "description": "Strategic proposal for Meridian Financial Group's cloud transformation initiative"
8
8
  },
9
- "theme": "apex"
9
+ "theme": "vermilion"
10
10
  },
11
11
  "children": [
12
12
  {
13
13
  "name": "section",
14
14
  "props": {
15
15
  "meta": {
16
- "title": "Cloud Migration Proposal"
16
+ "title": "Cover"
17
17
  },
18
- "header": [
19
- {
20
- "name": "paragraph",
21
- "props": {
22
- "text": "Apex Consulting — Confidential",
23
- "alignment": "right"
18
+ "page": {
19
+ "margins": {
20
+ "top": 0,
21
+ "right": 0,
22
+ "bottom": 0,
23
+ "left": 0,
24
+ "header": 0,
25
+ "footer": 0
26
+ }
27
+ },
28
+ "header": [],
29
+ "footer": []
30
+ },
31
+ "children": [
32
+ {
33
+ "name": "image",
34
+ "props": {
35
+ "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"8.39in\" height=\"11.81in\" viewBox=\"0 0 806 1134\"><rect width=\"806\" height=\"1134\" fill=\"#EF4130\"/><rect x=\"0\" y=\"522\" width=\"806\" height=\"92\" fill=\"#F68F71\"/><rect x=\"0\" y=\"614\" width=\"806\" height=\"520\" fill=\"#C7C8CA\"/><rect x=\"216\" y=\"231\" width=\"46\" height=\"1.6\" fill=\"#FFFFFF\"/><rect x=\"544\" y=\"231\" width=\"46\" height=\"1.6\" fill=\"#FFFFFF\"/><rect x=\"402.5\" y=\"468\" width=\"1\" height=\"44\" fill=\"#FFFFFF\"/><circle cx=\"403\" cy=\"540\" r=\"18\" fill=\"#FFFFFF\"/><path d=\"M403,532 L403,546 M397,541 L403,547 L409,541\" stroke=\"#EF4130\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
36
+ "width": 806,
37
+ "height": 1134,
38
+ "floating": {
39
+ "behindDocument": true,
40
+ "zIndex": 0,
41
+ "allowOverlap": true,
42
+ "horizontalPosition": {
43
+ "relative": "page",
44
+ "offset": -86
45
+ },
46
+ "verticalPosition": {
47
+ "relative": "page",
48
+ "offset": -86
49
+ },
50
+ "wrap": {
51
+ "type": "none"
52
+ }
24
53
  }
25
54
  }
26
- ],
27
- "footer": [
28
- {
29
- "name": "paragraph",
30
- "props": {
31
- "text": "Prepared for Meridian Financial Group",
32
- "alignment": "left"
55
+ },
56
+ {
57
+ "name": "paragraph",
58
+ "props": {
59
+ "text": "APEX CONSULTING",
60
+ "noProof": true,
61
+ "alignment": "center",
62
+ "spacing": {
63
+ "before": 0,
64
+ "after": 0
65
+ },
66
+ "font": {
67
+ "size": 10.5,
68
+ "color": "#FFFFFF",
69
+ "family": "Calibri",
70
+ "bold": true,
71
+ "characterSpacing": {
72
+ "type": "expanded",
73
+ "value": 50
74
+ }
75
+ },
76
+ "floating": {
77
+ "width": 11906,
78
+ "horizontalPosition": {
79
+ "relative": "page",
80
+ "offset": 0
81
+ },
82
+ "verticalPosition": {
83
+ "relative": "page",
84
+ "offset": 1120
85
+ },
86
+ "wrap": {
87
+ "type": "none"
88
+ }
33
89
  }
34
90
  }
35
- ]
36
- },
37
- "children": [
91
+ },
38
92
  {
39
- "name": "heading",
93
+ "name": "paragraph",
40
94
  "props": {
41
- "text": "Cloud Migration Proposal",
42
- "level": 1
95
+ "text": "CLOUD",
96
+ "noProof": true,
97
+ "alignment": "center",
98
+ "spacing": {
99
+ "before": 0,
100
+ "after": 0
101
+ },
102
+ "font": {
103
+ "size": 13,
104
+ "color": "#FFFFFF",
105
+ "family": "Calibri",
106
+ "bold": true,
107
+ "characterSpacing": {
108
+ "type": "expanded",
109
+ "value": 90
110
+ }
111
+ },
112
+ "floating": {
113
+ "width": 11906,
114
+ "horizontalPosition": {
115
+ "relative": "page",
116
+ "offset": 0
117
+ },
118
+ "verticalPosition": {
119
+ "relative": "page",
120
+ "offset": 3260
121
+ },
122
+ "wrap": {
123
+ "type": "none"
124
+ }
125
+ }
43
126
  }
44
127
  },
45
128
  {
46
- "name": "heading",
129
+ "name": "paragraph",
47
130
  "props": {
48
- "text": "Strategic Infrastructure Transformation for Meridian Financial Group",
49
- "level": 2
131
+ "text": "MIGRATION",
132
+ "noProof": true,
133
+ "alignment": "center",
134
+ "spacing": {
135
+ "before": 0,
136
+ "after": 0
137
+ },
138
+ "font": {
139
+ "size": 58,
140
+ "color": "#FFFFFF",
141
+ "family": "Arial",
142
+ "bold": true,
143
+ "lineSpacing": {
144
+ "type": "exactly",
145
+ "value": 62
146
+ },
147
+ "characterSpacing": {
148
+ "type": "condensed",
149
+ "value": 10
150
+ }
151
+ },
152
+ "floating": {
153
+ "width": 11906,
154
+ "horizontalPosition": {
155
+ "relative": "page",
156
+ "offset": 0
157
+ },
158
+ "verticalPosition": {
159
+ "relative": "page",
160
+ "offset": 3700
161
+ },
162
+ "wrap": {
163
+ "type": "none"
164
+ }
165
+ }
50
166
  }
51
167
  },
52
168
  {
53
169
  "name": "paragraph",
54
170
  "props": {
55
- "text": "Prepared by Apex Consulting — April 2026",
171
+ "text": "PROPOSAL 2026",
172
+ "noProof": true,
173
+ "alignment": "center",
174
+ "spacing": {
175
+ "before": 0,
176
+ "after": 0
177
+ },
56
178
  "font": {
57
- "italic": true,
58
- "color": "textSecondary"
179
+ "size": 30,
180
+ "color": "#FFFFFF",
181
+ "family": "Arial",
182
+ "bold": true,
183
+ "characterSpacing": {
184
+ "type": "expanded",
185
+ "value": 20
186
+ }
187
+ },
188
+ "floating": {
189
+ "width": 11906,
190
+ "horizontalPosition": {
191
+ "relative": "page",
192
+ "offset": 0
193
+ },
194
+ "verticalPosition": {
195
+ "relative": "page",
196
+ "offset": 5000
197
+ },
198
+ "wrap": {
199
+ "type": "none"
200
+ }
59
201
  }
60
202
  }
61
203
  },
62
204
  {
63
205
  "name": "paragraph",
64
206
  "props": {
65
- "text": ""
207
+ "text": "Prepared for Meridian Financial Group · April 2026",
208
+ "noProof": true,
209
+ "alignment": "left",
210
+ "spacing": {
211
+ "before": 0,
212
+ "after": 0
213
+ },
214
+ "font": {
215
+ "size": 9.5,
216
+ "color": "#282829",
217
+ "family": "Calibri"
218
+ },
219
+ "floating": {
220
+ "width": 7000,
221
+ "horizontalPosition": {
222
+ "relative": "page",
223
+ "offset": 1180
224
+ },
225
+ "verticalPosition": {
226
+ "relative": "page",
227
+ "offset": 14980
228
+ },
229
+ "wrap": {
230
+ "type": "none"
231
+ }
232
+ }
66
233
  }
67
234
  },
235
+ {
236
+ "name": "paragraph",
237
+ "props": {
238
+ "text": "Confidential",
239
+ "noProof": true,
240
+ "alignment": "right",
241
+ "spacing": {
242
+ "before": 0,
243
+ "after": 0
244
+ },
245
+ "font": {
246
+ "size": 9.5,
247
+ "color": "#EF4130",
248
+ "family": "Calibri",
249
+ "bold": true
250
+ },
251
+ "floating": {
252
+ "width": 2230,
253
+ "horizontalPosition": {
254
+ "relative": "page",
255
+ "offset": 8500
256
+ },
257
+ "verticalPosition": {
258
+ "relative": "page",
259
+ "offset": 14980
260
+ },
261
+ "wrap": {
262
+ "type": "none"
263
+ }
264
+ }
265
+ }
266
+ }
267
+ ]
268
+ },
269
+ {
270
+ "name": "section",
271
+ "props": {
272
+ "meta": {
273
+ "title": "Overview & Contents"
274
+ },
275
+ "header": [
276
+ {
277
+ "name": "paragraph",
278
+ "props": {
279
+ "text": "Apex Consulting — Confidential",
280
+ "alignment": "right"
281
+ }
282
+ }
283
+ ],
284
+ "footer": [
285
+ {
286
+ "name": "paragraph",
287
+ "props": {
288
+ "text": "Prepared for Meridian Financial Group",
289
+ "alignment": "left"
290
+ }
291
+ }
292
+ ],
293
+ "pageBreak": true
294
+ },
295
+ "children": [
68
296
  {
69
297
  "name": "image",
70
298
  "props": {
71
- "path": "https://placehold.co/800x200/0C2340/D4A843?text=APEX+CONSULTING&font=georgia",
72
- "width": "100%",
73
- "caption": "Figure: Apex Consulting — Enterprise Cloud Advisory"
299
+ "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"800\" height=\"120\" viewBox=\"0 0 800 120\"><rect width=\"800\" height=\"120\" fill=\"#EF4130\"/><rect width=\"8\" height=\"120\" fill=\"#282829\"/><rect x=\"712\" y=\"59.2\" width=\"1\" height=\"26\" fill=\"#FFFFFF\"/><circle cx=\"712.5\" cy=\"48\" r=\"12\" fill=\"#FFFFFF\"/><path d=\"M712.5,43 L712.5,52 M708.5,48.5 L712.5,52.5 L716.5,48.5\" stroke=\"#EF4130\" stroke-width=\"1.6\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><text x=\"40\" y=\"56\" font-family=\"Arial, sans-serif\" font-size=\"28\" font-weight=\"bold\" letter-spacing=\"3\" fill=\"#FFFFFF\">APEX CONSULTING</text><text x=\"40\" y=\"84\" font-family=\"Arial, sans-serif\" font-size=\"10\" letter-spacing=\"5\" fill=\"#FEE9DF\">ENTERPRISE CLOUD ADVISORY</text></svg>",
300
+ "width": "100%"
74
301
  }
75
302
  },
76
303
  {
77
- "name": "paragraph",
304
+ "name": "heading",
78
305
  "props": {
79
- "text": ""
306
+ "text": "About This Proposal",
307
+ "level": 1
80
308
  }
81
309
  },
82
310
  {
@@ -91,6 +319,13 @@
91
319
  "text": "Apex Consulting brings 14 years of experience in financial services cloud transformations, having successfully migrated 23 regulated financial institutions to cloud-native architectures. Our team holds AWS Advanced Consulting Partner status and specializes in PCI-DSS and SOC 2 compliant migrations."
92
320
  }
93
321
  },
322
+ {
323
+ "name": "heading",
324
+ "props": {
325
+ "text": "Contents",
326
+ "level": 2
327
+ }
328
+ },
94
329
  {
95
330
  "name": "toc",
96
331
  "props": {
@@ -271,7 +506,7 @@
271
506
  "size": 10
272
507
  }
273
508
  },
274
- "borderColor": "D6DAE0",
509
+ "borderColor": "EFEAE4",
275
510
  "borderSize": 1,
276
511
  "hideBorders": {
277
512
  "insideVertical": true
@@ -481,7 +716,7 @@
481
716
  "size": 10
482
717
  }
483
718
  },
484
- "borderColor": "D6DAE0",
719
+ "borderColor": "EFEAE4",
485
720
  "borderSize": 1,
486
721
  "hideBorders": {
487
722
  "insideVertical": true
@@ -607,9 +842,9 @@
607
842
  {
608
843
  "name": "image",
609
844
  "props": {
610
- "path": "https://placehold.co/800x300/F4F5F8/0C2340?text=Migration+Architecture+Diagram&font=georgia",
845
+ "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"800\" height=\"340\" viewBox=\"0 0 800 340\"><rect width=\"800\" height=\"340\" fill=\"#FAF7F5\"/><rect x=\"0.5\" y=\"0.5\" width=\"799\" height=\"339\" fill=\"none\" stroke=\"#EFEAE4\"/><defs><marker id=\"arw\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0,0 L10,5 L0,10 z\" fill=\"#EF4130\"/></marker></defs><rect x=\"30\" y=\"115\" width=\"150\" height=\"110\" rx=\"6\" fill=\"#FFFFFF\" stroke=\"#282829\" stroke-width=\"1.5\"/><text x=\"105\" y=\"145\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"13\" font-weight=\"bold\" fill=\"#282829\">Meridian DC</text><text x=\"105\" y=\"166\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10\" fill=\"#58595B\">Oracle RAC · VMware</text><text x=\"105\" y=\"182\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10\" fill=\"#58595B\">12 physical hosts</text><text x=\"105\" y=\"203\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"9\" fill=\"#58595B\">decommissioned in Phase 3</text><line x1=\"180\" y1=\"170\" x2=\"253\" y2=\"170\" stroke=\"#EF4130\" stroke-width=\"2.5\" marker-end=\"url(#arw)\"/><text x=\"216\" y=\"150\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"9.5\" fill=\"#58595B\">Direct Connect</text><text x=\"216\" y=\"192\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"9.5\" fill=\"#58595B\">10 Gbps</text><rect x=\"258\" y=\"35\" width=\"512\" height=\"270\" rx=\"10\" fill=\"#FFFFFF\" stroke=\"#282829\" stroke-width=\"1.5\"/><text x=\"280\" y=\"62\" font-family=\"Calibri, sans-serif\" font-size=\"11\" font-weight=\"bold\" fill=\"#282829\">AWS</text><rect x=\"280\" y=\"75\" width=\"228\" height=\"205\" rx=\"8\" fill=\"#FFFFFF\" stroke=\"#58595B\"/><text x=\"394\" y=\"99\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" font-weight=\"bold\" fill=\"#282829\">us-east-1 — Production</text><rect x=\"299\" y=\"114\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"394.0\" y=\"135\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">ECS Fargate — app tier</text><rect x=\"299\" y=\"158\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"394.0\" y=\"179\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">Aurora PostgreSQL — Multi-AZ</text><rect x=\"299\" y=\"202\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"394.0\" y=\"223\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">S3 — object storage</text><text x=\"394\" y=\"264\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"9\" fill=\"#58595B\">GuardDuty · Security Hub · Config</text><rect x=\"528\" y=\"75\" width=\"222\" height=\"205\" rx=\"8\" fill=\"#FFFFFF\" stroke=\"#58595B\"/><text x=\"639\" y=\"99\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" font-weight=\"bold\" fill=\"#282829\">eu-west-1 — DR</text><rect x=\"544\" y=\"114\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"639.0\" y=\"135\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">Aurora Global — replica</text><rect x=\"544\" y=\"158\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"639.0\" y=\"179\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">ECS — warm standby</text><rect x=\"544\" y=\"202\" width=\"190\" height=\"34\" rx=\"4\" fill=\"#FAF7F5\" stroke=\"#EFEAE4\"/><text x=\"639.0\" y=\"223\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"10.5\" fill=\"#282829\">S3 — cross-region replication</text><text x=\"639\" y=\"264\" text-anchor=\"middle\" font-family=\"Calibri, sans-serif\" font-size=\"9\" fill=\"#58595B\">RPO &lt; 1 min · RTO &lt; 15 min</text><line x1=\"508\" y1=\"170\" x2=\"528\" y2=\"170\" stroke=\"#EF4130\" stroke-width=\"2\" stroke-dasharray=\"4 3\" marker-end=\"url(#arw)\" marker-start=\"url(#arw)\"/></svg>",
611
846
  "width": "100%",
612
- "caption": "Figure 2: Target cloud architecture — multi-AZ deployment across us-east-1 and eu-west-1"
847
+ "caption": "Figure 1: Target cloud architecture — multi-AZ deployment across us-east-1 and eu-west-1"
613
848
  }
614
849
  },
615
850
  {
@@ -678,7 +913,7 @@
678
913
  "size": 10
679
914
  }
680
915
  },
681
- "borderColor": "D6DAE0",
916
+ "borderColor": "EFEAE4",
682
917
  "borderSize": 1,
683
918
  "hideBorders": {
684
919
  "insideVertical": true
@@ -887,7 +1122,7 @@
887
1122
  "size": 10
888
1123
  }
889
1124
  },
890
- "borderColor": "D6DAE0",
1125
+ "borderColor": "EFEAE4",
891
1126
  "borderSize": 1,
892
1127
  "hideBorders": {
893
1128
  "insideVertical": true
@@ -1047,7 +1282,7 @@
1047
1282
  "size": 9
1048
1283
  }
1049
1284
  },
1050
- "borderColor": "D6DAE0",
1285
+ "borderColor": "EFEAE4",
1051
1286
  "borderSize": 1,
1052
1287
  "hideBorders": {
1053
1288
  "insideVertical": true
@@ -1145,7 +1380,7 @@
1145
1380
  "size": 9
1146
1381
  }
1147
1382
  },
1148
- "borderColor": "D6DAE0",
1383
+ "borderColor": "EFEAE4",
1149
1384
  "borderSize": 1,
1150
1385
  "hideBorders": {
1151
1386
  "insideVertical": true
@@ -1277,7 +1512,7 @@
1277
1512
  "size": 10
1278
1513
  }
1279
1514
  },
1280
- "borderColor": "D6DAE0",
1515
+ "borderColor": "EFEAE4",
1281
1516
  "borderSize": 1,
1282
1517
  "hideBorders": {
1283
1518
  "insideVertical": true