├── .github └── workflows │ ├── cron-run.yml │ ├── manual-run-force.yml │ ├── manual-run.yml │ └── tests.yml ├── .gitignore ├── .mise.toml ├── LICENSE ├── README.md ├── biome.json ├── bun.lockb ├── data ├── api-response.json ├── axis-registry.json ├── google-fonts-v1.json ├── google-fonts-v2.json ├── icons-response.json ├── icons-static.json ├── icons-variable.json ├── licenses.json ├── user-agents.json ├── variable-response.json └── variable.json ├── package.json ├── src ├── api-gen.ts ├── api-parser-v1.ts ├── api-parser-v2.ts ├── axis-gen.ts ├── cli.ts ├── data.ts ├── errors.ts ├── icons-gen.ts ├── icons-parser.ts ├── index.ts ├── license.ts ├── schema.ts ├── types.ts ├── utils.ts ├── validate.ts ├── variable-gen.ts └── variable-parser.ts ├── tests ├── __snapshots__ │ └── api-parser-v2.test.ts.snap ├── api-gen.test.ts ├── api-parser-v1.test.ts ├── api-parser-v2.test.ts ├── axis-gen.test.ts ├── fixtures │ ├── api-parser-v1 │ │ ├── abel-latin-ttf.css │ │ ├── abel-latin-woff.css │ │ ├── abel-latin-woff2.css │ │ ├── ballet-latin-ext-ttf.css │ │ ├── ballet-latin-ext-woff.css │ │ ├── ballet-latin-ext-woff2.css │ │ ├── ballet-latin-ttf.css │ │ ├── ballet-latin-woff.css │ │ ├── ballet-latin-woff2.css │ │ ├── ballet-vietnamese-ttf.css │ │ ├── ballet-vietnamese-woff.css │ │ ├── ballet-vietnamese-woff2.css │ │ ├── cardo-greek-ext-ttf.css │ │ ├── cardo-greek-ext-woff.css │ │ ├── cardo-greek-ext-woff2.css │ │ ├── cardo-greek-ttf.css │ │ ├── cardo-greek-woff.css │ │ ├── cardo-greek-woff2.css │ │ ├── cardo-latin-ext-ttf.css │ │ ├── cardo-latin-ext-woff.css │ │ ├── cardo-latin-ext-woff2.css │ │ ├── cardo-latin-ttf.css │ │ ├── cardo-latin-woff.css │ │ ├── cardo-latin-woff2.css │ │ ├── noto-emoji-emoji-ttf.css │ │ ├── noto-emoji-emoji-woff.css │ │ ├── noto-emoji-emoji-woff2.css │ │ ├── noto-sans-jp-japanese-ttf.css │ │ ├── noto-sans-jp-japanese-woff.css │ │ ├── noto-sans-jp-japanese-woff2.css │ │ ├── noto-sans-jp-latin-ttf.css │ │ ├── noto-sans-jp-latin-woff.css │ │ ├── noto-sans-jp-latin-woff2.css │ │ ├── noto-sans-sc-chinese-simplified-ttf.css │ │ ├── noto-sans-sc-chinese-simplified-woff.css │ │ ├── noto-sans-sc-chinese-simplified-woff2.css │ │ ├── noto-sans-sc-latin-ttf.css │ │ ├── noto-sans-sc-latin-woff.css │ │ ├── noto-sans-sc-latin-woff2.css │ │ ├── recursive-cyrillic-ext-ttf.css │ │ ├── recursive-cyrillic-ext-woff.css │ │ ├── recursive-cyrillic-ext-woff2.css │ │ ├── recursive-latin-ext-ttf.css │ │ ├── recursive-latin-ext-woff.css │ │ ├── recursive-latin-ext-woff2.css │ │ ├── recursive-latin-ttf.css │ │ ├── recursive-latin-woff.css │ │ ├── recursive-latin-woff2.css │ │ ├── recursive-vietnamese-ttf.css │ │ ├── recursive-vietnamese-woff.css │ │ ├── recursive-vietnamese-woff2.css │ │ ├── texturina-latin-ext-ttf.css │ │ ├── texturina-latin-ext-woff.css │ │ ├── texturina-latin-ext-woff2.css │ │ ├── texturina-latin-ttf.css │ │ ├── texturina-latin-woff.css │ │ ├── texturina-latin-woff2.css │ │ ├── texturina-vietnamese-ttf.css │ │ ├── texturina-vietnamese-woff.css │ │ ├── texturina-vietnamese-woff2.css │ │ ├── zilla-slab-highlight-latin-ext-ttf.css │ │ ├── zilla-slab-highlight-latin-ext-woff.css │ │ ├── zilla-slab-highlight-latin-ext-woff2.css │ │ ├── zilla-slab-highlight-latin-ttf.css │ │ ├── zilla-slab-highlight-latin-woff.css │ │ └── zilla-slab-highlight-latin-woff2.css │ ├── api-parser-v2 │ │ ├── abel-ttf.css │ │ ├── abel-woff.css │ │ ├── abel-woff2.css │ │ ├── ballet-ttf.css │ │ ├── ballet-woff.css │ │ ├── ballet-woff2.css │ │ ├── cardo-ttf.css │ │ ├── cardo-woff.css │ │ ├── cardo-woff2.css │ │ ├── noto-emoji-ttf.css │ │ ├── noto-emoji-woff.css │ │ ├── noto-emoji-woff2.css │ │ ├── noto-sans-jp-ttf.css │ │ ├── noto-sans-jp-woff.css │ │ ├── noto-sans-jp-woff2.css │ │ ├── noto-sans-sc-ttf.css │ │ ├── noto-sans-sc-woff.css │ │ ├── noto-sans-sc-woff2.css │ │ ├── recursive-ttf.css │ │ ├── recursive-woff.css │ │ ├── recursive-woff2.css │ │ ├── texturina-ttf.css │ │ ├── texturina-woff.css │ │ ├── texturina-woff2.css │ │ ├── zilla-slab-highlight-ttf.css │ │ ├── zilla-slab-highlight-woff.css │ │ └── zilla-slab-highlight-woff2.css │ ├── api-response.json │ ├── google-fonts-v1.json │ ├── google-fonts-v2.json │ ├── ital.textproto │ ├── user-agents.json │ ├── variable-parser │ │ ├── akshar-wght-normal.css │ │ ├── alegreya-wght-italic.css │ │ ├── alegreya-wght-normal.css │ │ ├── archivo-standard-italic.css │ │ ├── archivo-standard-normal.css │ │ ├── archivo-wdth-italic.css │ │ ├── archivo-wdth-normal.css │ │ ├── archivo-wght-italic.css │ │ ├── archivo-wght-normal.css │ │ ├── ballet-opsz-normal.css │ │ ├── ballet-standard-normal.css │ │ ├── fraunces-SOFT-italic.css │ │ ├── fraunces-SOFT-normal.css │ │ ├── fraunces-WONK-italic.css │ │ ├── fraunces-WONK-normal.css │ │ ├── fraunces-full-italic.css │ │ ├── fraunces-full-normal.css │ │ ├── fraunces-opsz-italic.css │ │ ├── fraunces-opsz-normal.css │ │ ├── fraunces-standard-italic.css │ │ ├── fraunces-standard-normal.css │ │ ├── fraunces-wght-italic.css │ │ ├── fraunces-wght-normal.css │ │ ├── recursive-CASL-normal.css │ │ ├── recursive-CRSV-normal.css │ │ ├── recursive-MONO-normal.css │ │ ├── recursive-full-normal.css │ │ ├── recursive-slnt-normal.css │ │ ├── recursive-standard-normal.css │ │ ├── recursive-wght-normal.css │ │ ├── roboto-flex-GRAD-normal.css │ │ ├── roboto-flex-XTRA-normal.css │ │ ├── roboto-flex-YOPQ-normal.css │ │ ├── roboto-flex-YTAS-normal.css │ │ ├── roboto-flex-YTDE-normal.css │ │ ├── roboto-flex-YTFI-normal.css │ │ ├── roboto-flex-YTLC-normal.css │ │ ├── roboto-flex-YTUC-normal.css │ │ ├── roboto-flex-full-normal.css │ │ ├── roboto-flex-opsz-normal.css │ │ ├── roboto-flex-slnt-normal.css │ │ ├── roboto-flex-standard-normal.css │ │ ├── roboto-flex-wdth-normal.css │ │ └── roboto-flex-wght-normal.css │ ├── variable-response.json │ ├── variable.json │ └── year.textproto ├── mocks │ ├── handlers.ts │ ├── index.ts │ └── server.ts ├── utils.test.ts ├── utils │ ├── generate-css-fixtures.ts │ ├── helpers.ts │ └── setup-tests.ts ├── validate.test.ts └── variable-parser.test.ts ├── tsconfig.json └── vitest.config.mts /.github/workflows/cron-run.yml: -------------------------------------------------------------------------------- 1 | name: Update Metadata [Monthly] 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 1 * *' 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: checkout 13 | uses: actions/checkout@v4 14 | 15 | - uses: oven-sh/setup-bun@v2 16 | with: 17 | bun-version: latest 18 | 19 | - name: Install 20 | run: bun install 21 | 22 | - name: Playwright Setup 23 | run: bunx playwright install --with-deps chromium 24 | 25 | - name: Generate API 26 | run: bun run cli generate $GOOGLE_API_KEY 27 | env: 28 | GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} 29 | 30 | - name: Parse API 31 | run: bun run cli parse 32 | 33 | - name: Stage, commit and push files 34 | uses: stefanzweifel/git-auto-commit-action@v4 35 | with: 36 | commit_user_name: 'fontsource-bot' 37 | commit_user_email: '83556432+fontsource-bot@users.noreply.github.com' 38 | commit_author: 'fontsource-bot <83556432+fontsource-bot@users.noreply.github.com>' 39 | commit_message: 'chore(build): update API [Weekly]' 40 | continue-on-error: true 41 | -------------------------------------------------------------------------------- /.github/workflows/manual-run-force.yml: -------------------------------------------------------------------------------- 1 | name: Update Metadata [Manual Force] 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: checkout 11 | uses: actions/checkout@v4 12 | 13 | - uses: oven-sh/setup-bun@v2 14 | with: 15 | bun-version: latest 16 | 17 | - name: Install 18 | run: bun install 19 | 20 | - name: Playwright Setup 21 | run: bunx playwright install --with-deps chromium 22 | 23 | - name: Generate API 24 | run: bun run cli generate $GOOGLE_API_KEY 25 | env: 26 | GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} 27 | 28 | - name: Parse API 29 | run: bun run cli parse --force 30 | 31 | - name: Stage, commit and push files 32 | uses: stefanzweifel/git-auto-commit-action@v4 33 | with: 34 | commit_user_name: 'fontsource-bot' 35 | commit_user_email: '83556432+fontsource-bot@users.noreply.github.com' 36 | commit_author: 'fontsource-bot <83556432+fontsource-bot@users.noreply.github.com>' 37 | commit_message: 'chore(build): update API [Manual Force]' 38 | continue-on-error: true 39 | -------------------------------------------------------------------------------- /.github/workflows/manual-run.yml: -------------------------------------------------------------------------------- 1 | name: Update Metadata [Manual] 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: checkout 11 | uses: actions/checkout@v4 12 | 13 | - uses: oven-sh/setup-bun@v2 14 | with: 15 | bun-version: latest 16 | 17 | - name: PLaywright Setup 18 | run: bunx playwright install --with-deps chromium 19 | 20 | - name: Generate API 21 | run: bun run cli generate $GOOGLE_API_KEY 22 | env: 23 | GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} 24 | 25 | - name: Parse API 26 | run: bun run cli parse 27 | 28 | - name: Stage, commit and push files 29 | uses: stefanzweifel/git-auto-commit-action@v4 30 | with: 31 | commit_user_name: 'fontsource-bot' 32 | commit_user_email: '83556432+fontsource-bot@users.noreply.github.com' 33 | commit_author: 'fontsource-bot <83556432+fontsource-bot@users.noreply.github.com>' 34 | commit_message: 'chore(build): update API [Manual]' 35 | continue-on-error: true 36 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Packager Tests 2 | on: 3 | pull_request: 4 | branches: [main] 5 | 6 | push: 7 | branches: [main] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: checkout 15 | uses: actions/checkout@v4 16 | 17 | - uses: oven-sh/setup-bun@v2 18 | with: 19 | bun-version: latest 20 | 21 | - name: Install 22 | run: bun install --frozen-lockfile 23 | 24 | - name: Run lints 25 | run: bun run lint 26 | 27 | - name: Run tests 28 | run: bun run test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # Mac files 58 | .DS_Store 59 | 60 | # Yarn 61 | yarn-error.log 62 | .pnp/ 63 | .pnp.js 64 | # Yarn Integrity file 65 | .yarn-integrity 66 | 67 | # IntelijIDEA 68 | .idea 69 | 70 | dist/ 71 | /test-results/ 72 | /playwright-report/ 73 | /blob-report/ 74 | /playwright/.cache/ 75 | -------------------------------------------------------------------------------- /.mise.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | bun = "latest" 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Lotus 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "vcs": { 4 | "enabled": true, 5 | "clientKind": "git", 6 | "useIgnoreFile": true 7 | }, 8 | "files": { 9 | "ignoreUnknown": true, 10 | "ignore": ["data/**/*", "*.css"] 11 | }, 12 | "formatter": { 13 | "enabled": true, 14 | "indentStyle": "tab" 15 | }, 16 | "organizeImports": { 17 | "enabled": true 18 | }, 19 | "linter": { 20 | "enabled": true, 21 | "rules": { 22 | "recommended": true 23 | } 24 | }, 25 | "javascript": { 26 | "formatter": { 27 | "quoteStyle": "single" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fontsource/google-font-metadata/5ab9fd98203ce6d5640a0cf20899258962019070/bun.lockb -------------------------------------------------------------------------------- /data/icons-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "family": "Material Icons", 4 | "variants": ["regular"], 5 | "subsets": ["latin"], 6 | "version": "v143", 7 | "lastModified": "2025-01-08", 8 | "category": "icons" 9 | }, 10 | { 11 | "family": "Material Icons Outlined", 12 | "variants": ["regular"], 13 | "subsets": ["latin"], 14 | "version": "v109", 15 | "lastModified": "2024-08-12", 16 | "category": "icons" 17 | }, 18 | { 19 | "family": "Material Icons Round", 20 | "variants": ["regular"], 21 | "subsets": ["latin"], 22 | "version": "v108", 23 | "lastModified": "2024-08-12", 24 | "category": "icons" 25 | }, 26 | { 27 | "family": "Material Icons Sharp", 28 | "variants": ["regular"], 29 | "subsets": ["latin"], 30 | "version": "v109", 31 | "lastModified": "2024-08-12", 32 | "category": "icons" 33 | }, 34 | { 35 | "family": "Material Icons Two Tone", 36 | "variants": ["regular"], 37 | "subsets": ["latin"], 38 | "version": "v112", 39 | "lastModified": "2024-08-12", 40 | "category": "icons" 41 | }, 42 | { 43 | "family": "Material Symbols Outlined", 44 | "variants": ["100", "200", "300", "regular", "500", "600", "700"], 45 | "subsets": ["latin"], 46 | "version": "v247", 47 | "lastModified": "2025-05-27", 48 | "category": "icons", 49 | "axes": { 50 | "FILL": {"min": "0", "max": "1", "default": "0", "step": "1"}, 51 | "wght": {"min": "100", "max": "700", "default": "400", "step": "1"}, 52 | "GRAD": {"min": "-25", "max": "200", "default": "0", "step": "1"}, 53 | "opsz": {"default": "48", "min": "30", "max": "48", "step": "0.1"} 54 | } 55 | }, 56 | { 57 | "family": "Material Symbols Rounded", 58 | "variants": ["100", "200", "300", "regular", "500", "600", "700"], 59 | "subsets": ["latin"], 60 | "version": "v248", 61 | "lastModified": "2025-05-27", 62 | "category": "icons", 63 | "axes": { 64 | "FILL": {"min": "0", "max": "1", "default": "0", "step": "1"}, 65 | "wght": {"min": "100", "max": "700", "default": "400", "step": "1"}, 66 | "GRAD": {"min": "-25", "max": "200", "default": "0", "step": "1"}, 67 | "opsz": {"default": "48", "min": "30", "max": "48", "step": "0.1"} 68 | } 69 | }, 70 | { 71 | "family": "Material Symbols Sharp", 72 | "variants": ["100", "200", "300", "regular", "500", "600", "700"], 73 | "subsets": ["latin"], 74 | "version": "v244", 75 | "lastModified": "2025-05-27", 76 | "category": "icons", 77 | "axes": { 78 | "FILL": {"min": "0", "max": "1", "default": "0", "step": "1"}, 79 | "wght": {"min": "100", "max": "700", "default": "400", "step": "1"}, 80 | "GRAD": {"min": "-25", "max": "200", "default": "0", "step": "1"}, 81 | "opsz": {"default": "48", "min": "30", "max": "48", "step": "0.1"} 82 | } 83 | } 84 | ] -------------------------------------------------------------------------------- /data/licenses.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /data/user-agents.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiv1": { 3 | "woff2": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/15.10130", 4 | "woff": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", 5 | "ttf": "Mozilla/5.0" 6 | }, 7 | "apiv2": { 8 | "variable": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36", 9 | "woff2": "Mozilla/5.0 (Windows NT 6.3; rv:39.0) Gecko/20100101 Firefox/44.0", 10 | "woff": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15", 11 | "ttf": "Mozilla/5.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-font-metadata", 3 | "description": "A metadata generator for Google Fonts.", 4 | "version": "6.0.3", 5 | "author": "Ayuhito ", 6 | "main": "./dist/index.js", 7 | "module": "./dist/index.mjs", 8 | "types": "./dist/index.d.ts", 9 | "exports": { 10 | "types": "./dist/index.d.ts", 11 | "require": "./dist/index.js", 12 | "import": "./dist/index.mjs" 13 | }, 14 | "bin": { 15 | "gfm": "./dist/cli.mjs" 16 | }, 17 | "license": "MIT", 18 | "keywords": [ 19 | "fontsource", 20 | "font", 21 | "font family", 22 | "google fonts", 23 | "metadata", 24 | "fonts api", 25 | "unicode range" 26 | ], 27 | "dependencies": { 28 | "@evan/concurrency": "^0.0.3", 29 | "@octokit/core": "^6.1.2", 30 | "cac": "^6.7.14", 31 | "consola": "^3.3.3", 32 | "deepmerge": "^4.3.1", 33 | "json-stringify-pretty-compact": "^4.0.0", 34 | "linkedom": "^0.18.6", 35 | "pathe": "^1.1.2", 36 | "picocolors": "^1.1.1", 37 | "playwright": "^1.49.1", 38 | "stylis": "^4.3.4", 39 | "zod": "^3.24.1" 40 | }, 41 | "devDependencies": { 42 | "@biomejs/biome": "1.9.4", 43 | "@types/bun": "latest", 44 | "@types/node": "^22.10.2", 45 | "@types/stylis": "^4.2.7", 46 | "c8": "^10.1.3", 47 | "magic-string": "^0.30.17", 48 | "msw": "^2.7.0", 49 | "pkgroll": "^2.6.0", 50 | "typescript": "^5.7.2", 51 | "vitest": "^2.1.8" 52 | }, 53 | "scripts": { 54 | "build": "pkgroll --target=node20", 55 | "dev": "pkgroll --target=node20 --watch", 56 | "clean": "bun exec 'rm -rf ./dist'", 57 | "cli": "bun run ./src/cli.ts", 58 | "test": "vitest", 59 | "test:generate-fixtures": "bun run ./tests/utils/generate-css-fixtures", 60 | "coverage": "vitest --coverage", 61 | "lint": "biome check --fix", 62 | "prepublishOnly": " bunx biome ci && bun run clean && bun run build" 63 | }, 64 | "files": ["dist/*", "data/*"], 65 | "homepage": "https://github.com/fontsource/google-font-metadata", 66 | "repository": { 67 | "type": "git", 68 | "url": "git+https://github.com/fontsource/google-font-metadata" 69 | }, 70 | "trustedDependencies": ["@biomejs/biome"] 71 | } 72 | -------------------------------------------------------------------------------- /src/api-gen.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | import { fileURLToPath } from 'node:url'; 3 | 4 | import { consola } from 'consola'; 5 | import stringify from 'json-stringify-pretty-compact'; 6 | import { dirname, join } from 'pathe'; 7 | 8 | import { stripIconsApiGen } from './icons-gen'; 9 | import type { APIResponse } from './types'; 10 | 11 | interface APIGenResponse { 12 | items: APIResponse[]; 13 | } 14 | 15 | const fetchURL = async (url: string): Promise => { 16 | const response = await fetch(url); 17 | 18 | if (!response.ok) { 19 | throw new Error( 20 | `Response code ${response.status} (${response.statusText})`, 21 | ); 22 | } 23 | 24 | const items = (await response.json()) as APIGenResponse; 25 | 26 | // Google ships icons into the API, so we have to separate them 27 | const stripped = await stripIconsApiGen(items.items); 28 | 29 | await fs.writeFile( 30 | join(dirname(fileURLToPath(import.meta.url)), '../data/api-response.json'), 31 | stringify(stripped), 32 | ); 33 | }; 34 | 35 | const baseurl = 36 | 'https://www.googleapis.com/webfonts/v1/webfonts?fields=items(category%2Cfamily%2ClastModified%2Csubsets%2Cvariants%2Cversion)&key='; 37 | 38 | /** 39 | * This fetches the Google Fonts Developer API for all the basic metadata available. 40 | * 41 | * {@link https://developers.google.com/fonts/docs/developer_api} 42 | * @param key Google API key 43 | */ 44 | export const fetchAPI = async (key: string): Promise => { 45 | if (key) { 46 | try { 47 | await fetchURL(baseurl + key); 48 | consola.success('Successful Google Font API fetch.'); 49 | } catch (error) { 50 | throw new Error(`API fetch error: ${String(error)}`); 51 | } 52 | } else { 53 | throw new Error('The API key is required!'); 54 | } 55 | }; 56 | -------------------------------------------------------------------------------- /src/errors.ts: -------------------------------------------------------------------------------- 1 | import consola from 'consola'; 2 | 3 | const errs: string[] = []; 4 | 5 | export const LOOP_LIMIT = 5; 6 | 7 | export const addError = (error: string) => { 8 | errs.push(error); 9 | }; 10 | 11 | export const checkErrors = (limit = 0) => { 12 | if (errs.length > limit) { 13 | for (const err of errs) { 14 | consola.error(err); 15 | } 16 | 17 | if (limit > 0) { 18 | throw new Error('Too many errors occurred during parsing. Stopping...'); 19 | } 20 | 21 | throw new Error('Some fonts experienced errors during parsing.'); 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /src/icons-gen.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | import { fileURLToPath } from 'node:url'; 3 | 4 | import stringify from 'json-stringify-pretty-compact'; 5 | import { dirname, join } from 'pathe'; 6 | 7 | import type { APIResponse, AxesFontObject } from './types'; 8 | 9 | // THIS IS MANUALLY MAINTAINED UNTIL WE FIND A BETTER WAY TO DO THIS 10 | const iconFamilies = new Set([ 11 | 'Material Icons', 12 | 'Material Icons Outlined', 13 | 'Material Icons Round', 14 | 'Material Icons Sharp', 15 | 'Material Icons Two Tone', 16 | ]); 17 | 18 | const variableIconFamilies = new Set([ 19 | 'Material Symbols Outlined', 20 | 'Material Symbols Rounded', 21 | 'Material Symbols Sharp', 22 | ]); 23 | 24 | const iconAxes: AxesFontObject = { 25 | FILL: { 26 | min: '0', 27 | max: '1', 28 | default: '0', 29 | step: '1', 30 | }, 31 | wght: { 32 | min: '100', 33 | max: '700', 34 | default: '400', 35 | step: '1', 36 | }, 37 | GRAD: { 38 | min: '-25', 39 | max: '200', 40 | default: '0', 41 | step: '1', 42 | }, 43 | opsz: { 44 | default: '48', 45 | min: '30', 46 | max: '48', 47 | step: '0.1', 48 | }, 49 | }; 50 | 51 | // Remove all icon families from the API and save those objects into a separate file 52 | export const stripIconsApiGen = async ( 53 | api: APIResponse[], 54 | ): Promise => { 55 | const stripped: APIResponse[] = []; 56 | const icons = []; 57 | 58 | for (const font of api) { 59 | if (iconFamilies.has(font.family)) { 60 | icons.push(Object.assign(font, { category: 'icons' })); 61 | } else if (variableIconFamilies.has(font.family)) { 62 | icons.push(Object.assign(font, { axes: iconAxes, category: 'icons' })); 63 | } else { 64 | stripped.push(font); 65 | } 66 | } 67 | 68 | // Write the icon families to a separate file 69 | await fs.writeFile( 70 | join( 71 | dirname(fileURLToPath(import.meta.url)), 72 | '../data/icons-response.json', 73 | ), 74 | stringify(icons), 75 | ); 76 | 77 | return stripped; 78 | }; 79 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { fetchAPI } from './api-gen'; 2 | export { parsev1 } from './api-parser-v1'; 3 | export { parsev2 } from './api-parser-v2'; 4 | export { generateAxis } from './axis-gen'; 5 | export { 6 | APIDirect, 7 | APIIconDirect, 8 | APIIconStatic, 9 | APIIconVariable, 10 | APILicense, 11 | APIRegistry, 12 | APIv1, 13 | APIv2, 14 | APIVariable, 15 | APIVariableDirect, 16 | } from './data'; 17 | export { parseIcons } from './icons-parser'; 18 | export { parseLicenses } from './license'; 19 | export type { 20 | APIIconResponse, 21 | APIResponse, 22 | AxesObject, 23 | FontObject, 24 | FontObjectV1, 25 | FontObjectV2, 26 | FontObjectVariable, 27 | FontObjectVariableDirect, 28 | FontVariants, 29 | FontVariantsVariable, 30 | Licenses, 31 | } from './types'; 32 | export { fetchVariable } from './variable-gen'; 33 | export { parseVariable } from './variable-parser'; 34 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import type { FontObject } from './types'; 2 | 3 | // Alphabetically order the generated font object lists 4 | export const orderObject = (unordered: FontObject): FontObject => { 5 | const ordered: FontObject = {}; 6 | const orderedKeys = Object.keys(unordered).sort(); 7 | 8 | for (const key of orderedKeys) { 9 | ordered[key] = unordered[key]; 10 | } 11 | 12 | return ordered; 13 | }; 14 | 15 | // Convert APIResponse.variants into a weights number[] 16 | export const weightListGen = (variants: string[]): number[] => { 17 | // Replace regular and italic with numeric values 18 | const replacedList = variants.map((variant) => { 19 | if (variant === 'regular' || variant === 'italic') { 20 | return '400'; 21 | } 22 | return variant; 23 | }); 24 | // Remove variants like 700italic to become 700 25 | const cleanedList = replacedList.map((variant) => 26 | variant.replaceAll('italic', ''), 27 | ); 28 | 29 | // Convert from string to number 30 | const numberList = cleanedList.map((val) => { 31 | const newVal = Number(val); 32 | if (Number.isNaN(newVal)) { 33 | throw new TypeError(`Invalid value: ${val}`); 34 | } 35 | return newVal; 36 | }); 37 | 38 | const numberListWithoutDuplicates = [...new Set(numberList)]; 39 | 40 | return numberListWithoutDuplicates; 41 | }; 42 | -------------------------------------------------------------------------------- /src/validate.ts: -------------------------------------------------------------------------------- 1 | import { consola } from 'consola'; 2 | import colors from 'picocolors'; 3 | 4 | import { APIVariable, APIv1, APIv2 } from './data'; 5 | import { fontObjectValidate, fontObjectVariableValidate } from './schema'; 6 | import type { FontObject } from './types'; 7 | 8 | type Version = 'v1' | 'v2' | 'variable'; 9 | 10 | const validate = (version: Version, data: FontObject) => { 11 | consola.info( 12 | `Validating metadata... ${colors.bold( 13 | colors.yellow(`[API ${version.toUpperCase()}]`), 14 | )}`, 15 | ); 16 | switch (version) { 17 | case 'v1': { 18 | fontObjectValidate(data, 'v1'); 19 | break; 20 | } 21 | case 'v2': { 22 | fontObjectValidate(data, 'v2'); 23 | break; 24 | } 25 | case 'variable': { 26 | fontObjectVariableValidate(data); 27 | break; 28 | } 29 | default: { 30 | throw new Error('Invalid validation version.'); 31 | } 32 | } 33 | consola.success('Metadata valid!'); 34 | }; 35 | 36 | const validateCLI = (version: Version) => { 37 | let data: FontObject; 38 | switch (version) { 39 | case 'v1': { 40 | data = APIv1; 41 | break; 42 | } 43 | case 'v2': { 44 | data = APIv2; 45 | break; 46 | } 47 | case 'variable': { 48 | data = APIVariable; 49 | break; 50 | } 51 | default: { 52 | throw new Error('Invalid validation version.'); 53 | } 54 | } 55 | 56 | validate(version, data); 57 | }; 58 | 59 | export { validate, validateCLI }; 60 | -------------------------------------------------------------------------------- /tests/api-gen.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | 3 | import stringify from 'json-stringify-pretty-compact'; 4 | import { describe, expect, it, vi } from 'vitest'; 5 | 6 | import { fetchAPI } from '../src/api-gen'; 7 | import APIResponse from './fixtures/api-response.json'; 8 | import { apiGenHandlers, setupAPIServer } from './mocks/index'; 9 | 10 | vi.mock('node:fs/promises'); 11 | 12 | describe('API Gen', () => { 13 | setupAPIServer(apiGenHandlers); 14 | 15 | it('returns successful API response', async () => { 16 | await expect(fetchAPI('testkey')).resolves.not.toThrow(); 17 | expect(vi.mocked(fs.writeFile)).toHaveBeenCalledWith( 18 | expect.anything(), 19 | stringify(APIResponse), 20 | ); 21 | }); 22 | 23 | it('errors due to no key', async () => { 24 | await expect(fetchAPI('')).rejects.toThrow('API key is required'); 25 | }); 26 | 27 | it('errors due to bad request', async () => { 28 | await expect(fetchAPI('fail')).rejects.toThrow( 29 | 'API fetch error: Error: Response code 400 ()', 30 | ); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /tests/api-parser-v1.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | 3 | import stringify from 'json-stringify-pretty-compact'; 4 | import { describe, expect, it, vi } from 'vitest'; 5 | 6 | import type { FontObjectV1 } from '../src'; 7 | import { fetchAllCSS, parsev1, processCSS } from '../src/api-parser-v1'; 8 | import * as data from '../src/data'; 9 | import APIResponse from './fixtures/api-response.json'; 10 | import APIv1 from './fixtures/google-fonts-v1.json'; 11 | import { apiParseV1Handlers, setupAPIServer } from './mocks/index'; 12 | import { cssFixture, idGen } from './utils/helpers'; 13 | 14 | vi.mock('node:fs/promises'); 15 | vi.mock('../src/data'); 16 | 17 | describe('API Parser v1', () => { 18 | setupAPIServer(apiParseV1Handlers); 19 | 20 | describe('Fetch CSS', () => { 21 | it('Returns all subsets of CSS together', async () => { 22 | const texturinaFont = APIResponse[7]; 23 | const test = await fetchAllCSS(texturinaFont); 24 | 25 | // WOFF2 Tuple 26 | expect(test[0]).toContain( 27 | cssFixture('texturina', 'woff2', 'v1', 'latin'), 28 | ); 29 | expect(test[0]).toContain('/* latin */'); 30 | 31 | // WOFF Tuple 32 | expect(test[1]).toContain( 33 | cssFixture('texturina', 'woff', 'v1', 'latin-ext'), 34 | ); 35 | expect(test[1]).toContain('/* latin-ext */'); 36 | 37 | // TTF Tuple 38 | expect(test[2]).toContain( 39 | cssFixture('texturina', 'ttf', 'v1', 'vietnamese'), 40 | ); 41 | expect(test[2]).toContain('/* vietnamese */'); 42 | }); 43 | 44 | it('Throws with bad request', async () => { 45 | const texturinaFont = { ...APIResponse[7] }; // Vitest gimmick where modifying obj directly affects all other tests 46 | texturinaFont.subsets = ['test']; // False subset 47 | await expect( 48 | async () => await fetchAllCSS(texturinaFont), 49 | ).rejects.toThrow( 50 | 'CSS fetch error (v1): Response code 400 ()\nURL: https://fonts.googleapis.com/css?subset=test&family=Texturina:100,200,300,400,500,600,700,800,900,100italic,200italic,300italic,italic,500italic,600italic,700italic,800italic,900italic', 51 | ); 52 | }); 53 | }); 54 | 55 | describe('Process CSS', () => { 56 | it('Returns valid font object', async () => { 57 | const newAPIv1 = APIv1 as FontObjectV1; // Need to type assert as a more generic obj else we can't pick using id var 58 | 59 | for (const font of APIResponse) { 60 | const id = idGen(font.family); 61 | const validFontObj = { [id]: newAPIv1[id] }; 62 | 63 | const css = await fetchAllCSS(font); 64 | expect(processCSS(css, font)).toMatchObject(validFontObj); 65 | } 66 | }); 67 | }); 68 | 69 | describe('Full parse and order', () => { 70 | vi.spyOn(data, 'APIv1', 'get').mockReturnValue(APIv1); 71 | vi.spyOn(data, 'APIDirect', 'get').mockReturnValue(APIResponse); 72 | 73 | it('Copies APIv1 as a cache since force flag is false', async () => { 74 | await parsev1(false, false); 75 | expect(vi.mocked(fs.writeFile)).toHaveBeenCalledWith( 76 | expect.anything(), 77 | stringify(APIv1), 78 | ); 79 | }); 80 | 81 | it('Force parses mock API and writes correct metadata', async () => { 82 | await parsev1(true, false); 83 | expect(vi.mocked(fs.writeFile)).toHaveBeenCalledWith( 84 | expect.anything(), 85 | stringify(APIv1), 86 | ); 87 | }); 88 | }); 89 | }); 90 | -------------------------------------------------------------------------------- /tests/api-parser-v2.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | 3 | import stringify from 'json-stringify-pretty-compact'; 4 | import { describe, expect, it, vi } from 'vitest'; 5 | 6 | import type { FontObjectV2 } from '../src'; 7 | import { fetchAllCSS, parsev2, processCSS } from '../src/api-parser-v2'; 8 | import * as data from '../src/data'; 9 | import APIResponse from './fixtures/api-response.json'; 10 | import APIv2 from './fixtures/google-fonts-v2.json'; 11 | import { apiParseV2Handlers, setupAPIServer } from './mocks/index'; 12 | import { cssFixture } from './utils/helpers'; 13 | 14 | vi.mock('node:fs/promises'); 15 | vi.mock('../src/data'); 16 | 17 | describe('API Parser v2', () => { 18 | setupAPIServer(apiParseV2Handlers); 19 | 20 | describe('Fetch CSS', () => { 21 | it('Returns all subsets of CSS together', async () => { 22 | const texturinaFont = APIResponse[7]; 23 | const test = await fetchAllCSS(texturinaFont); 24 | 25 | // WOFF2 Tuple 26 | expect(test[0]).toContain(cssFixture('texturina', 'woff2', 'v2')); 27 | 28 | // WOFF Tuple 29 | expect(test[1]).toContain(cssFixture('texturina', 'woff', 'v2')); 30 | 31 | // TTF Tuple 32 | expect(test[2]).toContain(cssFixture('texturina', 'ttf', 'v2')); 33 | }); 34 | 35 | it('Throws with bad request', async () => { 36 | const texturinaFont = { ...APIResponse[7] }; // Make deep copy of fixture. 37 | texturinaFont.family = 'test'; // False family 38 | await expect( 39 | async () => await fetchAllCSS(texturinaFont), 40 | ).rejects.toThrow( 41 | 'CSS fetch error (v2): Response code 400 ()\nURL: https://fonts.googleapis.com/css2?family=test:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900', 42 | ); 43 | }); 44 | }); 45 | 46 | describe('Process CSS', () => { 47 | it('Returns valid font object', async () => { 48 | for (const font of APIResponse) { 49 | const css = await fetchAllCSS(font); 50 | expect(processCSS(css, font)).toMatchSnapshot(); 51 | } 52 | }); 53 | }); 54 | 55 | describe('Full parse and order', () => { 56 | vi.spyOn(data, 'APIv2', 'get').mockReturnValue(APIv2 as FontObjectV2); 57 | vi.spyOn(data, 'APIDirect', 'get').mockReturnValue(APIResponse); 58 | 59 | it('Copies APIv2 as a cache since force flag is false', async () => { 60 | await parsev2(false, false); 61 | expect(vi.mocked(fs.writeFile)).toHaveBeenCalledWith( 62 | expect.anything(), 63 | stringify(APIv2), 64 | ); 65 | }); 66 | 67 | it('Force parses mock API and writes correct metadata', async () => { 68 | await parsev2(true, false); 69 | expect(vi.mocked(fs.writeFile)).toHaveBeenCalledWith( 70 | expect.anything(), 71 | stringify(APIv2), 72 | ); 73 | }); 74 | }); 75 | }); 76 | -------------------------------------------------------------------------------- /tests/axis-gen.test.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs/promises'; 2 | import { fileURLToPath } from 'node:url'; 3 | 4 | import path from 'pathe'; 5 | import { describe, expect, it } from 'vitest'; 6 | 7 | import { parseProto } from '../src/axis-gen'; 8 | 9 | describe('axis gen', () => { 10 | it('successfully parses ital text proto', async () => { 11 | const textproto = await fs.readFile( 12 | path.join( 13 | path.dirname(fileURLToPath(import.meta.url)), 14 | './fixtures/ital.textproto', 15 | ), 16 | 'utf8', 17 | ); 18 | const result = parseProto(textproto); 19 | expect(result).toEqual({ 20 | display_name: 'Italic', 21 | tag: 'ital', 22 | description: 23 | 'Adjust the style from roman to italic. This can be provided as a continuous range within a single font file, like most axes, or as a toggle between two roman and italic files that form a family as a pair.', 24 | min_value: '0', 25 | max_value: '1', 26 | default_value: '0', 27 | precision: '0', 28 | }); 29 | }); 30 | 31 | it('successfully parses year text proto', async () => { 32 | const textproto = await fs.readFile( 33 | path.join( 34 | path.dirname(fileURLToPath(import.meta.url)), 35 | './fixtures/year.textproto', 36 | ), 37 | 'utf8', 38 | ); 39 | const result = parseProto(textproto); 40 | expect(result).toEqual({ 41 | display_name: 'Year', 42 | tag: 'YEAR', 43 | description: 44 | 'Axis that shows in a metaphoric way the effect of time on a chosen topic.', 45 | min_value: '-4000', 46 | max_value: '4000', 47 | default_value: '2000', 48 | precision: '0', 49 | }); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/abel-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Abel'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2V9BOA.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/abel-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Abel'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2V9BOw.woff) format('woff'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/abel-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Abel'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2V9BPQ.woff2) format('woff2'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4i0Fg.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4i0FQ.woff) format('woff'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4i0Ew.woff2) format('woff2'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4a0Fg.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4a0FQ.woff) format('woff'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4a0Ew.woff2) format('woff2'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-vietnamese-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4m0Fg.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-vietnamese-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4m0FQ.woff) format('woff'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/ballet-vietnamese-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4m0Ew.woff2) format('woff2'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I8x2Q.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv03IQ.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQa-WY.ttf) format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I8x2g.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv03Ic.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQa-WU.woff) format('woff'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I8x3A.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv03IE.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQa-WM.woff2) format('woff2'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IAx2Q.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv73IQ.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQV-WY.ttf) format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IAx2g.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv73Ic.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQV-WU.woff) format('woff'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-greek-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IAx3A.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv73IE.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQV-WM.woff2) format('woff2'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I0x2Q.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv23IQ.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQY-WY.ttf) format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I0x2g.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv23Ic.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQY-WU.woff) format('woff'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I0x3A.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv23IE.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQY-WM.woff2) format('woff2'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IMx2Q.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv43IQ.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQW-WY.ttf) format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IMx2g.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv43Ic.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQW-WU.woff) format('woff'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/cardo-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IMx3A.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv43IE.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQW-WM.woff2) format('woff2'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-emoji-emoji-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Emoji'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10gyNYMVO.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Emoji'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0gyNYMVO.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Emoji'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0gyNYMVO.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Emoji'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911QyNYMVO.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Emoji'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1QyNYMVO.ttf) format('truetype'); 30 | } 31 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-emoji-emoji-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Emoji'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10gyNYMVN.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Emoji'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0gyNYMVN.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Emoji'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0gyNYMVN.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Emoji'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911QyNYMVN.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Emoji'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1QyNYMVN.woff) format('woff'); 30 | } 31 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-emoji-emoji-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Emoji'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10gyNYMVL.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Emoji'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0gyNYMVL.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Emoji'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0gyNYMVL.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Emoji'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911QyNYMVL.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Emoji'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notoemoji/v24/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1QyNYMVL.woff2) format('woff2'); 30 | } 31 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-japanese-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgF8lE.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa3Xdj.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYyQgM.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa3Xdj.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a3Xdj.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a3Xdj.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-japanese-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgF8lQ.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa3Xdm.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYyQgJ.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa3Xdm.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a3Xdm.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a3Xdm.woff) format('woff'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-japanese-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgF8lI.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa3Xdg.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYyQgP.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa3Xdg.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a3Xdg.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a3Xdg.woff2) format('woff2'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgN8lE.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa1Xdj.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYwQgM.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa1Xdj.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a1Xdj.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a1Xdj.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgN8lQ.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa1Xdm.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYwQgJ.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa1Xdm.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a1Xdm.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a1Xdm.woff) format('woff'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-jp-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQojgN8lI.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioa1Xdg.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFYwQgP.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisa1Xdg.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0a1Xdg.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8a1Xdg.woff2) format('woff2'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-chinese-simplified-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKv0Qk.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd0y_4.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRC4KL.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd0y_4.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed0y_4.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd0y_4.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-chinese-simplified-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKv0Qw.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd0y_9.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRC4KO.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd0y_9.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed0y_9.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd0y_9.woff) format('woff'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-chinese-simplified-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKv0Qo.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd0y_7.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRC4KI.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd0y_7.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed0y_7.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd0y_7.woff2) format('woff2'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKK0Qk.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd9i_4.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRLoKL.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd9i_4.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed9i_4.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd9i_4.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKK0Qw.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd9i_9.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRLoKO.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd9i_9.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed9i_9.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd9i_9.woff) format('woff'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/noto-sans-sc-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTbKK0Qo.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCd9i_7.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALRLoKI.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGd9i_7.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaed9i_7.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWd9i_7.woff2) format('woff2'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-cyrillic-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck312tQg.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk312tQg.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk312tQg.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH12tQg.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH12tQg.ttf) format('truetype'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH12tQg.ttf) format('truetype'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH12tQg.ttf) format('truetype'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-cyrillic-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck312tQs.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk312tQs.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk312tQs.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH12tQs.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH12tQs.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH12tQs.woff) format('woff'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH12tQs.woff) format('woff'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-cyrillic-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck312tQ0.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk312tQ0.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk312tQ0.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH12tQ0.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH12tQ0.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH12tQ0.woff2) format('woff2'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH12tQ0.woff2) format('woff2'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck311tQg.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk311tQg.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk311tQg.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH11tQg.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH11tQg.ttf) format('truetype'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH11tQg.ttf) format('truetype'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH11tQg.ttf) format('truetype'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck311tQs.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk311tQs.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk311tQs.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH11tQs.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH11tQs.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH11tQs.woff) format('woff'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH11tQs.woff) format('woff'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck311tQ0.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk311tQ0.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk311tQ0.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH11tQ0.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH11tQ0.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH11tQ0.woff2) format('woff2'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH11tQ0.woff2) format('woff2'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck317tQg.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk317tQg.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk317tQg.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH17tQg.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH17tQg.ttf) format('truetype'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH17tQg.ttf) format('truetype'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH17tQg.ttf) format('truetype'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck317tQs.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk317tQs.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk317tQs.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH17tQs.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH17tQs.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH17tQs.woff) format('woff'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH17tQs.woff) format('woff'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck317tQ0.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk317tQ0.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk317tQ0.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH17tQ0.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH17tQ0.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH17tQ0.woff2) format('woff2'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH17tQ0.woff2) format('woff2'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-vietnamese-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck310tQg.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk310tQg.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk310tQg.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH10tQg.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH10tQg.ttf) format('truetype'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH10tQg.ttf) format('truetype'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH10tQg.ttf) format('truetype'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-vietnamese-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck310tQs.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk310tQs.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk310tQs.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH10tQs.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH10tQs.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH10tQs.woff) format('woff'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH10tQs.woff) format('woff'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/recursive-vietnamese-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck310tQ0.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk310tQ0.woff2) format('woff2'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk310tQ0.woff2) format('woff2'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclH10tQ0.woff2) format('woff2'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllH10tQ0.woff2) format('woff2'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClH10tQ0.woff2) format('woff2'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlH10tQ0.woff2) format('woff2'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-ext-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitBaWQ.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THTxaGE.ttf) format('truetype'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-ext-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitBaWc.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THTxaGI.woff) format('woff'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-ext-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitBaWE.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THTxaGQ.woff2) format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitPaWQ.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THT_aGE.ttf) format('truetype'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-woff.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitPaWc.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THT_aGI.woff) format('woff'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v1/zilla-slab-highlight-latin-woff2.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitPaWE.woff2) format('woff2'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THT_aGQ.woff2) format('woff2'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/abel-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Abel'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE6Vg.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/abel-woff.css: -------------------------------------------------------------------------------- 1 | /* latin */ 2 | @font-face { 3 | font-family: 'Abel'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2V9BO7h5uGM.woff) format('woff'); 7 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 8 | } 9 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/abel-woff2.css: -------------------------------------------------------------------------------- 1 | /* latin */ 2 | @font-face { 3 | font-family: 'Abel'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/abel/v18/MwQ5bhbm2POE2V9BPQ.woff2) format('woff2'); 7 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 8 | } 9 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/ballet-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Ballet'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3C4E.ttf) format('truetype'); 6 | } 7 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/ballet-woff.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Ballet'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4m0FQItq6f9IRnL.woff) format('woff'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Ballet'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4i0FQItq6f9IRnL.woff) format('woff'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Ballet'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4a0FQItq6f9IQ.woff) format('woff'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/ballet-woff2.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Ballet'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4m0ExAo.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Ballet'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4i0ExAo.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Ballet'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYyz_MYZA-HM4NjuGOVnUEXme1I4Xi3O4a0Ew.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/cardo-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Cardo'; 3 | font-style: italic; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv93IQ.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Cardo'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqiv_.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Cardo'; 15 | font-style: normal; 16 | font-weight: 700; 17 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-aQR.ttf) format('truetype'); 18 | } 19 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/cardo-woff2.css: -------------------------------------------------------------------------------- 1 | /* greek-ext */ 2 | @font-face { 3 | font-family: 'Cardo'; 4 | font-style: italic; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I8x3F5O.woff2) format('woff2'); 7 | unicode-range: U+1F00-1FFF; 8 | } 9 | /* greek */ 10 | @font-face { 11 | font-family: 'Cardo'; 12 | font-style: italic; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IAx3F5O.woff2) format('woff2'); 15 | unicode-range: U+0370-03FF; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Cardo'; 20 | font-style: italic; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97I0x3F5O.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Cardo'; 28 | font-style: italic; 29 | font-weight: 400; 30 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpxgwjKBV1pqhv97IMx3A.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | /* greek-ext */ 34 | @font-face { 35 | font-family: 'Cardo'; 36 | font-style: normal; 37 | font-weight: 400; 38 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv03IEp2A.woff2) format('woff2'); 39 | unicode-range: U+1F00-1FFF; 40 | } 41 | /* greek */ 42 | @font-face { 43 | font-family: 'Cardo'; 44 | font-style: normal; 45 | font-weight: 400; 46 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv73IEp2A.woff2) format('woff2'); 47 | unicode-range: U+0370-03FF; 48 | } 49 | /* latin-ext */ 50 | @font-face { 51 | font-family: 'Cardo'; 52 | font-style: normal; 53 | font-weight: 400; 54 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv23IEp2A.woff2) format('woff2'); 55 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 56 | } 57 | /* latin */ 58 | @font-face { 59 | font-family: 'Cardo'; 60 | font-style: normal; 61 | font-weight: 400; 62 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlp_gwjKBV1pqhv43IE.woff2) format('woff2'); 63 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 64 | } 65 | /* greek-ext */ 66 | @font-face { 67 | font-family: 'Cardo'; 68 | font-style: normal; 69 | font-weight: 700; 70 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQa-WN3aQ.woff2) format('woff2'); 71 | unicode-range: U+1F00-1FFF; 72 | } 73 | /* greek */ 74 | @font-face { 75 | font-family: 'Cardo'; 76 | font-style: normal; 77 | font-weight: 700; 78 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQV-WN3aQ.woff2) format('woff2'); 79 | unicode-range: U+0370-03FF; 80 | } 81 | /* latin-ext */ 82 | @font-face { 83 | font-family: 'Cardo'; 84 | font-style: normal; 85 | font-weight: 700; 86 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQY-WN3aQ.woff2) format('woff2'); 87 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 88 | } 89 | /* latin */ 90 | @font-face { 91 | font-family: 'Cardo'; 92 | font-style: normal; 93 | font-weight: 700; 94 | src: url(https://fonts.gstatic.com/s/cardo/v19/wlpygwjKBV1pqhND-ZQW-WM.woff2) format('woff2'); 95 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 96 | } 97 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/noto-emoji-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Emoji'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/notoemoji/v34/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob_10jwv.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Emoji'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/notoemoji/v34/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-r0jwv.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Emoji'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/notoemoji/v34/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob-Z0jwv.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Emoji'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/notoemoji/v34/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob911Twv.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Emoji'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notoemoji/v34/bMrnmSyK7YY-MEu6aWjPDs-ar6uWaGWuob9M1Twv.ttf) format('truetype'); 30 | } 31 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/noto-sans-jp-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans JP'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6ofjtqLzI2JPCgQBnw7HFQoggM.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans JP'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQaioq1A.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans JP'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F62fjtqLzI2JPCgQBnw7HFowA.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans JP'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQMisq1A.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans JP'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQei0q1A.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans JP'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosansjp/v42/-F6pfjtqLzI2JPCgQBnw7HFQQi8q1A.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/noto-sans-sc-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Noto Sans SC'; 3 | font-style: normal; 4 | font-weight: 100; 5 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kJo84MPvpLmixcA63oeALZTYKL.otf) format('opentype'); 6 | } 7 | @font-face { 8 | font-family: 'Noto Sans SC'; 9 | font-style: normal; 10 | font-weight: 300; 11 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZhaCt9w.otf) format('opentype'); 12 | } 13 | @font-face { 14 | font-family: 'Noto Sans SC'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kXo84MPvpLmixcA63oeALhLw.otf) format('opentype'); 18 | } 19 | @font-face { 20 | font-family: 'Noto Sans SC'; 21 | font-style: normal; 22 | font-weight: 500; 23 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZ3aGt9w.otf) format('opentype'); 24 | } 25 | @font-face { 26 | font-family: 'Noto Sans SC'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZlaet9w.otf) format('opentype'); 30 | } 31 | @font-face { 32 | font-family: 'Noto Sans SC'; 33 | font-style: normal; 34 | font-weight: 900; 35 | src: url(https://fonts.gstatic.com/s/notosanssc/v26/k3kIo84MPvpLmixcA63oeALZraWt9w.otf) format('opentype'); 36 | } 37 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/recursive-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Recursive'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadDck018.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Recursive'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCCk018.ttf) format('truetype'); 12 | } 13 | @font-face { 14 | font-family: 'Recursive'; 15 | font-style: normal; 16 | font-weight: 500; 17 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadCwk018.ttf) format('truetype'); 18 | } 19 | @font-face { 20 | font-family: 'Recursive'; 21 | font-style: normal; 22 | font-weight: 600; 23 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBclE18.ttf) format('truetype'); 24 | } 25 | @font-face { 26 | font-family: 'Recursive'; 27 | font-style: normal; 28 | font-weight: 700; 29 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadBllE18.ttf) format('truetype'); 30 | } 31 | @font-face { 32 | font-family: 'Recursive'; 33 | font-style: normal; 34 | font-weight: 800; 35 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadAClE18.ttf) format('truetype'); 36 | } 37 | @font-face { 38 | font-family: 'Recursive'; 39 | font-style: normal; 40 | font-weight: 900; 41 | src: url(https://fonts.gstatic.com/s/recursive/v37/8vJN7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUvz2xbXfn1uEQadArlE18.ttf) format('truetype'); 42 | } 43 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/zilla-slab-highlight-ttf.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Zilla Slab Highlight'; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxhtI.ttf) format('truetype'); 6 | } 7 | @font-face { 8 | font-family: 'Zilla Slab Highlight'; 9 | font-style: normal; 10 | font-weight: 700; 11 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0TET4.ttf) format('truetype'); 12 | } 13 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/zilla-slab-highlight-woff.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Zilla Slab Highlight'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitBaWfSSmlN6d8.woff) format('woff'); 7 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 8 | } 9 | /* latin */ 10 | @font-face { 11 | font-family: 'Zilla Slab Highlight'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitPaWfSSmlN.woff) format('woff'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Zilla Slab Highlight'; 20 | font-style: normal; 21 | font-weight: 700; 22 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THTxaGJn09b7fec.woff) format('woff'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Zilla Slab Highlight'; 28 | font-style: normal; 29 | font-weight: 700; 30 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THT_aGJn09b7.woff) format('woff'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/api-parser-v2/zilla-slab-highlight-woff2.css: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Zilla Slab Highlight'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitBaWHASQ.woff2) format('woff2'); 7 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 8 | } 9 | /* latin */ 10 | @font-face { 11 | font-family: 'Zilla Slab Highlight'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMbW2BrTpK8-inLtBJgMMfbm6uNVDvRxitPaWE.woff2) format('woff2'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Zilla Slab Highlight'; 20 | font-style: normal; 21 | font-weight: 700; 22 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THTxaGR10A.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Zilla Slab Highlight'; 28 | font-style: normal; 29 | font-weight: 700; 30 | src: url(https://fonts.gstatic.com/s/zillaslabhighlight/v17/gNMUW2BrTpK8-inLtBJgMMfbm6uNVDvRxiP0THT_aGQ.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/api-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "family": "Abel", 4 | "variants": ["regular"], 5 | "subsets": ["latin"], 6 | "version": "v18", 7 | "lastModified": "2022-04-20", 8 | "category": "sans-serif" 9 | }, 10 | { 11 | "family": "Ballet", 12 | "variants": ["regular"], 13 | "subsets": ["latin", "latin-ext", "vietnamese"], 14 | "version": "v21", 15 | "lastModified": "2022-06-27", 16 | "category": "handwriting" 17 | }, 18 | { 19 | "family": "Cardo", 20 | "variants": ["regular", "italic", "700"], 21 | "subsets": ["greek", "greek-ext", "latin", "latin-ext"], 22 | "version": "v19", 23 | "lastModified": "2022-04-21", 24 | "category": "serif" 25 | }, 26 | { 27 | "family": "Noto Emoji", 28 | "variants": ["300", "regular", "500", "600", "700"], 29 | "subsets": ["emoji"], 30 | "version": "v24", 31 | "lastModified": "2022-05-02", 32 | "category": "sans-serif" 33 | }, 34 | { 35 | "family": "Noto Sans JP", 36 | "variants": ["100", "300", "regular", "500", "700", "900"], 37 | "subsets": ["japanese", "latin"], 38 | "version": "v42", 39 | "lastModified": "2022-05-10", 40 | "category": "sans-serif" 41 | }, 42 | { 43 | "family": "Noto Sans SC", 44 | "variants": ["100", "300", "regular", "500", "700", "900"], 45 | "subsets": ["chinese-simplified", "latin"], 46 | "version": "v26", 47 | "lastModified": "2022-05-10", 48 | "category": "sans-serif" 49 | }, 50 | { 51 | "family": "Recursive", 52 | "variants": ["300", "regular", "500", "600", "700", "800", "900"], 53 | "subsets": ["cyrillic-ext", "latin", "latin-ext", "vietnamese"], 54 | "version": "v34", 55 | "lastModified": "2022-06-01", 56 | "category": "sans-serif" 57 | }, 58 | { 59 | "family": "Texturina", 60 | "variants": [ 61 | "100", 62 | "200", 63 | "300", 64 | "regular", 65 | "500", 66 | "600", 67 | "700", 68 | "800", 69 | "900", 70 | "100italic", 71 | "200italic", 72 | "300italic", 73 | "italic", 74 | "500italic", 75 | "600italic", 76 | "700italic", 77 | "800italic", 78 | "900italic" 79 | ], 80 | "subsets": ["latin", "latin-ext", "vietnamese"], 81 | "version": "v20", 82 | "lastModified": "2022-04-27", 83 | "category": "serif" 84 | }, 85 | { 86 | "family": "Zilla Slab Highlight", 87 | "variants": ["regular", "700"], 88 | "subsets": ["latin", "latin-ext"], 89 | "version": "v17", 90 | "lastModified": "2022-04-27", 91 | "category": "display" 92 | } 93 | ] 94 | -------------------------------------------------------------------------------- /tests/fixtures/ital.textproto: -------------------------------------------------------------------------------- 1 | # ital based on https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxistag_ital 2 | tag: "ital" 3 | display_name: "Italic" 4 | min_value: 0 5 | max_value: 1 6 | default_value: 0 7 | precision: 0 8 | illustration_url: "italic.svg" 9 | fallback { 10 | name: "Roman" 11 | value: 0 12 | } 13 | fallback { 14 | name: "Italic" 15 | value: 1 16 | } 17 | fallback_only: true 18 | description: 19 | "Adjust the style from roman to italic. This can be provided as" 20 | " a continuous range within a single font file, like most axes, or as a" 21 | " toggle between two roman and italic files that form a family as a pair." -------------------------------------------------------------------------------- /tests/fixtures/user-agents.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiv1": { 3 | "woff2": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/15.10130", 4 | "woff": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko", 5 | "ttf": "Mozilla/5.0" 6 | }, 7 | "apiv2": { 8 | "variable": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36", 9 | "woff2": "Mozilla/5.0 (Windows NT 6.3; rv:39.0) Gecko/20100101 Firefox/44.0", 10 | "woff": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15", 11 | "ttf": "Mozilla/5.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/akshar-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* devanagari */ 2 | @font-face { 3 | font-family: 'Akshar'; 4 | font-style: normal; 5 | font-weight: 300 700; 6 | src: url(https://fonts.gstatic.com/s/akshar/v5/Yq6V-LyHWTfz9rGCpR5lhOc.woff2) format('woff2'); 7 | unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Akshar'; 12 | font-style: normal; 13 | font-weight: 300 700; 14 | src: url(https://fonts.gstatic.com/s/akshar/v5/Yq6V-LyHWTfz9rGCqh5lhOc.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Akshar'; 20 | font-style: normal; 21 | font-weight: 300 700; 22 | src: url(https://fonts.gstatic.com/s/akshar/v5/Yq6V-LyHWTfz9rGCpB5l.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/alegreya-wght-italic.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Alegreya'; 4 | font-style: italic; 5 | font-weight: 400 900; 6 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96fp56N1.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Alegreya'; 12 | font-style: italic; 13 | font-weight: 400 900; 14 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk967p56N1.woff2) format('woff2'); 15 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Alegreya'; 20 | font-style: italic; 21 | font-weight: 400 900; 22 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96bp56N1.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Alegreya'; 28 | font-style: italic; 29 | font-weight: 400 900; 30 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96np56N1.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Alegreya'; 36 | font-style: italic; 37 | font-weight: 400 900; 38 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96Xp56N1.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Alegreya'; 44 | font-style: italic; 45 | font-weight: 400 900; 46 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96Tp56N1.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Alegreya'; 52 | font-style: italic; 53 | font-weight: 400 900; 54 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaHrEBBsBhlBjvfkSLk96rp5w.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 56 | } 57 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/alegreya-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Alegreya'; 4 | font-style: normal; 5 | font-weight: 400 900; 6 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLsx6jx4w.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Alegreya'; 12 | font-style: normal; 13 | font-weight: 400 900; 14 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLlx6jx4w.woff2) format('woff2'); 15 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Alegreya'; 20 | font-style: normal; 21 | font-weight: 400 900; 22 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLtx6jx4w.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Alegreya'; 28 | font-style: normal; 29 | font-weight: 400 900; 30 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLix6jx4w.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Alegreya'; 36 | font-style: normal; 37 | font-weight: 400 900; 38 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLux6jx4w.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Alegreya'; 44 | font-style: normal; 45 | font-weight: 400 900; 46 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLvx6jx4w.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Alegreya'; 52 | font-style: normal; 53 | font-weight: 400 900; 54 | src: url(https://fonts.gstatic.com/s/alegreya/v29/4UaBrEBBsBhlBjvfkSLhx6g.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 56 | } 57 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-standard-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | font-stretch: 62% 125%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYI2HEEaM.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: italic; 14 | font-weight: 100 900; 15 | font-stretch: 62% 125%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYImHEEaM.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: italic; 23 | font-weight: 100 900; 24 | font-stretch: 62% 125%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYLGHE.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-standard-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | font-stretch: 62% 125%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdboLnnA.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: normal; 14 | font-weight: 100 900; 15 | font-stretch: 62% 125%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdfoLnnA.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: normal; 23 | font-weight: 100 900; 24 | font-stretch: 62% 125%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdnoLg.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-wdth-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | font-stretch: 62% 125%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYI2HEEaM.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: italic; 14 | font-weight: 100 900; 15 | font-stretch: 62% 125%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYImHEEaM.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: italic; 23 | font-weight: 100 900; 24 | font-stretch: 62% 125%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kSo8UDI-1M0wlSfdzYLGHE.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-wdth-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | font-stretch: 62% 125%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdboLnnA.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: normal; 14 | font-weight: 100 900; 15 | font-stretch: 62% 125%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdfoLnnA.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: normal; 23 | font-weight: 100 900; 24 | font-stretch: 62% 125%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kQo8UDI-1M0wlSfdnoLg.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-wght-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kBo8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYCx-muLRm.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: italic; 14 | font-weight: 100 900; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kBo8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYCx6muLRm.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: italic; 23 | font-weight: 100 900; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kBo8UDI-1M0wlSfdzyIEkpwTM29hr-8mTYCxCmuA.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/archivo-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Archivo'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kPo8UDI-1M0wlSV9XAw6lQkqWY8Q82sLySOxK-vA.woff2) format('woff2'); 8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 9 | } 10 | /* latin-ext */ 11 | @font-face { 12 | font-family: 'Archivo'; 13 | font-style: normal; 14 | font-weight: 100 900; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kPo8UDI-1M0wlSV9XAw6lQkqWY8Q82sLyTOxK-vA.woff2) format('woff2'); 17 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 18 | } 19 | /* latin */ 20 | @font-face { 21 | font-family: 'Archivo'; 22 | font-style: normal; 23 | font-weight: 100 900; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/archivo/v18/k3kPo8UDI-1M0wlSV9XAw6lQkqWY8Q82sLydOxI.woff2) format('woff2'); 26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 27 | } 28 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/ballet-opsz-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Ballet'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJu0tqQ4E.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Ballet'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJuktqQ4E.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Ballet'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJtEtq.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/ballet-standard-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Ballet'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJu0tqQ4E.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Ballet'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJuktqQ4E.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Ballet'; 20 | font-style: normal; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/ballet/v21/QGYvz_MYZA-HM4NJtEtq.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-SOFT-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMAkn8xNi7emAe9lKqZQihe6kwTK0KtGljdfeQ_5Y.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMAkn8xNi7emAe9lKqZQihe6kwTK0KtGljdPeQ_5Y.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMAkn8xNi7emAe9lKqZQihe6kwTK0KtGljeveQ.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-SOFT-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvCeYdG9Ea92uemAk_WBbizO8vEc2Wc1LxCBTeO-U.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvCeYdG9Ea92uemAk_WBbizO8vEc2Wc1LxCFTeO-U.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvCeYdG9Ea92uemAk_WBbizO8vEc2Wc1LxC9TeA.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-WONK-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZQihe6kwTK0KtGljdfeQ_5Y.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZQihe6kwTK0KtGljdPeQ_5Y.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZQihe6kwTK0KtGljeveQ.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-WONK-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBbizO8vEc2Wc1LxCBTeO-U.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBbizO8vEc2Wc1LxCFTeO-U.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBbizO8vEc2Wc1LxC9TeA.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-full-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUT8FyLNQOQZAnv9ZwNpOQkzO1A.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUT8FyLNQOQZAnv9ZwNpOUkzO1A.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUT8FyLNQOQZAnv9ZwNpOskzA.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-full-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUV8FyLNQOQZAnv9ZwHlOk8yA.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUV8FyLNQOQZAnv9ZwGlOk8yA.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUV8FyLNQOQZAnv9ZwIlOk.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-opsz-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjdfeQ_5Y.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjdPeQ_5Y.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjeveQ.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-opsz-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxCBTeO-U.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxCFTeO-U.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxC9TeA.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-standard-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjdfeQ_5Y.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjdPeQ_5Y.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU58FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChjeveQ.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-standard-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxCBTeO-U.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxCFTeO-U.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NU78FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0KxC9TeA.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-wght-italic.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: italic; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUs8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9mvIiQvTm.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: italic; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUs8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9mvMiQvTm.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: italic; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUs8FyLNQOQZAnv9ZwNjucMHVn85Ni7emAe9lKqZTnbB-gzTK0K1ChJdt9vIVYX9G37lvd9mv0iQg.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/fraunces-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* vietnamese */ 2 | @font-face { 3 | font-family: 'Fraunces'; 4 | font-style: normal; 5 | font-weight: 100 900; 6 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib14c0qv86Rg.woff2) format('woff2'); 7 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 8 | } 9 | /* latin-ext */ 10 | @font-face { 11 | font-family: 'Fraunces'; 12 | font-style: normal; 13 | font-weight: 100 900; 14 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib14c1qv86Rg.woff2) format('woff2'); 15 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 16 | } 17 | /* latin */ 18 | @font-face { 19 | font-family: 'Fraunces'; 20 | font-style: normal; 21 | font-weight: 100 900; 22 | src: url(https://fonts.gstatic.com/s/fraunces/v22/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib14c7qv8.woff2) format('woff2'); 23 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 24 | } 25 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-CASL-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: normal; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06JlTRq_gukbYr6Mk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbvGd9uNU.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: normal; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06JlTRq_gukbYr6Mk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbvmd9uNU.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: normal; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06JlTRq_gukbYr6Mk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbv2d9uNU.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: normal; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06JlTRq_gukbYr6Mk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbsWd9.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-CRSV-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: normal; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbvGd9uNU.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: normal; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbvmd9uNU.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: normal; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbv2d9uNU.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: normal; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QoThouEwG_X-dm0faE61aHWiJ-CImKsvbsWd9.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-MONO-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: normal; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE61aHWiJ-CImKsvbvGd9uNU.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: normal; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE61aHWiJ-CImKsvbvmd9uNU.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: normal; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE61aHWiJ-CImKsvbv2d9uNU.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: normal; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE61aHWiJ-CImKsvbsWd9.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-full-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: oblique 0deg 15deg; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIK7wMr0mhh-RQChyHuHmZaC_w.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: oblique 0deg 15deg; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIK7wMr0mhh-RQChyHuHGZaC_w.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: oblique 0deg 15deg; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIK7wMr0mhh-RQChyHuHWZaC_w.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: oblique 0deg 15deg; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIK7wMr0mhh-RQChyHuE2Za.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-slnt-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: oblique 0deg 15deg; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbvGd9uNU.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: oblique 0deg 15deg; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbvmd9uNU.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: oblique 0deg 15deg; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbv2d9uNU.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: oblique 0deg 15deg; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbsWd9.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-standard-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: oblique 0deg 15deg; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbvGd9uNU.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: oblique 0deg 15deg; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbvmd9uNU.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: oblique 0deg 15deg; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbv2d9uNU.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: oblique 0deg 15deg; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vIz7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvbsWd9.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/recursive-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Recursive'; 4 | font-style: normal; 5 | font-weight: 300 1000; 6 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlTyZnJ97.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* vietnamese */ 10 | @font-face { 11 | font-family: 'Recursive'; 12 | font-style: normal; 13 | font-weight: 300 1000; 14 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlT6ZnJ97.woff2) format('woff2'); 15 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 16 | } 17 | /* latin-ext */ 18 | @font-face { 19 | font-family: 'Recursive'; 20 | font-style: normal; 21 | font-weight: 300 1000; 22 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlT-ZnJ97.woff2) format('woff2'); 23 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 24 | } 25 | /* latin */ 26 | @font-face { 27 | font-family: 'Recursive'; 28 | font-style: normal; 29 | font-weight: 300 1000; 30 | src: url(https://fonts.gstatic.com/s/recursive/v34/8vI-7wMr0mhh-RQChyHEH06TlXhq_gukbYrFMk1QuAIcyEwG_X-dpEfaE5YaERmK-CImKsvxvU-MXGX2fSqasNfUlTGZnA.woff2) format('woff2'); 31 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 32 | } 33 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-GRAD-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wHrF2RY6mZsYh9__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-XTRA-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGbt8jbktqc2UpZs0KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YOPQ-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCD7BPcSBZvOYmUifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YTAS-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuATW8sPJtUscuCEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YTDE-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cSr1eUx9XgTnE37Ha_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YTFI-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_FQQp4Fm0PN1zIk5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YTLC-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntc_R0wZGzhvmD1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-YTUC-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYEPftzlEQXOxpByUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-full-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: oblique 0deg 10deg; 5 | font-weight: 100 1000; 6 | font-stretch: 25% 151%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu3RMH-CQ.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: oblique 0deg 10deg; 14 | font-weight: 100 1000; 15 | font-stretch: 25% 151%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu-RMH-CQ.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: oblique 0deg 10deg; 23 | font-weight: 100 1000; 24 | font-stretch: 25% 151%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu5RMH-CQ.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: oblique 0deg 10deg; 32 | font-weight: 100 1000; 33 | font-stretch: 25% 151%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu1RMH-CQ.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: oblique 0deg 10deg; 41 | font-weight: 100 1000; 42 | font-stretch: 25% 151%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu0RMH-CQ.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: oblique 0deg 10deg; 50 | font-weight: 100 1000; 51 | font-stretch: 25% 151%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaPccZLOBv5T3oB7Cb4i0zu6RME.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-opsz-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-slnt-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: oblique 0deg 10deg; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: oblique 0deg 10deg; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: oblique 0deg 10deg; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: oblique 0deg 10deg; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: oblique 0deg 10deg; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: oblique 0deg 10deg; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-standard-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: oblique 0deg 10deg; 5 | font-weight: 100 1000; 6 | font-stretch: 25% 151%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhUiWLi2.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: oblique 0deg 10deg; 14 | font-weight: 100 1000; 15 | font-stretch: 25% 151%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhwiWLi2.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: oblique 0deg 10deg; 23 | font-weight: 100 1000; 24 | font-stretch: 25% 151%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhsiWLi2.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: oblique 0deg 10deg; 32 | font-weight: 100 1000; 33 | font-stretch: 25% 151%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhciWLi2.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: oblique 0deg 10deg; 41 | font-weight: 100 1000; 42 | font-stretch: 25% 151%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhYiWLi2.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: oblique 0deg 10deg; 50 | font-weight: 100 1000; 51 | font-stretch: 25% 151%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaOkcZLOBv5T3oB7Cb4i0xG2bABEwTZXc7yZsWIEzvBPG65coVt_c4_0HvwJZVPEHzgCEJvQGxsTfsDHFHTjLI7UisR7Ia1RC-BFnA9CgfI_oYDZPRtZvE52xXPNiPcIDbAHhgb_dHlhvhaLUdDTQMDmMEIFXN5NVhgiWA.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-wdth-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 25% 151%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-wmF9lp.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 25% 151%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-UmF9lp.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 25% 151%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-ImF9lp.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 25% 151%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-4mF9lp.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 25% 151%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-8mF9lp.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 25% 151%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf9-EmFw.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-parser/roboto-flex-wght-normal.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Flex'; 4 | font-style: normal; 5 | font-weight: 100 1000; 6 | font-stretch: 100%; 7 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau1OPF80A.woff2) format('woff2'); 8 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 9 | } 10 | /* cyrillic */ 11 | @font-face { 12 | font-family: 'Roboto Flex'; 13 | font-style: normal; 14 | font-weight: 100 1000; 15 | font-stretch: 100%; 16 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau8OPF80A.woff2) format('woff2'); 17 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 18 | } 19 | /* greek */ 20 | @font-face { 21 | font-family: 'Roboto Flex'; 22 | font-style: normal; 23 | font-weight: 100 1000; 24 | font-stretch: 100%; 25 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau7OPF80A.woff2) format('woff2'); 26 | unicode-range: U+0370-03FF; 27 | } 28 | /* vietnamese */ 29 | @font-face { 30 | font-family: 'Roboto Flex'; 31 | font-style: normal; 32 | font-weight: 100 1000; 33 | font-stretch: 100%; 34 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau3OPF80A.woff2) format('woff2'); 35 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 36 | } 37 | /* latin-ext */ 38 | @font-face { 39 | font-family: 'Roboto Flex'; 40 | font-style: normal; 41 | font-weight: 100 1000; 42 | font-stretch: 100%; 43 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau2OPF80A.woff2) format('woff2'); 44 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 45 | } 46 | /* latin */ 47 | @font-face { 48 | font-family: 'Roboto Flex'; 49 | font-style: normal; 50 | font-weight: 100 1000; 51 | font-stretch: 100%; 52 | src: url(https://fonts.gstatic.com/s/robotoflex/v8/NaNNepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXpRJ6cXW4O8TNGoXjC79QRyaLshNDUf3e0O-gn5rrZCu20YNau4OPE.woff2) format('woff2'); 53 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 54 | } 55 | -------------------------------------------------------------------------------- /tests/fixtures/variable-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "family": "Akshar", 4 | "id": "akshar", 5 | "axes": { 6 | "wght": { "default": "400", "min": "300", "max": "700", "step": "1" } 7 | } 8 | }, 9 | { 10 | "family": "Alegreya", 11 | "id": "alegreya", 12 | "axes": { 13 | "ital": { "default": "0", "min": "0", "max": "1", "step": "1" }, 14 | "wght": { "default": "400", "min": "400", "max": "900", "step": "1" } 15 | } 16 | }, 17 | { 18 | "family": "Archivo", 19 | "id": "archivo", 20 | "axes": { 21 | "ital": { "default": "0", "min": "0", "max": "1", "step": "1" }, 22 | "wdth": { "default": "100", "min": "62", "max": "125", "step": "0.1" }, 23 | "wght": { "default": "400", "min": "100", "max": "900", "step": "1" } 24 | } 25 | }, 26 | { 27 | "family": "Ballet", 28 | "id": "ballet", 29 | "axes": { 30 | "opsz": { "default": "16", "min": "16", "max": "72", "step": "0.1" } 31 | } 32 | }, 33 | { 34 | "family": "Fraunces", 35 | "id": "fraunces", 36 | "axes": { 37 | "ital": { "default": "0", "min": "0", "max": "1", "step": "1" }, 38 | "opsz": { "default": "14", "min": "9", "max": "144", "step": "0.1" }, 39 | "wght": { "default": "400", "min": "100", "max": "900", "step": "1" }, 40 | "SOFT": { "default": "0", "min": "0", "max": "100", "step": "0.1" }, 41 | "WONK": { "default": "0", "min": "0", "max": "1", "step": "1" } 42 | } 43 | }, 44 | { 45 | "family": "Recursive", 46 | "id": "recursive", 47 | "axes": { 48 | "slnt": { "default": "0", "min": "-15", "max": "0", "step": "1" }, 49 | "wght": { "default": "400", "min": "300", "max": "1000", "step": "1" }, 50 | "CASL": { "default": "0", "min": "0", "max": "1", "step": "0.01" }, 51 | "CRSV": { "default": "0.5", "min": "0", "max": "1", "step": "0.1" }, 52 | "MONO": { "default": "0", "min": "0", "max": "1", "step": "0.01" } 53 | } 54 | }, 55 | { 56 | "family": "Roboto Flex", 57 | "id": "roboto-flex", 58 | "axes": { 59 | "opsz": { "default": "14", "min": "8", "max": "144", "step": "0.1" }, 60 | "slnt": { "default": "0", "min": "-10", "max": "0", "step": "1" }, 61 | "wdth": { "default": "100", "min": "25", "max": "151", "step": "0.1" }, 62 | "wght": { "default": "400", "min": "100", "max": "1000", "step": "1" }, 63 | "GRAD": { "default": "0", "min": "-200", "max": "150", "step": "1" }, 64 | "XTRA": { "default": "468", "min": "323", "max": "603", "step": "1" }, 65 | "YOPQ": { "default": "79", "min": "25", "max": "135", "step": "1" }, 66 | "YTAS": { "default": "750", "min": "649", "max": "854", "step": "1" }, 67 | "YTDE": { "default": "-203", "min": "-305", "max": "-98", "step": "1" }, 68 | "YTFI": { "default": "738", "min": "560", "max": "788", "step": "1" }, 69 | "YTLC": { "default": "514", "min": "416", "max": "570", "step": "1" }, 70 | "YTUC": { "default": "712", "min": "528", "max": "760", "step": "1" } 71 | } 72 | } 73 | ] 74 | -------------------------------------------------------------------------------- /tests/fixtures/year.textproto: -------------------------------------------------------------------------------- 1 | # YEAR based on https://github.com/dancoull/ClimateCrisis 2 | tag: "YEAR" 3 | display_name: "Year" 4 | min_value: -4000 5 | default_value: 2000 6 | max_value: 4000 7 | precision: 0 8 | fallback { 9 | name: "Default" 10 | value: 2000 11 | } 12 | fallback_only: false 13 | description: 14 | "Axis that shows in a metaphoric way the effect of time on a chosen topic." 15 | 16 | -------------------------------------------------------------------------------- /tests/mocks/handlers.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | 3 | import { http } from 'msw'; 4 | 5 | import type { FontObjectVariableDirect } from '../../src/types'; 6 | import { generateCSSLinks } from '../../src/variable-parser'; 7 | import APIResponse from '../fixtures/api-response.json'; 8 | import userAgent from '../fixtures/user-agents.json'; 9 | import { 10 | cssFixture, 11 | cssFixturePath, 12 | cssFixtureVariable, 13 | cssFixtureVariablePath, 14 | dataFixture, 15 | getFontResponse, 16 | idGen, 17 | } from '../utils/helpers'; 18 | 19 | export const apiGenHandlers = [ 20 | http.get('https://www.googleapis.com/webfonts/v1/webfonts', async (info) => { 21 | const url = new URL(info.request.url); 22 | if (url.searchParams.get('key') === 'fail') 23 | return new Response(null, { status: 400 }); 24 | 25 | const newAPIResponse = { items: APIResponse }; // emulate response.items 26 | return new Response(JSON.stringify(newAPIResponse), { 27 | status: 200, 28 | headers: { 'Content-Type': 'application/json' }, 29 | }); 30 | }), 31 | ]; 32 | 33 | export const apiParseV1Handlers = [ 34 | http.get('https://fonts.googleapis.com/css', async (info) => { 35 | const url = new URL(info.request.url); 36 | const id = idGen(url.searchParams.get('family')?.split(':')[0] ?? 'test'); 37 | 38 | const subset: string = url.searchParams.get('subset') ?? 'test'; 39 | 40 | const headers = info.request.headers; 41 | let type = ''; 42 | if (headers.get('user-agent') === userAgent.apiv1.woff2) type = 'woff2'; 43 | if (headers.get('user-agent') === userAgent.apiv1.woff) type = 'woff'; 44 | if (headers.get('user-agent') === userAgent.apiv1.ttf) type = 'ttf'; 45 | 46 | if (fs.existsSync(cssFixturePath(id, type, 'v1', subset))) { 47 | return new Response(cssFixture(id, type, 'v1', subset), { 48 | status: 200, 49 | headers: { 'Content-Type': 'text/css' }, 50 | }); 51 | } 52 | 53 | return new Response(null, { status: 400 }); 54 | }), 55 | ]; 56 | 57 | export const apiParseV2Handlers = [ 58 | http.get('https://fonts.googleapis.com/css2', async (info) => { 59 | const url = new URL(info.request.url); 60 | const id = idGen(url.searchParams.get('family')?.split(':')[0] ?? 'test'); 61 | 62 | const headers = info.request.headers; 63 | let type = ''; 64 | if (headers.get('user-agent') === userAgent.apiv2.woff2) type = 'woff2'; 65 | if (headers.get('user-agent') === userAgent.apiv2.woff) type = 'woff'; 66 | if (headers.get('user-agent') === userAgent.apiv2.ttf) type = 'ttf'; 67 | 68 | if (fs.existsSync(cssFixturePath(id, type, 'v2'))) { 69 | return new Response(cssFixture(id, type, 'v2'), { 70 | status: 200, 71 | headers: { 'Content-Type': 'text/css' }, 72 | }); 73 | } 74 | 75 | return new Response(null, { status: 400 }); 76 | }), 77 | ]; 78 | 79 | export const apiParseVariableHandlers = [ 80 | http.get('https://fonts.googleapis.com/css2', async (info) => { 81 | const url = new URL(info.request.url); 82 | const id = idGen(url.searchParams.get('family')?.split(':')[0] ?? 'test'); 83 | 84 | const links = generateCSSLinks( 85 | getFontResponse( 86 | dataFixture('variable-response'), 87 | id, 88 | ) as FontObjectVariableDirect, 89 | ); 90 | const key = Object.keys(links) 91 | .find((keyValue) => links[keyValue] === url.toString()) 92 | ?.split('.'); 93 | const type = key ? key[0] : 'test'; 94 | const style = key ? key[1] : 'test'; 95 | 96 | if (fs.existsSync(cssFixtureVariablePath(id, type, style))) { 97 | return new Response(cssFixtureVariable(id, type, style), { 98 | status: 200, 99 | headers: { 'Content-Type': 'text/css' }, 100 | }); 101 | } 102 | 103 | return new Response(null, { status: 400 }); 104 | }), 105 | ]; 106 | -------------------------------------------------------------------------------- /tests/mocks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './handlers'; 2 | export { setupAPIServer } from './server'; 3 | -------------------------------------------------------------------------------- /tests/mocks/server.ts: -------------------------------------------------------------------------------- 1 | import { setupServer } from 'msw/node'; 2 | import { afterAll, afterEach, beforeAll } from 'vitest'; 3 | 4 | // Setup Vitest handlers 5 | // biome-ignore lint/suspicious/noExplicitAny: 6 | export const setupAPIServer = (handler: any) => { 7 | const server = setupServer(...handler); 8 | // Start server before all tests 9 | beforeAll(() => { 10 | server.listen({ onUnhandledRequest: 'error' }); 11 | }); 12 | 13 | // Close server after all tests 14 | afterAll(() => { 15 | server.close(); 16 | }); 17 | 18 | // Reset handlers after each test `important for test isolation` 19 | afterEach(() => { 20 | server.resetHandlers(); 21 | }); 22 | }; 23 | -------------------------------------------------------------------------------- /tests/utils.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import type { FontObject } from '../src'; 4 | import { orderObject, weightListGen } from '../src/utils'; 5 | 6 | describe('Utils', () => { 7 | it('Orders object keys alphabetically', () => { 8 | const object = { 9 | c: 3, 10 | a: 1, 11 | d: 4, 12 | b: 2, 13 | } as unknown as FontObject; 14 | 15 | const ordered = { 16 | a: 1, 17 | b: 2, 18 | c: 3, 19 | d: 4, 20 | } as unknown as FontObject; 21 | 22 | expect(orderObject(object)).toEqual(ordered); 23 | }); 24 | 25 | describe('Weight list gen', () => { 26 | it('Successfully converts APIResponse.variants to weights', () => { 27 | const variants = ['400', '500', '600']; 28 | expect(weightListGen(variants)).toEqual([400, 500, 600]); 29 | }); 30 | 31 | it('Handles regular and italic properly', () => { 32 | const variants = ['regular', 'italic']; 33 | expect(weightListGen(variants)).toEqual([400]); 34 | }); 35 | 36 | it('Resolves italic variants', () => { 37 | const variants = ['500', '500italic', '700italic']; 38 | expect(weightListGen(variants)).toEqual([500, 700]); 39 | }); 40 | 41 | it('Throws for unexpected values', () => { 42 | expect(() => weightListGen(['500i'])).toThrow('Invalid value: 500i'); 43 | expect(() => weightListGen(['badvalue'])).toThrow( 44 | 'Invalid value: badvalue', 45 | ); 46 | }); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /tests/utils/helpers.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'node:fs'; 2 | 3 | import { join } from 'pathe'; 4 | 5 | import type { APIResponse, FontObjectVariableDirect } from '../../src/types'; 6 | 7 | // Have to clone because Vitest doesn't seem to isolate object reads properly 8 | // biome-ignore lint/suspicious/noExplicitAny: 9 | export const clone = (obj: any) => JSON.parse(JSON.stringify(obj)); 10 | 11 | export const cssFixturePath = ( 12 | id: string, 13 | type: string, 14 | version: string, 15 | subset?: string, 16 | ) => { 17 | if (version === 'v1') { 18 | return join( 19 | process.cwd(), 20 | `tests/fixtures/api-parser-${version}`, 21 | `${id}-${String(subset)}-${type}.css`, 22 | ); 23 | } 24 | if (version === 'v2') { 25 | return join( 26 | process.cwd(), 27 | `tests/fixtures/api-parser-${version}`, 28 | `${id}-${type}.css`, 29 | ); 30 | } 31 | 32 | throw new Error(`Bad fixture path: ${id + type + version + String(subset)}`); 33 | }; 34 | 35 | export const cssFixture = ( 36 | id: string, 37 | type: string, 38 | version: string, 39 | subset?: string, 40 | ): string => { 41 | if (version === 'v1') { 42 | return fs 43 | .readFileSync(cssFixturePath(id, type, version, subset)) 44 | .toString(); 45 | } 46 | if (version === 'v2') { 47 | return fs.readFileSync(cssFixturePath(id, type, version)).toString(); 48 | } 49 | 50 | throw new Error(`Bad fixture read ${id + type + version + String(subset)}`); 51 | }; 52 | 53 | export const cssFixtureVariablePath = ( 54 | id: string, 55 | type: string, 56 | style: string, 57 | ) => 58 | join( 59 | process.cwd(), 60 | 'tests/fixtures/variable-parser', 61 | `${id}-${type}-${style}.css`, 62 | ); 63 | 64 | export const cssFixtureVariable = (id: string, type: string, style: string) => 65 | fs.readFileSync(cssFixtureVariablePath(id, type, style)).toString(); 66 | 67 | type DataFixture = 68 | | 'api-response' 69 | | 'v1' 70 | | 'v2' 71 | | 'variable' 72 | | 'variable-response' 73 | | 'user-agent'; 74 | const readParse = (filePath: string) => 75 | JSON.parse(fs.readFileSync(join(process.cwd(), filePath)).toString()); 76 | 77 | export const dataFixture = (type: DataFixture) => { 78 | if (type === 'api-response') 79 | return readParse('tests/fixtures/api-response.json') as APIResponse[]; 80 | 81 | if (type === 'v1') return readParse('tests/fixtures/google-fonts-v1.json'); 82 | 83 | if (type === 'v2') return readParse('tests/fixtures/google-fonts-v2.json'); 84 | 85 | if (type === 'variable') return readParse('tests/fixtures/variable.json'); 86 | 87 | if (type === 'variable-response') 88 | return readParse( 89 | 'tests/fixtures/variable-response.json', 90 | ) as FontObjectVariableDirect[]; 91 | 92 | if (type === 'user-agent') 93 | return readParse('tests/fixtures/user-agents.json'); 94 | 95 | throw new Error(`Bad fixture type: ${String(type)}`); 96 | }; 97 | 98 | export const idGen = (family: string) => 99 | family.replaceAll(/\s/g, '-').toLowerCase(); 100 | 101 | export const getFontResponse = ( 102 | fonts: FontObjectVariableDirect[] | APIResponse[], 103 | fontId: string, 104 | ) => { 105 | for (const font of fonts) { 106 | if (idGen(font.family) === fontId) return font; 107 | } 108 | throw new Error(`Font not found: ${fontId}`); 109 | }; 110 | -------------------------------------------------------------------------------- /tests/utils/setup-tests.ts: -------------------------------------------------------------------------------- 1 | import { consola } from 'consola'; 2 | import { beforeAll, beforeEach, vi } from 'vitest'; 3 | 4 | beforeAll(() => { 5 | // Redirect std and console to consola too 6 | // Calling this once is sufficient 7 | consola.wrapStd(); 8 | }); 9 | 10 | beforeEach(() => { 11 | // Re-mock consola before each test call to remove 12 | // calls from before 13 | consola.mockTypes(() => vi.fn()); 14 | }); 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 3 | "include": [ 4 | "src/**/*.ts", 5 | "src/**/*.json", 6 | "scripts/**/*.ts", 7 | "tests/**/*.ts", 8 | "tests/**/*.json", 9 | "vitest.config.mts" 10 | ], 11 | "compilerOptions": { 12 | /* Projects */ 13 | //"incremental": true, 14 | 15 | /* Language and Environment */ 16 | "target": "esnext", 17 | "useDefineForClassFields": true, 18 | 19 | /* Modules */ 20 | "module": "esnext", 21 | "moduleResolution": "node", 22 | "resolveJsonModule": true, 23 | 24 | /* Interop Constraints */ 25 | "allowSyntheticDefaultImports": true, 26 | "esModuleInterop": true, 27 | "forceConsistentCasingInFileNames": true, 28 | 29 | /* Type Checking */ 30 | "strict": true, 31 | "isolatedModules": true, 32 | "noUnusedLocals": true, 33 | "noUnusedParameters": true, 34 | "noImplicitReturns": true, 35 | "noFallthroughCasesInSwitch": true, 36 | 37 | /* Completeness */ 38 | "skipLibCheck": true // Skip type checking all .d.ts files. 39 | }, 40 | "$schema": "https://json.schemastore.org/tsconfig" 41 | } 42 | -------------------------------------------------------------------------------- /vitest.config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | setupFiles: ['./tests/utils/setup-tests.ts'], 6 | }, 7 | }); 8 | --------------------------------------------------------------------------------