@liiift-studio/sanity-font-manager 2.3.16 → 2.3.18
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/index.js +25 -9
- package/dist/index.mjs +25 -9
- package/package.json +1 -1
- package/src/schema/stylesField.js +21 -3
- package/src/utils/generateCssFile.js +14 -6
package/dist/index.js
CHANGED
|
@@ -644,21 +644,25 @@ var FAMILY_CLASS_MAP = {
|
|
|
644
644
|
7: "serif",
|
|
645
645
|
8: "sans-serif"
|
|
646
646
|
};
|
|
647
|
-
|
|
648
|
-
|
|
647
|
+
var SERIF_NAMES = /jubilat|corundum|dapifer|birra|daith/i;
|
|
648
|
+
var SANS_NAMES = /halyard|gamay|omnes|kit/i;
|
|
649
|
+
function detectFontCategory(font, fontName) {
|
|
650
|
+
var _a;
|
|
651
|
+
if (fontName && SERIF_NAMES.test(fontName)) return "serif";
|
|
652
|
+
if (fontName && SANS_NAMES.test(fontName)) return "sans-serif";
|
|
649
653
|
try {
|
|
650
|
-
const familyClass = ((
|
|
654
|
+
const familyClass = ((_a = font["OS/2"]) == null ? void 0 : _a.sFamilyClass) ?? 0;
|
|
651
655
|
const highByte = familyClass >> 8 & 255;
|
|
652
656
|
return FAMILY_CLASS_MAP[highByte] ?? "default";
|
|
653
657
|
} catch {
|
|
654
658
|
return "default";
|
|
655
659
|
}
|
|
656
660
|
}
|
|
657
|
-
function calcFallbackData(arrayBuffer) {
|
|
661
|
+
function calcFallbackData(arrayBuffer, fontName) {
|
|
658
662
|
try {
|
|
659
663
|
let font = fontkit2.create(import_buffer.Buffer.from(arrayBuffer));
|
|
660
664
|
let upm = font.unitsPerEm;
|
|
661
|
-
let category = detectFontCategory(font);
|
|
665
|
+
let category = detectFontCategory(font, fontName);
|
|
662
666
|
return {
|
|
663
667
|
fallbackSrc: FALLBACK_STACKS[category],
|
|
664
668
|
ascentOverride: `${(font.ascent / upm * 100).toFixed(2)}%`,
|
|
@@ -690,7 +694,7 @@ async function generateCssFile({
|
|
|
690
694
|
let arrayBuffer = await woff2File.arrayBuffer();
|
|
691
695
|
let b64 = _arrayBufferToBase64(arrayBuffer);
|
|
692
696
|
let fontkitFont = fontkit2.create(import_buffer.Buffer.from(arrayBuffer));
|
|
693
|
-
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer);
|
|
697
|
+
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer, fontName);
|
|
694
698
|
let cssString;
|
|
695
699
|
if (variableFont) {
|
|
696
700
|
let { descriptors, skipped } = buildVFDescriptors(fontkitFont);
|
|
@@ -6806,7 +6810,19 @@ var stylisticSetField = {
|
|
|
6806
6810
|
};
|
|
6807
6811
|
|
|
6808
6812
|
// src/schema/stylesField.js
|
|
6813
|
+
var import_react21 = __toESM(require("react"));
|
|
6809
6814
|
var import_sanity_advanced_reference_array = require("@liiift-studio/sanity-advanced-reference-array");
|
|
6815
|
+
var typefaceParams = (doc) => ({ typefaceName: (doc == null ? void 0 : doc.title) || "" });
|
|
6816
|
+
var FontsRefArray = (props) => import_react21.default.createElement(import_sanity_advanced_reference_array.AdvancedRefArray, {
|
|
6817
|
+
...props,
|
|
6818
|
+
filterGroq: "lower(typefaceName) == lower($typefaceName)",
|
|
6819
|
+
filterParams: typefaceParams
|
|
6820
|
+
});
|
|
6821
|
+
var VariableFontsRefArray = (props) => import_react21.default.createElement(import_sanity_advanced_reference_array.AdvancedRefArray, {
|
|
6822
|
+
...props,
|
|
6823
|
+
filterGroq: "lower(typefaceName) == lower($typefaceName) && variableFont == true",
|
|
6824
|
+
filterParams: typefaceParams
|
|
6825
|
+
});
|
|
6810
6826
|
var field = (condition, def) => condition ? [def] : [];
|
|
6811
6827
|
var fontsFilter = async ({ getClient, document, parent }) => {
|
|
6812
6828
|
const client = getClient({ apiVersion: "2022-11-09" });
|
|
@@ -6881,7 +6897,7 @@ function createStylesField({
|
|
|
6881
6897
|
title: "Fonts",
|
|
6882
6898
|
name: "fonts",
|
|
6883
6899
|
type: "array",
|
|
6884
|
-
components: { input:
|
|
6900
|
+
components: { input: FontsRefArray },
|
|
6885
6901
|
of: [{ type: "reference", weak: true, to: [{ type: "font" }] }],
|
|
6886
6902
|
options: {
|
|
6887
6903
|
sortable: true,
|
|
@@ -6958,7 +6974,7 @@ function createStylesField({
|
|
|
6958
6974
|
title: "Fonts",
|
|
6959
6975
|
name: "fonts",
|
|
6960
6976
|
type: "array",
|
|
6961
|
-
components: { input:
|
|
6977
|
+
components: { input: FontsRefArray },
|
|
6962
6978
|
of: [{
|
|
6963
6979
|
type: "reference",
|
|
6964
6980
|
weak: true,
|
|
@@ -6971,7 +6987,7 @@ function createStylesField({
|
|
|
6971
6987
|
title: "Variable Fonts",
|
|
6972
6988
|
name: "variableFont",
|
|
6973
6989
|
type: "array",
|
|
6974
|
-
components: { input:
|
|
6990
|
+
components: { input: VariableFontsRefArray },
|
|
6975
6991
|
of: [{
|
|
6976
6992
|
type: "reference",
|
|
6977
6993
|
weak: true,
|
package/dist/index.mjs
CHANGED
|
@@ -554,21 +554,25 @@ var FAMILY_CLASS_MAP = {
|
|
|
554
554
|
7: "serif",
|
|
555
555
|
8: "sans-serif"
|
|
556
556
|
};
|
|
557
|
-
|
|
558
|
-
|
|
557
|
+
var SERIF_NAMES = /jubilat|corundum|dapifer|birra|daith/i;
|
|
558
|
+
var SANS_NAMES = /halyard|gamay|omnes|kit/i;
|
|
559
|
+
function detectFontCategory(font, fontName) {
|
|
560
|
+
var _a;
|
|
561
|
+
if (fontName && SERIF_NAMES.test(fontName)) return "serif";
|
|
562
|
+
if (fontName && SANS_NAMES.test(fontName)) return "sans-serif";
|
|
559
563
|
try {
|
|
560
|
-
const familyClass = ((
|
|
564
|
+
const familyClass = ((_a = font["OS/2"]) == null ? void 0 : _a.sFamilyClass) ?? 0;
|
|
561
565
|
const highByte = familyClass >> 8 & 255;
|
|
562
566
|
return FAMILY_CLASS_MAP[highByte] ?? "default";
|
|
563
567
|
} catch {
|
|
564
568
|
return "default";
|
|
565
569
|
}
|
|
566
570
|
}
|
|
567
|
-
function calcFallbackData(arrayBuffer) {
|
|
571
|
+
function calcFallbackData(arrayBuffer, fontName) {
|
|
568
572
|
try {
|
|
569
573
|
let font = fontkit2.create(Buffer.from(arrayBuffer));
|
|
570
574
|
let upm = font.unitsPerEm;
|
|
571
|
-
let category = detectFontCategory(font);
|
|
575
|
+
let category = detectFontCategory(font, fontName);
|
|
572
576
|
return {
|
|
573
577
|
fallbackSrc: FALLBACK_STACKS[category],
|
|
574
578
|
ascentOverride: `${(font.ascent / upm * 100).toFixed(2)}%`,
|
|
@@ -600,7 +604,7 @@ async function generateCssFile({
|
|
|
600
604
|
let arrayBuffer = await woff2File.arrayBuffer();
|
|
601
605
|
let b64 = _arrayBufferToBase64(arrayBuffer);
|
|
602
606
|
let fontkitFont = fontkit2.create(Buffer.from(arrayBuffer));
|
|
603
|
-
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer);
|
|
607
|
+
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer, fontName);
|
|
604
608
|
let cssString;
|
|
605
609
|
if (variableFont) {
|
|
606
610
|
let { descriptors, skipped } = buildVFDescriptors(fontkitFont);
|
|
@@ -6716,7 +6720,19 @@ var stylisticSetField = {
|
|
|
6716
6720
|
};
|
|
6717
6721
|
|
|
6718
6722
|
// src/schema/stylesField.js
|
|
6723
|
+
import React19 from "react";
|
|
6719
6724
|
import { AdvancedRefArray } from "@liiift-studio/sanity-advanced-reference-array";
|
|
6725
|
+
var typefaceParams = (doc) => ({ typefaceName: (doc == null ? void 0 : doc.title) || "" });
|
|
6726
|
+
var FontsRefArray = (props) => React19.createElement(AdvancedRefArray, {
|
|
6727
|
+
...props,
|
|
6728
|
+
filterGroq: "lower(typefaceName) == lower($typefaceName)",
|
|
6729
|
+
filterParams: typefaceParams
|
|
6730
|
+
});
|
|
6731
|
+
var VariableFontsRefArray = (props) => React19.createElement(AdvancedRefArray, {
|
|
6732
|
+
...props,
|
|
6733
|
+
filterGroq: "lower(typefaceName) == lower($typefaceName) && variableFont == true",
|
|
6734
|
+
filterParams: typefaceParams
|
|
6735
|
+
});
|
|
6720
6736
|
var field = (condition, def) => condition ? [def] : [];
|
|
6721
6737
|
var fontsFilter = async ({ getClient, document, parent }) => {
|
|
6722
6738
|
const client = getClient({ apiVersion: "2022-11-09" });
|
|
@@ -6791,7 +6807,7 @@ function createStylesField({
|
|
|
6791
6807
|
title: "Fonts",
|
|
6792
6808
|
name: "fonts",
|
|
6793
6809
|
type: "array",
|
|
6794
|
-
components: { input:
|
|
6810
|
+
components: { input: FontsRefArray },
|
|
6795
6811
|
of: [{ type: "reference", weak: true, to: [{ type: "font" }] }],
|
|
6796
6812
|
options: {
|
|
6797
6813
|
sortable: true,
|
|
@@ -6868,7 +6884,7 @@ function createStylesField({
|
|
|
6868
6884
|
title: "Fonts",
|
|
6869
6885
|
name: "fonts",
|
|
6870
6886
|
type: "array",
|
|
6871
|
-
components: { input:
|
|
6887
|
+
components: { input: FontsRefArray },
|
|
6872
6888
|
of: [{
|
|
6873
6889
|
type: "reference",
|
|
6874
6890
|
weak: true,
|
|
@@ -6881,7 +6897,7 @@ function createStylesField({
|
|
|
6881
6897
|
title: "Variable Fonts",
|
|
6882
6898
|
name: "variableFont",
|
|
6883
6899
|
type: "array",
|
|
6884
|
-
components: { input:
|
|
6900
|
+
components: { input: VariableFontsRefArray },
|
|
6885
6901
|
of: [{
|
|
6886
6902
|
type: "reference",
|
|
6887
6903
|
weak: true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liiift-studio/sanity-font-manager",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.18",
|
|
4
4
|
"description": "Sanity Studio plugin — full font management suite with batch upload, format conversion, metadata extraction, CSS generation, collection/pair generation, and script variant support. Supports Sanity v3, v4, and v5.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Liiift Studio",
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
// Sanity schema factory function for the Styles object field — call createStylesField(options) to generate the field definition for a typeface document
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import { AdvancedRefArray } from '@liiift-studio/sanity-advanced-reference-array';
|
|
3
4
|
import { RegenerateSubfamiliesComponent } from '../components/RegenerateSubfamiliesComponent.jsx';
|
|
4
5
|
|
|
6
|
+
// Returns extra GROQ params scoped to the current typeface document
|
|
7
|
+
const typefaceParams = (doc) => ({ typefaceName: doc?.title || '' });
|
|
8
|
+
|
|
9
|
+
// AdvancedRefArray wrapper — limits search results to fonts belonging to this typeface
|
|
10
|
+
const FontsRefArray = (props) => React.createElement(AdvancedRefArray, {
|
|
11
|
+
...props,
|
|
12
|
+
filterGroq: 'lower(typefaceName) == lower($typefaceName)',
|
|
13
|
+
filterParams: typefaceParams,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// AdvancedRefArray wrapper — limits search results to variable fonts belonging to this typeface
|
|
17
|
+
const VariableFontsRefArray = (props) => React.createElement(AdvancedRefArray, {
|
|
18
|
+
...props,
|
|
19
|
+
filterGroq: 'lower(typefaceName) == lower($typefaceName) && variableFont == true',
|
|
20
|
+
filterParams: typefaceParams,
|
|
21
|
+
});
|
|
22
|
+
|
|
5
23
|
// Conditionally includes a field definition in an array
|
|
6
24
|
const field = (condition, def) => condition ? [def] : [];
|
|
7
25
|
|
|
@@ -102,7 +120,7 @@ export function createStylesField({
|
|
|
102
120
|
title: 'Fonts',
|
|
103
121
|
name: 'fonts',
|
|
104
122
|
type: 'array',
|
|
105
|
-
components: { input:
|
|
123
|
+
components: { input: FontsRefArray },
|
|
106
124
|
of: [{ type: 'reference', weak: true, to: [{ type: 'font' }] }],
|
|
107
125
|
options: {
|
|
108
126
|
sortable: true,
|
|
@@ -181,7 +199,7 @@ export function createStylesField({
|
|
|
181
199
|
title: 'Fonts',
|
|
182
200
|
name: 'fonts',
|
|
183
201
|
type: 'array',
|
|
184
|
-
components: { input:
|
|
202
|
+
components: { input: FontsRefArray },
|
|
185
203
|
of: [{
|
|
186
204
|
type: 'reference',
|
|
187
205
|
weak: true,
|
|
@@ -194,7 +212,7 @@ export function createStylesField({
|
|
|
194
212
|
title: 'Variable Fonts',
|
|
195
213
|
name: 'variableFont',
|
|
196
214
|
type: 'array',
|
|
197
|
-
components: { input:
|
|
215
|
+
components: { input: VariableFontsRefArray },
|
|
198
216
|
of: [{
|
|
199
217
|
type: 'reference',
|
|
200
218
|
weak: true,
|
|
@@ -84,10 +84,18 @@ const FAMILY_CLASS_MAP = {
|
|
|
84
84
|
8: 'sans-serif',
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
// Darden Studio fonts have sFamilyClass: 0 (No Classification) in their OS/2 table,
|
|
88
|
+
// so name-based matching is used as the primary signal.
|
|
89
|
+
const SERIF_NAMES = /jubilat|corundum|dapifer|birra|daith/i;
|
|
90
|
+
const SANS_NAMES = /halyard|gamay|omnes|kit/i;
|
|
91
|
+
|
|
92
|
+
/** Detects font category from the font name first, then OS/2 sFamilyClass as fallback */
|
|
93
|
+
function detectFontCategory(font, fontName) {
|
|
94
|
+
if (fontName && SERIF_NAMES.test(fontName)) return 'serif';
|
|
95
|
+
if (fontName && SANS_NAMES.test(fontName)) return 'sans-serif';
|
|
89
96
|
try {
|
|
90
|
-
|
|
97
|
+
// fontkit v2: font['OS/2'] exposes the parsed OS/2 table directly
|
|
98
|
+
const familyClass = font['OS/2']?.sFamilyClass ?? 0;
|
|
91
99
|
const highByte = (familyClass >> 8) & 0xFF;
|
|
92
100
|
return FAMILY_CLASS_MAP[highByte] ?? 'default';
|
|
93
101
|
} catch {
|
|
@@ -96,11 +104,11 @@ function detectFontCategory(font) {
|
|
|
96
104
|
}
|
|
97
105
|
|
|
98
106
|
/** Extracts metric override percentages and detects the category fallback stack from a font ArrayBuffer */
|
|
99
|
-
function calcFallbackData(arrayBuffer) {
|
|
107
|
+
function calcFallbackData(arrayBuffer, fontName) {
|
|
100
108
|
try {
|
|
101
109
|
let font = fontkit.create(Buffer.from(arrayBuffer));
|
|
102
110
|
let upm = font.unitsPerEm;
|
|
103
|
-
let category = detectFontCategory(font);
|
|
111
|
+
let category = detectFontCategory(font, fontName);
|
|
104
112
|
return {
|
|
105
113
|
fallbackSrc: FALLBACK_STACKS[category],
|
|
106
114
|
ascentOverride: `${(font.ascent / upm * 100).toFixed(2)}%`,
|
|
@@ -134,7 +142,7 @@ export default async function generateCssFile({
|
|
|
134
142
|
let arrayBuffer = await woff2File.arrayBuffer();
|
|
135
143
|
let b64 = _arrayBufferToBase64(arrayBuffer);
|
|
136
144
|
let fontkitFont = fontkit.create(Buffer.from(arrayBuffer));
|
|
137
|
-
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer);
|
|
145
|
+
let { fallbackSrc, ascentOverride, descentOverride, lineGapOverride } = calcFallbackData(arrayBuffer, fontName);
|
|
138
146
|
|
|
139
147
|
let cssString;
|
|
140
148
|
if (variableFont) {
|