@fractaldesign/pop 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +229 -2
- package/dist/core.d.ts +110 -0
- package/dist/core.js +313 -0
- package/dist/full.d.ts +1 -0
- package/dist/full.js +356 -0
- package/dist/gpu.d.ts +59 -0
- package/dist/gpu.js +215 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +524 -0
- package/dist/lang/c.d.ts +5 -0
- package/dist/lang/c.js +90 -0
- package/dist/lang/cpp.d.ts +5 -0
- package/dist/lang/cpp.js +138 -0
- package/dist/lang/csharp.d.ts +5 -0
- package/dist/lang/csharp.js +148 -0
- package/dist/lang/css.d.ts +21 -0
- package/dist/lang/css.js +164 -0
- package/dist/lang/diff.d.ts +30 -0
- package/dist/lang/diff.js +18 -0
- package/dist/lang/dockerfile.d.ts +5 -0
- package/dist/lang/dockerfile.js +60 -0
- package/dist/lang/go.d.ts +5 -0
- package/dist/lang/go.js +91 -0
- package/dist/lang/graphql.d.ts +5 -0
- package/dist/lang/graphql.js +66 -0
- package/dist/lang/hcl.d.ts +5 -0
- package/dist/lang/hcl.js +51 -0
- package/dist/lang/html.d.ts +12 -0
- package/dist/lang/html.js +168 -0
- package/dist/lang/java.d.ts +5 -0
- package/dist/lang/java.js +96 -0
- package/dist/lang/javascript.d.ts +5 -0
- package/dist/lang/javascript.js +0 -0
- package/dist/lang/json.d.ts +5 -0
- package/dist/lang/json.js +47 -0
- package/dist/lang/kotlin.d.ts +5 -0
- package/dist/lang/kotlin.js +113 -0
- package/dist/lang/lua.d.ts +5 -0
- package/dist/lang/lua.js +65 -0
- package/dist/lang/markdown.d.ts +12 -0
- package/dist/lang/markdown.js +172 -0
- package/dist/lang/php.d.ts +5 -0
- package/dist/lang/php.js +129 -0
- package/dist/lang/plaintext.d.ts +7 -0
- package/dist/lang/plaintext.js +3 -0
- package/dist/lang/powershell.d.ts +5 -0
- package/dist/lang/powershell.js +74 -0
- package/dist/lang/python.d.ts +5 -0
- package/dist/lang/python.js +75 -0
- package/dist/lang/ruby.d.ts +5 -0
- package/dist/lang/ruby.js +84 -0
- package/dist/lang/rust.d.ts +5 -0
- package/dist/lang/rust.js +95 -0
- package/dist/lang/sass.d.ts +15 -0
- package/dist/lang/sass.js +201 -0
- package/dist/lang/scss.d.ts +14 -0
- package/dist/lang/scss.js +105 -0
- package/dist/lang/shell.d.ts +5 -0
- package/dist/lang/shell.js +64 -0
- package/dist/lang/sql.d.ts +5 -0
- package/dist/lang/sql.js +129 -0
- package/dist/lang/svelte.d.ts +15 -0
- package/dist/lang/svelte.js +0 -0
- package/dist/lang/swift.d.ts +5 -0
- package/dist/lang/swift.js +125 -0
- package/dist/lang/toml.d.ts +5 -0
- package/dist/lang/toml.js +45 -0
- package/dist/lang/typescript.d.ts +5 -0
- package/dist/lang/typescript.js +0 -0
- package/dist/lang/yaml.d.ts +5 -0
- package/dist/lang/yaml.js +64 -0
- package/dist/lang/zig.d.ts +5 -0
- package/dist/lang/zig.js +133 -0
- package/dist/lang.d.ts +30 -0
- package/dist/lang.js +345 -0
- package/dist/theme.d.ts +102 -0
- package/dist/theme.js +132 -0
- package/package.json +70 -4
package/dist/lang.js
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { config as config$1 } from './lang/typescript.js';
|
|
2
|
+
import { config } from './lang/plaintext.js';
|
|
3
|
+
|
|
4
|
+
/** Mutable registry that maps a canonical language id to its parse config. */ const configRegistry = new Map();
|
|
5
|
+
function registerLanguageConfig(id, config) {
|
|
6
|
+
configRegistry.set(id, config);
|
|
7
|
+
}
|
|
8
|
+
function getLanguageConfig(id) {
|
|
9
|
+
return configRegistry.get(id);
|
|
10
|
+
}
|
|
11
|
+
function resetLanguageConfigRegistry() {
|
|
12
|
+
configRegistry.clear();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const languageRegistry = new Map();
|
|
16
|
+
function normalizeLanguageName(value) {
|
|
17
|
+
return value.trim().toLowerCase().replace(/^\./, '');
|
|
18
|
+
}
|
|
19
|
+
function registerName(name, language) {
|
|
20
|
+
const normalized = normalizeLanguageName(name);
|
|
21
|
+
if (!normalized) return;
|
|
22
|
+
const existing = languageRegistry.get(normalized);
|
|
23
|
+
if (existing && existing.id !== language.id) {
|
|
24
|
+
throw new Error(`Language name "${normalized}" is shared by "${existing.id}" and "${language.id}"`);
|
|
25
|
+
}
|
|
26
|
+
languageRegistry.set(normalized, language);
|
|
27
|
+
}
|
|
28
|
+
function registerLanguage(language, config) {
|
|
29
|
+
const names = new Set([
|
|
30
|
+
language.id,
|
|
31
|
+
language.extension,
|
|
32
|
+
...language.aliases
|
|
33
|
+
]);
|
|
34
|
+
for (const name of names){
|
|
35
|
+
registerName(name, language);
|
|
36
|
+
}
|
|
37
|
+
if (config) {
|
|
38
|
+
registerLanguageConfig(language.id, config);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function setDefaults(input) {
|
|
42
|
+
resetLanguageRegistry();
|
|
43
|
+
resetLanguageConfigRegistry();
|
|
44
|
+
if (Array.isArray(input)) {
|
|
45
|
+
for (const language of input){
|
|
46
|
+
registerLanguage(language);
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
for (const [id, config] of Object.entries(input)){
|
|
50
|
+
const language = allLanguages.find((l)=>l.id === id);
|
|
51
|
+
if (language) {
|
|
52
|
+
registerLanguage(language, config);
|
|
53
|
+
} else {
|
|
54
|
+
registerLanguage({
|
|
55
|
+
id,
|
|
56
|
+
extension: id,
|
|
57
|
+
aliases: []
|
|
58
|
+
}, config);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const configImporters = {
|
|
64
|
+
javascript: ()=>import('./lang/javascript.js'),
|
|
65
|
+
typescript: ()=>import('./lang/typescript.js'),
|
|
66
|
+
css: ()=>import('./lang/css.js'),
|
|
67
|
+
scss: ()=>import('./lang/scss.js'),
|
|
68
|
+
sass: ()=>import('./lang/sass.js'),
|
|
69
|
+
html: ()=>import('./lang/html.js'),
|
|
70
|
+
svelte: ()=>import('./lang/svelte.js'),
|
|
71
|
+
markdown: ()=>import('./lang/markdown.js'),
|
|
72
|
+
diff: ()=>import('./lang/diff.js'),
|
|
73
|
+
plaintext: ()=>import('./lang/plaintext.js'),
|
|
74
|
+
c: ()=>import('./lang/c.js'),
|
|
75
|
+
cpp: ()=>import('./lang/cpp.js'),
|
|
76
|
+
csharp: ()=>import('./lang/csharp.js'),
|
|
77
|
+
dockerfile: ()=>import('./lang/dockerfile.js'),
|
|
78
|
+
go: ()=>import('./lang/go.js'),
|
|
79
|
+
graphql: ()=>import('./lang/graphql.js'),
|
|
80
|
+
hcl: ()=>import('./lang/hcl.js'),
|
|
81
|
+
java: ()=>import('./lang/java.js'),
|
|
82
|
+
json: ()=>import('./lang/json.js'),
|
|
83
|
+
kotlin: ()=>import('./lang/kotlin.js'),
|
|
84
|
+
lua: ()=>import('./lang/lua.js'),
|
|
85
|
+
php: ()=>import('./lang/php.js'),
|
|
86
|
+
powershell: ()=>import('./lang/powershell.js'),
|
|
87
|
+
python: ()=>import('./lang/python.js'),
|
|
88
|
+
ruby: ()=>import('./lang/ruby.js'),
|
|
89
|
+
rust: ()=>import('./lang/rust.js'),
|
|
90
|
+
shell: ()=>import('./lang/shell.js'),
|
|
91
|
+
sql: ()=>import('./lang/sql.js'),
|
|
92
|
+
swift: ()=>import('./lang/swift.js'),
|
|
93
|
+
toml: ()=>import('./lang/toml.js'),
|
|
94
|
+
yaml: ()=>import('./lang/yaml.js'),
|
|
95
|
+
zig: ()=>import('./lang/zig.js')
|
|
96
|
+
};
|
|
97
|
+
async function importDefaults(ids) {
|
|
98
|
+
await Promise.all(ids.map(async (id)=>{
|
|
99
|
+
const importer = configImporters[id];
|
|
100
|
+
if (!importer) return;
|
|
101
|
+
const { config } = await importer();
|
|
102
|
+
const language = allLanguages.find((l)=>l.id === id);
|
|
103
|
+
if (language) {
|
|
104
|
+
registerLanguage(language, config);
|
|
105
|
+
} else {
|
|
106
|
+
registerLanguage({
|
|
107
|
+
id,
|
|
108
|
+
extension: id,
|
|
109
|
+
aliases: []
|
|
110
|
+
}, config);
|
|
111
|
+
}
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
/** Find canonical language metadata by name, alias, or extension. */ function findLanguage(name) {
|
|
115
|
+
if (typeof name !== 'string') return undefined;
|
|
116
|
+
return languageRegistry.get(normalizeLanguageName(name));
|
|
117
|
+
}
|
|
118
|
+
/** Resolve a name/alias/extension to its canonical language id. */ function lang(name) {
|
|
119
|
+
return findLanguage(name)?.id;
|
|
120
|
+
}
|
|
121
|
+
/** Alias for {@link lang}. */ const canonicalizeLang = lang;
|
|
122
|
+
function getRegisteredLanguages() {
|
|
123
|
+
return [
|
|
124
|
+
...new Set(languageRegistry.values())
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
function resetLanguageRegistry() {
|
|
128
|
+
languageRegistry.clear();
|
|
129
|
+
}
|
|
130
|
+
const allLanguages = [
|
|
131
|
+
{
|
|
132
|
+
id: 'javascript',
|
|
133
|
+
extension: 'js',
|
|
134
|
+
aliases: [
|
|
135
|
+
'jsx',
|
|
136
|
+
'node'
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 'typescript',
|
|
141
|
+
extension: 'ts',
|
|
142
|
+
aliases: [
|
|
143
|
+
'tsx'
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'css',
|
|
148
|
+
extension: 'css',
|
|
149
|
+
aliases: []
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'scss',
|
|
153
|
+
extension: 'scss',
|
|
154
|
+
aliases: []
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: 'sass',
|
|
158
|
+
extension: 'sass',
|
|
159
|
+
aliases: [
|
|
160
|
+
'indented-sass'
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 'html',
|
|
165
|
+
extension: 'html',
|
|
166
|
+
aliases: [
|
|
167
|
+
'htm',
|
|
168
|
+
'xml'
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: 'svelte',
|
|
173
|
+
extension: 'svelte',
|
|
174
|
+
aliases: []
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'markdown',
|
|
178
|
+
extension: 'md',
|
|
179
|
+
aliases: [
|
|
180
|
+
'md',
|
|
181
|
+
'mdx',
|
|
182
|
+
'svx'
|
|
183
|
+
]
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: 'diff',
|
|
187
|
+
extension: 'diff',
|
|
188
|
+
aliases: [
|
|
189
|
+
'patch'
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
id: 'plaintext',
|
|
194
|
+
extension: 'txt',
|
|
195
|
+
aliases: [
|
|
196
|
+
'text',
|
|
197
|
+
'plain'
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: 'c',
|
|
202
|
+
extension: 'c',
|
|
203
|
+
aliases: []
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'cpp',
|
|
207
|
+
extension: 'cpp',
|
|
208
|
+
aliases: [
|
|
209
|
+
'c++',
|
|
210
|
+
'cc',
|
|
211
|
+
'cxx'
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: 'csharp',
|
|
216
|
+
extension: 'cs',
|
|
217
|
+
aliases: [
|
|
218
|
+
'c#',
|
|
219
|
+
'dotnet'
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'dockerfile',
|
|
224
|
+
extension: 'dockerfile',
|
|
225
|
+
aliases: [
|
|
226
|
+
'docker'
|
|
227
|
+
]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
id: 'go',
|
|
231
|
+
extension: 'go',
|
|
232
|
+
aliases: [
|
|
233
|
+
'golang'
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
id: 'graphql',
|
|
238
|
+
extension: 'graphql',
|
|
239
|
+
aliases: [
|
|
240
|
+
'gql'
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'hcl',
|
|
245
|
+
extension: 'hcl',
|
|
246
|
+
aliases: [
|
|
247
|
+
'terraform',
|
|
248
|
+
'tf'
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
id: 'java',
|
|
253
|
+
extension: 'java',
|
|
254
|
+
aliases: []
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
id: 'json',
|
|
258
|
+
extension: 'json',
|
|
259
|
+
aliases: [
|
|
260
|
+
'jsonc'
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
id: 'kotlin',
|
|
265
|
+
extension: 'kt',
|
|
266
|
+
aliases: [
|
|
267
|
+
'kts'
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
id: 'lua',
|
|
272
|
+
extension: 'lua',
|
|
273
|
+
aliases: []
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: 'php',
|
|
277
|
+
extension: 'php',
|
|
278
|
+
aliases: []
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
id: 'powershell',
|
|
282
|
+
extension: 'ps1',
|
|
283
|
+
aliases: [
|
|
284
|
+
'pwsh'
|
|
285
|
+
]
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'python',
|
|
289
|
+
extension: 'py',
|
|
290
|
+
aliases: [
|
|
291
|
+
'python3'
|
|
292
|
+
]
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
id: 'ruby',
|
|
296
|
+
extension: 'rb',
|
|
297
|
+
aliases: []
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
id: 'rust',
|
|
301
|
+
extension: 'rs',
|
|
302
|
+
aliases: []
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
id: 'shell',
|
|
306
|
+
extension: 'sh',
|
|
307
|
+
aliases: [
|
|
308
|
+
'bash',
|
|
309
|
+
'zsh'
|
|
310
|
+
]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
id: 'sql',
|
|
314
|
+
extension: 'sql',
|
|
315
|
+
aliases: []
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
id: 'swift',
|
|
319
|
+
extension: 'swift',
|
|
320
|
+
aliases: []
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
id: 'toml',
|
|
324
|
+
extension: 'toml',
|
|
325
|
+
aliases: []
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
id: 'yaml',
|
|
329
|
+
extension: 'yaml',
|
|
330
|
+
aliases: [
|
|
331
|
+
'yml'
|
|
332
|
+
]
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
id: 'zig',
|
|
336
|
+
extension: 'zig',
|
|
337
|
+
aliases: []
|
|
338
|
+
}
|
|
339
|
+
];
|
|
340
|
+
setDefaults({
|
|
341
|
+
typescript: config$1,
|
|
342
|
+
plaintext: config
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
export { allLanguages, canonicalizeLang, findLanguage, getLanguageConfig, getRegisteredLanguages, importDefaults, lang, registerLanguage, resetLanguageRegistry, setDefaults };
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fractalpop core — token model, line assembly, and rendering.
|
|
3
|
+
*
|
|
4
|
+
* Design: tokens are numeric `[type, value]` pairs during lexing (fast Set/array
|
|
5
|
+
* work); the string type names are resolved only at render. Output is an HTML
|
|
6
|
+
* string with no DOM required — so SSR and client produce identical markup.
|
|
7
|
+
*/
|
|
8
|
+
/** The stable, ordered token-type list. This list is the theming contract:
|
|
9
|
+
* each type maps to one CSS variable `--fp-<type>` and one class `fp__token--<type>`. */
|
|
10
|
+
declare const TokenTypes: readonly ["identifier", "keyword", "string", "class", "property", "entity", "jsxliterals", "sign", "comment", "break", "space"];
|
|
11
|
+
type TokenType = (typeof TokenTypes)[number];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* fractalpop theme system — token palette mappings and default themes.
|
|
15
|
+
*
|
|
16
|
+
* A theme is either a single ThemePalette, or a composite { light, dark } pair
|
|
17
|
+
* rendered with CSS light-dark().
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
type ThemeToken = Exclude<TokenType, 'break' | 'space'>;
|
|
21
|
+
type ThemePalette = Readonly<{
|
|
22
|
+
background: string;
|
|
23
|
+
foreground: string;
|
|
24
|
+
caret?: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
control?: string;
|
|
27
|
+
lineNumber?: string;
|
|
28
|
+
lineHighlight?: string;
|
|
29
|
+
} & Partial<Record<ThemeToken, string>>>;
|
|
30
|
+
type Theme = ThemePalette | Readonly<{
|
|
31
|
+
light: ThemePalette;
|
|
32
|
+
dark: ThemePalette;
|
|
33
|
+
}>;
|
|
34
|
+
declare const tokenKeys: readonly ThemeToken[];
|
|
35
|
+
/** Convert a ThemePalette into a dictionary of CSS property declarations. */
|
|
36
|
+
declare function paletteVars(p: ThemePalette): Record<string, string>;
|
|
37
|
+
/** Return an inline `style` string of theme variables, or '' when no theme is given. */
|
|
38
|
+
declare function themeStyle(theme: Theme | undefined): string;
|
|
39
|
+
/** Emit a copyable CSS block of --fp-* variables for a given selector. */
|
|
40
|
+
declare function themeCss(selector: string, theme: Theme): string;
|
|
41
|
+
/** SvelteKit theme (Light) */
|
|
42
|
+
declare const sveltekitLight: ThemePalette;
|
|
43
|
+
/** SvelteKit theme (Dark) */
|
|
44
|
+
declare const sveltekitDark: ThemePalette;
|
|
45
|
+
/** SvelteKit theme (adaptive light/dark via CSS light-dark()) */
|
|
46
|
+
declare const sveltekit: Theme;
|
|
47
|
+
/** VS Code theme (Light) */
|
|
48
|
+
declare const vscodeLight: ThemePalette;
|
|
49
|
+
/** VS Code theme (Dark) */
|
|
50
|
+
declare const vscodeDark: ThemePalette;
|
|
51
|
+
/** VS Code theme (adaptive light/dark via CSS light-dark()) */
|
|
52
|
+
declare const vscode: Theme;
|
|
53
|
+
/** Shipped default themes bundle */
|
|
54
|
+
declare const themes: {
|
|
55
|
+
readonly sveltekit: Readonly<{
|
|
56
|
+
light: ThemePalette;
|
|
57
|
+
dark: ThemePalette;
|
|
58
|
+
}>;
|
|
59
|
+
readonly sveltekitLight: Readonly<{
|
|
60
|
+
background: string;
|
|
61
|
+
foreground: string;
|
|
62
|
+
caret?: string;
|
|
63
|
+
title?: string;
|
|
64
|
+
control?: string;
|
|
65
|
+
lineNumber?: string;
|
|
66
|
+
lineHighlight?: string;
|
|
67
|
+
} & Partial<Record<ThemeToken, string>>>;
|
|
68
|
+
readonly sveltekitDark: Readonly<{
|
|
69
|
+
background: string;
|
|
70
|
+
foreground: string;
|
|
71
|
+
caret?: string;
|
|
72
|
+
title?: string;
|
|
73
|
+
control?: string;
|
|
74
|
+
lineNumber?: string;
|
|
75
|
+
lineHighlight?: string;
|
|
76
|
+
} & Partial<Record<ThemeToken, string>>>;
|
|
77
|
+
readonly vscode: Readonly<{
|
|
78
|
+
light: ThemePalette;
|
|
79
|
+
dark: ThemePalette;
|
|
80
|
+
}>;
|
|
81
|
+
readonly vscodeLight: Readonly<{
|
|
82
|
+
background: string;
|
|
83
|
+
foreground: string;
|
|
84
|
+
caret?: string;
|
|
85
|
+
title?: string;
|
|
86
|
+
control?: string;
|
|
87
|
+
lineNumber?: string;
|
|
88
|
+
lineHighlight?: string;
|
|
89
|
+
} & Partial<Record<ThemeToken, string>>>;
|
|
90
|
+
readonly vscodeDark: Readonly<{
|
|
91
|
+
background: string;
|
|
92
|
+
foreground: string;
|
|
93
|
+
caret?: string;
|
|
94
|
+
title?: string;
|
|
95
|
+
control?: string;
|
|
96
|
+
lineNumber?: string;
|
|
97
|
+
lineHighlight?: string;
|
|
98
|
+
} & Partial<Record<ThemeToken, string>>>;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export { paletteVars, sveltekit, sveltekitDark, sveltekitLight, themeCss, themeStyle, themes, tokenKeys, vscode, vscodeDark, vscodeLight };
|
|
102
|
+
export type { Theme, ThemePalette, ThemeToken };
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fractalpop theme system — token palette mappings and default themes.
|
|
3
|
+
*
|
|
4
|
+
* A theme is either a single ThemePalette, or a composite { light, dark } pair
|
|
5
|
+
* rendered with CSS light-dark().
|
|
6
|
+
*/ const tokenKeys = [
|
|
7
|
+
'identifier',
|
|
8
|
+
'keyword',
|
|
9
|
+
'string',
|
|
10
|
+
'class',
|
|
11
|
+
'property',
|
|
12
|
+
'entity',
|
|
13
|
+
'jsxliterals',
|
|
14
|
+
'sign',
|
|
15
|
+
'comment'
|
|
16
|
+
];
|
|
17
|
+
const lightDark = (light, dark)=>`light-dark(${light}, ${dark})`;
|
|
18
|
+
/** Convert a ThemePalette into a dictionary of CSS property declarations. */ function paletteVars(p) {
|
|
19
|
+
const v = {
|
|
20
|
+
'background-color': p.background,
|
|
21
|
+
color: p.foreground,
|
|
22
|
+
'--fp-caret-color': p.caret ?? p.foreground,
|
|
23
|
+
'--fp-title-color': p.title ?? p.foreground,
|
|
24
|
+
'--fp-control-color': p.control ?? p.comment ?? p.foreground,
|
|
25
|
+
'--fp-line-number-color': p.lineNumber ?? p.comment ?? p.foreground,
|
|
26
|
+
'--fp-line-highlight-color': p.lineHighlight ?? 'color-mix(in srgb, currentColor 12%, transparent)'
|
|
27
|
+
};
|
|
28
|
+
for (const t of tokenKeys)v[`--fp-${t}`] = p[t] ?? p.foreground;
|
|
29
|
+
return v;
|
|
30
|
+
}
|
|
31
|
+
function toCss(vars) {
|
|
32
|
+
return Object.entries(vars).map(([k, val])=>`${k}:${val}`).join(';');
|
|
33
|
+
}
|
|
34
|
+
/** Return an inline `style` string of theme variables, or '' when no theme is given. */ function themeStyle(theme) {
|
|
35
|
+
if (!theme) return '';
|
|
36
|
+
if (!('light' in theme)) return toCss(paletteVars(theme));
|
|
37
|
+
const light = paletteVars(theme.light);
|
|
38
|
+
const dark = paletteVars(theme.dark);
|
|
39
|
+
const merged = {};
|
|
40
|
+
for (const key of Object.keys(light))merged[key] = lightDark(light[key], dark[key]);
|
|
41
|
+
return toCss(merged);
|
|
42
|
+
}
|
|
43
|
+
/** Emit a copyable CSS block of --fp-* variables for a given selector. */ function themeCss(selector, theme) {
|
|
44
|
+
if (!('light' in theme)) {
|
|
45
|
+
const vars = paletteVars(theme);
|
|
46
|
+
const lines = Object.entries(vars).map(([k, v])=>` ${k}: ${v};`);
|
|
47
|
+
return `${selector} {\n${lines.join('\n')}\n}`;
|
|
48
|
+
}
|
|
49
|
+
const lightVars = paletteVars(theme.light);
|
|
50
|
+
const darkVars = paletteVars(theme.dark);
|
|
51
|
+
const lightLines = Object.entries(lightVars).map(([k, v])=>` ${k}: ${v};`);
|
|
52
|
+
const darkLines = Object.entries(darkVars).map(([k, v])=>` ${k}: ${v};`);
|
|
53
|
+
return [
|
|
54
|
+
`${selector} {\n${lightLines.join('\n')}\n}`,
|
|
55
|
+
`@media (prefers-color-scheme: dark) {\n ${selector} {\n ${darkLines.join('\n ')}\n }\n}`,
|
|
56
|
+
`[data-theme="dark"] ${selector}, ${selector}[data-theme="dark"] {\n${darkLines.join('\n')}\n}`
|
|
57
|
+
].join('\n\n');
|
|
58
|
+
}
|
|
59
|
+
/** SvelteKit theme (Light) */ const sveltekitLight = {
|
|
60
|
+
background: '#FFFFFF',
|
|
61
|
+
foreground: '#313131',
|
|
62
|
+
class: '#DE2D00',
|
|
63
|
+
identifier: '#414141',
|
|
64
|
+
sign: '#FF4500',
|
|
65
|
+
property: '#787676',
|
|
66
|
+
entity: '#313131',
|
|
67
|
+
jsxliterals: '#FA3701',
|
|
68
|
+
string: '#FA3701',
|
|
69
|
+
keyword: '#FA3701',
|
|
70
|
+
comment: '#6e6d6d',
|
|
71
|
+
caret: '#FF4500'
|
|
72
|
+
};
|
|
73
|
+
/** SvelteKit theme (Dark) */ const sveltekitDark = {
|
|
74
|
+
background: '#212121',
|
|
75
|
+
foreground: '#c7c6c6',
|
|
76
|
+
class: '#DE2D00',
|
|
77
|
+
identifier: '#7a7878',
|
|
78
|
+
sign: '#FF4500',
|
|
79
|
+
property: '#e1dfdf',
|
|
80
|
+
entity: '#fff8f8',
|
|
81
|
+
jsxliterals: '#FA3701',
|
|
82
|
+
string: '#FA3701',
|
|
83
|
+
keyword: '#FA3701',
|
|
84
|
+
comment: '#6e6d6d',
|
|
85
|
+
caret: '#FF4500'
|
|
86
|
+
};
|
|
87
|
+
/** SvelteKit theme (adaptive light/dark via CSS light-dark()) */ const sveltekit = {
|
|
88
|
+
light: sveltekitLight,
|
|
89
|
+
dark: sveltekitDark
|
|
90
|
+
};
|
|
91
|
+
/** VS Code theme (Light) */ const vscodeLight = {
|
|
92
|
+
background: '#f6f8fa',
|
|
93
|
+
foreground: '#24292f',
|
|
94
|
+
class: '#6f42c1',
|
|
95
|
+
identifier: '#24292f',
|
|
96
|
+
sign: '#24292f',
|
|
97
|
+
property: '#0550ae',
|
|
98
|
+
entity: '#953800',
|
|
99
|
+
jsxliterals: '#8250df',
|
|
100
|
+
string: '#032f62',
|
|
101
|
+
keyword: '#cf222e',
|
|
102
|
+
comment: '#6e7781',
|
|
103
|
+
caret: '#24292f'
|
|
104
|
+
};
|
|
105
|
+
/** VS Code theme (Dark) */ const vscodeDark = {
|
|
106
|
+
background: '#1e1e1e',
|
|
107
|
+
foreground: '#9cdcfe',
|
|
108
|
+
class: '#4ec9b0',
|
|
109
|
+
identifier: '#9cdcfe',
|
|
110
|
+
sign: '#d4d4d4',
|
|
111
|
+
property: '#9cdcfe',
|
|
112
|
+
entity: '#dcdcaa',
|
|
113
|
+
jsxliterals: '#ff8c42',
|
|
114
|
+
string: '#ce9178',
|
|
115
|
+
keyword: '#569cd6',
|
|
116
|
+
comment: '#6a9955',
|
|
117
|
+
caret: '#aeafad'
|
|
118
|
+
};
|
|
119
|
+
/** VS Code theme (adaptive light/dark via CSS light-dark()) */ const vscode = {
|
|
120
|
+
light: vscodeLight,
|
|
121
|
+
dark: vscodeDark
|
|
122
|
+
};
|
|
123
|
+
/** Shipped default themes bundle */ const themes = {
|
|
124
|
+
sveltekit,
|
|
125
|
+
sveltekitLight,
|
|
126
|
+
sveltekitDark,
|
|
127
|
+
vscode,
|
|
128
|
+
vscodeLight,
|
|
129
|
+
vscodeDark
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export { paletteVars, sveltekit, sveltekitDark, sveltekitLight, themeCss, themeStyle, themes, tokenKeys, vscode, vscodeDark, vscodeLight };
|
package/package.json
CHANGED
|
@@ -1,6 +1,72 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fractaldesign/pop",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Lightweight, Svelte-first syntax highlighting with first-class indented Sass. Returns HTML without a DOM.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"./dist/full.js"
|
|
8
|
+
],
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/fractalmandala/fractalpop.git",
|
|
13
|
+
"directory": "packages/core"
|
|
14
|
+
},
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./core": {
|
|
23
|
+
"types": "./dist/core.d.ts",
|
|
24
|
+
"default": "./dist/core.js"
|
|
25
|
+
},
|
|
26
|
+
"./lang": {
|
|
27
|
+
"types": "./dist/lang.d.ts",
|
|
28
|
+
"default": "./dist/lang.js"
|
|
29
|
+
},
|
|
30
|
+
"./lang/*": {
|
|
31
|
+
"types": "./dist/lang/*.d.ts",
|
|
32
|
+
"default": "./dist/lang/*.js"
|
|
33
|
+
},
|
|
34
|
+
"./full": {
|
|
35
|
+
"types": "./dist/full.d.ts",
|
|
36
|
+
"default": "./dist/full.js"
|
|
37
|
+
},
|
|
38
|
+
"./gpu": {
|
|
39
|
+
"types": "./dist/gpu.d.ts",
|
|
40
|
+
"default": "./dist/gpu.js"
|
|
41
|
+
},
|
|
42
|
+
"./theme": {
|
|
43
|
+
"types": "./dist/theme.d.ts",
|
|
44
|
+
"default": "./dist/theme.js"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"gpu-lexer": ">=0.0.2"
|
|
49
|
+
},
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"gpu-lexer": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist"
|
|
57
|
+
],
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "bunchee",
|
|
63
|
+
"dev": "bunchee --watch",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"clean": "rm -rf dist"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"bunchee": "^6.0.0",
|
|
69
|
+
"typescript": "^5.6.0",
|
|
70
|
+
"vitest": "^4.1.11"
|
|
71
|
+
}
|
|
72
|
+
}
|