@anvpx/motion-templates 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.js +9 -0
  4. package/dist/roots.d.ts +41 -0
  5. package/dist/roots.js +81 -0
  6. package/package.json +34 -3
  7. package/shared/themes/README.md +5 -0
  8. package/shared/themes/bold-dark.json +362 -0
  9. package/shared/themes/bold-light.json +362 -0
  10. package/shared/themes/calm-dark.json +362 -0
  11. package/shared/themes/calm-light.json +362 -0
  12. package/shared/themes/data-dark.json +360 -0
  13. package/shared/themes/data-light.json +360 -0
  14. package/shared/themes/editorial-dark.json +353 -0
  15. package/shared/themes/editorial-light.json +353 -0
  16. package/shared/themes/fjord-dark.json +124 -0
  17. package/shared/themes/fjord-light.json +124 -0
  18. package/shared/themes/playful-dark.json +362 -0
  19. package/shared/themes/playful-light.json +362 -0
  20. package/shared/themes/pop-dark.json +352 -0
  21. package/shared/themes/pop-light.json +352 -0
  22. package/shared/themes/tech-dark.json +360 -0
  23. package/shared/themes/tech-light.json +360 -0
  24. package/shared/themes/warm-dark.json +368 -0
  25. package/shared/themes/warm-light.json +368 -0
  26. package/stopwords.json +65 -0
  27. package/templates/compare/blueprints/versus.json +79 -0
  28. package/templates/compare/copy.md +18 -0
  29. package/templates/compare/pacing.json +15 -0
  30. package/templates/compare/previews/versus.png +0 -0
  31. package/templates/compare/styles/editorial.json +6 -0
  32. package/templates/compare/styles/punchy.json +6 -0
  33. package/templates/compare/styles/tidy.json +6 -0
  34. package/templates/compare/template.json +52 -0
  35. package/templates/datastory/blueprints/data-story.json +95 -0
  36. package/templates/datastory/blueprints/infographic.json +106 -0
  37. package/templates/datastory/blueprints/trend.json +93 -0
  38. package/templates/datastory/copy.md +16 -0
  39. package/templates/datastory/pacing.json +17 -0
  40. package/templates/datastory/previews/data-story.png +0 -0
  41. package/templates/datastory/previews/infographic.png +0 -0
  42. package/templates/datastory/previews/trend.png +0 -0
  43. package/templates/datastory/styles/clear.json +6 -0
  44. package/templates/datastory/styles/editorial.json +6 -0
  45. package/templates/datastory/styles/pop.json +7 -0
  46. package/templates/datastory/template.json +57 -0
  47. package/templates/event/blueprints/promo.json +71 -0
  48. package/templates/event/blueprints/save-the-date.json +61 -0
  49. package/templates/event/copy.md +16 -0
  50. package/templates/event/pacing.json +15 -0
  51. package/templates/event/previews/promo.png +0 -0
  52. package/templates/event/previews/save-the-date.png +0 -0
  53. package/templates/event/styles/bright.json +6 -0
  54. package/templates/event/styles/pop.json +6 -0
  55. package/templates/event/template.json +37 -0
  56. package/templates/explain/blueprints/architecture.json +76 -0
  57. package/templates/explain/blueprints/concept.json +89 -0
  58. package/templates/explain/blueprints/howto.json +56 -0
  59. package/templates/explain/blueprints/overview.json +126 -0
  60. package/templates/explain/copy.md +19 -0
  61. package/templates/explain/pacing.json +19 -0
  62. package/templates/explain/previews/architecture.png +0 -0
  63. package/templates/explain/previews/concept.png +0 -0
  64. package/templates/explain/previews/howto.png +0 -0
  65. package/templates/explain/previews/overview.png +0 -0
  66. package/templates/explain/styles/calm.json +6 -0
  67. package/templates/explain/styles/crisp.json +6 -0
  68. package/templates/explain/template.json +64 -0
  69. package/templates/guide/blueprints/lesson.json +173 -0
  70. package/templates/guide/blueprints/onboarding.json +80 -0
  71. package/templates/guide/blueprints/tutorial.json +102 -0
  72. package/templates/guide/copy.md +17 -0
  73. package/templates/guide/pacing.json +59 -0
  74. package/templates/guide/previews/lesson.png +0 -0
  75. package/templates/guide/previews/onboarding.png +0 -0
  76. package/templates/guide/previews/tutorial.png +0 -0
  77. package/templates/guide/styles/calm.json +15 -0
  78. package/templates/guide/styles/friendly.json +15 -0
  79. package/templates/guide/styles/techdark.json +15 -0
  80. package/templates/guide/template.json +95 -0
  81. package/templates/pitch/blueprints/feature.json +134 -0
  82. package/templates/pitch/blueprints/launch.json +173 -0
  83. package/templates/pitch/blueprints/pricing.json +141 -0
  84. package/templates/pitch/copy.md +18 -0
  85. package/templates/pitch/pacing.json +59 -0
  86. package/templates/pitch/previews/feature.png +0 -0
  87. package/templates/pitch/previews/launch.png +0 -0
  88. package/templates/pitch/previews/pricing.png +0 -0
  89. package/templates/pitch/styles/polished.json +6 -0
  90. package/templates/pitch/styles/punchy.json +6 -0
  91. package/templates/pitch/styles/teaser.json +12 -0
  92. package/templates/pitch/template.json +45 -0
  93. package/templates/recap/blueprints/news-recap.json +62 -0
  94. package/templates/recap/blueprints/timeline-story.json +94 -0
  95. package/templates/recap/copy.md +16 -0
  96. package/templates/recap/pacing.json +16 -0
  97. package/templates/recap/previews/news-recap.png +0 -0
  98. package/templates/recap/previews/timeline-story.png +0 -0
  99. package/templates/recap/styles/editorial.json +6 -0
  100. package/templates/recap/styles/editorialdark.json +6 -0
  101. package/templates/recap/template.json +50 -0
  102. package/templates/report/blueprints/kpi-review.json +116 -0
  103. package/templates/report/blueprints/status.json +78 -0
  104. package/templates/report/copy.md +17 -0
  105. package/templates/report/pacing.json +16 -0
  106. package/templates/report/previews/kpi-review.png +0 -0
  107. package/templates/report/previews/status.png +0 -0
  108. package/templates/report/styles/exec.json +6 -0
  109. package/templates/report/styles/memo.json +6 -0
  110. package/templates/report/styles/walkthrough.json +6 -0
  111. package/templates/report/template.json +56 -0
  112. package/templates/social/blueprints/announce.json +109 -0
  113. package/templates/social/blueprints/listicle.json +117 -0
  114. package/templates/social/blueprints/tip.json +114 -0
  115. package/templates/social/copy.md +18 -0
  116. package/templates/social/pacing.json +49 -0
  117. package/templates/social/previews/announce.png +0 -0
  118. package/templates/social/previews/listicle.png +0 -0
  119. package/templates/social/previews/tip.png +0 -0
  120. package/templates/social/styles/captioned.json +18 -0
  121. package/templates/social/styles/hook-first.json +15 -0
  122. package/templates/social/styles/techcut.json +15 -0
  123. package/templates/social/template.json +94 -0
  124. package/templates/update/blueprints/announcement.json +57 -0
  125. package/templates/update/blueprints/changelog.json +157 -0
  126. package/templates/update/blueprints/release-notes.json +151 -0
  127. package/templates/update/blueprints/weekly-update.json +88 -0
  128. package/templates/update/copy.md +17 -0
  129. package/templates/update/pacing.json +64 -0
  130. package/templates/update/previews/announcement.png +0 -0
  131. package/templates/update/previews/changelog.png +0 -0
  132. package/templates/update/previews/release-notes.png +0 -0
  133. package/templates/update/previews/weekly-update.png +0 -0
  134. package/templates/update/styles/punchy.json +15 -0
  135. package/templates/update/styles/techdark.json +6 -0
  136. package/templates/update/styles/tidy.json +6 -0
  137. package/templates/update/template.json +67 -0
  138. package/templates/vista/blueprints/spotlight.json +68 -0
  139. package/templates/vista/blueprints/tour.json +84 -0
  140. package/templates/vista/copy.md +18 -0
  141. package/templates/vista/pacing.json +14 -0
  142. package/templates/vista/previews/spotlight.png +0 -0
  143. package/templates/vista/previews/tour.png +0 -0
  144. package/templates/vista/styles/bright.json +6 -0
  145. package/templates/vista/styles/cinematic.json +6 -0
  146. package/templates/vista/template.json +42 -0
  147. package/templates/walkthrough/blueprints/product-tour.json +107 -0
  148. package/templates/walkthrough/copy.md +16 -0
  149. package/templates/walkthrough/pacing.json +16 -0
  150. package/templates/walkthrough/previews/product-tour.png +0 -0
  151. package/templates/walkthrough/styles/calm.json +6 -0
  152. package/templates/walkthrough/styles/deep.json +6 -0
  153. package/templates/walkthrough/template.json +37 -0
  154. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 anvpx
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.
@@ -0,0 +1,8 @@
1
+ /** Built-in templates (data only). Callers pass this directory to the template loader as a search root. */
2
+ export declare const TEMPLATES_DIR: string;
3
+ /** Themes shared between templates; a manifest reaches them as `@shared/<name>.json`. */
4
+ export declare const SHARED_THEMES_DIR: string;
5
+ export type { NpmTemplateRoot } from "./roots.ts";
6
+ export { isNpmTemplatePackageName, listNpmTemplateRoots } from "./roots.ts";
7
+ /** Search stopwords for `mk template list --for`; the CLI hands them to the build search (build never imports this package). */
8
+ export declare const STOPWORDS: readonly string[];
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ /** Built-in templates (data only). Callers pass this directory to the template loader as a search root. */
4
+ export const TEMPLATES_DIR = fileURLToPath(new URL("../templates/", import.meta.url));
5
+ /** Themes shared between templates; a manifest reaches them as `@shared/<name>.json`. */
6
+ export const SHARED_THEMES_DIR = fileURLToPath(new URL("../shared/themes/", import.meta.url));
7
+ export { isNpmTemplatePackageName, listNpmTemplateRoots } from "./roots.js";
8
+ /** Search stopwords for `mk template list --for`; the CLI hands them to the build search (build never imports this package). */
9
+ export const STOPWORDS = JSON.parse(readFileSync(fileURLToPath(new URL("../stopwords.json", import.meta.url)), "utf8"));
@@ -0,0 +1,41 @@
1
+ /**
2
+ * npm-installed template roots (opt-in).
3
+ *
4
+ * A package counts as a template package by name convention (no new deps, no
5
+ * registry lookup):
6
+ * - unscoped `mk-template-*` or `motion-kit-template-*` (docs order also
7
+ * allows the `motion-kit-template-*` spelling),
8
+ * - scoped `@literal-scope/mk-template-*` (e.g. `@acme/mk-template-report`),
9
+ * - scoped `@anvpx/motion-template-*` (the docs spelling).
10
+ *
11
+ * Layout inside a package: `<pkg>/templates/<id>/template.json` (multi-template,
12
+ * preferred, matches `discoverTemplates` manifest layout) or `<pkg>/template.json`
13
+ * (single-template package). Packages with neither are skipped.
14
+ *
15
+ * Precedence (decided + documented): built-ins win on id clash. Pass the roots
16
+ * from `listNpmTemplateRoots` AFTER `builtInDir` when calling `discoverTemplates`
17
+ * (project > env > user > built-in > npm). The npm copy then shows up as
18
+ * `shadowed` with reason `"root"` — a warning, never silent. Rationale: built-ins
19
+ * are pinned, snapshot-tested and deterministic; externals must use new ids
20
+ * (fork flow), not silently override core templates.
21
+ *
22
+ * Validation is fail-closed: discovery reports unparseable manifests in
23
+ * `problems`, and `loadTemplate`/`validateTemplate` (same functions as built-ins)
24
+ * return errors for incomplete externals. External templates own their assets:
25
+ * no ledger merge; ship licences inside the package.
26
+ */
27
+ /** One npm package's contribution: a directory holding `<id>/template.json` folders. */
28
+ export interface NpmTemplateRoot {
29
+ readonly path: string;
30
+ /** `npm:<packageName>`, e.g. `npm:@acme/mk-template-report`. */
31
+ readonly source: string;
32
+ readonly packageName: string;
33
+ }
34
+ /** True when the (possibly scoped) package name follows the template convention. */
35
+ export declare const isNpmTemplatePackageName: (packageName: string) => boolean;
36
+ /**
37
+ * Roots contributed by npm template packages under `<projectDir>/node_modules`
38
+ * (or an explicit `nodeModulesDir` for tests). Sorted by package name; missing
39
+ * or unreadable `node_modules` yields `[]`, never throws.
40
+ */
41
+ export declare const listNpmTemplateRoots: (projectDir: string, nodeModulesDir?: string) => NpmTemplateRoot[];
package/dist/roots.js ADDED
@@ -0,0 +1,81 @@
1
+ import { existsSync, readdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const matchesBase = (base) => (base.startsWith("mk-template-") && base.length > 12) ||
4
+ (base.startsWith("motion-kit-template-") && base.length > 21) ||
5
+ (base.startsWith("motion-template-") && base.length > 16);
6
+ /** True when the (possibly scoped) package name follows the template convention. */
7
+ export const isNpmTemplatePackageName = (packageName) => {
8
+ const parts = packageName.split("/");
9
+ if (parts.length === 1) {
10
+ const [base] = parts;
11
+ if (base === undefined || base === "")
12
+ return false;
13
+ return matchesBase(base);
14
+ }
15
+ if (parts.length !== 2)
16
+ return false;
17
+ const [scope, base] = parts;
18
+ if (scope === undefined || !scope.startsWith("@") || base === undefined || base === "") {
19
+ return false;
20
+ }
21
+ if (scope === "@anvpx") {
22
+ return matchesBase(base) || (base.startsWith("template-") && base.length > 9);
23
+ }
24
+ return matchesBase(base);
25
+ };
26
+ const isDirectory = (path) => {
27
+ try {
28
+ return statSync(path).isDirectory();
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ };
34
+ const rootForPackage = (pkgDir) => {
35
+ const nested = join(pkgDir, "templates");
36
+ if (isDirectory(nested))
37
+ return nested;
38
+ if (existsSync(join(pkgDir, "template.json")))
39
+ return pkgDir;
40
+ return undefined;
41
+ };
42
+ const readDirSafe = (dir) => {
43
+ try {
44
+ return readdirSync(dir).sort();
45
+ }
46
+ catch {
47
+ return [];
48
+ }
49
+ };
50
+ const scopedNames = (base, scope) => readDirSafe(join(base, scope))
51
+ .filter((child) => !child.startsWith("."))
52
+ .map((child) => `${scope}/${child}`);
53
+ /** All installed package names, with `@scope` dirs expanded; hidden entries skipped. */
54
+ const expandPackageNames = (base, entries) => entries
55
+ .filter((entry) => !entry.startsWith("."))
56
+ .flatMap((entry) => (entry.startsWith("@") ? scopedNames(base, entry) : [entry]));
57
+ const rootForName = (base, packageName) => {
58
+ if (!isNpmTemplatePackageName(packageName))
59
+ return undefined;
60
+ const pkgDir = join(base, ...packageName.split("/"));
61
+ if (!isDirectory(pkgDir))
62
+ return undefined;
63
+ const path = rootForPackage(pkgDir);
64
+ if (path === undefined)
65
+ return undefined;
66
+ return { path, source: `npm:${packageName}`, packageName };
67
+ };
68
+ /**
69
+ * Roots contributed by npm template packages under `<projectDir>/node_modules`
70
+ * (or an explicit `nodeModulesDir` for tests). Sorted by package name; missing
71
+ * or unreadable `node_modules` yields `[]`, never throws.
72
+ */
73
+ export const listNpmTemplateRoots = (projectDir, nodeModulesDir) => {
74
+ const base = nodeModulesDir ?? join(projectDir, "node_modules");
75
+ return expandPackageNames(base, readDirSafe(base))
76
+ .flatMap((packageName) => {
77
+ const root = rootForName(base, packageName);
78
+ return root === undefined ? [] : [root];
79
+ })
80
+ .sort((a, b) => a.packageName.localeCompare(b.packageName));
81
+ };
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@anvpx/motion-templates",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Built-in templates, blueprints and shared themes for @anvpx/motion.",
5
+ "license": "MIT",
6
+ "author": "anvpx",
7
+ "type": "module",
8
+ "engines": {
9
+ "node": ">=22"
10
+ },
11
+ "keywords": [
12
+ "motion-kit",
13
+ "templates",
14
+ "themes",
15
+ "video",
16
+ "animation"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "exports": {
22
+ ".": "./dist/index.js",
23
+ "./package.json": "./package.json"
24
+ },
25
+ "files": [
26
+ "dist/**/*.js",
27
+ "dist/**/*.d.ts",
28
+ "templates/**/*",
29
+ "shared/themes/**/*",
30
+ "stopwords.json"
31
+ ],
32
+ "devDependencies": {
33
+ "@anvpx/motion-build": "0.1.1",
34
+ "@anvpx/motion-schema": "0.1.1"
35
+ },
36
+ "scripts": {}
6
37
  }
@@ -0,0 +1,5 @@
1
+ # Shared themes
2
+
3
+ Theme files referenced by templates as `"file": "@shared/<name>.json"`. The loader reads them from this folder; a theme id is its file name without `.json`.
4
+
5
+ Sixteen files: nine families (`calm`, `bold`, `data`, `editorial`, `tech`, `playful`, `pop`, `warm`) in `-light` and `-dark`. Family table, fonts and guarantees: `../README.md`; motion presets: `../styles-guide.md`.
@@ -0,0 +1,362 @@
1
+ {
2
+ "$description": "bold: deep violet ground with an amber highlight (dark), DTCG format",
3
+ "color": {
4
+ "$type": "color",
5
+ "bg": {
6
+ "$value": "#120a26"
7
+ },
8
+ "bgEnd": {
9
+ "$value": "#1c1040"
10
+ },
11
+ "glow": {
12
+ "$value": "#4a2a9a"
13
+ },
14
+ "glow2": {
15
+ "$value": "#6b4300"
16
+ },
17
+ "surface": {
18
+ "$value": "#1a0f38"
19
+ },
20
+ "card": {
21
+ "$value": "#241651"
22
+ },
23
+ "divider": {
24
+ "$value": "#43307f"
25
+ },
26
+ "accentSoft": {
27
+ "$value": "#3a2275"
28
+ },
29
+ "fg": {
30
+ "$value": "#f7f2ff"
31
+ },
32
+ "muted": {
33
+ "$value": "#c6b9ea"
34
+ },
35
+ "accent": {
36
+ "$value": "#ffb524"
37
+ },
38
+ "accent2": {
39
+ "$value": "#b9a2ff"
40
+ },
41
+ "onAccent": {
42
+ "$value": "#1a0f00"
43
+ },
44
+ "onAccent2": {
45
+ "$value": "#170a3a"
46
+ },
47
+ "deep": {
48
+ "$value": "#2f1673"
49
+ },
50
+ "deepEnd": {
51
+ "$value": "#1a0b45"
52
+ },
53
+ "onDeep": {
54
+ "$value": "#ffffff"
55
+ },
56
+ "onDeepMuted": {
57
+ "$value": "#d4c8f5"
58
+ }
59
+ },
60
+ "chart": {
61
+ "1": {
62
+ "$value": "#ffb524"
63
+ },
64
+ "2": {
65
+ "$value": "#b9a2ff"
66
+ },
67
+ "3": {
68
+ "$value": "#4fd8b8"
69
+ },
70
+ "4": {
71
+ "$value": "#ff6fb0"
72
+ },
73
+ "5": {
74
+ "$value": "#6fa8ff"
75
+ },
76
+ "6": {
77
+ "$value": "#c8e65a"
78
+ },
79
+ "7": {
80
+ "$value": "#ff7a5a"
81
+ },
82
+ "8": {
83
+ "$value": "#c6b9ea"
84
+ },
85
+ "$type": "color"
86
+ },
87
+ "font": {
88
+ "$type": "fontFamily",
89
+ "sans": {
90
+ "$value": ["Inter", "system-ui", "sans-serif"]
91
+ },
92
+ "display": {
93
+ "$value": ["Space Grotesk", "system-ui", "sans-serif"]
94
+ },
95
+ "mono": {
96
+ "$value": ["ui-monospace", "SFMono-Regular", "Menlo", "Consolas", "monospace"]
97
+ }
98
+ },
99
+ "fontSize": {
100
+ "$type": "dimension",
101
+ "sm": {
102
+ "$value": "28px"
103
+ },
104
+ "md": {
105
+ "$value": "32px"
106
+ },
107
+ "lg": {
108
+ "$value": "52px"
109
+ },
110
+ "xl": {
111
+ "$value": "80px"
112
+ },
113
+ "title": {
114
+ "$value": "108px"
115
+ },
116
+ "display": {
117
+ "$value": "144px"
118
+ },
119
+ "heroSm": {
120
+ "$value": "176px"
121
+ },
122
+ "heroMd": {
123
+ "$value": "260px"
124
+ },
125
+ "hero": {
126
+ "$value": "380px"
127
+ }
128
+ },
129
+ "spacing": {
130
+ "$type": "dimension",
131
+ "xs": {
132
+ "$value": "4px"
133
+ },
134
+ "sm": {
135
+ "$value": "8px"
136
+ },
137
+ "md": {
138
+ "$value": "16px"
139
+ },
140
+ "lg": {
141
+ "$value": "32px"
142
+ },
143
+ "xl": {
144
+ "$value": "64px"
145
+ },
146
+ "xxl": {
147
+ "$value": "96px"
148
+ }
149
+ },
150
+ "radius": {
151
+ "$type": "dimension",
152
+ "sm": {
153
+ "$value": "6px"
154
+ },
155
+ "md": {
156
+ "$value": "12px"
157
+ },
158
+ "lg": {
159
+ "$value": "20px"
160
+ },
161
+ "xl": {
162
+ "$value": "32px"
163
+ },
164
+ "full": {
165
+ "$value": "9999px"
166
+ }
167
+ },
168
+ "opacity": {
169
+ "$type": "number",
170
+ "subtle": {
171
+ "$value": 0.7
172
+ },
173
+ "medium": {
174
+ "$value": 0.85
175
+ },
176
+ "full": {
177
+ "$value": 1
178
+ }
179
+ },
180
+ "duration": {
181
+ "$type": "duration",
182
+ "fast": {
183
+ "$value": "150ms"
184
+ },
185
+ "base": {
186
+ "$value": "300ms"
187
+ },
188
+ "slow": {
189
+ "$value": "600ms"
190
+ }
191
+ },
192
+ "status": {
193
+ "$type": "color",
194
+ "good": {
195
+ "$value": "#4ade80"
196
+ },
197
+ "warn": {
198
+ "$value": "#fbbf24"
199
+ },
200
+ "bad": {
201
+ "$value": "#fb7185"
202
+ }
203
+ },
204
+ "stroke": {
205
+ "$type": "dimension",
206
+ "card": {
207
+ "$value": "0px"
208
+ },
209
+ "icon": {
210
+ "$value": "1.75px"
211
+ }
212
+ },
213
+ "numeric": {
214
+ "mode": {
215
+ "$type": "string",
216
+ "$value": "tabular"
217
+ }
218
+ },
219
+ "shadow": {
220
+ "mode": {
221
+ "$type": "string",
222
+ "$value": "soft"
223
+ },
224
+ "color": {
225
+ "$type": "color",
226
+ "$value": "#f7f2ff"
227
+ }
228
+ },
229
+ "$extensions": {
230
+ "motion-kit": {
231
+ "family": "bold",
232
+ "mode": "dark",
233
+ "pair": "bold-light",
234
+ "textPairs": [
235
+ {
236
+ "fg": "fg",
237
+ "bg": "bg"
238
+ },
239
+ {
240
+ "fg": "fg",
241
+ "bg": "bgEnd"
242
+ },
243
+ {
244
+ "fg": "fg",
245
+ "bg": "glow"
246
+ },
247
+ {
248
+ "fg": "fg",
249
+ "bg": "glow2"
250
+ },
251
+ {
252
+ "fg": "fg",
253
+ "bg": "surface"
254
+ },
255
+ {
256
+ "fg": "fg",
257
+ "bg": "card"
258
+ },
259
+ {
260
+ "fg": "fg",
261
+ "bg": "accentSoft"
262
+ },
263
+ {
264
+ "fg": "muted",
265
+ "bg": "bg"
266
+ },
267
+ {
268
+ "fg": "muted",
269
+ "bg": "bgEnd"
270
+ },
271
+ {
272
+ "fg": "muted",
273
+ "bg": "glow"
274
+ },
275
+ {
276
+ "fg": "muted",
277
+ "bg": "glow2"
278
+ },
279
+ {
280
+ "fg": "muted",
281
+ "bg": "surface"
282
+ },
283
+ {
284
+ "fg": "muted",
285
+ "bg": "card"
286
+ },
287
+ {
288
+ "fg": "muted",
289
+ "bg": "accentSoft"
290
+ },
291
+ {
292
+ "fg": "accent",
293
+ "bg": "bg"
294
+ },
295
+ {
296
+ "fg": "accent",
297
+ "bg": "bgEnd"
298
+ },
299
+ {
300
+ "fg": "accent",
301
+ "bg": "glow"
302
+ },
303
+ {
304
+ "fg": "accent",
305
+ "bg": "glow2"
306
+ },
307
+ {
308
+ "fg": "accent",
309
+ "bg": "surface"
310
+ },
311
+ {
312
+ "fg": "accent",
313
+ "bg": "card"
314
+ },
315
+ {
316
+ "fg": "accent",
317
+ "bg": "accentSoft"
318
+ },
319
+ {
320
+ "fg": "accent2",
321
+ "bg": "bg"
322
+ },
323
+ {
324
+ "fg": "accent2",
325
+ "bg": "bgEnd"
326
+ },
327
+ {
328
+ "fg": "accent2",
329
+ "bg": "surface"
330
+ },
331
+ {
332
+ "fg": "accent2",
333
+ "bg": "card"
334
+ },
335
+ {
336
+ "fg": "onAccent",
337
+ "bg": "accent"
338
+ },
339
+ {
340
+ "fg": "onAccent2",
341
+ "bg": "accent2"
342
+ },
343
+ {
344
+ "fg": "onDeep",
345
+ "bg": "deep"
346
+ },
347
+ {
348
+ "fg": "onDeep",
349
+ "bg": "deepEnd"
350
+ },
351
+ {
352
+ "fg": "onDeepMuted",
353
+ "bg": "deep"
354
+ },
355
+ {
356
+ "fg": "onDeepMuted",
357
+ "bg": "deepEnd"
358
+ }
359
+ ]
360
+ }
361
+ }
362
+ }