@openpresentation/opf 0.11.1 → 0.11.2
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/dist/{chunk-6UPHKXI5.js → chunk-BVLWFMDX.js} +40 -4
- package/dist/{chunk-M4GTWRK7.js → chunk-DJRZMGKY.js} +1 -1
- package/dist/{chunk-BP6WMSSS.js → chunk-K7IWYODS.js} +1 -1
- package/dist/{chunk-NPYN4TZ5.js → chunk-KZ6BT5UG.js} +108 -33
- package/dist/{chunk-KWIOQ3QR.js → chunk-SMYEM3HV.js} +2 -2
- package/dist/composition.js +1 -1
- package/dist/docs.js +7 -7
- package/dist/font-policy.d.ts +4 -0
- package/dist/font-policy.js +1 -1
- package/dist/index.js +7 -7
- package/dist/lint.js +3 -3
- package/dist/pagination.js +3 -3
- package/dist/spec/reference/font-policy.json +108 -33
- package/dist/spec/reference/font-policy.schema.json +10 -0
- package/dist/validator.js +2 -2
- package/package.json +1 -1
|
@@ -319,6 +319,21 @@ function placeTextLines(lines, box, alignment = "left", rasterPadding = 0) {
|
|
|
319
319
|
}
|
|
320
320
|
return { alignment, rasterPadding, lines: placed, height, overflow };
|
|
321
321
|
}
|
|
322
|
+
function translateTextFit(fit, dy) {
|
|
323
|
+
if (!dy || !fit.placement) return fit;
|
|
324
|
+
return {
|
|
325
|
+
...fit,
|
|
326
|
+
placement: {
|
|
327
|
+
...fit.placement,
|
|
328
|
+
lines: fit.placement.lines.map((line) => ({
|
|
329
|
+
...line,
|
|
330
|
+
y: line.y + dy,
|
|
331
|
+
baseline: line.baseline + dy,
|
|
332
|
+
outline: line.outline ? { ...line.outline, y: line.outline.y + dy } : line.outline
|
|
333
|
+
}))
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
322
337
|
var OPFCompositionError = class extends Error {
|
|
323
338
|
constructor(diagnostics, explanation) {
|
|
324
339
|
super("Slide content does not fit its composition.");
|
|
@@ -332,6 +347,7 @@ var OPFCompositionError = class extends Error {
|
|
|
332
347
|
};
|
|
333
348
|
var fields = ["text", "items", "bullets", "image", "video", "chart", "table", "code", "metric", "quote", "timeline"];
|
|
334
349
|
var headings = /* @__PURE__ */ new Set(["title", "subtitle", "tag"]);
|
|
350
|
+
var COVER_LAYOUT_IDS = /* @__PURE__ */ new Set(["title", "title-subtitle"]);
|
|
335
351
|
var rows = ["top", "middle", "bottom"];
|
|
336
352
|
var columns = ["left", "center", "right"];
|
|
337
353
|
var record2 = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
@@ -1520,7 +1536,16 @@ function composeSlide(input, options = {}) {
|
|
|
1520
1536
|
const furniture = measuredFurniture.configured || measuredFurniture.diagnostics.length ? measuredFurniture : void 0;
|
|
1521
1537
|
if (furniture) diagnostics.push(...furniture.diagnostics);
|
|
1522
1538
|
const bodyBottom = Math.min(area.bottom - padding, furniture && furniture.footerTop < height ? furniture.footerTop - gap * 0.5 : height - padding);
|
|
1523
|
-
|
|
1539
|
+
const headingTop = Math.max(area.top + padding, furniture?.headerBottom ? furniture.headerBottom + gap * 0.5 : padding);
|
|
1540
|
+
const layoutPlaceholders = Array.isArray(layout.placeholders) ? layout.placeholders : [];
|
|
1541
|
+
const headingOnlyLayout = COVER_LAYOUT_IDS.has(String(layout.id ?? "")) || layoutPlaceholders.length > 0 && layoutPlaceholders.every((placeholder) => headings.has(placeholder.type ?? ""));
|
|
1542
|
+
const regions = Object.keys(slide).filter((key) => regionParts(key)).sort();
|
|
1543
|
+
const emptyPayload = (value) => value === void 0 || value === null || value === "" || Array.isArray(value) && value.length === 0;
|
|
1544
|
+
const emptyHost = (host) => emptyPayload(host.blocks) && fields.every((field) => emptyPayload(host[field]));
|
|
1545
|
+
const hasBodyPayload = regions.some((key) => !emptyHost(record2(slide[key]))) || !emptyPayload(slide.blocks) || fields.some((field) => !emptyPayload(slide[field]));
|
|
1546
|
+
const isCover = !hasBodyPayload && (headingOnlyLayout || !layout.id && !layoutPlaceholders.some((placeholder) => !headings.has(placeholder.type ?? "")));
|
|
1547
|
+
let y = headingTop;
|
|
1548
|
+
const headingItems = [];
|
|
1524
1549
|
for (const field of ["tag", "title", "subtitle"]) {
|
|
1525
1550
|
if (!slide[field]) continue;
|
|
1526
1551
|
const requested = (field === "title" ? 54 : field === "tag" ? 16 : 25) * scale;
|
|
@@ -1529,10 +1554,22 @@ function composeSlide(input, options = {}) {
|
|
|
1529
1554
|
const text = fitPlacedText(field, slide[field], String(slide[field]), box, requested, minSize, `${path}.${field}`);
|
|
1530
1555
|
box.height = Math.min(maxHeight, Math.max(text.lines.length * text.lineHeight, text.placement?.height ?? 0));
|
|
1531
1556
|
if (furniture && box.y + box.height > bodyBottom + 0.01) diagnostics.push({ code: "text-overflow", path: `${path}.${field}`, message: "Repeated furniture leaves too little room for this heading. Change the header/footer or slide design." });
|
|
1532
|
-
|
|
1557
|
+
const item = { path: `${path}.${field}`, field, type: "text", value: slide[field], payload: { text: slide[field] }, box, text, textStyle: styleFor(field, `${path}.${field}`), composition, alignment: alignmentFor(field) };
|
|
1558
|
+
headingItems.push(item);
|
|
1559
|
+
items.push(item);
|
|
1533
1560
|
y += box.height + gap * 0.5;
|
|
1534
1561
|
}
|
|
1535
|
-
if (
|
|
1562
|
+
if (headingItems.length) {
|
|
1563
|
+
if (isCover) {
|
|
1564
|
+
const last = headingItems[headingItems.length - 1];
|
|
1565
|
+
const shift = Math.max(0, (bodyBottom - (last.box.y + last.box.height)) / 2);
|
|
1566
|
+
if (shift) for (const item of headingItems) {
|
|
1567
|
+
item.box.y += shift;
|
|
1568
|
+
if (item.text) item.text = translateTextFit(item.text, shift);
|
|
1569
|
+
}
|
|
1570
|
+
y = last.box.y + last.box.height + gap;
|
|
1571
|
+
} else y += gap * 0.5;
|
|
1572
|
+
}
|
|
1536
1573
|
const contentBox = { x: area.left + padding, y, width: area.right - area.left - padding * 2, height: Math.max(scale, bodyBottom - y) };
|
|
1537
1574
|
const collect = (host, basePath, depth = 0, ancestors = []) => {
|
|
1538
1575
|
if (Array.isArray(host.blocks)) {
|
|
@@ -1551,7 +1588,6 @@ function composeSlide(input, options = {}) {
|
|
|
1551
1588
|
}
|
|
1552
1589
|
return fields.filter((field) => host[field] !== void 0).map((field) => ({ field, type: host.type ?? kind(field), value: host[field], path: `${basePath}.${field}`, payload: { type: host.type ?? kind(field), [field]: host[field] } }));
|
|
1553
1590
|
};
|
|
1554
|
-
const regions = Object.keys(slide).filter((key) => regionParts(key)).sort();
|
|
1555
1591
|
const pending = regions.length ? regions.flatMap((key) => collect(record2(slide[key]), `${path}.${key}`).map((item) => ({ ...item, region: regionParts(key) }))) : Array.isArray(slide.blocks) ? slide.blocks.flatMap((block, index) => collect(record2(block), `${path}.blocks.${index}`)) : collect(slideImage?.replacesContent ? { ...slide, image: void 0 } : slide, path);
|
|
1556
1592
|
const groups = [], flows = [];
|
|
1557
1593
|
const decisions = options.explain ? [] : void 0;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MAX_COMPOSITION_DEPTH, tableGrid } from './chunk-
|
|
1
|
+
import { MAX_COMPOSITION_DEPTH, tableGrid } from './chunk-BVLWFMDX.js';
|
|
2
2
|
import { schemas, schemaEntries } from './chunk-LTSDDBNW.js';
|
|
3
3
|
import { catalogSchemaNames } from './chunk-7LF37SG3.js';
|
|
4
4
|
import Ajv2020 from 'ajv/dist/2020.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { validatePresentation, validationDefinition, validateCatalogRecord } from './chunk-
|
|
1
|
+
import { validatePresentation, validationDefinition, validateCatalogRecord } from './chunk-DJRZMGKY.js';
|
|
2
2
|
import { schemas, schemaEntries } from './chunk-LTSDDBNW.js';
|
|
3
3
|
import { catalogKinds, catalogEntries, catalogSchemaNames } from './chunk-7LF37SG3.js';
|
|
4
4
|
import { parseTree, printParseErrorCode, getNodePath } from 'jsonc-parser';
|
|
@@ -6,9 +6,9 @@ var fontPolicySource = {
|
|
|
6
6
|
"note": "Owner decisions resolved provisionally with the recommended defaults. Changing a decision here is the whole edit: every row whose replacement names this decision takes its family and compatibility from it. A recorded measurement for a different family is ignored (treated as unmeasured) until scripts/measure-font-replacements.mjs is re-run.",
|
|
7
7
|
"decisions": {
|
|
8
8
|
"aptos-preview": {
|
|
9
|
-
"replacement": "
|
|
10
|
-
"compatibility": "
|
|
11
|
-
"note": "
|
|
9
|
+
"replacement": "Intos",
|
|
10
|
+
"compatibility": "metric",
|
|
11
|
+
"note": "Owner policy 2026-09-29: a licensed font the user selects previews with an open replacement that looks similar and has the same size on screen; the PPTX keeps the selected name. Aptos previews with Intos (metric, OFL-1.1, vendored in opf-render); Roboto and Carlito are alternates for registries built without the Intos faces (they are in the opf-render office pack)."
|
|
12
12
|
},
|
|
13
13
|
"segoe-ui-preview": {
|
|
14
14
|
"replacement": "Red Hat Display",
|
|
@@ -26,7 +26,7 @@ var fontPolicySource = {
|
|
|
26
26
|
"description": "OPF font policy (font-fidelity-everywhere FF-31). One row per font family that OPF catalogs, defaults or renderer rules name. Renderers preview a proprietary family with its openly licensed replacement for measurement and drawing only. Exporters always write the chosen family, never write a replacement, and never embed a proprietary family. Open families may be bundled for rendering and reach a PPTX only through an explicit embed path. See docs/font-fidelity.md.",
|
|
27
27
|
"version": 1,
|
|
28
28
|
"measurement": {
|
|
29
|
-
"tool": "fontkit 2.0.4 shaping with default features (kerning, ligatures), as opf-render measures text",
|
|
29
|
+
"tool": "fontkit 2.0.4 shaping with default features (kerning, ligatures), as opf-render measures text; a replacement that lists disabledFeatures (Georgia -> Gelasio) is shaped with those features off",
|
|
30
30
|
"corpus": "300 Latin title/body strings sampled from the 126 bundled example decks",
|
|
31
31
|
"evidence": "docs/evidence/font-replacements-20260923/README.md",
|
|
32
32
|
"definition": "For each style both fonts have (regular, bold, italic, bold italic, or the weight the family name encodes), the shaped advance width of every corpus string in the replacement is divided by the width in the real font. meanAbsWidthDelta averages |ratio - 1| over strings and styles; meanWidthDelta averages the signed value; maxAbsWidthDelta is the largest single-string |ratio - 1|. Reference fonts were read in place from a licensed Windows 11 + Microsoft 365 host and never copied."
|
|
@@ -107,16 +107,18 @@ var fontPolicySource = {
|
|
|
107
107
|
"embeddableByOpf": false,
|
|
108
108
|
"replacement": {
|
|
109
109
|
"decision": "aptos-preview",
|
|
110
|
+
"source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
110
111
|
"measured": {
|
|
111
|
-
"replacement": "
|
|
112
|
-
"meanAbsWidthDelta": 0
|
|
113
|
-
"meanWidthDelta":
|
|
114
|
-
"maxAbsWidthDelta": 0
|
|
112
|
+
"replacement": "Intos",
|
|
113
|
+
"meanAbsWidthDelta": 0,
|
|
114
|
+
"meanWidthDelta": 0,
|
|
115
|
+
"maxAbsWidthDelta": 0,
|
|
115
116
|
"styles": 4,
|
|
116
117
|
"reference": "Aptos 2.01;O365"
|
|
117
118
|
}
|
|
118
119
|
},
|
|
119
120
|
"alternates": [
|
|
121
|
+
"Roboto",
|
|
120
122
|
"Carlito"
|
|
121
123
|
],
|
|
122
124
|
"sources": [
|
|
@@ -127,7 +129,7 @@ var fontPolicySource = {
|
|
|
127
129
|
"https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/",
|
|
128
130
|
"https://www.microsoft.com/en-us/download/details.aspx?id=106087"
|
|
129
131
|
],
|
|
130
|
-
"note": "Microsoft 365 cloud font; not redistributable.
|
|
132
|
+
"note": "Microsoft 365 cloud font; not redistributable. Intos is metric-compatible (OFL, Inter-derived outlines with Aptos advances, kerning and vertical metrics) and previews it in the default opf-render office pack; Roboto and Carlito are the visual fallbacks for registries built without the Intos faces. Not in the Windows 10/11 font lists; delivered as a Microsoft 365 cloud font. Microsoft also offers a standalone download (Download Center id=106087) under Microsoft terms, not an open license."
|
|
131
133
|
},
|
|
132
134
|
{
|
|
133
135
|
"family": "Aptos Display",
|
|
@@ -138,18 +140,20 @@ var fontPolicySource = {
|
|
|
138
140
|
],
|
|
139
141
|
"embeddableByOpf": false,
|
|
140
142
|
"replacement": {
|
|
141
|
-
"family": "
|
|
142
|
-
"compatibility": "
|
|
143
|
+
"family": "Intos Display",
|
|
144
|
+
"compatibility": "metric",
|
|
145
|
+
"source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
143
146
|
"measured": {
|
|
144
|
-
"replacement": "
|
|
145
|
-
"meanAbsWidthDelta": 0
|
|
146
|
-
"meanWidthDelta":
|
|
147
|
-
"maxAbsWidthDelta": 0
|
|
147
|
+
"replacement": "Intos Display",
|
|
148
|
+
"meanAbsWidthDelta": 0,
|
|
149
|
+
"meanWidthDelta": 0,
|
|
150
|
+
"maxAbsWidthDelta": 0,
|
|
148
151
|
"styles": 4,
|
|
149
152
|
"reference": "Aptos Display 2.01;O365"
|
|
150
153
|
}
|
|
151
154
|
},
|
|
152
155
|
"alternates": [
|
|
156
|
+
"Carlito",
|
|
153
157
|
"Roboto"
|
|
154
158
|
],
|
|
155
159
|
"sources": [
|
|
@@ -159,7 +163,7 @@ var fontPolicySource = {
|
|
|
159
163
|
"https://support.apple.com/en-us/122869",
|
|
160
164
|
"https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/"
|
|
161
165
|
],
|
|
162
|
-
"note": "Part of the Aptos family; cloud font list has Aptos Display (+Bold/Italic/Bold Italic)."
|
|
166
|
+
"note": "Part of the Aptos family; cloud font list has Aptos Display (+Bold/Italic/Bold Italic). Intos Display is its metric-compatible preview replacement."
|
|
163
167
|
},
|
|
164
168
|
{
|
|
165
169
|
"family": "Aptos Mono",
|
|
@@ -195,13 +199,14 @@ var fontPolicySource = {
|
|
|
195
199
|
],
|
|
196
200
|
"embeddableByOpf": false,
|
|
197
201
|
"replacement": {
|
|
198
|
-
"family": "
|
|
199
|
-
"compatibility": "
|
|
202
|
+
"family": "Intos Narrow",
|
|
203
|
+
"compatibility": "metric",
|
|
204
|
+
"source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
200
205
|
"measured": {
|
|
201
|
-
"replacement": "
|
|
202
|
-
"meanAbsWidthDelta": 0
|
|
203
|
-
"meanWidthDelta": 0
|
|
204
|
-
"maxAbsWidthDelta": 0
|
|
206
|
+
"replacement": "Intos Narrow",
|
|
207
|
+
"meanAbsWidthDelta": 0,
|
|
208
|
+
"meanWidthDelta": 0,
|
|
209
|
+
"maxAbsWidthDelta": 0,
|
|
205
210
|
"styles": 4,
|
|
206
211
|
"reference": "Aptos Narrow 2.01;O365"
|
|
207
212
|
}
|
|
@@ -213,7 +218,10 @@ var fontPolicySource = {
|
|
|
213
218
|
"https://support.apple.com/en-us/122869",
|
|
214
219
|
"https://microsoft.design/articles/a-change-of-typeface-microsoft-s-new-default-font-has-arrived/"
|
|
215
220
|
],
|
|
216
|
-
"note": "Part of the Aptos family; cloud font list has Aptos Narrow (+Bold/Italic/Bold Italic)."
|
|
221
|
+
"note": "Part of the Aptos family; cloud font list has Aptos Narrow (+Bold/Italic/Bold Italic). Intos Narrow is its metric-compatible preview replacement.",
|
|
222
|
+
"alternates": [
|
|
223
|
+
"Carlito"
|
|
224
|
+
]
|
|
217
225
|
},
|
|
218
226
|
{
|
|
219
227
|
"family": "Aptos Serif",
|
|
@@ -224,9 +232,17 @@ var fontPolicySource = {
|
|
|
224
232
|
],
|
|
225
233
|
"embeddableByOpf": false,
|
|
226
234
|
"replacement": {
|
|
227
|
-
"family": "
|
|
228
|
-
"compatibility": "
|
|
229
|
-
"
|
|
235
|
+
"family": "Intos Serif",
|
|
236
|
+
"compatibility": "metric",
|
|
237
|
+
"source": "https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
238
|
+
"measured": {
|
|
239
|
+
"replacement": "Intos Serif",
|
|
240
|
+
"meanAbsWidthDelta": 0,
|
|
241
|
+
"meanWidthDelta": 0,
|
|
242
|
+
"maxAbsWidthDelta": 0,
|
|
243
|
+
"styles": 4,
|
|
244
|
+
"reference": "Aptos Serif 2.01;240513210638;O365"
|
|
245
|
+
}
|
|
230
246
|
},
|
|
231
247
|
"sources": [
|
|
232
248
|
"https://learn.microsoft.com/en-us/typography/fonts/windows_11_font_list",
|
|
@@ -234,7 +250,10 @@ var fontPolicySource = {
|
|
|
234
250
|
"https://learn.microsoft.com/en-us/typography/font-list/aptos",
|
|
235
251
|
"https://support.apple.com/en-us/122869"
|
|
236
252
|
],
|
|
237
|
-
"note": "
|
|
253
|
+
"note": "Part of the Aptos family; cloud list has Aptos Serif, Bold, Italic and Bold Italic. Intos Serif (Gelasio-derived outlines, Aptos Serif metrics) is its metric-compatible preview replacement. Not installed on the measuring host: measured from the files in Microsoft's Aptos Fonts download (Download Center id=106087).",
|
|
254
|
+
"alternates": [
|
|
255
|
+
"Tinos"
|
|
256
|
+
]
|
|
238
257
|
},
|
|
239
258
|
{
|
|
240
259
|
"family": "Arabic Typesetting",
|
|
@@ -1302,12 +1321,16 @@ var fontPolicySource = {
|
|
|
1302
1321
|
"embeddableByOpf": false,
|
|
1303
1322
|
"replacement": {
|
|
1304
1323
|
"family": "Gelasio",
|
|
1305
|
-
"compatibility": "
|
|
1324
|
+
"compatibility": "metric",
|
|
1325
|
+
"disabledFeatures": [
|
|
1326
|
+
"liga",
|
|
1327
|
+
"clig"
|
|
1328
|
+
],
|
|
1306
1329
|
"measured": {
|
|
1307
1330
|
"replacement": "Gelasio",
|
|
1308
|
-
"meanAbsWidthDelta":
|
|
1309
|
-
"meanWidthDelta":
|
|
1310
|
-
"maxAbsWidthDelta": 0
|
|
1331
|
+
"meanAbsWidthDelta": 0,
|
|
1332
|
+
"meanWidthDelta": 0,
|
|
1333
|
+
"maxAbsWidthDelta": 0,
|
|
1311
1334
|
"styles": 4,
|
|
1312
1335
|
"reference": "Georgia 5.59"
|
|
1313
1336
|
},
|
|
@@ -1320,7 +1343,7 @@ var fontPolicySource = {
|
|
|
1320
1343
|
"https://learn.microsoft.com/en-us/typography/font-list/georgia",
|
|
1321
1344
|
"https://support.apple.com/en-us/122869"
|
|
1322
1345
|
],
|
|
1323
|
-
"note": "Gelasio is designed to Georgia metrics and every basic-Latin advance matches Georgia 5.59
|
|
1346
|
+
"note": "Gelasio is designed to Georgia metrics and every basic-Latin advance matches Georgia 5.59. With default features Gelasio applies fi/fl/ffi/ffl ligatures that Georgia does not, which changes runs by up to 1.02%. Renderers therefore turn liga and clig off in Gelasio (disabledFeatures); the measurement below shapes Gelasio that way. Georgia has no liga or clig feature, so its default shaping is unchanged. The metric claim holds only with those features off."
|
|
1324
1347
|
},
|
|
1325
1348
|
{
|
|
1326
1349
|
"family": "Gill Sans MT",
|
|
@@ -1503,6 +1526,58 @@ var fontPolicySource = {
|
|
|
1503
1526
|
"https://support.apple.com/en-us/122869"
|
|
1504
1527
|
]
|
|
1505
1528
|
},
|
|
1529
|
+
{
|
|
1530
|
+
"family": "Intos",
|
|
1531
|
+
"licenseClass": "open",
|
|
1532
|
+
"license": "OFL-1.1",
|
|
1533
|
+
"availability": [],
|
|
1534
|
+
"embeddableByOpf": true,
|
|
1535
|
+
"replacement": null,
|
|
1536
|
+
"sources": [
|
|
1537
|
+
"https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
1538
|
+
"https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
|
|
1539
|
+
],
|
|
1540
|
+
"note": "Metric-compatible with Aptos (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
|
|
1541
|
+
},
|
|
1542
|
+
{
|
|
1543
|
+
"family": "Intos Display",
|
|
1544
|
+
"licenseClass": "open",
|
|
1545
|
+
"license": "OFL-1.1",
|
|
1546
|
+
"availability": [],
|
|
1547
|
+
"embeddableByOpf": true,
|
|
1548
|
+
"replacement": null,
|
|
1549
|
+
"sources": [
|
|
1550
|
+
"https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
1551
|
+
"https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
|
|
1552
|
+
],
|
|
1553
|
+
"note": "Metric-compatible with Aptos Display (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
|
|
1554
|
+
},
|
|
1555
|
+
{
|
|
1556
|
+
"family": "Intos Narrow",
|
|
1557
|
+
"licenseClass": "open",
|
|
1558
|
+
"license": "OFL-1.1",
|
|
1559
|
+
"availability": [],
|
|
1560
|
+
"embeddableByOpf": true,
|
|
1561
|
+
"replacement": null,
|
|
1562
|
+
"sources": [
|
|
1563
|
+
"https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
1564
|
+
"https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
|
|
1565
|
+
],
|
|
1566
|
+
"note": "Metric-compatible with Aptos Narrow (Aptos advance widths, kerning and vertical metrics on Inter-derived outlines). Vendored in opf-render at the pinned commit; single-maintainer project created September 2026, so Roboto and Carlito stay as fallbacks."
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
"family": "Intos Serif",
|
|
1570
|
+
"licenseClass": "open",
|
|
1571
|
+
"license": "OFL-1.1",
|
|
1572
|
+
"availability": [],
|
|
1573
|
+
"embeddableByOpf": true,
|
|
1574
|
+
"replacement": null,
|
|
1575
|
+
"sources": [
|
|
1576
|
+
"https://github.com/muglug/intos/tree/fef9315c14da9e4b23b4c3cac8e718998d4e4736",
|
|
1577
|
+
"https://github.com/muglug/intos/blob/fef9315c14da9e4b23b4c3cac8e718998d4e4736/LICENSE.txt"
|
|
1578
|
+
],
|
|
1579
|
+
"note": "Metric-compatible with Aptos Serif (Aptos Serif advance widths, kerning and vertical metrics on Gelasio-derived outlines). Vendored in opf-render at the pinned commit; Tinos stays as the visual fallback."
|
|
1580
|
+
},
|
|
1506
1581
|
{
|
|
1507
1582
|
"family": "Kalinga",
|
|
1508
1583
|
"licenseClass": "proprietary-standard",
|
|
@@ -2722,7 +2797,7 @@ var fontPolicySource = {
|
|
|
2722
2797
|
"https://learn.microsoft.com/en-us/typography/font-list/segoe-ui",
|
|
2723
2798
|
"https://support.apple.com/en-us/122869"
|
|
2724
2799
|
],
|
|
2725
|
-
"note": "Microsoft's OFL Selawik
|
|
2800
|
+
"note": "Microsoft's OFL Selawik 1.01 was measured and rejected as a metric replacement: 0.16% mean and 2.5% maximum in regular, no italic faces (2.65% mean), and Semibold is 1.75% off. Red Hat Display remains the closest shipped face with all four styles; see docs/programs/font-fidelity-everywhere/font-licensing.md."
|
|
2726
2801
|
},
|
|
2727
2802
|
{
|
|
2728
2803
|
"family": "Segoe UI Emoji",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { assertValidPresentation, visitContentPayloads } from './chunk-
|
|
2
|
-
import { DEFAULT_FONT_SCHEME, resolveFontSchemeReference, resolveFontFamilies, resolveCanvasDimensions, composeSlide, tableRowBoundaries } from './chunk-
|
|
1
|
+
import { assertValidPresentation, visitContentPayloads } from './chunk-DJRZMGKY.js';
|
|
2
|
+
import { DEFAULT_FONT_SCHEME, resolveFontSchemeReference, resolveFontFamilies, resolveCanvasDimensions, composeSlide, tableRowBoundaries } from './chunk-BVLWFMDX.js';
|
|
3
3
|
import { catalogs } from './chunk-7LF37SG3.js';
|
|
4
4
|
|
|
5
5
|
// src/pagination.ts
|
package/dist/composition.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { DEFAULT_FONT_SCHEME, DEFAULT_FURNITURE_DATE_FORMAT, DEFAULT_SLIDE_NUMBER_FORMAT, MAX_COMPOSITION_DEPTH, OPFCompositionError, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, formatFurnitureDate, formatSlideNumber, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTable, layoutTimeline, measureText, measureTextOutline, placeTextLines, resolveCanvasDimensions, resolveFontFamilies, resolveFontSchemeReference, resolveSocialProfile, resolveTextStyle, slideImageShape, tableGrid, tableRowBoundaries, textColorForFill, textWidthMeasurer, wrapText } from './chunk-
|
|
1
|
+
export { DEFAULT_FONT_SCHEME, DEFAULT_FURNITURE_DATE_FORMAT, DEFAULT_SLIDE_NUMBER_FORMAT, MAX_COMPOSITION_DEPTH, OPFCompositionError, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, formatFurnitureDate, formatSlideNumber, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTable, layoutTimeline, measureText, measureTextOutline, placeTextLines, resolveCanvasDimensions, resolveFontFamilies, resolveFontSchemeReference, resolveSocialProfile, resolveTextStyle, slideImageShape, tableGrid, tableRowBoundaries, textColorForFill, textWidthMeasurer, wrapText } from './chunk-BVLWFMDX.js';
|