@quark.clip/quark 1.1.1 → 1.3.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.
- package/README.md +1 -0
- package/cli/bin/quark.js +27 -2
- package/cli/src/clipboard.js +34 -13
- package/cli/src/daemon.js +43 -11
- package/cli/src/transformers.js +140 -30
- package/dist/assets/index-CuVu9tSn.css +1 -0
- package/dist/index.html +2 -2
- package/package.json +2 -2
- package/dist/assets/index-Dn1mbcJe.css +0 -1
- /package/dist/assets/{index-CDMgweEY.js → index-Db7-j4bQ.js} +0 -0
package/README.md
CHANGED
|
@@ -30,6 +30,7 @@ The operating system clipboard is fundamentally broken and stuck in the past:
|
|
|
30
30
|
- **Heals** broken PDF text automatically.
|
|
31
31
|
- **Strips** tracking parameters from URLs.
|
|
32
32
|
- **Transforms** raw Excel data, Markdown, and LaTeX into clean, rich HTML.
|
|
33
|
+
- **Omni-Context Engine**: Detects the active target app (Notion, Obsidian, VS Code, Pages) and dynamically shifts clipboard flavors (Markdown, HTML, RTF) to ensure flawless structure on every paste.
|
|
33
34
|
- **Syncs** across your Mac, Windows, and Linux machines instantly via P2P.
|
|
34
35
|
- **Exposes** your clipboard to local AI models via MCP.
|
|
35
36
|
|
package/cli/bin/quark.js
CHANGED
|
@@ -11,6 +11,29 @@ const pidFile = path.join(__dirname, '../quark.pid');
|
|
|
11
11
|
const logFile = path.join(__dirname, '../quark.log');
|
|
12
12
|
|
|
13
13
|
switch (command) {
|
|
14
|
+
case 'run':
|
|
15
|
+
console.log(`
|
|
16
|
+
o-------o
|
|
17
|
+
| \\ / |
|
|
18
|
+
| o |
|
|
19
|
+
| / \\ |
|
|
20
|
+
o-------o
|
|
21
|
+
`);
|
|
22
|
+
console.log('🚀 Starting Quark Daemon (Foreground Session)...');
|
|
23
|
+
console.log('💡 Press Ctrl+C to stop. Logs will appear below:');
|
|
24
|
+
require(daemonPath);
|
|
25
|
+
break;
|
|
26
|
+
|
|
27
|
+
case 'logs':
|
|
28
|
+
if (fs.existsSync(logFile)) {
|
|
29
|
+
console.log('📜 Tailing Quark logs... (Press Ctrl+C to exit)');
|
|
30
|
+
const tail = spawn('tail', ['-f', logFile], { stdio: 'inherit' });
|
|
31
|
+
tail.on('exit', () => process.exit(0));
|
|
32
|
+
} else {
|
|
33
|
+
console.log('⚠️ No log file found at ' + logFile);
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
|
|
14
37
|
case 'start':
|
|
15
38
|
console.log(`
|
|
16
39
|
o-------o
|
|
@@ -64,7 +87,7 @@ switch (command) {
|
|
|
64
87
|
console.log(`\n🌌 Quark Status`);
|
|
65
88
|
console.log(`----------------`);
|
|
66
89
|
console.log(`Manual Session: ${isRunning ? '🟢 Running' : '🔴 Stopped'}`);
|
|
67
|
-
|
|
90
|
+
|
|
68
91
|
// Check OS Service Status
|
|
69
92
|
const os = require('os');
|
|
70
93
|
const platform = os.platform();
|
|
@@ -92,7 +115,7 @@ switch (command) {
|
|
|
92
115
|
} catch (e) {
|
|
93
116
|
// Ignore errors from execSync if service is not running
|
|
94
117
|
}
|
|
95
|
-
|
|
118
|
+
|
|
96
119
|
console.log(`OS Service: ${serviceRunning ? '🟢 Installed & Running' : '🔴 Not Installed / Stopped'}`);
|
|
97
120
|
console.log(`\nLog file: ${logFile}`);
|
|
98
121
|
if (!serviceRunning) {
|
|
@@ -112,6 +135,8 @@ switch (command) {
|
|
|
112
135
|
Usage:
|
|
113
136
|
quark start Start the daemon in the background (current session)
|
|
114
137
|
quark stop Stop the manually started daemon
|
|
138
|
+
quark run Start the daemon in the foreground (live logs)
|
|
139
|
+
quark logs Tail the background daemon logs
|
|
115
140
|
quark install Install Quark as a native OS background service (Auto-start on boot)
|
|
116
141
|
quark uninstall Remove the native OS background service
|
|
117
142
|
quark status Check daemon status
|
package/cli/src/clipboard.js
CHANGED
|
@@ -9,9 +9,16 @@ function read() {
|
|
|
9
9
|
if (platform === 'darwin') {
|
|
10
10
|
text = execSync('pbpaste', { encoding: 'utf8' }).toString();
|
|
11
11
|
try {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
const jxa = `
|
|
13
|
+
ObjC.import("AppKit");
|
|
14
|
+
var pb = $.NSPasteboard.generalPasteboard;
|
|
15
|
+
var html = pb.stringForType("public.html");
|
|
16
|
+
if (html) { html.js; } else { ""; }
|
|
17
|
+
`;
|
|
18
|
+
const raw = execSync(`osascript -l JavaScript -e '${jxa.replace(/\n/g, ' ')}' 2>/dev/null`, { encoding: 'utf8' });
|
|
19
|
+
if (raw && raw.trim() !== '') {
|
|
20
|
+
html = raw;
|
|
21
|
+
}
|
|
15
22
|
} catch (e) { }
|
|
16
23
|
} else if (platform === 'linux') {
|
|
17
24
|
text = execSync('xclip -selection clipboard -o', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).toString();
|
|
@@ -41,16 +48,19 @@ function writeHtml(html, plainText) {
|
|
|
41
48
|
try {
|
|
42
49
|
const platform = os.platform();
|
|
43
50
|
if (platform === 'darwin') {
|
|
44
|
-
// Use
|
|
45
|
-
// This
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
// Use JXA to write both public.html and public.utf8-plain-text to NSPasteboard
|
|
52
|
+
// This ensures Electron apps (Teams, Slack) can read the HTML correctly
|
|
53
|
+
const escapedHtml = html.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, '\\n');
|
|
54
|
+
const escapedText = plainText.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, '\\n');
|
|
55
|
+
const jxa = `
|
|
56
|
+
ObjC.import("AppKit");
|
|
57
|
+
var pb = $.NSPasteboard.generalPasteboard;
|
|
58
|
+
pb.clearContents;
|
|
59
|
+
pb.setStringForType($('${escapedHtml}'), $('public.html'));
|
|
60
|
+
pb.setStringForType($('${escapedText}'), $('public.utf8-plain-text'));
|
|
61
|
+
"ok";
|
|
51
62
|
`;
|
|
52
|
-
|
|
53
|
-
execSync(`osascript -e '${script.replace(/\n/g, ' ')}'`);
|
|
63
|
+
execSync(`osascript -l JavaScript -e '${jxa.replace(/\n/g, ' ')}' 2>/dev/null`);
|
|
54
64
|
} else if (platform === 'linux') {
|
|
55
65
|
execSync('xclip -selection clipboard -t text/html', { input: html, stdio: ['pipe', 'ignore', 'ignore'] });
|
|
56
66
|
} else if (platform === 'win32') {
|
|
@@ -86,4 +96,15 @@ function writeText(text) {
|
|
|
86
96
|
} catch (e) { console.error('Error setting clipboard text:', e.message); }
|
|
87
97
|
}
|
|
88
98
|
|
|
89
|
-
|
|
99
|
+
function getActiveApp() {
|
|
100
|
+
try {
|
|
101
|
+
const platform = os.platform();
|
|
102
|
+
if (platform === 'darwin') {
|
|
103
|
+
const jxa = `ObjC.import("AppKit"); $.NSWorkspace.sharedWorkspace.frontmostApplication.localizedName.js;`;
|
|
104
|
+
return execSync(`osascript -l JavaScript -e '${jxa}' 2>/dev/null`, { encoding: 'utf8' }).trim();
|
|
105
|
+
}
|
|
106
|
+
} catch (e) { }
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = { read, writeHtml, writeText, getActiveApp };
|
package/cli/src/daemon.js
CHANGED
|
@@ -6,6 +6,8 @@ const http = require('http');
|
|
|
6
6
|
console.log('🌌 Quark Daemon Started at', new Date().toISOString());
|
|
7
7
|
|
|
8
8
|
let lastClip = clipboard.read();
|
|
9
|
+
let lastActiveApp = clipboard.getActiveApp();
|
|
10
|
+
let lastProcessedResult = null;
|
|
9
11
|
let isSyncingFromNetwork = false;
|
|
10
12
|
|
|
11
13
|
// Initialize P2P Network
|
|
@@ -101,19 +103,31 @@ const pollInterval = setInterval(async () => {
|
|
|
101
103
|
hasHtml: !!currentClip.html
|
|
102
104
|
});
|
|
103
105
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
const activeApp = clipboard.getActiveApp();
|
|
107
|
+
if (activeApp !== lastActiveApp) {
|
|
108
|
+
logEvent('INFO', `Active App changed: ${activeApp}`);
|
|
109
|
+
// JIT Injection: If we have a cached result, re-optimize for the new app
|
|
110
|
+
if (lastProcessedResult) {
|
|
111
|
+
writeGuard = true;
|
|
112
|
+
injectForTarget(activeApp, lastProcessedResult);
|
|
113
|
+
}
|
|
114
|
+
lastActiveApp = activeApp;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Process through transformers with context
|
|
118
|
+
const result = await transformers.processClipboard(currentClip.text, currentClip.html, activeApp);
|
|
106
119
|
|
|
107
|
-
if (result.changed) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (result.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
120
|
+
if (result.changed || result.markdown) {
|
|
121
|
+
lastProcessedResult = result;
|
|
122
|
+
|
|
123
|
+
if (result.changed) {
|
|
124
|
+
logEvent('TRANSFORM', result.skipReason || 'Applying transformations');
|
|
125
|
+
writeGuard = true;
|
|
126
|
+
injectForTarget(activeApp, result);
|
|
127
|
+
|
|
128
|
+
lastClip = clipboard.read(); // Update to OS state
|
|
129
|
+
network.broadcast(result.text, result.html);
|
|
114
130
|
}
|
|
115
|
-
lastClip = clipboard.read(); // Update to OS state
|
|
116
|
-
network.broadcast(result.text, result.html);
|
|
117
131
|
} else {
|
|
118
132
|
if (result.skipReason) {
|
|
119
133
|
logEvent('INFO', `Skipped: ${result.skipReason}`);
|
|
@@ -124,6 +138,24 @@ const pollInterval = setInterval(async () => {
|
|
|
124
138
|
}
|
|
125
139
|
}, 500);
|
|
126
140
|
|
|
141
|
+
function injectForTarget(app, result) {
|
|
142
|
+
const markdownApps = ['Obsidian', 'Visual Studio Code', 'Cursor', 'Linear', 'GitHub'];
|
|
143
|
+
const isMarkdownTarget = markdownApps.some(m => app && app.includes(m));
|
|
144
|
+
|
|
145
|
+
if (isMarkdownTarget && result.markdown) {
|
|
146
|
+
// For Markdown-friendly apps, we prioritize Markdown in the plain-text flavor
|
|
147
|
+
// This allows pasting into Obsidian to get MD, while keeping HTML for table support if they want it
|
|
148
|
+
clipboard.writeHtml(result.html, result.markdown);
|
|
149
|
+
} else {
|
|
150
|
+
// Standard injection
|
|
151
|
+
if (result.html) {
|
|
152
|
+
clipboard.writeHtml(result.html, result.text);
|
|
153
|
+
} else {
|
|
154
|
+
clipboard.writeText(result.text);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
127
159
|
// Graceful Shutdown
|
|
128
160
|
function shutdown() {
|
|
129
161
|
logEvent('INFO', 'Shutting down Quark Daemon gracefully...');
|
package/cli/src/transformers.js
CHANGED
|
@@ -1,31 +1,53 @@
|
|
|
1
1
|
const { marked } = require('marked');
|
|
2
2
|
|
|
3
|
-
function
|
|
4
|
-
const lines = text.
|
|
5
|
-
if (lines.length < 2) return false;
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
3
|
+
function analyzeGridProperties(text, delimiter) {
|
|
4
|
+
const lines = text.split('\n').map(l => l.trim('\r'));
|
|
5
|
+
if (lines.length < 2) return { isGrid: false };
|
|
6
|
+
|
|
7
|
+
const rows = lines.map(l => l.split(delimiter));
|
|
8
|
+
const counts = rows.map(r => r.length);
|
|
9
|
+
|
|
10
|
+
// A perfect grid has all rows equal length
|
|
11
|
+
const maxCols = Math.max(...counts);
|
|
12
|
+
const minCols = Math.min(...counts);
|
|
13
|
+
|
|
14
|
+
// Mathematical sparse matrix inference:
|
|
15
|
+
// If the delimiter appears consistently across multiple lines, it's a grid.
|
|
16
|
+
// For TSV, even a single tab in multiple lines strongly implies a spreadsheet payload.
|
|
17
|
+
let isGrid = false;
|
|
18
|
+
if (delimiter === '\t') {
|
|
19
|
+
const linesWithTabs = lines.filter(l => l.includes('\t')).length;
|
|
20
|
+
// If at least 50% of lines have tabs, or we have distinct multi-column structure
|
|
21
|
+
isGrid = (linesWithTabs > 0 && linesWithTabs >= (lines.length / 2)) || (maxCols > 1 && counts[0] === counts[1]);
|
|
22
|
+
} else {
|
|
23
|
+
isGrid = maxCols > 2 && minCols === maxCols;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { isGrid, rows, cols: maxCols };
|
|
9
27
|
}
|
|
10
28
|
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
if (lines.length < 2) return false;
|
|
14
|
-
const commas = lines[0].split(',').length;
|
|
15
|
-
return commas > 2 && lines.every(l => l.split(',').length === commas);
|
|
29
|
+
function isExcelTSV(text) {
|
|
30
|
+
return analyzeGridProperties(text, '\t').isGrid;
|
|
16
31
|
}
|
|
17
32
|
|
|
18
33
|
function convertToHTML(text, delimiter) {
|
|
19
|
-
const rows
|
|
34
|
+
const { rows, cols } = analyzeGridProperties(text, delimiter);
|
|
20
35
|
let html = '<table style="border-collapse: collapse; font-family: sans-serif; font-size: 14px;">\n';
|
|
21
36
|
rows.forEach((row, i) => {
|
|
37
|
+
// Drop completely empty trailing rows
|
|
38
|
+
if (i === rows.length - 1 && row.join('').trim() === '') return;
|
|
39
|
+
|
|
22
40
|
html += ' <tr>\n';
|
|
23
|
-
|
|
41
|
+
|
|
42
|
+
// Pad sparse rows with empty cells to maintain grid geometry
|
|
43
|
+
for (let j = 0; j < cols; j++) {
|
|
44
|
+
const cell = row[j] || '';
|
|
24
45
|
const tag = i === 0 ? 'th' : 'td';
|
|
25
46
|
const bg = i === 0 ? 'background-color: #f3f2f1;' : '';
|
|
26
47
|
const style = `border: 1px solid #d1d1d1; padding: 6px 12px; ${bg}`;
|
|
27
48
|
html += ` <${tag} style="${style}">${cell.trim()}</${tag}>\n`;
|
|
28
|
-
}
|
|
49
|
+
}
|
|
50
|
+
|
|
29
51
|
html += ' </tr>\n';
|
|
30
52
|
});
|
|
31
53
|
html += '</table>';
|
|
@@ -156,25 +178,96 @@ function normalizeShouting(text) {
|
|
|
156
178
|
return text;
|
|
157
179
|
}
|
|
158
180
|
|
|
181
|
+
function convertToMarkdown(html) {
|
|
182
|
+
if (!html) return '';
|
|
183
|
+
|
|
184
|
+
// Minimalist HTML to Markdown converter
|
|
185
|
+
let md = html
|
|
186
|
+
.replace(/<style([\s\S]*?)<\/style>/gi, '')
|
|
187
|
+
.replace(/<head([\s\S]*?)<\/head>/gi, '')
|
|
188
|
+
.replace(/<(h[1-6])(.*?)>(.*?)<\/\1>/gi, (m, h, a, c) => `${'#'.repeat(parseInt(h[1]))} ${c}\n\n`)
|
|
189
|
+
.replace(/<p(.*?)>(.*?)<\/p>/gi, '$2\n\n')
|
|
190
|
+
.replace(/<br\s*\/?>/gi, '\n')
|
|
191
|
+
.replace(/<b(.*?)>(.*?)<\/b>/gi, '**$2**')
|
|
192
|
+
.replace(/<strong(.*?)>(.*?)<\/strong>/gi, '**$2**')
|
|
193
|
+
.replace(/<i(.*?)>(.*?)<\/i>/gi, '*$2*')
|
|
194
|
+
.replace(/<em(.*?)>(.*?)<\/em>/gi, '*$2*')
|
|
195
|
+
.replace(/<a.*?href="(.*?)".*?>(.*?)<\/a>/gi, '[$2]($1)')
|
|
196
|
+
.replace(/<ul>([\s\S]*?)<\/ul>/gi, (m, c) => c.replace(/<li(.*?)>(.*?)<\/li>/gi, '- $2\n') + '\n')
|
|
197
|
+
.replace(/<ol>([\s\S]*?)<\/ol>/gi, (m, c) => {
|
|
198
|
+
let i = 1;
|
|
199
|
+
return c.replace(/<li(.*?)>(.*?)<\/li>/gi, () => `${i++}. $2\n`) + '\n';
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// Table handling
|
|
203
|
+
md = md.replace(/<table([\s\S]*?)<\/table>/gi, (m, c) => {
|
|
204
|
+
const rows = [];
|
|
205
|
+
const trMatches = c.match(/<tr([\s\S]*?)<\/tr>/gi);
|
|
206
|
+
if (!trMatches) return '';
|
|
207
|
+
|
|
208
|
+
trMatches.forEach(tr => {
|
|
209
|
+
const cells = [];
|
|
210
|
+
const tdMatches = tr.match(/<(td|th)([\s\S]*?)<\/\1>/gi);
|
|
211
|
+
if (tdMatches) {
|
|
212
|
+
tdMatches.forEach(td => {
|
|
213
|
+
cells.push(td.replace(/<(?:.|\n)*?>/gm, '').trim().replace(/\|/g, '\\|'));
|
|
214
|
+
});
|
|
215
|
+
rows.push('| ' + cells.join(' | ') + ' |');
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
if (rows.length === 0) return '';
|
|
220
|
+
|
|
221
|
+
// Header separator
|
|
222
|
+
const colCount = rows[0].split('|').length - 2;
|
|
223
|
+
const separator = '| ' + Array(colCount).fill('---').join(' | ') + ' |';
|
|
224
|
+
rows.splice(1, 0, separator);
|
|
225
|
+
|
|
226
|
+
return rows.join('\n') + '\n\n';
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Strip remaining tags
|
|
230
|
+
return md.replace(/<(?:.|\n)*?>/gm, '').trim();
|
|
231
|
+
}
|
|
232
|
+
|
|
159
233
|
// The master pipeline
|
|
160
|
-
async function processClipboard(text, originalHtml) {
|
|
161
|
-
let result = { changed: false, text: text, html: originalHtml };
|
|
234
|
+
async function processClipboard(text, originalHtml, targetApp = null) {
|
|
235
|
+
let result = { changed: false, text: text, html: originalHtml, markdown: null };
|
|
236
|
+
|
|
237
|
+
// Calculate markdown if HTML exists
|
|
238
|
+
if (originalHtml) {
|
|
239
|
+
result.markdown = convertToMarkdown(originalHtml);
|
|
240
|
+
}
|
|
162
241
|
|
|
163
|
-
// PRESERVATION HEURISTIC:
|
|
242
|
+
// PRESERVATION HEURISTIC: If high-quality HTML exists, enhance it instead of skipping
|
|
164
243
|
if (originalHtml) {
|
|
165
244
|
const forensicMarkers = [
|
|
166
245
|
'data-sheets-value',
|
|
167
246
|
'data-sheets-userformat',
|
|
168
247
|
'br-re-calc',
|
|
169
248
|
'x-office-spreadsheet',
|
|
170
|
-
'<table',
|
|
171
|
-
'<tbody',
|
|
172
|
-
'<thead'
|
|
173
249
|
];
|
|
250
|
+
const hasSpreadsheetMeta = forensicMarkers.some(marker => originalHtml.toLowerCase().includes(marker));
|
|
251
|
+
const hasTable = originalHtml.toLowerCase().includes('<table');
|
|
252
|
+
|
|
253
|
+
if (hasTable) {
|
|
254
|
+
// Re-style existing tables with inline CSS for universal rendering
|
|
255
|
+
let styledHtml = originalHtml
|
|
256
|
+
.replace(/<table/gi, '<table style="border-collapse: collapse; font-family: sans-serif; font-size: 14px;"')
|
|
257
|
+
.replace(/<th(?=[ >])/gi, '<th style="border: 1px solid #d1d1d1; padding: 6px 12px; background-color: #f3f2f1;"')
|
|
258
|
+
.replace(/<td(?=[ >])/gi, '<td style="border: 1px solid #d1d1d1; padding: 6px 12px;"');
|
|
259
|
+
|
|
260
|
+
return {
|
|
261
|
+
changed: true,
|
|
262
|
+
text: text,
|
|
263
|
+
html: styledHtml,
|
|
264
|
+
markdown: convertToMarkdown(styledHtml),
|
|
265
|
+
skipReason: 'Table re-styled for universal rendering'
|
|
266
|
+
};
|
|
267
|
+
}
|
|
174
268
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return { changed: false, text: text, html: originalHtml, skipReason: 'Forensic structure detected' };
|
|
269
|
+
if (hasSpreadsheetMeta && !hasTable) {
|
|
270
|
+
return { changed: false, text: text, html: originalHtml, markdown: result.markdown, skipReason: 'Spreadsheet metadata preserved' };
|
|
178
271
|
}
|
|
179
272
|
}
|
|
180
273
|
|
|
@@ -201,37 +294,54 @@ async function processClipboard(text, originalHtml) {
|
|
|
201
294
|
// 1. URL Tracking Stripper
|
|
202
295
|
if (text.startsWith('http') && text.includes('utm_')) {
|
|
203
296
|
const clean = stripTrackingParams(text);
|
|
204
|
-
if (clean !== text) return { changed: true, text: clean, html: null };
|
|
297
|
+
if (clean !== text) return { changed: true, text: clean, html: null, markdown: clean };
|
|
205
298
|
}
|
|
206
299
|
|
|
207
300
|
// 2. JSON Prettier
|
|
208
301
|
if ((text.startsWith('{') && text.endsWith('}')) || (text.startsWith('[') && text.endsWith(']'))) {
|
|
209
302
|
const pretty = prettifyJSON(text);
|
|
210
|
-
if (pretty !== text && pretty.includes('\n')) return { changed: true, text: pretty, html: null };
|
|
303
|
+
if (pretty !== text && pretty.includes('\n')) return { changed: true, text: pretty, html: null, markdown: `\`\`\`json\n${pretty}\n\`\`\`` };
|
|
211
304
|
}
|
|
212
305
|
|
|
213
306
|
// 3. Excel TSV to HTML
|
|
214
307
|
if (isExcelTSV(text)) {
|
|
215
|
-
|
|
308
|
+
const tableHtml = convertToHTML(text, '\t');
|
|
309
|
+
return {
|
|
310
|
+
changed: true,
|
|
311
|
+
text: text,
|
|
312
|
+
html: tableHtml,
|
|
313
|
+
markdown: convertToMarkdown(tableHtml)
|
|
314
|
+
};
|
|
216
315
|
}
|
|
217
316
|
|
|
218
317
|
// 4. CSV to HTML
|
|
219
|
-
if (
|
|
220
|
-
|
|
318
|
+
if (!originalHtml && analyzeGridProperties(text, ',').isGrid) {
|
|
319
|
+
const tableHtml = convertToHTML(text, ',');
|
|
320
|
+
return {
|
|
321
|
+
changed: true,
|
|
322
|
+
text: text,
|
|
323
|
+
html: tableHtml,
|
|
324
|
+
markdown: convertToMarkdown(tableHtml)
|
|
325
|
+
};
|
|
221
326
|
}
|
|
222
327
|
|
|
223
328
|
// 5. Full Markdown & Math to HTML
|
|
224
329
|
const mathResult = renderMathFormulas(text);
|
|
225
330
|
if ((isMarkdown(text) || mathResult.hasMath) && !originalHtml) {
|
|
226
331
|
const html = await convertMarkdownToHTML(text);
|
|
227
|
-
return {
|
|
332
|
+
return {
|
|
333
|
+
changed: true,
|
|
334
|
+
text: text,
|
|
335
|
+
html: html,
|
|
336
|
+
markdown: text // If input was MD, use it
|
|
337
|
+
};
|
|
228
338
|
}
|
|
229
339
|
|
|
230
340
|
// 6. PDF Line Breaks (Only apply if it looks like a broken paragraph, heuristic)
|
|
231
341
|
if (text.length > 100 && text.split('\n').length > 3 && !text.includes('\t') && !originalHtml) {
|
|
232
342
|
const fixed = fixPDFLineBreaks(text);
|
|
233
343
|
if (fixed !== text && fixed.length < text.length) {
|
|
234
|
-
return { changed: true, text: fixed, html: null };
|
|
344
|
+
return { changed: true, text: fixed, html: null, markdown: fixed };
|
|
235
345
|
}
|
|
236
346
|
}
|
|
237
347
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--radius-xl:.75rem;--radius-2xl:1rem;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.h-4{height:calc(var(--spacing) * 4)}.h-16{height:calc(var(--spacing) * 16)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.border-collapse{border-collapse:collapse}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-24{gap:calc(var(--spacing) * 24)}.gap-32{gap:calc(var(--spacing) * 32)}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.bg-\[\#fafafa\]{background-color:#fafafa}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.p-0{padding:calc(var(--spacing) * 0)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-32{padding-top:calc(var(--spacing) * 32)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-32{padding-bottom:calc(var(--spacing) * 32)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-black{color:var(--color-black)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.lowercase{text-transform:lowercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.selection\:bg-zinc-200 ::selection{background-color:var(--color-zinc-200)}.selection\:bg-zinc-200::selection{background-color:var(--color-zinc-200)}.selection\:text-black ::selection{color:var(--color-black)}.selection\:text-black::selection{color:var(--color-black)}@media(hover:hover){.hover\:text-black:hover{color:var(--color-black)}.hover\:text-zinc-500:hover{color:var(--color-zinc-500)}.hover\:underline:hover{text-decoration-line:underline}}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media(min-width:48rem){.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:pt-48{padding-top:calc(var(--spacing) * 48)}}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
|
package/dist/index.html
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
}
|
|
20
20
|
}(window.location));
|
|
21
21
|
</script>
|
|
22
|
-
<script type="module" crossorigin src="/quark/assets/index-
|
|
23
|
-
<link rel="stylesheet" crossorigin href="/quark/assets/index-
|
|
22
|
+
<script type="module" crossorigin src="/quark/assets/index-Db7-j4bQ.js"></script>
|
|
23
|
+
<link rel="stylesheet" crossorigin href="/quark/assets/index-CuVu9tSn.css">
|
|
24
24
|
</head>
|
|
25
25
|
<body>
|
|
26
26
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--radius-xl:.75rem;--radius-2xl:1rem;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-32{margin-top:calc(var(--spacing) * 32)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.h-4{height:calc(var(--spacing) * 4)}.h-16{height:calc(var(--spacing) * 16)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.border-collapse{border-collapse:collapse}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-24{gap:calc(var(--spacing) * 24)}.gap-32{gap:calc(var(--spacing) * 32)}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.bg-\[\#fafafa\]{background-color:#fafafa}.bg-white{background-color:var(--color-white)}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab,red,red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.p-0{padding:calc(var(--spacing) * 0)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pt-32{padding-top:calc(var(--spacing) * 32)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-32{padding-bottom:calc(var(--spacing) * 32)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-black{color:var(--color-black)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.lowercase{text-transform:lowercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.selection\:bg-zinc-200 ::selection{background-color:var(--color-zinc-200)}.selection\:bg-zinc-200::selection{background-color:var(--color-zinc-200)}.selection\:text-black ::selection{color:var(--color-black)}.selection\:text-black::selection{color:var(--color-black)}@media(hover:hover){.hover\:text-black:hover{color:var(--color-black)}.hover\:text-zinc-500:hover{color:var(--color-zinc-500)}.hover\:underline:hover{text-decoration-line:underline}}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media(min-width:48rem){.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:pt-48{padding-top:calc(var(--spacing) * 48)}}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
|
|
File without changes
|