@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 CHANGED
@@ -644,21 +644,25 @@ var FAMILY_CLASS_MAP = {
644
644
  7: "serif",
645
645
  8: "sans-serif"
646
646
  };
647
- function detectFontCategory(font) {
648
- var _a, _b;
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 = ((_b = (_a = font._tables) == null ? void 0 : _a["OS/2"]) == null ? void 0 : _b.sFamilyClass) ?? 0;
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: import_sanity_advanced_reference_array.AdvancedRefArray },
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: import_sanity_advanced_reference_array.AdvancedRefArray },
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: import_sanity_advanced_reference_array.AdvancedRefArray },
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
- function detectFontCategory(font) {
558
- var _a, _b;
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 = ((_b = (_a = font._tables) == null ? void 0 : _a["OS/2"]) == null ? void 0 : _b.sFamilyClass) ?? 0;
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: AdvancedRefArray },
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: AdvancedRefArray },
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: AdvancedRefArray },
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.16",
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: AdvancedRefArray },
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: AdvancedRefArray },
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: AdvancedRefArray },
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
- /** Detects font category from the OS/2 sFamilyClass field; returns a key into FALLBACK_STACKS */
88
- function detectFontCategory(font) {
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
- const familyClass = font._tables?.['OS/2']?.sFamilyClass ?? 0;
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) {