From 5cd0bcc15835c55b1bbf4767122430c858fb3949 Mon Sep 17 00:00:00 2001 From: Moritz Hartmeier Date: Thu, 24 Sep 2026 15:19:57 +0200 Subject: [PATCH 1/2] fix(features): resolve API-reference links against the reader's docs version features.json stored 143 absolute apiUrl values pointing at the UNVERSIONED API reference, and FeatureList rendered them as-is. One shared data file serves every docs version, so there is no single correct prefix to bake into it. Nothing is broken today: the component is used on 10 pages, all in docs/, and for the current version the unversioned tree is the right target -- the same convention its Markdown uses. The problem is the next freeze. `docs:version` copies docs/ verbatim, so the snapshot gets all 10 pages with intact while still importing the SHARED features.json. The frozen version then renders whatever the unversioned tree documents, which after the following minor publishes is the newer release. That is the bug #445 fixes for Markdown, in a place a substitution over versioned_docs/ cannot reach. features.json now stores the path WITHIN the API reference ("ios/label-capture/api/serial-number-barcode.html#..."), and a new apiReferenceUrl() applies the version at render time: the unversioned tree for `current`, /data-capture-sdk/ for a frozen version. FeatureList reads the active version through useActiveDocContext(), the pattern FrameworkSelectorMobile already uses. withCurrentDocsPath() did not cover this and still does not: it prefixes relative /sdks/ paths for unreleased frameworks only, and returns an absolute URL untouched. Verified: apiReferenceUrl() across current / frozen / already-absolute inputs, tsc clean, a full build passes, and `yarn verify:frameworks` still passes -- that gate reads features.json, so the shape change had to keep it happy. NOT verified, stated plainly: how a FROZEN page renders, because no frozen version uses the component today, and FeatureList is client-rendered -- the static HTML carries "Loading features..." and the data ships in the JS bundle, so a build cannot observe those links either way. The frozen path rests on useActiveDocContext() reporting the version name, which the existing selector component already depends on. Co-Authored-By: Claude Opus 5 --- src/components/FeatureList/index.tsx | 18 +- src/constants/docsPaths.ts | 37 ++++ src/data/features.json | 286 +++++++++++++-------------- 3 files changed, 192 insertions(+), 149 deletions(-) diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx index 570cf628df..9ef8ff1777 100644 --- a/src/components/FeatureList/index.tsx +++ b/src/components/FeatureList/index.tsx @@ -7,7 +7,8 @@ import { FeatureListProps, Feature, Product, FilteredFeature } from './types'; import productsData from '@site/src/data/products.json'; import featuresData from '@site/src/data/features.json'; import { frameworkFromPath } from '@site/src/constants/frameworks'; -import { withCurrentDocsPath } from '@site/src/constants/docsPaths'; +import { apiReferenceUrl } from '@site/src/constants/docsPaths'; +import { useActiveDocContext } from '@docusaurus/plugin-content-docs/client'; // Function to render description with inline code formatting const renderDescription = (description: string) => { @@ -31,6 +32,9 @@ const FeatureList: React.FC = ({ className = '' }) => { const { siteConfig } = useDocusaurusContext(); + // Which docs version the reader is on, so API links point at that version's + // API-reference line rather than at whatever released most recently. + const activeVersionName = useActiveDocContext(undefined)?.activeVersion?.name; const [filteredFeatures, setFilteredFeatures] = useState([]); const [isLoading, setIsLoading] = useState(true); @@ -127,10 +131,12 @@ const FeatureList: React.FC = ({ if (currentFramework && feature.frameworks[currentFramework]) { const frameworkInfo = feature.frameworks[currentFramework]; - // products.json stores version-agnostic /sdks//... paths; - // frameworks that only exist in the unreleased docs need the current - // version prefix or they resolve into the released tree and 404. - return frameworkInfo.apiUrl ? withCurrentDocsPath(frameworkInfo.apiUrl) : null; + // features.json stores the path WITHIN the API reference; the version is + // applied here, because one shared data file serves every docs version + // and there is no single correct prefix to bake into it. + return frameworkInfo.apiUrl + ? apiReferenceUrl(frameworkInfo.apiUrl, activeVersionName) + : null; } return null; }; @@ -202,7 +208,7 @@ const FeatureList: React.FC = ({ .map(([frameworkName, frameworkInfo]) => ( https://docs.scandit.com/data-capture-sdk/ios/… + * ("ios/…", "7.6.14") -> https://docs.scandit.com/7.6/data-capture-sdk/ios/… + * ("https://…", …) -> unchanged, for any entry still holding a full URL + */ +export function apiReferenceUrl(path: string, versionName?: string): string { + if (!path) return path; + if (/^https?:\/\//.test(path)) return path; + const withinReference = path.replace(/^\//, ""); + const line = + versionName && versionName !== "current" + ? versionName.match(/^(\d+\.\d+)\./)?.[1] + : undefined; + return line + ? `${DOCS_HOST}/${line}/data-capture-sdk/${withinReference}` + : `${DOCS_HOST}/data-capture-sdk/${withinReference}`; +} diff --git a/src/data/features.json b/src/data/features.json index 6fa39eb849..e9f90b4f8a 100644 --- a/src/data/features.json +++ b/src/data/features.json @@ -6,16 +6,16 @@ "category": "Pre-built Fields", "tag": "Barcode Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/serial-number-barcode.html#serial-number-barcode" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/serial-number-barcode.html#serial-number-barcode" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/serial-number-barcode.html#serial-number-barcode" } } }, { @@ -25,16 +25,16 @@ "category": "Pre-built Fields", "tag": "Barcode Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/part-number-barcode.html#part-number-barcode" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/part-number-barcode.html#part-number-barcode" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/part-number-barcode.html#part-number-barcode" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/part-number-barcode.html#part-number-barcode" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/part-number-barcode.html#part-number-barcode" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/part-number-barcode.html#part-number-barcode" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/part-number-barcode.html#part-number-barcode" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/part-number-barcode.html#part-number-barcode" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/part-number-barcode.html#part-number-barcode" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/part-number-barcode.html#part-number-barcode" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/part-number-barcode.html#part-number-barcode" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/part-number-barcode.html#part-number-barcode" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/part-number-barcode.html#part-number-barcode" } } }, { @@ -44,16 +44,16 @@ "category": "Pre-built Fields", "tag": "Barcode Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/imei-one-barcode.html#imei-one-barcode" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/imei-one-barcode.html#imei-one-barcode" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/imei-one-barcode.html#imei-one-barcode" } } }, { @@ -63,16 +63,16 @@ "category": "Pre-built Fields", "tag": "Barcode Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/imei-two-barcode.html#imei-two-barcode" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/imei-two-barcode.html#imei-two-barcode" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/imei-two-barcode.html#imei-two-barcode" } } }, { @@ -82,16 +82,16 @@ "category": "Pre-built Fields", "tag": "Price and Weight Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/unit-price-text.html#unit-price-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/unit-price-text.html#unit-price-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/unit-price-text.html#unit-price-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/unit-price-text.html#unit-price-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/unit-price-text.html#unit-price-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/unit-price-text.html#unit-price-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/unit-price-text.html#unit-price-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/unit-price-text.html#unit-price-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/unit-price-text.html#unit-price-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/unit-price-text.html#unit-price-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/unit-price-text.html#unit-price-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/unit-price-text.html#unit-price-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/unit-price-text.html#unit-price-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/unit-price-text.html#unit-price-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/unit-price-text.html#unit-price-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/unit-price-text.html#unit-price-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/unit-price-text.html#unit-price-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/unit-price-text.html#unit-price-text" } } }, { @@ -101,16 +101,16 @@ "category": "Pre-built Fields", "tag": "Price and Weight Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/total-price-text.html#total-price-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/total-price-text.html#total-price-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/total-price-text.html#total-price-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/total-price-text.html#total-price-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/total-price-text.html#total-price-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/total-price-text.html#total-price-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/total-price-text.html#total-price-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/total-price-text.html#total-price-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/total-price-text.html#total-price-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/total-price-text.html#total-price-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/total-price-text.html#total-price-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/total-price-text.html#total-price-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/total-price-text.html#total-price-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/total-price-text.html#total-price-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/total-price-text.html#total-price-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/total-price-text.html#total-price-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/total-price-text.html#total-price-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/total-price-text.html#total-price-text" } } }, { @@ -120,16 +120,16 @@ "category": "Pre-built Fields", "tag": "Price and Weight Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/weight-text.html#weight-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/weight-text.html#weight-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/weight-text.html#weight-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/weight-text.html#weight-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/weight-text.html#weight-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/weight-text.html#weight-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/weight-text.html#weight-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/weight-text.html#weight-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/weight-text.html#weight-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/weight-text.html#weight-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/weight-text.html#weight-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/weight-text.html#weight-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/weight-text.html#weight-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/weight-text.html#weight-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/weight-text.html#weight-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/weight-text.html#weight-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/weight-text.html#weight-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/weight-text.html#weight-text" } } }, { @@ -139,16 +139,16 @@ "category": "Pre-built Fields", "tag": "Date and Custom Text Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/packing-date-text.html#packing-date-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/packing-date-text.html#packing-date-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/packing-date-text.html#packing-date-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/packing-date-text.html#packing-date-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/packing-date-text.html#packing-date-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/packing-date-text.html#packing-date-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/packing-date-text.html#packing-date-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/packing-date-text.html#packing-date-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/packing-date-text.html#packing-date-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/packing-date-text.html#packing-date-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/packing-date-text.html#packing-date-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/packing-date-text.html#packing-date-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/packing-date-text.html#packing-date-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/packing-date-text.html#packing-date-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/packing-date-text.html#packing-date-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/packing-date-text.html#packing-date-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/packing-date-text.html#packing-date-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/packing-date-text.html#packing-date-text" } } }, { @@ -158,16 +158,16 @@ "category": "Pre-built Fields", "tag": "Date and Custom Text Fields", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/expiry-date-text.html#expiry-date-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/expiry-date-text.html#expiry-date-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/expiry-date-text.html#expiry-date-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/expiry-date-text.html#expiry-date-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/expiry-date-text.html#expiry-date-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/expiry-date-text.html#expiry-date-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/expiry-date-text.html#expiry-date-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/expiry-date-text.html#expiry-date-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/expiry-date-text.html#expiry-date-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/expiry-date-text.html#expiry-date-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/expiry-date-text.html#expiry-date-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/expiry-date-text.html#expiry-date-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/expiry-date-text.html#expiry-date-text" } } }, { @@ -177,16 +177,16 @@ "category": "Pre-built Fields", "tag": "Date and Custom Text Fields", "frameworks": { - "iOS": { "version": "7.6", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/date-text.html#date-text" }, - "Android": { "version": "7.6", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/date-text.html#date-text" }, - "Web": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/date-text.html#date-text" }, - "React Native": { "version": "8.3", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/date-text.html#date-text" }, - "Flutter": { "version": "8.3", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/date-text.html#date-text" }, + "iOS": { "version": "7.6", "apiUrl": "ios/label-capture/api/date-text.html#date-text" }, + "Android": { "version": "7.6", "apiUrl": "android/label-capture/api/date-text.html#date-text" }, + "Web": { "version": "8.0", "apiUrl": "web/label-capture/api/date-text.html#date-text" }, + "React Native": { "version": "8.3", "apiUrl": "react-native/label-capture/api/date-text.html#date-text" }, + "Flutter": { "version": "8.3", "apiUrl": "flutter/label-capture/api/date-text.html#date-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.3", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/date-text.html#date-text" }, - "Cordova": { "version": "8.3", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/date-text.html#date-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/date-text.html#date-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/date-text.html#date-text" } + "Capacitor": { "version": "8.3", "apiUrl": "capacitor/label-capture/api/date-text.html#date-text" }, + "Cordova": { "version": "8.3", "apiUrl": "cordova/label-capture/api/date-text.html#date-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/date-text.html#date-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/date-text.html#date-text" } } }, { @@ -196,16 +196,16 @@ "category": "Pre-built Labels", "tag": "Label Definitions", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - "Web": { "version": "7.4", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "Web": { "version": "7.4", "apiUrl": "web/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.PriceCaptureDefinitionWithName" } } }, { @@ -215,16 +215,16 @@ "category": "Pre-built Labels", "tag": "Label Definitions", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - "Web": { "version": "7.4", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "Web": { "version": "7.4", "apiUrl": "web/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.VinLabelDefinitionWithName" } } }, { @@ -234,16 +234,16 @@ "category": "Pre-built Labels", "tag": "Label Definitions", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, "Web": { "version": "n/a" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/label-definition.html#method-scandit.datacapture.label.LabelDefinition.SevenSegmentDisplayLabelDefinitionWithName" } } }, { @@ -253,16 +253,16 @@ "category": "Pre-built Labels", "tag": "Label Definitions", "frameworks": { - "iOS": { "version": "7.6", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - "Android": { "version": "7.6", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - "Web": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - "React Native": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - "Flutter": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "iOS": { "version": "7.6", "apiUrl": "ios/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "Android": { "version": "7.6", "apiUrl": "android/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "Web": { "version": "8.1", "apiUrl": "web/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "React Native": { "version": "8.2", "apiUrl": "react-native/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "Flutter": { "version": "8.2", "apiUrl": "flutter/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" } + "Capacitor": { "version": "8.2", "apiUrl": "capacitor/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/receipt-scanning-result.html#receipt-scanning-result" } } }, { @@ -272,16 +272,16 @@ "category": "Custom Fields", "tag": "Field Types", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/custom-barcode.html#custom-barcode" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/custom-barcode.html#custom-barcode" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/custom-barcode.html#custom-barcode" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/custom-barcode.html#custom-barcode" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/custom-barcode.html#custom-barcode" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/custom-barcode.html#custom-barcode" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/custom-barcode.html#custom-barcode" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/custom-barcode.html#custom-barcode" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/custom-barcode.html#custom-barcode" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/custom-barcode.html#custom-barcode" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/custom-barcode.html#custom-barcode" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/custom-barcode.html#custom-barcode" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/custom-barcode.html#custom-barcode" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/custom-barcode.html#custom-barcode" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/custom-barcode.html#custom-barcode" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/custom-barcode.html#custom-barcode" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/custom-barcode.html#custom-barcode" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/custom-barcode.html#custom-barcode" } } }, { @@ -291,16 +291,16 @@ "category": "Custom Fields", "tag": "Field Types", "frameworks": { - "iOS": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/ios/label-capture/api/custom-text.html#custom-text" }, - "Android": { "version": "6.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/android/label-capture/api/custom-text.html#custom-text" }, - "Web": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/web/label-capture/api/custom-text.html#custom-text" }, - "React Native": { "version": "6.5", "apiUrl": "https://docs.scandit.com/data-capture-sdk/react-native/label-capture/api/custom-text.html#custom-text" }, - "Flutter": { "version": "7.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/flutter/label-capture/api/custom-text.html#custom-text" }, + "iOS": { "version": "6.0", "apiUrl": "ios/label-capture/api/custom-text.html#custom-text" }, + "Android": { "version": "6.0", "apiUrl": "android/label-capture/api/custom-text.html#custom-text" }, + "Web": { "version": "7.2", "apiUrl": "web/label-capture/api/custom-text.html#custom-text" }, + "React Native": { "version": "6.5", "apiUrl": "react-native/label-capture/api/custom-text.html#custom-text" }, + "Flutter": { "version": "7.2", "apiUrl": "flutter/label-capture/api/custom-text.html#custom-text" }, "Kotlin Multiplatform": { "version": "8.6" }, - "Capacitor": { "version": "8.0", "apiUrl": "https://docs.scandit.com/data-capture-sdk/capacitor/label-capture/api/custom-text.html#custom-text" }, - "Cordova": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/cordova/label-capture/api/custom-text.html#custom-text" }, - ".NET Android": { "version": "8.1", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.android/label-capture/api/custom-text.html#custom-text" }, - ".NET iOS": { "version": "8.2", "apiUrl": "https://docs.scandit.com/data-capture-sdk/dotnet.ios/label-capture/api/custom-text.html#custom-text" } + "Capacitor": { "version": "8.0", "apiUrl": "capacitor/label-capture/api/custom-text.html#custom-text" }, + "Cordova": { "version": "8.2", "apiUrl": "cordova/label-capture/api/custom-text.html#custom-text" }, + ".NET Android": { "version": "8.1", "apiUrl": "dotnet.android/label-capture/api/custom-text.html#custom-text" }, + ".NET iOS": { "version": "8.2", "apiUrl": "dotnet.ios/label-capture/api/custom-text.html#custom-text" } } } ] From 2d53694cffc6f191bedd613eb92430fb038454bb Mon Sep 17 00:00:00 2001 From: Moritz Hartmeier Date: Mon, 28 Sep 2026 19:28:08 +0200 Subject: [PATCH 2/2] fix(features): hide features newer than the docs version the reader is on features.json records the SDK version each feature arrived in, and one shared file serves every docs version -- so a frozen version lists features that did not exist in it. 86 framework entries are newer than 7.6. That was harmless while their links pointed at the unversioned API reference, which always documents the newest release. Resolving links against the reader's own line turns every one of them into a 404: /7.6/data-capture-sdk/ has no page for a class added in 8.2. The fix would have introduced the breakage it exists to prevent. Availability is now version-aware at all three sites: the feature filter, the isAvailable flag, and the per-framework chip list. The comparison is numeric PER COMPONENT, which matters more than it looks: "6.5" is earlier than "6.28", and both a string comparison ("6.5" > "6.28") and a float one (6.5 > 6.28) get that backwards. 6.28 is a real docs version, so it is not hypothetical. `current` shows everything, and an unparseable version on either side shows the feature rather than hiding it, so a data-entry slip degrades to the previous behaviour rather than silently emptying a table. Also rebased onto main for #448: features.json is regenerated from main with the host-stripping re-applied, so the dotnet.ios / dotnet.android corrections are preserved rather than hand-merged (32 values checked). Verified: the comparison across both frozen versions and `current` including the 6.5/6.28 case, tsc clean, build passes, verify:frameworks passes. Reported by @eugenia-scandit. Co-Authored-By: Claude Opus 5 --- src/components/FeatureList/availability.ts | 48 ++++++++++++++++++++++ src/components/FeatureList/index.tsx | 21 +++++++--- 2 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/components/FeatureList/availability.ts diff --git a/src/components/FeatureList/availability.ts b/src/components/FeatureList/availability.ts new file mode 100644 index 0000000000..42a246d83b --- /dev/null +++ b/src/components/FeatureList/availability.ts @@ -0,0 +1,48 @@ +/** + * Whether a feature exists in the docs version the reader is on. + * + * features.json records the SDK version a feature was introduced in ("8.2"), + * and one shared file serves every docs version. A frozen version therefore + * lists features that did not exist in it — 86 framework entries are newer than + * 7.6, for instance. That was harmless while their links pointed at the + * unversioned API reference, which always documents the newest release. Once + * the links resolve against the reader's own line, each of those becomes a 404: + * /7.6/data-capture-sdk/… has no page for a class added in 8.2. + */ + +/** (major, minor) of a version string, or null if it is not one. */ +function versionParts(version: string): [number, number] | null { + const match = /^(\d+)\.(\d+)/.exec(version); + return match ? [Number(match[1]), Number(match[2])] : null; +} + +/** + * True if a feature introduced in `introducedIn` exists in `docsVersion`. + * + * Compared numerically PER COMPONENT. "6.5" is earlier than "6.28", which both + * a string comparison ("6.5" > "6.28") and a float one (6.5 > 6.28) get + * backwards — and 6.28 is a real docs version, so that is not a hypothetical. + * + * `current` shows everything: the in-development docs describe the newest SDK. + * An unparseable version on either side shows the feature rather than hiding + * it, so a data-entry slip degrades to the behaviour that existed before this + * check rather than silently emptying a table. + */ +export function featureExistsIn( + introducedIn: string | undefined, + docsVersion: string | undefined, +): boolean { + if (!introducedIn || introducedIn === 'n/a') return false; + if (!docsVersion || docsVersion === 'current') return true; + + const introduced = versionParts(introducedIn); + const docs = versionParts(docsVersion); + if (!introduced || !docs) return true; + + const [introducedMajor, introducedMinor] = introduced; + const [docsMajor, docsMinor] = docs; + return ( + introducedMajor < docsMajor || + (introducedMajor === docsMajor && introducedMinor <= docsMinor) + ); +} diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx index 9ef8ff1777..1ce00f9698 100644 --- a/src/components/FeatureList/index.tsx +++ b/src/components/FeatureList/index.tsx @@ -8,6 +8,7 @@ import productsData from '@site/src/data/products.json'; import featuresData from '@site/src/data/features.json'; import { frameworkFromPath } from '@site/src/constants/frameworks'; import { apiReferenceUrl } from '@site/src/constants/docsPaths'; +import { featureExistsIn } from './availability'; import { useActiveDocContext } from '@docusaurus/plugin-content-docs/client'; // Function to render description with inline code formatting @@ -69,19 +70,25 @@ const FeatureList: React.FC = ({ // Filter by tag if (tag && feature.tag !== tag) return false; - // Filter by framework availability if framework is specified + // Filter by framework availability if framework is specified. + // Availability is version-aware: a feature added in 8.2 does not exist + // on a 7.6 page, and now that its API link resolves against 7.6 rather + // than the unversioned reference, showing it would give a 404. if (currentFramework) { const frameworkInfo = feature.frameworks[currentFramework]; - if (!frameworkInfo || frameworkInfo.version === 'n/a') { - return false; // Don't show features not available for this framework + if (!featureExistsIn(frameworkInfo?.version, activeVersionName)) { + return false; } } return true; }) .map((feature: Feature) => { - const isAvailable = currentFramework - ? feature.frameworks[currentFramework] && feature.frameworks[currentFramework].version !== 'n/a' + const isAvailable = currentFramework + ? featureExistsIn( + feature.frameworks[currentFramework]?.version, + activeVersionName, + ) : true; return { @@ -204,7 +211,9 @@ const FeatureList: React.FC = ({
{Object.entries(feature.frameworks) - .filter(([, info]) => info.version !== 'n/a') + .filter(([, info]) => + featureExistsIn(info.version, activeVersionName), + ) .map(([frameworkName, frameworkInfo]) => (