unframer 4.0.3 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.d.ts +2 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +3 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +51 -1
- package/dist/cli.js.map +1 -1
- package/dist/framer-chunks/chunk-76VXR6QG.js +91 -0
- package/dist/framer-chunks/chunk-OAKBJJLO.js +105 -0
- package/dist/framer-chunks/fontshare-LJWOE5KG-36DNQHCT.js +27099 -0
- package/dist/framer-chunks/fontshare-LTYJMI6Q-XCFP3GWO.js +119 -0
- package/dist/framer-chunks/fontshare-MHXFPDHS-VQYPAYVC.js +825 -0
- package/dist/framer-chunks/fontshare-Q7VOJ3QT-LXRXXTSM.js +119 -0
- package/dist/framer-chunks/fontshare-X63NXWGB-NRPGYMPJ.js +825 -0
- package/dist/framer-chunks/fontshare-XMKN2FOD-D5TWBHNT.js +27099 -0
- package/dist/framer-chunks/framer-font-D6RMCRV4-XCFIRDL6.js +7 -0
- package/dist/framer-chunks/framer-font-G73BNA7N-B3OPPZB7.js +7 -0
- package/dist/framer-chunks/google-AG6EYFMK-QBWWKKVD.js +1612 -0
- package/dist/framer-chunks/google-CQFUID6E-C6DG6E7T.js +6792 -0
- package/dist/framer-chunks/google-EJBUPU3N-LSIK52DF.js +616382 -0
- package/dist/framer-chunks/google-LLNWFNMY-PWPZVCX5.js +6792 -0
- package/dist/framer-chunks/google-TRAPONMP-UUEFJ4ZF.js +616382 -0
- package/dist/framer-chunks/google-VQ4ZP4WR-C2T2J24Z.js +1612 -0
- package/dist/framer.js +827 -582
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +26 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/mcp-to-cli.d.ts +25 -0
- package/dist/lib/mcp-to-cli.d.ts.map +1 -0
- package/dist/lib/mcp-to-cli.js +176 -0
- package/dist/lib/mcp-to-cli.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +93 -92
- package/src/bin.ts +3 -0
- package/src/cli.ts +61 -2
- package/src/framer.js +827 -582
- package/src/lib/config.ts +43 -0
- package/src/lib/mcp-to-cli.ts +229 -0
- package/src/styles/framer.css +16 -16
- package/src/version.ts +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import os from 'os'
|
|
4
|
+
|
|
5
|
+
const CONFIG_DIR = path.join(os.homedir(), '.unframer')
|
|
6
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json')
|
|
7
|
+
|
|
8
|
+
export interface CachedMcpTools {
|
|
9
|
+
tools: Array<{
|
|
10
|
+
name: string
|
|
11
|
+
description?: string
|
|
12
|
+
inputSchema?: unknown
|
|
13
|
+
}>
|
|
14
|
+
timestamp: number
|
|
15
|
+
sessionId?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface UnframerConfig {
|
|
19
|
+
mcpUrl?: string
|
|
20
|
+
cachedMcpTools?: CachedMcpTools
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function loadConfig(): UnframerConfig {
|
|
24
|
+
if (!fs.existsSync(CONFIG_FILE)) {
|
|
25
|
+
return {}
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'))
|
|
29
|
+
} catch {
|
|
30
|
+
return {}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function saveConfig(config: UnframerConfig): void {
|
|
35
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
36
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true })
|
|
37
|
+
}
|
|
38
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getConfigPath(): string {
|
|
42
|
+
return CONFIG_FILE
|
|
43
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
3
|
+
import type { CAC } from "@xmorse/cac";
|
|
4
|
+
import { loadConfig, saveConfig, type CachedMcpTools } from "./config.js";
|
|
5
|
+
|
|
6
|
+
export type { Transport };
|
|
7
|
+
|
|
8
|
+
const CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
9
|
+
|
|
10
|
+
export interface AddMcpCommandsOptions {
|
|
11
|
+
cli: CAC;
|
|
12
|
+
commandPrefix: string;
|
|
13
|
+
/**
|
|
14
|
+
* Name used when connecting to the MCP server.
|
|
15
|
+
* @default 'mcp-cli-client'
|
|
16
|
+
*/
|
|
17
|
+
clientName?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Returns a transport to connect to the MCP server, or null if not configured.
|
|
20
|
+
* If null is returned, no MCP tool commands will be registered.
|
|
21
|
+
* @param sessionId - Optional session ID from cache to reuse existing session
|
|
22
|
+
*/
|
|
23
|
+
getMcpTransport: (sessionId?: string) => Transport | null | Promise<Transport | null>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface JsonSchemaProperty {
|
|
27
|
+
type?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
enum?: string[];
|
|
30
|
+
default?: unknown;
|
|
31
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
32
|
+
items?: JsonSchemaProperty;
|
|
33
|
+
required?: string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface InputSchema {
|
|
37
|
+
type: "object";
|
|
38
|
+
properties?: Record<string, JsonSchemaProperty>;
|
|
39
|
+
required?: string[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Convert JSON schema to compact JSON string for display
|
|
44
|
+
*/
|
|
45
|
+
function schemaToString(schema: JsonSchemaProperty): string {
|
|
46
|
+
// Show compact JSON schema
|
|
47
|
+
const compact = { ...schema };
|
|
48
|
+
// Remove verbose fields for display
|
|
49
|
+
delete compact.description;
|
|
50
|
+
return JSON.stringify(compact);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function parseToolArguments(
|
|
54
|
+
options: Record<string, unknown>,
|
|
55
|
+
inputSchema: InputSchema | undefined,
|
|
56
|
+
): Record<string, unknown> {
|
|
57
|
+
const args: Record<string, unknown> = {};
|
|
58
|
+
if (!inputSchema?.properties) {
|
|
59
|
+
return args;
|
|
60
|
+
}
|
|
61
|
+
for (const [name, schema] of Object.entries(inputSchema.properties)) {
|
|
62
|
+
let value = options[name];
|
|
63
|
+
if (value === undefined) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// cac wraps values in arrays when using type: [String] or type: [Number]
|
|
67
|
+
// Always unwrap single-element arrays - for object/array schema types,
|
|
68
|
+
// the inner value is a JSON string that we'll parse below
|
|
69
|
+
if (Array.isArray(value) && value.length === 1) {
|
|
70
|
+
value = value[0];
|
|
71
|
+
}
|
|
72
|
+
const type = schema.type || "string";
|
|
73
|
+
if ((type === "object" || type === "array") && typeof value === "string") {
|
|
74
|
+
try {
|
|
75
|
+
args[name] = JSON.parse(value);
|
|
76
|
+
} catch {
|
|
77
|
+
console.error(`Invalid JSON for --${name}: ${value}`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
args[name] = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return args;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function outputResult(result: {
|
|
88
|
+
content: Array<{ type: string; text?: string; data?: string }>;
|
|
89
|
+
}): void {
|
|
90
|
+
for (const block of result.content) {
|
|
91
|
+
if (block.type === "text" && block.text) {
|
|
92
|
+
console.log(block.text);
|
|
93
|
+
} else if (block.type === "image") {
|
|
94
|
+
// Skip base64 image data in CLI output
|
|
95
|
+
console.log("[Image content omitted]");
|
|
96
|
+
} else {
|
|
97
|
+
console.log(JSON.stringify(block, null, 2));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Adds MCP tool commands to a cac CLI instance.
|
|
104
|
+
* Tools are cached for 1 hour to avoid connecting on every CLI invocation.
|
|
105
|
+
* Session ID is also cached to skip MCP initialization handshake.
|
|
106
|
+
*/
|
|
107
|
+
export async function addMcpCommands(options: AddMcpCommandsOptions): Promise<void> {
|
|
108
|
+
const { cli, commandPrefix, clientName = "mcp-cli-client", getMcpTransport } = options;
|
|
109
|
+
|
|
110
|
+
// Try to use cached tools first
|
|
111
|
+
const config = loadConfig();
|
|
112
|
+
const cachedTools = config.cachedMcpTools;
|
|
113
|
+
const isCacheValid = cachedTools && (Date.now() - cachedTools.timestamp) < CACHE_TTL_MS;
|
|
114
|
+
|
|
115
|
+
let tools: CachedMcpTools["tools"];
|
|
116
|
+
let cachedSessionId: string | undefined;
|
|
117
|
+
|
|
118
|
+
if (isCacheValid) {
|
|
119
|
+
// Use cached tools to register commands
|
|
120
|
+
tools = cachedTools.tools;
|
|
121
|
+
cachedSessionId = cachedTools.sessionId;
|
|
122
|
+
} else {
|
|
123
|
+
// Cache invalid/missing - connect to fetch tools
|
|
124
|
+
const transport = await getMcpTransport();
|
|
125
|
+
if (!transport) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const client = new Client({ name: clientName, version: "1.0.0" }, { capabilities: {} });
|
|
130
|
+
try {
|
|
131
|
+
await client.connect(transport);
|
|
132
|
+
const result = await client.listTools();
|
|
133
|
+
tools = result.tools;
|
|
134
|
+
|
|
135
|
+
// Get session ID from transport if available
|
|
136
|
+
const sessionId = (transport as { sessionId?: string }).sessionId;
|
|
137
|
+
|
|
138
|
+
// Save tools and session ID to cache
|
|
139
|
+
saveConfig({
|
|
140
|
+
...config,
|
|
141
|
+
cachedMcpTools: {
|
|
142
|
+
tools: tools.map((t) => ({
|
|
143
|
+
name: t.name,
|
|
144
|
+
description: t.description,
|
|
145
|
+
inputSchema: t.inputSchema,
|
|
146
|
+
})),
|
|
147
|
+
timestamp: Date.now(),
|
|
148
|
+
sessionId,
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
cachedSessionId = sessionId;
|
|
152
|
+
} catch (err) {
|
|
153
|
+
console.error(`Failed to connect to MCP server: ${err instanceof Error ? err.message : err}`);
|
|
154
|
+
return;
|
|
155
|
+
} finally {
|
|
156
|
+
await client.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
for (const tool of tools) {
|
|
161
|
+
const inputSchema = tool.inputSchema as InputSchema | undefined;
|
|
162
|
+
const cmdName = `${commandPrefix} ${tool.name}`;
|
|
163
|
+
const description = tool.description || `Run MCP tool ${tool.name}`;
|
|
164
|
+
|
|
165
|
+
const cmd = cli.command(cmdName, description);
|
|
166
|
+
|
|
167
|
+
// Add options for each property in the input schema
|
|
168
|
+
if (inputSchema?.properties) {
|
|
169
|
+
for (const [propName, propSchema] of Object.entries(inputSchema.properties)) {
|
|
170
|
+
const isRequired = inputSchema.required?.includes(propName) ?? false;
|
|
171
|
+
const schemaType = propSchema.type || "string";
|
|
172
|
+
|
|
173
|
+
// Boolean options are flags without <value>
|
|
174
|
+
// Other types use <value> syntax
|
|
175
|
+
const optionStr =
|
|
176
|
+
schemaType === "boolean" ? `--${propName}` : `--${propName} <${propName}>`;
|
|
177
|
+
|
|
178
|
+
let optionDesc = propSchema.description || propName;
|
|
179
|
+
if (isRequired) {
|
|
180
|
+
optionDesc += " (required)";
|
|
181
|
+
}
|
|
182
|
+
// Add schema hint for non-scalar types
|
|
183
|
+
if (schemaType === "object" || schemaType === "array") {
|
|
184
|
+
optionDesc += ` (JSON: ${schemaToString(propSchema)})`;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Build option config with type transform
|
|
188
|
+
// Use type: [Type] to prevent cac/mri from auto-converting values
|
|
189
|
+
// This wraps values in arrays which we unwrap in parseToolArguments
|
|
190
|
+
const optionConfig: { default?: unknown; type?: unknown[] } = {};
|
|
191
|
+
if (propSchema.default !== undefined) {
|
|
192
|
+
optionConfig.default = propSchema.default;
|
|
193
|
+
}
|
|
194
|
+
if (schemaType === "number" || schemaType === "integer") {
|
|
195
|
+
optionConfig.type = [Number];
|
|
196
|
+
} else if (schemaType !== "boolean") {
|
|
197
|
+
// String for string/object/array types - prevents mri from mangling JSON strings
|
|
198
|
+
optionConfig.type = [String];
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
cmd.option(optionStr, optionDesc, optionConfig);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
cmd.action(async (cliOptions: Record<string, unknown>) => {
|
|
206
|
+
const parsedArgs = parseToolArguments(cliOptions, inputSchema);
|
|
207
|
+
|
|
208
|
+
// Connect with cached session ID to skip initialization handshake
|
|
209
|
+
const transport = await getMcpTransport(cachedSessionId);
|
|
210
|
+
if (!transport) {
|
|
211
|
+
console.error("MCP transport not available");
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
const actionClient = new Client({ name: clientName, version: "1.0.0" }, { capabilities: {} });
|
|
215
|
+
await actionClient.connect(transport);
|
|
216
|
+
|
|
217
|
+
try {
|
|
218
|
+
const result = await actionClient.callTool({ name: tool.name, arguments: parsedArgs });
|
|
219
|
+
outputResult(result as { content: Array<{ type: string; text?: string }> });
|
|
220
|
+
} catch (err) {
|
|
221
|
+
console.error(`Error calling ${tool.name}:`, err instanceof Error ? err.message : err);
|
|
222
|
+
process.exit(1);
|
|
223
|
+
} finally {
|
|
224
|
+
await actionClient.close();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
}
|
package/src/styles/framer.css
CHANGED
|
@@ -179,9 +179,9 @@ body { --framer-will-change-filter-override: none; }
|
|
|
179
179
|
ul.framer-text,
|
|
180
180
|
mark.framer-text,
|
|
181
181
|
span.framer-text:not([data-text-fill]) {
|
|
182
|
-
font-family: var(--framer-blockquote-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif));
|
|
183
|
-
font-style: var(--framer-blockquote-font-style, var(--framer-font-style, normal));
|
|
184
|
-
font-weight: var(--framer-blockquote-font-weight, var(--framer-font-weight, 400));
|
|
182
|
+
font-family: var(--framer-font-family-preview, var(--framer-blockquote-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
|
|
183
|
+
font-style: var(--framer-font-style-preview, var(--framer-blockquote-font-style, var(--framer-font-style, normal)));
|
|
184
|
+
font-weight: var(--framer-font-weight-preview, var(--framer-blockquote-font-weight, var(--framer-font-weight, 400)));
|
|
185
185
|
color: var(--framer-blockquote-text-color, var(--framer-text-color, #000));
|
|
186
186
|
font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
|
|
187
187
|
letter-spacing: var(--framer-blockquote-letter-spacing, var(--framer-letter-spacing, 0));
|
|
@@ -199,7 +199,7 @@ body { --framer-will-change-filter-override: none; }
|
|
|
199
199
|
-moz-font-feature-settings: var(--framer-font-open-type-features, initial);
|
|
200
200
|
-webkit-font-feature-settings: var(--framer-font-open-type-features, initial);
|
|
201
201
|
font-feature-settings: var(--framer-font-open-type-features, initial);
|
|
202
|
-
font-variation-settings: var(--framer-font-variation-axes, normal);
|
|
202
|
+
font-variation-settings: var(--framer-font-variation-axes-preview, var(--framer-font-variation-axes, normal));
|
|
203
203
|
text-wrap: var(--framer-text-wrap-override, var(--framer-text-wrap));
|
|
204
204
|
}
|
|
205
205
|
|
|
@@ -346,9 +346,9 @@ body { --framer-will-change-filter-override: none; }
|
|
|
346
346
|
span.framer-text[data-nested-link] span.framer-text:not([data-text-fill]) {
|
|
347
347
|
/* Ensure the color is inherited from the link style rather than the parent text for nested spans */
|
|
348
348
|
color: inherit;
|
|
349
|
-
font-family: var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
|
|
350
|
-
font-style: var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
|
|
351
|
-
font-weight: var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
|
|
349
|
+
font-family: var(--framer-font-family-preview, var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
|
|
350
|
+
font-style: var(--framer-font-style-preview, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
|
|
351
|
+
font-weight: var(--framer-font-weight-preview, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
|
|
352
352
|
font-size: calc(var(--framer-blockquote-font-size, var(--framer-font-size, 16px)) * var(--framer-font-size-scale, 1));
|
|
353
353
|
text-transform: var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
|
|
354
354
|
/* Cursor inherit to overwrite the user agent stylesheet on rich text links. */
|
|
@@ -417,9 +417,9 @@ body { --framer-will-change-filter-override: none; }
|
|
|
417
417
|
a.framer-text:hover span.framer-text:not([data-text-fill]),
|
|
418
418
|
span.framer-text[data-nested-link]:hover,
|
|
419
419
|
span.framer-text[data-nested-link]:hover span.framer-text:not([data-text-fill]) {
|
|
420
|
-
font-family: var(--framer-link-hover-font-family, var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
|
|
421
|
-
font-style: var(--framer-link-hover-font-style, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
|
|
422
|
-
font-weight: var(--framer-link-hover-font-weight, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
|
|
420
|
+
font-family: var(--framer-font-family-preview, var(--framer-link-hover-font-family, var(--framer-blockquote-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)))));
|
|
421
|
+
font-style: var(--framer-font-style-preview, var(--framer-link-hover-font-style, var(--framer-blockquote-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)))));
|
|
422
|
+
font-weight: var(--framer-font-weight-preview, var(--framer-link-hover-font-weight, var(--framer-blockquote-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)))));
|
|
423
423
|
font-size: calc(var(--framer-link-hover-font-size, var(--framer-blockquote-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
|
|
424
424
|
text-transform: var(--framer-link-hover-text-transform, var(--framer-blockquote-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none))));
|
|
425
425
|
border-radius: var(--framer-link-hover-text-background-radius, var(--framer-link-text-background-radius, var(--framer-text-background-radius, initial)));
|
|
@@ -469,9 +469,9 @@ body { --framer-will-change-filter-override: none; }
|
|
|
469
469
|
a.framer-text[data-framer-page-link-current] span.framer-text:not([data-text-fill]),
|
|
470
470
|
span.framer-text[data-framer-page-link-current],
|
|
471
471
|
span.framer-text[data-framer-page-link-current] span.framer-text:not([data-text-fill]) {
|
|
472
|
-
font-family: var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)));
|
|
473
|
-
font-style: var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)));
|
|
474
|
-
font-weight: var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)));
|
|
472
|
+
font-family: var(--framer-font-family-preview, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
|
|
473
|
+
font-style: var(--framer-font-style-preview, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
|
|
474
|
+
font-weight: var(--framer-font-weight-preview, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
|
|
475
475
|
font-size: calc(var(--framer-link-current-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px))) * var(--framer-font-size-scale, 1));
|
|
476
476
|
text-transform: var(--framer-link-current-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none)));
|
|
477
477
|
border-radius: var(--framer-link-current-text-background-radius, var(--framer-link-text-background-radius, initial));
|
|
@@ -537,9 +537,9 @@ body { --framer-will-change-filter-override: none; }
|
|
|
537
537
|
span.framer-text[data-framer-page-link-current]:hover,
|
|
538
538
|
span.framer-text[data-framer-page-link-current]:hover span.framer-text:not([data-text-fill]) {
|
|
539
539
|
color: inherit;
|
|
540
|
-
font-family: var(--framer-link-hover-font-family, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif))));
|
|
541
|
-
font-style: var(--framer-link-hover-font-style, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal))));
|
|
542
|
-
font-weight: var(--framer-link-hover-font-weight, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400))));
|
|
540
|
+
font-family: var(--framer-font-family-preview, var(--framer-link-hover-font-family, var(--framer-link-current-font-family, var(--framer-link-font-family, var(--framer-font-family, Inter, Inter Placeholder, sans-serif)))));
|
|
541
|
+
font-style: var(--framer-font-style-preview, var(--framer-link-hover-font-style, var(--framer-link-current-font-style, var(--framer-link-font-style, var(--framer-font-style, normal)))));
|
|
542
|
+
font-weight: var(--framer-font-weight-preview, var(--framer-link-hover-font-weight, var(--framer-link-current-font-weight, var(--framer-link-font-weight, var(--framer-font-weight, 400)))));
|
|
543
543
|
font-size: calc(var(--framer-link-hover-font-size, var(--framer-link-current-font-size, var(--framer-link-font-size, var(--framer-font-size, 16px)))) * var(--framer-font-size-scale, 1));
|
|
544
544
|
text-transform: var(--framer-link-hover-text-transform, var(--framer-link-current-text-transform, var(--framer-link-text-transform, var(--framer-text-transform, none))));
|
|
545
545
|
border-radius: var(--framer-link-hover-text-background-radius, var(--framer-link-current-text-background-radius, var(--framer-link-text-background-radius, initial)));
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.0.
|
|
1
|
+
export const version = '4.0.4'
|