@corenel/ui-kit 0.1.0 → 0.3.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/dist/FieldControls.d.ts +84 -0
- package/dist/FieldControls.d.ts.map +1 -0
- package/dist/FieldControls.js +93 -0
- package/dist/FieldControls.js.map +1 -0
- package/dist/basicLanguages.d.ts +26 -0
- package/dist/basicLanguages.d.ts.map +1 -0
- package/dist/basicLanguages.js +99 -0
- package/dist/basicLanguages.js.map +1 -0
- package/dist/host.d.ts +6 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js.map +1 -1
- package/dist/icons.d.ts +14 -2
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +18 -4
- package/dist/icons.js.map +1 -1
- package/dist/languages.d.ts +9 -0
- package/dist/languages.d.ts.map +1 -1
- package/dist/languages.js +18 -0
- package/dist/languages.js.map +1 -1
- package/dist/monacoColorize.d.ts +1 -2
- package/dist/monacoColorize.d.ts.map +1 -1
- package/dist/monacoColorize.js +36 -97
- package/dist/monacoColorize.js.map +1 -1
- package/dist/theme.d.ts +16 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +44 -5
- package/dist/theme.js.map +1 -1
- package/dist/ui-helpers.d.ts +10 -0
- package/dist/ui-helpers.d.ts.map +1 -1
- package/dist/ui-helpers.js +71 -2
- package/dist/ui-helpers.js.map +1 -1
- package/dist/usage.d.ts +3 -1
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +9 -0
- package/dist/usage.js.map +1 -1
- package/dist/useEscape.d.ts +2 -0
- package/dist/useEscape.d.ts.map +1 -0
- package/dist/useEscape.js +40 -0
- package/dist/useEscape.js.map +1 -0
- package/package.json +25 -31
package/dist/languages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../languages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../languages.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,MAAM,wCAAwC,CAAC;AAEtE;;;sDAGsD;AACtD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;+DAC2D;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;uDACmD;IACnD,QAAQ,CAAC,MAAM,EAAE,OAAO,MAAM,GAAG,IAAI,CAAC;IACtC,uDAAuD;IACvD,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAKD,uFAAuF;AACvF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAEtE;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CAExD;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE3E;AAED;;wEAEwE;AACxE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQtE;AAED,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,MAAM,GAAG,IAAI,CAMrE;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
|
package/dist/languages.js
CHANGED
|
@@ -12,6 +12,19 @@ export function languageExtensions() {
|
|
|
12
12
|
export function languageExtension(id) {
|
|
13
13
|
return registry.get(id);
|
|
14
14
|
}
|
|
15
|
+
/** The language id claiming a file extension (lowercase, no leading dot), or
|
|
16
|
+
* undefined. Plain metadata scan — safe from monaco-free callers (langForPath,
|
|
17
|
+
* the file-open gate); the registry never imports monaco at runtime. */
|
|
18
|
+
export function languageIdForExtension(ext) {
|
|
19
|
+
const e = ext.toLowerCase();
|
|
20
|
+
for (const x of registry.values()) {
|
|
21
|
+
for (const claimed of x.extensions) {
|
|
22
|
+
if ((claimed.startsWith('.') ? claimed.slice(1) : claimed).toLowerCase() === e)
|
|
23
|
+
return x.id;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
15
28
|
/** Install every registered language extension against `monaco`, once each. */
|
|
16
29
|
export function ensureLanguagesRegistered(monaco) {
|
|
17
30
|
for (const ext of registry.values()) {
|
|
@@ -26,4 +39,9 @@ export function ensureLanguagesRegistered(monaco) {
|
|
|
26
39
|
}
|
|
27
40
|
}
|
|
28
41
|
}
|
|
42
|
+
/** Test-only reset of the registry's module state. */
|
|
43
|
+
export function clearLanguageExtensions() {
|
|
44
|
+
registry.clear();
|
|
45
|
+
installed.clear();
|
|
46
|
+
}
|
|
29
47
|
//# sourceMappingURL=languages.js.map
|
package/dist/languages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"languages.js","sourceRoot":"","sources":["../languages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"languages.js","sourceRoot":"","sources":["../languages.ts"],"names":[],"mappings":"AAkCA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;AACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;AAEpC,uFAAuF;AACvF,MAAM,UAAU,yBAAyB,CAAC,GAAsB;IAC9D,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;wEAEwE;AACxE,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CAAC,MAAqB;IAC7D,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QACpC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC;YAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,uBAAuB;IACrC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAAC,SAAS,CAAC,KAAK,EAAE,CAAC;AACtC,CAAC"}
|
package/dist/monacoColorize.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
/** Resolve a fence tag to a supported Monaco language id, or null if unsupported.
|
|
2
|
-
* Supported ids are exactly the LOADERS keys (defined below; read at call time). */
|
|
1
|
+
/** Resolve a fence tag to a supported Monaco language id, or null if unsupported. */
|
|
3
2
|
export declare function monacoLangId(lang: string): string | null;
|
|
4
3
|
/** Highlight `code` as `lang` via Monaco, returning themed HTML (with `.mtkN`
|
|
5
4
|
* token spans), or null when the language is unsupported or tokenization fails. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monacoColorize.d.ts","sourceRoot":"","sources":["../monacoColorize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"monacoColorize.d.ts","sourceRoot":"","sources":["../monacoColorize.ts"],"names":[],"mappings":"AAoCA,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AA6BD;mFACmF;AACnF,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWvF"}
|
package/dist/monacoColorize.js
CHANGED
|
@@ -2,122 +2,62 @@
|
|
|
2
2
|
*
|
|
3
3
|
* Uses monaco.editor.colorize() — the Monarch tokenizer rendered to an HTML
|
|
4
4
|
* string — so code blocks highlight with the SAME engine and theme as the
|
|
5
|
-
* document editor (no second highlighter to drift).
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* document editor (no second highlighter to drift). Which languages exist and
|
|
6
|
+
* how fence tags resolve comes from the basic-language pack (basicLanguages.ts)
|
|
7
|
+
* — the same single table the editor's langForPath and monaco registration
|
|
8
|
+
* use, so the two surfaces cannot drift. Grammar bodies stay lazy per-language
|
|
9
|
+
* chunks behind registerTokensProviderFactory; colorize() awaits the factory,
|
|
10
|
+
* so the first block of a language fetches its grammar and later ones hit the
|
|
11
|
+
* registry.
|
|
8
12
|
*
|
|
9
|
-
* Lazy: Monaco + the
|
|
13
|
+
* Lazy: Monaco + the pack install on the first colorize call, so a transcript
|
|
10
14
|
* with no code blocks never pulls them in. Callers keep their own synchronous
|
|
11
15
|
* highlighter as the immediate render and swap in this result when it resolves
|
|
12
16
|
* (progressive enhancement); unsupported languages return null and the fallback
|
|
13
17
|
* stays.
|
|
14
18
|
*
|
|
15
|
-
* Colors come from
|
|
16
|
-
*
|
|
17
|
-
*
|
|
19
|
+
* Colors come from whichever editor theme(s) the host has registered via
|
|
20
|
+
* setEditorThemes/editorThemes() (ui-kit theme.ts) — this module only knows the
|
|
21
|
+
* light/dark theme ids, not their content — applied through the global
|
|
22
|
+
* `.monaco-colors` stylesheet Monaco injects, so the `.mtkN` classes colorize()
|
|
23
|
+
* emits are styled there, not scoped to an editor.
|
|
18
24
|
*/
|
|
19
|
-
import { getTheme } from './theme';
|
|
25
|
+
import { getTheme, editorThemes } from './theme';
|
|
26
|
+
import { fenceLanguageId } from './basicLanguages';
|
|
27
|
+
import { ensureLanguagesRegistered } from './languages';
|
|
20
28
|
// IMPORTANT: nothing monaco-related is imported statically. This module is reached
|
|
21
|
-
// from the always-loaded chat/output renderers, so a static `monaco-editor`
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// on the first colorize call
|
|
25
|
-
|
|
26
|
-
// typescript one (both handle JSX/TSX syntax in their Monarch grammar).
|
|
27
|
-
const ALIAS = {
|
|
28
|
-
js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript', node: 'javascript',
|
|
29
|
-
ts: 'typescript', tsx: 'typescript',
|
|
30
|
-
py: 'python', py3: 'python',
|
|
31
|
-
sh: 'shell', bash: 'shell', zsh: 'shell', console: 'shell',
|
|
32
|
-
yml: 'yaml', md: 'markdown', markdown: 'markdown',
|
|
33
|
-
htm: 'html', svg: 'xml',
|
|
34
|
-
rs: 'rust', golang: 'go', kt: 'kotlin', kts: 'kotlin',
|
|
35
|
-
cs: 'csharp', 'c#': 'csharp', 'c++': 'cpp', cc: 'cpp', cxx: 'cpp', h: 'cpp', hpp: 'cpp', c: 'cpp',
|
|
36
|
-
rb: 'ruby', ps1: 'powershell', ps: 'powershell',
|
|
37
|
-
docker: 'dockerfile', gql: 'graphql', objc: 'objective-c', 'obj-c': 'objective-c',
|
|
38
|
-
rlang: 'r', pl: 'perl',
|
|
39
|
-
};
|
|
40
|
-
/** Resolve a fence tag to a supported Monaco language id, or null if unsupported.
|
|
41
|
-
* Supported ids are exactly the LOADERS keys (defined below; read at call time). */
|
|
29
|
+
// from the always-loaded chat/output renderers, so a static `monaco-editor` import
|
|
30
|
+
// would pull all of Monaco into the main bundle. basicLanguages/languages are
|
|
31
|
+
// runtime-monaco-free (type-only imports); Monaco itself loads inside ensureMonaco
|
|
32
|
+
// on the first colorize call.
|
|
33
|
+
/** Resolve a fence tag to a supported Monaco language id, or null if unsupported. */
|
|
42
34
|
export function monacoLangId(lang) {
|
|
43
35
|
const l = (lang || '').trim().toLowerCase();
|
|
44
|
-
|
|
45
|
-
return null;
|
|
46
|
-
const id = ALIAS[l] || l;
|
|
47
|
-
return id in LOADERS ? id : null;
|
|
36
|
+
return l ? fenceLanguageId(l) : null;
|
|
48
37
|
}
|
|
49
|
-
// Per-language tokenizer loaders (literal paths so Vite splits each into its own
|
|
50
|
-
// tiny chunk). Only the language a code block actually uses is fetched — a JS
|
|
51
|
-
// block never pulls the Rust grammar. Keys are Monaco language ids.
|
|
52
|
-
const LOADERS = {
|
|
53
|
-
typescript: () => import('monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution'),
|
|
54
|
-
javascript: () => import('monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution'),
|
|
55
|
-
python: () => import('monaco-editor/esm/vs/basic-languages/python/python.contribution'),
|
|
56
|
-
css: () => import('monaco-editor/esm/vs/basic-languages/css/css.contribution'),
|
|
57
|
-
scss: () => import('monaco-editor/esm/vs/basic-languages/scss/scss.contribution'),
|
|
58
|
-
less: () => import('monaco-editor/esm/vs/basic-languages/less/less.contribution'),
|
|
59
|
-
html: () => import('monaco-editor/esm/vs/basic-languages/html/html.contribution'),
|
|
60
|
-
xml: () => import('monaco-editor/esm/vs/basic-languages/xml/xml.contribution'),
|
|
61
|
-
shell: () => import('monaco-editor/esm/vs/basic-languages/shell/shell.contribution'),
|
|
62
|
-
yaml: () => import('monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution'),
|
|
63
|
-
markdown: () => import('monaco-editor/esm/vs/basic-languages/markdown/markdown.contribution'),
|
|
64
|
-
sql: () => import('monaco-editor/esm/vs/basic-languages/sql/sql.contribution'),
|
|
65
|
-
rust: () => import('monaco-editor/esm/vs/basic-languages/rust/rust.contribution'),
|
|
66
|
-
go: () => import('monaco-editor/esm/vs/basic-languages/go/go.contribution'),
|
|
67
|
-
java: () => import('monaco-editor/esm/vs/basic-languages/java/java.contribution'),
|
|
68
|
-
cpp: () => import('monaco-editor/esm/vs/basic-languages/cpp/cpp.contribution'),
|
|
69
|
-
csharp: () => import('monaco-editor/esm/vs/basic-languages/csharp/csharp.contribution'),
|
|
70
|
-
ruby: () => import('monaco-editor/esm/vs/basic-languages/ruby/ruby.contribution'),
|
|
71
|
-
php: () => import('monaco-editor/esm/vs/basic-languages/php/php.contribution'),
|
|
72
|
-
kotlin: () => import('monaco-editor/esm/vs/basic-languages/kotlin/kotlin.contribution'),
|
|
73
|
-
swift: () => import('monaco-editor/esm/vs/basic-languages/swift/swift.contribution'),
|
|
74
|
-
powershell: () => import('monaco-editor/esm/vs/basic-languages/powershell/powershell.contribution'),
|
|
75
|
-
dockerfile: () => import('monaco-editor/esm/vs/basic-languages/dockerfile/dockerfile.contribution'),
|
|
76
|
-
graphql: () => import('monaco-editor/esm/vs/basic-languages/graphql/graphql.contribution'),
|
|
77
|
-
ini: () => import('monaco-editor/esm/vs/basic-languages/ini/ini.contribution'),
|
|
78
|
-
lua: () => import('monaco-editor/esm/vs/basic-languages/lua/lua.contribution'),
|
|
79
|
-
r: () => import('monaco-editor/esm/vs/basic-languages/r/r.contribution'),
|
|
80
|
-
perl: () => import('monaco-editor/esm/vs/basic-languages/perl/perl.contribution'),
|
|
81
|
-
scala: () => import('monaco-editor/esm/vs/basic-languages/scala/scala.contribution'),
|
|
82
|
-
dart: () => import('monaco-editor/esm/vs/basic-languages/dart/dart.contribution'),
|
|
83
|
-
'objective-c': () => import('monaco-editor/esm/vs/basic-languages/objective-c/objective-c.contribution'),
|
|
84
|
-
// json's tokenizer is already registered by lib/monaco.ts; no loader needed.
|
|
85
|
-
json: () => Promise.resolve(),
|
|
86
|
-
};
|
|
87
38
|
let monacoP = null;
|
|
88
39
|
async function ensureMonaco() {
|
|
89
40
|
if (!monacoP) {
|
|
90
|
-
monacoP = (
|
|
91
|
-
const monaco = await import('monaco-editor/esm/vs/editor/editor.api');
|
|
92
|
-
// prmdLanguage statically imports monaco — keep it dynamic too. It registers
|
|
93
|
-
// PRMD_THEME_* (token colors inherit vs/vs-dark) and is idempotent.
|
|
94
|
-
const prmd = await import('./prmdLanguage');
|
|
95
|
-
prmd.ensurePrmdLanguage();
|
|
96
|
-
themeLight = prmd.PRMD_THEME_LIGHT;
|
|
97
|
-
themeDark = prmd.PRMD_THEME_DARK;
|
|
98
|
-
return monaco;
|
|
99
|
-
})();
|
|
100
|
-
}
|
|
101
|
-
return monacoP;
|
|
102
|
-
}
|
|
103
|
-
const langP = new Map();
|
|
104
|
-
function ensureLanguage(id) {
|
|
105
|
-
let p = langP.get(id);
|
|
106
|
-
if (!p) {
|
|
107
|
-
p = (LOADERS[id] || (() => Promise.resolve()))();
|
|
108
|
-
langP.set(id, p);
|
|
41
|
+
monacoP = import('monaco-editor/esm/vs/editor/editor.api');
|
|
109
42
|
}
|
|
110
|
-
|
|
43
|
+
const monaco = await monacoP;
|
|
44
|
+
// Install every registered language extension against this monaco instance.
|
|
45
|
+
// Deliberately OUTSIDE the `if (!monacoP)` gate (and so re-run on every call,
|
|
46
|
+
// not just the first): ensureLanguagesRegistered is idempotent per language id,
|
|
47
|
+
// but a host can register a language (e.g. the app's registerPrmdLanguage())
|
|
48
|
+
// any time relative to this module's first colorize() call — calling it only
|
|
49
|
+
// once, inside the memo, would strand later-registered languages unresolved
|
|
50
|
+
// for the lifetime of the session. Running it here every time self-heals
|
|
51
|
+
// regardless of registration order.
|
|
52
|
+
ensureLanguagesRegistered(monaco);
|
|
53
|
+
return monaco;
|
|
111
54
|
}
|
|
112
55
|
// The global Monaco theme is shared with mounted editors; only push a change when
|
|
113
56
|
// the app theme actually flips (avoids re-theming mounted editors per code block).
|
|
114
|
-
// Theme ids are captured from prmdLanguage during ensureMonaco (defaults match its
|
|
115
|
-
// exported constants) so nothing monaco-related is imported statically.
|
|
116
|
-
let themeLight = 'prompd-light';
|
|
117
|
-
let themeDark = 'prompd-dark';
|
|
118
57
|
let appliedTheme = '';
|
|
119
58
|
function syncTheme(monaco) {
|
|
120
|
-
const
|
|
59
|
+
const t = editorThemes();
|
|
60
|
+
const id = getTheme() === 'light' ? t.light : t.dark;
|
|
121
61
|
if (id !== appliedTheme) {
|
|
122
62
|
monaco.editor.setTheme(id);
|
|
123
63
|
appliedTheme = id;
|
|
@@ -130,7 +70,6 @@ export async function colorizeToHtml(code, lang) {
|
|
|
130
70
|
if (!id)
|
|
131
71
|
return null;
|
|
132
72
|
const monaco = await ensureMonaco();
|
|
133
|
-
await ensureLanguage(id);
|
|
134
73
|
syncTheme(monaco);
|
|
135
74
|
try {
|
|
136
75
|
const html = await monaco.editor.colorize(code, id, { tabSize: 2 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monacoColorize.js","sourceRoot":"","sources":["../monacoColorize.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"monacoColorize.js","sourceRoot":"","sources":["../monacoColorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAIxD,mFAAmF;AACnF,mFAAmF;AACnF,8EAA8E;AAC9E,mFAAmF;AACnF,8BAA8B;AAE9B,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,IAAI,OAAO,GAA8B,IAAI,CAAC;AAC9C,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,CAAC,wCAAwC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;IAC7B,4EAA4E;IAC5E,8EAA8E;IAC9E,gFAAgF;IAChF,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,oCAAoC;IACpC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kFAAkF;AAClF,mFAAmF;AACnF,IAAI,YAAY,GAAG,EAAE,CAAC;AACtB,SAAS,SAAS,CAAC,MAAiB;IAClC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;QAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAC,YAAY,GAAG,EAAE,CAAC;IAAC,CAAC;AAC7E,CAAC;AAED;mFACmF;AACnF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,IAAY;IAC7D,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/theme.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
/** Resolved palette actually applied to <html>. */
|
|
1
2
|
export type Theme = 'dark' | 'light';
|
|
3
|
+
/** Stored user preference; 'system' follows the OS via prefers-color-scheme. */
|
|
4
|
+
export type ThemePref = Theme | 'system';
|
|
5
|
+
/** The stored preference (may be 'system'). Defaults to 'dark'. */
|
|
6
|
+
export declare function getThemePref(): ThemePref;
|
|
7
|
+
/** The resolved palette ('system' -> current OS preference). Consumers that
|
|
8
|
+
* paint to dark/light want this; it reacts to the prompd:theme-changed event. */
|
|
2
9
|
export declare function getTheme(): Theme;
|
|
3
10
|
export declare function applyTheme(t: Theme): void;
|
|
11
|
+
export declare function setThemePref(p: ThemePref): void;
|
|
12
|
+
/** @deprecated Back-compat alias for {@link setThemePref}. */
|
|
4
13
|
export declare function setTheme(t: Theme): void;
|
|
5
14
|
export declare function initTheme(): void;
|
|
6
15
|
export type EditorControls = 'auto' | 'labels' | 'icons';
|
|
@@ -12,4 +21,11 @@ export declare function getCompression(): CompressionMode;
|
|
|
12
21
|
export declare function setCompression(v: CompressionMode): void;
|
|
13
22
|
export declare function getShowHelp(): boolean;
|
|
14
23
|
export declare function setShowHelp(v: boolean): void;
|
|
24
|
+
export interface EditorThemes {
|
|
25
|
+
light: string;
|
|
26
|
+
dark: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function setEditorThemes(t: EditorThemes): void;
|
|
29
|
+
/** A copy — callers must not be able to mutate the stored value. */
|
|
30
|
+
export declare function editorThemes(): EditorThemes;
|
|
15
31
|
//# sourceMappingURL=theme.d.ts.map
|
package/dist/theme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../theme.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../theme.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AACrC,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AASzC,mEAAmE;AACnE,wBAAgB,YAAY,IAAI,SAAS,CAKxC;AACD;iFACiF;AACjF,wBAAgB,QAAQ,IAAI,KAAK,CAGhC;AACD,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAEzC;AACD,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAK/C;AACD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAqB;AAC7D,wBAAgB,SAAS,IAAI,IAAI,CAWhC;AAKD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAGzD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AACD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAE3D;AACD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAGzD;AAID,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,wBAAgB,cAAc,IAAI,eAAe,CAKhD;AACD,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,CAEvD;AAID,wBAAgB,WAAW,IAAI,OAAO,CAErC;AACD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5C;AAOD,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAI7D,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAErD;AAED,oEAAoE;AACpE,wBAAgB,YAAY,IAAI,YAAY,CAE3C"}
|
package/dist/theme.js
CHANGED
|
@@ -1,29 +1,60 @@
|
|
|
1
1
|
const LS = 'prompd.web.theme';
|
|
2
|
-
|
|
2
|
+
function systemTheme() {
|
|
3
|
+
try {
|
|
4
|
+
return typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return 'dark';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** The stored preference (may be 'system'). Defaults to 'dark'. */
|
|
11
|
+
export function getThemePref() {
|
|
3
12
|
try {
|
|
4
|
-
|
|
13
|
+
const v = localStorage.getItem(LS);
|
|
14
|
+
return v === 'light' || v === 'system' ? v : 'dark';
|
|
5
15
|
}
|
|
6
16
|
catch {
|
|
7
17
|
return 'dark';
|
|
8
18
|
}
|
|
9
19
|
}
|
|
20
|
+
/** The resolved palette ('system' -> current OS preference). Consumers that
|
|
21
|
+
* paint to dark/light want this; it reacts to the prompd:theme-changed event. */
|
|
22
|
+
export function getTheme() {
|
|
23
|
+
const p = getThemePref();
|
|
24
|
+
return p === 'system' ? systemTheme() : p;
|
|
25
|
+
}
|
|
10
26
|
export function applyTheme(t) {
|
|
11
27
|
document.documentElement.dataset.theme = t;
|
|
12
28
|
}
|
|
13
|
-
export function
|
|
29
|
+
export function setThemePref(p) {
|
|
14
30
|
try {
|
|
15
|
-
localStorage.setItem(LS,
|
|
31
|
+
localStorage.setItem(LS, p);
|
|
16
32
|
}
|
|
17
33
|
catch { /* ignore */ }
|
|
18
|
-
applyTheme(
|
|
34
|
+
applyTheme(getTheme());
|
|
19
35
|
// Let theme-sensitive UI (e.g. the file-tree's light/dark icon variants) react.
|
|
20
36
|
try {
|
|
21
37
|
window.dispatchEvent(new Event('prompd:theme-changed'));
|
|
22
38
|
}
|
|
23
39
|
catch { /* SSR/no-window */ }
|
|
24
40
|
}
|
|
41
|
+
/** @deprecated Back-compat alias for {@link setThemePref}. */
|
|
42
|
+
export function setTheme(t) { setThemePref(t); }
|
|
25
43
|
export function initTheme() {
|
|
26
44
|
applyTheme(getTheme());
|
|
45
|
+
// While the preference is 'system', track OS light/dark changes live.
|
|
46
|
+
try {
|
|
47
|
+
window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', () => {
|
|
48
|
+
if (getThemePref() !== 'system')
|
|
49
|
+
return;
|
|
50
|
+
applyTheme(getTheme());
|
|
51
|
+
try {
|
|
52
|
+
window.dispatchEvent(new Event('prompd:theme-changed'));
|
|
53
|
+
}
|
|
54
|
+
catch { /* SSR/no-window */ }
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch { /* SSR/no-window or unsupported */ }
|
|
27
58
|
applyEditorControls(getEditorControls());
|
|
28
59
|
}
|
|
29
60
|
const LS_EC = 'prompd.web.editorControls';
|
|
@@ -78,4 +109,12 @@ export function setShowHelp(v) {
|
|
|
78
109
|
}
|
|
79
110
|
catch { /* ignore */ }
|
|
80
111
|
}
|
|
112
|
+
let editorThemeIds = { light: 'vs', dark: 'vs-dark' };
|
|
113
|
+
export function setEditorThemes(t) {
|
|
114
|
+
editorThemeIds = { light: t.light, dark: t.dark };
|
|
115
|
+
}
|
|
116
|
+
/** A copy — callers must not be able to mutate the stored value. */
|
|
117
|
+
export function editorThemes() {
|
|
118
|
+
return { ...editorThemeIds };
|
|
119
|
+
}
|
|
81
120
|
//# sourceMappingURL=theme.js.map
|
package/dist/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../theme.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../theme.ts"],"names":[],"mappings":"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"}
|
package/dist/ui-helpers.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
export declare function mdToHtml(md: string): string;
|
|
2
|
+
/** Max chars fed to the BPE per count. estimateTokens runs on render paths (the
|
|
3
|
+
* context drawer counts every turn, the composer counts the draft), so a count
|
|
4
|
+
* must stay bounded even for multi-MB inline tool outputs: beyond the cap we
|
|
5
|
+
* encode a sample and extrapolate by length. Exact for anything under 64 KB. */
|
|
6
|
+
export declare const BPE_SAMPLE_CAP = 65536;
|
|
2
7
|
export declare function estimateTokens(s: string): number;
|
|
8
|
+
/** Identity of the active counter (0 = chars/4 heuristic, 1 = exact BPE). Callers
|
|
9
|
+
* that cache counts keyed on input identity compare this to know when to re-count. */
|
|
10
|
+
export declare function tokenCountsVersion(): number;
|
|
11
|
+
/** Upgrade estimateTokens to exact BPE counts (idempotent, failure-tolerant). */
|
|
12
|
+
export declare function enableAccurateTokenCounts(): Promise<void>;
|
|
3
13
|
export declare function highlightPrmd(source: string): string;
|
|
4
14
|
//# sourceMappingURL=ui-helpers.d.ts.map
|
package/dist/ui-helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-helpers.d.ts","sourceRoot":"","sources":["../ui-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ui-helpers.d.ts","sourceRoot":"","sources":["../ui-helpers.ts"],"names":[],"mappings":"AAqDA,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CA8D3C;AAWD;;;gFAGgF;AAChF,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED;sFACsF;AACtF,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAGD,iFAAiF;AACjF,wBAAgB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKzD;AAwBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6BpD"}
|
package/dist/ui-helpers.js
CHANGED
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
function safeHref(raw) {
|
|
17
17
|
const u = raw.replace(/[\u0000-\u0020\u007F]+/g, '');
|
|
18
18
|
const scheme = /^([a-z][a-z0-9+.-]*):/i.exec(u);
|
|
19
|
+
// `prompd:` is the in-app action scheme (e.g. prompd:new-file): safe to render —
|
|
20
|
+
// the browser no-ops the unknown scheme and the app intercepts the click.
|
|
19
21
|
if (scheme)
|
|
20
|
-
return /^(https?|mailto|tel)$/i.test(scheme[1]) ? u : null;
|
|
22
|
+
return /^(https?|mailto|tel|prompd)$/i.test(scheme[1]) ? u : null;
|
|
21
23
|
return u; // no scheme -> relative path/anchor/query, safe
|
|
22
24
|
}
|
|
23
25
|
function inlineMd(s) {
|
|
@@ -35,12 +37,43 @@ function inlineMd(s) {
|
|
|
35
37
|
: text;
|
|
36
38
|
});
|
|
37
39
|
}
|
|
40
|
+
/** GFM table delimiter row: `| --- | :---: | ---: |` (leading/trailing pipes
|
|
41
|
+
* optional, 1+ dashes per spec-in-practice). Alignment comes from the colons. */
|
|
42
|
+
const TABLE_DELIM_RE = /^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/;
|
|
43
|
+
/** Split one table row into cells: strip the outer pipes, split on unescaped
|
|
44
|
+
* `|`, and unescape `\|` back to a literal pipe inside a cell. */
|
|
45
|
+
function tableCells(row) {
|
|
46
|
+
const s = row.trim().replace(/^\|/, '').replace(/(?<!\\)\|$/, '');
|
|
47
|
+
return s.split(/(?<!\\)\|/).map((c) => c.replace(/\\\|/g, '|').trim());
|
|
48
|
+
}
|
|
38
49
|
export function mdToHtml(md) {
|
|
39
50
|
const lines = md.split('\n');
|
|
40
51
|
let html = '';
|
|
41
52
|
let i = 0;
|
|
42
53
|
while (i < lines.length) {
|
|
43
54
|
const line = lines[i];
|
|
55
|
+
// GFM table: a pipe-bearing header line whose NEXT line is a delimiter row.
|
|
56
|
+
// Without the delimiter row, pipe lines stay ordinary paragraphs.
|
|
57
|
+
if (line.includes('|') && i + 1 < lines.length && lines[i + 1].includes('-') && TABLE_DELIM_RE.test(lines[i + 1])) {
|
|
58
|
+
const headers = tableCells(line);
|
|
59
|
+
const aligns = tableCells(lines[i + 1]).map((d) => {
|
|
60
|
+
const l = d.startsWith(':');
|
|
61
|
+
const r = d.endsWith(':');
|
|
62
|
+
return l && r ? 'center' : r ? 'right' : l ? 'left' : '';
|
|
63
|
+
});
|
|
64
|
+
const alignAttr = (col) => (aligns[col] ? ` style="text-align:${aligns[col]}"` : '');
|
|
65
|
+
i += 2;
|
|
66
|
+
let body = '';
|
|
67
|
+
while (i < lines.length && lines[i].includes('|') && lines[i].trim() !== '') {
|
|
68
|
+
const cells = tableCells(lines[i]);
|
|
69
|
+
body += '<tr>' + headers.map((_h, c) => `<td${alignAttr(c)}>${inlineMd(cells[c] ?? '')}</td>`).join('') + '</tr>';
|
|
70
|
+
i++;
|
|
71
|
+
}
|
|
72
|
+
html += '<table class="md-table"><thead><tr>'
|
|
73
|
+
+ headers.map((h, c) => `<th${alignAttr(c)}>${inlineMd(h)}</th>`).join('')
|
|
74
|
+
+ `</tr></thead><tbody>${body}</tbody></table>`;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
44
77
|
if (/^```/.test(line)) {
|
|
45
78
|
const buf = [];
|
|
46
79
|
i++;
|
|
@@ -100,8 +133,44 @@ export function mdToHtml(md) {
|
|
|
100
133
|
}
|
|
101
134
|
return html;
|
|
102
135
|
}
|
|
136
|
+
/* ---- token estimation ----
|
|
137
|
+
* estimateTokens starts as the ~4 chars/token heuristic and silently upgrades to
|
|
138
|
+
* the real o200k_base BPE (the GPT-4o/4.1 family — the gateway's routable set)
|
|
139
|
+
* once the host calls enableAccurateTokenCounts(). The upgrade is an explicit,
|
|
140
|
+
* lazy opt-in — never triggered by estimateTokens itself — so tests and the
|
|
141
|
+
* strategy budget math stay deterministic, and the ~1 MB (gz) encoding chunk
|
|
142
|
+
* stays off the startup path. Post-run gateway usage is the ground truth. */
|
|
143
|
+
let bpeCount = null;
|
|
144
|
+
/** Max chars fed to the BPE per count. estimateTokens runs on render paths (the
|
|
145
|
+
* context drawer counts every turn, the composer counts the draft), so a count
|
|
146
|
+
* must stay bounded even for multi-MB inline tool outputs: beyond the cap we
|
|
147
|
+
* encode a sample and extrapolate by length. Exact for anything under 64 KB. */
|
|
148
|
+
export const BPE_SAMPLE_CAP = 65536;
|
|
103
149
|
export function estimateTokens(s) {
|
|
104
|
-
|
|
150
|
+
const text = s || '';
|
|
151
|
+
if (bpeCount) {
|
|
152
|
+
try {
|
|
153
|
+
if (text.length <= BPE_SAMPLE_CAP)
|
|
154
|
+
return Math.max(1, bpeCount(text));
|
|
155
|
+
const sampled = bpeCount(text.slice(0, BPE_SAMPLE_CAP));
|
|
156
|
+
return Math.max(1, Math.round(sampled * (text.length / BPE_SAMPLE_CAP)));
|
|
157
|
+
}
|
|
158
|
+
catch { /* fall through to the heuristic */ }
|
|
159
|
+
}
|
|
160
|
+
return Math.max(1, Math.round(text.length / 4));
|
|
161
|
+
}
|
|
162
|
+
/** Identity of the active counter (0 = chars/4 heuristic, 1 = exact BPE). Callers
|
|
163
|
+
* that cache counts keyed on input identity compare this to know when to re-count. */
|
|
164
|
+
export function tokenCountsVersion() {
|
|
165
|
+
return bpeCount ? 1 : 0;
|
|
166
|
+
}
|
|
167
|
+
let bpeLoading = null;
|
|
168
|
+
/** Upgrade estimateTokens to exact BPE counts (idempotent, failure-tolerant). */
|
|
169
|
+
export function enableAccurateTokenCounts() {
|
|
170
|
+
bpeLoading ?? (bpeLoading = import('gpt-tokenizer/encoding/o200k_base')
|
|
171
|
+
.then((mod) => { bpeCount = (text) => mod.encode(text).length; })
|
|
172
|
+
.catch(() => { }));
|
|
173
|
+
return bpeLoading;
|
|
105
174
|
}
|
|
106
175
|
/* ============================================================ HIGHLIGHT */
|
|
107
176
|
function esc(s) {
|
package/dist/ui-helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-helpers.js","sourceRoot":"","sources":["../ui-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAE3E;;;;8DAI8D;AAC9D,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"ui-helpers.js","sourceRoot":"","sources":["../ui-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/usage.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface UsageRecord {
|
|
2
2
|
id: string;
|
|
3
3
|
ts: number;
|
|
4
|
-
surface: 'editor' | 'agent' | 'inline' | 'workflow';
|
|
4
|
+
surface: 'editor' | 'agent' | 'inline' | 'workflow' | 'craft';
|
|
5
5
|
provider: string;
|
|
6
6
|
model: string;
|
|
7
7
|
modelLabel: string;
|
|
@@ -19,6 +19,8 @@ export interface UsageTotals {
|
|
|
19
19
|
outTok: number;
|
|
20
20
|
cost: number;
|
|
21
21
|
}
|
|
22
|
+
/** Subscribe to each new usage record as it's logged. Returns an unsubscribe. */
|
|
23
|
+
export declare function onUsageRecord(cb: (rec: UsageRecord) => void): () => void;
|
|
22
24
|
/** Wire the "currently anonymous?" signal (App boot). */
|
|
23
25
|
export declare function setAnonResolver(fn: () => boolean): void;
|
|
24
26
|
/** Free anon actions consumed so far (read by the free-quota guards). */
|
package/dist/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../usage.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../usage.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAwB3F,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAGxE;AAeD,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,IAAI,CAAuB;AAC/E,yEAAyE;AACzE,wBAAgB,YAAY,IAAI,MAAM,CAAqB;AAC3D,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,IAAI,CAA+F;AAMpI,sFAAsF;AACtF,wBAAgB,WAAW,IAAI,IAAI,CAA+B;AAElE,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAOrE;AAED,wBAAgB,QAAQ,IAAI,WAAW,EAAE,CAAoB;AAE7D,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,wBAAgB,MAAM,CAAC,KAAK,SAAI,GAAG,WAAW,CAO7C;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,IAAI;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,CAIlG;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxC"}
|
package/dist/usage.js
CHANGED
|
@@ -23,6 +23,14 @@ function load() {
|
|
|
23
23
|
let records = load();
|
|
24
24
|
const listeners = new Set();
|
|
25
25
|
function notify() { listeners.forEach((fn) => fn()); }
|
|
26
|
+
// Per-record subscribers (analytics-agnostic — the ledger just exposes each new
|
|
27
|
+
// record; the app decides whether/where to forward it, e.g. to the analytics port).
|
|
28
|
+
const recordListeners = new Set();
|
|
29
|
+
/** Subscribe to each new usage record as it's logged. Returns an unsubscribe. */
|
|
30
|
+
export function onUsageRecord(cb) {
|
|
31
|
+
recordListeners.add(cb);
|
|
32
|
+
return () => recordListeners.delete(cb);
|
|
33
|
+
}
|
|
26
34
|
function persist() {
|
|
27
35
|
try {
|
|
28
36
|
localStorage.setItem(LS, JSON.stringify(records));
|
|
@@ -69,6 +77,7 @@ export function recordUsage(rec) {
|
|
|
69
77
|
maybeBumpAnon();
|
|
70
78
|
persist();
|
|
71
79
|
notify();
|
|
80
|
+
recordListeners.forEach((fn) => fn(full));
|
|
72
81
|
}
|
|
73
82
|
export function getUsage() { return records; }
|
|
74
83
|
export function clearUsage() {
|
package/dist/usage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../usage.ts"],"names":[],"mappings":"AAAA;;;;;mEAKmE;AACnE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAoB9C,MAAM,EAAE,GAAG,qBAAqB,CAAC;AACjC,MAAM,GAAG,GAAG,GAAG,CAAC;AAChB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEhC,SAAS,IAAI;IACX,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAwB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,IAAI,OAAO,GAAkB,IAAI,EAAE,CAAC;AACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AACxC,SAAS,MAAM,KAAW,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../usage.ts"],"names":[],"mappings":"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"}
|