fontdue-js 3.0.4 → 3.0.6
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/CHANGELOG.md +9 -0
- package/dist/__generated__/TypeTestersIDQuery.graphql.d.ts +1 -1
- package/dist/__generated__/TypeTestersIDQuery.graphql.js +9 -3
- package/dist/__generated__/TypeTestersRefetchQuery.graphql.d.ts +1 -1
- package/dist/__generated__/TypeTestersRefetchQuery.graphql.js +10 -4
- package/dist/__generated__/TypeTestersSlugQuery.graphql.d.ts +1 -1
- package/dist/__generated__/TypeTestersSlugQuery.graphql.js +9 -3
- package/dist/__generated__/TypeTesters_collection.graphql.d.ts +2 -1
- package/dist/__generated__/TypeTesters_collection.graphql.js +8 -2
- package/dist/components/ConsentBanner/consent.d.ts +15 -0
- package/dist/components/ConsentBanner/consent.js +18 -0
- package/dist/components/ConsentBanner/index.js +12 -4
- package/dist/components/StoreModal/StoreModalBundleButton.js +2 -3
- package/dist/components/StoreModal/StoreModalStyleButton.js +2 -3
- package/dist/components/Tracking/index.js +51 -27
- package/dist/components/TypeTesters/index.js +5 -1
- package/dist/fontdue.css +6 -0
- package/dist/relay/environment.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
## 3.0.6
|
|
2
|
+
|
|
3
|
+
- `TypeTesters` now honours a per-tester text `alignment` (`left`, `center`, or `right`) set in the admin dashboard, overriding the config's `initialAlignment` default. Testers with no explicit alignment keep the previous behaviour — the `initialAlignment` config, or `right` for right-to-left testers. Requires a Fontdue backend that exposes the `alignment` field on type testers.
|
|
4
|
+
|
|
5
|
+
## 3.0.5
|
|
6
|
+
|
|
7
|
+
- Fixed `StoreModal` showing a missing-glyph box or an oversized gap between the `Aa` previews of variable-font instances and bundle styles. The previews were separated by a thin space (U+2009) rendered in the foundry’s own font — fonts with no glyph for that character showed a `.notdef` box between every preview, and monospaced fonts rendered it at a full advance width. The previews are now spaced in CSS.
|
|
8
|
+
- The `Consent Granted` event that `ConsentBanner` posts on “Accept all” now carries the entry page’s attribution — its URL, path, referrer, title, and any `utm_*`, `fbclid` or `gclid` parameters, plus a `context` object — captured when the page first loaded rather than at the moment consent was granted. Campaign attribution now survives a visitor navigating around the site before they accept.
|
|
9
|
+
|
|
1
10
|
## 3.0.4
|
|
2
11
|
|
|
3
12
|
- Fixed the `CharacterViewer` breaking its grid layout when a character set contains glyphs that need an OpenType feature. Each character set is wrapped in its own element so it can carry its own `font-feature-settings`; those wrappers are now `display: contents` so their cells flow through the block's single grid, rather than each wrapper being its own grid and forcing a row break at every feature boundary — an inserted `ss01`/`salt` alternate no longer lands alone on the next row.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @generated SignedSource<<
|
|
2
|
+
* @generated SignedSource<<88dc34765b9026741617ac2fa4e2f1f2>>
|
|
3
3
|
* @lightSyntaxTransform
|
|
4
4
|
* @nogrep
|
|
5
5
|
*/
|
|
@@ -259,6 +259,12 @@ const node = function () {
|
|
|
259
259
|
"kind": "ScalarField",
|
|
260
260
|
"name": "direction",
|
|
261
261
|
"storageKey": null
|
|
262
|
+
}, {
|
|
263
|
+
"alias": null,
|
|
264
|
+
"args": null,
|
|
265
|
+
"kind": "ScalarField",
|
|
266
|
+
"name": "alignment",
|
|
267
|
+
"storageKey": null
|
|
262
268
|
}, {
|
|
263
269
|
"alias": null,
|
|
264
270
|
"args": null,
|
|
@@ -535,12 +541,12 @@ const node = function () {
|
|
|
535
541
|
}]
|
|
536
542
|
},
|
|
537
543
|
"params": {
|
|
538
|
-
"cacheID": "
|
|
544
|
+
"cacheID": "02ec4cd5a630f5057090c61c7083876f",
|
|
539
545
|
"id": null,
|
|
540
546
|
"metadata": {},
|
|
541
547
|
"name": "TypeTestersIDQuery",
|
|
542
548
|
"operationKind": "query",
|
|
543
|
-
"text": "query TypeTestersIDQuery(\n $collectionId: ID!\n $tags: [String!]\n $excludeTags: [String!]\n) {\n collection: node(id: $collectionId) {\n __typename\n ...TypeTesters_collection_4Goyz5\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_3BtHDv on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_3BtHDv\n id\n priceWithLicenseOptions: price(licenseOptions: [], orderVariables: []) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: []) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_3BtHDv on FontCollection {\n ...PriceBarSection_node_3BtHDv\n parent {\n ...PriceBarSection_node_3BtHDv\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_3BtHDv on Sku {\n id\n price(licenseOptions: [], orderVariables: []) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_3BtHDv on Sku {\n id\n ...SKUPrice_sku_3BtHDv\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_3BtHDv on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_3BtHDv\n ...SKUPrice_sku_3BtHDv\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_4Goyz5 on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n fontStyle {\n ...TypeTester_fontStyle_3BtHDv\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_3BtHDv\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_3BtHDv\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
549
|
+
"text": "query TypeTestersIDQuery(\n $collectionId: ID!\n $tags: [String!]\n $excludeTags: [String!]\n) {\n collection: node(id: $collectionId) {\n __typename\n ...TypeTesters_collection_4Goyz5\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_3BtHDv on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_3BtHDv\n id\n priceWithLicenseOptions: price(licenseOptions: [], orderVariables: []) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: []) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_3BtHDv on FontCollection {\n ...PriceBarSection_node_3BtHDv\n parent {\n ...PriceBarSection_node_3BtHDv\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_3BtHDv on Sku {\n id\n price(licenseOptions: [], orderVariables: []) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_3BtHDv on Sku {\n id\n ...SKUPrice_sku_3BtHDv\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_3BtHDv on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_3BtHDv\n ...SKUPrice_sku_3BtHDv\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_4Goyz5 on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n alignment\n fontStyle {\n ...TypeTester_fontStyle_3BtHDv\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_3BtHDv\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_3BtHDv\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
544
550
|
}
|
|
545
551
|
};
|
|
546
552
|
}();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @generated SignedSource<<
|
|
2
|
+
* @generated SignedSource<<62f548d9e0d84264ff2209638fedead7>>
|
|
3
3
|
* @lightSyntaxTransform
|
|
4
4
|
* @nogrep
|
|
5
5
|
*/
|
|
@@ -270,6 +270,12 @@ const node = function () {
|
|
|
270
270
|
"kind": "ScalarField",
|
|
271
271
|
"name": "direction",
|
|
272
272
|
"storageKey": null
|
|
273
|
+
}, {
|
|
274
|
+
"alias": null,
|
|
275
|
+
"args": null,
|
|
276
|
+
"kind": "ScalarField",
|
|
277
|
+
"name": "alignment",
|
|
278
|
+
"storageKey": null
|
|
273
279
|
}, {
|
|
274
280
|
"alias": null,
|
|
275
281
|
"args": null,
|
|
@@ -546,14 +552,14 @@ const node = function () {
|
|
|
546
552
|
}]
|
|
547
553
|
},
|
|
548
554
|
"params": {
|
|
549
|
-
"cacheID": "
|
|
555
|
+
"cacheID": "59e028e888bc3fea5f795b8b4844c543",
|
|
550
556
|
"id": null,
|
|
551
557
|
"metadata": {},
|
|
552
558
|
"name": "TypeTestersRefetchQuery",
|
|
553
559
|
"operationKind": "query",
|
|
554
|
-
"text": "query TypeTestersRefetchQuery(\n $excludeTags: [String!] = null\n $licenseOptions: [LicenseOptionsSpec] = []\n $orderVariables: [OrderVariableSelectionInput!] = []\n $tags: [String!] = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TypeTesters_collection_32it0Z\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_4sncub on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_4sncub\n id\n priceWithLicenseOptions: price(licenseOptions: $licenseOptions, orderVariables: $orderVariables) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: $licenseOptions) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_4sncub on FontCollection {\n ...PriceBarSection_node_4sncub\n parent {\n ...PriceBarSection_node_4sncub\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_4sncub on Sku {\n id\n price(licenseOptions: $licenseOptions, orderVariables: $orderVariables) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_4sncub on Sku {\n id\n ...SKUPrice_sku_4sncub\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_4sncub on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_4sncub\n ...SKUPrice_sku_4sncub\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_32it0Z on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n fontStyle {\n ...TypeTester_fontStyle_4sncub\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_4sncub\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_4sncub\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
560
|
+
"text": "query TypeTestersRefetchQuery(\n $excludeTags: [String!] = null\n $licenseOptions: [LicenseOptionsSpec] = []\n $orderVariables: [OrderVariableSelectionInput!] = []\n $tags: [String!] = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...TypeTesters_collection_32it0Z\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_4sncub on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_4sncub\n id\n priceWithLicenseOptions: price(licenseOptions: $licenseOptions, orderVariables: $orderVariables) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: $licenseOptions) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_4sncub on FontCollection {\n ...PriceBarSection_node_4sncub\n parent {\n ...PriceBarSection_node_4sncub\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_4sncub on Sku {\n id\n price(licenseOptions: $licenseOptions, orderVariables: $orderVariables) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_4sncub on Sku {\n id\n ...SKUPrice_sku_4sncub\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_4sncub on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_4sncub\n ...SKUPrice_sku_4sncub\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_32it0Z on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n alignment\n fontStyle {\n ...TypeTester_fontStyle_4sncub\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_4sncub\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_4sncub\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
555
561
|
}
|
|
556
562
|
};
|
|
557
563
|
}();
|
|
558
|
-
node.hash = "
|
|
564
|
+
node.hash = "b247a9b03142716823d36ec52dd965ff";
|
|
559
565
|
export default node;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @generated SignedSource<<
|
|
2
|
+
* @generated SignedSource<<5fedd7461fe752fd8dd8746cf2a872c9>>
|
|
3
3
|
* @lightSyntaxTransform
|
|
4
4
|
* @nogrep
|
|
5
5
|
*/
|
|
@@ -283,6 +283,12 @@ const node = function () {
|
|
|
283
283
|
"kind": "ScalarField",
|
|
284
284
|
"name": "direction",
|
|
285
285
|
"storageKey": null
|
|
286
|
+
}, {
|
|
287
|
+
"alias": null,
|
|
288
|
+
"args": null,
|
|
289
|
+
"kind": "ScalarField",
|
|
290
|
+
"name": "alignment",
|
|
291
|
+
"storageKey": null
|
|
286
292
|
}, {
|
|
287
293
|
"alias": null,
|
|
288
294
|
"args": null,
|
|
@@ -560,12 +566,12 @@ const node = function () {
|
|
|
560
566
|
}]
|
|
561
567
|
},
|
|
562
568
|
"params": {
|
|
563
|
-
"cacheID": "
|
|
569
|
+
"cacheID": "eb0a798a6667c9083085bd38105fb643",
|
|
564
570
|
"id": null,
|
|
565
571
|
"metadata": {},
|
|
566
572
|
"name": "TypeTestersSlugQuery",
|
|
567
573
|
"operationKind": "query",
|
|
568
|
-
"text": "query TypeTestersSlugQuery(\n $collectionSlug: String!\n $tags: [String!]\n $excludeTags: [String!]\n) {\n viewer {\n slug(name: $collectionSlug) {\n collection: fontCollection {\n ...TypeTesters_collection_4Goyz5\n id\n }\n id\n }\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_3BtHDv on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_3BtHDv\n id\n priceWithLicenseOptions: price(licenseOptions: [], orderVariables: []) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: []) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_3BtHDv on FontCollection {\n ...PriceBarSection_node_3BtHDv\n parent {\n ...PriceBarSection_node_3BtHDv\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_3BtHDv on Sku {\n id\n price(licenseOptions: [], orderVariables: []) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_3BtHDv on Sku {\n id\n ...SKUPrice_sku_3BtHDv\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_3BtHDv on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_3BtHDv\n ...SKUPrice_sku_3BtHDv\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_4Goyz5 on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n fontStyle {\n ...TypeTester_fontStyle_3BtHDv\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_3BtHDv\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_3BtHDv\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
574
|
+
"text": "query TypeTestersSlugQuery(\n $collectionSlug: String!\n $tags: [String!]\n $excludeTags: [String!]\n) {\n viewer {\n slug(name: $collectionSlug) {\n collection: fontCollection {\n ...TypeTesters_collection_4Goyz5\n id\n }\n id\n }\n id\n }\n}\n\nfragment FontStyle_fontStyle on FontStyle {\n ...useFontStyle_fontStyle\n}\n\nfragment PriceBarSection_node_3BtHDv on FontCollection {\n id\n name\n collectionType\n sku {\n ...SelectButton_sku_3BtHDv\n id\n priceWithLicenseOptions: price(licenseOptions: [], orderVariables: []) {\n ...Price_price\n }\n }\n totalStyles\n totalStylesPrice(licenseOptions: []) {\n ...Price_price\n }\n}\n\nfragment PriceBar_node_3BtHDv on FontCollection {\n ...PriceBarSection_node_3BtHDv\n parent {\n ...PriceBarSection_node_3BtHDv\n id\n }\n}\n\nfragment Price_price on Money {\n amount\n currency\n}\n\nfragment SKUPrice_sku_3BtHDv on Sku {\n id\n price(licenseOptions: [], orderVariables: []) {\n amount\n ...Price_price\n }\n}\n\nfragment SelectButton_sku_3BtHDv on Sku {\n id\n ...SKUPrice_sku_3BtHDv\n}\n\nfragment TypeTesterFeaturesButton_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n}\n\nfragment TypeTesterFeatures_fontStyle on FontStyle {\n ...useFeaturesData_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n}\n\nfragment TypeTesterFloatingToolbar_testers on TypeTester {\n id\n fontStyle {\n ...TypeTesterToolbar_fontStyle\n ...TypeTesterFeatures_fontStyle\n id\n }\n}\n\nfragment TypeTesterStyleSelectData_fontStyle on FontStyle {\n id\n name\n supportedLanguages\n cssWeight\n cssStyle\n cssStretch\n variableInstances {\n name\n coordinates {\n axis\n value\n }\n }\n family {\n id\n name\n }\n}\n\nfragment TypeTesterToolbar_fontStyle on FontStyle {\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterFeaturesButton_fontStyle\n}\n\nfragment TypeTesterVariableAxes_fontStyle on FontStyle {\n variableAxes {\n axis\n name\n minValue\n maxValue\n }\n}\n\nfragment TypeTester_fontStyle_3BtHDv on FontStyle {\n id\n ...TypeTesterFeatures_fontStyle\n ...TypeTesterStyleSelectData_fontStyle\n ...FontStyle_fontStyle\n ...TypeTesterVariableAxes_fontStyle\n ...TypeTesterToolbar_fontStyle\n sku {\n ...SelectButton_sku_3BtHDv\n ...SKUPrice_sku_3BtHDv\n id\n basePrice: price {\n amount\n }\n }\n}\n\nfragment TypeTesters_collection_4Goyz5 on FontCollection {\n typeTesters(first: 999, tags: $tags, excludeTags: $excludeTags) {\n edges {\n node {\n id\n content\n size\n lineHeight\n letterSpacing\n autofit\n direction\n alignment\n fontStyle {\n ...TypeTester_fontStyle_3BtHDv\n id\n family {\n id\n }\n }\n variableSettings {\n axis\n value\n }\n featureSettings {\n feature\n value\n }\n tags\n ...TypeTesterFloatingToolbar_testers\n }\n }\n }\n typeTesterFeatures\n typeTesterAxes\n id\n ...PriceBar_node_3BtHDv\n families: children(collectionTypes: [FAMILY]) {\n id\n ...PriceBar_node_3BtHDv\n }\n parent {\n id\n }\n}\n\nfragment useFeaturesData_fontStyle on FontStyle {\n fontFeatures {\n supportedFeatures\n stylisticSetNames {\n featureName\n humanName\n }\n }\n}\n\nfragment useFontStyle_fontStyle on FontStyle {\n cssFamily\n name\n webfontSources {\n url\n format\n tech\n }\n verticalMetrics {\n unitsPerEm\n ascender\n descender\n lineGap\n avgCharWidth\n }\n}\n"
|
|
569
575
|
}
|
|
570
576
|
};
|
|
571
577
|
}();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @generated SignedSource<<
|
|
2
|
+
* @generated SignedSource<<db8e340a34a78571fc6801ac096bd540>>
|
|
3
3
|
* @lightSyntaxTransform
|
|
4
4
|
* @nogrep
|
|
5
5
|
*/
|
|
@@ -19,6 +19,7 @@ export type TypeTesters_collection$data = {
|
|
|
19
19
|
readonly typeTesters: {
|
|
20
20
|
readonly edges: ReadonlyArray<{
|
|
21
21
|
readonly node: {
|
|
22
|
+
readonly alignment: string | null;
|
|
22
23
|
readonly autofit: boolean | null;
|
|
23
24
|
readonly content: string | null;
|
|
24
25
|
readonly direction: string | null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @generated SignedSource<<
|
|
2
|
+
* @generated SignedSource<<db8e340a34a78571fc6801ac096bd540>>
|
|
3
3
|
* @lightSyntaxTransform
|
|
4
4
|
* @nogrep
|
|
5
5
|
*/
|
|
@@ -139,6 +139,12 @@ const node = function () {
|
|
|
139
139
|
"kind": "ScalarField",
|
|
140
140
|
"name": "direction",
|
|
141
141
|
"storageKey": null
|
|
142
|
+
}, {
|
|
143
|
+
"alias": null,
|
|
144
|
+
"args": null,
|
|
145
|
+
"kind": "ScalarField",
|
|
146
|
+
"name": "alignment",
|
|
147
|
+
"storageKey": null
|
|
142
148
|
}, {
|
|
143
149
|
"alias": null,
|
|
144
150
|
"args": null,
|
|
@@ -246,5 +252,5 @@ const node = function () {
|
|
|
246
252
|
"abstractKey": null
|
|
247
253
|
};
|
|
248
254
|
}();
|
|
249
|
-
node.hash = "
|
|
255
|
+
node.hash = "b247a9b03142716823d36ec52dd965ff";
|
|
250
256
|
export default node;
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
export declare function setClientAnonymousId(id: string): void;
|
|
2
2
|
export declare function getClientAnonymousId(): string | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* The tracker captures the entry page view once on mount and stores its
|
|
5
|
+
* attribution here (url, referrer, fbclid, utm campaign). The consent banner
|
|
6
|
+
* reads it when the visitor grants consent so the `Consent Granted` event can
|
|
7
|
+
* carry the arrival attribution — preserving it even if the visitor has since
|
|
8
|
+
* navigated away from the landing URL. The server forwards that event; each
|
|
9
|
+
* destination decides how to represent it (Meta reads it as the entry
|
|
10
|
+
* PageView). Undefined until the tracker has mounted.
|
|
11
|
+
*/
|
|
12
|
+
export type EntryAttribution = {
|
|
13
|
+
properties: Record<string, unknown>;
|
|
14
|
+
context: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
export declare function setEntryAttribution(body: EntryAttribution): void;
|
|
17
|
+
export declare function getEntryAttribution(): EntryAttribution | undefined;
|
|
3
18
|
/** Parse the _fontdue_cc cookie and check if it contains the given category. */
|
|
4
19
|
export declare function hasConsent(category: string): boolean;
|
|
5
20
|
/** Set the _fontdue_cc cookie with the given categories. */
|
|
@@ -11,6 +11,24 @@ export function getClientAnonymousId() {
|
|
|
11
11
|
return clientAnonymousId;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* The tracker captures the entry page view once on mount and stores its
|
|
16
|
+
* attribution here (url, referrer, fbclid, utm campaign). The consent banner
|
|
17
|
+
* reads it when the visitor grants consent so the `Consent Granted` event can
|
|
18
|
+
* carry the arrival attribution — preserving it even if the visitor has since
|
|
19
|
+
* navigated away from the landing URL. The server forwards that event; each
|
|
20
|
+
* destination decides how to represent it (Meta reads it as the entry
|
|
21
|
+
* PageView). Undefined until the tracker has mounted.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
let entryAttribution;
|
|
25
|
+
export function setEntryAttribution(body) {
|
|
26
|
+
entryAttribution = body;
|
|
27
|
+
}
|
|
28
|
+
export function getEntryAttribution() {
|
|
29
|
+
return entryAttribution;
|
|
30
|
+
}
|
|
31
|
+
|
|
14
32
|
/** Parse the _fontdue_cc cookie and check if it contains the given category. */
|
|
15
33
|
export function hasConsent(category) {
|
|
16
34
|
const match = document.cookie.match(new RegExp('(?:^|;\\s*)' + CONSENT_COOKIE + '=([^;]*)'));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useContext, useEffect, useState } from 'react';
|
|
2
2
|
import ConfigContext from '../ConfigContext.js';
|
|
3
3
|
import { useFontdueUrl } from '../UrlContext.js';
|
|
4
|
-
import { setConsent, activateScripts, getClientAnonymousId } from './consent.js';
|
|
4
|
+
import { setConsent, activateScripts, getClientAnonymousId, getEntryAttribution } from './consent.js';
|
|
5
5
|
const DEFAULT_MESSAGE = 'We use cookies to analyze site usage and improve your\u00A0experience.';
|
|
6
6
|
const ConsentBanner = () => {
|
|
7
7
|
const config = useContext(ConfigContext);
|
|
@@ -19,15 +19,21 @@ const ConsentBanner = () => {
|
|
|
19
19
|
if (dismissed) return null;
|
|
20
20
|
const message = config.tracking.consentMessage || DEFAULT_MESSAGE;
|
|
21
21
|
const sendConsentEvent = categories => {
|
|
22
|
-
// Fire a tracking event
|
|
23
|
-
//
|
|
24
|
-
//
|
|
22
|
+
// Fire a normal tracking event on the existing pipeline. Because the consent
|
|
23
|
+
// cookie was just written, the server is now permitted to forward, sets the
|
|
24
|
+
// durable _fontdue_state cookie on this response (rather than waiting for the
|
|
25
|
+
// next page load), and syncs the client anonymous_id into it. Carry the
|
|
26
|
+
// captured entry-page attribution so destinations that read the grant as a
|
|
27
|
+
// page view (Meta) attribute it to the visitor's arrival (referrer, fbclid).
|
|
28
|
+
const entry = getEntryAttribution();
|
|
25
29
|
const body = {
|
|
26
30
|
event: 'Consent Granted',
|
|
27
31
|
properties: {
|
|
32
|
+
...((entry === null || entry === void 0 ? void 0 : entry.properties) ?? {}),
|
|
28
33
|
categories: categories.join(',')
|
|
29
34
|
}
|
|
30
35
|
};
|
|
36
|
+
if (entry !== null && entry !== void 0 && entry.context) body.context = entry.context;
|
|
31
37
|
const anonId = getClientAnonymousId();
|
|
32
38
|
if (anonId) body.anonymous_id = anonId;
|
|
33
39
|
fetch(`${url}/api/track`, {
|
|
@@ -40,6 +46,8 @@ const ConsentBanner = () => {
|
|
|
40
46
|
}).catch(() => {});
|
|
41
47
|
};
|
|
42
48
|
const handleAcceptAll = () => {
|
|
49
|
+
// Write the consent cookie first, so the tracking request carries it and the
|
|
50
|
+
// server is permitted to forward.
|
|
43
51
|
setConsent(['necessary', 'analytics']);
|
|
44
52
|
activateScripts('analytics');
|
|
45
53
|
if (config.tracking.enabled) {
|
|
@@ -8,7 +8,6 @@ import { PriceFormat } from '../Price/index.js';
|
|
|
8
8
|
import FontStyle from '../FontStyle/index.js';
|
|
9
9
|
import { isSelected } from '../../reducer.js';
|
|
10
10
|
import StoreModalStyleButtonElement from '../elements/StoreModalStyleButton/index.js';
|
|
11
|
-
const THIN_SPACE = '\u2009';
|
|
12
11
|
export default function StoreModalBundleButton(_ref) {
|
|
13
12
|
var _bundle$sku;
|
|
14
13
|
let {
|
|
@@ -27,11 +26,11 @@ export default function StoreModalBundleButton(_ref) {
|
|
|
27
26
|
onClick: handleSelect,
|
|
28
27
|
selected: selected
|
|
29
28
|
}), {
|
|
30
|
-
featureGlyphs: bundle.fontStyles.map(
|
|
29
|
+
featureGlyphs: bundle.fontStyles.map(fontStyle => /*#__PURE__*/React.createElement(FontStyle, {
|
|
31
30
|
key: fontStyle.id,
|
|
32
31
|
fontStyle: fontStyle,
|
|
33
32
|
Component: "span"
|
|
34
|
-
},
|
|
33
|
+
}, "Aa")),
|
|
35
34
|
name: bundle.name,
|
|
36
35
|
price: /*#__PURE__*/React.createElement(SKUPrice, {
|
|
37
36
|
sku: bundle.sku,
|
|
@@ -9,7 +9,6 @@ import FontStyle from '../FontStyle/index.js';
|
|
|
9
9
|
import { isSelected } from '../../reducer.js';
|
|
10
10
|
import StoreModalStyleButtonElement from '../elements/StoreModalStyleButton/index.js';
|
|
11
11
|
import { getFeatureGlyphs, variableInstanceCSS } from '../../utils.js';
|
|
12
|
-
const THIN_SPACE = '\u2009';
|
|
13
12
|
export default function StoreModalStyleButton(_ref) {
|
|
14
13
|
var _fontStyle$variableIn, _fontStyle$variableIn2;
|
|
15
14
|
let {
|
|
@@ -32,10 +31,10 @@ export default function StoreModalStyleButton(_ref) {
|
|
|
32
31
|
featureGlyphs: hasFeatureGlyphs ? /*#__PURE__*/React.createElement(FontStyle, {
|
|
33
32
|
fontStyle: fontStyle,
|
|
34
33
|
Component: "span"
|
|
35
|
-
}, isVariableFont ? (_fontStyle$variableIn2 = fontStyle.variableInstances) === null || _fontStyle$variableIn2 === void 0 ? void 0 : _fontStyle$variableIn2.map(
|
|
34
|
+
}, isVariableFont ? (_fontStyle$variableIn2 = fontStyle.variableInstances) === null || _fontStyle$variableIn2 === void 0 ? void 0 : _fontStyle$variableIn2.map(instance => /*#__PURE__*/React.createElement("span", {
|
|
36
35
|
key: instance.name,
|
|
37
36
|
style: variableInstanceCSS(instance)
|
|
38
|
-
},
|
|
37
|
+
}, getFeatureGlyphs(fontStyle.supportedLanguages))) : getFeatureGlyphs(fontStyle.supportedLanguages)) : null,
|
|
39
38
|
// for variable fonts, only show the name of the style if there are
|
|
40
39
|
// multiple styles
|
|
41
40
|
name: isVariableFont ? fontStyle.sku ? fontStyle.name : undefined : fontStyle.name,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useContext, useEffect } from 'react';
|
|
4
4
|
import ConfigContext from '../ConfigContext.js';
|
|
5
5
|
import { useFontdueUrl } from '../UrlContext.js';
|
|
6
|
-
import { hasConsent, onConsent, setClientAnonymousId } from '../ConsentBanner/consent.js';
|
|
6
|
+
import { hasConsent, onConsent, setClientAnonymousId, setEntryAttribution } from '../ConsentBanner/consent.js';
|
|
7
7
|
function getCampaignDataFromUrl() {
|
|
8
8
|
const urlParams = new URLSearchParams(window.location.search);
|
|
9
9
|
const campaign = {};
|
|
@@ -37,32 +37,41 @@ function getCampaignDataFromUrl() {
|
|
|
37
37
|
properties: hasProperties ? properties : null
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
-
|
|
40
|
+
// Build the page-view payload from the current document. Captured once for the
|
|
41
|
+
// entry page view so its attribution (referrer, fbclid, utm) can travel with the
|
|
42
|
+
// consent grant, preserving arrival attribution even if the visitor has since
|
|
43
|
+
// navigated.
|
|
44
|
+
function buildPageViewBody() {
|
|
45
|
+
const {
|
|
46
|
+
campaign,
|
|
47
|
+
properties: clickIdProperties
|
|
48
|
+
} = getCampaignDataFromUrl();
|
|
49
|
+
const properties = {
|
|
50
|
+
url: window.location.href,
|
|
51
|
+
path: window.location.pathname,
|
|
52
|
+
referrer: document.referrer,
|
|
53
|
+
title: document.title,
|
|
54
|
+
search: window.location.search,
|
|
55
|
+
...clickIdProperties
|
|
56
|
+
};
|
|
57
|
+
const context = {
|
|
58
|
+
userAgent: navigator.userAgent
|
|
59
|
+
};
|
|
60
|
+
if (campaign) {
|
|
61
|
+
context.campaign = campaign;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
properties,
|
|
65
|
+
context
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function postPageView(baseUrl, body, anonymousId) {
|
|
41
69
|
try {
|
|
42
|
-
const {
|
|
43
|
-
|
|
44
|
-
properties: clickIdProperties
|
|
45
|
-
} = getCampaignDataFromUrl();
|
|
46
|
-
const properties = {
|
|
47
|
-
url: window.location.href,
|
|
48
|
-
path: window.location.pathname,
|
|
49
|
-
referrer: document.referrer,
|
|
50
|
-
title: document.title,
|
|
51
|
-
search: window.location.search,
|
|
52
|
-
...clickIdProperties
|
|
53
|
-
};
|
|
54
|
-
const context = {
|
|
55
|
-
userAgent: navigator.userAgent
|
|
56
|
-
};
|
|
57
|
-
if (campaign) {
|
|
58
|
-
context.campaign = campaign;
|
|
59
|
-
}
|
|
60
|
-
const body = {
|
|
61
|
-
properties,
|
|
62
|
-
context
|
|
70
|
+
const payload = {
|
|
71
|
+
...body
|
|
63
72
|
};
|
|
64
73
|
if (anonymousId) {
|
|
65
|
-
|
|
74
|
+
payload.anonymous_id = anonymousId;
|
|
66
75
|
}
|
|
67
76
|
const response = await fetch(`${baseUrl}/api/track/page`, {
|
|
68
77
|
method: 'POST',
|
|
@@ -70,7 +79,7 @@ async function sendPageView(baseUrl, anonymousId) {
|
|
|
70
79
|
'Content-Type': 'application/json'
|
|
71
80
|
},
|
|
72
81
|
credentials: 'include',
|
|
73
|
-
body: JSON.stringify(
|
|
82
|
+
body: JSON.stringify(payload)
|
|
74
83
|
});
|
|
75
84
|
const data = await response.json();
|
|
76
85
|
return data.anonymous_id || null;
|
|
@@ -79,6 +88,9 @@ async function sendPageView(baseUrl, anonymousId) {
|
|
|
79
88
|
return null;
|
|
80
89
|
}
|
|
81
90
|
}
|
|
91
|
+
async function sendPageView(baseUrl, anonymousId) {
|
|
92
|
+
return postPageView(baseUrl, buildPageViewBody(), anonymousId);
|
|
93
|
+
}
|
|
82
94
|
const Tracking = () => {
|
|
83
95
|
const config = useContext(ConfigContext);
|
|
84
96
|
const url = useFontdueUrl();
|
|
@@ -96,8 +108,20 @@ const Tracking = () => {
|
|
|
96
108
|
const analyticsConsent = hasConsent('analytics');
|
|
97
109
|
const effectiveAnonymousId = clientAnonymousId && config.tracking.consentRequired && !analyticsConsent ? clientAnonymousId : undefined;
|
|
98
110
|
|
|
99
|
-
//
|
|
100
|
-
|
|
111
|
+
// Capture the entry page view once, then send it. Before consent the server
|
|
112
|
+
// records but does not forward it.
|
|
113
|
+
const entryBody = buildPageViewBody();
|
|
114
|
+
const pageViewPromise = postPageView(url, entryBody, effectiveAnonymousId);
|
|
115
|
+
|
|
116
|
+
// Publish this captured entry attribution so the consent banner can attach
|
|
117
|
+
// it to the `Consent Granted` event when the visitor grants consent. That
|
|
118
|
+
// event is a normal tracking event on the existing pipeline; the server
|
|
119
|
+
// forwards it and each destination decides how to represent it (Meta reads
|
|
120
|
+
// it as the attributed entry page view). Capturing once preserves the
|
|
121
|
+
// arrival attribution even if the visitor has since navigated.
|
|
122
|
+
if (config.tracking.consentRequired) {
|
|
123
|
+
setEntryAttribution(entryBody);
|
|
124
|
+
}
|
|
101
125
|
|
|
102
126
|
// Segment SDK for device-mode integrations (e.g. Google Tag Manager)
|
|
103
127
|
// The analytics factory is provided by the entry point — it calls AnalyticsBrowser.load()
|
|
@@ -75,7 +75,7 @@ function TypeTestersComponent(_ref) {
|
|
|
75
75
|
licenseOptionsSpecs,
|
|
76
76
|
orderVariableSelections
|
|
77
77
|
} = useLicenseAndOrderVariables();
|
|
78
|
-
const [collection, refetch] = useRefetchableFragment((_TypeTesters_collection.hash && _TypeTesters_collection.hash !== "
|
|
78
|
+
const [collection, refetch] = useRefetchableFragment((_TypeTesters_collection.hash && _TypeTesters_collection.hash !== "b247a9b03142716823d36ec52dd965ff" && console.error("The definition of 'TypeTesters_collection' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesters_collection), collectionKey);
|
|
79
79
|
const handleStyleSelect = useCallback((testerId, fontStyleId) => {
|
|
80
80
|
const newChangedStyles = {
|
|
81
81
|
...changedStyles,
|
|
@@ -119,6 +119,10 @@ function TypeTestersComponent(_ref) {
|
|
|
119
119
|
const direction = node.direction === 'rtl' ? 'rtl' : 'ltr';
|
|
120
120
|
let alignment = config.initialAlignment;
|
|
121
121
|
if (direction === 'rtl') alignment = 'right';
|
|
122
|
+
// An explicit per-card alignment from the dashboard wins over both.
|
|
123
|
+
if (node.alignment === 'left' || node.alignment === 'center' || node.alignment === 'right') {
|
|
124
|
+
alignment = node.alignment;
|
|
125
|
+
}
|
|
122
126
|
acc[node.id] = {
|
|
123
127
|
content: node.content,
|
|
124
128
|
size: node.size ? parseFloat(node.size) : 72,
|
package/dist/fontdue.css
CHANGED
|
@@ -2354,6 +2354,12 @@ input:checked + .checkbox__icon {
|
|
|
2354
2354
|
margin-right: 10px;
|
|
2355
2355
|
word-break: break-word;
|
|
2356
2356
|
}
|
|
2357
|
+
.store-modal__style-button__feature-glyphs span {
|
|
2358
|
+
display: inline-block;
|
|
2359
|
+
}
|
|
2360
|
+
.store-modal__style-button__feature-glyphs span:not(:last-child) {
|
|
2361
|
+
margin-right: 0.2em;
|
|
2362
|
+
}
|
|
2357
2363
|
|
|
2358
2364
|
.store-modal__style-button__price,
|
|
2359
2365
|
.store-modal__style-button__checked {
|
|
@@ -7,7 +7,7 @@ import { PREVIEW_HEADER, hasPreviewMarkerCookie } from '../preview/constants.js'
|
|
|
7
7
|
// (defineVersionPlugin in .babelrc.cjs) with the literal package.json#version.
|
|
8
8
|
// Exported so UI (the admin toolbar) can surface it without re-reading the
|
|
9
9
|
// build-time global in a 'use client' module.
|
|
10
|
-
export const version = "3.0.
|
|
10
|
+
export const version = "3.0.6";
|
|
11
11
|
const IS_SERVER = typeof window === typeof undefined;
|
|
12
12
|
|
|
13
13
|
// Opt server fetches into Next's data cache only in production; dev stays
|